summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>2013-03-13 16:39:40 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2013-03-15 16:49:36 +0100
commit58926bd26fbe451dbc90b42d5008dbf9321d3eb7 (patch)
treee5695ee0f39b65b6e7751fe2caebc2cfc39717ca
parenta613c6848f933661af4094796d5b156be2f66cac (diff)
downloadbarebox-58926bd26fbe451dbc90b42d5008dbf9321d3eb7.tar.gz
barebox-58926bd26fbe451dbc90b42d5008dbf9321d3eb7.tar.xz
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>
-rw-r--r--drivers/net/macb.c32
1 files changed, 16 insertions, 16 deletions
diff --git a/drivers/net/macb.c b/drivers/net/macb.c
index 8602437a09..5ea8470ba3 100644
--- a/drivers/net/macb.c
+++ b/drivers/net/macb.c
@@ -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);