]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
usb: usbtest: support superspeed device capbility descriptor test
authorHuang Rui <ray.huang@amd.com>
Wed, 30 Oct 2013 03:27:39 +0000 (11:27 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 30 Oct 2013 16:57:21 +0000 (09:57 -0700)
In Test 9 of usbtest module, it is used for performing chapter 9 tests N
times.

SuperSpeed USB Device Capability descriptor is one of the generic
device-level capbility descriptors which added in section 9.6.2.2 of USB
3.0 spec.

This patch adds to support getting SuperSpeed USB Device Capability
descriptor test scenario for USB 3.0.

Signed-off-by: Huang Rui <ray.huang@amd.com>
Acked-by: Alan Stern <stern@rowland.harvard.edu>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/misc/usbtest.c

index 1c78e747f72b3ce63b99dabc1ccd7a2e3af5cf1b..d6fcbc477fc529761da454e33ee4b3c9173cdac0 100644 (file)
@@ -628,6 +628,35 @@ static int is_good_ext(struct usbtest_dev *tdev, u8 *buf)
        return 1;
 }
 
+static int is_good_ss_cap(struct usbtest_dev *tdev, u8 *buf)
+{
+       struct usb_ss_cap_descriptor *ss;
+
+       ss = (struct usb_ss_cap_descriptor *) buf;
+
+       if (ss->bLength != USB_DT_USB_SS_CAP_SIZE) {
+               ERROR(tdev, "bogus superspeed device capability descriptor length\n");
+               return 0;
+       }
+
+       /*
+        * only bit[1] of bmAttributes is used for LTM and others are
+        * reserved
+        */
+       if (ss->bmAttributes & ~0x02) { /* reserved == 0 */
+               ERROR(tdev, "reserved bits set in bmAttributes\n");
+               return 0;
+       }
+
+       /* bits[0:3] of wSpeedSupported is used and others are reserved */
+       if (le16_to_cpu(ss->wSpeedSupported) & ~0x0f) { /* reserved == 0 */
+               ERROR(tdev, "reserved bits set in wSpeedSupported\n");
+               return 0;
+       }
+
+       return 1;
+}
+
 /* sanity test for standard requests working with usb_control_mesg() and some
  * of the utility functions which use it.
  *
@@ -773,6 +802,14 @@ static int ch9_postconfig(struct usbtest_dev *dev)
                                        return -EDOM;
                                }
                                break;
+                       case USB_SS_CAP_TYPE:
+                               if (buf + USB_DT_USB_SS_CAP_SIZE >
+                                               dev->buf + total ||
+                                               !is_good_ss_cap(dev, buf)) {
+                                       dev_err(&iface->dev, "bogus superspeed device capability descriptor\n");
+                                       return -EDOM;
+                               }
+                               break;
                        default:
                                break;
                        }