Changeset 56db65d in mainline for uspace/lib/usbhost/src/usb2_bus.c


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.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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.