cxgb4: Calculate len properly for LSO path
authorKumar Sanghvi <kumaras@chelsio.com>
Thu, 13 Mar 2014 15:20:50 +0000 (20:50 +0530)
committerDavid S. Miller <davem@davemloft.net>
Thu, 13 Mar 2014 18:36:05 +0000 (14:36 -0400)
Commit 0034b29 ("cxgb4: Don't assume LSO only uses SGL path in t4_eth_xmit()")
introduced a regression where-in length was calculated wrongly for LSO path,
causing chip hangs.
So, correct the calculation of len.

Fixes: 0034b29 ("cxgb4: Don't assume LSO only uses SGL path in t4_eth_xmit()")
Signed-off-by: Kumar Sanghvi <kumaras@chelsio.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/chelsio/cxgb4/sge.c

index a7c56b3b9fc9d1620e8845e5622b5b0133526296..46429f9d05928a6f2df2125da51ba81f2d56b963 100644 (file)
@@ -1051,7 +1051,6 @@ out_free: dev_kfree_skb(skb);
        end = (u64 *)wr + flits;
 
        len = immediate ? skb->len : 0;
-       len += sizeof(*cpl);
        ssi = skb_shinfo(skb);
        if (ssi->gso_size) {
                struct cpl_tx_pkt_lso *lso = (void *)wr;
@@ -1079,6 +1078,7 @@ out_free: dev_kfree_skb(skb);
                q->tso++;
                q->tx_cso += ssi->gso_segs;
        } else {
+               len += sizeof(*cpl);
                wr->op_immdlen = htonl(FW_WR_OP(FW_ETH_TX_PKT_WR) |
                                       FW_WR_IMMDLEN(len));
                cpl = (void *)(wr + 1);