Changes in uspace/lib/usbdev/src/pipesinit.c [bb655dab:58563585] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/usbdev/src/pipesinit.c
rbb655dab r58563585 38 38 #include <usb/dev/request.h> 39 39 #include <usb/usb.h> 40 #include <usb/debug.h>41 40 #include <usb/descriptor.h> 42 41 … … 60 59 NESTING(INTERFACE, HID), 61 60 NESTING(HID, HID_REPORT), 62 NESTING(ENDPOINT, SSPEED_EP_COMPANION),63 61 LAST_NESTING 64 62 }; … … 72 70 { 73 71 return descriptor[1] == USB_DESCTYPE_ENDPOINT; 74 }75 76 /** Tells whether given descriptor is of superspeed companion type.77 *78 * @param descriptor Descriptor in question.79 * @return Whether the given descriptor is superspeed companion descriptor.80 */81 static inline bool is_superspeed_companion_descriptor(const uint8_t *descriptor)82 {83 return descriptor[1] == USB_DESCTYPE_SSPEED_EP_COMPANION;84 72 } 85 73 … … 162 150 * @param interface Interface descriptor under which belongs the @p endpoint. 163 151 * @param endpoint Endpoint descriptor. 164 * @param companion Superspeed companion descriptor.165 152 * @return Error code. 166 153 */ … … 169 156 usb_standard_interface_descriptor_t *interface, 170 157 usb_standard_endpoint_descriptor_t *endpoint_desc, 171 usb_superspeed_endpoint_companion_descriptor_t *companion_desc,172 158 usb_dev_session_t *bus_session) 173 159 { … … 176 162 * Get endpoint characteristics. 177 163 */ 164 165 /* Actual endpoint number is in bits 0..3 */ 166 const usb_endpoint_t ep_no = endpoint_desc->endpoint_address & 0x0F; 167 178 168 const usb_endpoint_description_t description = { 179 .transfer_type = USB_ED_GET_TRANSFER_TYPE(*endpoint_desc), 180 .direction = USB_ED_GET_DIR(*endpoint_desc), 169 /* Endpoint direction is set by bit 7 */ 170 .direction = (endpoint_desc->endpoint_address & 128) 171 ? USB_DIRECTION_IN : USB_DIRECTION_OUT, 172 /* Transfer type is in bits 0..2 and 173 * the enum values corresponds 1:1 */ 174 .transfer_type = endpoint_desc->attributes & 3, 181 175 182 176 /* Get interface characteristics. */ … … 200 194 } 201 195 202 int err = usb_pipe_initialize(&ep_mapping->pipe, bus_session); 203 if (err) 204 return err; 196 int rc = usb_pipe_initialize(&ep_mapping->pipe, 197 ep_no, description.transfer_type, 198 ED_MPS_PACKET_SIZE_GET( 199 uint16_usb2host(endpoint_desc->max_packet_size)), 200 description.direction, 201 ED_MPS_TRANS_OPPORTUNITIES_GET( 202 uint16_usb2host(endpoint_desc->max_packet_size)), bus_session); 203 if (rc != EOK) { 204 return rc; 205 } 205 206 206 207 ep_mapping->present = true; 207 208 ep_mapping->descriptor = endpoint_desc; 208 ep_mapping->companion_descriptor = companion_desc;209 209 ep_mapping->interface = interface; 210 210 … … 235 235 do { 236 236 if (is_endpoint_descriptor(descriptor)) { 237 /* Check if companion descriptor is present too, it should immediatelly follow. */238 const uint8_t *companion_desc = usb_dp_get_nested_descriptor(parser,239 parser_data, descriptor);240 if (companion_desc && !is_superspeed_companion_descriptor(companion_desc)) {241 /* Not what we wanted, don't pass it further. */242 companion_desc = NULL;243 }244 245 237 (void) process_endpoint(mapping, mapping_count, 246 238 (usb_standard_interface_descriptor_t *) … … 248 240 (usb_standard_endpoint_descriptor_t *) 249 241 descriptor, 250 (usb_superspeed_endpoint_companion_descriptor_t *)251 companion_desc,252 242 bus_session); 253 243 } … … 298 288 if (config_descriptor == NULL) 299 289 return EBADMEM; 300 290 301 291 if (config_descriptor_size < 302 292 sizeof(usb_standard_configuration_descriptor_t)) { … … 338 328 } 339 329 330 /** Probe default control pipe for max packet size. 331 * 332 * The function tries to get the correct value of max packet size several 333 * time before giving up. 334 * 335 * The session on the pipe shall not be started. 336 * 337 * @param pipe Default control pipe. 338 * @return Error code. 339 */ 340 int usb_pipe_probe_default_control(usb_pipe_t *pipe) 341 { 342 assert(pipe); 343 static_assert(DEV_DESCR_MAX_PACKET_SIZE_OFFSET < CTRL_PIPE_MIN_PACKET_SIZE); 344 345 if ((pipe->direction != USB_DIRECTION_BOTH) || 346 (pipe->transfer_type != USB_TRANSFER_CONTROL) || 347 (pipe->endpoint_no != 0)) { 348 return EINVAL; 349 } 350 351 uint8_t dev_descr_start[CTRL_PIPE_MIN_PACKET_SIZE]; 352 size_t transferred_size; 353 int rc; 354 for (size_t attempt_var = 0; attempt_var < 3; ++attempt_var) { 355 rc = usb_request_get_descriptor(pipe, USB_REQUEST_TYPE_STANDARD, 356 USB_REQUEST_RECIPIENT_DEVICE, USB_DESCTYPE_DEVICE, 357 0, 0, dev_descr_start, CTRL_PIPE_MIN_PACKET_SIZE, 358 &transferred_size); 359 if (rc == EOK) { 360 if (transferred_size != CTRL_PIPE_MIN_PACKET_SIZE) { 361 rc = ELIMIT; 362 continue; 363 } 364 break; 365 } 366 } 367 if (rc != EOK) { 368 return rc; 369 } 370 371 pipe->max_packet_size 372 = dev_descr_start[DEV_DESCR_MAX_PACKET_SIZE_OFFSET]; 373 374 return EOK; 375 } 376 340 377 /** 341 378 * @}
Note:
See TracChangeset
for help on using the changeset viewer.