• Koen Vandeputte's avatar
    ARM: cns3xxx: Fix writing to wrong PCI config registers after alignment · 65dbb423
    Koen Vandeputte authored
    Originally, cns3xxx used its own functions for mapping, reading and
    writing config registers.
    
    Commit 802b7c06 ("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: 802b7c06 ("ARM: cns3xxx: Convert PCI to use generic config accessors")
    Signed-off-by: default avatarKoen Vandeputte <koen.vandeputte@ncentric.com>
    [lorenzo.pieralisi@arm.com: updated commit log]
    Signed-off-by: default avatarLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
    Acked-by: default avatarKrzysztof Halasa <khalasa@piap.pl>
    Acked-by: default avatarTim Harvey <tharvey@gateworks.com>
    Acked-by: default avatarArnd Bergmann <arnd@arndb.de>
    CC: stable@vger.kernel.org	# v4.0+
    CC: Bjorn Helgaas <bhelgaas@google.com>
    CC: Olof Johansson <olof@lixom.net>
    CC: Robin Leblon <robin.leblon@ncentric.com>
    CC: Rob Herring <robh@kernel.org>
    CC: Russell King <linux@armlinux.org.uk>
    65dbb423
pcie.c 8.04 KB