Ignore:
File:
1 edited

Legend:

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

    r58563585 rbb655dab  
    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{
     
    162176         * Get endpoint characteristics.
    163177         */
    164 
    165         /* Actual endpoint number is in bits 0..3 */
    166         const usb_endpoint_t ep_no = endpoint_desc->endpoint_address & 0x0F;
    167 
    168178        const usb_endpoint_description_t description = {
    169                 /* Endpoint direction is set by bit 7 */
    170                 .direction = (endpoint_desc->endpoint_address & 128)
    171                     ? USB_DIRECTION_IN : USB_DIRECTION_OUT,
    172                 /* Transfer type is in bits 0..2 and
    173                  * the enum values corresponds 1:1 */
    174                 .transfer_type = endpoint_desc->attributes & 3,
     179                .transfer_type = USB_ED_GET_TRANSFER_TYPE(*endpoint_desc),
     180                .direction = USB_ED_GET_DIR(*endpoint_desc),
    175181
    176182                /* Get interface characteristics. */
     
    194200        }
    195201
    196         int rc = usb_pipe_initialize(&ep_mapping->pipe,
    197             ep_no, description.transfer_type,
    198             ED_MPS_PACKET_SIZE_GET(
    199                 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);
    203         if (rc != EOK) {
    204                 return rc;
    205         }
     202        int err = usb_pipe_initialize(&ep_mapping->pipe, bus_session);
     203        if (err)
     204                return err;
    206205
    207206        ep_mapping->present = true;
    208207        ep_mapping->descriptor = endpoint_desc;
     208        ep_mapping->companion_descriptor = companion_desc;
    209209        ep_mapping->interface = interface;
    210210
     
    235235        do {
    236236                if (is_endpoint_descriptor(descriptor)) {
     237                        /* Check if companion descriptor is present too, it should immediatelly follow. */
     238                        const uint8_t *companion_desc = usb_dp_get_nested_descriptor(parser,
     239                                parser_data, descriptor);
     240                        if (companion_desc && !is_superspeed_companion_descriptor(companion_desc)) {
     241                                /* Not what we wanted, don't pass it further. */
     242                                companion_desc = NULL;
     243                        }
     244
    237245                        (void) process_endpoint(mapping, mapping_count,
    238246                            (usb_standard_interface_descriptor_t *)
     
    240248                            (usb_standard_endpoint_descriptor_t *)
    241249                                descriptor,
     250                            (usb_superspeed_endpoint_companion_descriptor_t *)
     251                                companion_desc,
    242252                            bus_session);
    243253                }
     
    288298        if (config_descriptor == NULL)
    289299                return EBADMEM;
    290        
     300
    291301        if (config_descriptor_size <
    292302            sizeof(usb_standard_configuration_descriptor_t)) {
     
    328338}
    329339
    330 /** Probe default control pipe for max packet size.
    331  *
    332  * The function tries to get the correct value of max packet size several
    333  * time before giving up.
    334  *
    335  * The session on the pipe shall not be started.
    336  *
    337  * @param pipe Default control pipe.
    338  * @return Error code.
    339  */
    340 int usb_pipe_probe_default_control(usb_pipe_t *pipe)
    341 {
    342         assert(pipe);
    343         static_assert(DEV_DESCR_MAX_PACKET_SIZE_OFFSET < CTRL_PIPE_MIN_PACKET_SIZE);
    344 
    345         if ((pipe->direction != USB_DIRECTION_BOTH) ||
    346             (pipe->transfer_type != USB_TRANSFER_CONTROL) ||
    347             (pipe->endpoint_no != 0)) {
    348                 return EINVAL;
    349         }
    350 
    351         uint8_t dev_descr_start[CTRL_PIPE_MIN_PACKET_SIZE];
    352         size_t transferred_size;
    353         int rc;
    354         for (size_t attempt_var = 0; attempt_var < 3; ++attempt_var) {
    355                 rc = usb_request_get_descriptor(pipe, USB_REQUEST_TYPE_STANDARD,
    356                     USB_REQUEST_RECIPIENT_DEVICE, USB_DESCTYPE_DEVICE,
    357                     0, 0, dev_descr_start, CTRL_PIPE_MIN_PACKET_SIZE,
    358                     &transferred_size);
    359                 if (rc == EOK) {
    360                         if (transferred_size != CTRL_PIPE_MIN_PACKET_SIZE) {
    361                                 rc = ELIMIT;
    362                                 continue;
    363                         }
    364                         break;
    365                 }
    366         }
    367         if (rc != EOK) {
    368                 return rc;
    369         }
    370 
    371         pipe->max_packet_size
    372             = dev_descr_start[DEV_DESCR_MAX_PACKET_SIZE_OFFSET];
    373 
    374         return EOK;
    375 }
    376 
    377340/**
    378341 * @}
Note: See TracChangeset for help on using the changeset viewer.