Howdy,
I've been working with a four port PCIe card built from Broadcom 5714 with
a 5704 behind the PCIx bridge that the 5714 externalizes. These cards
are built by Silicom.
When we would run 'ethtool -d' against either of the secondary (ie,
5704's) interfaces, we would get all sorts of nasty PCIe behavior--
on our SN (SGI IA64) platform, this would generate lots of PCI platform
errors and on a Dell 1850 (IA32 w/ PCIe backplane), it would simply hang
the machine.
It appears that the trouble is in the routine tg3_get_regs() which is
reading through undocumented and reserved register space at the offsets
0x5000 and 0x5400 (RX_CPU_BASE and TX_CPU_BASE). In both cases, it was
reading a contiguous chunk of 0x280 words and probably hitting one or
more registers that now have adverse affects when the 5704 is behind
this 5714 bridge. We did not experience the problem when the 5704 is
directly on a PCIx bus. So, it's a sneeky one.
In any case, I offer the following patch which seeks to read only
the documented registers in the RX_CPU_BASE and TX_CPU_BASE regions.
This solved our problem on the test platforms.
----
Prevent tg3_get_regs() from reading reserved and undocumented registers
at RX_CPU_BASE and TX_CPU_BASE offsets which caused hostile behavior
on PCIe platforms.
diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c
--- a/drivers/net/tg3.c
+++ b/drivers/net/tg3.c
@@ -7151,8 +7151,13 @@ do { p = (u32 *)(orig_p + (reg)); \
GET_REG32_LOOP(BUFMGR_MODE, 0x58);
GET_REG32_LOOP(RDMAC_MODE, 0x08);
GET_REG32_LOOP(WDMAC_MODE, 0x08);
- GET_REG32_LOOP(RX_CPU_BASE, 0x280);
- GET_REG32_LOOP(TX_CPU_BASE, 0x280);
+ GET_REG32_LOOP(RX_CPU_MODE, 1);
+ GET_REG32_LOOP(RX_CPU_STATE, 1);
+ GET_REG32_LOOP(RX_CPU_PGMCTR, 1);
+ GET_REG32_LOOP(RX_CPU_HWBKPT, 1);
+ GET_REG32_LOOP(TX_CPU_MODE, 1);
+ GET_REG32_LOOP(TX_CPU_STATE, 1);
+ GET_REG32_LOOP(TX_CPU_PGMCTR, 1);
GET_REG32_LOOP(GRCMBOX_INTERRUPT_0, 0x110);
GET_REG32_LOOP(FTQ_RESET, 0x120);
GET_REG32_LOOP(MSGINT_MODE, 0x0c);
diff --git a/drivers/net/tg3.h b/drivers/net/tg3.h
--- a/drivers/net/tg3.h
+++ b/drivers/net/tg3.h
@@ -1124,7 +1124,15 @@
/* 0x280 --> 0x400 unused */
#define RX_CPU_BASE 0x00005000
+#define RX_CPU_MODE 0x00005000
+#define RX_CPU_STATE 0x00005004
+#define RX_CPU_PGMCTR 0x0000501c
+#define RX_CPU_HWBKPT 0x00005034
+
#define TX_CPU_BASE 0x00005400
+#define TX_CPU_MODE 0x00005400
+#define TX_CPU_STATE 0x00005404
+#define TX_CPU_PGMCTR 0x0000541c
/* Mailboxes */
#define GRCMBOX_INTERRUPT_0 0x00005800 /* 64-bit */
--
Chris Elmquist mailto:[EMAIL PROTECTED] (651)683-3093
Silicon Graphics, Inc. Eagan, MN
-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html