[PATCH 1/1] usb,uhci: add a new tag for virtual uhci devices

From: Li, Zhen-Hua
Date: Wed Jun 26 2013 - 02:31:14 EST


From: "Li, Zhen-Hua" <zhen-hual@xxxxxx>

There's another patch trying to fix this warning:
"Controller not stopped yet!".
It is : 997ff893603c6455da4c5e26ba1d0f81adfecdfc .

I don't think it is appropriate to avoid auto-stop for all HP uhci
devices. So add one tag for the virtual uhci devices, it is used
to replace "wait_for_hp" in the auto-stop case.

Signed-off-by: Li, Zhen-Hua <zhen-hual@xxxxxx>
---
drivers/usb/host/uhci-hcd.h | 1 +
drivers/usb/host/uhci-hub.c | 2 +-
drivers/usb/host/uhci-pci.c | 21 +++++++++++++++++++++
3 files changed, 23 insertions(+), 1 deletion(-)

diff --git a/drivers/usb/host/uhci-hcd.h b/drivers/usb/host/uhci-hcd.h
index 6f986d8..915d5df 100644
--- a/drivers/usb/host/uhci-hcd.h
+++ b/drivers/usb/host/uhci-hcd.h
@@ -425,6 +425,7 @@ struct uhci_hcd {
/* Silicon quirks */
unsigned int oc_low:1; /* OverCurrent bit active low */
unsigned int wait_for_hp:1; /* Wait for HP port reset */
+ unsigned int virtual_device:1; /* For some virtual devices */
unsigned int big_endian_mmio:1; /* Big endian registers */
unsigned int big_endian_desc:1; /* Big endian descriptors */

diff --git a/drivers/usb/host/uhci-hub.c b/drivers/usb/host/uhci-hub.c
index 9189bc9..da00754 100644
--- a/drivers/usb/host/uhci-hub.c
+++ b/drivers/usb/host/uhci-hub.c
@@ -226,7 +226,7 @@ static int uhci_hub_status_data(struct usb_hcd *hcd, char *buf)
if (any_ports_active(uhci))
uhci->rh_state = UHCI_RH_RUNNING;
else if (time_after_eq(jiffies, uhci->auto_stop_time) &&
- !uhci->wait_for_hp)
+ !uhci->virtual_device)
suspend_rh(uhci, UHCI_RH_AUTO_STOPPED);
break;

diff --git a/drivers/usb/host/uhci-pci.c b/drivers/usb/host/uhci-pci.c
index c300bd2f7..68e6d92 100644
--- a/drivers/usb/host/uhci-pci.c
+++ b/drivers/usb/host/uhci-pci.c
@@ -110,6 +110,24 @@ static int uhci_pci_global_suspend_mode_is_broken(struct uhci_hcd *uhci)
return 0;
}

+static int uhci_virtual_device_ids[][2] = {
+ {0x103c, 0x3300},
+ {0, 0},
+};
+static int uhci_is_virtual_device(struct uhci_hcd *uhci)
+{
+ int i;
+ struct pci_dev *dev;
+
+ dev = to_pci_dev(uhci_dev(uhci));
+ for (i = 0; uhci_virtual_device_ids[i][0] != 0; i++) {
+ if (dev->vendor == uhci_virtual_device_ids[i][0]
+ && dev->device == uhci_virtual_device_ids[i][1])
+ return 1;
+ }
+ return 0;
+}
+
static int uhci_pci_init(struct usb_hcd *hcd)
{
struct uhci_hcd *uhci = hcd_to_uhci(hcd);
@@ -129,6 +147,9 @@ static int uhci_pci_init(struct usb_hcd *hcd)
if (to_pci_dev(uhci_dev(uhci))->vendor == PCI_VENDOR_ID_HP)
uhci->wait_for_hp = 1;

+ if (uhci_is_virtual_device(uhci))
+ uhci->virtual_device = 1;
+
/* Set up pointers to PCI-specific functions */
uhci->reset_hc = uhci_pci_reset_hc;
uhci->check_and_reset_hc = uhci_pci_check_and_reset_hc;
--
1.7.10.4

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/