path: root/arch/arm/mach-cns3xxx/pcie.c
diff options
authorKoen Vandeputte <>2019-01-31 15:00:01 -0600
committerBjorn Helgaas <>2019-01-31 15:01:44 -0600
commit65dbb423cf28232fed1732b779249d6164c5999b (patch)
treef63c6d4344717076b5a0c87abc2de263ebcecc7b /arch/arm/mach-cns3xxx/pcie.c
parenta4ace4fa20072dfe60ab48ba227e50bc2d69c246 (diff)
ARM: cns3xxx: Fix writing to wrong PCI config registers after alignment
Originally, cns3xxx used its own functions for mapping, reading and writing config registers. Commit 802b7c06adc7 ("ARM: cns3xxx: Convert PCI to use generic config accessors") removed the internal PCI config write function in favor of the generic one: cns3xxx_pci_write_config() --> pci_generic_config_write() cns3xxx_pci_write_config() expected aligned addresses, being produced by cns3xxx_pci_map_bus() while the generic one pci_generic_config_write() actually expects the real address as both the function and hardware are capable of byte-aligned writes. This currently leads to pci_generic_config_write() writing to the wrong registers. For instance, upon ath9k module loading: - driver ath9k gets loaded - The driver wants to write value 0xA8 to register PCI_LATENCY_TIMER, located at 0x0D - cns3xxx_pci_map_bus() aligns the address to 0x0C - pci_generic_config_write() effectively writes 0xA8 into register 0x0C (CACHE_LINE_SIZE) Fix the bug by removing the alignment in the cns3xxx mapping function. Fixes: 802b7c06adc7 ("ARM: cns3xxx: Convert PCI to use generic config accessors") Signed-off-by: Koen Vandeputte <> [ updated commit log] Signed-off-by: Lorenzo Pieralisi <> Acked-by: Krzysztof Halasa <> Acked-by: Tim Harvey <> Acked-by: Arnd Bergmann <> CC: # v4.0+ CC: Bjorn Helgaas <> CC: Olof Johansson <> CC: Robin Leblon <> CC: Rob Herring <> CC: Russell King <>
Diffstat (limited to 'arch/arm/mach-cns3xxx/pcie.c')
1 files changed, 1 insertions, 1 deletions
diff --git a/arch/arm/mach-cns3xxx/pcie.c b/arch/arm/mach-cns3xxx/pcie.c
index 318394ed5c7a..5e11ad3164e0 100644
--- a/arch/arm/mach-cns3xxx/pcie.c
+++ b/arch/arm/mach-cns3xxx/pcie.c
@@ -83,7 +83,7 @@ static void __iomem *cns3xxx_pci_map_bus(struct pci_bus *bus,
} else /* remote PCI bus */
base = cnspci->cfg1_regs + ((busno & 0xf) << 20);
- return base + (where & 0xffc) + (devfn << 12);
+ return base + where + (devfn << 12);
static int cns3xxx_pci_read_config(struct pci_bus *bus, unsigned int devfn,