ACPI: Disable _GTS and _BFS support by default
[safe/jmp/linux-2.6] / drivers / pci / pci-sysfs.c
index e16990e..a7eb1b4 100644 (file)
@@ -148,7 +148,7 @@ static ssize_t is_enabled_store(struct device *dev,
                return -EPERM;
 
        if (!val) {
-               if (atomic_read(&pdev->enable_cnt) != 0)
+               if (pci_is_enabled(pdev))
                        pci_disable_device(pdev);
                else
                        result = -EIO;
@@ -244,6 +244,24 @@ struct bus_attribute pci_bus_attrs[] = {
        __ATTR_NULL
 };
 
+static ssize_t
+dev_rescan_store(struct device *dev, struct device_attribute *attr,
+                const char *buf, size_t count)
+{
+       unsigned long val;
+       struct pci_dev *pdev = to_pci_dev(dev);
+
+       if (strict_strtoul(buf, 0, &val) < 0)
+               return -EINVAL;
+
+       if (val) {
+               mutex_lock(&pci_remove_rescan_mutex);
+               pci_rescan_bus(pdev->bus);
+               mutex_unlock(&pci_remove_rescan_mutex);
+       }
+       return count;
+}
+
 static void remove_callback(struct device *dev)
 {
        struct pci_dev *pdev = to_pci_dev(dev);
@@ -259,14 +277,10 @@ remove_store(struct device *dev, struct device_attribute *dummy,
 {
        int ret = 0;
        unsigned long val;
-       struct pci_dev *pdev = to_pci_dev(dev);
 
        if (strict_strtoul(buf, 0, &val) < 0)
                return -EINVAL;
 
-       if (pci_is_root_bus(pdev->bus))
-               return -EBUSY;
-
        /* An attribute cannot be unregistered by one of its own methods,
         * so we have to use this roundabout approach.
         */
@@ -298,6 +312,7 @@ struct device_attribute pci_dev_attrs[] = {
        __ATTR(msi_bus, 0644, msi_bus_show, msi_bus_store),
 #ifdef CONFIG_HOTPLUG
        __ATTR(remove, (S_IWUSR|S_IWGRP), NULL, remove_store),
+       __ATTR(rescan, (S_IWUSR|S_IWGRP), NULL, dev_rescan_store),
 #endif
        __ATTR_NULL,
 };