Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
[deliverable/linux.git] / drivers / net / ethernet / mellanox / mlx4 / en_tx.c
index 6771b69f40d562bf58909a1f806bddd1ace9ea65..30724d811115717ec1a39bcc93a726be5e593d82 100644 (file)
@@ -515,10 +515,6 @@ static void build_inline_wqe(struct mlx4_en_tx_desc *tx_desc, struct sk_buff *sk
                wmb();
                inl->byte_count = cpu_to_be32(1 << 31 | (skb->len - spc));
        }
-       tx_desc->ctrl.vlan_tag = cpu_to_be16(*vlan_tag);
-       tx_desc->ctrl.ins_vlan = MLX4_WQE_CTRL_INS_VLAN *
-               (!!vlan_tx_tag_present(skb));
-       tx_desc->ctrl.fence_size = (real_size / 16) & 0x3f;
 }
 
 u16 mlx4_en_select_queue(struct net_device *dev, struct sk_buff *skb)
@@ -592,7 +588,21 @@ netdev_tx_t mlx4_en_xmit(struct sk_buff *skb, struct net_device *dev)
                netif_tx_stop_queue(ring->tx_queue);
                priv->port_stats.queue_stopped++;
 
-               return NETDEV_TX_BUSY;
+               /* If queue was emptied after the if, and before the
+                * stop_queue - need to wake the queue, or else it will remain
+                * stopped forever.
+                * Need a memory barrier to make sure ring->cons was not
+                * updated before queue was stopped.
+                */
+               wmb();
+
+               if (unlikely(((int)(ring->prod - ring->cons)) <=
+                            ring->size - HEADROOM - MAX_DESC_TXBBS)) {
+                       netif_tx_wake_queue(ring->tx_queue);
+                       priv->port_stats.wake_queue++;
+               } else {
+                       return NETDEV_TX_BUSY;
+               }
        }
 
        /* Track current inflight packets for performance analysis */
This page took 0.03769 seconds and 5 git commands to generate.