Changeset 7feeb84 in mainline for uspace/drv/vhc/hubops.c


Ignore:
Timestamp:
2010-12-13T14:25:49Z (13 years ago)
Author:
Vojtech Horky <vojtechhorky@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
76daaf9f
Parents:
8f8ae1fd
Message:

usbvirt: more flexible callbacks for endpoint zero

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/vhc/hubops.c

    r8f8ae1fd r7feeb84  
    6161static int on_set_configuration(struct usbvirt_device *dev,
    6262    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);
    6563static int on_data_request(struct usbvirt_device *dev,
    6664    usb_endpoint_t endpoint,
     
    6967static void clear_port_status_change_nl(hub_port_t *, uint16_t);
    7068static 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 };
     69static int get_port_status(uint16_t portindex);
    8070
    8171/** Callback for GET_DESCRIPTOR request. */
     
    300290}
    301291
    302 static int get_port_status(uint16_t portindex)
     292int get_port_status(uint16_t portindex)
    303293{
    304294        _GET_PORT(port, portindex);
     
    384374
    385375
    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 _VERIFY 
    445 
    446 
    447         return EOK;
    448 }
    449 
    450376void clear_port_status_change_nl(hub_port_t *port, uint16_t change)
    451377{
     
    509435
    510436
     437
     438static 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
     445static 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
     452static 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
     459static 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
     467static 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
     474static 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
     481static 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
     488static 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. */
     518static 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. */
     572usbvirt_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
    511578/**
    512579 * @}
Note: See TracChangeset for help on using the changeset viewer.