macb: fix gem_recv circular buffer handling
as we use a full buffer no need to check the SOF and reset the rx_tail fix at the same time the gem detection so we can have the rx_buffer allocated correctly according to the IP Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
This commit is contained in:
parent
a613c6848f
commit
58926bd26f
|
@ -172,7 +172,6 @@ static void reclaim_rx_buffers(struct macb_device *macb,
|
|||
static int gem_recv(struct eth_device *edev)
|
||||
{
|
||||
struct macb_device *macb = edev->priv;
|
||||
unsigned int rx_tail = macb->rx_tail;
|
||||
void *buffer;
|
||||
int length;
|
||||
u32 status;
|
||||
|
@ -181,20 +180,20 @@ static int gem_recv(struct eth_device *edev)
|
|||
|
||||
for (;;) {
|
||||
barrier();
|
||||
if (!(macb->rx_ring[rx_tail].addr & MACB_BIT(RX_USED)))
|
||||
if (!(macb->rx_ring[macb->rx_tail].addr & MACB_BIT(RX_USED)))
|
||||
return -1;
|
||||
|
||||
barrier();
|
||||
status = macb->rx_ring[rx_tail].ctrl;
|
||||
status = macb->rx_ring[macb->rx_tail].ctrl;
|
||||
length = MACB_BFEXT(RX_FRMLEN, status);
|
||||
if (status & MACB_BIT(RX_SOF)) {
|
||||
buffer = macb->rx_buffer + macb->rx_buffer_size * macb->rx_tail;
|
||||
net_receive(buffer, length);
|
||||
macb->rx_ring[rx_tail].ctrl &= ~MACB_BIT(RX_USED);
|
||||
barrier();
|
||||
}
|
||||
rx_tail++;
|
||||
buffer = macb->rx_buffer + macb->rx_buffer_size * macb->rx_tail;
|
||||
net_receive(buffer, length);
|
||||
macb->rx_ring[macb->rx_tail].addr &= ~MACB_BIT(RX_USED);
|
||||
barrier();
|
||||
|
||||
macb->rx_tail++;
|
||||
if (macb->rx_tail >= macb->rx_ring_size)
|
||||
macb->rx_tail = 0;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -619,11 +618,6 @@ static int macb_probe(struct device_d *dev)
|
|||
|
||||
macb->phy_flags = pdata->phy_flags;
|
||||
|
||||
macb_init_rx_buffer_size(macb, PKTSIZE);
|
||||
macb->rx_buffer = dma_alloc_coherent(macb->rx_buffer_size * macb->rx_ring_size);
|
||||
macb->rx_ring = dma_alloc_coherent(RX_RING_BYTES(macb));
|
||||
macb->tx_ring = dma_alloc_coherent(TX_RING_BYTES);
|
||||
|
||||
macb->regs = dev_request_mem_region(dev, 0);
|
||||
|
||||
/*
|
||||
|
@ -638,11 +632,17 @@ static int macb_probe(struct device_d *dev)
|
|||
|
||||
clk_enable(macb->pclk);
|
||||
|
||||
macb->is_gem = read_is_gem(macb);
|
||||
|
||||
if (macb_is_gem(macb))
|
||||
edev->recv = gem_recv;
|
||||
else
|
||||
edev->recv = macb_recv;
|
||||
macb->is_gem = read_is_gem(macb);
|
||||
|
||||
macb_init_rx_buffer_size(macb, PKTSIZE);
|
||||
macb->rx_buffer = dma_alloc_coherent(macb->rx_buffer_size * macb->rx_ring_size);
|
||||
macb->rx_ring = dma_alloc_coherent(RX_RING_BYTES(macb));
|
||||
macb->tx_ring = dma_alloc_coherent(TX_RING_BYTES);
|
||||
|
||||
macb_reset_hw(macb);
|
||||
ncfgr = macb_mdc_clk_div(macb);
|
||||
|
|
Loading…
Reference in New Issue