aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pci/pci.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/pci/pci.c')
-rw-r--r--drivers/pci/pci.c28
1 files changed, 16 insertions, 12 deletions
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
index bdd64b1b4817..b127fbda6fc8 100644
--- a/drivers/pci/pci.c
+++ b/drivers/pci/pci.c
@@ -1148,18 +1148,16 @@ int pci_reenable_device(struct pci_dev *dev)
1148 1148
1149static void pci_enable_bridge(struct pci_dev *dev) 1149static void pci_enable_bridge(struct pci_dev *dev)
1150{ 1150{
1151 struct pci_dev *bridge;
1151 int retval; 1152 int retval;
1152 1153
1153 if (!dev) 1154 bridge = pci_upstream_bridge(dev);
1154 return; 1155 if (bridge)
1155 1156 pci_enable_bridge(bridge);
1156 pci_enable_bridge(dev->bus->self);
1157 1157
1158 if (pci_is_enabled(dev)) { 1158 if (pci_is_enabled(dev)) {
1159 if (!dev->is_busmaster) { 1159 if (!dev->is_busmaster)
1160 dev_warn(&dev->dev, "driver skip pci_set_master, fix it!\n");
1161 pci_set_master(dev); 1160 pci_set_master(dev);
1162 }
1163 return; 1161 return;
1164 } 1162 }
1165 1163
@@ -1172,6 +1170,7 @@ static void pci_enable_bridge(struct pci_dev *dev)
1172 1170
1173static int pci_enable_device_flags(struct pci_dev *dev, unsigned long flags) 1171static int pci_enable_device_flags(struct pci_dev *dev, unsigned long flags)
1174{ 1172{
1173 struct pci_dev *bridge;
1175 int err; 1174 int err;
1176 int i, bars = 0; 1175 int i, bars = 0;
1177 1176
@@ -1190,7 +1189,9 @@ static int pci_enable_device_flags(struct pci_dev *dev, unsigned long flags)
1190 if (atomic_inc_return(&dev->enable_cnt) > 1) 1189 if (atomic_inc_return(&dev->enable_cnt) > 1)
1191 return 0; /* already enabled */ 1190 return 0; /* already enabled */
1192 1191
1193 pci_enable_bridge(dev->bus->self); 1192 bridge = pci_upstream_bridge(dev);
1193 if (bridge)
1194 pci_enable_bridge(bridge);
1194 1195
1195 /* only skip sriov related */ 1196 /* only skip sriov related */
1196 for (i = 0; i <= PCI_ROM_RESOURCE; i++) 1197 for (i = 0; i <= PCI_ROM_RESOURCE; i++)
@@ -1644,8 +1645,10 @@ void pci_pme_active(struct pci_dev *dev, bool enable)
1644 if (enable) { 1645 if (enable) {
1645 pme_dev = kmalloc(sizeof(struct pci_pme_device), 1646 pme_dev = kmalloc(sizeof(struct pci_pme_device),
1646 GFP_KERNEL); 1647 GFP_KERNEL);
1647 if (!pme_dev) 1648 if (!pme_dev) {
1648 goto out; 1649 dev_warn(&dev->dev, "can't enable PME#\n");
1650 return;
1651 }
1649 pme_dev->dev = dev; 1652 pme_dev->dev = dev;
1650 mutex_lock(&pci_pme_list_mutex); 1653 mutex_lock(&pci_pme_list_mutex);
1651 list_add(&pme_dev->list, &pci_pme_list); 1654 list_add(&pme_dev->list, &pci_pme_list);
@@ -1666,7 +1669,6 @@ void pci_pme_active(struct pci_dev *dev, bool enable)
1666 } 1669 }
1667 } 1670 }
1668 1671
1669out:
1670 dev_dbg(&dev->dev, "PME# %s\n", enable ? "enabled" : "disabled"); 1672 dev_dbg(&dev->dev, "PME# %s\n", enable ? "enabled" : "disabled");
1671} 1673}
1672 1674
@@ -2860,7 +2862,7 @@ void __weak pcibios_set_master(struct pci_dev *dev)
2860 lat = pcibios_max_latency; 2862 lat = pcibios_max_latency;
2861 else 2863 else
2862 return; 2864 return;
2863 dev_printk(KERN_DEBUG, &dev->dev, "setting latency timer to %d\n", lat); 2865
2864 pci_write_config_byte(dev, PCI_LATENCY_TIMER, lat); 2866 pci_write_config_byte(dev, PCI_LATENCY_TIMER, lat);
2865} 2867}
2866 2868
@@ -3978,6 +3980,7 @@ int pcie_get_mps(struct pci_dev *dev)
3978 3980
3979 return 128 << ((ctl & PCI_EXP_DEVCTL_PAYLOAD) >> 5); 3981 return 128 << ((ctl & PCI_EXP_DEVCTL_PAYLOAD) >> 5);
3980} 3982}
3983EXPORT_SYMBOL(pcie_get_mps);
3981 3984
3982/** 3985/**
3983 * pcie_set_mps - set PCI Express maximum payload size 3986 * pcie_set_mps - set PCI Express maximum payload size
@@ -4002,6 +4005,7 @@ int pcie_set_mps(struct pci_dev *dev, int mps)
4002 return pcie_capability_clear_and_set_word(dev, PCI_EXP_DEVCTL, 4005 return pcie_capability_clear_and_set_word(dev, PCI_EXP_DEVCTL,
4003 PCI_EXP_DEVCTL_PAYLOAD, v); 4006 PCI_EXP_DEVCTL_PAYLOAD, v);
4004} 4007}
4008EXPORT_SYMBOL(pcie_set_mps);
4005 4009
4006/** 4010/**
4007 * pcie_get_minimum_link - determine minimum link settings of a PCI device 4011 * pcie_get_minimum_link - determine minimum link settings of a PCI device