Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/usbvirt/src/ctrltransfer.c

    r81da273b r9d58539  
    5050 */
    5151int process_control_transfer(usbvirt_device_t *dev,
    52     const usbvirt_control_request_handler_t *control_handlers,
    53     const usb_device_request_setup_packet_t *setup,
     52    usbvirt_control_request_handler_t *control_handlers,
     53    usb_device_request_setup_packet_t *setup,
    5454    uint8_t *data, size_t *data_sent_size)
    5555{
     
    6060                return EFORWARD;
    6161        }
    62         const usbvirt_control_request_handler_t *handler = control_handlers;
    63         for (;handler->callback != NULL; ++handler) {
    64                 if (handler->request != setup->request ||
    65                     handler->request_type != setup->request_type) {
    66                         continue;
     62
     63        usb_direction_t direction = setup->request_type & 128 ?
     64            USB_DIRECTION_IN : USB_DIRECTION_OUT;
     65        usb_request_recipient_t req_recipient = setup->request_type & 31;
     66        usb_request_type_t req_type = (setup->request_type >> 5) & 3;
     67
     68        usbvirt_control_request_handler_t *handler = control_handlers;
     69        while (handler->callback != NULL) {
     70                if (handler->req_direction != direction) {
     71                        goto next;
     72                }
     73                if (handler->req_recipient != req_recipient) {
     74                        goto next;
     75                }
     76                if (handler->req_type != req_type) {
     77                        goto next;
     78                }
     79                if (handler->request != setup->request) {
     80                        goto next;
    6781                }
    6882
     
    7084                    usb_debug_str_buffer((uint8_t*) setup, sizeof(*setup), 0));
    7185                int rc = handler->callback(dev, setup, data, data_sent_size);
    72                 if (rc != EFORWARD) {
    73                         return rc;
     86                if (rc == EFORWARD) {
     87                        goto next;
    7488                }
    7589
     90                return rc;
     91
     92next:
     93                handler++;
    7694        }
    7795
Note: See TracChangeset for help on using the changeset viewer.