aboutsummaryrefslogtreecommitdiffstats
path: root/usb
diff options
context:
space:
mode:
authorGreg Kroah-Hartman <gregkh@suse.de>2006-01-24 13:30:07 -0800
committerGreg Kroah-Hartman <gregkh@suse.de>2006-01-24 13:30:07 -0800
commitad54876ba87edfccf23d106018d2bf9ca283b594 (patch)
tree3581448865a5bab67b487cfac1edd2b6a4f6fb50 /usb
parent5c6cad6dac229ea0c07f924c7d5826ec10a3b303 (diff)
downloadpatches-ad54876ba87edfccf23d106018d2bf9ca283b594.tar.gz
new patches
Diffstat (limited to 'usb')
-rw-r--r--usb/always-announce-new-usb-devices.patch47
-rw-r--r--usb/usb-fix-ehci-early-handoff-issues.patch247
2 files changed, 294 insertions, 0 deletions
diff --git a/usb/always-announce-new-usb-devices.patch b/usb/always-announce-new-usb-devices.patch
new file mode 100644
index 0000000000000..279cab95c24fe
--- /dev/null
+++ b/usb/always-announce-new-usb-devices.patch
@@ -0,0 +1,47 @@
+From: Greg Kroah-Hartman <gregkh@suse.de>
+Subject: USB: always announce a device has been added to the system
+
+Distros (like SuSE) want to know this information, to make it easier
+to handle support issues.
+
+Odds are no one wants this in mainline, as it clutters up the syslog...
+
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/core/hub.c | 10 ++++------
+ 1 file changed, 4 insertions(+), 6 deletions(-)
+
+--- gregkh-2.6.orig/drivers/usb/core/hub.c
++++ gregkh-2.6/drivers/usb/core/hub.c
+@@ -1251,7 +1251,6 @@ static int choose_configuration(struct u
+ return i;
+ }
+
+-#ifdef DEBUG
+ static void show_string(struct usb_device *udev, char *id, char *string)
+ {
+ if (!string)
+@@ -1259,10 +1258,6 @@ static void show_string(struct usb_devic
+ dev_printk(KERN_INFO, &udev->dev, "%s: %s\n", id, string);
+ }
+
+-#else
+-static inline void show_string(struct usb_device *udev, char *id, char *string)
+-{}
+-#endif
+
+
+ #ifdef CONFIG_USB_OTG
+@@ -1307,7 +1302,10 @@ int usb_new_device(struct usb_device *ud
+ udev->serial = usb_cache_string(udev, udev->descriptor.iSerialNumber);
+
+ /* Tell the world! */
+- dev_dbg(&udev->dev, "new device strings: Mfr=%d, Product=%d, "
++ dev_info(&udev->dev, "new device found, idVendor=%04x, idProduct=%04x\n",
++ le16_to_cpu(udev->descriptor.idVendor),
++ le16_to_cpu(udev->descriptor.idProduct));
++ dev_info(&udev->dev, "new device strings: Mfr=%d, Product=%d, "
+ "SerialNumber=%d\n",
+ udev->descriptor.iManufacturer,
+ udev->descriptor.iProduct,
diff --git a/usb/usb-fix-ehci-early-handoff-issues.patch b/usb/usb-fix-ehci-early-handoff-issues.patch
new file mode 100644
index 0000000000000..8545b1e7f43c0
--- /dev/null
+++ b/usb/usb-fix-ehci-early-handoff-issues.patch
@@ -0,0 +1,247 @@
+From david-b@pacbell.net Tue Jan 24 07:15:40 2006
+From: David Brownell <david-b@pacbell.net>
+Subject: USB: fix EHCI early handoff issues
+Date: Tue, 24 Jan 2006 07:15:30 -0800
+Cc: Greg KH <greg@kroah.com>, Andrew Morton <akpm@osdl.org>, "Carlo E. Prelz" <fluido@fluido.as>
+Message-Id: <200601240715.30368.david-b@pacbell.net>
+
+
+This moves the previously widely-used ehci-pci.c BIOS handoff
+code into the pci-quirks.c file, replacing the less widely used
+"early handoff" version that seems to cause problems lately.
+
+One notable change: the "early handoff" version always enabled
+an SMI IRQ ... and did so even if the pre-Linux code said it was
+not using EHCI (and not expecting EHCI SMIs). Looks like a goof
+in a workaround for some unknown BIOS version.
+
+This merged version only forcibly enables those IRQs when pre-Linux
+code says it's using EHCI. And now it always forces them off "just
+in case".
+
+Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/host/ehci-pci.c | 63 +-----------------------
+ drivers/usb/host/pci-quirks.c | 106 ++++++++++++++++++++++++++----------------
+ 2 files changed, 71 insertions(+), 98 deletions(-)
+
+--- gregkh-2.6.orig/drivers/usb/host/ehci-pci.c
++++ gregkh-2.6/drivers/usb/host/ehci-pci.c
+@@ -24,40 +24,6 @@
+
+ /*-------------------------------------------------------------------------*/
+
+-/* EHCI 0.96 (and later) section 5.1 says how to kick BIOS/SMM/...
+- * off the controller (maybe it can boot from highspeed USB disks).
+- */
+-static int bios_handoff(struct ehci_hcd *ehci, int where, u32 cap)
+-{
+- struct pci_dev *pdev = to_pci_dev(ehci_to_hcd(ehci)->self.controller);
+-
+- /* always say Linux will own the hardware */
+- pci_write_config_byte(pdev, where + 3, 1);
+-
+- /* maybe wait a while for BIOS to respond */
+- if (cap & (1 << 16)) {
+- int msec = 5000;
+-
+- do {
+- msleep(10);
+- msec -= 10;
+- pci_read_config_dword(pdev, where, &cap);
+- } while ((cap & (1 << 16)) && msec);
+- if (cap & (1 << 16)) {
+- ehci_err(ehci, "BIOS handoff failed (%d, %08x)\n",
+- where, cap);
+- // some BIOS versions seem buggy...
+- // return 1;
+- ehci_warn(ehci, "continuing after BIOS bug...\n");
+- /* disable all SMIs, and clear "BIOS owns" flag */
+- pci_write_config_dword(pdev, where + 4, 0);
+- pci_write_config_byte(pdev, where + 2, 0);
+- } else
+- ehci_dbg(ehci, "BIOS handoff succeeded\n");
+- }
+- return 0;
+-}
+-
+ /* called after powerup, by probe or system-pm "wakeup" */
+ static int ehci_pci_reinit(struct ehci_hcd *ehci, struct pci_dev *pdev)
+ {
+@@ -84,32 +50,9 @@ static int ehci_pci_reinit(struct ehci_h
+ }
+ }
+
+- temp = HCC_EXT_CAPS(readl(&ehci->caps->hcc_params));
+-
+- /* EHCI 0.96 and later may have "extended capabilities" */
+- while (temp && count--) {
+- u32 cap;
+-
+- pci_read_config_dword(pdev, temp, &cap);
+- ehci_dbg(ehci, "capability %04x at %02x\n", cap, temp);
+- switch (cap & 0xff) {
+- case 1: /* BIOS/SMM/... handoff */
+- if (bios_handoff(ehci, temp, cap) != 0)
+- return -EOPNOTSUPP;
+- break;
+- case 0: /* illegal reserved capability */
+- ehci_dbg(ehci, "illegal capability!\n");
+- cap = 0;
+- /* FALLTHROUGH */
+- default: /* unknown */
+- break;
+- }
+- temp = (cap >> 8) & 0xff;
+- }
+- if (!count) {
+- ehci_err(ehci, "bogus capabilities ... PCI problems!\n");
+- return -EIO;
+- }
++ /* we expect static quirk code to handle the "extended capabilities"
++ * (currently just BIOS handoff) allowed starting with EHCI 0.96
++ */
+
+ /* PCI Memory-Write-Invalidate cycle support is optional (uncommon) */
+ retval = pci_set_mwi(pdev);
+--- gregkh-2.6.orig/drivers/usb/host/pci-quirks.c
++++ gregkh-2.6/drivers/usb/host/pci-quirks.c
+@@ -190,7 +190,7 @@ static void __devinit quirk_usb_handoff_
+ msleep(10);
+ }
+ if (wait_time <= 0)
+- printk(KERN_WARNING "%s %s: early BIOS handoff "
++ printk(KERN_WARNING "%s %s: BIOS handoff "
+ "failed (BIOS bug ?)\n",
+ pdev->dev.bus_id, "OHCI");
+
+@@ -212,8 +212,9 @@ static void __devinit quirk_usb_disable_
+ {
+ int wait_time, delta;
+ void __iomem *base, *op_reg_base;
+- u32 hcc_params, val, temp;
+- u8 cap_length;
++ u32 hcc_params, val;
++ u8 offset, cap_length;
++ int count = 256/4;
+
+ if (!mmio_resource_enabled(pdev, 0))
+ return;
+@@ -224,51 +225,80 @@ static void __devinit quirk_usb_disable_
+
+ cap_length = readb(base);
+ op_reg_base = base + cap_length;
++
++ /* EHCI 0.96 and later may have "extended capabilities"
++ * spec section 5.1 explains the bios handoff, e.g. for
++ * booting from USB disk or using a usb keyboard
++ */
+ hcc_params = readl(base + EHCI_HCC_PARAMS);
+- hcc_params = (hcc_params >> 8) & 0xff;
+- if (hcc_params) {
+- pci_read_config_dword(pdev,
+- hcc_params + EHCI_USBLEGSUP,
+- &val);
+- if (((val & 0xff) == 1) && (val & EHCI_USBLEGSUP_BIOS)) {
+- /*
+- * Ok, BIOS is in smm mode, try to hand off...
+- */
+- pci_read_config_dword(pdev,
+- hcc_params + EHCI_USBLEGCTLSTS,
+- &temp);
+- pci_write_config_dword(pdev,
+- hcc_params + EHCI_USBLEGCTLSTS,
+- temp | EHCI_USBLEGCTLSTS_SOOE);
+- val |= EHCI_USBLEGSUP_OS;
+- pci_write_config_dword(pdev,
+- hcc_params + EHCI_USBLEGSUP,
+- val);
++ offset = (hcc_params >> 8) & 0xff;
++ while (offset && count--) {
++ u32 cap;
++ int msec;
++
++ pci_read_config_dword(pdev, offset, &cap);
++ switch (cap & 0xff) {
++ case 1: /* BIOS/SMM/... handoff support */
++ if ((cap & EHCI_USBLEGSUP_BIOS)) {
++ pr_debug("%s %s: BIOS handoff\n",
++ pdev->dev.bus_id, "EHCI");
+
+- wait_time = 500;
+- do {
+- msleep(10);
+- wait_time -= 10;
++ /* BIOS workaround (?): be sure the
++ * pre-Linux code receives the SMI
++ */
+ pci_read_config_dword(pdev,
+- hcc_params + EHCI_USBLEGSUP,
++ offset + EHCI_USBLEGCTLSTS,
+ &val);
+- } while (wait_time && (val & EHCI_USBLEGSUP_BIOS));
+- if (!wait_time) {
+- /*
+- * well, possibly buggy BIOS...
++ pci_write_config_dword(pdev,
++ offset + EHCI_USBLEGCTLSTS,
++ val | EHCI_USBLEGCTLSTS_SOOE);
++ }
++
++ /* always say Linux will own the hardware
++ * by setting EHCI_USBLEGSUP_OS.
++ */
++ pci_write_config_byte(pdev, offset + 3, 1);
++
++ /* if boot firmware now owns EHCI, spin till
++ * it hands it over.
++ */
++ msec = 5000;
++ while ((cap & EHCI_USBLEGSUP_BIOS) && (msec > 0)) {
++ msleep(10);
++ msec -= 10;
++ pci_read_config_dword(pdev, offset, &cap);
++ }
++
++ if (cap & EHCI_USBLEGSUP_BIOS) {
++ /* well, possibly buggy BIOS... try to shut
++ * it down, and hope nothing goes too wrong
+ */
+- printk(KERN_WARNING "%s %s: early BIOS handoff "
++ printk(KERN_WARNING "%s %s: BIOS handoff "
+ "failed (BIOS bug ?)\n",
+ pdev->dev.bus_id, "EHCI");
+- pci_write_config_dword(pdev,
+- hcc_params + EHCI_USBLEGSUP,
+- EHCI_USBLEGSUP_OS);
+- pci_write_config_dword(pdev,
+- hcc_params + EHCI_USBLEGCTLSTS,
+- 0);
++ pci_write_config_byte(pdev, offset + 2, 0);
+ }
++
++ /* just in case, always disable EHCI SMIs */
++ pci_write_config_dword(pdev,
++ offset + EHCI_USBLEGCTLSTS,
++ 0);
++ break;
++ case 0: /* illegal reserved capability */
++ cap = 0;
++ /* FALLTHROUGH */
++ default:
++ printk(KERN_WARNING "%s %s: unrecognized "
++ "capability %02x\n",
++ pdev->dev.bus_id, "EHCI",
++ cap & 0xff);
++ break;
+ }
++ offset = (cap >> 8) & 0xff;
+ }
++ if (!count)
++ printk(KERN_DEBUG "%s %s: capability loop?\n",
++ pdev->dev.bus_id, "EHCI");
+
+ /*
+ * halt EHCI & disable its interrupts in any case