Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jbarnes/pci
One regression fix for SR-IOV on PPC and a couple of misc fixes from Yinghai. * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jbarnes/pci: PCI: Fix pci cardbus removal PCI: set pci sriov page size before reading SRIOV BAR PCI: workaround hard-wired bus number V2
This commit is contained in:
commit
7bcd5b4671
3 changed files with 28 additions and 8 deletions
|
@ -347,8 +347,6 @@ static int sriov_enable(struct pci_dev *dev, int nr_virtfn)
|
|||
return rc;
|
||||
}
|
||||
|
||||
pci_write_config_dword(dev, iov->pos + PCI_SRIOV_SYS_PGSIZE, iov->pgsz);
|
||||
|
||||
iov->ctrl |= PCI_SRIOV_CTRL_VFE | PCI_SRIOV_CTRL_MSE;
|
||||
pci_cfg_access_lock(dev);
|
||||
pci_write_config_word(dev, iov->pos + PCI_SRIOV_CTRL, iov->ctrl);
|
||||
|
@ -466,6 +464,7 @@ static int sriov_init(struct pci_dev *dev, int pos)
|
|||
return -EIO;
|
||||
|
||||
pgsz &= ~(pgsz - 1);
|
||||
pci_write_config_dword(dev, pos + PCI_SRIOV_SYS_PGSIZE, pgsz);
|
||||
|
||||
nres = 0;
|
||||
for (i = 0; i < PCI_SRIOV_NUM_BARS; i++) {
|
||||
|
|
|
@ -651,6 +651,11 @@ int __devinit pci_scan_bridge(struct pci_bus *bus, struct pci_dev *dev, int max,
|
|||
dev_dbg(&dev->dev, "scanning [bus %02x-%02x] behind bridge, pass %d\n",
|
||||
secondary, subordinate, pass);
|
||||
|
||||
if (!primary && (primary != bus->number) && secondary && subordinate) {
|
||||
dev_warn(&dev->dev, "Primary bus is hard wired to 0\n");
|
||||
primary = bus->number;
|
||||
}
|
||||
|
||||
/* Check if setup is sensible at all */
|
||||
if (!pass &&
|
||||
(primary != bus->number || secondary <= bus->number)) {
|
||||
|
|
|
@ -77,6 +77,7 @@ void pci_remove_bus(struct pci_bus *pci_bus)
|
|||
}
|
||||
EXPORT_SYMBOL(pci_remove_bus);
|
||||
|
||||
static void __pci_remove_behind_bridge(struct pci_dev *dev);
|
||||
/**
|
||||
* pci_remove_bus_device - remove a PCI device and any children
|
||||
* @dev: the device to remove
|
||||
|
@ -94,7 +95,7 @@ static void __pci_remove_bus_device(struct pci_dev *dev)
|
|||
if (dev->subordinate) {
|
||||
struct pci_bus *b = dev->subordinate;
|
||||
|
||||
pci_remove_behind_bridge(dev);
|
||||
__pci_remove_behind_bridge(dev);
|
||||
pci_remove_bus(b);
|
||||
dev->subordinate = NULL;
|
||||
}
|
||||
|
@ -107,6 +108,24 @@ void pci_remove_bus_device(struct pci_dev *dev)
|
|||
__pci_remove_bus_device(dev);
|
||||
}
|
||||
|
||||
static void __pci_remove_behind_bridge(struct pci_dev *dev)
|
||||
{
|
||||
struct list_head *l, *n;
|
||||
|
||||
if (dev->subordinate)
|
||||
list_for_each_safe(l, n, &dev->subordinate->devices)
|
||||
__pci_remove_bus_device(pci_dev_b(l));
|
||||
}
|
||||
|
||||
static void pci_stop_behind_bridge(struct pci_dev *dev)
|
||||
{
|
||||
struct list_head *l, *n;
|
||||
|
||||
if (dev->subordinate)
|
||||
list_for_each_safe(l, n, &dev->subordinate->devices)
|
||||
pci_stop_bus_device(pci_dev_b(l));
|
||||
}
|
||||
|
||||
/**
|
||||
* pci_remove_behind_bridge - remove all devices behind a PCI bridge
|
||||
* @dev: PCI bridge device
|
||||
|
@ -117,11 +136,8 @@ void pci_remove_bus_device(struct pci_dev *dev)
|
|||
*/
|
||||
void pci_remove_behind_bridge(struct pci_dev *dev)
|
||||
{
|
||||
struct list_head *l, *n;
|
||||
|
||||
if (dev->subordinate)
|
||||
list_for_each_safe(l, n, &dev->subordinate->devices)
|
||||
__pci_remove_bus_device(pci_dev_b(l));
|
||||
pci_stop_behind_bridge(dev);
|
||||
__pci_remove_behind_bridge(dev);
|
||||
}
|
||||
|
||||
static void pci_stop_bus_devices(struct pci_bus *bus)
|
||||
|
|
Loading…
Reference in a new issue