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: Sarah Sharp <sarah.a.sharp@linux.intel.com>
This commit is contained in:
Родитель
d673bfcbff
Коммит
83de4b2b90
|
@ -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)
|
||||||
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,
|
||||||
#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,
|
||||||
}
|
}
|
||||||
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 {
|
||||||
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 */
|
||||||
|
|
Загрузка…
Ссылка в новой задаче