Commit 403dbd36 authored by Alek Du's avatar Alek Du Committed by Greg Kroah-Hartman

USB: EHCI: add need_io_watchdog flag to ehci_hcd

Basically the io watchdog is only useful for those quirk HCDs. For most
good ones, it only brings unnecessary wakeups.  At least, I know the
Intel EHCI HCDs should turn off the flag.
Signed-off-by: default avatarAlek Du <alek.du@intel.com>
Cc: David Brownell <dbrownell@users.sourceforge.net>
Cc: Alan Stern <stern@rowland.harvard.edu>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 4d155eb5
...@@ -127,6 +127,8 @@ timer_action(struct ehci_hcd *ehci, enum ehci_timer_action action) ...@@ -127,6 +127,8 @@ timer_action(struct ehci_hcd *ehci, enum ehci_timer_action action)
switch (action) { switch (action) {
case TIMER_IO_WATCHDOG: case TIMER_IO_WATCHDOG:
if (!ehci->need_io_watchdog)
return;
t = EHCI_IO_JIFFIES; t = EHCI_IO_JIFFIES;
break; break;
case TIMER_ASYNC_OFF: case TIMER_ASYNC_OFF:
...@@ -508,6 +510,10 @@ static int ehci_init(struct usb_hcd *hcd) ...@@ -508,6 +510,10 @@ static int ehci_init(struct usb_hcd *hcd)
spin_lock_init(&ehci->lock); spin_lock_init(&ehci->lock);
/*
* keep io watchdog by default, those good HCDs could turn off it later
*/
ehci->need_io_watchdog = 1;
init_timer(&ehci->watchdog); init_timer(&ehci->watchdog);
ehci->watchdog.function = ehci_watchdog; ehci->watchdog.function = ehci_watchdog;
ehci->watchdog.data = (unsigned long) ehci; ehci->watchdog.data = (unsigned long) ehci;
......
...@@ -129,6 +129,9 @@ static int ehci_pci_setup(struct usb_hcd *hcd) ...@@ -129,6 +129,9 @@ static int ehci_pci_setup(struct usb_hcd *hcd)
return retval; return retval;
switch (pdev->vendor) { switch (pdev->vendor) {
case PCI_VENDOR_ID_INTEL:
ehci->need_io_watchdog = 0;
break;
case PCI_VENDOR_ID_TDI: case PCI_VENDOR_ID_TDI:
if (pdev->device == PCI_DEVICE_ID_TDI_EHCI) { if (pdev->device == PCI_DEVICE_ID_TDI_EHCI) {
hcd->has_tt = 1; hcd->has_tt = 1;
......
...@@ -126,6 +126,7 @@ struct ehci_hcd { /* one per controller */ ...@@ -126,6 +126,7 @@ struct ehci_hcd { /* one per controller */
unsigned big_endian_mmio:1; unsigned big_endian_mmio:1;
unsigned big_endian_desc:1; unsigned big_endian_desc:1;
unsigned has_amcc_usb23:1; unsigned has_amcc_usb23:1;
unsigned need_io_watchdog:1;
/* required for usb32 quirk */ /* required for usb32 quirk */
#define OHCI_CTRL_HCFS (3 << 6) #define OHCI_CTRL_HCFS (3 << 6)
......
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