On Tue, 2005-12-20 at 14:09 -0600, Chris Elmquist wrote:
> 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.
Yes, reading the reserved registers will cause timeouts on the PCIE bus
and that will likely hang or cause NMIs.
>
> 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.
I ACK this patch. But you should probably use GET_REG32_1() on the
individual registers instead of GET_REG32_LOOP().
Thanks.
>
> ----
>
> 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 */
>
-
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