diff options
| -rw-r--r-- | Documentation/ABI/testing/sysfs-bus-pci | 10 | ||||
| -rw-r--r-- | drivers/pci/pci-sysfs.c | 19 |
2 files changed, 29 insertions, 0 deletions
diff --git a/Documentation/ABI/testing/sysfs-bus-pci b/Documentation/ABI/testing/sysfs-bus-pci index daa791a9e85e..97ad190e13af 100644 --- a/Documentation/ABI/testing/sysfs-bus-pci +++ b/Documentation/ABI/testing/sysfs-bus-pci | |||
| @@ -74,6 +74,16 @@ Description: | |||
| 74 | hot-remove the PCI device and any of its children. | 74 | hot-remove the PCI device and any of its children. |
| 75 | Depends on CONFIG_HOTPLUG. | 75 | Depends on CONFIG_HOTPLUG. |
| 76 | 76 | ||
| 77 | What: /sys/bus/pci/devices/.../rescan | ||
| 78 | Date: January 2009 | ||
| 79 | Contact: Linux PCI developers <linux-pci@vger.kernel.org> | ||
| 80 | Description: | ||
| 81 | Writing a non-zero value to this attribute will | ||
| 82 | force a rescan of the device's parent bus and all | ||
| 83 | child buses, and re-discover devices removed earlier | ||
| 84 | from this part of the device tree. | ||
| 85 | Depends on CONFIG_HOTPLUG. | ||
| 86 | |||
| 77 | What: /sys/bus/pci/devices/.../vpd | 87 | What: /sys/bus/pci/devices/.../vpd |
| 78 | Date: February 2008 | 88 | Date: February 2008 |
| 79 | Contact: Ben Hutchings <bhutchings@solarflare.com> | 89 | Contact: Ben Hutchings <bhutchings@solarflare.com> |
diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c index e16990ecc024..e9a8706a6401 100644 --- a/drivers/pci/pci-sysfs.c +++ b/drivers/pci/pci-sysfs.c | |||
| @@ -244,6 +244,24 @@ struct bus_attribute pci_bus_attrs[] = { | |||
| 244 | __ATTR_NULL | 244 | __ATTR_NULL |
| 245 | }; | 245 | }; |
| 246 | 246 | ||
| 247 | static ssize_t | ||
| 248 | dev_rescan_store(struct device *dev, struct device_attribute *attr, | ||
| 249 | const char *buf, size_t count) | ||
| 250 | { | ||
| 251 | unsigned long val; | ||
| 252 | struct pci_dev *pdev = to_pci_dev(dev); | ||
| 253 | |||
| 254 | if (strict_strtoul(buf, 0, &val) < 0) | ||
| 255 | return -EINVAL; | ||
| 256 | |||
| 257 | if (val) { | ||
| 258 | mutex_lock(&pci_remove_rescan_mutex); | ||
| 259 | pci_rescan_bus(pdev->bus); | ||
| 260 | mutex_unlock(&pci_remove_rescan_mutex); | ||
| 261 | } | ||
| 262 | return count; | ||
| 263 | } | ||
| 264 | |||
| 247 | static void remove_callback(struct device *dev) | 265 | static void remove_callback(struct device *dev) |
| 248 | { | 266 | { |
| 249 | struct pci_dev *pdev = to_pci_dev(dev); | 267 | struct pci_dev *pdev = to_pci_dev(dev); |
| @@ -298,6 +316,7 @@ struct device_attribute pci_dev_attrs[] = { | |||
| 298 | __ATTR(msi_bus, 0644, msi_bus_show, msi_bus_store), | 316 | __ATTR(msi_bus, 0644, msi_bus_show, msi_bus_store), |
| 299 | #ifdef CONFIG_HOTPLUG | 317 | #ifdef CONFIG_HOTPLUG |
| 300 | __ATTR(remove, (S_IWUSR|S_IWGRP), NULL, remove_store), | 318 | __ATTR(remove, (S_IWUSR|S_IWGRP), NULL, remove_store), |
| 319 | __ATTR(rescan, (S_IWUSR|S_IWGRP), NULL, dev_rescan_store), | ||
| 301 | #endif | 320 | #endif |
| 302 | __ATTR_NULL, | 321 | __ATTR_NULL, |
| 303 | }; | 322 | }; |
