diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/pci/bus.c | 11 | ||||
-rw-r--r-- | drivers/pci/probe.c | 2 | ||||
-rw-r--r-- | drivers/pci/remove.c | 6 |
3 files changed, 7 insertions, 12 deletions
diff --git a/drivers/pci/bus.c b/drivers/pci/bus.c index d708358326e5..e1c079aa0e82 100644 --- a/drivers/pci/bus.c +++ b/drivers/pci/bus.c | |||
@@ -84,6 +84,7 @@ int pci_bus_add_device(struct pci_dev *dev) | |||
84 | if (retval) | 84 | if (retval) |
85 | return retval; | 85 | return retval; |
86 | 86 | ||
87 | dev->is_added = 1; | ||
87 | down_write(&pci_bus_sem); | 88 | down_write(&pci_bus_sem); |
88 | list_add_tail(&dev->global_list, &pci_devices); | 89 | list_add_tail(&dev->global_list, &pci_devices); |
89 | up_write(&pci_bus_sem); | 90 | up_write(&pci_bus_sem); |
@@ -112,11 +113,8 @@ void pci_bus_add_devices(struct pci_bus *bus) | |||
112 | int retval; | 113 | int retval; |
113 | 114 | ||
114 | list_for_each_entry(dev, &bus->devices, bus_list) { | 115 | list_for_each_entry(dev, &bus->devices, bus_list) { |
115 | /* | 116 | /* Skip already-added devices */ |
116 | * Skip already-present devices (which are on the | 117 | if (dev->is_added) |
117 | * global device list.) | ||
118 | */ | ||
119 | if (!list_empty(&dev->global_list)) | ||
120 | continue; | 118 | continue; |
121 | retval = pci_bus_add_device(dev); | 119 | retval = pci_bus_add_device(dev); |
122 | if (retval) | 120 | if (retval) |
@@ -124,8 +122,7 @@ void pci_bus_add_devices(struct pci_bus *bus) | |||
124 | } | 122 | } |
125 | 123 | ||
126 | list_for_each_entry(dev, &bus->devices, bus_list) { | 124 | list_for_each_entry(dev, &bus->devices, bus_list) { |
127 | 125 | BUG_ON(!dev->is_added); | |
128 | BUG_ON(list_empty(&dev->global_list)); | ||
129 | 126 | ||
130 | /* | 127 | /* |
131 | * If there is an unattached subordinate bus, attach | 128 | * If there is an unattached subordinate bus, attach |
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c index 387fbbb97431..7217f4283ce8 100644 --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c | |||
@@ -984,7 +984,7 @@ EXPORT_SYMBOL(pci_scan_single_device); | |||
984 | * | 984 | * |
985 | * Scan a PCI slot on the specified PCI bus for devices, adding | 985 | * Scan a PCI slot on the specified PCI bus for devices, adding |
986 | * discovered devices to the @bus->devices list. New devices | 986 | * discovered devices to the @bus->devices list. New devices |
987 | * will have an empty dev->global_list head. | 987 | * will not have is_added set. |
988 | */ | 988 | */ |
989 | int pci_scan_slot(struct pci_bus *bus, int devfn) | 989 | int pci_scan_slot(struct pci_bus *bus, int devfn) |
990 | { | 990 | { |
diff --git a/drivers/pci/remove.c b/drivers/pci/remove.c index 9684e1bde277..d3c77cbe3279 100644 --- a/drivers/pci/remove.c +++ b/drivers/pci/remove.c | |||
@@ -18,13 +18,11 @@ static void pci_free_resources(struct pci_dev *dev) | |||
18 | 18 | ||
19 | static void pci_stop_dev(struct pci_dev *dev) | 19 | static void pci_stop_dev(struct pci_dev *dev) |
20 | { | 20 | { |
21 | if (!dev->global_list.next) | 21 | if (dev->is_added) { |
22 | return; | ||
23 | |||
24 | if (!list_empty(&dev->global_list)) { | ||
25 | pci_proc_detach_device(dev); | 22 | pci_proc_detach_device(dev); |
26 | pci_remove_sysfs_dev_files(dev); | 23 | pci_remove_sysfs_dev_files(dev); |
27 | device_unregister(&dev->dev); | 24 | device_unregister(&dev->dev); |
25 | dev->is_added = 0; | ||
28 | down_write(&pci_bus_sem); | 26 | down_write(&pci_bus_sem); |
29 | list_del(&dev->global_list); | 27 | list_del(&dev->global_list); |
30 | dev->global_list.next = dev->global_list.prev = NULL; | 28 | dev->global_list.next = dev->global_list.prev = NULL; |