net: bcmgenet: fix dma api length mismatch
When un-mapping skb->data in __bcmgenet_tx_reclaim(),
we must use the length that was used in original dma_map_single(),
instead of skb->len that might be bigger (includes the frags)
We simply can store skb_len into tx_cb_ptr->dma_len and use it
at unmap time.
Fixes: 1c1008c793
("net: bcmgenet: add main driver file")
Signed-off-by: Eric Dumazet <edumazet@google.com>
Acked-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Родитель
76e39ccf9c
Коммит
eee5772322
|
@ -1197,7 +1197,7 @@ static unsigned int __bcmgenet_tx_reclaim(struct net_device *dev,
|
||||||
dev->stats.tx_bytes += tx_cb_ptr->skb->len;
|
dev->stats.tx_bytes += tx_cb_ptr->skb->len;
|
||||||
dma_unmap_single(&dev->dev,
|
dma_unmap_single(&dev->dev,
|
||||||
dma_unmap_addr(tx_cb_ptr, dma_addr),
|
dma_unmap_addr(tx_cb_ptr, dma_addr),
|
||||||
tx_cb_ptr->skb->len,
|
dma_unmap_len(tx_cb_ptr, dma_len),
|
||||||
DMA_TO_DEVICE);
|
DMA_TO_DEVICE);
|
||||||
bcmgenet_free_cb(tx_cb_ptr);
|
bcmgenet_free_cb(tx_cb_ptr);
|
||||||
} else if (dma_unmap_addr(tx_cb_ptr, dma_addr)) {
|
} else if (dma_unmap_addr(tx_cb_ptr, dma_addr)) {
|
||||||
|
@ -1308,7 +1308,7 @@ static int bcmgenet_xmit_single(struct net_device *dev,
|
||||||
}
|
}
|
||||||
|
|
||||||
dma_unmap_addr_set(tx_cb_ptr, dma_addr, mapping);
|
dma_unmap_addr_set(tx_cb_ptr, dma_addr, mapping);
|
||||||
dma_unmap_len_set(tx_cb_ptr, dma_len, skb->len);
|
dma_unmap_len_set(tx_cb_ptr, dma_len, skb_len);
|
||||||
length_status = (skb_len << DMA_BUFLENGTH_SHIFT) | dma_desc_flags |
|
length_status = (skb_len << DMA_BUFLENGTH_SHIFT) | dma_desc_flags |
|
||||||
(priv->hw_params->qtag_mask << DMA_TX_QTAG_SHIFT) |
|
(priv->hw_params->qtag_mask << DMA_TX_QTAG_SHIFT) |
|
||||||
DMA_TX_APPEND_CRC;
|
DMA_TX_APPEND_CRC;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче