提交 353dfe12 编写于 作者: M Matthew Wilcox 提交者: Kyle McMartin

[PARISC] Fix PCI bus numbering in the presence of Cardbus bridges

Firmware ignores Cardbus bridges, so when Linux assigns bus numbers,
it must override firmware's notion of what the busses are numbered.
This is not sufficient to support the Cardbus bridge as there is also
no interrupt routing table entry for them.
Signed-off-by: NMatthew Wilcox <matthew@wil.cx>
Signed-off-by: NKyle McMartin <kyle@parisc-linux.org>
上级 caa451f3
......@@ -1406,13 +1406,20 @@ lba_hw_init(struct lba_device *d)
return 0;
}
/*
* Unfortunately, when firmware numbers busses, it doesn't take into account
* Cardbus bridges. So we have to renumber the busses to suit ourselves.
* Elroy/Mercury don't actually know what bus number they're attached to;
* we use bus 0 to indicate the directly attached bus and any other bus
* number will be taken care of by the PCI-PCI bridge.
*/
static unsigned int lba_next_bus = 0;
/*
** Determine if lba should claim this chip (return 0) or not (return 1).
** If so, initialize the chip and tell other partners in crime they
** have work to do.
*/
* Determine if lba should claim this chip (return 0) or not (return 1).
* If so, initialize the chip and tell other partners in crime they
* have work to do.
*/
static int __init
lba_driver_probe(struct parisc_device *dev)
{
......@@ -1478,9 +1485,7 @@ lba_driver_probe(struct parisc_device *dev)
return -ENODEV;
}
/*
** Tell I/O SAPIC driver we have a IRQ handler/region.
*/
/* Tell I/O SAPIC driver we have a IRQ handler/region. */
tmp_obj = iosapic_register(dev->hpa.start + LBA_IOSAPIC_BASE);
/* NOTE: PCI devices (e.g. 103c:1005 graphics card) which don't
......@@ -1529,16 +1534,17 @@ lba_driver_probe(struct parisc_device *dev)
lba_legacy_resources(dev, lba_dev);
}
/*
** Tell PCI support another PCI bus was found.
** Walks PCI bus for us too.
*/
if (lba_dev->hba.bus_num.start < lba_next_bus)
lba_dev->hba.bus_num.start = lba_next_bus;
dev->dev.platform_data = lba_dev;
lba_bus = lba_dev->hba.hba_bus =
pci_scan_bus_parented(&dev->dev, lba_dev->hba.bus_num.start,
cfg_ops, NULL);
if (lba_bus)
if (lba_bus) {
lba_next_bus = lba_bus->subordinate + 1;
pci_bus_add_devices(lba_bus);
}
/* This is in lieu of calling pci_assign_unassigned_resources() */
if (is_pdc_pat()) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册