diff options
author | David S. Miller <davem@sunset.davemloft.net> | 2006-02-13 02:49:18 -0500 |
---|---|---|
committer | David S. Miller <davem@sunset.davemloft.net> | 2006-03-20 04:12:36 -0500 |
commit | 059833eb817fec3a5a7f62fba9592749c4cebc73 (patch) | |
tree | 5de088b9200956458ca83afe33335d6ea87c63d6 /arch/sparc64/kernel/pci_sun4v.c | |
parent | 0b522497a176f222ae4cf7e6733a5357352224b2 (diff) |
[SPARC64]: Range check bus number in SUN4V PCI controller driver.
It has to be somewhere in the range from pbm->pci_first_busno to
pbm->pci_last_busno, inclusive.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'arch/sparc64/kernel/pci_sun4v.c')
-rw-r--r-- | arch/sparc64/kernel/pci_sun4v.c | 33 |
1 files changed, 24 insertions, 9 deletions
diff --git a/arch/sparc64/kernel/pci_sun4v.c b/arch/sparc64/kernel/pci_sun4v.c index 7055616e0839..dc79b748feaf 100644 --- a/arch/sparc64/kernel/pci_sun4v.c +++ b/arch/sparc64/kernel/pci_sun4v.c | |||
@@ -514,19 +514,31 @@ struct pci_iommu_ops pci_sun4v_iommu_ops = { | |||
514 | 514 | ||
515 | /* SUN4V PCI configuration space accessors. */ | 515 | /* SUN4V PCI configuration space accessors. */ |
516 | 516 | ||
517 | static inline int pci_sun4v_out_of_range(struct pci_pbm_info *pbm, unsigned int bus) | ||
518 | { | ||
519 | if (bus < pbm->pci_first_busno || | ||
520 | bus > pbm->pci_last_busno) | ||
521 | return 1; | ||
522 | return 0; | ||
523 | } | ||
524 | |||
517 | static int pci_sun4v_read_pci_cfg(struct pci_bus *bus_dev, unsigned int devfn, | 525 | static int pci_sun4v_read_pci_cfg(struct pci_bus *bus_dev, unsigned int devfn, |
518 | int where, int size, u32 *value) | 526 | int where, int size, u32 *value) |
519 | { | 527 | { |
520 | struct pci_pbm_info *pbm = bus_dev->sysdata; | 528 | struct pci_pbm_info *pbm = bus_dev->sysdata; |
521 | unsigned long devhandle = pbm->devhandle; | 529 | u32 devhandle = pbm->devhandle; |
522 | unsigned int bus = bus_dev->number; | 530 | unsigned int bus = bus_dev->number; |
523 | unsigned int device = PCI_SLOT(devfn); | 531 | unsigned int device = PCI_SLOT(devfn); |
524 | unsigned int func = PCI_FUNC(devfn); | 532 | unsigned int func = PCI_FUNC(devfn); |
525 | unsigned long ret; | 533 | unsigned long ret; |
526 | 534 | ||
527 | ret = pci_sun4v_config_get(devhandle, | 535 | if (pci_sun4v_out_of_range(pbm, bus)) { |
528 | HV_PCI_DEVICE_BUILD(bus, device, func), | 536 | ret = ~0UL; |
529 | where, size); | 537 | } else { |
538 | ret = pci_sun4v_config_get(devhandle, | ||
539 | HV_PCI_DEVICE_BUILD(bus, device, func), | ||
540 | where, size); | ||
541 | } | ||
530 | switch (size) { | 542 | switch (size) { |
531 | case 1: | 543 | case 1: |
532 | *value = ret & 0xff; | 544 | *value = ret & 0xff; |
@@ -547,16 +559,19 @@ static int pci_sun4v_write_pci_cfg(struct pci_bus *bus_dev, unsigned int devfn, | |||
547 | int where, int size, u32 value) | 559 | int where, int size, u32 value) |
548 | { | 560 | { |
549 | struct pci_pbm_info *pbm = bus_dev->sysdata; | 561 | struct pci_pbm_info *pbm = bus_dev->sysdata; |
550 | unsigned long devhandle = pbm->devhandle; | 562 | u32 devhandle = pbm->devhandle; |
551 | unsigned int bus = bus_dev->number; | 563 | unsigned int bus = bus_dev->number; |
552 | unsigned int device = PCI_SLOT(devfn); | 564 | unsigned int device = PCI_SLOT(devfn); |
553 | unsigned int func = PCI_FUNC(devfn); | 565 | unsigned int func = PCI_FUNC(devfn); |
554 | unsigned long ret; | 566 | unsigned long ret; |
555 | 567 | ||
556 | ret = pci_sun4v_config_put(devhandle, | 568 | if (pci_sun4v_out_of_range(pbm, bus)) { |
557 | HV_PCI_DEVICE_BUILD(bus, device, func), | 569 | /* Do nothing. */ |
558 | where, size, value); | 570 | } else { |
559 | 571 | ret = pci_sun4v_config_put(devhandle, | |
572 | HV_PCI_DEVICE_BUILD(bus, device, func), | ||
573 | where, size, value); | ||
574 | } | ||
560 | return PCIBIOS_SUCCESSFUL; | 575 | return PCIBIOS_SUCCESSFUL; |
561 | } | 576 | } |
562 | 577 | ||