From 610fc4606f057bab9cf6f1c530e8d97f3966f0ae Mon Sep 17 00:00:00 2001 From: Sepherosa Ziehau Date: Mon, 15 Jan 2007 12:53:26 +0000 Subject: [PATCH] By default do not enable hardware csum on PCIe re(4), which trashes packets intermittently if csum offload is enabled. This problem does not seem to plague PCI re(4). The pattern of trashed packets is not yet identified. From the tcpdump information provided by Joe, the packets' size should not be the direct cause. Hardware bug? Reported-by: Joe Talbott (RTL8101E, PCIe re(4)) # Same problem is reported to FreeBSD by two RTL8168B(PCIe re(4)) users. --- sys/dev/netif/re/if_re.c | 29 ++++++++++++++++++----------- sys/dev/netif/re/if_revar.h | 3 ++- 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/sys/dev/netif/re/if_re.c b/sys/dev/netif/re/if_re.c index ebec765881..931441e732 100644 --- a/sys/dev/netif/re/if_re.c +++ b/sys/dev/netif/re/if_re.c @@ -33,7 +33,7 @@ * THE POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD: src/sys/dev/re/if_re.c,v 1.25 2004/06/09 14:34:01 naddy Exp $ - * $DragonFly: src/sys/dev/netif/re/if_re.c,v 1.29 2006/12/23 03:41:55 sephe Exp $ + * $DragonFly: src/sys/dev/netif/re/if_re.c,v 1.30 2007/01/15 12:53:26 sephe Exp $ */ /* @@ -149,10 +149,6 @@ #include #include -/* - * The hardware supports checksumming but, as usual, some chipsets screw it - * all up and produce bogus packets, so we disable it by default. - */ #define RE_CSUM_FEATURES (CSUM_IP | CSUM_TCP | CSUM_UDP) #if 0 #define RE_DISABLE_HWCSUM @@ -193,15 +189,15 @@ static const struct re_type re_devs[] = { static const struct re_hwrev re_hwrevs[] = { { RE_HWREV_8139CPLUS, RE_8139CPLUS, RE_F_HASMPC, "C+" }, - { RE_HWREV_8168_SPIN1, RE_8169, 0, "8168" }, - { RE_HWREV_8168_SPIN2, RE_8169, 0, "8168" }, + { RE_HWREV_8168_SPIN1, RE_8169, RE_F_PCIE, "8168" }, + { RE_HWREV_8168_SPIN2, RE_8169, RE_F_PCIE, "8168" }, { RE_HWREV_8169, RE_8169, RE_F_HASMPC, "8169" }, { RE_HWREV_8169S, RE_8169, RE_F_HASMPC, "8169S" }, { RE_HWREV_8110S, RE_8169, RE_F_HASMPC, "8110S" }, { RE_HWREV_8169_8110SB, RE_8169, RE_F_HASMPC, "8169SB" }, { RE_HWREV_8169_8110SC, RE_8169, 0, "8169SC" }, { RE_HWREV_8100E, RE_8169, RE_F_HASMPC, "8100E" }, - { RE_HWREV_8101E, RE_8169, 0, "8101E" }, + { RE_HWREV_8101E, RE_8169, RE_F_PCIE, "8101E" }, { 0, 0, 0, NULL } }; @@ -1219,13 +1215,24 @@ re_attach(device_t dev) ifp->if_baudrate = 100000000; ifq_set_maxlen(&ifp->if_snd, RE_IFQ_MAXLEN); ifq_set_ready(&ifp->if_snd); + #ifdef RE_DISABLE_HWCSUM ifp->if_capenable = ifp->if_capabilities & ~IFCAP_HWCSUM; ifp->if_hwassist = 0; #else - ifp->if_capenable = ifp->if_capabilities; - ifp->if_hwassist = RE_CSUM_FEATURES; -#endif + if (sc->re_flags & RE_F_PCIE) { + /* + * The hardware supports checksumming but, as usual, PCIe + * chipsets screw it all up and produce bogus packets, so + * we don't enable it by default. + */ + ifp->if_capenable = ifp->if_capabilities & ~IFCAP_HWCSUM; + ifp->if_hwassist = 0; + } else { + ifp->if_capenable = ifp->if_capabilities; + ifp->if_hwassist = RE_CSUM_FEATURES; + } +#endif /* RE_DISABLE_HWCSUM */ /* * Call MI attach routine. diff --git a/sys/dev/netif/re/if_revar.h b/sys/dev/netif/re/if_revar.h index b743f45000..94d61881a2 100644 --- a/sys/dev/netif/re/if_revar.h +++ b/sys/dev/netif/re/if_revar.h @@ -33,7 +33,7 @@ * THE POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD: src/sys/pci/if_rlreg.h,v 1.42 2004/05/24 19:39:23 jhb Exp $ - * $DragonFly: src/sys/dev/netif/re/if_revar.h,v 1.2 2006/12/23 03:41:55 sephe Exp $ + * $DragonFly: src/sys/dev/netif/re/if_revar.h,v 1.3 2007/01/15 12:53:26 sephe Exp $ */ struct re_chain_data { @@ -157,6 +157,7 @@ struct re_softc { }; #define RE_F_HASMPC 0x1 +#define RE_F_PCIE 0x2 #define RE_TX_MODERATION_IS_ENABLED(sc) \ ((sc)->re_tx_ack == RE_ISR_TIMEOUT_EXPIRED) -- 2.41.0