]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/blobdiff - drivers/net/ethernet/intel/fm10k/fm10k_main.c
Merge tag 'nfc-next-4.7-1' of git://git.kernel.org/pub/scm/linux/kernel/git/sameo...
[mirror_ubuntu-hirsute-kernel.git] / drivers / net / ethernet / intel / fm10k / fm10k_main.c
index ca5b9d7eeb22ae3c632209cc5978c081e2b24c99..0e166e9c90c8657a90ca8aed40615ad090ae1d8d 100644 (file)
@@ -1,5 +1,5 @@
-/* Intel Ethernet Switch Host Interface Driver
- * Copyright(c) 2013 - 2014 Intel Corporation.
+/* Intel(R) Ethernet Switch Host Interface Driver
+ * Copyright(c) 2013 - 2016 Intel Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms and conditions of the GNU General Public License,
@@ -34,7 +34,7 @@ const char fm10k_driver_version[] = DRV_VERSION;
 char fm10k_driver_name[] = "fm10k";
 static const char fm10k_driver_string[] = DRV_SUMMARY;
 static const char fm10k_copyright[] =
-       "Copyright (c) 2013 Intel Corporation.";
+       "Copyright (c) 2013 - 2016 Intel Corporation.";
 
 MODULE_AUTHOR("Intel Corporation, <linux.nics@intel.com>");
 MODULE_DESCRIPTION(DRV_SUMMARY);
@@ -424,19 +424,6 @@ static inline void fm10k_rx_hash(struct fm10k_ring *ring,
                     PKT_HASH_TYPE_L4 : PKT_HASH_TYPE_L3);
 }
 
-static void fm10k_rx_hwtstamp(struct fm10k_ring *rx_ring,
-                             union fm10k_rx_desc *rx_desc,
-                             struct sk_buff *skb)
-{
-       struct fm10k_intfc *interface = rx_ring->q_vector->interface;
-
-       FM10K_CB(skb)->tstamp = rx_desc->q.timestamp;
-
-       if (unlikely(interface->flags & FM10K_FLAG_RX_TS_ENABLED))
-               fm10k_systime_to_hwtstamp(interface, skb_hwtstamps(skb),
-                                         le64_to_cpu(rx_desc->q.timestamp));
-}
-
 static void fm10k_type_trans(struct fm10k_ring *rx_ring,
                             union fm10k_rx_desc __maybe_unused *rx_desc,
                             struct sk_buff *skb)
@@ -486,8 +473,6 @@ static unsigned int fm10k_process_skb_fields(struct fm10k_ring *rx_ring,
 
        fm10k_rx_checksum(rx_ring, rx_desc, skb);
 
-       fm10k_rx_hwtstamp(rx_ring, rx_desc, skb);
-
        FM10K_CB(skb)->fi.w.vlan = rx_desc->w.vlan;
 
        skb_record_rx_queue(skb, rx_ring->queue_index);
@@ -835,6 +820,8 @@ static void fm10k_tx_csum(struct fm10k_ring *tx_ring,
                struct ipv6hdr *ipv6;
                u8 *raw;
        } network_hdr;
+       u8 *transport_hdr;
+       __be16 frag_off;
        __be16 protocol;
        u8 l4_hdr = 0;
 
@@ -852,9 +839,11 @@ static void fm10k_tx_csum(struct fm10k_ring *tx_ring,
                        goto no_csum;
                }
                network_hdr.raw = skb_inner_network_header(skb);
+               transport_hdr = skb_inner_transport_header(skb);
        } else {
                protocol = vlan_get_protocol(skb);
                network_hdr.raw = skb_network_header(skb);
+               transport_hdr = skb_transport_header(skb);
        }
 
        switch (protocol) {
@@ -863,15 +852,17 @@ static void fm10k_tx_csum(struct fm10k_ring *tx_ring,
                break;
        case htons(ETH_P_IPV6):
                l4_hdr = network_hdr.ipv6->nexthdr;
+               if (likely((transport_hdr - network_hdr.raw) ==
+                          sizeof(struct ipv6hdr)))
+                       break;
+               ipv6_skip_exthdr(skb, network_hdr.raw - skb->data +
+                                     sizeof(struct ipv6hdr),
+                                &l4_hdr, &frag_off);
+               if (unlikely(frag_off))
+                       l4_hdr = NEXTHDR_FRAGMENT;
                break;
        default:
-               if (unlikely(net_ratelimit())) {
-                       dev_warn(tx_ring->dev,
-                                "partial checksum but ip version=%x!\n",
-                                protocol);
-               }
-               tx_ring->tx_stats.csum_err++;
-               goto no_csum;
+               break;
        }
 
        switch (l4_hdr) {
@@ -884,9 +875,10 @@ static void fm10k_tx_csum(struct fm10k_ring *tx_ring,
        default:
                if (unlikely(net_ratelimit())) {
                        dev_warn(tx_ring->dev,
-                                "partial checksum but l4 proto=%x!\n",
-                                l4_hdr);
+                                "partial checksum, version=%d l4 proto=%x\n",
+                                protocol, l4_hdr);
                }
+               skb_checksum_help(skb);
                tx_ring->tx_stats.csum_err++;
                goto no_csum;
        }
@@ -912,11 +904,6 @@ static u8 fm10k_tx_desc_flags(struct sk_buff *skb, u32 tx_flags)
        /* set type for advanced descriptor with frame checksum insertion */
        u32 desc_flags = 0;
 
-       /* set timestamping bits */
-       if (unlikely(skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP) &&
-           likely(skb_shinfo(skb)->tx_flags & SKBTX_IN_PROGRESS))
-               desc_flags |= FM10K_TXD_FLAG_TIME;
-
        /* set checksum offload bits */
        desc_flags |= FM10K_SET_FLAG(tx_flags, FM10K_TX_FLAGS_CSUM,
                                     FM10K_TXD_FLAG_CSUM);
@@ -1947,8 +1934,7 @@ static void fm10k_assign_rings(struct fm10k_intfc *interface)
 static void fm10k_init_reta(struct fm10k_intfc *interface)
 {
        u16 i, rss_i = interface->ring_feature[RING_F_RSS].indices;
-       struct net_device *netdev = interface->netdev;
-       u32 reta, *indir;
+       u32 reta;
 
        /* If the Rx flow indirection table has been configured manually, we
         * need to maintain it when possible.
@@ -1973,16 +1959,7 @@ static void fm10k_init_reta(struct fm10k_intfc *interface)
        }
 
 repopulate_reta:
-       indir = kcalloc(fm10k_get_reta_size(netdev),
-                       sizeof(indir[0]), GFP_KERNEL);
-
-       /* generate redirection table using the default kernel policy */
-       for (i = 0; i < fm10k_get_reta_size(netdev); i++)
-               indir[i] = ethtool_rxfh_indir_default(i, rss_i);
-
-       fm10k_write_reta(interface, indir);
-
-       kfree(indir);
+       fm10k_write_reta(interface, NULL);
 }
 
 /**