|
@@ -797,6 +797,29 @@ static void acpiphp_set_acpi_region(struct acpiphp_slot *slot)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+static void check_hotplug_bridge(struct acpiphp_slot *slot, struct pci_dev *dev)
|
|
|
+{
|
|
|
+ struct acpiphp_func *func;
|
|
|
+
|
|
|
+ if (!dev->subordinate)
|
|
|
+ return;
|
|
|
+
|
|
|
+ /* quirk, or pcie could set it already */
|
|
|
+ if (dev->is_hotplug_bridge)
|
|
|
+ return;
|
|
|
+
|
|
|
+ if (PCI_SLOT(dev->devfn) != slot->device)
|
|
|
+ return;
|
|
|
+
|
|
|
+ list_for_each_entry(func, &slot->funcs, sibling) {
|
|
|
+ if (PCI_FUNC(dev->devfn) == func->function) {
|
|
|
+ /* check if this bridge has ejectable slots */
|
|
|
+ if ((detect_ejectable_slots(func->handle) > 0))
|
|
|
+ dev->is_hotplug_bridge = 1;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
/**
|
|
|
* enable_device - enable, configure a slot
|
|
|
* @slot: slot to be enabled
|
|
@@ -831,8 +854,10 @@ static int __ref enable_device(struct acpiphp_slot *slot)
|
|
|
if (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE ||
|
|
|
dev->hdr_type == PCI_HEADER_TYPE_CARDBUS) {
|
|
|
max = pci_scan_bridge(bus, dev, max, pass);
|
|
|
- if (pass && dev->subordinate)
|
|
|
+ if (pass && dev->subordinate) {
|
|
|
+ check_hotplug_bridge(slot, dev);
|
|
|
pci_bus_size_bridges(dev->subordinate);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|