Fork us on GitHub Follow us on Facebook Follow us on Twitter

Changeset 954ea70 in mainline


Ignore:
Timestamp:
2010-10-22T14:55:33Z (10 years ago)
Author:
Vojtech Horky <vojtechhorky@…>
Branches:
master
Children:
b8a3cda
Parents:
a498728
Message:

usbvirt: standard requests handled better

Also, SET_ADDRESS works according to specification.

Location:
uspace/lib/usbvirt
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/usbvirt/ctrlpipe.c

    ra498728 r954ea70  
    4545        ((value & GET_MIDBITS_MASK(size, shift)) >> shift)
    4646
     47usb_address_t dev_new_address = -1;
     48
    4749static int request_get_type(uint8_t request_type)
    4850{
     
    6365        int type = request_get_type(request->request_type);
    6466       
     67        int rc = EOK;
     68       
    6569        switch (type) {
    6670                case REQUEST_TYPE_STANDARD:
    67                         return handle_std_request(request, remaining_data);
     71                        rc = handle_std_request(request, remaining_data);
    6872                        break;
    6973                case REQUEST_TYPE_CLASS:
    7074                        if (DEVICE_HAS_OP(device, on_class_device_request)) {
    71                                 return device->ops->on_class_device_request(device,
     75                                rc = device->ops->on_class_device_request(device,
    7276                                    request, remaining_data);
    7377                        }
     
    7781        }
    7882       
    79         return EOK;
     83        device->send_data(device, 0, NULL, 0);
     84       
     85        if (dev_new_address != -1) {
     86                /*
     87                 * TODO: handle when this request is invalid (e.g.
     88                 * setting address when in configured state).
     89                 */
     90                if (dev_new_address == 0) {
     91                        device->state = USBVIRT_STATE_DEFAULT;
     92                } else {
     93                        device->state = USBVIRT_STATE_ADDRESS;
     94                }
     95                device->address = dev_new_address;
     96               
     97                dev_new_address = -1;
     98        }
     99       
     100        return rc;
    80101}
    81102
  • uspace/lib/usbvirt/ids.h

    ra498728 r954ea70  
    4444int usbvirt_disconnect(void);
    4545
     46typedef enum {
     47        USBVIRT_TRANSACTION_SETUP,
     48        USBVIRT_TRANSACTION_IN,
     49        USBVIRT_TRANSACTION_OUT
     50} usbvirt_transaction_type_t;
     51
     52
    4653#endif
    4754/**
  • uspace/lib/usbvirt/main.c

    ra498728 r954ea70  
    122122                return EINVAL;
    123123        }
    124         if ((buffer == NULL) || (size == 0)) {
     124        if ((buffer == NULL) && (size != 0)) {
    125125                return EINVAL;
    126126        }
     
    131131        int rc;
    132132       
    133         req = async_send_2(phone,
     133        req = async_send_3(phone,
    134134            IPC_M_USBVIRT_DATA_FROM_DEVICE,
    135135            dev->address,
    136136            endpoint,
     137            size,
    137138            &answer_data);
    138139       
    139         rc = async_data_write_start(phone, buffer, size);
    140         if (rc != EOK) {
    141                 async_wait_for(req, NULL);
    142                 return rc;
     140        if (size > 0) {
     141                rc = async_data_write_start(phone, buffer, size);
     142                if (rc != EOK) {
     143                        async_wait_for(req, NULL);
     144                        return rc;
     145                }
    143146        }
    144147       
  • uspace/lib/usbvirt/private.h

    ra498728 r954ea70  
    5858int handle_std_request(usb_device_request_setup_packet_t *request, uint8_t *data);
    5959
     60extern usb_address_t dev_new_address;
     61
    6062#endif
    6163/**
  • uspace/lib/usbvirt/stdreq.c

    ra498728 r954ea70  
    117117        }
    118118       
    119         /*
    120          * TODO: handle when this request is invalid (e.g.
    121          * setting address when in configured state).
    122          */
    123         if (new_address == 0) {
    124                 device->state = USBVIRT_STATE_DEFAULT;
    125         } else {
    126                 device->state = USBVIRT_STATE_ADDRESS;
    127         }
    128        
    129         device->address = new_address;
     119        dev_new_address = new_address;
    130120       
    131121        return EOK;
Note: See TracChangeset for help on using the changeset viewer.