Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
[pandora-kernel.git] / drivers / net / mlx4 / en_tx.c
index 5dc7466..0ecc1e1 100644 (file)
@@ -150,7 +150,7 @@ void mlx4_en_destroy_tx_ring(struct mlx4_en_priv *priv,
 
 int mlx4_en_activate_tx_ring(struct mlx4_en_priv *priv,
                             struct mlx4_en_tx_ring *ring,
-                            int cq, int srqn)
+                            int cq)
 {
        struct mlx4_en_dev *mdev = priv->mdev;
        int err;
@@ -168,7 +168,7 @@ int mlx4_en_activate_tx_ring(struct mlx4_en_priv *priv,
        ring->doorbell_qpn = swab32(ring->qp.qpn << 8);
 
        mlx4_en_fill_qp_context(priv, ring->size, ring->stride, 1, 0, ring->qpn,
-                               ring->cqn, srqn, &ring->context);
+                               ring->cqn, &ring->context);
 
        err = mlx4_qp_to_ready(mdev->dev, &ring->wqres.mtt, &ring->context,
                               &ring->qp, &ring->qp_state);
@@ -249,6 +249,7 @@ static u32 mlx4_en_free_tx_desc(struct mlx4_en_priv *priv,
                                pci_unmap_page(mdev->pdev,
                                        (dma_addr_t) be64_to_cpu(data->addr),
                                         frag->size, PCI_DMA_TODEVICE);
+                               ++data;
                        }
                }
                /* Stamp the freed descriptor */
@@ -515,16 +516,9 @@ static int get_real_size(struct sk_buff *skb, struct net_device *dev,
                        else {
                                if (netif_msg_tx_err(priv))
                                        en_warn(priv, "Non-linear headers\n");
-                               dev_kfree_skb_any(skb);
                                return 0;
                        }
                }
-               if (unlikely(*lso_header_size > MAX_LSO_HDR_SIZE)) {
-                       if (netif_msg_tx_err(priv))
-                               en_warn(priv, "LSO header size too big\n");
-                       dev_kfree_skb_any(skb);
-                       return 0;
-               }
        } else {
                *lso_header_size = 0;
                if (!is_inline(skb, NULL))
@@ -616,13 +610,9 @@ int mlx4_en_xmit(struct sk_buff *skb, struct net_device *dev)
        int lso_header_size;
        void *fragptr;
 
-       if (unlikely(!skb->len)) {
-               dev_kfree_skb_any(skb);
-               return NETDEV_TX_OK;
-       }
        real_size = get_real_size(skb, dev, &lso_header_size);
        if (unlikely(!real_size))
-               return NETDEV_TX_OK;
+               goto tx_drop;
 
        /* Allign descriptor to TXBB size */
        desc_size = ALIGN(real_size, TXBB_SIZE);
@@ -630,8 +620,7 @@ int mlx4_en_xmit(struct sk_buff *skb, struct net_device *dev)
        if (unlikely(nr_txbb > MAX_DESC_TXBBS)) {
                if (netif_msg_tx_err(priv))
                        en_warn(priv, "Oversized header or SG list\n");
-               dev_kfree_skb_any(skb);
-               return NETDEV_TX_OK;
+               goto tx_drop;
        }
 
        tx_ind = skb->queue_mapping;
@@ -653,14 +642,6 @@ int mlx4_en_xmit(struct sk_buff *skb, struct net_device *dev)
                return NETDEV_TX_BUSY;
        }
 
-       /* Now that we know what Tx ring to use */
-       if (unlikely(!priv->port_up)) {
-               if (netif_msg_tx_err(priv))
-                       en_warn(priv, "xmit: port down!\n");
-               dev_kfree_skb_any(skb);
-               return NETDEV_TX_OK;
-       }
-
        /* Track current inflight packets for performance analysis */
        AVG_PERF_COUNTER(priv->pstats.inflight_avg,
                         (u32) (ring->prod - ring->cons - 1));
@@ -784,6 +765,11 @@ int mlx4_en_xmit(struct sk_buff *skb, struct net_device *dev)
        /* Poll CQ here */
        mlx4_en_xmit_poll(priv, tx_ind);
 
-       return 0;
+       return NETDEV_TX_OK;
+
+tx_drop:
+       dev_kfree_skb_any(skb);
+       priv->stats.tx_dropped++;
+       return NETDEV_TX_OK;
 }