Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/usbdev/src/pipesinit.c

    r58563585 r5bc8250  
    3838#include <usb/dev/request.h>
    3939#include <usb/usb.h>
     40#include <usb/debug.h>
    4041#include <usb/descriptor.h>
    4142
     
    5960        NESTING(INTERFACE, HID),
    6061        NESTING(HID, HID_REPORT),
     62        NESTING(ENDPOINT, SSPEED_EP_COMPANION),
    6163        LAST_NESTING
    6264};
     
    7072{
    7173        return descriptor[1] == USB_DESCTYPE_ENDPOINT;
     74}
     75
     76/** Tells whether given descriptor is of superspeed companion type.
     77 *
     78 * @param descriptor Descriptor in question.
     79 * @return Whether the given descriptor is superspeed companion descriptor.
     80 */
     81static inline bool is_superspeed_companion_descriptor(const uint8_t *descriptor)
     82{
     83        return descriptor[1] == USB_DESCTYPE_SSPEED_EP_COMPANION;
    7284}
    7385
     
    150162 * @param interface Interface descriptor under which belongs the @p endpoint.
    151163 * @param endpoint Endpoint descriptor.
     164 * @param companion Superspeed companion descriptor.
    152165 * @return Error code.
    153166 */
     
    156169    usb_standard_interface_descriptor_t *interface,
    157170    usb_standard_endpoint_descriptor_t *endpoint_desc,
     171    usb_superspeed_endpoint_companion_descriptor_t *companion_desc,
    158172    usb_dev_session_t *bus_session)
    159173{
     
    194208        }
    195209
     210        unsigned max_burst = 0;
     211        unsigned max_streams = 0;
     212        if(companion_desc) {
     213                max_burst = companion_desc->max_burst;
     214                max_streams = SS_COMPANION_MAX_STREAMS(companion_desc->attributes);
     215        }
     216
    196217        int rc = usb_pipe_initialize(&ep_mapping->pipe,
    197218            ep_no, description.transfer_type,
    198219            ED_MPS_PACKET_SIZE_GET(
    199220                uint16_usb2host(endpoint_desc->max_packet_size)),
    200             description.direction,
    201             ED_MPS_TRANS_OPPORTUNITIES_GET(
    202                 uint16_usb2host(endpoint_desc->max_packet_size)), bus_session);
     221            description.direction, ED_MPS_TRANS_OPPORTUNITIES_GET(
     222                uint16_usb2host(endpoint_desc->max_packet_size)),
     223            max_burst, max_streams, bus_session);
    203224        if (rc != EOK) {
    204225                return rc;
     
    207228        ep_mapping->present = true;
    208229        ep_mapping->descriptor = endpoint_desc;
     230        ep_mapping->companion_descriptor = companion_desc;
    209231        ep_mapping->interface = interface;
    210232
     
    235257        do {
    236258                if (is_endpoint_descriptor(descriptor)) {
     259                        /* Check if companion descriptor is present too, it should immediatelly follow. */
     260                        const uint8_t *companion_desc = usb_dp_get_nested_descriptor(parser,
     261                                parser_data, descriptor);
     262                        if (companion_desc && !is_superspeed_companion_descriptor(companion_desc)) {
     263                                /* Not what we wanted, don't pass it further. */
     264                                companion_desc = NULL;
     265                        }
     266
    237267                        (void) process_endpoint(mapping, mapping_count,
    238268                            (usb_standard_interface_descriptor_t *)
     
    240270                            (usb_standard_endpoint_descriptor_t *)
    241271                                descriptor,
     272                            (usb_superspeed_endpoint_companion_descriptor_t *)
     273                                companion_desc,
    242274                            bus_session);
    243275                }
     
    288320        if (config_descriptor == NULL)
    289321                return EBADMEM;
    290        
     322
    291323        if (config_descriptor_size <
    292324            sizeof(usb_standard_configuration_descriptor_t)) {
     
    343375        static_assert(DEV_DESCR_MAX_PACKET_SIZE_OFFSET < CTRL_PIPE_MIN_PACKET_SIZE);
    344376
    345         if ((pipe->direction != USB_DIRECTION_BOTH) ||
    346             (pipe->transfer_type != USB_TRANSFER_CONTROL) ||
    347             (pipe->endpoint_no != 0)) {
     377        if ((pipe->desc.direction != USB_DIRECTION_BOTH) ||
     378            (pipe->desc.transfer_type != USB_TRANSFER_CONTROL) ||
     379            (pipe->desc.endpoint_no != 0)) {
    348380                return EINVAL;
    349381        }
     
    369401        }
    370402
    371         pipe->max_packet_size
     403        pipe->desc.max_packet_size
    372404            = dev_descr_start[DEV_DESCR_MAX_PACKET_SIZE_OFFSET];
    373405
Note: See TracChangeset for help on using the changeset viewer.