Changeset 4069f5c in mainline for uspace/drv/bus/usb/usbmast/scsi_ms.c
- Timestamp:
- 2011-07-17T09:52:42Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 64639256, ca1f1ec
- Parents:
- 27eddb52 (diff), 4118f5f (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/bus/usb/usbmast/scsi_ms.c
r27eddb52 r4069f5c 46 46 #include <scsi/sbc.h> 47 47 #include <scsi/spc.h> 48 #include "cmd s.h"49 #include " mast.h"48 #include "cmdw.h" 49 #include "bo_trans.h" 50 50 #include "scsi_ms.h" 51 #include "usbmast.h" 51 52 52 53 /** Get string representation for SCSI peripheral device type. … … 62 63 /** Perform SCSI Inquiry command on USB mass storage device. 63 64 * 64 * @param dev USB device.65 * @param inquiry_result Where to store parsed inquiry result .66 * @return Error code .67 */ 68 int usbmast_inquiry(usb _device_t *dev, usbmast_inquiry_data_t *inq_res)65 * @param mfun Mass storage function 66 * @param inquiry_result Where to store parsed inquiry result 67 * @return Error code 68 */ 69 int usbmast_inquiry(usbmast_fun_t *mfun, usbmast_inquiry_data_t *inq_res) 69 70 { 70 71 scsi_std_inquiry_data_t inq_data; … … 77 78 cdb.alloc_len = host2uint16_t_be(sizeof(inq_data)); 78 79 79 rc = usb_massstor_data_in( dev, 0xDEADBEEF, 0, (uint8_t *) &cdb,80 rc = usb_massstor_data_in(mfun, 0xDEADBEEF, (uint8_t *) &cdb, 80 81 sizeof(cdb), &inq_data, sizeof(inq_data), &response_len); 81 82 82 83 if (rc != EOK) { 83 84 usb_log_error("Inquiry failed, device %s: %s.\n", 84 dev->ddf_dev->name, str_error(rc));85 mfun->mdev->ddf_dev->name, str_error(rc)); 85 86 return rc; 86 87 } … … 118 119 /** Perform SCSI Request Sense command on USB mass storage device. 119 120 * 120 * @param dev USB device121 * @param mfun Mass storage function 121 122 * @param buf Destination buffer 122 123 * @param size Size of @a buf … … 124 125 * @return Error code. 125 126 */ 126 int usbmast_request_sense(usb _device_t *dev, void *buf, size_t size)127 int usbmast_request_sense(usbmast_fun_t *mfun, void *buf, size_t size) 127 128 { 128 129 scsi_cdb_request_sense_t cdb; … … 134 135 cdb.alloc_len = min(size, SCSI_SENSE_DATA_MAX_SIZE); 135 136 136 rc = usb_massstor_data_in( dev, 0xDEADBEEF, 0, (uint8_t *) &cdb,137 rc = usb_massstor_data_in(mfun, 0xDEADBEEF, (uint8_t *) &cdb, 137 138 sizeof(cdb), buf, size, &data_len); 138 139 139 140 if (rc != EOK) { 140 141 usb_log_error("Request Sense failed, device %s: %s.\n", 141 dev->ddf_dev->name, str_error(rc));142 mfun->mdev->ddf_dev->name, str_error(rc)); 142 143 return rc; 143 144 } … … 154 155 /** Perform SCSI Read Capacity command on USB mass storage device. 155 156 * 156 * @param dev USB device.157 * @param nblocks Output, number of blocks .158 * @param block_size Output, block size in bytes .157 * @param mfun Mass storage function 158 * @param nblocks Output, number of blocks 159 * @param block_size Output, block size in bytes 159 160 * 160 161 * @return Error code. 161 162 */ 162 int usbmast_read_capacity(usb _device_t *dev, uint32_t *nblocks,163 int usbmast_read_capacity(usbmast_fun_t *mfun, uint32_t *nblocks, 163 164 uint32_t *block_size) 164 165 { … … 171 172 cdb.op_code = SCSI_CMD_READ_CAPACITY_10; 172 173 173 rc = usb_massstor_data_in( dev, 0xDEADBEEF, 0, (uint8_t *) &cdb,174 rc = usb_massstor_data_in(mfun, 0xDEADBEEF, (uint8_t *) &cdb, 174 175 sizeof(cdb), &data, sizeof(data), &data_len); 175 176 176 177 if (rc != EOK) { 177 178 usb_log_error("Read Capacity (10) failed, device %s: %s.\n", 178 dev->ddf_dev->name, str_error(rc));179 mfun->mdev->ddf_dev->name, str_error(rc)); 179 180 return rc; 180 181 } … … 194 195 /** Perform SCSI Read command on USB mass storage device. 195 196 * 196 * @param dev USB device. 197 * @param ba Address of first block. 198 * @param nblocks Number of blocks to read. 199 * @param bsize Block size. 200 * 201 * @return Error code. 202 */ 203 int usbmast_read(usb_device_t *dev, uint64_t ba, size_t nblocks, size_t bsize, 204 void *buf) 197 * @param mfun Mass storage function 198 * @param ba Address of first block 199 * @param nblocks Number of blocks to read 200 * 201 * @return Error code 202 */ 203 int usbmast_read(usbmast_fun_t *mfun, uint64_t ba, size_t nblocks, void *buf) 205 204 { 206 205 scsi_cdb_read_12_t cdb; … … 213 212 return ELIMIT; 214 213 215 if ((uint64_t)nblocks * bsize > UINT32_MAX)214 if ((uint64_t)nblocks * mfun->block_size > UINT32_MAX) 216 215 return ELIMIT; 217 216 … … 221 220 cdb.xfer_len = host2uint32_t_be(nblocks); 222 221 223 rc = usb_massstor_data_in( dev, 0xDEADBEEF, 0, (uint8_t *) &cdb,224 sizeof(cdb), buf, nblocks * bsize, &data_len);222 rc = usb_massstor_data_in(mfun, 0xDEADBEEF, (uint8_t *) &cdb, 223 sizeof(cdb), buf, nblocks * mfun->block_size, &data_len); 225 224 226 225 if (rc != EOK) { 227 226 usb_log_error("Read (12) failed, device %s: %s.\n", 228 dev->ddf_dev->name, str_error(rc));229 return rc; 230 } 231 232 if (data_len < nblocks * bsize) {227 mfun->mdev->ddf_dev->name, str_error(rc)); 228 return rc; 229 } 230 231 if (data_len < nblocks * mfun->block_size) { 233 232 usb_log_error("SCSI Read response too short (%zu).\n", 234 233 data_len); … … 241 240 /** Perform SCSI Write command on USB mass storage device. 242 241 * 243 * @param dev USB device242 * @param mfun Mass storage function 244 243 * @param ba Address of first block 245 244 * @param nblocks Number of blocks to read 246 * @param bsize Block size247 245 * @param data Data to write 248 246 * 249 247 * @return Error code 250 248 */ 251 int usbmast_write(usb _device_t *dev, uint64_t ba, size_t nblocks, size_t bsize,249 int usbmast_write(usbmast_fun_t *mfun, uint64_t ba, size_t nblocks, 252 250 const void *data) 253 251 { … … 256 254 int rc; 257 255 258 /* XXX Need softstate to store block size. */259 260 256 if (ba > UINT32_MAX) 261 257 return ELIMIT; 262 258 263 if ((uint64_t)nblocks * bsize > UINT32_MAX)259 if ((uint64_t)nblocks * mfun->block_size > UINT32_MAX) 264 260 return ELIMIT; 265 261 … … 269 265 cdb.xfer_len = host2uint32_t_be(nblocks); 270 266 271 rc = usb_massstor_data_out( dev, 0xDEADBEEF, 0, (uint8_t *) &cdb,272 sizeof(cdb), data, nblocks * bsize, &sent_len);267 rc = usb_massstor_data_out(mfun, 0xDEADBEEF, (uint8_t *) &cdb, 268 sizeof(cdb), data, nblocks * mfun->block_size, &sent_len); 273 269 274 270 if (rc != EOK) { 275 271 usb_log_error("Write (12) failed, device %s: %s.\n", 276 dev->ddf_dev->name, str_error(rc));277 return rc; 278 } 279 280 if (sent_len < nblocks * bsize) {272 mfun->mdev->ddf_dev->name, str_error(rc)); 273 return rc; 274 } 275 276 if (sent_len < nblocks * mfun->block_size) { 281 277 usb_log_error("SCSI Write not all bytes transferred (%zu).\n", 282 278 sent_len);
Note:
See TracChangeset
for help on using the changeset viewer.