OSDN Git Service

ice: Offload SCTP checksum
authorAnirudh Venkataramanan <anirudh.venkataramanan@intel.com>
Wed, 19 Dec 2018 18:03:32 +0000 (10:03 -0800)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Tue, 15 Jan 2019 20:02:27 +0000 (12:02 -0800)
This patch adds the ability to offload SCTP checksum calculations to the
NIC.

Signed-off-by: Anirudh Venkataramanan <anirudh.venkataramanan@intel.com>
Tested-by: Andrew Bowers <andrewx.bowers@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
drivers/net/ethernet/intel/ice/ice.h
drivers/net/ethernet/intel/ice/ice_lan_tx_rx.h
drivers/net/ethernet/intel/ice/ice_main.c
drivers/net/ethernet/intel/ice/ice_txrx.c

index ac8bf74..55944e0 100644 (file)
@@ -26,6 +26,7 @@
 #include <linux/bitmap.h>
 #include <linux/log2.h>
 #include <linux/ip.h>
+#include <linux/sctp.h>
 #include <linux/ipv6.h>
 #include <linux/if_bridge.h>
 #include <linux/avf/virtchnl.h>
index bb51dd7..bd7c01d 100644 (file)
@@ -346,6 +346,7 @@ enum ice_tx_desc_cmd_bits {
        ICE_TX_DESC_CMD_IIPT_IPV4               = 0x0040, /* 2 BITS */
        ICE_TX_DESC_CMD_IIPT_IPV4_CSUM          = 0x0060, /* 2 BITS */
        ICE_TX_DESC_CMD_L4T_EOFT_TCP            = 0x0100, /* 2 BITS */
+       ICE_TX_DESC_CMD_L4T_EOFT_SCTP           = 0x0200, /* 2 BITS */
        ICE_TX_DESC_CMD_L4T_EOFT_UDP            = 0x0300, /* 2 BITS */
 };
 
index e59f8b2..f4bf6bd 100644 (file)
@@ -1528,6 +1528,7 @@ static int ice_cfg_netdev(struct ice_vsi *vsi)
 
        csumo_features = NETIF_F_RXCSUM   |
                         NETIF_F_IP_CSUM  |
+                        NETIF_F_SCTP_CRC |
                         NETIF_F_IPV6_CSUM;
 
        vlano_features = NETIF_F_HW_VLAN_CTAG_FILTER |
index 384ac5c..2357fca 100644 (file)
@@ -1465,6 +1465,12 @@ int ice_tx_csum(struct ice_tx_buf *first, struct ice_tx_offload_params *off)
                offset |= l4_len << ICE_TX_DESC_LEN_L4_LEN_S;
                break;
        case IPPROTO_SCTP:
+               /* enable SCTP checksum offload */
+               cmd |= ICE_TX_DESC_CMD_L4T_EOFT_SCTP;
+               l4_len = sizeof(struct sctphdr) >> 2;
+               offset |= l4_len << ICE_TX_DESC_LEN_L4_LEN_S;
+               break;
+
        default:
                if (first->tx_flags & ICE_TX_FLAGS_TSO)
                        return -1;