Message ID | 20211208100545.1441397-2-neal_liu@aspeedtech.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Refactor Aspeed USB vhub driver | expand |
On Wed, 2021-12-08 at 18:05 +0800, Neal Liu wrote: > 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> > --- Acked-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> > drivers/usb/gadget/udc/aspeed-vhub/hub.c | 24 > +++++++++++++++++++++++ > drivers/usb/gadget/udc/aspeed-vhub/vhub.h | 1 + > 2 files changed, 25 insertions(+) > > diff --git a/drivers/usb/gadget/udc/aspeed-vhub/hub.c > b/drivers/usb/gadget/udc/aspeed-vhub/hub.c > index b9960fdd8a51..93f27a745760 100644 > --- a/drivers/usb/gadget/udc/aspeed-vhub/hub.c > +++ b/drivers/usb/gadget/udc/aspeed-vhub/hub.c > @@ -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; > } > > diff --git a/drivers/usb/gadget/udc/aspeed-vhub/vhub.h > b/drivers/usb/gadget/udc/aspeed-vhub/vhub.h > index 87a5dea12d3c..6b9dfa6e10eb 100644 > --- a/drivers/usb/gadget/udc/aspeed-vhub/vhub.h > +++ b/drivers/usb/gadget/udc/aspeed-vhub/vhub.h > @@ -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 */
diff --git a/drivers/usb/gadget/udc/aspeed-vhub/hub.c b/drivers/usb/gadget/udc/aspeed-vhub/hub.c index b9960fdd8a51..93f27a745760 100644 --- a/drivers/usb/gadget/udc/aspeed-vhub/hub.c +++ b/drivers/usb/gadget/udc/aspeed-vhub/hub.c @@ -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; } diff --git a/drivers/usb/gadget/udc/aspeed-vhub/vhub.h b/drivers/usb/gadget/udc/aspeed-vhub/vhub.h index 87a5dea12d3c..6b9dfa6e10eb 100644 --- a/drivers/usb/gadget/udc/aspeed-vhub/vhub.h +++ b/drivers/usb/gadget/udc/aspeed-vhub/vhub.h @@ -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 */
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> --- drivers/usb/gadget/udc/aspeed-vhub/hub.c | 24 +++++++++++++++++++++++ drivers/usb/gadget/udc/aspeed-vhub/vhub.h | 1 + 2 files changed, 25 insertions(+)