diff options
author | Don Fry <brazilnut@us.ibm.com> | 2005-11-01 16:13:35 -0500 |
---|---|---|
committer | Jeff Garzik <jgarzik@pobox.com> | 2005-11-05 14:40:55 -0500 |
commit | 4371dc6c60705815dcfe0c2979f68a26d0b27bd4 (patch) | |
tree | 75a5ca9f987603b20b05fb718324e5edd7165a3e /drivers | |
parent | 2964bbd7048ac0c1405cc119604e29987dd165df (diff) |
[PATCH] pcnet32: Prevent hang with 79c976
Some boards using the 79c976 pcnet32 chip will hang the system if the
ethtool --register-dump is performed with the device operational. The
request to read bcr30 is retried by the PCI device infinitely without
returning data, hanging the system.
Tested ia32 and ppc64.
Signed-off-by: Don Fry <brazilnut@us.ibm.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/pcnet32.c | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/drivers/net/pcnet32.c b/drivers/net/pcnet32.c index 549a07385884..be319229f543 100644 --- a/drivers/net/pcnet32.c +++ b/drivers/net/pcnet32.c | |||
@@ -988,7 +988,11 @@ static void pcnet32_get_regs(struct net_device *dev, struct ethtool_regs *regs, | |||
988 | *buff++ = a->read_csr(ioaddr, 114); | 988 | *buff++ = a->read_csr(ioaddr, 114); |
989 | 989 | ||
990 | /* read bus configuration registers */ | 990 | /* read bus configuration registers */ |
991 | for (i=0; i<36; i++) { | 991 | for (i=0; i<30; i++) { |
992 | *buff++ = a->read_bcr(ioaddr, i); | ||
993 | } | ||
994 | *buff++ = 0; /* skip bcr30 so as not to hang 79C976 */ | ||
995 | for (i=31; i<36; i++) { | ||
992 | *buff++ = a->read_bcr(ioaddr, i); | 996 | *buff++ = a->read_bcr(ioaddr, i); |
993 | } | 997 | } |
994 | 998 | ||