Changeset 64639256 in mainline for uspace/drv/bus/usb/usbmast/bo_trans.c
- Timestamp:
- 2011-07-17T09:56:53Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- df0956ee
- Parents:
- 04b3c8c (diff), 4069f5c (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 moved
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/bus/usb/usbmast/bo_trans.c
r04b3c8c r64639256 32 32 /** 33 33 * @file 34 * Generic functions for USB mass storage (implementation). 35 */ 36 #include "mast.h" 37 #include "cmds.h" 34 * USB mass storage bulk-only transport. 35 */ 38 36 #include <bool.h> 39 37 #include <errno.h> … … 41 39 #include <usb/debug.h> 42 40 #include <usb/dev/request.h> 41 42 #include "bo_trans.h" 43 #include "cmdw.h" 44 #include "usbmast.h" 43 45 44 46 bool usb_mast_verbose = false; … … 53 55 /** Send command via bulk-only transport. 54 56 * 57 * @param mfun Mass storage function 55 58 * @param tag Command block wrapper tag (automatically compared 56 59 * with answer) 57 * @param lun LUN58 60 * @param cmd Command block 59 61 * @param cmd_size Command block size in bytes … … 65 67 * @return Error code 66 68 */ 67 static int usb_massstor_cmd(usb _device_t *dev, uint32_t tag, uint8_t lun,68 const void *cmd, size_t cmd_size, usb_direction_t ddir, void *dbuf,69 size_t dbuf_size, size_t*xferred_size)69 static int usb_massstor_cmd(usbmast_fun_t *mfun, uint32_t tag, const void *cmd, 70 size_t cmd_size, usb_direction_t ddir, void *dbuf, size_t dbuf_size, 71 size_t *xferred_size) 70 72 { 71 73 int rc; 72 74 size_t act_size; 73 usb_pipe_t *bulk_in_pipe = dev->pipes[BULK_IN_EP].pipe;74 usb_pipe_t *bulk_out_pipe = dev->pipes[BULK_OUT_EP].pipe;75 usb_pipe_t *bulk_in_pipe = mfun->mdev->usb_dev->pipes[BULK_IN_EP].pipe; 76 usb_pipe_t *bulk_out_pipe = mfun->mdev->usb_dev->pipes[BULK_OUT_EP].pipe; 75 77 76 78 /* Prepare CBW - command block wrapper */ 77 79 usb_massstor_cbw_t cbw; 78 usb_massstor_cbw_prepare(&cbw, tag, dbuf_size, ddir, lun, cmd_size,79 cmd );80 usb_massstor_cbw_prepare(&cbw, tag, dbuf_size, ddir, mfun->lun, 81 cmd_size, cmd); 80 82 81 83 /* Send the CBW. */ … … 164 166 /** Perform data-in command. 165 167 * 168 * @param mfun Mass storage function 166 169 * @param tag Command block wrapper tag (automatically compared with 167 170 * answer) 168 * @param lun LUN169 171 * @param cmd CDB (Command Descriptor) 170 172 * @param cmd_size CDB length in bytes … … 175 177 * @return Error code 176 178 */ 177 int usb_massstor_data_in(usb _device_t *dev, uint32_t tag, uint8_t lun,178 const void *cmd,size_t cmd_size, void *dbuf, size_t dbuf_size, size_t *proc_size)179 { 180 return usb_massstor_cmd( dev, tag, lun, cmd, cmd_size, USB_DIRECTION_IN,179 int usb_massstor_data_in(usbmast_fun_t *mfun, uint32_t tag, const void *cmd, 180 size_t cmd_size, void *dbuf, size_t dbuf_size, size_t *proc_size) 181 { 182 return usb_massstor_cmd(mfun, tag, cmd, cmd_size, USB_DIRECTION_IN, 181 183 dbuf, dbuf_size, proc_size); 182 184 } … … 184 186 /** Perform data-out command. 185 187 * 188 * @param mfun Mass storage function 186 189 * @param tag Command block wrapper tag (automatically compared with 187 190 * answer) 188 * @param lun LUN189 191 * @param cmd CDB (Command Descriptor) 190 192 * @param cmd_size CDB length in bytes … … 195 197 * @return Error code 196 198 */ 197 int usb_massstor_data_out(usb_device_t *dev, uint32_t tag, uint8_t lun, 198 const void *cmd, size_t cmd_size, const void *data, size_t data_size, 199 size_t *proc_size) 200 { 201 return usb_massstor_cmd(dev, tag, lun, cmd, cmd_size, USB_DIRECTION_OUT, 199 int usb_massstor_data_out(usbmast_fun_t *mfun, uint32_t tag, const void *cmd, 200 size_t cmd_size, const void *data, size_t data_size, size_t *proc_size) 201 { 202 return usb_massstor_cmd(mfun, tag, cmd, cmd_size, USB_DIRECTION_OUT, 202 203 (void *) data, data_size, proc_size); 203 204 } … … 205 206 /** Perform bulk-only mass storage reset. 206 207 * 207 * @param dev Device to be reseted.208 * @return Error code.209 */ 210 int usb_massstor_reset(usb _device_t *dev)211 { 212 return usb_control_request_set(& dev->ctrl_pipe,208 * @param mfun Mass storage function 209 * @return Error code 210 */ 211 int usb_massstor_reset(usbmast_dev_t *mdev) 212 { 213 return usb_control_request_set(&mdev->usb_dev->ctrl_pipe, 213 214 USB_REQUEST_TYPE_CLASS, USB_REQUEST_RECIPIENT_INTERFACE, 214 0xFF, 0, dev->interface_no, NULL, 0);215 0xFF, 0, mdev->usb_dev->interface_no, NULL, 0); 215 216 } 216 217 … … 220 221 * would reappear on next transaction somehow. 221 222 * 222 * @param dev Device to be reseted.223 */ 224 void usb_massstor_reset_recovery(usb _device_t *dev)223 * @param mfun Mass storage function 224 */ 225 void usb_massstor_reset_recovery(usbmast_dev_t *mdev) 225 226 { 226 227 /* We would ignore errors here because if this fails 227 228 * we are doomed anyway and any following transaction would fail. 228 229 */ 229 usb_massstor_reset(dev); 230 usb_pipe_clear_halt(&dev->ctrl_pipe, dev->pipes[BULK_IN_EP].pipe); 231 usb_pipe_clear_halt(&dev->ctrl_pipe, dev->pipes[BULK_OUT_EP].pipe); 230 usb_massstor_reset(mdev); 231 usb_pipe_clear_halt(&mdev->usb_dev->ctrl_pipe, 232 mdev->usb_dev->pipes[BULK_IN_EP].pipe); 233 usb_pipe_clear_halt(&mdev->usb_dev->ctrl_pipe, 234 mdev->usb_dev->pipes[BULK_OUT_EP].pipe); 232 235 } 233 236 … … 240 243 * You shall rather use usb_masstor_get_lun_count. 241 244 * 242 * @param dev Mass storage device.243 * @return Error code of maximum LUN (index, not count).244 */ 245 int usb_massstor_get_max_lun(usb _device_t *dev)245 * @param mfun Mass storage function 246 * @return Error code of maximum LUN (index, not count) 247 */ 248 int usb_massstor_get_max_lun(usbmast_dev_t *mdev) 246 249 { 247 250 uint8_t max_lun; 248 251 size_t data_recv_len; 249 int rc = usb_control_request_get(& dev->ctrl_pipe,252 int rc = usb_control_request_get(&mdev->usb_dev->ctrl_pipe, 250 253 USB_REQUEST_TYPE_CLASS, USB_REQUEST_RECIPIENT_INTERFACE, 251 0xFE, 0, dev->interface_no, &max_lun, 1, &data_recv_len);254 0xFE, 0, mdev->usb_dev->interface_no, &max_lun, 1, &data_recv_len); 252 255 if (rc != EOK) { 253 256 return rc; … … 264 267 * (typically that shall not be a problem). 265 268 * 266 * @param dev Mass storage device.267 * @return Number of LUNs.268 */ 269 size_t usb_masstor_get_lun_count(usb _device_t *dev)270 { 271 int max_lun = usb_massstor_get_max_lun( dev);269 * @param mfun Mass storage function 270 * @return Number of LUNs 271 */ 272 size_t usb_masstor_get_lun_count(usbmast_dev_t *mdev) 273 { 274 int max_lun = usb_massstor_get_max_lun(mdev); 272 275 if (max_lun < 0) { 273 276 max_lun = 1;
Note:
See TracChangeset
for help on using the changeset viewer.