Changeset 7feeb84 in mainline for uspace/lib/usbvirt/src/stdreq.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/lib/usbvirt/src/stdreq.c

    r8f8ae1fd r7feeb84  
    4040#include "private.h"
    4141
    42 
    43 typedef int (*usbvirt_stdreq_handler_t)(usbvirt_device_t *,
    44 usb_device_request_setup_packet_t *, uint8_t *);
    45 
    4642/*
    4743 * All sub handlers must return EFORWARD to inform the caller that
     
    177173}
    178174
    179 static usbvirt_stdreq_handler_t local_handlers[USB_DEVREQ_LAST_STD] = {
    180         [USB_DEVREQ_GET_DESCRIPTOR] = handle_get_descriptor,
    181         [USB_DEVREQ_SET_ADDRESS] = handle_set_address,
    182         [USB_DEVREQ_SET_CONFIGURATION] = handle_set_configuration
     175
     176#define MAKE_BM_REQUEST(direction, recipient) \
     177        USBVIRT_MAKE_CONTROL_REQUEST_TYPE(direction, \
     178            USBVIRT_REQUEST_TYPE_STANDARD, recipient)
     179#define MAKE_BM_REQUEST_DEV(direction) \
     180        MAKE_BM_REQUEST(direction, USBVIRT_REQUEST_RECIPIENT_DEVICE)
     181
     182usbvirt_control_transfer_handler_t control_pipe_zero_local_handlers[] = {
     183        {
     184                .request_type = MAKE_BM_REQUEST_DEV(USB_DIRECTION_IN),
     185                .request = USB_DEVREQ_GET_DESCRIPTOR,
     186                .callback = handle_get_descriptor
     187        },
     188        {
     189                .request_type = MAKE_BM_REQUEST_DEV(USB_DIRECTION_OUT),
     190                .request = USB_DEVREQ_SET_ADDRESS,
     191                .callback = handle_set_address
     192        },
     193        {
     194                .request_type = MAKE_BM_REQUEST_DEV(USB_DIRECTION_OUT),
     195                .request = USB_DEVREQ_SET_CONFIGURATION,
     196                .callback = handle_set_configuration
     197        },
     198        USBVIRT_CONTROL_TRANSFER_HANDLER_LAST
    183199};
    184 
    185 /** Handle standard device request. */
    186 int handle_std_request(usbvirt_device_t *device,
    187     usb_device_request_setup_packet_t *request_packet, uint8_t *data)
    188 {
    189         int request = request_packet->request;
    190 
    191         device->lib_debug(device, 3, USBVIRT_DEBUGTAG_CONTROL_PIPE_ZERO,
    192             "handling standard request %d", request);
    193 
    194         if (request >= USB_DEVREQ_LAST_STD) {
    195                 return ENOTSUP;
    196         }
    197        
    198         int rc = EFORWARD;
    199         if ((device->ops)
    200             && (device->ops->on_standard_request[request])) {
    201                 rc = device->ops->on_standard_request[request](device,
    202                     request_packet, data);
    203         }
    204 
    205         if (rc == EFORWARD) {
    206                 if (local_handlers[request]) {
    207                         rc = local_handlers[request](device,
    208                             request_packet, data);
    209                 } else {
    210                         rc = ENOTSUP;
    211                 }
    212         }
    213 
    214         assert(rc != EFORWARD);
    215         return rc;
    216 }
    217200
    218201/**
Note: See TracChangeset for help on using the changeset viewer.