1 #include <linux/kernel.h>
3 #include <linux/module.h>
6 int pci_hotplug (struct device *dev, char **envp, int num_envp,
7 char *buffer, int buffer_size)
17 pdev = to_pci_dev(dev);
23 /* stuff we want to pass to /sbin/hotplug */
25 length += scnprintf (scratch, buffer_size - length, "PCI_CLASS=%04X",
27 if ((buffer_size - length <= 0) || (i >= num_envp))
33 length += scnprintf (scratch, buffer_size - length, "PCI_ID=%04X:%04X",
34 pdev->vendor, pdev->device);
35 if ((buffer_size - length <= 0) || (i >= num_envp))
41 length += scnprintf (scratch, buffer_size - length,
42 "PCI_SUBSYS_ID=%04X:%04X", pdev->subsystem_vendor,
43 pdev->subsystem_device);
44 if ((buffer_size - length <= 0) || (i >= num_envp))
50 length += scnprintf (scratch, buffer_size - length, "PCI_SLOT_NAME=%s",
52 if ((buffer_size - length <= 0) || (i >= num_envp))
60 static int pci_visit_bus (struct pci_visit * fn, struct pci_bus_wrapped *wrapped_bus, struct pci_dev_wrapped *wrapped_parent)
64 struct pci_dev_wrapped wrapped_dev;
67 pr_debug("PCI: Scanning bus %04x:%02x\n", pci_domain_nr(wrapped_bus->bus),
68 wrapped_bus->bus->number);
70 if (fn->pre_visit_pci_bus) {
71 result = fn->pre_visit_pci_bus(wrapped_bus, wrapped_parent);
76 ln = wrapped_bus->bus->devices.next;
77 while (ln != &wrapped_bus->bus->devices) {
81 memset(&wrapped_dev, 0, sizeof(struct pci_dev_wrapped));
82 wrapped_dev.dev = dev;
84 result = pci_visit_dev(fn, &wrapped_dev, wrapped_bus);
89 if (fn->post_visit_pci_bus)
90 result = fn->post_visit_pci_bus(wrapped_bus, wrapped_parent);
95 static int pci_visit_bridge (struct pci_visit * fn,
96 struct pci_dev_wrapped *wrapped_dev,
97 struct pci_bus_wrapped *wrapped_parent)
100 struct pci_bus_wrapped wrapped_bus;
103 pr_debug("PCI: Scanning bridge %s\n", pci_name(wrapped_dev->dev));
105 if (fn->visit_pci_dev) {
106 result = fn->visit_pci_dev(wrapped_dev, wrapped_parent);
111 bus = wrapped_dev->dev->subordinate;
113 memset(&wrapped_bus, 0, sizeof(struct pci_bus_wrapped));
114 wrapped_bus.bus = bus;
116 result = pci_visit_bus(fn, &wrapped_bus, wrapped_dev);
122 * pci_visit_dev - scans the pci buses.
123 * Every bus and every function is presented to a custom
124 * function that can act upon it.
126 int pci_visit_dev(struct pci_visit *fn, struct pci_dev_wrapped *wrapped_dev,
127 struct pci_bus_wrapped *wrapped_parent)
129 struct pci_dev* dev = wrapped_dev ? wrapped_dev->dev : NULL;
135 if (fn->pre_visit_pci_dev) {
136 result = fn->pre_visit_pci_dev(wrapped_dev, wrapped_parent);
141 switch (dev->class >> 8) {
142 case PCI_CLASS_BRIDGE_PCI:
143 result = pci_visit_bridge(fn, wrapped_dev,
149 pr_debug("PCI: Scanning device %s\n", pci_name(dev));
150 if (fn->visit_pci_dev) {
151 result = fn->visit_pci_dev (wrapped_dev,
158 if (fn->post_visit_pci_dev)
159 result = fn->post_visit_pci_dev(wrapped_dev, wrapped_parent);
163 EXPORT_SYMBOL(pci_visit_dev);