diff options
author | Alex Chiang <achiang@hp.com> | 2009-03-20 16:56:41 -0400 |
---|---|---|
committer | Jesse Barnes <jbarnes@virtuousgeek.org> | 2009-03-20 17:59:07 -0400 |
commit | 738a6396c223b486304dda778119dbbca563f019 (patch) | |
tree | ee5f2801ed439d9d969598621de7d2b3ba8f8d0a | |
parent | 77c27c7b49d69d45ccb94e481653f024f1ac6650 (diff) |
PCI: Introduce /sys/bus/pci/devices/.../rescan
This interface allows the user to force a rescan of the device's
parent bus and all subordinate buses, and rediscover devices removed
earlier from this part of the device tree.
Cc: Trent Piepho <xyzzy@speakeasy.org>
Signed-off-by: Alex Chiang <achiang@hp.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
-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 | }; |