aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEdward Shao <laface.tw@gmail.com>2010-02-11 03:37:30 +0800
committerGreg Kroah-Hartman <gregkh@suse.de>2010-03-02 14:55:02 -0800
commit05197921ff3dad52d99fd1647974c57d9c28d40e (patch)
tree733684b9d0acbcd43f6f3e95f3bbc2ca4c48e960
parentUSB: remove debugging message for uevent constructions (diff)
downloadlinux-dev-05197921ff3dad52d99fd1647974c57d9c28d40e.tar.xz
linux-dev-05197921ff3dad52d99fd1647974c57d9c28d40e.zip
USB: xhci: Fix finding extended capabilities registers
According "5.3.6 Capability Parameters (HCCPARAMS)" of xHCI rev0.96 spec, value of xECP register indicates a relative offset, in 32-bit words, from Base to the beginning of the first extended capability. The wrong calculation will cause BIOS handoff fail (not handoff from BIOS) in some platform with BIOS USB legacy sup support. Signed-off-by: Edward Shao <laface.tw@gmail.com> Cc: Sarah Sharp <sarah.a.sharp@linux.intel.com> Cc: stable <stable@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r--drivers/usb/host/xhci-ext-caps.h7
1 files changed, 5 insertions, 2 deletions
diff --git a/drivers/usb/host/xhci-ext-caps.h b/drivers/usb/host/xhci-ext-caps.h
index ecc131c3fe33..78c4edac1db1 100644
--- a/drivers/usb/host/xhci-ext-caps.h
+++ b/drivers/usb/host/xhci-ext-caps.h
@@ -101,12 +101,15 @@ static inline int xhci_find_next_cap_offset(void __iomem *base, int ext_offset)
next = readl(base + ext_offset);
- if (ext_offset == XHCI_HCC_PARAMS_OFFSET)
+ if (ext_offset == XHCI_HCC_PARAMS_OFFSET) {
/* Find the first extended capability */
next = XHCI_HCC_EXT_CAPS(next);
- else
+ ext_offset = 0;
+ } else {
/* Find the next extended capability */
next = XHCI_EXT_CAPS_NEXT(next);
+ }
+
if (!next)
return 0;
/*