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.huang@xxxxxxx> > > Acked-by: Alan Stern <stern@xxxxxxxxxxxxxxxxxxx> > > --- > > 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 majordomo@xxxxxxxxxxxxxxx > 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 majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html