diff options
Diffstat (limited to 'drivers/pci/pci.c')
| -rw-r--r-- | drivers/pci/pci.c | 30 | 
1 files changed, 20 insertions, 10 deletions
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index e8ccf6c0f08a..b127fbda6fc8 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c @@ -1148,15 +1148,19 @@ int pci_reenable_device(struct pci_dev *dev)  static void pci_enable_bridge(struct pci_dev *dev)  { +	struct pci_dev *bridge;  	int retval; -	if (!dev) -		return; - -	pci_enable_bridge(dev->bus->self); +	bridge = pci_upstream_bridge(dev); +	if (bridge) +		pci_enable_bridge(bridge); -	if (pci_is_enabled(dev)) +	if (pci_is_enabled(dev)) { +		if (!dev->is_busmaster) +			pci_set_master(dev);  		return; +	} +  	retval = pci_enable_device(dev);  	if (retval)  		dev_err(&dev->dev, "Error enabling bridge (%d), continuing\n", @@ -1166,6 +1170,7 @@ static void pci_enable_bridge(struct pci_dev *dev)  static int pci_enable_device_flags(struct pci_dev *dev, unsigned long flags)  { +	struct pci_dev *bridge;  	int err;  	int i, bars = 0; @@ -1184,7 +1189,9 @@ static int pci_enable_device_flags(struct pci_dev *dev, unsigned long flags)  	if (atomic_inc_return(&dev->enable_cnt) > 1)  		return 0;		/* already enabled */ -	pci_enable_bridge(dev->bus->self); +	bridge = pci_upstream_bridge(dev); +	if (bridge) +		pci_enable_bridge(bridge);  	/* only skip sriov related */  	for (i = 0; i <= PCI_ROM_RESOURCE; i++) @@ -1638,8 +1645,10 @@ void pci_pme_active(struct pci_dev *dev, bool enable)  		if (enable) {  			pme_dev = kmalloc(sizeof(struct pci_pme_device),  					  GFP_KERNEL); -			if (!pme_dev) -				goto out; +			if (!pme_dev) { +				dev_warn(&dev->dev, "can't enable PME#\n"); +				return; +			}  			pme_dev->dev = dev;  			mutex_lock(&pci_pme_list_mutex);  			list_add(&pme_dev->list, &pci_pme_list); @@ -1660,7 +1669,6 @@ void pci_pme_active(struct pci_dev *dev, bool enable)  		}  	} -out:  	dev_dbg(&dev->dev, "PME# %s\n", enable ? "enabled" : "disabled");  } @@ -2854,7 +2862,7 @@ void __weak pcibios_set_master(struct pci_dev *dev)  		lat = pcibios_max_latency;  	else  		return; -	dev_printk(KERN_DEBUG, &dev->dev, "setting latency timer to %d\n", lat); +  	pci_write_config_byte(dev, PCI_LATENCY_TIMER, lat);  } @@ -3972,6 +3980,7 @@ int pcie_get_mps(struct pci_dev *dev)  	return 128 << ((ctl & PCI_EXP_DEVCTL_PAYLOAD) >> 5);  } +EXPORT_SYMBOL(pcie_get_mps);  /**   * pcie_set_mps - set PCI Express maximum payload size @@ -3996,6 +4005,7 @@ int pcie_set_mps(struct pci_dev *dev, int mps)  	return pcie_capability_clear_and_set_word(dev, PCI_EXP_DEVCTL,  						  PCI_EXP_DEVCTL_PAYLOAD, v);  } +EXPORT_SYMBOL(pcie_set_mps);  /**   * pcie_get_minimum_link - determine minimum link settings of a PCI device  |