Changeset 56db65d in mainline for uspace/lib/usbhost/src


Ignore:
Timestamp:
2017-10-24T11:06:32Z (8 years ago)
Author:
Ondřej Hlavatý <aearsis@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
0206d35
Parents:
894f58c
Message:

usbhost: provide usb_endpoint_desc_t to bus when registering endpoint

This finishes the path of arbitrary information fetched from device all the way down to registering the endpoint in the bus.

Location:
uspace/lib/usbhost/src
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/usbhost/src/bus.c

    r894f58c r56db65d  
    6666}
    6767
    68 int bus_add_ep(bus_t *bus, device_t *device, usb_endpoint_t endpoint,
    69     usb_direction_t dir, usb_transfer_type_t type, size_t max_packet_size,
    70     unsigned packets, size_t size)
     68int bus_add_ep(bus_t *bus, device_t *device, const usb_endpoint_desc_t *desc)
    7169{
    7270        assert(bus);
     
    7876                return ENOMEM;
    7977
    80         ep->target = (usb_target_t) {
    81                 .address = device->address,
    82                 .endpoint = endpoint,
    83         };
    84 
    8578        ep->device = device;
    86         ep->direction = dir;
    87         ep->transfer_type = type;
    88         ep->max_packet_size = max_packet_size;
    89         ep->packets = packets;
    90 
    91         ep->bandwidth = bus_count_bw(ep, size);
    92 
    93         const int err = bus_register_endpoint(bus, ep);
     79        const int err = bus_register_endpoint(bus, ep, desc);
    9480
    9581        /* drop Temporary reference */
     
    165151}
    166152
    167 int bus_register_endpoint(bus_t *bus, endpoint_t *ep)
     153int bus_register_endpoint(bus_t *bus, endpoint_t *ep, const usb_endpoint_desc_t *desc)
    168154{
    169155        assert(bus);
     
    174160
    175161        fibril_mutex_lock(&bus->guard);
    176         const int r = bus->ops.register_endpoint(bus, ep);
     162        const int r = bus->ops.register_endpoint(bus, ep, desc);
    177163        fibril_mutex_unlock(&bus->guard);
    178164
  • uspace/lib/usbhost/src/ddf_helpers.c

    r894f58c r56db65d  
    9898        assert(dev);
    9999
    100         const size_t size = endpoint_desc->max_packet_size;
    101 
    102100        usb_log_debug("Register endpoint %d:%d %s-%s %zuB %ums.\n",
    103101                dev->address, endpoint_desc->endpoint_no,
     
    106104                endpoint_desc->max_packet_size, endpoint_desc->usb2.polling_interval);
    107105
    108         // FIXME: we now have max_streams and max_burst in endpoint_desc->usb3 struct
    109         // Hand it down to XHCI, refactor, whatever
    110 
    111         return bus_add_ep(hcd->bus, dev, endpoint_desc->endpoint_no,
    112                 endpoint_desc->direction, endpoint_desc->transfer_type,
    113                 endpoint_desc->max_packet_size, endpoint_desc->packets,
    114                 size);
     106        return bus_add_ep(hcd->bus, dev, endpoint_desc);
    115107}
    116108
  • uspace/lib/usbhost/src/hcd.c

    r894f58c r56db65d  
    8787        assert(device->address == target.address);
    8888
     89        if (!hcd->ops.schedule) {
     90                usb_log_error("HCD does not implement scheduler.\n");
     91                return ENOTSUP;
     92        }
     93
    8994        endpoint_t *ep = bus_find_endpoint(hcd->bus, device, target, direction);
    9095        if (ep == NULL) {
     
    9398                return ENOENT;
    9499        }
     100
     101        // TODO cut here aka provide helper to call with instance of endpoint_t in hand
    95102
    96103        usb_log_debug2("%s %d:%d %zu(%zu).\n",
     
    104111                    ep->target.address, ep->target.endpoint, name, bw, ep->bandwidth);
    105112                return ENOSPC;
    106         }
    107         if (!hcd->ops.schedule) {
    108                 usb_log_error("HCD does not implement scheduler.\n");
    109                 return ENOTSUP;
    110113        }
    111114
  • uspace/lib/usbhost/src/usb2_bus.c

    r894f58c r56db65d  
    9191}
    9292
     93static const usb_endpoint_desc_t usb2_default_control_ep = {
     94        .endpoint_no = 0,
     95        .transfer_type = USB_TRANSFER_CONTROL,
     96        .direction = USB_DIRECTION_BOTH,
     97        .max_packet_size = CTRL_PIPE_MIN_PACKET_SIZE,
     98        .packets = 1,
     99};
     100
     101
     102static const usb_target_t usb2_default_target = {{
     103        .address = USB_ADDRESS_DEFAULT,
     104        .endpoint = 0,
     105}};
     106
    93107static int usb2_bus_address_device(bus_t *bus, hcd_t *hcd, device_t *dev)
    94108{
    95109        int err;
    96 
    97         static const usb_target_t default_target = {{
    98                 .address = USB_ADDRESS_DEFAULT,
    99                 .endpoint = 0,
    100         }};
    101110
    102111        /** Reserve address early, we want pretty log messages */
     
    111120        /* Add default pipe on default address */
    112121        usb_log_debug("Device(%d): Adding default target (0:0)", address);
    113         err = bus_add_ep(bus, dev, 0, USB_DIRECTION_BOTH, USB_TRANSFER_CONTROL,
    114             CTRL_PIPE_MIN_PACKET_SIZE, CTRL_PIPE_MIN_PACKET_SIZE, 1);
     122        err = bus_add_ep(bus, dev, &usb2_default_control_ep);
    115123        if (err != EOK) {
    116124                usb_log_error("Device(%d): Failed to add default target: %s.",
     
    126134        usb_log_debug("Device(%d): Requesting first 8B of device descriptor.",
    127135            address);
    128         ssize_t got = hcd_send_batch_sync(hcd, dev, default_target, USB_DIRECTION_IN,
     136        ssize_t got = hcd_send_batch_sync(hcd, dev, usb2_default_target, USB_DIRECTION_IN,
    129137            (char *) &desc, CTRL_PIPE_MIN_PACKET_SIZE, *(uint64_t *)&get_device_desc_8,
    130138            "read first 8 bytes of dev descriptor");
     
    134142                usb_log_error("Device(%d): Failed to get 8B of dev descr: %s.",
    135143                    address, str_error(err));
    136                 goto err_default_target;
     144                goto err_default_control_ep;
    137145        }
    138146
     
    141149
    142150        usb_log_debug("Device(%d): Setting USB address.", address);
    143         err = hcd_send_batch_sync(hcd, dev, default_target, USB_DIRECTION_OUT,
     151        err = hcd_send_batch_sync(hcd, dev, usb2_default_target, USB_DIRECTION_OUT,
    144152            NULL, 0, *(uint64_t *)&set_address, "set address");
    145153        if (err != 0) {
    146154                usb_log_error("Device(%d): Failed to set new address: %s.",
    147155                    address, str_error(got));
    148                 goto err_default_target;
     156                goto err_default_control_ep;
    149157        }
    150158
    151159        dev->address = address;
     160
     161        const usb_endpoint_desc_t control_ep = {
     162                .endpoint_no = 0,
     163                .transfer_type = USB_TRANSFER_CONTROL,
     164                .direction = USB_DIRECTION_BOTH,
     165                .max_packet_size = ED_MPS_PACKET_SIZE_GET(uint16_usb2host(desc.max_packet_size)),
     166                .packets = ED_MPS_TRANS_OPPORTUNITIES_GET(uint16_usb2host(desc.max_packet_size)),
     167        };
    152168
    153169        /* Register EP on the new address */
    154170        usb_log_debug("Device(%d): Registering control EP.", address);
    155         err = bus_add_ep(bus, dev, 0, USB_DIRECTION_BOTH, USB_TRANSFER_CONTROL,
    156             ED_MPS_PACKET_SIZE_GET(uint16_usb2host(desc.max_packet_size)),
    157             ED_MPS_TRANS_OPPORTUNITIES_GET(uint16_usb2host(desc.max_packet_size)),
    158             ED_MPS_PACKET_SIZE_GET(uint16_usb2host(desc.max_packet_size)));
     171        err = bus_add_ep(bus, dev, &control_ep);
    159172        if (err != EOK) {
    160173                usb_log_error("Device(%d): Failed to register EP0: %s",
    161174                    address, str_error(err));
    162                 goto err_default_target;
    163         }
    164 
    165         bus_remove_ep(bus, dev, default_target, USB_DIRECTION_BOTH);
    166         return EOK;
    167 
    168 err_default_target:
    169         bus_remove_ep(bus, dev, default_target, USB_DIRECTION_BOTH);
     175                goto err_default_control_ep;
     176        }
     177
     178        bus_remove_ep(bus, dev, usb2_default_target, USB_DIRECTION_BOTH);
     179        return EOK;
     180
     181err_default_control_ep:
     182        bus_remove_ep(bus, dev, usb2_default_target, USB_DIRECTION_BOTH);
    170183err_address:
    171184        bus_release_address(bus, address);
     
    278291 * @param endpoint USB endpoint number.
    279292 */
    280 static int usb2_bus_register_ep(bus_t *bus_base, endpoint_t *ep)
     293static int usb2_bus_register_ep(bus_t *bus_base, endpoint_t *ep, const usb_endpoint_desc_t *desc)
    281294{
    282295        usb2_bus_t *bus = bus_to_usb2_bus(bus_base);
    283296        assert(ep);
    284297
    285         usb_address_t address = ep->target.address;
    286 
    287         if (!usb_address_is_valid(address))
    288                 return EINVAL;
    289 
    290         /* Check for speed and address */
    291         if (!bus->devices[address].occupied)
    292                 return ENOENT;
     298        assert(ep->device);
     299
     300        /* Extract USB2-related information from endpoint_desc */
     301        ep->target = (usb_target_t) {{
     302                .address = ep->device->address,
     303                .endpoint = desc->endpoint_no,
     304        }};
     305        ep->direction = desc->direction;
     306        ep->transfer_type = desc->transfer_type;
     307        ep->max_packet_size = desc->max_packet_size;
     308        ep->packets = desc->packets;
     309
     310        ep->bandwidth = bus_base->ops.count_bw(ep, desc->max_packet_size);
    293311
    294312        /* Check for existence */
     
    300318                return ENOSPC;
    301319
    302         list_append(&ep->link, get_list(bus, ep->target.address));
     320        list_append(&ep->link, get_list(bus, ep->device->address));
    303321        bus->free_bw -= ep->bandwidth;
    304322
Note: See TracChangeset for help on using the changeset viewer.