diff options
Diffstat (limited to 'drivers/pci/pci-sysfs.c')
| -rw-r--r-- | drivers/pci/pci-sysfs.c | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c index 56ac2bc003c7..bc405c035ce3 100644 --- a/drivers/pci/pci-sysfs.c +++ b/drivers/pci/pci-sysfs.c | |||
| @@ -43,6 +43,29 @@ pci_config_attr(subsystem_vendor, "0x%04x\n"); | |||
| 43 | pci_config_attr(subsystem_device, "0x%04x\n"); | 43 | pci_config_attr(subsystem_device, "0x%04x\n"); |
| 44 | pci_config_attr(class, "0x%06x\n"); | 44 | pci_config_attr(class, "0x%06x\n"); |
| 45 | pci_config_attr(irq, "%u\n"); | 45 | pci_config_attr(irq, "%u\n"); |
| 46 | pci_config_attr(is_enabled, "%u\n"); | ||
| 47 | |||
| 48 | static ssize_t broken_parity_status_show(struct device *dev, | ||
| 49 | struct device_attribute *attr, | ||
| 50 | char *buf) | ||
| 51 | { | ||
| 52 | struct pci_dev *pdev = to_pci_dev(dev); | ||
| 53 | return sprintf (buf, "%u\n", pdev->broken_parity_status); | ||
| 54 | } | ||
| 55 | |||
| 56 | static ssize_t broken_parity_status_store(struct device *dev, | ||
| 57 | struct device_attribute *attr, | ||
| 58 | const char *buf, size_t count) | ||
| 59 | { | ||
| 60 | struct pci_dev *pdev = to_pci_dev(dev); | ||
| 61 | ssize_t consumed = -EINVAL; | ||
| 62 | |||
| 63 | if ((count > 0) && (*buf == '0' || *buf == '1')) { | ||
| 64 | pdev->broken_parity_status = *buf == '1' ? 1 : 0; | ||
| 65 | consumed = count; | ||
| 66 | } | ||
| 67 | return consumed; | ||
| 68 | } | ||
| 46 | 69 | ||
| 47 | static ssize_t local_cpus_show(struct device *dev, | 70 | static ssize_t local_cpus_show(struct device *dev, |
| 48 | struct device_attribute *attr, char *buf) | 71 | struct device_attribute *attr, char *buf) |
| @@ -90,6 +113,25 @@ static ssize_t modalias_show(struct device *dev, struct device_attribute *attr, | |||
| 90 | (u8)(pci_dev->class >> 16), (u8)(pci_dev->class >> 8), | 113 | (u8)(pci_dev->class >> 16), (u8)(pci_dev->class >> 8), |
| 91 | (u8)(pci_dev->class)); | 114 | (u8)(pci_dev->class)); |
| 92 | } | 115 | } |
| 116 | static ssize_t | ||
| 117 | is_enabled_store(struct device *dev, struct device_attribute *attr, | ||
| 118 | const char *buf, size_t count) | ||
| 119 | { | ||
| 120 | struct pci_dev *pdev = to_pci_dev(dev); | ||
| 121 | |||
| 122 | /* this can crash the machine when done on the "wrong" device */ | ||
| 123 | if (!capable(CAP_SYS_ADMIN)) | ||
| 124 | return count; | ||
| 125 | |||
| 126 | if (*buf == '0') | ||
| 127 | pci_disable_device(pdev); | ||
| 128 | |||
| 129 | if (*buf == '1') | ||
| 130 | pci_enable_device(pdev); | ||
| 131 | |||
| 132 | return count; | ||
| 133 | } | ||
| 134 | |||
| 93 | 135 | ||
| 94 | struct device_attribute pci_dev_attrs[] = { | 136 | struct device_attribute pci_dev_attrs[] = { |
| 95 | __ATTR_RO(resource), | 137 | __ATTR_RO(resource), |
| @@ -101,6 +143,9 @@ struct device_attribute pci_dev_attrs[] = { | |||
| 101 | __ATTR_RO(irq), | 143 | __ATTR_RO(irq), |
| 102 | __ATTR_RO(local_cpus), | 144 | __ATTR_RO(local_cpus), |
| 103 | __ATTR_RO(modalias), | 145 | __ATTR_RO(modalias), |
| 146 | __ATTR(enable, 0600, is_enabled_show, is_enabled_store), | ||
| 147 | __ATTR(broken_parity_status,(S_IRUGO|S_IWUSR), | ||
| 148 | broken_parity_status_show,broken_parity_status_store), | ||
| 104 | __ATTR_NULL, | 149 | __ATTR_NULL, |
| 105 | }; | 150 | }; |
| 106 | 151 | ||
