Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
[deliverable/linux.git] / drivers / net / ethernet / mellanox / mlx5 / core / en_tx.c
index bb4eeeb007dec48eb022a6917f69d7fd5e1e5071..94a14f85f70d87a0ed49ef4f961db2cb745fe073 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Mellanox Technologies. All rights reserved.
+ * Copyright (c) 2015-2016, Mellanox Technologies. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -109,12 +109,10 @@ u16 mlx5e_select_queue(struct net_device *dev, struct sk_buff *skb,
 {
        struct mlx5e_priv *priv = netdev_priv(dev);
        int channel_ix = fallback(dev, skb);
-       int up = skb_vlan_tag_present(skb)        ?
-                skb->vlan_tci >> VLAN_PRIO_SHIFT :
-                priv->default_vlan_prio;
-       int tc = netdev_get_prio_tc_map(dev, up);
+       int up = (netdev_get_num_tc(dev) && skb_vlan_tag_present(skb)) ?
+                skb->vlan_tci >> VLAN_PRIO_SHIFT : 0;
 
-       return priv->channeltc_to_txq_map[channel_ix][tc];
+       return priv->channeltc_to_txq_map[channel_ix][up];
 }
 
 static inline u16 mlx5e_get_inline_hdr_size(struct mlx5e_sq *sq,
@@ -188,9 +186,16 @@ static netdev_tx_t mlx5e_sq_xmit(struct mlx5e_sq *sq, struct sk_buff *skb)
 
        memset(wqe, 0, sizeof(*wqe));
 
-       if (likely(skb->ip_summed == CHECKSUM_PARTIAL))
-               eseg->cs_flags  = MLX5_ETH_WQE_L3_CSUM | MLX5_ETH_WQE_L4_CSUM;
-       else
+       if (likely(skb->ip_summed == CHECKSUM_PARTIAL)) {
+               eseg->cs_flags = MLX5_ETH_WQE_L3_CSUM;
+               if (skb->encapsulation) {
+                       eseg->cs_flags |= MLX5_ETH_WQE_L3_INNER_CSUM |
+                                         MLX5_ETH_WQE_L4_INNER_CSUM;
+                       sq->stats.csum_offload_inner++;
+               } else {
+                       eseg->cs_flags |= MLX5_ETH_WQE_L4_CSUM;
+               }
+       } else
                sq->stats.csum_offload_none++;
 
        if (sq->cc != sq->prev_cc) {
@@ -199,15 +204,20 @@ static netdev_tx_t mlx5e_sq_xmit(struct mlx5e_sq *sq, struct sk_buff *skb)
        }
 
        if (skb_is_gso(skb)) {
-               u32 payload_len;
-
                eseg->mss    = cpu_to_be16(skb_shinfo(skb)->gso_size);
                opcode       = MLX5_OPCODE_LSO;
-               ihs          = skb_transport_offset(skb) + tcp_hdrlen(skb);
-               payload_len  = skb->len - ihs;
+
+               if (skb->encapsulation) {
+                       ihs = skb_inner_transport_offset(skb) + inner_tcp_hdrlen(skb);
+                       sq->stats.tso_inner_packets++;
+                       sq->stats.tso_inner_bytes += skb->len - ihs;
+               } else {
+                       ihs = skb_transport_offset(skb) + tcp_hdrlen(skb);
+                       sq->stats.tso_packets++;
+                       sq->stats.tso_bytes += skb->len - ihs;
+               }
+
                num_bytes = skb->len + (skb_shinfo(skb)->gso_segs - 1) * ihs;
-               sq->stats.tso_packets++;
-               sq->stats.tso_bytes += payload_len;
        } else {
                bf = sq->bf_budget &&
                     !skb->xmit_more &&
@@ -295,7 +305,7 @@ static netdev_tx_t mlx5e_sq_xmit(struct mlx5e_sq *sq, struct sk_buff *skb)
        if (!skb->xmit_more || netif_xmit_stopped(sq->txq)) {
                int bf_sz = 0;
 
-               if (bf && sq->uar_bf_map)
+               if (bf && test_bit(MLX5E_SQ_STATE_BF_ENABLE, &sq->state))
                        bf_sz = wi->num_wqebbs << 3;
 
                cseg->fm_ce_se = MLX5_WQE_CTRL_CQ_UPDATE;
This page took 0.024633 seconds and 5 git commands to generate.