diff options
| -rw-r--r-- | arch/x86_64/kernel/pci-calgary.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/arch/x86_64/kernel/pci-calgary.c b/arch/x86_64/kernel/pci-calgary.c index 1100031528dc..3c0c7fde09d8 100644 --- a/arch/x86_64/kernel/pci-calgary.c +++ b/arch/x86_64/kernel/pci-calgary.c | |||
| @@ -790,7 +790,16 @@ static inline unsigned int __init locate_register_space(struct pci_dev *dev) | |||
| 790 | int rionodeid; | 790 | int rionodeid; |
| 791 | u32 address; | 791 | u32 address; |
| 792 | 792 | ||
| 793 | rionodeid = (dev->bus->number % 15 > 4) ? 3 : 2; | 793 | /* |
| 794 | * Each Calgary has four busses. The first four busses (first Calgary) | ||
| 795 | * have RIO node ID 2, then the next four (second Calgary) have RIO | ||
| 796 | * node ID 3, the next four (third Calgary) have node ID 2 again, etc. | ||
| 797 | * We use a gross hack - relying on the dev->bus->number ordering, | ||
| 798 | * modulo 14 - to decide which Calgary a given bus is on. Busses 0, 1, | ||
| 799 | * 2 and 4 are on the first Calgary (id 2), 6, 8, a and c are on the | ||
| 800 | * second (id 3), and then it repeats modulo 14. | ||
| 801 | */ | ||
| 802 | rionodeid = (dev->bus->number % 14 > 4) ? 3 : 2; | ||
| 794 | /* | 803 | /* |
| 795 | * register space address calculation as follows: | 804 | * register space address calculation as follows: |
| 796 | * FE0MB-8MB*OneBasedChassisNumber+1MB*(RioNodeId-ChassisBase) | 805 | * FE0MB-8MB*OneBasedChassisNumber+1MB*(RioNodeId-ChassisBase) |
| @@ -798,7 +807,7 @@ static inline unsigned int __init locate_register_space(struct pci_dev *dev) | |||
| 798 | * RioNodeId is 2 for first Calgary, 3 for second Calgary | 807 | * RioNodeId is 2 for first Calgary, 3 for second Calgary |
| 799 | */ | 808 | */ |
| 800 | address = START_ADDRESS - | 809 | address = START_ADDRESS - |
| 801 | (0x800000 * (ONE_BASED_CHASSIS_NUM + dev->bus->number / 15)) + | 810 | (0x800000 * (ONE_BASED_CHASSIS_NUM + dev->bus->number / 14)) + |
| 802 | (0x100000) * (rionodeid - CHASSIS_BASE); | 811 | (0x100000) * (rionodeid - CHASSIS_BASE); |
| 803 | return address; | 812 | return address; |
| 804 | } | 813 | } |
