|
@@ -841,12 +841,12 @@ static void __devinit quirk_usb_handoff_xhci(struct pci_dev *pdev)
|
|
|
void __iomem *op_reg_base;
|
|
|
u32 val;
|
|
|
int timeout;
|
|
|
+ int len = pci_resource_len(pdev, 0);
|
|
|
|
|
|
if (!mmio_resource_enabled(pdev, 0))
|
|
|
return;
|
|
|
|
|
|
- base = ioremap_nocache(pci_resource_start(pdev, 0),
|
|
|
- pci_resource_len(pdev, 0));
|
|
|
+ base = ioremap_nocache(pci_resource_start(pdev, 0), len);
|
|
|
if (base == NULL)
|
|
|
return;
|
|
|
|
|
@@ -856,9 +856,17 @@ static void __devinit quirk_usb_handoff_xhci(struct pci_dev *pdev)
|
|
|
*/
|
|
|
ext_cap_offset = xhci_find_next_cap_offset(base, XHCI_HCC_PARAMS_OFFSET);
|
|
|
do {
|
|
|
+ if ((ext_cap_offset + sizeof(val)) > len) {
|
|
|
+ /* We're reading garbage from the controller */
|
|
|
+ dev_warn(&pdev->dev,
|
|
|
+ "xHCI controller failing to respond");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
if (!ext_cap_offset)
|
|
|
/* We've reached the end of the extended capabilities */
|
|
|
goto hc_init;
|
|
|
+
|
|
|
val = readl(base + ext_cap_offset);
|
|
|
if (XHCI_EXT_CAPS_ID(val) == XHCI_EXT_CAPS_LEGACY)
|
|
|
break;
|