Changes in uspace/lib/usb/src/pipesinit.c [206f71a:b7d8fd9] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/usb/src/pipesinit.c
r206f71a rb7d8fd9 41 41 #include <errno.h> 42 42 #include <assert.h> 43 44 #define CTRL_PIPE_MIN_PACKET_SIZE 845 #define DEV_DESCR_MAX_PACKET_SIZE_OFFSET 746 43 47 44 … … 374 371 375 372 int rc = usb_endpoint_pipe_initialize(pipe, connection, 376 0, USB_TRANSFER_CONTROL, CTRL_PIPE_MIN_PACKET_SIZE, 377 USB_DIRECTION_BOTH); 378 379 return rc; 380 } 381 382 /** Probe default control pipe for max packet size. 383 * 384 * The function tries to get the correct value of max packet size several 385 * time before giving up. 386 * 387 * The session on the pipe shall not be started. 388 * 389 * @param pipe Default control pipe. 390 * @return Error code. 391 */ 392 int usb_endpoint_pipe_probe_default_control(usb_endpoint_pipe_t *pipe) 393 { 394 assert(pipe); 395 assert(DEV_DESCR_MAX_PACKET_SIZE_OFFSET < CTRL_PIPE_MIN_PACKET_SIZE); 396 397 if ((pipe->direction != USB_DIRECTION_BOTH) || 398 (pipe->transfer_type != USB_TRANSFER_CONTROL) || 399 (pipe->endpoint_no != 0)) { 400 return EINVAL; 401 } 402 403 #define TRY_LOOP(attempt_var) \ 404 for (attempt_var = 0; attempt_var < 3; attempt_var++) 405 406 size_t failed_attempts; 407 int rc; 408 409 TRY_LOOP(failed_attempts) { 410 rc = usb_endpoint_pipe_start_session(pipe); 411 if (rc == EOK) { 412 break; 413 } 414 } 373 0, USB_TRANSFER_CONTROL, 8, USB_DIRECTION_BOTH); 415 374 if (rc != EOK) { 416 375 return rc; 417 376 } 418 419 420 uint8_t dev_descr_start[CTRL_PIPE_MIN_PACKET_SIZE]; 421 size_t transferred_size; 422 TRY_LOOP(failed_attempts) { 423 rc = usb_request_get_descriptor(pipe, USB_REQUEST_TYPE_STANDARD, 424 USB_REQUEST_RECIPIENT_DEVICE, USB_DESCTYPE_DEVICE, 425 0, 0, dev_descr_start, CTRL_PIPE_MIN_PACKET_SIZE, 426 &transferred_size); 427 if (rc == EOK) { 428 if (transferred_size != CTRL_PIPE_MIN_PACKET_SIZE) { 429 rc = ELIMIT; 430 continue; 431 } 432 break; 433 } 434 } 435 usb_endpoint_pipe_end_session(pipe); 377 rc = usb_endpoint_pipe_start_session(pipe); 436 378 if (rc != EOK) { 437 379 return rc; 438 380 } 439 381 440 pipe->max_packet_size 441 = dev_descr_start[DEV_DESCR_MAX_PACKET_SIZE_OFFSET]; 442 443 return EOK; 382 uint8_t first[8]; 383 size_t size = 0; 384 rc = usb_control_request_get(pipe, USB_REQUEST_TYPE_STANDARD, 385 USB_REQUEST_RECIPIENT_DEVICE, USB_DEVREQ_GET_DESCRIPTOR, 1 << 8, 386 0, first, 8, &size); 387 usb_endpoint_pipe_end_session(pipe); 388 if (rc != EOK || size != 8) { 389 return rc; 390 } 391 392 pipe->max_packet_size = first[7]; 393 return rc; 444 394 } 445 395
Note:
See TracChangeset
for help on using the changeset viewer.