svn commit: r283209 - stable/10/sys/dev/sfxge
Andrew Rybchenko
arybchik at FreeBSD.org
Thu May 21 09:09:53 UTC 2015
Author: arybchik
Date: Thu May 21 09:09:51 2015
New Revision: 283209
URL: https://svnweb.freebsd.org/changeset/base/283209
Log:
MFC: r282996
sfxge: support Rx checksum offloads disabling
We can't disable it in HW, but we can ignore result.
Discard Rx descriptor checksum flags if Rx checksum offload is off.
Sponsored by: Solarflare Communications, Inc.
Modified:
stable/10/sys/dev/sfxge/sfxge.c
stable/10/sys/dev/sfxge/sfxge_rx.c
Directory Properties:
stable/10/ (props changed)
Modified: stable/10/sys/dev/sfxge/sfxge.c
==============================================================================
--- stable/10/sys/dev/sfxge/sfxge.c Thu May 21 09:08:10 2015 (r283208)
+++ stable/10/sys/dev/sfxge/sfxge.c Thu May 21 09:09:51 2015 (r283209)
@@ -64,8 +64,7 @@ __FBSDID("$FreeBSD$");
IFCAP_JUMBO_MTU | IFCAP_LRO | \
IFCAP_VLAN_HWTSO | IFCAP_LINKSTATE)
#define SFXGE_CAP_ENABLE SFXGE_CAP
-#define SFXGE_CAP_FIXED (IFCAP_VLAN_MTU | IFCAP_RXCSUM | IFCAP_VLAN_HWCSUM | \
- IFCAP_RXCSUM_IPV6 | \
+#define SFXGE_CAP_FIXED (IFCAP_VLAN_MTU | IFCAP_VLAN_HWCSUM | \
IFCAP_JUMBO_MTU | IFCAP_LINKSTATE)
MALLOC_DEFINE(M_SFXGE, "sfxge", "Solarflare 10GigE driver");
Modified: stable/10/sys/dev/sfxge/sfxge_rx.c
==============================================================================
--- stable/10/sys/dev/sfxge/sfxge_rx.c Thu May 21 09:08:10 2015 (r283208)
+++ stable/10/sys/dev/sfxge/sfxge_rx.c Thu May 21 09:09:51 2015 (r283209)
@@ -788,7 +788,8 @@ void
sfxge_rx_qcomplete(struct sfxge_rxq *rxq, boolean_t eop)
{
struct sfxge_softc *sc = rxq->sc;
- int lro_enabled = sc->ifnet->if_capenable & IFCAP_LRO;
+ int if_capenable = sc->ifnet->if_capenable;
+ int lro_enabled = if_capenable & IFCAP_LRO;
unsigned int index;
struct sfxge_evq *evq;
unsigned int completed;
@@ -818,21 +819,37 @@ sfxge_rx_qcomplete(struct sfxge_rxq *rxq
prefetch_read_many(mtod(m, caddr_t));
- /* Check for loopback packets */
- if (!(rx_desc->flags & EFX_PKT_IPV4) &&
- !(rx_desc->flags & EFX_PKT_IPV6)) {
- struct ether_header *etherhp;
-
- /*LINTED*/
- etherhp = mtod(m, struct ether_header *);
-
- if (etherhp->ether_type ==
- htons(SFXGE_ETHERTYPE_LOOPBACK)) {
- EFSYS_PROBE(loopback);
-
- rxq->loopback++;
- goto discard;
+ switch (rx_desc->flags & (EFX_PKT_IPV4 | EFX_PKT_IPV6)) {
+ case EFX_PKT_IPV4:
+ if (~if_capenable & IFCAP_RXCSUM)
+ rx_desc->flags &=
+ ~(EFX_CKSUM_IPV4 | EFX_CKSUM_TCPUDP);
+ break;
+ case EFX_PKT_IPV6:
+ if (~if_capenable & IFCAP_RXCSUM_IPV6)
+ rx_desc->flags &= ~EFX_CKSUM_TCPUDP;
+ break;
+ case 0:
+ /* Check for loopback packets */
+ {
+ struct ether_header *etherhp;
+
+ /*LINTED*/
+ etherhp = mtod(m, struct ether_header *);
+
+ if (etherhp->ether_type ==
+ htons(SFXGE_ETHERTYPE_LOOPBACK)) {
+ EFSYS_PROBE(loopback);
+
+ rxq->loopback++;
+ goto discard;
+ }
}
+ break;
+ default:
+ KASSERT(B_FALSE,
+ ("Rx descriptor with both IPv4 and IPv6 flags"));
+ goto discard;
}
/* Pass packet up the stack or into LRO (pipelined) */
More information about the svn-src-stable-10
mailing list