mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Greg Kroah-Hartman <gregkh@suse.de>
To: Linus Torvalds <torvalds@osdl.org>, Andrew Morton <akpm@osdl.org>
Cc: linux-kernel@vger.kernel.org,
	linux-usb-devel@lists.sourceforge.net, david-b@pacbell.net
Subject: [patch 16/22] USB: EHCI updates
Date: Wed, 23 Nov 2005 15:45:28 -0800	[thread overview]
Message-ID: <20051123234528.GQ527@kroah.com> (raw)
In-Reply-To: <20051123234335.GA527@kroah.com>

[-- Attachment #1: usb-ehci-updates.patch --]
[-- Type: text/plain, Size: 6324 bytes --]

From: David Brownell <david-b@pacbell.net>

This fixes some bugs in EHCI suspend/resume that joined us over the past
few releases (as usbcore, PCI, pmcore, and other components evolved):

  - Removes suspend and resume recursion from the EHCI driver, getting
    rid of the USB_SUSPEND special casing.

  - Updates the wakeup mechanism to work again; there's a newish usbcore
    call it needs to use.

  - Provide simpler tests for "do we need to restart from scratch", to
    address another case where PCI Vaux was lost.  (In this case it was
    restoring a swsusp snapshot, but there could be others.)

Un-exports a symbol that was temporarily exported.

A notable change from previous version is that this doesn't move
the spinlock init, so there's still a resume/reinit path bug.

Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

---
 drivers/usb/core/hub.c      |    1 
 drivers/usb/host/ehci-hcd.c |    3 -
 drivers/usb/host/ehci-hub.c |    7 ++++
 drivers/usb/host/ehci-pci.c |   77 +++++++++++++++++++++-----------------------
 4 files changed, 46 insertions(+), 42 deletions(-)

--- usb-2.6.orig/drivers/usb/host/ehci-hcd.c
+++ usb-2.6/drivers/usb/host/ehci-hcd.c
@@ -636,9 +636,8 @@ static irqreturn_t ehci_irq (struct usb_
 			 * stop that signaling.
 			 */
 			ehci->reset_done [i] = jiffies + msecs_to_jiffies (20);
-			mod_timer (&hcd->rh_timer,
-					ehci->reset_done [i] + 1);
 			ehci_dbg (ehci, "port %d remote wakeup\n", i + 1);
+			usb_hcd_resume_root_hub(hcd);
 		}
 	}
 
--- usb-2.6.orig/drivers/usb/host/ehci-pci.c
+++ usb-2.6/drivers/usb/host/ehci-pci.c
@@ -235,10 +235,11 @@ static void ehci_pci_stop (struct usb_hc
 
 /* suspend/resume, section 4.3 */
 
-/* These routines rely on the bus (pci, platform, etc)
+/* These routines rely on the PCI bus glue
  * to handle powerdown and wakeup, and currently also on
  * transceivers that don't need any software attention to set up
  * the right sort of wakeup.
+ * Also they depend on separate root hub suspend/resume.
  */
 
 static int ehci_pci_suspend (struct usb_hcd *hcd, pm_message_t message)
@@ -246,17 +247,9 @@ static int ehci_pci_suspend (struct usb_
 	struct ehci_hcd		*ehci = hcd_to_ehci (hcd);
 
 	if (time_before (jiffies, ehci->next_statechange))
-		msleep (100);
-
-#ifdef	CONFIG_USB_SUSPEND
-	(void) usb_suspend_device (hcd->self.root_hub);
-#else
-	usb_lock_device (hcd->self.root_hub);
-	(void) ehci_bus_suspend (hcd);
-	usb_unlock_device (hcd->self.root_hub);
-#endif
+		msleep (10);
 
-	// save (PCI) FLADJ in case of Vaux power loss
+	// could save FLADJ in case of Vaux power loss
 	// ... we'd only use it to handle clock skew
 
 	return 0;
@@ -269,13 +262,18 @@ static int ehci_pci_resume (struct usb_h
 	struct usb_device	*root = hcd->self.root_hub;
 	int			retval = -EINVAL;
 
-	// maybe restore (PCI) FLADJ
+	// maybe restore FLADJ
 
 	if (time_before (jiffies, ehci->next_statechange))
 		msleep (100);
 
+	/* If CF is clear, we lost PCI Vaux power and need to restart.  */
+	if (readl (&ehci->regs->configured_flag) != cpu_to_le32(FLAG_CF))
+		goto restart;
+
 	/* If any port is suspended (or owned by the companion),
 	 * we know we can/must resume the HC (and mustn't reset it).
+	 * We just defer that to the root hub code.
 	 */
 	for (port = HCS_N_PORTS (ehci->hcs_params); port > 0; ) {
 		u32	status;
@@ -283,42 +281,43 @@ static int ehci_pci_resume (struct usb_h
 		status = readl (&ehci->regs->port_status [port]);
 		if (!(status & PORT_POWER))
 			continue;
-		if (status & (PORT_SUSPEND | PORT_OWNER)) {
-			down (&hcd->self.root_hub->serialize);
-			retval = ehci_bus_resume (hcd);
-			up (&hcd->self.root_hub->serialize);
-			break;
+		if (status & (PORT_SUSPEND | PORT_RESUME | PORT_OWNER)) {
+			usb_hcd_resume_root_hub(hcd);
+			return 0;
 		}
+	}
+
+restart:
+	ehci_dbg(ehci, "lost power, restarting\n");
+	for (port = HCS_N_PORTS (ehci->hcs_params); port > 0; ) {
+		port--;
 		if (!root->children [port])
 			continue;
-		dbg_port (ehci, __FUNCTION__, port + 1, status);
 		usb_set_device_state (root->children[port],
 					USB_STATE_NOTATTACHED);
 	}
 
 	/* Else reset, to cope with power loss or flush-to-storage
-	 * style "resume" having activated BIOS during reboot.
+	 * style "resume" having let BIOS kick in during reboot.
 	 */
-	if (port == 0) {
-		(void) ehci_halt (ehci);
-		(void) ehci_reset (ehci);
-		(void) ehci_pci_reset (hcd);
-
-		/* emptying the schedule aborts any urbs */
-		spin_lock_irq (&ehci->lock);
-		if (ehci->reclaim)
-			ehci->reclaim_ready = 1;
-		ehci_work (ehci, NULL);
-		spin_unlock_irq (&ehci->lock);
-
-		/* restart; khubd will disconnect devices */
-		retval = ehci_run (hcd);
-
-		/* here we "know" root ports should always stay powered;
-		 * but some controllers may lose all power.
-		 */
-		ehci_port_power (ehci, 1);
-	}
+	(void) ehci_halt (ehci);
+	(void) ehci_reset (ehci);
+	(void) ehci_pci_reset (hcd);
+
+	/* emptying the schedule aborts any urbs */
+	spin_lock_irq (&ehci->lock);
+	if (ehci->reclaim)
+		ehci->reclaim_ready = 1;
+	ehci_work (ehci, NULL);
+	spin_unlock_irq (&ehci->lock);
+
+	/* restart; khubd will disconnect devices */
+	retval = ehci_run (hcd);
+
+	/* here we "know" root ports should always stay powered;
+	 * but some controllers may lose all power.
+	 */
+	ehci_port_power (ehci, 1);
 
 	return retval;
 }
--- usb-2.6.orig/drivers/usb/host/ehci-hub.c
+++ usb-2.6/drivers/usb/host/ehci-hub.c
@@ -94,6 +94,13 @@ static int ehci_bus_resume (struct usb_h
 		msleep(5);
 	spin_lock_irq (&ehci->lock);
 
+	/* Ideally and we've got a real resume here, and no port's power
+	 * was lost.  (For PCI, that means Vaux was maintained.)  But we
+	 * could instead be restoring a swsusp snapshot -- so that BIOS was
+	 * the last user of the controller, not reset/pm hardware keeping
+	 * state we gave to it.
+	 */
+
 	/* re-init operational registers in case we lost power */
 	if (readl (&ehci->regs->intr_enable) == 0) {
  		/* at least some APM implementations will try to deliver
--- usb-2.6.orig/drivers/usb/core/hub.c
+++ usb-2.6/drivers/usb/core/hub.c
@@ -1669,7 +1669,6 @@ int usb_suspend_device(struct usb_device
 	return 0;
 #endif
 }
-EXPORT_SYMBOL_GPL(usb_suspend_device);
 
 /*
  * If the USB "suspend" state is in use (rather than "global suspend"),

--

  parent reply	other threads:[~2005-11-23 23:49 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <20051123225156.624397000@press.kroah.org>
2005-11-23 23:43 ` [patch 00/22] PCI, USB and hwmon patches for 2.6.15-rc2-git Greg Kroah-Hartman
2005-11-23 23:43   ` [patch 01/22] Small fixes to driver core Greg Kroah-Hartman
2005-11-23 23:43   ` [patch 02/22] MTD git tree location added to MAINTAINERS Greg Kroah-Hartman
2005-11-23 23:44   ` [patch 03/22] Clarify T: field in MAINTAINERS Greg Kroah-Hartman
2005-11-23 23:44   ` [patch 04/22] Add more SCM trees to MAINTAINERS Greg Kroah-Hartman
2005-11-23 23:44   ` [patch 05/22] hwmon: Fix missing boundary check when setting W83627THF in0 limits Greg Kroah-Hartman
2005-11-23 23:44   ` [patch 06/22] hwmon: Fix lm78 VID conversion Greg Kroah-Hartman
2005-11-23 23:44   ` [patch 07/22] hwmon: Fix missing it87 fan div init Greg Kroah-Hartman
2005-11-23 23:44   ` [patch 08/22] hwmon: hdaps missing an axis Greg Kroah-Hartman
2005-11-23 23:44   ` [patch 09/22] PCI: trivial printk updates in common.c Greg Kroah-Hartman
2005-11-23 23:44   ` [patch 10/22] PCI Express Hotplug: clear sticky power-fault bit Greg Kroah-Hartman
2005-11-23 23:44   ` [patch 11/22] PCI: remove bogus resource collision error Greg Kroah-Hartman
2005-11-23 23:45   ` [patch 12/22] PCI: kernel-doc fix for pci-acpi.c Greg Kroah-Hartman
2005-11-23 23:45   ` [patch 13/22] PCI: direct.c: DBG Greg Kroah-Hartman
2005-11-23 23:45   ` [patch 14/22] USB: SN9C10x driver - bad page state fix Greg Kroah-Hartman
2005-11-23 23:45   ` [patch 15/22] USB: ftdi_sio: new IDs for KOBIL devices Greg Kroah-Hartman
2005-11-23 23:45   ` Greg Kroah-Hartman [this message]
2005-11-23 23:45   ` [patch 17/22] USB: EHCI updates mostly whitespace cleanups Greg Kroah-Hartman
2005-11-23 23:45   ` [patch 18/22] USB: EHCI updates split init/reinit logic for resume Greg Kroah-Hartman
2005-11-23 23:45   ` [patch 19/22] USB: ohci, move ppc asic tweaks nearer pci Greg Kroah-Hartman
2005-11-23 23:45   ` [patch 20/22] USB: fix USB key generates ioctl_internal_command errors issue Greg Kroah-Hartman
2005-11-23 23:45   ` [patch 21/22] USB: kernel-doc for linux/usb.h Greg Kroah-Hartman
2005-11-23 23:45   ` [patch 22/22] usb serial: remove redundant include Greg Kroah-Hartman
2005-11-24  0:01   ` [patch 00/22] PCI, USB and hwmon patches for 2.6.15-rc2-git Linus Torvalds
2005-11-24  0:57     ` Greg KH

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20051123234528.GQ527@kroah.com \
    --to=gregkh@suse.de \
    --cc=akpm@osdl.org \
    --cc=david-b@pacbell.net \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-usb-devel@lists.sourceforge.net \
    --cc=torvalds@osdl.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

Powered by JetHome