Changeset b4b534ac in mainline for uspace/drv/bus/usb/usbmast/bo_trans.c
- Timestamp:
- 2016-07-22T08:24:47Z (8 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- f76d2c2
- Parents:
- 5b18137 (diff), 8351f9a4 (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/bo_trans.c
r5b18137 rb4b534ac 44 44 #include "usbmast.h" 45 45 46 bool usb_mast_verbose = false;47 46 48 47 #define MASTLOG(format, ...) \ 49 do { \ 50 if (usb_mast_verbose) { \ 51 usb_log_debug2("USB cl08: " format, ##__VA_ARGS__); \ 52 } \ 53 } while (false) 48 usb_log_debug2("USB cl08: " format, ##__VA_ARGS__) 54 49 55 50 /** Send command via bulk-only transport. … … 65 60 { 66 61 int rc; 67 int retval = EOK; 68 size_t act_size; 69 usb_pipe_t *bulk_in_pipe = &mfun->mdev->usb_dev->pipes[BULK_IN_EP].pipe; 70 usb_pipe_t *bulk_out_pipe = &mfun->mdev->usb_dev->pipes[BULK_OUT_EP].pipe; 71 usb_direction_t ddir; 72 void *dbuf; 73 size_t dbuf_size; 74 75 if (cmd->data_out != NULL && cmd->data_in == NULL) { 76 ddir = USB_DIRECTION_OUT; 77 dbuf = (void *)cmd->data_out; 78 dbuf_size = cmd->data_out_size; 79 } else if (cmd->data_out == NULL && cmd->data_in != NULL) { 62 63 if (cmd->data_in && cmd->data_out) 64 return EINVAL; 65 66 usb_pipe_t *bulk_in_pipe = mfun->mdev->bulk_in_pipe; 67 usb_pipe_t *bulk_out_pipe = mfun->mdev->bulk_out_pipe; 68 69 usb_pipe_t *dpipe = bulk_out_pipe; 70 usb_direction_t ddir = USB_DIRECTION_OUT; 71 size_t dbuf_size = cmd->data_out_size; 72 73 if (cmd->data_in) { 80 74 ddir = USB_DIRECTION_IN; 81 dbuf = cmd->data_in;82 75 dbuf_size = cmd->data_in_size; 83 } else { 84 assert(false); 76 dpipe = bulk_in_pipe; 85 77 } 86 78 … … 96 88 usb_debug_str_buffer((uint8_t *) &cbw, sizeof(cbw), 0), 97 89 str_error(rc)); 98 if (rc != EOK) 99 return EIO; 90 if (rc != EOK) { 91 usb_log_error("Bulk out write failed: %s\n", str_error(rc)); 92 return EIO; 93 } 100 94 101 95 MASTLOG("Transferring data.\n"); 102 if (ddir == USB_DIRECTION_IN) { 96 if (cmd->data_in) { 97 size_t act_size; 103 98 /* Recieve data from the device. */ 104 rc = usb_pipe_read(bulk_in_pipe, dbuf, dbuf_size, &act_size); 99 rc = usb_pipe_read(dpipe, cmd->data_in, cmd->data_in_size, 100 &act_size); 105 101 MASTLOG("Received %zu bytes (%s): %s.\n", act_size, 106 usb_debug_str_buffer( (uint8_t *) dbuf, act_size, 0),102 usb_debug_str_buffer(cmd->data_in, act_size, 0), 107 103 str_error(rc)); 108 } else { 104 } 105 if (cmd->data_out) { 109 106 /* Send data to the device. */ 110 rc = usb_pipe_write( bulk_out_pipe, dbuf, dbuf_size);111 MASTLOG("Sent %zu bytes (%s): %s.\n", act_size,112 usb_debug_str_buffer( (uint8_t *) dbuf, act_size, 0),107 rc = usb_pipe_write(dpipe, cmd->data_out, cmd->data_out_size); 108 MASTLOG("Sent %zu bytes (%s): %s.\n", cmd->data_out_size, 109 usb_debug_str_buffer(cmd->data_out, cmd->data_out_size, 0), 113 110 str_error(rc)); 114 111 } … … 116 113 if (rc == ESTALL) { 117 114 /* Clear stall condition and continue below to read CSW. */ 118 if (ddir == USB_DIRECTION_IN) { 119 usb_pipe_clear_halt(&mfun->mdev->usb_dev->ctrl_pipe, 120 &mfun->mdev->usb_dev->pipes[BULK_IN_EP].pipe); 121 } else { 122 usb_pipe_clear_halt(&mfun->mdev->usb_dev->ctrl_pipe, 123 &mfun->mdev->usb_dev->pipes[BULK_OUT_EP].pipe); 124 } 115 usb_pipe_clear_halt( 116 usb_device_get_default_pipe(mfun->mdev->usb_dev), dpipe); 125 117 } else if (rc != EOK) { 118 usb_log_error("Failed to transfer data: %s", str_error(rc)); 126 119 return EIO; 127 120 } … … 136 129 str_error(rc)); 137 130 if (rc != EOK) { 138 MASTLOG("rc != EOK\n");131 usb_log_error("Failed to read CSW: %s", str_error(rc)); 139 132 return EIO; 140 133 } 141 134 142 135 if (csw_size != sizeof(csw)) { 143 MASTLOG("csw_size != sizeof(csw)\n");136 usb_log_error("Received CSW of incorrect size."); 144 137 return EIO; 145 138 } 146 139 147 140 if (csw.dCSWTag != tag) { 148 MASTLOG("csw.dCSWTag != tag\n"); 141 usb_log_error("Received CSW with incorrect tag. (expected: %" 142 PRIX32" received: %"PRIx32, tag, csw.dCSWTag); 149 143 return EIO; 150 144 } … … 158 152 break; 159 153 case cbs_failed: 160 MASTLOG("Command failed\n");161 154 cmd->status = CMDS_FAILED; 155 usb_log_error("CBS Failed.\n"); 162 156 break; 163 157 case cbs_phase_error: 164 MASTLOG("Phase error\n");165 r etval= EIO;158 usb_log_error("CBS phase error.\n"); 159 rc = EIO; 166 160 break; 167 161 default: 168 retval = EIO; 169 break; 170 } 171 172 size_t residue = (size_t) uint32_usb2host(csw.dCSWDataResidue); 162 usb_log_error("CBS other error.\n"); 163 rc = EIO; 164 break; 165 } 166 167 const size_t residue = uint32_usb2host(csw.dCSWDataResidue); 173 168 if (residue > dbuf_size) { 174 MASTLOG("residue > dbuf_size\n"); 169 usb_log_error("Residue > buffer size (%zu > %zu).\n", 170 residue, dbuf_size); 175 171 return EIO; 176 172 } … … 184 180 */ 185 181 186 if ( ddir == USB_DIRECTION_IN)182 if (cmd->data_in) 187 183 cmd->rcvd_size = dbuf_size - residue; 188 184 189 return r etval;185 return rc; 190 186 } 191 187 … … 197 193 int usb_massstor_reset(usbmast_dev_t *mdev) 198 194 { 199 return usb_control_request_set(&mdev->usb_dev->ctrl_pipe, 195 return usb_control_request_set( 196 usb_device_get_default_pipe(mdev->usb_dev), 200 197 USB_REQUEST_TYPE_CLASS, USB_REQUEST_RECIPIENT_INTERFACE, 201 0xFF, 0, mdev->usb_dev->interface_no, NULL, 0);198 0xFF, 0, usb_device_get_iface_number(mdev->usb_dev), NULL, 0); 202 199 } 203 200 … … 215 212 */ 216 213 usb_massstor_reset(mdev); 217 usb_pipe_clear_halt( &mdev->usb_dev->ctrl_pipe,218 &mdev->usb_dev->pipes[BULK_IN_EP].pipe);219 usb_pipe_clear_halt( &mdev->usb_dev->ctrl_pipe,220 &mdev->usb_dev->pipes[BULK_OUT_EP].pipe);214 usb_pipe_clear_halt(usb_device_get_default_pipe(mdev->usb_dev), 215 mdev->bulk_in_pipe); 216 usb_pipe_clear_halt(usb_device_get_default_pipe(mdev->usb_dev), 217 mdev->bulk_out_pipe); 221 218 } 222 219 … … 236 233 uint8_t max_lun; 237 234 size_t data_recv_len; 238 int rc = usb_control_request_get(&mdev->usb_dev->ctrl_pipe, 235 int rc = usb_control_request_get( 236 usb_device_get_default_pipe(mdev->usb_dev), 239 237 USB_REQUEST_TYPE_CLASS, USB_REQUEST_RECIPIENT_INTERFACE, 240 0xFE, 0, mdev->usb_dev->interface_no, &max_lun, 1, &data_recv_len); 238 0xFE, 0, usb_device_get_iface_number(mdev->usb_dev), &max_lun, 1, 239 &data_recv_len); 241 240 if (rc != EOK) { 242 241 return rc;
Note:
See TracChangeset
for help on using the changeset viewer.