OSDN Git Service

usb: aspeed-vhub: add qualifier descriptor
authorNeal Liu <neal_liu@aspeedtech.com>
Wed, 8 Dec 2021 10:05:42 +0000 (18:05 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 13 Dec 2021 14:00:43 +0000 (15:00 +0100)
USB3 Command Verifier (USB3CV) is the official tool for
USB3 Hub and Device Framework testing.

A high-speed capable device that has different device information
for full-speed and high-speed must have a Device Qualifier Descriptor.

This patch is to support device qualifier to pass
USB3CV - Chapter 9 Test [USB 2 devices] - Device Qualifier Tests.

Signed-off-by: Neal Liu <neal_liu@aspeedtech.com>
Link: https://lore.kernel.org/r/20211208100545.1441397-2-neal_liu@aspeedtech.com
Acked-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/gadget/udc/aspeed-vhub/hub.c
drivers/usb/gadget/udc/aspeed-vhub/vhub.h

index b9960fd..93f27a7 100644 (file)
@@ -68,6 +68,18 @@ static const struct usb_device_descriptor ast_vhub_dev_desc = {
        .bNumConfigurations     = 1,
 };
 
+static const struct usb_qualifier_descriptor ast_vhub_qual_desc = {
+       .bLength = 0xA,
+       .bDescriptorType = USB_DT_DEVICE_QUALIFIER,
+       .bcdUSB = cpu_to_le16(0x0200),
+       .bDeviceClass = USB_CLASS_HUB,
+       .bDeviceSubClass = 0,
+       .bDeviceProtocol = 0,
+       .bMaxPacketSize0 = 64,
+       .bNumConfigurations = 1,
+       .bRESERVED = 0,
+};
+
 /*
  * Configuration descriptor: same comments as above
  * regarding handling USB1 mode.
@@ -271,9 +283,11 @@ static int ast_vhub_rep_desc(struct ast_vhub_ep *ep,
                BUILD_BUG_ON(dsize > sizeof(vhub->vhub_dev_desc));
                BUILD_BUG_ON(USB_DT_DEVICE_SIZE >= AST_VHUB_EP0_MAX_PACKET);
                break;
+       case USB_DT_OTHER_SPEED_CONFIG:
        case USB_DT_CONFIG:
                dsize = AST_VHUB_CONF_DESC_SIZE;
                memcpy(ep->buf, &vhub->vhub_conf_desc, dsize);
+               ((u8 *)ep->buf)[1] = desc_type;
                BUILD_BUG_ON(dsize > sizeof(vhub->vhub_conf_desc));
                BUILD_BUG_ON(AST_VHUB_CONF_DESC_SIZE >= AST_VHUB_EP0_MAX_PACKET);
                break;
@@ -283,6 +297,10 @@ static int ast_vhub_rep_desc(struct ast_vhub_ep *ep,
                BUILD_BUG_ON(dsize > sizeof(vhub->vhub_hub_desc));
                BUILD_BUG_ON(AST_VHUB_HUB_DESC_SIZE >= AST_VHUB_EP0_MAX_PACKET);
                break;
+       case USB_DT_DEVICE_QUALIFIER:
+               dsize = sizeof(vhub->vhub_qual_desc);
+               memcpy(ep->buf, &vhub->vhub_qual_desc, dsize);
+               break;
        default:
                return std_req_stall;
        }
@@ -428,6 +446,8 @@ enum std_req_rc ast_vhub_std_hub_request(struct ast_vhub_ep *ep,
                switch (wValue >> 8) {
                case USB_DT_DEVICE:
                case USB_DT_CONFIG:
+               case USB_DT_DEVICE_QUALIFIER:
+               case USB_DT_OTHER_SPEED_CONFIG:
                        return ast_vhub_rep_desc(ep, wValue >> 8,
                                                 wLength);
                case USB_DT_STRING:
@@ -1033,6 +1053,10 @@ static int ast_vhub_init_desc(struct ast_vhub *vhub)
        else
                ret = ast_vhub_str_alloc_add(vhub, &ast_vhub_strings);
 
+       /* Initialize vhub Qualifier Descriptor. */
+       memcpy(&vhub->vhub_qual_desc, &ast_vhub_qual_desc,
+               sizeof(vhub->vhub_qual_desc));
+
        return ret;
 }
 
index 87a5dea..6b9dfa6 100644 (file)
@@ -425,6 +425,7 @@ struct ast_vhub {
        struct ast_vhub_full_cdesc      vhub_conf_desc;
        struct usb_hub_descriptor       vhub_hub_desc;
        struct list_head                vhub_str_desc;
+       struct usb_qualifier_descriptor vhub_qual_desc;
 };
 
 /* Standard request handlers result codes */