Changeset 7190bbc in mainline
- Timestamp:
- 2011-07-15T20:22:32Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- e6b32a8
- Parents:
- 89d3f3c7
- Location:
- uspace/drv/bus/usb/usbmast
- Files:
-
- 1 added
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/bus/usb/usbmast/bo_trans.c
r89d3f3c7 r7190bbc 42 42 #include "bo_trans.h" 43 43 #include "cmdw.h" 44 #include "usbmast.h" 44 45 45 46 bool usb_mast_verbose = false; … … 54 55 /** Send command via bulk-only transport. 55 56 * 57 * @param mfun Mass storage function 56 58 * @param tag Command block wrapper tag (automatically compared 57 59 * with answer) … … 66 68 * @return Error code 67 69 */ 68 static int usb_massstor_cmd(usb _device_t *dev, uint32_t tag, uint8_t lun,70 static int usb_massstor_cmd(usbmast_fun_t *mfun, uint32_t tag, uint8_t lun, 69 71 const void *cmd, size_t cmd_size, usb_direction_t ddir, void *dbuf, 70 72 size_t dbuf_size, size_t *xferred_size) … … 72 74 int rc; 73 75 size_t act_size; 74 usb_pipe_t *bulk_in_pipe = dev->pipes[BULK_IN_EP].pipe;75 usb_pipe_t *bulk_out_pipe = dev->pipes[BULK_OUT_EP].pipe;76 usb_pipe_t *bulk_in_pipe = mfun->usb_dev->pipes[BULK_IN_EP].pipe; 77 usb_pipe_t *bulk_out_pipe = mfun->usb_dev->pipes[BULK_OUT_EP].pipe; 76 78 77 79 /* Prepare CBW - command block wrapper */ … … 165 167 /** Perform data-in command. 166 168 * 169 * @param mfun Mass storage function 167 170 * @param tag Command block wrapper tag (automatically compared with 168 171 * answer) … … 176 179 * @return Error code 177 180 */ 178 int usb_massstor_data_in(usb _device_t *dev, uint32_t tag, uint8_t lun,181 int usb_massstor_data_in(usbmast_fun_t *mfun, uint32_t tag, uint8_t lun, 179 182 const void *cmd, size_t cmd_size, void *dbuf, size_t dbuf_size, size_t *proc_size) 180 183 { 181 return usb_massstor_cmd( dev, tag, lun, cmd, cmd_size, USB_DIRECTION_IN,184 return usb_massstor_cmd(mfun, tag, lun, cmd, cmd_size, USB_DIRECTION_IN, 182 185 dbuf, dbuf_size, proc_size); 183 186 } … … 185 188 /** Perform data-out command. 186 189 * 190 * @param mfun Mass storage function 187 191 * @param tag Command block wrapper tag (automatically compared with 188 192 * answer) … … 196 200 * @return Error code 197 201 */ 198 int usb_massstor_data_out(usb _device_t *dev, uint32_t tag, uint8_t lun,202 int usb_massstor_data_out(usbmast_fun_t *mfun, uint32_t tag, uint8_t lun, 199 203 const void *cmd, size_t cmd_size, const void *data, size_t data_size, 200 204 size_t *proc_size) 201 205 { 202 return usb_massstor_cmd( dev, tag, lun, cmd, cmd_size, USB_DIRECTION_OUT,206 return usb_massstor_cmd(mfun, tag, lun, cmd, cmd_size, USB_DIRECTION_OUT, 203 207 (void *) data, data_size, proc_size); 204 208 } … … 206 210 /** Perform bulk-only mass storage reset. 207 211 * 208 * @param dev Device to be reseted.209 * @return Error code.210 */ 211 int usb_massstor_reset(usb _device_t *dev)212 { 213 return usb_control_request_set(& dev->ctrl_pipe,212 * @param mfun Mass storage function 213 * @return Error code 214 */ 215 int usb_massstor_reset(usbmast_fun_t *mfun) 216 { 217 return usb_control_request_set(&mfun->usb_dev->ctrl_pipe, 214 218 USB_REQUEST_TYPE_CLASS, USB_REQUEST_RECIPIENT_INTERFACE, 215 0xFF, 0, dev->interface_no, NULL, 0);219 0xFF, 0, mfun->usb_dev->interface_no, NULL, 0); 216 220 } 217 221 … … 221 225 * would reappear on next transaction somehow. 222 226 * 223 * @param dev Device to be reseted.224 */ 225 void usb_massstor_reset_recovery(usb _device_t *dev)227 * @param mfun Mass storage function 228 */ 229 void usb_massstor_reset_recovery(usbmast_fun_t *mfun) 226 230 { 227 231 /* We would ignore errors here because if this fails 228 232 * we are doomed anyway and any following transaction would fail. 229 233 */ 230 usb_massstor_reset(dev); 231 usb_pipe_clear_halt(&dev->ctrl_pipe, dev->pipes[BULK_IN_EP].pipe); 232 usb_pipe_clear_halt(&dev->ctrl_pipe, dev->pipes[BULK_OUT_EP].pipe); 234 usb_massstor_reset(mfun); 235 usb_pipe_clear_halt(&mfun->usb_dev->ctrl_pipe, 236 mfun->usb_dev->pipes[BULK_IN_EP].pipe); 237 usb_pipe_clear_halt(&mfun->usb_dev->ctrl_pipe, 238 mfun->usb_dev->pipes[BULK_OUT_EP].pipe); 233 239 } 234 240 … … 241 247 * You shall rather use usb_masstor_get_lun_count. 242 248 * 243 * @param dev Mass storage device.244 * @return Error code of maximum LUN (index, not count).245 */ 246 int usb_massstor_get_max_lun(usb _device_t *dev)249 * @param mfun Mass storage function 250 * @return Error code of maximum LUN (index, not count) 251 */ 252 int usb_massstor_get_max_lun(usbmast_fun_t *mfun) 247 253 { 248 254 uint8_t max_lun; 249 255 size_t data_recv_len; 250 int rc = usb_control_request_get(& dev->ctrl_pipe,256 int rc = usb_control_request_get(&mfun->usb_dev->ctrl_pipe, 251 257 USB_REQUEST_TYPE_CLASS, USB_REQUEST_RECIPIENT_INTERFACE, 252 0xFE, 0, dev->interface_no, &max_lun, 1, &data_recv_len);258 0xFE, 0, mfun->usb_dev->interface_no, &max_lun, 1, &data_recv_len); 253 259 if (rc != EOK) { 254 260 return rc; … … 265 271 * (typically that shall not be a problem). 266 272 * 267 * @param dev Mass storage device.268 * @return Number of LUNs.269 */ 270 size_t usb_masstor_get_lun_count(usb _device_t *dev)271 { 272 int max_lun = usb_massstor_get_max_lun( dev);273 * @param mfun Mass storage function 274 * @return Number of LUNs 275 */ 276 size_t usb_masstor_get_lun_count(usbmast_fun_t *mfun) 277 { 278 int max_lun = usb_massstor_get_max_lun(mfun); 273 279 if (max_lun < 0) { 274 280 max_lun = 1; -
uspace/drv/bus/usb/usbmast/bo_trans.h
r89d3f3c7 r7190bbc 42 42 #include <usb/dev/pipes.h> 43 43 #include <usb/dev/driver.h> 44 #include "usbmast.h" 44 45 45 46 #define BULK_IN_EP 0 46 47 #define BULK_OUT_EP 1 47 48 48 extern int usb_massstor_data_in(usb _device_t *, uint32_t, uint8_t, const void *,49 size_t, void *, size_t, size_t *);50 extern int usb_massstor_data_out(usb _device_t *, uint32_t, uint8_t, const void *,51 size_t, const void *, size_t, size_t *);52 extern int usb_massstor_reset(usb _device_t *);53 extern void usb_massstor_reset_recovery(usb _device_t *);54 extern int usb_massstor_get_max_lun(usb _device_t *);55 extern size_t usb_masstor_get_lun_count(usb _device_t *);49 extern int usb_massstor_data_in(usbmast_fun_t *, uint32_t, uint8_t, 50 const void *, size_t, void *, size_t, size_t *); 51 extern int usb_massstor_data_out(usbmast_fun_t *, uint32_t, uint8_t, 52 const void *, size_t, const void *, size_t, size_t *); 53 extern int usb_massstor_reset(usbmast_fun_t *); 54 extern void usb_massstor_reset_recovery(usbmast_fun_t *); 55 extern int usb_massstor_get_max_lun(usbmast_fun_t *); 56 extern size_t usb_masstor_get_lun_count(usbmast_fun_t *); 56 57 57 58 #endif -
uspace/drv/bus/usb/usbmast/main.c
r89d3f3c7 r7190bbc 48 48 #include "bo_trans.h" 49 49 #include "scsi_ms.h" 50 #include "usbmast.h" 50 51 51 52 #define NAME "usbmast" … … 77 78 }; 78 79 79 /** Mass storage function.80 *81 * Serves as soft state for function/LUN.82 */83 typedef struct {84 /** DDF function */85 ddf_fun_t *ddf_fun;86 /** Total number of blocks. */87 uint64_t nblocks;88 /** Block size in bytes. */89 size_t block_size;90 /** USB device function belongs to */91 usb_device_t *usb_dev;92 } usbmast_fun_t;93 94 80 static void usbmast_bd_connection(ipc_callid_t iid, ipc_call_t *icall, 95 81 void *arg); … … 114 100 goto error; 115 101 } 102 103 msfun->usb_dev = dev; 116 104 117 105 fun = ddf_fun_create(dev->ddf_dev, fun_exposed, fun_name); … … 136 124 137 125 usb_log_debug("Get LUN count...\n"); 138 size_t lun_count = usb_masstor_get_lun_count( dev);126 size_t lun_count = usb_masstor_get_lun_count(msfun); 139 127 140 128 /* XXX Handle more than one LUN properly. */ … … 146 134 usb_log_debug("Inquire...\n"); 147 135 usbmast_inquiry_data_t inquiry; 148 rc = usbmast_inquiry( dev, &inquiry);136 rc = usbmast_inquiry(msfun, &inquiry); 149 137 if (rc != EOK) { 150 138 usb_log_warning("Failed to inquire device `%s': %s.\n", … … 166 154 uint32_t nblocks, block_size; 167 155 168 rc = usbmast_read_capacity( dev, &nblocks, &block_size);156 rc = usbmast_read_capacity(msfun, &nblocks, &block_size); 169 157 if (rc != EOK) { 170 158 usb_log_warning("Failed to read capacity, device `%s': %s.\n", … … 179 167 msfun->nblocks = nblocks; 180 168 msfun->block_size = block_size; 181 msfun->usb_dev = dev;182 169 183 170 rc = ddf_fun_bind(fun); … … 252 239 ba = MERGE_LOUP32(IPC_GET_ARG1(call), IPC_GET_ARG2(call)); 253 240 cnt = IPC_GET_ARG3(call); 254 retval = usbmast_read(msfun->usb_dev, ba, cnt, 255 msfun->block_size, comm_buf); 241 retval = usbmast_read(msfun, ba, cnt, comm_buf); 256 242 async_answer_0(callid, retval); 257 243 break; … … 259 245 ba = MERGE_LOUP32(IPC_GET_ARG1(call), IPC_GET_ARG2(call)); 260 246 cnt = IPC_GET_ARG3(call); 261 retval = usbmast_write(msfun->usb_dev, ba, cnt, 262 msfun->block_size, comm_buf); 247 retval = usbmast_write(msfun, ba, cnt, comm_buf); 263 248 async_answer_0(callid, retval); 264 249 break; -
uspace/drv/bus/usb/usbmast/scsi_ms.c
r89d3f3c7 r7190bbc 49 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, 0, (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->usb_dev->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, 0, (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->usb_dev->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, 0, (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->usb_dev->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, 0, (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->usb_dev->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, 0, (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->usb_dev->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); -
uspace/drv/bus/usb/usbmast/scsi_ms.h
r89d3f3c7 r7190bbc 59 59 } usbmast_inquiry_data_t; 60 60 61 extern int usbmast_inquiry(usb_device_t *, usbmast_inquiry_data_t *); 62 extern int usbmast_request_sense(usb_device_t *, void *, size_t); 63 extern int usbmast_read_capacity(usb_device_t *, uint32_t *, uint32_t *); 64 extern int usbmast_read(usb_device_t *, uint64_t, size_t, size_t, void *); 65 extern int usbmast_write(usb_device_t *, uint64_t, size_t, size_t, 66 const void *); 61 extern int usbmast_inquiry(usbmast_fun_t *, usbmast_inquiry_data_t *); 62 extern int usbmast_request_sense(usbmast_fun_t *, void *, size_t); 63 extern int usbmast_read_capacity(usbmast_fun_t *, uint32_t *, uint32_t *); 64 extern int usbmast_read(usbmast_fun_t *, uint64_t, size_t, void *); 65 extern int usbmast_write(usbmast_fun_t *, uint64_t, size_t, const void *); 67 66 extern const char *usbmast_scsi_dev_type_str(unsigned); 68 67
Note:
See TracChangeset
for help on using the changeset viewer.