Allow the USB HCD to create Wireless USB root hubs
authorThomas Pugliese <thomas.pugliese@gmail.com>
Fri, 31 May 2013 19:16:13 +0000 (14:16 -0500)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 3 Jun 2013 17:52:40 +0000 (10:52 -0700)
This patch adds Wireless USB root hub support to the USB HCD.  It allows
the HWA to create its root hub which previously failed because the HCD
treated wireless root hubs the same as USB2 high speed hubs.  The creation
of the root hub would fail in that case due to lack of TTs which wireless
root hubs do not support.

Signed-off-by: Thomas Pugliese <thomas.pugliese@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/core/hcd.c
drivers/usb/host/hwa-hc.c
include/linux/usb/hcd.h

index d53547d..014dc99 100644 (file)
@@ -149,6 +149,27 @@ static const u8 usb3_rh_dev_descriptor[18] = {
        0x01        /*  __u8  bNumConfigurations; */
 };
 
+/* usb 2.5 (wireless USB 1.0) root hub device descriptor */
+static const u8 usb25_rh_dev_descriptor[18] = {
+       0x12,       /*  __u8  bLength; */
+       0x01,       /*  __u8  bDescriptorType; Device */
+       0x50, 0x02, /*  __le16 bcdUSB; v2.5 */
+
+       0x09,       /*  __u8  bDeviceClass; HUB_CLASSCODE */
+       0x00,       /*  __u8  bDeviceSubClass; */
+       0x00,       /*  __u8  bDeviceProtocol; [ usb 2.0 no TT ] */
+       0xFF,       /*  __u8  bMaxPacketSize0; always 0xFF (WUSB Spec 7.4.1). */
+
+       0x6b, 0x1d, /*  __le16 idVendor; Linux Foundation 0x1d6b */
+       0x02, 0x00, /*  __le16 idProduct; device 0x0002 */
+       KERNEL_VER, KERNEL_REL, /*  __le16 bcdDevice */
+
+       0x03,       /*  __u8  iManufacturer; */
+       0x02,       /*  __u8  iProduct; */
+       0x01,       /*  __u8  iSerialNumber; */
+       0x01        /*  __u8  bNumConfigurations; */
+};
+
 /* usb 2.0 root hub device descriptor */
 static const u8 usb2_rh_dev_descriptor [18] = {
        0x12,       /*  __u8  bLength; */
@@ -527,6 +548,9 @@ static int rh_call_control (struct usb_hcd *hcd, struct urb *urb)
                        case HCD_USB3:
                                bufp = usb3_rh_dev_descriptor;
                                break;
+                       case HCD_USB25:
+                               bufp = usb25_rh_dev_descriptor;
+                               break;
                        case HCD_USB2:
                                bufp = usb2_rh_dev_descriptor;
                                break;
@@ -546,6 +570,7 @@ static int rh_call_control (struct usb_hcd *hcd, struct urb *urb)
                                bufp = ss_rh_config_descriptor;
                                len = sizeof ss_rh_config_descriptor;
                                break;
+                       case HCD_USB25:
                        case HCD_USB2:
                                bufp = hs_rh_config_descriptor;
                                len = sizeof hs_rh_config_descriptor;
@@ -2511,6 +2536,9 @@ int usb_add_hcd(struct usb_hcd *hcd,
        case HCD_USB2:
                rhdev->speed = USB_SPEED_HIGH;
                break;
+       case HCD_USB25:
+               rhdev->speed = USB_SPEED_WIRELESS;
+               break;
        case HCD_USB3:
                rhdev->speed = USB_SPEED_SUPER;
                break;
index 104730d..1452dd5 100644 (file)
@@ -577,7 +577,7 @@ static struct hc_driver hwahc_hc_driver = {
        .product_desc = "Wireless USB HWA host controller",
        .hcd_priv_size = sizeof(struct hwahc) - sizeof(struct usb_hcd),
        .irq = NULL,                    /* FIXME */
-       .flags = HCD_USB2,              /* FIXME */
+       .flags = HCD_USB25,
        .reset = hwahc_op_reset,
        .start = hwahc_op_start,
        .stop = hwahc_op_stop,
index f5f5c7d..1e88377 100644 (file)
@@ -218,6 +218,7 @@ struct hc_driver {
 #define        HCD_SHARED      0x0004          /* Two (or more) usb_hcds share HW */
 #define        HCD_USB11       0x0010          /* USB 1.1 */
 #define        HCD_USB2        0x0020          /* USB 2.0 */
+#define        HCD_USB25       0x0030          /* Wireless USB 1.0 (USB 2.5)*/
 #define        HCD_USB3        0x0040          /* USB 3.0 */
 #define        HCD_MASK        0x0070