The skb_csum_offload_chk is used to resolve checksums that are unable
to be offloaded to the device.

Signed-off-by: Tom Herbert <t...@herbertland.com>
---
 drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.c   | 10 +++-------
 drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c   | 16 ++++++++++++++--
 drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c | 10 ++++------
 3 files changed, 21 insertions(+), 15 deletions(-)

diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.c 
b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.c
index 509b596..380b621 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.c
@@ -1044,8 +1044,7 @@ static netdev_features_t qlcnic_process_flags(struct 
qlcnic_adapter *adapter,
        u32 offload_flags = adapter->offload_flags;
 
        if (offload_flags & BIT_0) {
-               features |= NETIF_F_RXCSUM | NETIF_F_IP_CSUM |
-                           NETIF_F_IPV6_CSUM;
+               features |= NETIF_F_RXCSUM | NETIF_F_HW_CSUM;
                adapter->rx_csum = 1;
                if (QLCNIC_IS_TSO_CAPABLE(adapter)) {
                        if (!(offload_flags & BIT_1))
@@ -1059,9 +1058,7 @@ static netdev_features_t qlcnic_process_flags(struct 
qlcnic_adapter *adapter,
                                features |= NETIF_F_TSO6;
                }
        } else {
-               features &= ~(NETIF_F_RXCSUM |
-                             NETIF_F_IP_CSUM |
-                             NETIF_F_IPV6_CSUM);
+               features &= ~(NETIF_F_RXCSUM | NETIF_F_HW_CSUM);
 
                if (QLCNIC_IS_TSO_CAPABLE(adapter))
                        features &= ~(NETIF_F_TSO | NETIF_F_TSO6);
@@ -1084,8 +1081,7 @@ netdev_features_t qlcnic_fix_features(struct net_device 
*netdev,
                } else {
                        changed = features ^ netdev->features;
                        features ^= changed & (NETIF_F_RXCSUM |
-                                              NETIF_F_IP_CSUM |
-                                              NETIF_F_IPV6_CSUM |
+                                              NETIF_F_HW_CSUM |
                                               NETIF_F_TSO |
                                               NETIF_F_TSO6);
                }
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c 
b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c
index 7bd6f25..1165ac2 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c
@@ -368,6 +368,16 @@ static void qlcnic_send_filter(struct qlcnic_adapter 
*adapter,
 #define QLCNIC_ENCAP_DO_L3_CSUM                BIT_4
 #define QLCNIC_ENCAP_DO_L4_CSUM                BIT_5
 
+static const struct skb_csum_offl_spec csum_offl_encap_spec = {
+       .ipv4_okay = 1,
+       .ip_options_okay = 1,
+       .vlan_okay = 1,
+       .tcp_okay = 1,
+       .udp_okay = 1,
+       .encap_okay = 1,
+       .no_not_encapped = 1,
+};
+
 static int qlcnic_tx_encap_pkt(struct qlcnic_adapter *adapter,
                               struct cmd_desc_type0 *first_desc,
                               struct sk_buff *skb,
@@ -378,6 +388,7 @@ static int qlcnic_tx_encap_pkt(struct qlcnic_adapter 
*adapter,
        u32 producer = tx_ring->producer;
        struct cmd_desc_type0 *hwdesc;
        u16 flags = 0, encap_descr = 0;
+       bool csum_encapped;
 
        opcode = QLCNIC_TX_ETHER_PKT;
        encap_descr = QLCNIC_ENCAP_VXLAN_PKT;
@@ -423,7 +434,8 @@ static int qlcnic_tx_encap_pkt(struct qlcnic_adapter 
*adapter,
                adapter->stats.encap_lso_frames++;
 
                opcode = QLCNIC_TX_ENCAP_LSO;
-       } else if (skb->ip_summed == CHECKSUM_PARTIAL) {
+       } else if (skb_csum_offload_chk(skb, &csum_offl_encap_spec,
+                                       &csum_encapped, true)) {
                if (inner_ip_hdr(skb)->version == 6) {
                        if (inner_ipv6_hdr(skb)->nexthdr == IPPROTO_UDP)
                                encap_descr |= QLCNIC_ENCAP_INNER_L4_UDP;
@@ -552,7 +564,7 @@ set_flags:
                smp_mb();
                adapter->stats.lso_frames++;
 
-       } else if (skb->ip_summed == CHECKSUM_PARTIAL) {
+       } else if (skb_csum_off_chk_help_cmn(skb)) {
                if (protocol == ETH_P_IP) {
                        l4proto = ip_hdr(skb)->protocol;
 
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c 
b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
index 1205f6f..301ee8f 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
@@ -2301,11 +2301,9 @@ qlcnic_setup_netdev(struct qlcnic_adapter *adapter, 
struct net_device *netdev,
        netdev->ethtool_ops = (qlcnic_sriov_vf_check(adapter)) ?
                &qlcnic_sriov_vf_ethtool_ops : &qlcnic_ethtool_ops;
 
-       netdev->features |= (NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_RXCSUM |
-                            NETIF_F_IPV6_CSUM | NETIF_F_GRO |
-                            NETIF_F_HW_VLAN_CTAG_RX);
-       netdev->vlan_features |= (NETIF_F_SG | NETIF_F_IP_CSUM |
-                                 NETIF_F_IPV6_CSUM);
+       netdev->features |= (NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_RXCSUM |
+                            NETIF_F_GRO | NETIF_F_HW_VLAN_CTAG_RX);
+       netdev->vlan_features |= (NETIF_F_SG | NETIF_F_HW_CSUM);
 
        if (QLCNIC_IS_TSO_CAPABLE(adapter)) {
                netdev->features |= (NETIF_F_TSO | NETIF_F_TSO6);
@@ -2330,7 +2328,7 @@ qlcnic_setup_netdev(struct qlcnic_adapter *adapter, 
struct net_device *netdev,
                netdev->features |= NETIF_F_GSO_UDP_TUNNEL;
 
                /* encapsulation Tx offload supported by Adapter */
-               netdev->hw_enc_features = NETIF_F_IP_CSUM        |
+               netdev->hw_enc_features = NETIF_F_HW_CSUM        |
                                          NETIF_F_GSO_UDP_TUNNEL |
                                          NETIF_F_TSO            |
                                          NETIF_F_TSO6;
-- 
2.4.6

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to