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 * @fn: callback functions that are called while visiting
124 * @wrapped_dev: the device to scan
125 * @wrapped_parent: the bus where @wrapped_dev is connected to
127 * Every bus and every function is presented to a custom
128 * function that can act upon it.
130 int pci_visit_dev(struct pci_visit
*fn
, struct pci_dev_wrapped
*wrapped_dev
,
131 struct pci_bus_wrapped
*wrapped_parent
)
133 struct pci_dev
* dev
= wrapped_dev
? wrapped_dev
->dev
: NULL
;
139 if (fn
->pre_visit_pci_dev
) {
140 result
= fn
->pre_visit_pci_dev(wrapped_dev
, wrapped_parent
);
145 switch (dev
->class >> 8) {
146 case PCI_CLASS_BRIDGE_PCI
:
147 result
= pci_visit_bridge(fn
, wrapped_dev
,
153 pr_debug("PCI: Scanning device %s\n", pci_name(dev
));
154 if (fn
->visit_pci_dev
) {
155 result
= fn
->visit_pci_dev (wrapped_dev
,
162 if (fn
->post_visit_pci_dev
)
163 result
= fn
->post_visit_pci_dev(wrapped_dev
, wrapped_parent
);
167 EXPORT_SYMBOL(pci_visit_dev
);