LKML Archive on lore.kernel.org
help / color / mirror / Atom feed
* [PATCH] EHCI: turn off remote wakeup during shutdown
@ 2007-02-13 19:53 Alan Stern
  0 siblings, 0 replies; only message in thread
From: Alan Stern @ 2007-02-13 19:53 UTC (permalink / raw)
  To: stable; +Cc: Kernel development list

This patch (as850b) disables remote wakeup (and everything else!) on
all EHCI ports when the shutdown() method is called.  If remote wakeup
is left active then some systems will reboot instead of powering off.
This fixes Bugzilla #7828.

Signed-off-by: Alan Stern <stern@rowland.harvard.edu>

---

I'm submitting this for 2.6.20.stable.  The problem it addresses can occur
with earlier kernels, but not unless the user explicitly enables remote
wakeup by doing a runtime suspend of the EHCI root hub.  In 2.6.20 the
root hub will autosuspend itself, enabling remote wakeup and thus
triggering the problem.

A slightly different version of this patch will be submitted separately
for Greg KH's USB development tree.

Alan Stern


Index: 2.6.20/drivers/usb/host/ehci-hcd.c
===================================================================
--- 2.6.20.orig/drivers/usb/host/ehci-hcd.c
+++ 2.6.20/drivers/usb/host/ehci-hcd.c
@@ -296,6 +296,18 @@ static void ehci_watchdog (unsigned long
 	spin_unlock_irqrestore (&ehci->lock, flags);
 }
 
+/* On some systems, leaving remote wakeup enabled prevents system shutdown.
+ * The firmware seems to think that powering off is a wakeup event!
+ * This routine turns off remote wakeup and everything else, on all ports.
+ */
+static void ehci_turn_off_all_ports(struct ehci_hcd *ehci)
+{
+	int	port = HCS_N_PORTS(ehci->hcs_params);
+
+	while (port--)
+		writel(PORT_RWC_BITS, &ehci->regs->port_status[port]);
+}
+
 /* ehci_shutdown kick in for silicon on any bus (not just pci, etc).
  * This forcibly disables dma and IRQs, helping kexec and other cases
  * where the next system software may expect clean state.
@@ -307,9 +319,13 @@ ehci_shutdown (struct usb_hcd *hcd)
 
 	ehci = hcd_to_ehci (hcd);
 	(void) ehci_halt (ehci);
+	ehci_turn_off_all_ports(ehci);
 
 	/* make BIOS/etc use companion controller during reboot */
 	writel (0, &ehci->regs->configured_flag);
+
+	/* unblock posted writes */
+	readl(&ehci->regs->configured_flag);
 }
 
 static void ehci_port_power (struct ehci_hcd *ehci, int is_on)


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2007-02-13 19:53 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2007-02-13 19:53 [PATCH] EHCI: turn off remote wakeup during shutdown Alan Stern

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).