aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pci/pci-sysfs.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/pci/pci-sysfs.c')
-rw-r--r--drivers/pci/pci-sysfs.c44
1 files changed, 43 insertions, 1 deletions
diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c
index 6309c5a2528f..afd2fbf7d797 100644
--- a/drivers/pci/pci-sysfs.c
+++ b/drivers/pci/pci-sysfs.c
@@ -979,7 +979,12 @@ static ssize_t reset_store(struct device *dev,
979 979
980 if (val != 1) 980 if (val != 1)
981 return -EINVAL; 981 return -EINVAL;
982 return pci_reset_function(pdev); 982
983 result = pci_reset_function(pdev);
984 if (result < 0)
985 return result;
986
987 return count;
983} 988}
984 989
985static struct device_attribute reset_attr = __ATTR(reset, 0200, NULL, reset_store); 990static struct device_attribute reset_attr = __ATTR(reset, 0200, NULL, reset_store);
@@ -1030,6 +1035,39 @@ error:
1030 return retval; 1035 return retval;
1031} 1036}
1032 1037
1038static void pci_remove_slot_links(struct pci_dev *dev)
1039{
1040 char func[10];
1041 struct pci_slot *slot;
1042
1043 sysfs_remove_link(&dev->dev.kobj, "slot");
1044 list_for_each_entry(slot, &dev->bus->slots, list) {
1045 if (slot->number != PCI_SLOT(dev->devfn))
1046 continue;
1047 snprintf(func, 10, "function%d", PCI_FUNC(dev->devfn));
1048 sysfs_remove_link(&slot->kobj, func);
1049 }
1050}
1051
1052static int pci_create_slot_links(struct pci_dev *dev)
1053{
1054 int result = 0;
1055 char func[10];
1056 struct pci_slot *slot;
1057
1058 list_for_each_entry(slot, &dev->bus->slots, list) {
1059 if (slot->number != PCI_SLOT(dev->devfn))
1060 continue;
1061 result = sysfs_create_link(&dev->dev.kobj, &slot->kobj, "slot");
1062 if (result)
1063 goto out;
1064 snprintf(func, 10, "function%d", PCI_FUNC(dev->devfn));
1065 result = sysfs_create_link(&slot->kobj, &dev->dev.kobj, func);
1066 }
1067out:
1068 return result;
1069}
1070
1033int __must_check pci_create_sysfs_dev_files (struct pci_dev *pdev) 1071int __must_check pci_create_sysfs_dev_files (struct pci_dev *pdev)
1034{ 1072{
1035 int retval; 1073 int retval;
@@ -1092,6 +1130,8 @@ int __must_check pci_create_sysfs_dev_files (struct pci_dev *pdev)
1092 if (retval) 1130 if (retval)
1093 goto err_vga_file; 1131 goto err_vga_file;
1094 1132
1133 pci_create_slot_links(pdev);
1134
1095 return 0; 1135 return 0;
1096 1136
1097err_vga_file: 1137err_vga_file:
@@ -1141,6 +1181,8 @@ void pci_remove_sysfs_dev_files(struct pci_dev *pdev)
1141 if (!sysfs_initialized) 1181 if (!sysfs_initialized)
1142 return; 1182 return;
1143 1183
1184 pci_remove_slot_links(pdev);
1185
1144 pci_remove_capabilities_sysfs(pdev); 1186 pci_remove_capabilities_sysfs(pdev);
1145 1187
1146 if (pdev->cfg_size < PCI_CFG_SPACE_EXP_SIZE) 1188 if (pdev->cfg_size < PCI_CFG_SPACE_EXP_SIZE)