Changeset 7feeb84 in mainline for uspace/drv/vhc/hubops.c
- Timestamp:
- 2010-12-13T14:25:49Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 76daaf9f
- Parents:
- 8f8ae1fd
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/vhc/hubops.c
r8f8ae1fd r7feeb84 61 61 static int on_set_configuration(struct usbvirt_device *dev, 62 62 usb_device_request_setup_packet_t *request, uint8_t *data); 63 static int on_class_request(struct usbvirt_device *dev,64 usb_device_request_setup_packet_t *request, uint8_t *data);65 63 static int on_data_request(struct usbvirt_device *dev, 66 64 usb_endpoint_t endpoint, … … 69 67 static void clear_port_status_change_nl(hub_port_t *, uint16_t); 70 68 static void set_port_state_nl(hub_port_t *, hub_port_state_t); 71 72 /** Hub operations. */ 73 usbvirt_device_ops_t hub_ops = { 74 .on_standard_request[USB_DEVREQ_GET_DESCRIPTOR] = on_get_descriptor, 75 .on_standard_request[USB_DEVREQ_SET_CONFIGURATION] = on_set_configuration, 76 .on_class_device_request = on_class_request, 77 .on_data = NULL, 78 .on_data_request = on_data_request 79 }; 69 static int get_port_status(uint16_t portindex); 80 70 81 71 /** Callback for GET_DESCRIPTOR request. */ … … 300 290 } 301 291 302 staticint get_port_status(uint16_t portindex)292 int get_port_status(uint16_t portindex) 303 293 { 304 294 _GET_PORT(port, portindex); … … 384 374 385 375 386 /** Callback for class request. */387 static int on_class_request(struct usbvirt_device *dev,388 usb_device_request_setup_packet_t *request, uint8_t *data)389 {390 dprintf(2, "hub class request (%d)", (int) request->request);391 392 uint8_t recipient = request->request_type & 31;393 uint8_t direction = request->request_type >> 7;394 395 #define _VERIFY(cond) \396 do { \397 if (!(cond)) { \398 dprintf(0, "WARN: invalid class request (%s not met).\n", \399 NAME, #cond); \400 return EINVAL; \401 } \402 } while (0)403 404 switch (request->request) {405 case USB_HUB_REQUEST_CLEAR_FEATURE:406 _VERIFY(direction == 0);407 _VERIFY(request->length == 0);408 if (recipient == 0) {409 _VERIFY(request->index == 0);410 return clear_hub_feature(request->value);411 } else {412 _VERIFY(recipient == 3);413 return clear_port_feature(request->value,414 request->index);415 }416 417 case USB_HUB_REQUEST_GET_STATE:418 return get_bus_state(request->index);419 420 case USB_HUB_REQUEST_GET_DESCRIPTOR:421 return get_hub_descriptor(dev, request->value_low,422 request->value_high, request->length);423 424 case USB_HUB_REQUEST_GET_STATUS:425 if (recipient == 0) {426 return get_hub_status();427 } else {428 return get_port_status(request->index);429 }430 431 case USB_HUB_REQUEST_SET_FEATURE:432 if (recipient == 0) {433 return set_hub_feature(request->value);434 } else {435 return set_port_feature(request->value, request->index);436 }437 438 default:439 dprintf(0, "WARN: unknown request (%d)!\n",440 request->request);441 break;442 }443 444 #undef _VERIFY445 446 447 return EOK;448 }449 450 376 void clear_port_status_change_nl(hub_port_t *port, uint16_t change) 451 377 { … … 509 435 510 436 437 438 static int req_clear_hub_feature(usbvirt_device_t *dev, 439 usb_device_request_setup_packet_t *request, 440 uint8_t *data) 441 { 442 return clear_hub_feature(request->value); 443 } 444 445 static int req_clear_port_feature(usbvirt_device_t *dev, 446 usb_device_request_setup_packet_t *request, 447 uint8_t *data) 448 { 449 return clear_port_feature(request->value, request->index); 450 } 451 452 static int req_get_bus_state(usbvirt_device_t *dev, 453 usb_device_request_setup_packet_t *request, 454 uint8_t *data) 455 { 456 return get_bus_state(request->index); 457 } 458 459 static int req_get_hub_descriptor(usbvirt_device_t *dev, 460 usb_device_request_setup_packet_t *request, 461 uint8_t *data) 462 { 463 return get_hub_descriptor(dev, request->value_low, 464 request->value_high, request->length); 465 } 466 467 static int req_get_hub_status(usbvirt_device_t *dev, 468 usb_device_request_setup_packet_t *request, 469 uint8_t *data) 470 { 471 return get_hub_status(); 472 } 473 474 static int req_get_port_status(usbvirt_device_t *dev, 475 usb_device_request_setup_packet_t *request, 476 uint8_t *data) 477 { 478 return get_port_status(request->index); 479 } 480 481 static int req_set_hub_feature(usbvirt_device_t *dev, 482 usb_device_request_setup_packet_t *request, 483 uint8_t *data) 484 { 485 return set_hub_feature(request->value); 486 } 487 488 static int req_set_port_feature(usbvirt_device_t *dev, 489 usb_device_request_setup_packet_t *request, 490 uint8_t *data) 491 { 492 return set_port_feature(request->value, request->index); 493 } 494 495 #define CLASS_REQ_IN(recipient) \ 496 USBVIRT_MAKE_CONTROL_REQUEST_TYPE(USB_DIRECTION_IN, \ 497 USBVIRT_REQUEST_TYPE_CLASS, recipient) 498 #define CLASS_REQ_OUT(recipient) \ 499 USBVIRT_MAKE_CONTROL_REQUEST_TYPE(USB_DIRECTION_OUT, \ 500 USBVIRT_REQUEST_TYPE_CLASS, recipient) 501 502 #define REC_OTHER USBVIRT_REQUEST_RECIPIENT_OTHER 503 #define REC_DEVICE USBVIRT_REQUEST_RECIPIENT_DEVICE 504 #define DIR_IN USB_DIRECTION_IN 505 #define DIR_OUT USB_DIRECTION_OUT 506 507 #define CLASS_REQ(direction, recipient, req) \ 508 .request_type = USBVIRT_MAKE_CONTROL_REQUEST_TYPE(direction, \ 509 USBVIRT_REQUEST_TYPE_CLASS, recipient), \ 510 .request = req 511 512 #define STD_REQ(direction, recipient, req) \ 513 .request_type = USBVIRT_MAKE_CONTROL_REQUEST_TYPE(direction, \ 514 USBVIRT_REQUEST_TYPE_STANDARD, recipient), \ 515 .request = req 516 517 /** Hub operations on control endpoint zero. */ 518 static usbvirt_control_transfer_handler_t endpoint_zero_handlers[] = { 519 { 520 STD_REQ(DIR_OUT, REC_DEVICE, USB_DEVREQ_SET_CONFIGURATION), 521 .callback = on_set_configuration 522 }, 523 { 524 STD_REQ(DIR_IN, REC_DEVICE, USB_DEVREQ_GET_DESCRIPTOR), 525 .callback = on_get_descriptor 526 }, 527 { 528 CLASS_REQ(DIR_IN, REC_DEVICE, USB_DEVREQ_GET_DESCRIPTOR), 529 .callback = on_get_descriptor 530 }, 531 { 532 CLASS_REQ(DIR_IN, REC_OTHER, USB_HUB_REQUEST_GET_STATUS), 533 .callback = req_get_port_status 534 }, 535 { 536 CLASS_REQ(DIR_OUT, REC_DEVICE, USB_HUB_REQUEST_CLEAR_FEATURE), 537 .callback = req_clear_hub_feature 538 }, 539 { 540 CLASS_REQ(DIR_OUT, REC_OTHER, USB_HUB_REQUEST_CLEAR_FEATURE), 541 .callback = req_clear_port_feature 542 }, 543 { 544 CLASS_REQ(DIR_IN, REC_OTHER, USB_HUB_REQUEST_GET_STATE), 545 .callback = req_get_bus_state 546 }, 547 { 548 CLASS_REQ(DIR_IN, REC_DEVICE, USB_HUB_REQUEST_GET_DESCRIPTOR), 549 .callback = req_get_hub_descriptor 550 }, 551 { 552 CLASS_REQ(DIR_IN, REC_DEVICE, USB_HUB_REQUEST_GET_STATUS), 553 .callback = req_get_hub_status 554 }, 555 { 556 CLASS_REQ(DIR_IN, REC_OTHER, USB_HUB_REQUEST_GET_STATUS), 557 .callback = req_get_port_status 558 }, 559 { 560 CLASS_REQ(DIR_OUT, REC_DEVICE, USB_HUB_REQUEST_SET_FEATURE), 561 .callback = req_set_hub_feature 562 }, 563 { 564 CLASS_REQ(DIR_OUT, REC_OTHER, USB_HUB_REQUEST_SET_FEATURE), 565 .callback = req_set_port_feature 566 }, 567 USBVIRT_CONTROL_TRANSFER_HANDLER_LAST 568 }; 569 570 571 /** Hub operations. */ 572 usbvirt_device_ops_t hub_ops = { 573 .control_transfer_handlers = endpoint_zero_handlers, 574 .on_data = NULL, 575 .on_data_request = on_data_request 576 }; 577 511 578 /** 512 579 * @}
Note:
See TracChangeset
for help on using the changeset viewer.