]> git.baikalelectronics.ru Git - kernel.git/commitdiff
octeon_ep: fix tx dma unmap len values in SG
authorShinas Rasheed <srasheed@marvell.com>
Wed, 13 Sep 2023 08:41:56 +0000 (01:41 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 6 Oct 2023 12:56:37 +0000 (14:56 +0200)
[ Upstream commit 350db8a59eb392bf42e62b6b2a37d56b5833012b ]

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: 37d79d059606 ("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>
drivers/net/ethernet/marvell/octeon_ep/octep_main.c
drivers/net/ethernet/marvell/octeon_ep/octep_tx.c
drivers/net/ethernet/marvell/octeon_ep/octep_tx.h

index d4ec46d1c8cfbb4c56f69b339f4080e18f2d3180..61354f79850356919dfeb6d0e4911faa921bafbd 100644 (file)
@@ -726,13 +726,13 @@ static netdev_tx_t octep_start_xmit(struct sk_buff *skb,
 dma_map_sg_err:
        if (si > 0) {
                dma_unmap_single(iq->dev, sglist[0].dma_ptr[0],
-                                sglist[0].len[0], DMA_TO_DEVICE);
-               sglist[0].len[0] = 0;
+                                sglist[0].len[3], DMA_TO_DEVICE);
+               sglist[0].len[3] = 0;
        }
        while (si > 1) {
                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[si & 3] = 0;
+                              sglist[si >> 2].len[3 - (si & 3)], DMA_TO_DEVICE);
+               sglist[si >> 2].len[3 - (si & 3)] = 0;
                si--;
        }
        tx_buffer->gather = 0;
index 5a520d37bea02459815f868f889053949c4d3ce3..d0adb82d65c31eddccdb6b56522ce91e3d021fee 100644 (file)
@@ -69,12 +69,12 @@ int octep_iq_process_completions(struct octep_iq *iq, u16 budget)
                compl_sg++;
 
                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 */
                while (frags--) {
                        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++;
                }
 
@@ -131,13 +131,13 @@ static void octep_iq_free_pending(struct octep_iq *iq)
 
                dma_unmap_single(iq->dev,
                                 tx_buffer->sglist[0].dma_ptr[0],
-                                tx_buffer->sglist[0].len[0],
+                                tx_buffer->sglist[0].len[3],
                                 DMA_TO_DEVICE);
 
                i = 1; /* entry 0 is main skb, unmapped above */
                while (frags--) {
                        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++;
                }
 
index 2ef57980eb47b8ee44c22c40acb9d18355f58956..21e75ff9f5e71165be04cdefd72678bd5911a663 100644 (file)
 #define TX_BUFTYPE_NET_SG        2
 #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 {
        u16 len[4];
        dma_addr_t dma_ptr[4];