summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorarybchik <arybchik@FreeBSD.org>2015-05-21 09:23:28 +0000
committerarybchik <arybchik@FreeBSD.org>2015-05-21 09:23:28 +0000
commit6caf0aa6e9f527ada27dfba28b9895f66733cb98 (patch)
tree4d2096d8a6a21bc2f4ff18d94d377ff255f23df7
parentf9a30c61a6f06cdcadd4df4e764ed84f3befebb7 (diff)
downloadFreeBSD-src-6caf0aa6e9f527ada27dfba28b9895f66733cb98.zip
FreeBSD-src-6caf0aa6e9f527ada27dfba28b9895f66733cb98.tar.gz
MFC: r283050
sfxge: automatically turn off TSO when Tx checksum offload is disabled Also return error if TSO is requested without Tx checksum offload. Sponsored by: Solarflare Communications, Inc.
-rw-r--r--sys/dev/sfxge/sfxge.c39
1 files changed, 34 insertions, 5 deletions
diff --git a/sys/dev/sfxge/sfxge.c b/sys/dev/sfxge/sfxge.c
index fe2081c..1c8e7f4 100644
--- a/sys/dev/sfxge/sfxge.c
+++ b/sys/dev/sfxge/sfxge.c
@@ -59,8 +59,9 @@ __FBSDID("$FreeBSD$");
#include "sfxge_version.h"
#define SFXGE_CAP (IFCAP_VLAN_MTU | IFCAP_VLAN_HWCSUM | \
- IFCAP_RXCSUM | IFCAP_TXCSUM | IFCAP_TSO | \
+ IFCAP_RXCSUM | IFCAP_TXCSUM | \
IFCAP_RXCSUM_IPV6 | IFCAP_TXCSUM_IPV6 | \
+ IFCAP_TSO4 | IFCAP_TSO6 | \
IFCAP_JUMBO_MTU | IFCAP_LRO | \
IFCAP_VLAN_HWTSO | IFCAP_LINKSTATE)
#define SFXGE_CAP_ENABLE SFXGE_CAP
@@ -282,14 +283,42 @@ sfxge_if_ioctl(struct ifnet *ifp, unsigned long command, caddr_t data)
break;
}
- if (reqcap & IFCAP_TXCSUM)
+ /* Check request before any changes */
+ if ((capchg_mask & IFCAP_TSO4) &&
+ (reqcap & (IFCAP_TSO4 | IFCAP_TXCSUM)) == IFCAP_TSO4) {
+ error = EAGAIN;
+ SFXGE_ADAPTER_UNLOCK(sc);
+ if_printf(ifp, "enable txcsum before tso4\n");
+ break;
+ }
+ if ((capchg_mask & IFCAP_TSO6) &&
+ (reqcap & (IFCAP_TSO6 | IFCAP_TXCSUM_IPV6)) == IFCAP_TSO6) {
+ error = EAGAIN;
+ SFXGE_ADAPTER_UNLOCK(sc);
+ if_printf(ifp, "enable txcsum6 before tso6\n");
+ break;
+ }
+
+ if (reqcap & IFCAP_TXCSUM) {
ifp->if_hwassist |= (CSUM_IP | CSUM_TCP | CSUM_UDP);
- else
+ } else {
ifp->if_hwassist &= ~(CSUM_IP | CSUM_TCP | CSUM_UDP);
- if (reqcap & IFCAP_TXCSUM_IPV6)
+ if (reqcap & IFCAP_TSO4) {
+ reqcap &= ~IFCAP_TSO4;
+ if_printf(ifp,
+ "tso4 disabled due to -txcsum\n");
+ }
+ }
+ if (reqcap & IFCAP_TXCSUM_IPV6) {
ifp->if_hwassist |= (CSUM_TCP_IPV6 | CSUM_UDP_IPV6);
- else
+ } else {
ifp->if_hwassist &= ~(CSUM_TCP_IPV6 | CSUM_UDP_IPV6);
+ if (reqcap & IFCAP_TSO6) {
+ reqcap &= ~IFCAP_TSO6;
+ if_printf(ifp,
+ "tso6 disabled due to -txcsum6\n");
+ }
+ }
/*
* The kernel takes both IFCAP_TSOx and CSUM_TSO into
OpenPOWER on IntegriCloud