1
0
mirror of git://projects.qi-hardware.com/openwrt-xburst.git synced 2024-12-24 05:46:30 +02:00

ar71xx: merge pci register read workaround from r24236

git-svn-id: svn://svn.openwrt.org/openwrt/branches/backfire@24240 3c298f89-4303-0410-b956-a3cf2f4a3e73
This commit is contained in:
nbd 2010-12-04 10:31:18 +00:00
parent 1e5d4a13be
commit 87fe054b87

View File

@ -136,6 +136,7 @@ static int ar71xx_pci_read_config(struct pci_bus *bus, unsigned int devfn,
static u32 mask[8] = {0, 0xff, 0xffff, 0, 0xffffffff, 0, 0, 0};
unsigned long flags;
u32 data;
int retry = 0;
int ret;
ret = PCIBIOS_SUCCESSFUL;
@ -143,6 +144,7 @@ static int ar71xx_pci_read_config(struct pci_bus *bus, unsigned int devfn,
DBG("PCI: read config: %02x:%02x.%01x/%02x:%01d\n", bus->number,
PCI_SLOT(devfn), PCI_FUNC(devfn), where, size);
retry:
spin_lock_irqsave(&ar71xx_pci_lock, flags);
if (bus->number == 0 && devfn == 0) {
@ -176,6 +178,14 @@ static int ar71xx_pci_read_config(struct pci_bus *bus, unsigned int devfn,
*value = (data >> (8 * (where & 3))) & mask[size & 7];
/*
* PCI controller bug: sometimes reads to the PCI_COMMAND register
* return 0xffff, even though the PCI trace shows the correct value.
* Work around this by retrying reads to this register
*/
if (where == PCI_COMMAND && (*value & 0xffff) == 0xffff && retry++ < 2)
goto retry;
return ret;
}