Bug#407217: Multicast broken in r8169 for one version of Thecus N2100
Jon, Sjoerg, Mikhail, Wouter: can one of you please test this kernel
to see if it works on the N2100:
http://merkel.debian.org/~tbm/tmp/kernel/linux-image-2.6.32-trunk-iop32x_2.6.32-4_armel.deb
* Ben Hutchings <ben@decadent.org.uk> [2009-10-16 04:27]:
> I'd like to get this bug fixed in some way for the N2100, either by
> setting all bits in the multicast hash for this specific hardware
> (assuming we can detect it programmatically) or by adjusting the way we
> generate the multicast hash.
>
> Vince, do you have a test for this specific hardware? I know it's MAC
> type 4 (RTL8169SB/RTL8110SB) but this bug seems to be more specific than
> that.
>
> Some time back it was discovered that in MMIO mode the 64-bit address
> registers need to be written high-bits-first on this hardware, because
> writing the high 32 bits clears the low 32 bits. Given that the
> multicast hash table is also a 64-bit register, maybe it suffers from a
> similar bug? It might be worth trying the following change:
>
> --- a/drivers/net/r8169.c
> +++ b/drivers/net/r8169.c
> @@ -3781,8 +3781,18 @@ static void rtl_set_rx_mode(struct net_device *dev)
> mc_filter[1] = swab32(data);
> }
>
> + pr_info("%s: mc_filter = { 0x%08x, 0x%08x }\n", __func__,
> + mc_filter[0], mc_filter[1]);
> +
> RTL_W32(MAR0 + 0, mc_filter[0]);
> RTL_W32(MAR0 + 4, mc_filter[1]);
> + pr_info("%s: MAR = 0x%08lx%08lx\n", __func__,
> + RTL_R32(MAR0 + 4), RTL_R32(MAR0 + 0));
> +
> + RTL_W32(MAR0 + 4, mc_filter[1]);
> + RTL_W32(MAR0 + 0, mc_filter[0]);
> + pr_info("%s: MAR = 0x%08lx%08lx\n", __func__,
> + RTL_R32(MAR0 + 4), RTL_R32(MAR0 + 0));
>
> RTL_W32(RxConfig, tmp);
>
> --- END ---
>
> Ben.
>
> --
> Ben Hutchings
> The most exhausting thing in life is being insincere. - Anne Morrow Lindberg
--
Martin Michlmayr
http://www.cyrius.com/
Reply to: