Receive buffers are properly synchronized only if Cadence is
GEM. Fix it for MACB as well.

Fixes: 86dc5259e25d (net: macb: no need for coherent memory for receive buffer)
Signed-off-by: Ladislav Michl <[email protected]>
---
 Hi Sascha,

 I'm unsure this is proper fix, but works for me (as well as
 reverting 86dc5259e25d)

 drivers/net/macb.c | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/drivers/net/macb.c b/drivers/net/macb.c
index 1c5752d10..2bd5b62a4 100644
--- a/drivers/net/macb.c
+++ b/drivers/net/macb.c
@@ -216,9 +216,11 @@ static int macb_recv(struct eth_device *edev)
        dev_dbg(macb->dev, "%s\n", __func__);
 
        for (;;) {
+               barrier();
                if (!(macb->rx_ring[rx_tail].addr & MACB_BIT(RX_USED)))
                        return -1;
 
+               barrier();
                status = macb->rx_ring[rx_tail].ctrl;
                if (status & MACB_BIT(RX_SOF)) {
                        if (rx_tail != macb->rx_tail)
@@ -229,6 +231,8 @@ static int macb_recv(struct eth_device *edev)
                if (status & MACB_BIT(RX_EOF)) {
                        buffer = macb->rx_buffer + macb->rx_buffer_size * 
macb->rx_tail;
                        length = MACB_BFEXT(RX_FRMLEN, status);
+                       dma_sync_single_for_cpu((unsigned long)buffer, length,
+                                               DMA_FROM_DEVICE);
                        if (wrapped) {
                                unsigned int headlen, taillen;
 
@@ -237,12 +241,17 @@ static int macb_recv(struct eth_device *edev)
                                taillen = length - headlen;
                                memcpy((void *)NetRxPackets[0],
                                       buffer, headlen);
+                               dma_sync_single_for_cpu((unsigned 
long)macb->rx_buffer,
+                                                       taillen, 
DMA_FROM_DEVICE);
                                memcpy((void *)NetRxPackets[0] + headlen,
                                       macb->rx_buffer, taillen);
                                buffer = (void *)NetRxPackets[0];
                        }
 
                        net_receive(edev, buffer, length);
+                       dma_sync_single_for_device((unsigned long)buffer, 
length,
+                                                  DMA_FROM_DEVICE);
+                       barrier();
                        if (++rx_tail >= macb->rx_ring_size)
                                rx_tail = 0;
                        reclaim_rx_buffers(macb, rx_tail);
@@ -252,7 +261,6 @@ static int macb_recv(struct eth_device *edev)
                                rx_tail = 0;
                        }
                }
-               barrier();
        }
 
        return 0;
-- 
2.19.1


_______________________________________________
barebox mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/barebox

Reply via email to