Commit b323e1df authored by John Rose's avatar John Rose Committed by Linus Torvalds

[PATCH] PCI: Allow pci hotplug drivers to initialize individual devices.

This lets the PPC pci hotplug driver initialize single devices, not just
entire slots.
parent 66f070ba
...@@ -580,6 +580,30 @@ pci_scan_device(struct pci_bus *bus, int devfn) ...@@ -580,6 +580,30 @@ pci_scan_device(struct pci_bus *bus, int devfn)
return dev; return dev;
} }
struct pci_dev * __devinit
pci_scan_single_device(struct pci_bus *bus, int devfn)
{
struct pci_dev *dev;
dev = pci_scan_device(bus, devfn);
pci_scan_msi_device(dev);
if (!dev)
return NULL;
/* Fix up broken headers */
pci_fixup_device(PCI_FIXUP_HEADER, dev);
/*
* Add the device to our list of discovered devices
* and the bus list for fixup functions, etc.
*/
INIT_LIST_HEAD(&dev->global_list);
list_add_tail(&dev->bus_list, &bus->devices);
return dev;
}
/** /**
* pci_scan_slot - scan a PCI slot on a bus for devices. * pci_scan_slot - scan a PCI slot on a bus for devices.
* @bus: PCI bus to scan * @bus: PCI bus to scan
...@@ -596,34 +620,23 @@ int __devinit pci_scan_slot(struct pci_bus *bus, int devfn) ...@@ -596,34 +620,23 @@ int __devinit pci_scan_slot(struct pci_bus *bus, int devfn)
for (func = 0; func < 8; func++, devfn++) { for (func = 0; func < 8; func++, devfn++) {
struct pci_dev *dev; struct pci_dev *dev;
dev = pci_scan_device(bus, devfn); dev = pci_scan_single_device(bus, devfn);
pci_scan_msi_device(dev); if (dev) {
if (func == 0) { nr++;
if (!dev)
break; /*
* If this is a single function device,
* don't scan past the first function.
*/
if (!dev->multifunction)
if (func > 0)
dev->multifunction = 1;
else
break;
} else { } else {
if (!dev) if (func == 0)
continue; break;
dev->multifunction = 1;
} }
/* Fix up broken headers */
pci_fixup_device(PCI_FIXUP_HEADER, dev);
/*
* Add the device to our list of discovered devices
* and the bus list for fixup functions, etc.
*/
INIT_LIST_HEAD(&dev->global_list);
list_add_tail(&dev->bus_list, &bus->devices);
nr++;
/*
* If this is a single function device,
* don't scan past the first function.
*/
if (!dev->multifunction)
break;
} }
return nr; return nr;
} }
...@@ -734,4 +747,5 @@ EXPORT_SYMBOL(pci_add_new_bus); ...@@ -734,4 +747,5 @@ EXPORT_SYMBOL(pci_add_new_bus);
EXPORT_SYMBOL(pci_do_scan_bus); EXPORT_SYMBOL(pci_do_scan_bus);
EXPORT_SYMBOL(pci_scan_slot); EXPORT_SYMBOL(pci_scan_slot);
EXPORT_SYMBOL(pci_scan_bridge); EXPORT_SYMBOL(pci_scan_bridge);
EXPORT_SYMBOL(pci_scan_single_device);
#endif #endif
...@@ -587,6 +587,7 @@ static inline struct pci_bus *pci_scan_bus(int bus, struct pci_ops *ops, void *s ...@@ -587,6 +587,7 @@ static inline struct pci_bus *pci_scan_bus(int bus, struct pci_ops *ops, void *s
return pci_scan_bus_parented(NULL, bus, ops, sysdata); return pci_scan_bus_parented(NULL, bus, ops, sysdata);
} }
int pci_scan_slot(struct pci_bus *bus, int devfn); int pci_scan_slot(struct pci_bus *bus, int devfn);
struct pci_dev * pci_scan_single_device(struct pci_bus *bus, int devfn);
void pci_bus_add_devices(struct pci_bus *bus); void pci_bus_add_devices(struct pci_bus *bus);
void pci_name_device(struct pci_dev *dev); void pci_name_device(struct pci_dev *dev);
char *pci_class_name(u32 class); char *pci_class_name(u32 class);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment