All of lore.kernel.org
 help / color / mirror / Atom feed
From: Greg Kroah-Hartman <gregkh@suse.de>
To: linux-kernel@vger.kernel.org, stable@kernel.org,
	linux-usb-devel@lists.sourceforge.net
Cc: Justin Forbes <jmforbes@linuxtx.org>,
	Zwane Mwaikambo <zwane@arm.linux.org.uk>,
	"Theodore Ts'o" <tytso@mit.edu>,
	Randy Dunlap <rdunlap@xenotime.net>,
	Dave Jones <davej@redhat.com>,
	Chuck Wolber <chuckw@quantumlinux.com>,
	Chris Wedgwood <reviews@ml.cw.f00f.org>,
	Michael Krufky <mkrufky@linuxtv.org>,
	Chuck Ebbert <cebbert@redhat.com>,
	Domenico Andreoli <cavokz@gmail.com>,
	torvalds@linux-foundation.org, akpm@linux-foundation.org,
	alan@lxorguk.ukuu.org.uk, Alan Stern <stern@rowland.harvard.edu>,
	David Brownell <david-b@pacbell.net>,
	David Miller <davem@davemloft.net>,
	Dely L Sy <dely.l.sy@intel.com>
Subject: [patch 22/40] USB: mutual exclusion for EHCI init and port resets
Date: Wed, 14 Nov 2007 22:45:07 -0800	[thread overview]
Message-ID: <20071115064507.GW19218@kroah.com> (raw)
In-Reply-To: <20071115064302.GA19218@kroah.com>

[-- Attachment #1: usb-mutual-exclusion-for-ehci-init-and-port-resets.patch --]
[-- Type: text/plain, Size: 3867 bytes --]



-stable review patch.  If anyone has any objections, please let us know.

------------------
From: Alan Stern <stern@rowland.harvard.edu>

patch 32fe01985aa2cb2562f6fc171e526e279abe10db in mainline.

This patch (as999) fixes a problem that sometimes shows up when host
controller driver modules are loaded in the wrong order.  If ehci-hcd
happens to initialize an EHCI controller while the companion OHCI or
UHCI controller is in the middle of a port reset, the reset can fail
and the companion may get very confused.  The patch adds an
rw-semaphore and uses it to keep EHCI initialization and port resets
mutually exclusive.

Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
Acked-by: David Brownell <david-b@pacbell.net>
Cc: David Miller <davem@davemloft.net>
Cc: Dely L Sy <dely.l.sy@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
 drivers/usb/core/hcd.h      |    8 +++++++-
 drivers/usb/core/hub.c      |   15 ++++++++++++++-
 drivers/usb/host/ehci-hcd.c |    8 ++++++++
 3 files changed, 29 insertions(+), 2 deletions(-)

--- a/drivers/usb/core/hcd.h
+++ b/drivers/usb/core/hcd.h
@@ -19,6 +19,8 @@
 
 #ifdef __KERNEL__
 
+#include <linux/rwsem.h>
+
 /* This file contains declarations of usbcore internals that are mostly
  * used or exposed by Host Controller Drivers.
  */
@@ -454,5 +456,9 @@ static inline void usbmon_urb_complete(s
 		: (in_interrupt () ? "in_interrupt" : "can sleep"))
 
 
-#endif /* __KERNEL__ */
+/* This rwsem is for use only by the hub driver and ehci-hcd.
+ * Nobody else should touch it.
+ */
+extern struct rw_semaphore ehci_cf_port_reset_rwsem;
 
+#endif /* __KERNEL__ */
--- a/drivers/usb/core/hub.c
+++ b/drivers/usb/core/hub.c
@@ -125,6 +125,12 @@ MODULE_PARM_DESC(use_both_schemes,
 		"try the other device initialization scheme if the "
 		"first one fails");
 
+/* Mutual exclusion for EHCI CF initialization.  This interferes with
+ * port reset on some companion controllers.
+ */
+DECLARE_RWSEM(ehci_cf_port_reset_rwsem);
+EXPORT_SYMBOL_GPL(ehci_cf_port_reset_rwsem);
+
 
 static inline char *portspeed(int portstatus)
 {
@@ -1460,6 +1466,11 @@ static int hub_port_reset(struct usb_hub
 {
 	int i, status;
 
+	/* Block EHCI CF initialization during the port reset.
+	 * Some companion controllers don't like it when they mix.
+	 */
+	down_read(&ehci_cf_port_reset_rwsem);
+
 	/* Reset the port */
 	for (i = 0; i < PORT_RESET_TRIES; i++) {
 		status = set_port_feature(hub->hdev,
@@ -1490,7 +1501,7 @@ static int hub_port_reset(struct usb_hub
 			usb_set_device_state(udev, status
 					? USB_STATE_NOTATTACHED
 					: USB_STATE_DEFAULT);
-			return status;
+			goto done;
 		}
 
 		dev_dbg (hub->intfdev,
@@ -1503,6 +1514,8 @@ static int hub_port_reset(struct usb_hub
 		"Cannot enable port %i.  Maybe the USB cable is bad?\n",
 		port1);
 
+ done:
+	up_read(&ehci_cf_port_reset_rwsem);
 	return status;
 }
 
--- a/drivers/usb/host/ehci-hcd.c
+++ b/drivers/usb/host/ehci-hcd.c
@@ -570,10 +570,18 @@ static int ehci_run (struct usb_hcd *hcd
 	 * are explicitly handed to companion controller(s), so no TT is
 	 * involved with the root hub.  (Except where one is integrated,
 	 * and there's no companion controller unless maybe for USB OTG.)
+	 *
+	 * Turning on the CF flag will transfer ownership of all ports
+	 * from the companions to the EHCI controller.  If any of the
+	 * companions are in the middle of a port reset at the time, it
+	 * could cause trouble.  Write-locking ehci_cf_port_reset_rwsem
+	 * guarantees that no resets are in progress.
 	 */
+	down_write(&ehci_cf_port_reset_rwsem);
 	hcd->state = HC_STATE_RUNNING;
 	ehci_writel(ehci, FLAG_CF, &ehci->regs->configured_flag);
 	ehci_readl(ehci, &ehci->regs->command);	/* unblock posted writes */
+	up_write(&ehci_cf_port_reset_rwsem);
 
 	temp = HC_VERSION(ehci_readl(ehci, &ehci->caps->hc_capbase));
 	ehci_info (ehci,

-- 

  parent reply	other threads:[~2007-11-15  7:01 UTC|newest]

Thread overview: 43+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <20071115062710.885284510@mini.kroah.org>
2007-11-15  6:43 ` [patch 00/40] 2.6.23-stable review, driver (sans network) changes Greg Kroah-Hartman
2007-11-15  6:43   ` [patch 01/40] POWERPC: Fix platinumfb framebuffer Greg Kroah-Hartman
2007-11-15  6:43   ` [patch 02/40] i915: fix vbl swap allocation size Greg Kroah-Hartman
2007-11-15  6:44   ` [patch 03/40] hwmon/w83627hf: Fix setting fan min right after driver load Greg Kroah-Hartman
2007-11-15  6:44   ` [patch 04/40] hwmon/w83627hf: Dont assume bank 0 Greg Kroah-Hartman
2007-11-15  6:44   ` [patch 05/40] hwmon/lm87: Fix a division by zero Greg Kroah-Hartman
2007-11-15  6:44   ` [patch 06/40] hwmon/lm87: Disable VID when it should be Greg Kroah-Hartman
2007-11-15  6:44   ` [patch 07/40] IB/uverbs: Fix checking of userspace object ownership Greg Kroah-Hartman
2007-11-15  6:44   ` [patch 08/40] IB/mthca: Use mmiowb() to avoid firmware commands getting jumbled up Greg Kroah-Hartman
2007-11-15  6:44   ` [patch 09/40] ALSA: hda-codec - Avoid zero NID in line_out_pinsof STAC codecs Greg Kroah-Hartman
2007-11-15  6:44   ` [patch 10/40] ALSA: fix selector unit bug affecting some USB speakerphones Greg Kroah-Hartman
2007-11-15  6:44   ` [patch 11/40] ALSA: Fix build error without CONFIG_HAS_DMA Greg Kroah-Hartman
2007-11-15  6:44   ` [patch 12/40] ALSA: emu10k1 - Fix memory corruption Greg Kroah-Hartman
2007-11-15  6:44   ` [patch 13/40] ALSA: hdsp - Fix zero division Greg Kroah-Hartman
2007-11-15  6:44   ` [patch 14/40] libata: sync NCQ blacklist with upstream Greg Kroah-Hartman
2007-11-15  6:44   ` [patch 15/40] dm delay: fix status Greg Kroah-Hartman
2007-11-15  6:44   ` [patch 16/40] dm: fix thaw_bdev Greg Kroah-Hartman
2007-11-15  6:44   ` [patch 17/40] md: fix an unsigned compare to allow creation of bitmaps with v1.0 metadata Greg Kroah-Hartman
2007-11-15  6:44   ` [patch 18/40] md: raid5: fix clearing of biofill operations Greg Kroah-Hartman
2007-11-15  6:44   ` [patch 19/40] MSI: Use correct data offset for 32-bit MSI in read_msi_msg() Greg Kroah-Hartman
2007-11-15  6:44   ` [patch 20/40] USB: remove USB_QUIRK_NO_AUTOSUSPEND Greg Kroah-Hartman
2007-11-15 15:50     ` Chuck Ebbert
2007-11-15 17:57       ` Alan Stern
2007-11-15  6:45   ` [patch 21/40] usb-gadget-ether: prevent oops caused by error interrupt race Greg Kroah-Hartman
2007-11-15  6:45   ` Greg Kroah-Hartman [this message]
2007-11-15  6:45   ` [patch 23/40] USB: add URB_FREE_BUFFER to permissible flags Greg Kroah-Hartman
2007-11-15  6:45   ` [patch 24/40] USB: usbserial - fix potential deadlock between write() and IRQ Greg Kroah-Hartman
2007-11-15  6:45   ` [patch 25/40] ALSA: hda-codec - Add array terminator for dmic in STAC codec Greg Kroah-Hartman
2007-11-15  6:45   ` [patch 26/40] i4l: Fix random hard freeze with AVM c4 card Greg Kroah-Hartman
2007-11-15  6:45   ` [patch 27/40] i4l: fix random freezes with AVM B1 drivers Greg Kroah-Hartman
2007-11-15  6:45   ` [patch 28/40] ide: fix serverworks.c UDMA regression Greg Kroah-Hartman
2007-11-15  6:45   ` [patch 29/40] ide: Add ide_get_paired_drive() helper Greg Kroah-Hartman
2007-11-15  6:45   ` [patch 30/40] ide: Fix siimage driver accessing beyond array boundary Greg Kroah-Hartman
2007-11-15  6:45   ` [patch 31/40] ide: Fix cs5535 " Greg Kroah-Hartman
2007-11-15  6:45   ` [patch 32/40] hptiop: avoid buffer overflow when returning sense data Greg Kroah-Hartman
2007-11-15  6:45   ` [patch 33/40] Char: rocket, fix dynamic_dev tty Greg Kroah-Hartman
2007-11-15  6:45   ` [patch 34/40] Char: moxa, fix and optimise empty timer Greg Kroah-Hartman
2007-11-15  6:45   ` [patch 35/40] radeon: set the address to access the GART table on the CPU side correctly Greg Kroah-Hartman
2007-11-15  6:45   ` [patch 36/40] libata: add HTS542525K9SA00 to NCQ blacklist Greg Kroah-Hartman
2007-11-15  6:45   ` [patch 37/40] libata: backport ATA_FLAG_NO_SRST and ATA_FLAG_ASSUME_ATA Greg Kroah-Hartman
2007-11-15  6:45   ` [patch 38/40] libata: backport ATA_FLAG_NO_SRST and ATA_FLAG_ASSUME_ATA, part 2 Greg Kroah-Hartman
2007-11-15  6:46   ` [patch 39/40] ACPI: sleep: Fix GPE suspend cleanup Greg Kroah-Hartman
2007-11-15  6:46   ` [patch 40/40] ACPI: suspend: Wrong order of GPE restore Greg Kroah-Hartman

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=20071115064507.GW19218@kroah.com \
    --to=gregkh@suse.de \
    --cc=akpm@linux-foundation.org \
    --cc=alan@lxorguk.ukuu.org.uk \
    --cc=cavokz@gmail.com \
    --cc=cebbert@redhat.com \
    --cc=chuckw@quantumlinux.com \
    --cc=davej@redhat.com \
    --cc=davem@davemloft.net \
    --cc=david-b@pacbell.net \
    --cc=dely.l.sy@intel.com \
    --cc=jmforbes@linuxtx.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-usb-devel@lists.sourceforge.net \
    --cc=mkrufky@linuxtv.org \
    --cc=rdunlap@xenotime.net \
    --cc=reviews@ml.cw.f00f.org \
    --cc=stable@kernel.org \
    --cc=stern@rowland.harvard.edu \
    --cc=torvalds@linux-foundation.org \
    --cc=tytso@mit.edu \
    --cc=zwane@arm.linux.org.uk \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.