Changes in uspace/drv/bus/usb/usbmast/scsi_ms.c [2aceec5:de3432b] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/bus/usb/usbmast/scsi_ms.c
r2aceec5 rde3432b 61 61 } 62 62 63 static void usbmast_dump_sense(usbmast_fun_t *mfun) 64 { 65 scsi_sense_data_t sense_buf; 66 unsigned sense_key; 67 int rc; 68 69 rc = usbmast_request_sense(mfun, &sense_buf, sizeof(sense_buf)); 70 if (rc == EOK) { 71 sense_key = sense_buf.flags_key & 0x0f; 72 printf("Got sense data. Sense key: 0x%x (%s), ASC 0x%02x, " 73 "ASCQ 0x%02x.\n", sense_key, 74 scsi_get_sense_key_str(sense_key), 75 sense_buf.additional_code, 76 sense_buf.additional_cqual); 77 } else { 78 printf("Failed to read sense data.\n"); 79 } 80 } 81 63 82 /** Perform SCSI Inquiry command on USB mass storage device. 64 83 * … … 70 89 { 71 90 scsi_std_inquiry_data_t inq_data; 72 s ize_t response_len;91 scsi_cmd_t cmd; 73 92 scsi_cdb_inquiry_t cdb; 74 93 int rc; … … 78 97 cdb.alloc_len = host2uint16_t_be(sizeof(inq_data)); 79 98 80 rc = usb_massstor_data_in(mfun, 0xDEADBEEF, (uint8_t *) &cdb, 81 sizeof(cdb), &inq_data, sizeof(inq_data), &response_len); 99 memset(&cmd, 0, sizeof(cmd)); 100 cmd.cdb = &cdb; 101 cmd.cdb_size = sizeof(cdb); 102 cmd.data_in = &inq_data; 103 cmd.data_in_size = sizeof(inq_data); 104 105 rc = usb_massstor_cmd(mfun, 0xDEADBEEF, &cmd); 82 106 83 107 if (rc != EOK) { 84 usb_log_error("Inquiry failed, device %s: %s.\n", 85 mfun->mdev->ddf_dev->name, str_error(rc)); 86 return rc; 87 } 88 89 if (response_len < SCSI_STD_INQUIRY_DATA_MIN_SIZE) { 108 usb_log_error("Inquiry transport failed, device %s: %s.\n", 109 mfun->mdev->ddf_dev->name, str_error(rc)); 110 return rc; 111 } 112 113 if (cmd.status != CMDS_GOOD) { 114 usb_log_error("Inquiry command failed, device %s.\n", 115 mfun->mdev->ddf_dev->name); 116 usbmast_dump_sense(mfun); 117 return EIO; 118 } 119 120 if (cmd.rcvd_size < SCSI_STD_INQUIRY_DATA_MIN_SIZE) { 90 121 usb_log_error("SCSI Inquiry response too short (%zu).\n", 91 response_len);122 cmd.rcvd_size); 92 123 return EIO; 93 124 } … … 127 158 int usbmast_request_sense(usbmast_fun_t *mfun, void *buf, size_t size) 128 159 { 160 scsi_cmd_t cmd; 129 161 scsi_cdb_request_sense_t cdb; 130 size_t data_len;131 162 int rc; 132 163 … … 135 166 cdb.alloc_len = min(size, SCSI_SENSE_DATA_MAX_SIZE); 136 167 137 rc = usb_massstor_data_in(mfun, 0xDEADBEEF, (uint8_t *) &cdb, 138 sizeof(cdb), buf, size, &data_len); 139 140 if (rc != EOK) { 168 memset(&cmd, 0, sizeof(cmd)); 169 cmd.cdb = &cdb; 170 cmd.cdb_size = sizeof(cdb); 171 cmd.data_in = buf; 172 cmd.data_in_size = size; 173 174 rc = usb_massstor_cmd(mfun, 0xDEADBEEF, &cmd); 175 176 if (rc != EOK || cmd.status != CMDS_GOOD) { 141 177 usb_log_error("Request Sense failed, device %s: %s.\n", 142 178 mfun->mdev->ddf_dev->name, str_error(rc)); … … 144 180 } 145 181 146 if ( data_len< SCSI_SENSE_DATA_MIN_SIZE) {182 if (cmd.rcvd_size < SCSI_SENSE_DATA_MIN_SIZE) { 147 183 /* The missing bytes should be considered to be zeroes. */ 148 memset((uint8_t *)buf + data_len, 0,149 SCSI_SENSE_DATA_MIN_SIZE - data_len);184 memset((uint8_t *)buf + cmd.rcvd_size, 0, 185 SCSI_SENSE_DATA_MIN_SIZE - cmd.rcvd_size); 150 186 } 151 187 … … 164 200 uint32_t *block_size) 165 201 { 202 scsi_cmd_t cmd; 166 203 scsi_cdb_read_capacity_10_t cdb; 167 204 scsi_read_capacity_10_data_t data; 168 size_t data_len;169 205 int rc; 170 206 … … 172 208 cdb.op_code = SCSI_CMD_READ_CAPACITY_10; 173 209 174 rc = usb_massstor_data_in(mfun, 0xDEADBEEF, (uint8_t *) &cdb, 175 sizeof(cdb), &data, sizeof(data), &data_len); 210 memset(&cmd, 0, sizeof(cmd)); 211 cmd.cdb = &cdb; 212 cmd.cdb_size = sizeof(cdb); 213 cmd.data_in = &data; 214 cmd.data_in_size = sizeof(data); 215 216 rc = usb_massstor_cmd(mfun, 0xDEADBEEF, &cmd); 176 217 177 218 if (rc != EOK) { 178 usb_log_error("Read Capacity (10) failed, device %s: %s.\n", 179 mfun->mdev->ddf_dev->name, str_error(rc)); 180 return rc; 181 } 182 183 if (data_len < sizeof(data)) { 219 usb_log_error("Read Capacity (10) transport failed, device %s: %s.\n", 220 mfun->mdev->ddf_dev->name, str_error(rc)); 221 return rc; 222 } 223 224 if (cmd.status != CMDS_GOOD) { 225 usb_log_error("Read Capacity (10) command failed, device %s.\n", 226 mfun->mdev->ddf_dev->name); 227 usbmast_dump_sense(mfun); 228 return EIO; 229 } 230 231 if (cmd.rcvd_size < sizeof(data)) { 184 232 usb_log_error("SCSI Read Capacity response too short (%zu).\n", 185 data_len);233 cmd.rcvd_size); 186 234 return EIO; 187 235 } … … 203 251 int usbmast_read(usbmast_fun_t *mfun, uint64_t ba, size_t nblocks, void *buf) 204 252 { 253 scsi_cmd_t cmd; 205 254 scsi_cdb_read_12_t cdb; 206 size_t data_len; 207 int rc; 208 209 /* XXX Need softstate to store block size. */ 255 int rc; 210 256 211 257 if (ba > UINT32_MAX) … … 220 266 cdb.xfer_len = host2uint32_t_be(nblocks); 221 267 222 rc = usb_massstor_data_in(mfun, 0xDEADBEEF, (uint8_t *) &cdb, 223 sizeof(cdb), buf, nblocks * mfun->block_size, &data_len); 268 memset(&cmd, 0, sizeof(cmd)); 269 cmd.cdb = &cdb; 270 cmd.cdb_size = sizeof(cdb); 271 cmd.data_in = buf; 272 cmd.data_in_size = nblocks * mfun->block_size; 273 274 rc = usb_massstor_cmd(mfun, 0xDEADBEEF, &cmd); 224 275 225 276 if (rc != EOK) { 226 usb_log_error("Read (12) failed, device %s: %s.\n", 227 mfun->mdev->ddf_dev->name, str_error(rc)); 228 return rc; 229 } 230 231 if (data_len < nblocks * mfun->block_size) { 277 usb_log_error("Read (12) transport failed, device %s: %s.\n", 278 mfun->mdev->ddf_dev->name, str_error(rc)); 279 return rc; 280 } 281 282 if (cmd.status != CMDS_GOOD) { 283 usb_log_error("Read (12) command failed, device %s.\n", 284 mfun->mdev->ddf_dev->name); 285 usbmast_dump_sense(mfun); 286 return EIO; 287 } 288 289 if (cmd.rcvd_size < nblocks * mfun->block_size) { 232 290 usb_log_error("SCSI Read response too short (%zu).\n", 233 data_len);291 cmd.rcvd_size); 234 292 return EIO; 235 293 } … … 250 308 const void *data) 251 309 { 310 scsi_cmd_t cmd; 252 311 scsi_cdb_write_12_t cdb; 253 size_t sent_len;254 312 int rc; 255 313 … … 265 323 cdb.xfer_len = host2uint32_t_be(nblocks); 266 324 267 rc = usb_massstor_data_out(mfun, 0xDEADBEEF, (uint8_t *) &cdb, 268 sizeof(cdb), data, nblocks * mfun->block_size, &sent_len); 325 memset(&cmd, 0, sizeof(cmd)); 326 cmd.cdb = &cdb; 327 cmd.cdb_size = sizeof(cdb); 328 cmd.data_out = data; 329 cmd.data_out_size = nblocks * mfun->block_size; 330 331 rc = usb_massstor_cmd(mfun, 0xDEADBEEF, &cmd); 269 332 270 333 if (rc != EOK) { 271 usb_log_error("Write (12) failed, device %s: %s.\n", 272 mfun->mdev->ddf_dev->name, str_error(rc)); 273 return rc; 274 } 275 276 if (sent_len < nblocks * mfun->block_size) { 277 usb_log_error("SCSI Write not all bytes transferred (%zu).\n", 278 sent_len); 334 usb_log_error("Write (12) transport failed, device %s: %s.\n", 335 mfun->mdev->ddf_dev->name, str_error(rc)); 336 return rc; 337 } 338 339 if (cmd.status != CMDS_GOOD) { 340 usb_log_error("Write (12) command failed, device %s.\n", 341 mfun->mdev->ddf_dev->name); 342 usbmast_dump_sense(mfun); 279 343 return EIO; 280 344 }
Note:
See TracChangeset
for help on using the changeset viewer.