[RFC 09/22] usb: Store bus type in usb_hcd, not in driver flags.

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Sarah Sharp
Date: Thursday, December 30, 2010 - 4:23 pm

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: Sarah Sharp <sarah.a.sharp@linux.intel.com>
---
 drivers/usb/core/hcd.c  |    7 ++++---
 include/linux/usb/hcd.h |    3 +++
 2 files changed, 7 insertions(+), 3 deletions(-)

diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
index 47fb05f..79bad2c 100644
--- a/drivers/usb/core/hcd.c
+++ b/drivers/usb/core/hcd.c
@@ -507,7 +507,7 @@ static int rh_call_control (struct usb_hcd *hcd, struct urb *urb)
 	case DeviceRequest | USB_REQ_GET_DESCRIPTOR:
 		switch (wValue & 0xff00) {
 		case USB_DT_DEVICE << 8:
-			switch (hcd->driver->flags & HCD_MASK) {
+			switch (hcd->bcdUSB) {
 			case HCD_USB3:
 				bufp = usb3_rh_dev_descriptor;
 				break;
@@ -525,7 +525,7 @@ static int rh_call_control (struct usb_hcd *hcd, struct urb *urb)
 				patch_protocol = 1;
 			break;
 		case USB_DT_CONFIG << 8:
-			switch (hcd->driver->flags & HCD_MASK) {
+			switch (hcd->bcdUSB) {
 			case HCD_USB3:
 				bufp = ss_rh_config_descriptor;
 				len = sizeof ss_rh_config_descriptor;
@@ -2179,6 +2179,7 @@ struct usb_hcd *usb_create_hcd (const struct hc_driver *driver,
 #endif
 
 	hcd->driver = driver;
+	hcd->bcdUSB = driver->flags & HCD_MASK;
 	hcd->product_desc = (driver->product_desc) ? driver->product_desc :
 			"USB Host Controller";
 	return hcd;
@@ -2288,7 +2289,7 @@ int usb_add_hcd(struct usb_hcd *hcd,
 	}
 	hcd->self.root_hub = rhdev;
 
-	switch (hcd->driver->flags & HCD_MASK) {
+	switch (hcd->bcdUSB) {
 	case HCD_USB11:
 		rhdev->speed = USB_SPEED_FULL;
 		break;
diff --git a/include/linux/usb/hcd.h b/include/linux/usb/hcd.h
index b6e6e30..ac2dc66 100644
--- a/include/linux/usb/hcd.h
+++ b/include/linux/usb/hcd.h
@@ -76,6 +76,9 @@ struct usb_hcd {
 	struct kref		kref;		/* reference counter */
 
 	const char		*product_desc;	/* product/vendor string */
+	int			bcdUSB;		/* May be different from
+						 * hcd->driver->flags & HCD_MASK
+						 */
 	char			irq_descr[24];	/* driver + bus # */
 
 	struct timer_list	rh_timer;	/* drives root-hub polling */
-- 
1.6.3.3

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
[RFC 05/22] xhci: Change hcd_priv into a pointer., Sarah Sharp, (Thu Dec 30, 4:23 pm)
[RFC 09/22] usb: Store bus type in usb_hcd, not in driver ..., Sarah Sharp, (Thu Dec 30, 4:23 pm)
[RFC 15/22] xhci: Register second xHCI roothub., Sarah Sharp, (Thu Dec 30, 4:24 pm)
Re: [RFC 22/22] usb: Disable auto-suspend for USB 3.0 hubs., Sergei Shtylyov, (Fri Dec 31, 9:39 am)