Changeset 45e49e6 in mainline


Ignore:
Timestamp:
2018-01-20T18:53:23Z (6 years ago)
Author:
Ondřej Hlavatý <aearsis@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
26beeda
Parents:
24fcb8b
git-author:
Ondřej Hlavatý <aearsis@…> (2018-01-20 18:52:27)
git-committer:
Ondřej Hlavatý <aearsis@…> (2018-01-20 18:53:23)
Message:

usbhub: handle superspeed hubs

Location:
uspace
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/bus/usb/usbhub/usbhub.c

    r24fcb8b r45e49e6  
    318318            usb_device_get_default_pipe(hub_dev->usb_device);
    319319
     320        usb_descriptor_type_t desc_type = hub_dev->speed >= USB_SPEED_SUPER
     321                ? USB_DESCTYPE_SSPEED_HUB : USB_DESCTYPE_HUB;
     322
    320323        usb_hub_descriptor_header_t descriptor;
    321324        size_t received_size;
    322325        int opResult = usb_request_get_descriptor(control_pipe,
    323326            USB_REQUEST_TYPE_CLASS, USB_REQUEST_RECIPIENT_DEVICE,
    324             USB_DESCTYPE_HUB, 0, 0, &descriptor,
     327            desc_type, 0, 0, &descriptor,
    325328            sizeof(usb_hub_descriptor_header_t), &received_size);
    326329        if (opResult != EOK) {
     
    334337        hub_dev->port_count = descriptor.port_count;
    335338        hub_dev->control_pipe = control_pipe;
     339
     340        if ((opResult = usb_hub_set_depth(hub_dev))) {
     341                usb_log_error("(%p): Failed to set hub depth: %s.",
     342                    hub_dev, str_error(opResult));
     343                return opResult;
     344        }
    336345
    337346        hub_dev->ports = calloc(hub_dev->port_count, sizeof(usb_hub_port_t));
     
    458467                }
    459468        }
     469}
     470
     471/**
     472 * Set feature on the real hub port.
     473 *
     474 * @param port Port structure.
     475 * @param feature Feature selector.
     476 */
     477int usb_hub_set_depth(const usb_hub_dev_t *hub)
     478{
     479        assert(hub);
     480
     481        /* Slower hubs do not care about depth */
     482        if (hub->speed < USB_SPEED_SUPER)
     483                return EOK;
     484
     485        const usb_device_request_setup_packet_t set_request = {
     486                .request_type = USB_HUB_REQ_TYPE_SET_HUB_DEPTH,
     487                .request = USB_HUB_REQUEST_SET_HUB_DEPTH,
     488                .value = uint16_host2usb(usb_device_get_depth(hub->usb_device)),
     489                .index = 0,
     490                .length = 0,
     491        };
     492        return usb_pipe_control_write(hub->control_pipe, &set_request,
     493            sizeof(set_request), NULL, 0);
    460494}
    461495
  • uspace/drv/bus/usb/usbhub/usbhub.h

    r24fcb8b r45e49e6  
    8585int usb_hub_device_gone(usb_device_t *);
    8686
     87int usb_hub_set_depth(const usb_hub_dev_t *);
    8788int usb_hub_get_port_status(const usb_hub_dev_t *, size_t, usb_port_status_t *);
    8889int usb_hub_set_port_feature(const usb_hub_dev_t *, size_t, usb_hub_class_feature_t);
  • uspace/lib/usbdev/include/usb/dev/device.h

    r24fcb8b r45e49e6  
    4242#include <usb/dev/alternate_ifaces.h>
    4343#include <usb/dev/pipes.h>
     44#include <usbhc_iface.h>
    4445
    4546#include <assert.h>
     
    9091int usb_device_unmap_ep(usb_endpoint_mapping_t *);
    9192
    92 usb_speed_t usb_device_get_speed(usb_device_t *);
    93 int usb_device_get_iface_number(usb_device_t *);
    94 devman_handle_t usb_device_get_devman_handle(usb_device_t *);
     93usb_address_t usb_device_get_address(const usb_device_t *);
     94usb_speed_t usb_device_get_depth(const usb_device_t *);
     95usb_speed_t usb_device_get_speed(const usb_device_t *);
     96int usb_device_get_iface_number(const usb_device_t *);
     97devman_handle_t usb_device_get_devman_handle(const usb_device_t *);
    9598
    9699const usb_device_descriptors_t * usb_device_descriptors(usb_device_t *);
  • uspace/lib/usbdev/src/devdrv.c

    r24fcb8b r45e49e6  
    7676        /** USB address of this device */
    7777        usb_address_t address;
     78
     79        /** Depth in the USB hub hiearchy */
     80        unsigned depth;
    7881
    7982        /** USB speed of this device */
     
    364367}
    365368
    366 usb_speed_t usb_device_get_speed(usb_device_t *usb_dev)
     369usb_address_t usb_device_get_address(const usb_device_t *usb_dev)
     370{
     371        assert(usb_dev);
     372        return usb_dev->depth;
     373}
     374
     375unsigned usb_device_get_depth(const usb_device_t *usb_dev)
     376{
     377        assert(usb_dev);
     378        return usb_dev->depth;
     379}
     380
     381usb_speed_t usb_device_get_speed(const usb_device_t *usb_dev)
    367382{
    368383        assert(usb_dev);
     
    370385}
    371386
    372 int usb_device_get_iface_number(usb_device_t *usb_dev)
     387int usb_device_get_iface_number(const usb_device_t *usb_dev)
    373388{
    374389        assert(usb_dev);
     
    376391}
    377392
    378 devman_handle_t usb_device_get_devman_handle(usb_device_t *usb_dev)
     393devman_handle_t usb_device_get_devman_handle(const usb_device_t *usb_dev)
    379394{
    380395        assert(usb_dev);
     
    498513        if (ret == EOK) {
    499514                dev->address = dev_desc.address;
     515                dev->depth = dev_desc.depth;
    500516                dev->speed = dev_desc.speed;
    501517                dev->handle = dev_desc.handle;
Note: See TracChangeset for help on using the changeset viewer.