On Tue, Nov 12, 2013 at 09:59:13AM -0800, Sarah Sharp wrote:
> On Wed, Oct 30, 2013 at 11:27:38AM +0800, Huang Rui wrote:
> > In Test 9 of usbtest module, it is used for performing chapter 9 tests N
> > times.
> > 
> > USB2.0 Extension descriptor is one of the generic device-level capbility
> > descriptors which added in section 9.6.2.1 of USB 3.0 spec.
> > 
> > This patch adds to support getting usb2.0 extension descriptor test
> > scenario for USB 3.0.
> 
> I accidentally replied to the last patch revision, but my comments are
> still true for this revision.  You need to:
>  - Also check USB 2.1 devices for the USB 2.0 extension BOS descriptor
>  - Change the bit mask check on bmAttributes to be 0xFFFE rather than
>    0x1e.

Since it looks like Greg already has this patch in usb-next, can you
send a bug fix patch to fix the bit mask?

Thanks,
Sarah Sharp

> > Signed-off-by: Huang Rui <ray.hu...@amd.com>
> > Acked-by: Alan Stern <st...@rowland.harvard.edu>
> > ---
> >  drivers/usb/misc/usbtest.c | 77 
> > ++++++++++++++++++++++++++++++++++++++++++++++
> >  1 file changed, 77 insertions(+)
> > 
> > diff --git a/drivers/usb/misc/usbtest.c b/drivers/usb/misc/usbtest.c
> > index 38ebe1d..84d491d 100644
> > --- a/drivers/usb/misc/usbtest.c
> > +++ b/drivers/usb/misc/usbtest.c
> > @@ -606,6 +606,28 @@ static int is_good_config(struct usbtest_dev *tdev, 
> > int len)
> >     return 0;
> >  }
> >  
> > +static int is_good_ext(struct usbtest_dev *tdev, u8 *buf)
> > +{
> > +   struct usb_ext_cap_descriptor *ext;
> > +   u32 attr;
> > +
> > +   ext = (struct usb_ext_cap_descriptor *) buf;
> > +
> > +   if (ext->bLength != USB_DT_USB_EXT_CAP_SIZE) {
> > +           ERROR(tdev, "bogus usb 2.0 extension descriptor length\n");
> > +           return 0;
> > +   }
> > +
> > +   attr = le32_to_cpu(ext->bmAttributes);
> > +   /* bits[1:4] is used and others are reserved */
> > +   if (attr & ~0x1e) {     /* reserved == 0 */
> > +           ERROR(tdev, "reserved bits set\n");
> > +           return 0;
> > +   }
> > +
> > +   return 1;
> > +}
> > +
> >  /* sanity test for standard requests working with usb_control_mesg() and 
> > some
> >   * of the utility functions which use it.
> >   *
> > @@ -694,12 +716,67 @@ static int ch9_postconfig(struct usbtest_dev *dev)
> >      * 3.0 spec
> >      */
> >     if (le16_to_cpu(udev->descriptor.bcdUSB) >= 0x0300) {
> > +           struct usb_bos_descriptor *bos = NULL;
> > +           struct usb_dev_cap_header *header = NULL;
> > +           unsigned total, num, length;
> > +           u8 *buf;
> > +
> >             retval = usb_get_descriptor(udev, USB_DT_BOS, 0, dev->buf,
> >                             sizeof(*udev->bos->desc));
> >             if (retval != sizeof(*udev->bos->desc)) {
> >                     dev_err(&iface->dev, "bos descriptor --> %d\n", retval);
> >                     return (retval < 0) ? retval : -EDOM;
> >             }
> > +
> > +           bos = (struct usb_bos_descriptor *)dev->buf;
> > +           total = le16_to_cpu(bos->wTotalLength);
> > +           num = bos->bNumDeviceCaps;
> > +
> > +           if (total > TBUF_SIZE)
> > +                   total = TBUF_SIZE;
> > +
> > +           /*
> > +            * get generic device-level capability descriptors [9.6.2]
> > +            * in USB 3.0 spec
> > +            */
> > +           retval = usb_get_descriptor(udev, USB_DT_BOS, 0, dev->buf,
> > +                           total);
> > +           if (retval != total) {
> > +                   dev_err(&iface->dev, "bos descriptor set --> %d\n",
> > +                                   retval);
> > +                   return (retval < 0) ? retval : -EDOM;
> > +           }
> > +
> > +           length = sizeof(*udev->bos->desc);
> > +           buf = dev->buf;
> > +           for (i = 0; i < num; i++) {
> > +                   buf += length;
> > +                   if (buf + sizeof(struct usb_dev_cap_header) >
> > +                                   dev->buf + total)
> > +                           break;
> > +
> > +                   header = (struct usb_dev_cap_header *)buf;
> > +                   length = header->bLength;
> > +
> > +                   if (header->bDescriptorType !=
> > +                                   USB_DT_DEVICE_CAPABILITY) {
> > +                           dev_warn(&udev->dev, "not device capability 
> > descriptor, skip\n");
> > +                           continue;
> > +                   }
> > +
> > +                   switch (header->bDevCapabilityType) {
> > +                   case USB_CAP_TYPE_EXT:
> > +                           if (buf + USB_DT_USB_EXT_CAP_SIZE >
> > +                                           dev->buf + total ||
> > +                                           !is_good_ext(dev, buf)) {
> > +                                   dev_err(&iface->dev, "bogus usb 2.0 
> > extension descriptor\n");
> > +                                   return -EDOM;
> > +                           }
> > +                           break;
> > +                   default:
> > +                           break;
> > +                   }
> > +           }
> >     }
> >  
> >     /* there's always [9.4.3] at least one config descriptor [9.6.3] */
> > -- 
> > 1.7.11.7
> > 
> > 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-usb" in
> the body of a message to majord...@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to