From: Andrew Morton It makes Rafael's machine lock up on resume. Cc: "Rafael J. Wysocki" Cc: David Brownell Cc: Greg KH Signed-off-by: Andrew Morton --- drivers/usb/host/ohci-at91.c | 2 - drivers/usb/host/ohci-au1xxx.c | 1 drivers/usb/host/ohci-hcd.c | 23 +++++---------- drivers/usb/host/ohci-hub.c | 45 +++++++++--------------------- drivers/usb/host/ohci-lh7a404.c | 1 drivers/usb/host/ohci-omap.c | 1 drivers/usb/host/ohci-pci.c | 1 drivers/usb/host/ohci-ppc-soc.c | 1 drivers/usb/host/ohci-pxa27x.c | 1 drivers/usb/host/ohci-s3c2410.c | 1 drivers/usb/host/ohci-sa1111.c | 1 drivers/usb/host/ohci.h | 2 - 12 files changed, 24 insertions(+), 56 deletions(-) diff -puN drivers/usb/host/ohci-at91.c~revert-gregkh-usb-usb-ohci-avoids-root-hub-timer-polling drivers/usb/host/ohci-at91.c --- devel/drivers/usb/host/ohci-at91.c~revert-gregkh-usb-usb-ohci-avoids-root-hub-timer-polling 2006-05-21 05:30:58.000000000 -0700 +++ devel-akpm/drivers/usb/host/ohci-at91.c 2006-05-21 05:30:58.000000000 -0700 @@ -230,7 +230,7 @@ static const struct hc_driver ohci_at91_ */ .hub_status_data = ohci_hub_status_data, .hub_control = ohci_hub_control, - .hub_irq_enable = ohci_rhsc_enable, + #ifdef CONFIG_PM .bus_suspend = ohci_bus_suspend, .bus_resume = ohci_bus_resume, diff -puN drivers/usb/host/ohci-au1xxx.c~revert-gregkh-usb-usb-ohci-avoids-root-hub-timer-polling drivers/usb/host/ohci-au1xxx.c --- devel/drivers/usb/host/ohci-au1xxx.c~revert-gregkh-usb-usb-ohci-avoids-root-hub-timer-polling 2006-05-21 05:30:58.000000000 -0700 +++ devel-akpm/drivers/usb/host/ohci-au1xxx.c 2006-05-21 05:30:58.000000000 -0700 @@ -289,7 +289,6 @@ static const struct hc_driver ohci_au1xx */ .hub_status_data = ohci_hub_status_data, .hub_control = ohci_hub_control, - .hub_irq_enable = ohci_rhsc_enable, #ifdef CONFIG_PM .bus_suspend = ohci_bus_suspend, .bus_resume = ohci_bus_resume, diff -puN drivers/usb/host/ohci.h~revert-gregkh-usb-usb-ohci-avoids-root-hub-timer-polling drivers/usb/host/ohci.h --- devel/drivers/usb/host/ohci.h~revert-gregkh-usb-usb-ohci-avoids-root-hub-timer-polling 2006-05-21 05:30:58.000000000 -0700 +++ devel-akpm/drivers/usb/host/ohci.h 2006-05-21 05:30:58.000000000 -0700 @@ -385,7 +385,7 @@ struct ohci_hcd { */ int num_ports; int load [NUM_INTS]; - u32 hc_control; /* copy of hc control reg */ + u32 hc_control; /* copy of hc control reg */ unsigned long next_statechange; /* suspend/resume */ u32 fminterval; /* saved register */ diff -puN drivers/usb/host/ohci-hcd.c~revert-gregkh-usb-usb-ohci-avoids-root-hub-timer-polling drivers/usb/host/ohci-hcd.c --- devel/drivers/usb/host/ohci-hcd.c~revert-gregkh-usb-usb-ohci-avoids-root-hub-timer-polling 2006-05-21 05:30:58.000000000 -0700 +++ devel-akpm/drivers/usb/host/ohci-hcd.c 2006-05-21 05:30:58.000000000 -0700 @@ -102,7 +102,7 @@ #include "../core/hcd.h" -#define DRIVER_VERSION "2006 May 12" +#define DRIVER_VERSION "2005 April 22" #define DRIVER_AUTHOR "Roman Weissgaerber, David Brownell" #define DRIVER_DESC "USB 1.1 'Open' Host Controller (OHCI) Driver" @@ -111,7 +111,7 @@ #undef OHCI_VERBOSE_DEBUG /* not always helpful */ /* For initializing controller (mask in an HCFS mode too) */ -#define OHCI_CONTROL_INIT OHCI_CTRL_CBSR +#define OHCI_CONTROL_INIT OHCI_CTRL_CBSR #define OHCI_INTR_INIT \ (OHCI_INTR_MIE | OHCI_INTR_UE | OHCI_INTR_RD | OHCI_INTR_WDH) @@ -447,7 +447,7 @@ static int ohci_init (struct ohci_hcd *o disable (ohci); ohci->regs = hcd->regs; - ohci->next_statechange = jiffies + msecs_to_jiffies (250); + ohci->next_statechange = jiffies; /* REVISIT this BIOS handshake is now moved into PCI "quirks", and * was never needed for most non-PCI systems ... remove the code? @@ -637,12 +637,11 @@ retry: ohci_readl (ohci, &ohci->regs->periodicstart)); return -EOVERFLOW; } - hcd->uses_new_polling = 1; - /* start controller operations */ + /* start controller operations */ ohci->hc_control &= OHCI_CTRL_RWC; - ohci->hc_control |= OHCI_CONTROL_INIT | OHCI_USB_OPER; - ohci_writel (ohci, ohci->hc_control, &ohci->regs->control); + ohci->hc_control |= OHCI_CONTROL_INIT | OHCI_USB_OPER; + ohci_writel (ohci, ohci->hc_control, &ohci->regs->control); hcd->state = HC_STATE_RUNNING; /* wake on ConnectStatusChange, matching external hubs */ @@ -650,7 +649,7 @@ retry: /* Choose the interrupts we care about now, others later on demand */ mask = OHCI_INTR_INIT; - ohci_writel (ohci, ~0, &ohci->regs->intrstatus); + ohci_writel (ohci, mask, &ohci->regs->intrstatus); ohci_writel (ohci, mask, &ohci->regs->intrenable); /* handle root hub init quirks ... */ @@ -711,13 +710,7 @@ static irqreturn_t ohci_irq (struct usb_ /* interrupt for some other device? */ } else if ((ints &= ohci_readl (ohci, ®s->intrenable)) == 0) { return IRQ_NOTMINE; - } - - if (ints & OHCI_INTR_RHSC) { - ohci_vdbg (ohci, "rhsc\n"); - ohci_writel (ohci, OHCI_INTR_RHSC, ®s->intrstatus); - usb_hcd_poll_rh_status(hcd); - } + } if (ints & OHCI_INTR_UE) { disable (ohci); diff -puN drivers/usb/host/ohci-hub.c~revert-gregkh-usb-usb-ohci-avoids-root-hub-timer-polling drivers/usb/host/ohci-hub.c --- devel/drivers/usb/host/ohci-hub.c~revert-gregkh-usb-usb-ohci-avoids-root-hub-timer-polling 2006-05-21 05:30:58.000000000 -0700 +++ devel-akpm/drivers/usb/host/ohci-hub.c 2006-05-21 05:30:58.000000000 -0700 @@ -36,14 +36,6 @@ /*-------------------------------------------------------------------------*/ -/* hcd->hub_irq_enable() ? */ -static void ohci_rhsc_enable (struct usb_hcd *hcd) -{ - struct ohci_hcd *ohci = hcd_to_ohci (hcd); - - ohci_writel (ohci, OHCI_INTR_RHSC, &ohci->regs->intrenable); -} - #ifdef CONFIG_PM #define OHCI_SCHED_ENABLES \ @@ -131,9 +123,6 @@ static int ohci_bus_suspend (struct usb_ /* no resumes until devices finish suspending */ ohci->next_statechange = jiffies + msecs_to_jiffies (5); - /* RHSC or RD irq will wakeup; no timer polling */ - hcd->poll_rh = 0; - done: /* external suspend vs self autosuspend ... same effect */ if (status == 0) @@ -360,41 +349,35 @@ ohci_hub_status_data (struct usb_hcd *hc continue; } - - /* can suspend if no ports are enabled; or if all the + /* can suspend if no ports are enabled; or if all all * enabled ports are suspended AND remote wakeup is on. */ if (!(status & RH_PS_CCS)) continue; - if (!(status & RH_PS_PSS)) - can_suspend = 0; + if ((status & RH_PS_PSS) && can_suspend) + continue; + can_suspend = 0; } - done: spin_unlock_irqrestore (&ohci->lock, flags); #ifdef CONFIG_PM - /* save power by suspending idle root hubs and avoiding timer polls; - * INTR_RD or INTR_RHSC wakes us when there's work, and polling is - * used only to defer autosuspend. + /* save power by suspending idle root hubs; + * INTR_RD wakes us when there's work */ if (can_suspend && !changed && !ohci->ed_rm_list && ((OHCI_CTRL_HCFS | OHCI_SCHED_ENABLES) & ohci->hc_control) - == OHCI_USB_OPER) { - /* if we can't yet autosuspend, poll until we can */ - if (time_after (jiffies, ohci->next_statechange) - && usb_trylock_device (hcd->self.root_hub) == 0 - ) { - ohci_vdbg (ohci, "autosuspend\n"); - (void) ohci_bus_suspend (hcd); - usb_unlock_device (hcd->self.root_hub); - } else - hcd->poll_rh = 1; - } else - hcd->poll_rh = 0; + == OHCI_USB_OPER + && time_after (jiffies, ohci->next_statechange) + && usb_trylock_device (hcd->self.root_hub) == 0 + ) { + ohci_vdbg (ohci, "autosuspend\n"); + (void) ohci_bus_suspend (hcd); + usb_unlock_device (hcd->self.root_hub); + } #endif return changed ? length : 0; diff -puN drivers/usb/host/ohci-lh7a404.c~revert-gregkh-usb-usb-ohci-avoids-root-hub-timer-polling drivers/usb/host/ohci-lh7a404.c --- devel/drivers/usb/host/ohci-lh7a404.c~revert-gregkh-usb-usb-ohci-avoids-root-hub-timer-polling 2006-05-21 05:30:58.000000000 -0700 +++ devel-akpm/drivers/usb/host/ohci-lh7a404.c 2006-05-21 05:30:58.000000000 -0700 @@ -196,7 +196,6 @@ static const struct hc_driver ohci_lh7a4 */ .hub_status_data = ohci_hub_status_data, .hub_control = ohci_hub_control, - .hub_irq_enable = ohci_rhsc_enable, #ifdef CONFIG_PM .bus_suspend = ohci_bus_suspend, .bus_resume = ohci_bus_resume, diff -puN drivers/usb/host/ohci-omap.c~revert-gregkh-usb-usb-ohci-avoids-root-hub-timer-polling drivers/usb/host/ohci-omap.c --- devel/drivers/usb/host/ohci-omap.c~revert-gregkh-usb-usb-ohci-avoids-root-hub-timer-polling 2006-05-21 05:30:58.000000000 -0700 +++ devel-akpm/drivers/usb/host/ohci-omap.c 2006-05-21 05:30:58.000000000 -0700 @@ -429,7 +429,6 @@ static const struct hc_driver ohci_omap_ */ .hub_status_data = ohci_hub_status_data, .hub_control = ohci_hub_control, - .hub_irq_enable = ohci_rhsc_enable, #ifdef CONFIG_PM .bus_suspend = ohci_bus_suspend, .bus_resume = ohci_bus_resume, diff -puN drivers/usb/host/ohci-pci.c~revert-gregkh-usb-usb-ohci-avoids-root-hub-timer-polling drivers/usb/host/ohci-pci.c --- devel/drivers/usb/host/ohci-pci.c~revert-gregkh-usb-usb-ohci-avoids-root-hub-timer-polling 2006-05-21 05:30:58.000000000 -0700 +++ devel-akpm/drivers/usb/host/ohci-pci.c 2006-05-21 05:30:58.000000000 -0700 @@ -194,7 +194,6 @@ static const struct hc_driver ohci_pci_h */ .hub_status_data = ohci_hub_status_data, .hub_control = ohci_hub_control, - .hub_irq_enable = ohci_rhsc_enable, #ifdef CONFIG_PM .bus_suspend = ohci_bus_suspend, .bus_resume = ohci_bus_resume, diff -puN drivers/usb/host/ohci-ppc-soc.c~revert-gregkh-usb-usb-ohci-avoids-root-hub-timer-polling drivers/usb/host/ohci-ppc-soc.c --- devel/drivers/usb/host/ohci-ppc-soc.c~revert-gregkh-usb-usb-ohci-avoids-root-hub-timer-polling 2006-05-21 05:30:58.000000000 -0700 +++ devel-akpm/drivers/usb/host/ohci-ppc-soc.c 2006-05-21 05:30:58.000000000 -0700 @@ -166,7 +166,6 @@ static const struct hc_driver ohci_ppc_s */ .hub_status_data = ohci_hub_status_data, .hub_control = ohci_hub_control, - .hub_irq_enable = ohci_rhsc_enable, #ifdef CONFIG_PM .bus_suspend = ohci_bus_suspend, .bus_resume = ohci_bus_resume, diff -puN drivers/usb/host/ohci-pxa27x.c~revert-gregkh-usb-usb-ohci-avoids-root-hub-timer-polling drivers/usb/host/ohci-pxa27x.c --- devel/drivers/usb/host/ohci-pxa27x.c~revert-gregkh-usb-usb-ohci-avoids-root-hub-timer-polling 2006-05-21 05:30:58.000000000 -0700 +++ devel-akpm/drivers/usb/host/ohci-pxa27x.c 2006-05-21 05:30:58.000000000 -0700 @@ -285,7 +285,6 @@ static const struct hc_driver ohci_pxa27 */ .hub_status_data = ohci_hub_status_data, .hub_control = ohci_hub_control, - .hub_irq_enable = ohci_rhsc_enable, #ifdef CONFIG_PM .bus_suspend = ohci_bus_suspend, .bus_resume = ohci_bus_resume, diff -puN drivers/usb/host/ohci-s3c2410.c~revert-gregkh-usb-usb-ohci-avoids-root-hub-timer-polling drivers/usb/host/ohci-s3c2410.c --- devel/drivers/usb/host/ohci-s3c2410.c~revert-gregkh-usb-usb-ohci-avoids-root-hub-timer-polling 2006-05-21 05:30:58.000000000 -0700 +++ devel-akpm/drivers/usb/host/ohci-s3c2410.c 2006-05-21 05:30:58.000000000 -0700 @@ -465,7 +465,6 @@ static const struct hc_driver ohci_s3c24 */ .hub_status_data = ohci_s3c2410_hub_status_data, .hub_control = ohci_s3c2410_hub_control, - .hub_irq_enable = ohci_rhsc_enable, #ifdef CONFIG_PM .bus_suspend = ohci_bus_suspend, .bus_resume = ohci_bus_resume, diff -puN drivers/usb/host/ohci-sa1111.c~revert-gregkh-usb-usb-ohci-avoids-root-hub-timer-polling drivers/usb/host/ohci-sa1111.c --- devel/drivers/usb/host/ohci-sa1111.c~revert-gregkh-usb-usb-ohci-avoids-root-hub-timer-polling 2006-05-21 05:30:58.000000000 -0700 +++ devel-akpm/drivers/usb/host/ohci-sa1111.c 2006-05-21 05:30:58.000000000 -0700 @@ -235,7 +235,6 @@ static const struct hc_driver ohci_sa111 */ .hub_status_data = ohci_hub_status_data, .hub_control = ohci_hub_control, - .hub_irq_enable = ohci_rhsc_enable, #ifdef CONFIG_PM .bus_suspend = ohci_bus_suspend, .bus_resume = ohci_bus_resume, _