===================================================================
@@ -74,6 +74,15 @@ Description:
hot-remove the PCI device and any of its children.
Depends on CONFIG_HOTPLUG.
+What: /sys/bus/pci/devices/.../pci_bus/.../rescan
+Date: May 2011
+Contact: Linux PCI developers <linux-pci@vger.kernel.org>
+Description:
+ Writing a non-zero value to this attribute will
+ force a rescan of the bus and all child buses,
+ and re-discover devices removed earlier from this
+ part of the device tree. Depends on CONFIG_HOTPLUG.
+
What: /sys/bus/pci/devices/.../rescan
Date: January 2009
Contact: Linux PCI developers <linux-pci@vger.kernel.org>
===================================================================
@@ -318,6 +318,25 @@ remove_store(struct device *dev, struct
count = ret;
return count;
}
+
+static ssize_t
+dev_bus_rescan_store(struct device *dev, struct device_attribute *attr,
+ const char *buf, size_t count)
+{
+ unsigned long val;
+ struct pci_bus *bus = to_pci_bus(dev);
+
+ if (strict_strtoul(buf, 0, &val) < 0)
+ return -EINVAL;
+
+ if (val) {
+ mutex_lock(&pci_remove_rescan_mutex);
+ pci_rescan_bus(bus);
+ mutex_unlock(&pci_remove_rescan_mutex);
+ }
+ return count;
+}
+
#endif
struct device_attribute pci_dev_attrs[] = {
@@ -346,6 +365,13 @@ struct device_attribute pci_dev_attrs[]
#endif
__ATTR_NULL,
};
+
+struct device_attribute pcibus_attrs[] = {
+#ifdef CONFIG_HOTPLUG
+ __ATTR(rescan, (S_IWUSR|S_IWGRP), NULL, dev_bus_rescan_store),
+#endif
+ __ATTR_NULL,
+};
static ssize_t
boot_vga_show(struct device *dev, struct device_attribute *attr, char *buf)
===================================================================
@@ -160,8 +160,10 @@ extern struct device_attribute dev_attr_
extern struct device_attribute dev_attr_cpulistaffinity;
#ifdef CONFIG_HOTPLUG
extern struct bus_attribute pci_bus_attrs[];
+extern struct device_attribute pcibus_attrs[];
#else
#define pci_bus_attrs NULL
+#define pcibus_attrs NULL
#endif
===================================================================
@@ -95,6 +95,7 @@ static void release_pcibus_dev(struct de
static struct class pcibus_class = {
.name = "pci_bus",
.dev_release = &release_pcibus_dev,
+ .dev_attrs = pcibus_attrs,
};
static int __init pcibus_class_init(void)