aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/parisc/lba_pci.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/parisc/lba_pci.c')
-rw-r--r--drivers/parisc/lba_pci.c26
1 files changed, 15 insertions, 11 deletions
diff --git a/drivers/parisc/lba_pci.c b/drivers/parisc/lba_pci.c
index 052fa230bc77..4f9cf2456f4e 100644
--- a/drivers/parisc/lba_pci.c
+++ b/drivers/parisc/lba_pci.c
@@ -189,8 +189,8 @@ lba_dump_res(struct resource *r, int d)
189 189
190static int lba_device_present(u8 bus, u8 dfn, struct lba_device *d) 190static int lba_device_present(u8 bus, u8 dfn, struct lba_device *d)
191{ 191{
192 u8 first_bus = d->hba.hba_bus->secondary; 192 u8 first_bus = d->hba.hba_bus->busn_res.start;
193 u8 last_sub_bus = d->hba.hba_bus->subordinate; 193 u8 last_sub_bus = d->hba.hba_bus->busn_res.end;
194 194
195 if ((bus < first_bus) || 195 if ((bus < first_bus) ||
196 (bus > last_sub_bus) || 196 (bus > last_sub_bus) ||
@@ -364,7 +364,7 @@ lba_rd_cfg(struct lba_device *d, u32 tok, u8 reg, u32 size)
364static int elroy_cfg_read(struct pci_bus *bus, unsigned int devfn, int pos, int size, u32 *data) 364static int elroy_cfg_read(struct pci_bus *bus, unsigned int devfn, int pos, int size, u32 *data)
365{ 365{
366 struct lba_device *d = LBA_DEV(parisc_walk_tree(bus->bridge)); 366 struct lba_device *d = LBA_DEV(parisc_walk_tree(bus->bridge));
367 u32 local_bus = (bus->parent == NULL) ? 0 : bus->secondary; 367 u32 local_bus = (bus->parent == NULL) ? 0 : bus->busn_res.start;
368 u32 tok = LBA_CFG_TOK(local_bus, devfn); 368 u32 tok = LBA_CFG_TOK(local_bus, devfn);
369 void __iomem *data_reg = d->hba.base_addr + LBA_PCI_CFG_DATA; 369 void __iomem *data_reg = d->hba.base_addr + LBA_PCI_CFG_DATA;
370 370
@@ -380,7 +380,7 @@ static int elroy_cfg_read(struct pci_bus *bus, unsigned int devfn, int pos, int
380 return 0; 380 return 0;
381 } 381 }
382 382
383 if (LBA_SKIP_PROBE(d) && !lba_device_present(bus->secondary, devfn, d)) { 383 if (LBA_SKIP_PROBE(d) && !lba_device_present(bus->busn_res.start, devfn, d)) {
384 DBG_CFG("%s(%x+%2x) -> -1 (b)\n", __func__, tok, pos); 384 DBG_CFG("%s(%x+%2x) -> -1 (b)\n", __func__, tok, pos);
385 /* either don't want to look or know device isn't present. */ 385 /* either don't want to look or know device isn't present. */
386 *data = ~0U; 386 *data = ~0U;
@@ -431,7 +431,7 @@ lba_wr_cfg(struct lba_device *d, u32 tok, u8 reg, u32 data, u32 size)
431static int elroy_cfg_write(struct pci_bus *bus, unsigned int devfn, int pos, int size, u32 data) 431static int elroy_cfg_write(struct pci_bus *bus, unsigned int devfn, int pos, int size, u32 data)
432{ 432{
433 struct lba_device *d = LBA_DEV(parisc_walk_tree(bus->bridge)); 433 struct lba_device *d = LBA_DEV(parisc_walk_tree(bus->bridge));
434 u32 local_bus = (bus->parent == NULL) ? 0 : bus->secondary; 434 u32 local_bus = (bus->parent == NULL) ? 0 : bus->busn_res.start;
435 u32 tok = LBA_CFG_TOK(local_bus,devfn); 435 u32 tok = LBA_CFG_TOK(local_bus,devfn);
436 436
437 if ((pos > 255) || (devfn > 255)) 437 if ((pos > 255) || (devfn > 255))
@@ -444,7 +444,7 @@ static int elroy_cfg_write(struct pci_bus *bus, unsigned int devfn, int pos, int
444 return 0; 444 return 0;
445 } 445 }
446 446
447 if (LBA_SKIP_PROBE(d) && (!lba_device_present(bus->secondary, devfn, d))) { 447 if (LBA_SKIP_PROBE(d) && (!lba_device_present(bus->busn_res.start, devfn, d))) {
448 DBG_CFG("%s(%x+%2x) = 0x%x (b)\n", __func__, tok, pos,data); 448 DBG_CFG("%s(%x+%2x) = 0x%x (b)\n", __func__, tok, pos,data);
449 return 1; /* New Workaround */ 449 return 1; /* New Workaround */
450 } 450 }
@@ -481,7 +481,7 @@ static struct pci_ops elroy_cfg_ops = {
481static int mercury_cfg_read(struct pci_bus *bus, unsigned int devfn, int pos, int size, u32 *data) 481static int mercury_cfg_read(struct pci_bus *bus, unsigned int devfn, int pos, int size, u32 *data)
482{ 482{
483 struct lba_device *d = LBA_DEV(parisc_walk_tree(bus->bridge)); 483 struct lba_device *d = LBA_DEV(parisc_walk_tree(bus->bridge));
484 u32 local_bus = (bus->parent == NULL) ? 0 : bus->secondary; 484 u32 local_bus = (bus->parent == NULL) ? 0 : bus->busn_res.start;
485 u32 tok = LBA_CFG_TOK(local_bus, devfn); 485 u32 tok = LBA_CFG_TOK(local_bus, devfn);
486 void __iomem *data_reg = d->hba.base_addr + LBA_PCI_CFG_DATA; 486 void __iomem *data_reg = d->hba.base_addr + LBA_PCI_CFG_DATA;
487 487
@@ -514,7 +514,7 @@ static int mercury_cfg_write(struct pci_bus *bus, unsigned int devfn, int pos, i
514{ 514{
515 struct lba_device *d = LBA_DEV(parisc_walk_tree(bus->bridge)); 515 struct lba_device *d = LBA_DEV(parisc_walk_tree(bus->bridge));
516 void __iomem *data_reg = d->hba.base_addr + LBA_PCI_CFG_DATA; 516 void __iomem *data_reg = d->hba.base_addr + LBA_PCI_CFG_DATA;
517 u32 local_bus = (bus->parent == NULL) ? 0 : bus->secondary; 517 u32 local_bus = (bus->parent == NULL) ? 0 : bus->busn_res.start;
518 u32 tok = LBA_CFG_TOK(local_bus,devfn); 518 u32 tok = LBA_CFG_TOK(local_bus,devfn);
519 519
520 if ((pos > 255) || (devfn > 255)) 520 if ((pos > 255) || (devfn > 255))
@@ -636,7 +636,7 @@ lba_fixup_bus(struct pci_bus *bus)
636 struct lba_device *ldev = LBA_DEV(parisc_walk_tree(bus->bridge)); 636 struct lba_device *ldev = LBA_DEV(parisc_walk_tree(bus->bridge));
637 637
638 DBG("lba_fixup_bus(0x%p) bus %d platform_data 0x%p\n", 638 DBG("lba_fixup_bus(0x%p) bus %d platform_data 0x%p\n",
639 bus, bus->secondary, bus->bridge->platform_data); 639 bus, (int)bus->busn_res.start, bus->bridge->platform_data);
640 640
641 /* 641 /*
642 ** Properly Setup MMIO resources for this bus. 642 ** Properly Setup MMIO resources for this bus.
@@ -989,6 +989,7 @@ lba_pat_resources(struct parisc_device *pa_dev, struct lba_device *lba_dev)
989 case PAT_PBNUM: 989 case PAT_PBNUM:
990 lba_dev->hba.bus_num.start = p->start; 990 lba_dev->hba.bus_num.start = p->start;
991 lba_dev->hba.bus_num.end = p->end; 991 lba_dev->hba.bus_num.end = p->end;
992 lba_dev->hba.bus_num.flags = IORESOURCE_BUS;
992 break; 993 break;
993 994
994 case PAT_LMMIO: 995 case PAT_LMMIO:
@@ -1366,6 +1367,7 @@ lba_driver_probe(struct parisc_device *dev)
1366 void *tmp_obj; 1367 void *tmp_obj;
1367 char *version; 1368 char *version;
1368 void __iomem *addr = ioremap_nocache(dev->hpa.start, 4096); 1369 void __iomem *addr = ioremap_nocache(dev->hpa.start, 4096);
1370 int max;
1369 1371
1370 /* Read HW Rev First */ 1372 /* Read HW Rev First */
1371 func_class = READ_REG32(addr + LBA_FCLASS); 1373 func_class = READ_REG32(addr + LBA_FCLASS);
@@ -1502,6 +1504,8 @@ lba_driver_probe(struct parisc_device *dev)
1502 if (lba_dev->hba.gmmio_space.flags) 1504 if (lba_dev->hba.gmmio_space.flags)
1503 pci_add_resource(&resources, &lba_dev->hba.gmmio_space); 1505 pci_add_resource(&resources, &lba_dev->hba.gmmio_space);
1504 1506
1507 pci_add_resource(&resources, &lba_dev->hba.bus_num);
1508
1505 dev->dev.platform_data = lba_dev; 1509 dev->dev.platform_data = lba_dev;
1506 lba_bus = lba_dev->hba.hba_bus = 1510 lba_bus = lba_dev->hba.hba_bus =
1507 pci_create_root_bus(&dev->dev, lba_dev->hba.bus_num.start, 1511 pci_create_root_bus(&dev->dev, lba_dev->hba.bus_num.start,
@@ -1511,7 +1515,7 @@ lba_driver_probe(struct parisc_device *dev)
1511 return 0; 1515 return 0;
1512 } 1516 }
1513 1517
1514 lba_bus->subordinate = pci_scan_child_bus(lba_bus); 1518 max = pci_scan_child_bus(lba_bus);
1515 1519
1516 /* This is in lieu of calling pci_assign_unassigned_resources() */ 1520 /* This is in lieu of calling pci_assign_unassigned_resources() */
1517 if (is_pdc_pat()) { 1521 if (is_pdc_pat()) {
@@ -1541,7 +1545,7 @@ lba_driver_probe(struct parisc_device *dev)
1541 lba_dev->flags |= LBA_FLAG_SKIP_PROBE; 1545 lba_dev->flags |= LBA_FLAG_SKIP_PROBE;
1542 } 1546 }
1543 1547
1544 lba_next_bus = lba_bus->subordinate + 1; 1548 lba_next_bus = max + 1;
1545 pci_bus_add_devices(lba_bus); 1549 pci_bus_add_devices(lba_bus);
1546 1550
1547 /* Whew! Finally done! Tell services we got this one covered. */ 1551 /* Whew! Finally done! Tell services we got this one covered. */