Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Alex Chiang and committed by
Jesse Barnes
738a6396 77c27c7b

+29
+10
Documentation/ABI/testing/sysfs-bus-pci
··· 74 74 hot-remove the PCI device and any of its children. 75 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 87 What: /sys/bus/pci/devices/.../vpd 78 88 Date: February 2008 79 89 Contact: Ben Hutchings <bhutchings@solarflare.com>
+19
drivers/pci/pci-sysfs.c
··· 244 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 265 static void remove_callback(struct device *dev) 248 266 { 249 267 struct pci_dev *pdev = to_pci_dev(dev); ··· 316 298 __ATTR(msi_bus, 0644, msi_bus_show, msi_bus_store), 317 299 #ifdef CONFIG_HOTPLUG 318 300 __ATTR(remove, (S_IWUSR|S_IWGRP), NULL, remove_store), 301 + __ATTR(rescan, (S_IWUSR|S_IWGRP), NULL, dev_rescan_store), 319 302 #endif 320 303 __ATTR_NULL, 321 304 };