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:
@@ -347,8 +347,6 @@ static int sriov_enable(struct pci_dev *dev, int nr_virtfn)
|
|||||||
return rc;
|
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;
|
iov->ctrl |= PCI_SRIOV_CTRL_VFE | PCI_SRIOV_CTRL_MSE;
|
||||||
pci_cfg_access_lock(dev);
|
pci_cfg_access_lock(dev);
|
||||||
pci_write_config_word(dev, iov->pos + PCI_SRIOV_CTRL, iov->ctrl);
|
pci_write_config_word(dev, iov->pos + PCI_SRIOV_CTRL, iov->ctrl);
|
||||||
@@ -466,6 +464,7 @@ found:
|
|||||||
return -EIO;
|
return -EIO;
|
||||||
|
|
||||||
pgsz &= ~(pgsz - 1);
|
pgsz &= ~(pgsz - 1);
|
||||||
|
pci_write_config_dword(dev, pos + PCI_SRIOV_SYS_PGSIZE, pgsz);
|
||||||
|
|
||||||
nres = 0;
|
nres = 0;
|
||||||
for (i = 0; i < PCI_SRIOV_NUM_BARS; i++) {
|
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",
|
dev_dbg(&dev->dev, "scanning [bus %02x-%02x] behind bridge, pass %d\n",
|
||||||
secondary, subordinate, pass);
|
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 */
|
/* Check if setup is sensible at all */
|
||||||
if (!pass &&
|
if (!pass &&
|
||||||
(primary != bus->number || secondary <= bus->number)) {
|
(primary != bus->number || secondary <= bus->number)) {
|
||||||
|
@@ -77,6 +77,7 @@ void pci_remove_bus(struct pci_bus *pci_bus)
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL(pci_remove_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
|
* pci_remove_bus_device - remove a PCI device and any children
|
||||||
* @dev: the device to remove
|
* @dev: the device to remove
|
||||||
@@ -94,7 +95,7 @@ static void __pci_remove_bus_device(struct pci_dev *dev)
|
|||||||
if (dev->subordinate) {
|
if (dev->subordinate) {
|
||||||
struct pci_bus *b = dev->subordinate;
|
struct pci_bus *b = dev->subordinate;
|
||||||
|
|
||||||
pci_remove_behind_bridge(dev);
|
__pci_remove_behind_bridge(dev);
|
||||||
pci_remove_bus(b);
|
pci_remove_bus(b);
|
||||||
dev->subordinate = NULL;
|
dev->subordinate = NULL;
|
||||||
}
|
}
|
||||||
@@ -107,6 +108,24 @@ void pci_remove_bus_device(struct pci_dev *dev)
|
|||||||
__pci_remove_bus_device(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
|
* pci_remove_behind_bridge - remove all devices behind a PCI bridge
|
||||||
* @dev: PCI bridge device
|
* @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)
|
void pci_remove_behind_bridge(struct pci_dev *dev)
|
||||||
{
|
{
|
||||||
struct list_head *l, *n;
|
pci_stop_behind_bridge(dev);
|
||||||
|
__pci_remove_behind_bridge(dev);
|
||||||
if (dev->subordinate)
|
|
||||||
list_for_each_safe(l, n, &dev->subordinate->devices)
|
|
||||||
__pci_remove_bus_device(pci_dev_b(l));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void pci_stop_bus_devices(struct pci_bus *bus)
|
static void pci_stop_bus_devices(struct pci_bus *bus)
|
||||||
|
Reference in New Issue
Block a user