diff options
author | Greg Kroah-Hartman <gregkh@suse.de> | 2006-01-24 13:30:07 -0800 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2006-01-24 13:30:07 -0800 |
commit | ad54876ba87edfccf23d106018d2bf9ca283b594 (patch) | |
tree | 3581448865a5bab67b487cfac1edd2b6a4f6fb50 /usb | |
parent | 5c6cad6dac229ea0c07f924c7d5826ec10a3b303 (diff) | |
download | patches-ad54876ba87edfccf23d106018d2bf9ca283b594.tar.gz |
new patches
Diffstat (limited to 'usb')
-rw-r--r-- | usb/always-announce-new-usb-devices.patch | 47 | ||||
-rw-r--r-- | usb/usb-fix-ehci-early-handoff-issues.patch | 247 |
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 |