mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-11 05:17:10 +09:00
octeon_ep: fix tx dma unmap len values in SG
[ Upstream commit350db8a59e] Lengths of SG pointers are kept in the following order in the SG entries in hardware. 63 48|47 32|31 16|15 0 ----------------------------------------- | Len 0 | Len 1 | Len 2 | Len 3 | ----------------------------------------- | Ptr 0 | ----------------------------------------- | Ptr 1 | ----------------------------------------- | Ptr 2 | ----------------------------------------- | Ptr 3 | ----------------------------------------- Dma pointers have to be unmapped based on their respective lengths given in this format. Fixes:37d79d0596("octeon_ep: add Tx/Rx processing and interrupt support") Signed-off-by: Shinas Rasheed <srasheed@marvell.com> Reviewed-by: Simon Horman <horms@kernel.org> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
66823a9025
commit
65976385d4
@@ -726,13 +726,13 @@ static netdev_tx_t octep_start_xmit(struct sk_buff *skb,
|
|||||||
dma_map_sg_err:
|
dma_map_sg_err:
|
||||||
if (si > 0) {
|
if (si > 0) {
|
||||||
dma_unmap_single(iq->dev, sglist[0].dma_ptr[0],
|
dma_unmap_single(iq->dev, sglist[0].dma_ptr[0],
|
||||||
sglist[0].len[0], DMA_TO_DEVICE);
|
sglist[0].len[3], DMA_TO_DEVICE);
|
||||||
sglist[0].len[0] = 0;
|
sglist[0].len[3] = 0;
|
||||||
}
|
}
|
||||||
while (si > 1) {
|
while (si > 1) {
|
||||||
dma_unmap_page(iq->dev, sglist[si >> 2].dma_ptr[si & 3],
|
dma_unmap_page(iq->dev, sglist[si >> 2].dma_ptr[si & 3],
|
||||||
sglist[si >> 2].len[si & 3], DMA_TO_DEVICE);
|
sglist[si >> 2].len[3 - (si & 3)], DMA_TO_DEVICE);
|
||||||
sglist[si >> 2].len[si & 3] = 0;
|
sglist[si >> 2].len[3 - (si & 3)] = 0;
|
||||||
si--;
|
si--;
|
||||||
}
|
}
|
||||||
tx_buffer->gather = 0;
|
tx_buffer->gather = 0;
|
||||||
|
|||||||
@@ -69,12 +69,12 @@ int octep_iq_process_completions(struct octep_iq *iq, u16 budget)
|
|||||||
compl_sg++;
|
compl_sg++;
|
||||||
|
|
||||||
dma_unmap_single(iq->dev, tx_buffer->sglist[0].dma_ptr[0],
|
dma_unmap_single(iq->dev, tx_buffer->sglist[0].dma_ptr[0],
|
||||||
tx_buffer->sglist[0].len[0], DMA_TO_DEVICE);
|
tx_buffer->sglist[0].len[3], DMA_TO_DEVICE);
|
||||||
|
|
||||||
i = 1; /* entry 0 is main skb, unmapped above */
|
i = 1; /* entry 0 is main skb, unmapped above */
|
||||||
while (frags--) {
|
while (frags--) {
|
||||||
dma_unmap_page(iq->dev, tx_buffer->sglist[i >> 2].dma_ptr[i & 3],
|
dma_unmap_page(iq->dev, tx_buffer->sglist[i >> 2].dma_ptr[i & 3],
|
||||||
tx_buffer->sglist[i >> 2].len[i & 3], DMA_TO_DEVICE);
|
tx_buffer->sglist[i >> 2].len[3 - (i & 3)], DMA_TO_DEVICE);
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -131,13 +131,13 @@ static void octep_iq_free_pending(struct octep_iq *iq)
|
|||||||
|
|
||||||
dma_unmap_single(iq->dev,
|
dma_unmap_single(iq->dev,
|
||||||
tx_buffer->sglist[0].dma_ptr[0],
|
tx_buffer->sglist[0].dma_ptr[0],
|
||||||
tx_buffer->sglist[0].len[0],
|
tx_buffer->sglist[0].len[3],
|
||||||
DMA_TO_DEVICE);
|
DMA_TO_DEVICE);
|
||||||
|
|
||||||
i = 1; /* entry 0 is main skb, unmapped above */
|
i = 1; /* entry 0 is main skb, unmapped above */
|
||||||
while (frags--) {
|
while (frags--) {
|
||||||
dma_unmap_page(iq->dev, tx_buffer->sglist[i >> 2].dma_ptr[i & 3],
|
dma_unmap_page(iq->dev, tx_buffer->sglist[i >> 2].dma_ptr[i & 3],
|
||||||
tx_buffer->sglist[i >> 2].len[i & 3], DMA_TO_DEVICE);
|
tx_buffer->sglist[i >> 2].len[3 - (i & 3)], DMA_TO_DEVICE);
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -17,7 +17,21 @@
|
|||||||
#define TX_BUFTYPE_NET_SG 2
|
#define TX_BUFTYPE_NET_SG 2
|
||||||
#define NUM_TX_BUFTYPES 3
|
#define NUM_TX_BUFTYPES 3
|
||||||
|
|
||||||
/* Hardware format for Scatter/Gather list */
|
/* Hardware format for Scatter/Gather list
|
||||||
|
*
|
||||||
|
* 63 48|47 32|31 16|15 0
|
||||||
|
* -----------------------------------------
|
||||||
|
* | Len 0 | Len 1 | Len 2 | Len 3 |
|
||||||
|
* -----------------------------------------
|
||||||
|
* | Ptr 0 |
|
||||||
|
* -----------------------------------------
|
||||||
|
* | Ptr 1 |
|
||||||
|
* -----------------------------------------
|
||||||
|
* | Ptr 2 |
|
||||||
|
* -----------------------------------------
|
||||||
|
* | Ptr 3 |
|
||||||
|
* -----------------------------------------
|
||||||
|
*/
|
||||||
struct octep_tx_sglist_desc {
|
struct octep_tx_sglist_desc {
|
||||||
u16 len[4];
|
u16 len[4];
|
||||||
dma_addr_t dma_ptr[4];
|
dma_addr_t dma_ptr[4];
|
||||||
|
|||||||
Reference in New Issue
Block a user