|
@@ -219,6 +219,32 @@ msi_bus_store(struct device *dev, struct device_attribute *attr,
|
|
|
return count;
|
|
|
}
|
|
|
|
|
|
+#ifdef CONFIG_HOTPLUG
|
|
|
+static DEFINE_MUTEX(pci_remove_rescan_mutex);
|
|
|
+static ssize_t bus_rescan_store(struct bus_type *bus, const char *buf,
|
|
|
+ size_t count)
|
|
|
+{
|
|
|
+ unsigned long val;
|
|
|
+ struct pci_bus *b = NULL;
|
|
|
+
|
|
|
+ if (strict_strtoul(buf, 0, &val) < 0)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ if (val) {
|
|
|
+ mutex_lock(&pci_remove_rescan_mutex);
|
|
|
+ while ((b = pci_find_next_bus(b)) != NULL)
|
|
|
+ pci_rescan_bus(b);
|
|
|
+ mutex_unlock(&pci_remove_rescan_mutex);
|
|
|
+ }
|
|
|
+ return count;
|
|
|
+}
|
|
|
+
|
|
|
+struct bus_attribute pci_bus_attrs[] = {
|
|
|
+ __ATTR(rescan, (S_IWUSR|S_IWGRP), NULL, bus_rescan_store),
|
|
|
+ __ATTR_NULL
|
|
|
+};
|
|
|
+#endif
|
|
|
+
|
|
|
struct device_attribute pci_dev_attrs[] = {
|
|
|
__ATTR_RO(resource),
|
|
|
__ATTR_RO(vendor),
|