diff options
author | Nathan Lynch <ntl@pobox.com> | 2007-08-08 20:50:44 -0400 |
---|---|---|
committer | Paul Mackerras <paulus@samba.org> | 2007-08-16 21:01:53 -0400 |
commit | 1bdb2867e5f0bca7c94f7df92f23fdd20524a488 (patch) | |
tree | eecb27269188c1cb846400b45a309afb6723df43 | |
parent | 96b952dd4b8aaa752b6086ad8bcaf2af23729b5f (diff) |
[POWERPC] Remove gratuitous reads from maple PCI config space methods
The maple PCI configuration space write methods read the written
location immediately after the write is performed, presumably in order
to flush the write. However, configuration space writes are not
allowed to be posted, making these reads gratuitous. Furthermore,
this behavior potentially causes us to violate the PCI PM spec when
changing between e.g. D0 and D3 states, because a delay of up to 10ms
may be required before the OS accesses configuration space after the
write which initiates the transition. It definitely causes a system
hang for me with a Broadcom 5721 PCIE network adapter, which is fixed
by this change.
Therefore this removes the gratuitous reads from u3_agp_write_config,
u3_ht_write_config, and u4_pcie_write_config.
Signed-off-by: Nathan Lynch <ntl@pobox.com>
Acked-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: Paul Mackerras <paulus@samba.org>
-rw-r--r-- | arch/powerpc/platforms/maple/pci.c | 9 |
1 files changed, 0 insertions, 9 deletions
diff --git a/arch/powerpc/platforms/maple/pci.c b/arch/powerpc/platforms/maple/pci.c index 2542403288f9..b095eaabf623 100644 --- a/arch/powerpc/platforms/maple/pci.c +++ b/arch/powerpc/platforms/maple/pci.c | |||
@@ -169,15 +169,12 @@ static int u3_agp_write_config(struct pci_bus *bus, unsigned int devfn, | |||
169 | switch (len) { | 169 | switch (len) { |
170 | case 1: | 170 | case 1: |
171 | out_8(addr, val); | 171 | out_8(addr, val); |
172 | (void) in_8(addr); | ||
173 | break; | 172 | break; |
174 | case 2: | 173 | case 2: |
175 | out_le16(addr, val); | 174 | out_le16(addr, val); |
176 | (void) in_le16(addr); | ||
177 | break; | 175 | break; |
178 | default: | 176 | default: |
179 | out_le32(addr, val); | 177 | out_le32(addr, val); |
180 | (void) in_le32(addr); | ||
181 | break; | 178 | break; |
182 | } | 179 | } |
183 | return PCIBIOS_SUCCESSFUL; | 180 | return PCIBIOS_SUCCESSFUL; |
@@ -268,15 +265,12 @@ static int u3_ht_write_config(struct pci_bus *bus, unsigned int devfn, | |||
268 | switch (len) { | 265 | switch (len) { |
269 | case 1: | 266 | case 1: |
270 | out_8(addr, val); | 267 | out_8(addr, val); |
271 | (void) in_8(addr); | ||
272 | break; | 268 | break; |
273 | case 2: | 269 | case 2: |
274 | out_le16(addr, val); | 270 | out_le16(addr, val); |
275 | (void) in_le16(addr); | ||
276 | break; | 271 | break; |
277 | default: | 272 | default: |
278 | out_le32(addr, val); | 273 | out_le32(addr, val); |
279 | (void) in_le32(addr); | ||
280 | break; | 274 | break; |
281 | } | 275 | } |
282 | return PCIBIOS_SUCCESSFUL; | 276 | return PCIBIOS_SUCCESSFUL; |
@@ -376,15 +370,12 @@ static int u4_pcie_write_config(struct pci_bus *bus, unsigned int devfn, | |||
376 | switch (len) { | 370 | switch (len) { |
377 | case 1: | 371 | case 1: |
378 | out_8(addr, val); | 372 | out_8(addr, val); |
379 | (void) in_8(addr); | ||
380 | break; | 373 | break; |
381 | case 2: | 374 | case 2: |
382 | out_le16(addr, val); | 375 | out_le16(addr, val); |
383 | (void) in_le16(addr); | ||
384 | break; | 376 | break; |
385 | default: | 377 | default: |
386 | out_le32(addr, val); | 378 | out_le32(addr, val); |
387 | (void) in_le32(addr); | ||
388 | break; | 379 | break; |
389 | } | 380 | } |
390 | return PCIBIOS_SUCCESSFUL; | 381 | return PCIBIOS_SUCCESSFUL; |