Commit 83de4b2b authored by Sarah Sharp's avatar Sarah Sharp

usb: Store bus type in usb_hcd, not in driver flags.

The xHCI driver essentially has both a USB 2.0 and a USB 3.0 roothub.  So
setting the HCD_USB3 bits in the hcd->driver->flags is a bit misleading.
Add a new field to usb_hcd, bcdUSB.  Store the result of
hcd->driver->flags & HCD_MASK in it.  Later, when we have the xHCI driver
register the two roothubs, we'll set the usb_hcd->bcdUSB field to HCD_USB2
for the USB 2.0 roothub, and HCD_USB3 for the USB 3.0 roothub.
Signed-off-by: default avatarSarah Sharp <sarah.a.sharp@linux.intel.com>
parent d673bfcb
...@@ -507,7 +507,7 @@ static int rh_call_control (struct usb_hcd *hcd, struct urb *urb) ...@@ -507,7 +507,7 @@ static int rh_call_control (struct usb_hcd *hcd, struct urb *urb)
case DeviceRequest | USB_REQ_GET_DESCRIPTOR: case DeviceRequest | USB_REQ_GET_DESCRIPTOR:
switch (wValue & 0xff00) { switch (wValue & 0xff00) {
case USB_DT_DEVICE << 8: case USB_DT_DEVICE << 8:
switch (hcd->driver->flags & HCD_MASK) { switch (hcd->speed) {
case HCD_USB3: case HCD_USB3:
bufp = usb3_rh_dev_descriptor; bufp = usb3_rh_dev_descriptor;
break; break;
...@@ -525,7 +525,7 @@ static int rh_call_control (struct usb_hcd *hcd, struct urb *urb) ...@@ -525,7 +525,7 @@ static int rh_call_control (struct usb_hcd *hcd, struct urb *urb)
patch_protocol = 1; patch_protocol = 1;
break; break;
case USB_DT_CONFIG << 8: case USB_DT_CONFIG << 8:
switch (hcd->driver->flags & HCD_MASK) { switch (hcd->speed) {
case HCD_USB3: case HCD_USB3:
bufp = ss_rh_config_descriptor; bufp = ss_rh_config_descriptor;
len = sizeof ss_rh_config_descriptor; len = sizeof ss_rh_config_descriptor;
...@@ -2216,6 +2216,7 @@ struct usb_hcd *usb_create_hcd (const struct hc_driver *driver, ...@@ -2216,6 +2216,7 @@ struct usb_hcd *usb_create_hcd (const struct hc_driver *driver,
#endif #endif
hcd->driver = driver; hcd->driver = driver;
hcd->speed = driver->flags & HCD_MASK;
hcd->product_desc = (driver->product_desc) ? driver->product_desc : hcd->product_desc = (driver->product_desc) ? driver->product_desc :
"USB Host Controller"; "USB Host Controller";
return hcd; return hcd;
...@@ -2325,7 +2326,7 @@ int usb_add_hcd(struct usb_hcd *hcd, ...@@ -2325,7 +2326,7 @@ int usb_add_hcd(struct usb_hcd *hcd,
} }
hcd->self.root_hub = rhdev; hcd->self.root_hub = rhdev;
switch (hcd->driver->flags & HCD_MASK) { switch (hcd->speed) {
case HCD_USB11: case HCD_USB11:
rhdev->speed = USB_SPEED_FULL; rhdev->speed = USB_SPEED_FULL;
break; break;
......
...@@ -76,6 +76,10 @@ struct usb_hcd { ...@@ -76,6 +76,10 @@ struct usb_hcd {
struct kref kref; /* reference counter */ struct kref kref; /* reference counter */
const char *product_desc; /* product/vendor string */ const char *product_desc; /* product/vendor string */
int speed; /* Speed for this roothub.
* May be different from
* hcd->driver->flags & HCD_MASK
*/
char irq_descr[24]; /* driver + bus # */ char irq_descr[24]; /* driver + bus # */
struct timer_list rh_timer; /* drives root-hub polling */ struct timer_list rh_timer; /* drives root-hub polling */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment