|
|
@@ -160,6 +160,7 @@ static u16 bnx2x_free_tx_pkt(struct bnx2x *bp, struct bnx2x_fp_txdata *txdata,
|
|
|
struct sk_buff *skb = tx_buf->skb;
|
|
|
u16 bd_idx = TX_BD(tx_buf->first_bd), new_cons;
|
|
|
int nbd;
|
|
|
+ u16 split_bd_len = 0;
|
|
|
|
|
|
/* prefetch skb end pointer to speedup dev_kfree_skb() */
|
|
|
prefetch(&skb->end);
|
|
|
@@ -167,10 +168,7 @@ static u16 bnx2x_free_tx_pkt(struct bnx2x *bp, struct bnx2x_fp_txdata *txdata,
|
|
|
DP(NETIF_MSG_TX_DONE, "fp[%d]: pkt_idx %d buff @(%p)->skb %p\n",
|
|
|
txdata->txq_index, idx, tx_buf, skb);
|
|
|
|
|
|
- /* unmap first bd */
|
|
|
tx_start_bd = &txdata->tx_desc_ring[bd_idx].start_bd;
|
|
|
- dma_unmap_single(&bp->pdev->dev, BD_UNMAP_ADDR(tx_start_bd),
|
|
|
- BD_UNMAP_LEN(tx_start_bd), DMA_TO_DEVICE);
|
|
|
|
|
|
nbd = le16_to_cpu(tx_start_bd->nbd) - 1;
|
|
|
#ifdef BNX2X_STOP_ON_ERROR
|
|
|
@@ -188,12 +186,19 @@ static u16 bnx2x_free_tx_pkt(struct bnx2x *bp, struct bnx2x_fp_txdata *txdata,
|
|
|
--nbd;
|
|
|
bd_idx = TX_BD(NEXT_TX_IDX(bd_idx));
|
|
|
|
|
|
- /* ...and the TSO split header bd since they have no mapping */
|
|
|
+ /* TSO headers+data bds share a common mapping. See bnx2x_tx_split() */
|
|
|
if (tx_buf->flags & BNX2X_TSO_SPLIT_BD) {
|
|
|
+ tx_data_bd = &txdata->tx_desc_ring[bd_idx].reg_bd;
|
|
|
+ split_bd_len = BD_UNMAP_LEN(tx_data_bd);
|
|
|
--nbd;
|
|
|
bd_idx = TX_BD(NEXT_TX_IDX(bd_idx));
|
|
|
}
|
|
|
|
|
|
+ /* unmap first bd */
|
|
|
+ dma_unmap_single(&bp->pdev->dev, BD_UNMAP_ADDR(tx_start_bd),
|
|
|
+ BD_UNMAP_LEN(tx_start_bd) + split_bd_len,
|
|
|
+ DMA_TO_DEVICE);
|
|
|
+
|
|
|
/* now free frags */
|
|
|
while (nbd > 0) {
|
|
|
|