--- drivers/pci/setup-bus.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) Index: linux-2.6/drivers/pci/setup-bus.c =================================================================== --- linux-2.6.orig/drivers/pci/setup-bus.c +++ linux-2.6/drivers/pci/setup-bus.c @@ -1615,6 +1615,22 @@ again: fail_res->flags & type_mask, rel_type); + /* reset LSI device */ + list_for_each_entry(fail_res, &fail_head, list) { + struct pci_dev *pdev; + struct pci_bus *pbus = fail_res->dev->bus; + + if (pci_is_root_bus(pbus) || !pbus->self) + continue; + + /* LSI device firmware is not happy with changing BAR value */ + list_for_each_entry(pdev, &pbus->devices, bus_list) + if (pdev->vendor == PCI_VENDOR_ID_LSI_LOGIC) { + pci_reset_secondary_bus(pbus->self); + break; + } + } + /* restore size and flags */ list_for_each_entry(fail_res, &fail_head, list) { struct resource *res = fail_res->res;