mirror of
https://github.com/brain-hackers/u-boot-brain
synced 2024-09-29 16:10:24 +09:00
driver: net: fm: separate receive buffer free code
Move the receive buffer free code in a separate function. Signed-off-by: Madalin Bucur <madalin.bucur@oss.nxp.com> Reviewed-by: Priyanka Jain <priyanka.jain@nxp.com>
This commit is contained in:
parent
8313cb0215
commit
1c710187a5
@ -567,20 +567,46 @@ static int fm_eth_send(struct eth_device *dev, void *buf, int len)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct fm_port_bd *fm_eth_free_one(struct fm_eth *fm_eth,
|
||||||
|
struct fm_port_bd *rxbd)
|
||||||
|
{
|
||||||
|
struct fm_port_global_pram *pram;
|
||||||
|
struct fm_port_bd *rxbd_base;
|
||||||
|
u16 offset_out;
|
||||||
|
|
||||||
|
pram = fm_eth->rx_pram;
|
||||||
|
|
||||||
|
/* clear the RxBDs */
|
||||||
|
muram_writew(&rxbd->status, RxBD_EMPTY);
|
||||||
|
muram_writew(&rxbd->len, 0);
|
||||||
|
sync();
|
||||||
|
|
||||||
|
/* advance RxBD */
|
||||||
|
rxbd++;
|
||||||
|
rxbd_base = (struct fm_port_bd *)fm_eth->rx_bd_ring;
|
||||||
|
if (rxbd >= (rxbd_base + RX_BD_RING_SIZE))
|
||||||
|
rxbd = rxbd_base;
|
||||||
|
|
||||||
|
/* update RxQD */
|
||||||
|
offset_out = muram_readw(&pram->rxqd.offset_out);
|
||||||
|
offset_out += sizeof(struct fm_port_bd);
|
||||||
|
if (offset_out >= muram_readw(&pram->rxqd.bd_ring_size))
|
||||||
|
offset_out = 0;
|
||||||
|
muram_writew(&pram->rxqd.offset_out, offset_out);
|
||||||
|
sync();
|
||||||
|
|
||||||
|
return rxbd;
|
||||||
|
}
|
||||||
|
|
||||||
static int fm_eth_recv(struct eth_device *dev)
|
static int fm_eth_recv(struct eth_device *dev)
|
||||||
{
|
{
|
||||||
struct fm_eth *fm_eth;
|
struct fm_eth *fm_eth = (struct fm_eth *)dev->priv;
|
||||||
struct fm_port_global_pram *pram;
|
struct fm_port_bd *rxbd = fm_eth->cur_rxbd;
|
||||||
struct fm_port_bd *rxbd, *rxbd_base;
|
|
||||||
u16 status, len;
|
|
||||||
u32 buf_lo, buf_hi;
|
u32 buf_lo, buf_hi;
|
||||||
|
u16 status, len;
|
||||||
|
int ret = -1;
|
||||||
u8 *data;
|
u8 *data;
|
||||||
u16 offset_out;
|
|
||||||
int ret = 1;
|
|
||||||
|
|
||||||
fm_eth = (struct fm_eth *)dev->priv;
|
|
||||||
pram = fm_eth->rx_pram;
|
|
||||||
rxbd = fm_eth->cur_rxbd;
|
|
||||||
status = muram_readw(&rxbd->status);
|
status = muram_readw(&rxbd->status);
|
||||||
|
|
||||||
while (!(status & RxBD_EMPTY)) {
|
while (!(status & RxBD_EMPTY)) {
|
||||||
@ -595,26 +621,11 @@ static int fm_eth_recv(struct eth_device *dev)
|
|||||||
ret = 0;
|
ret = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* clear the RxBDs */
|
/* free current bd, advance to next one */
|
||||||
muram_writew(&rxbd->status, RxBD_EMPTY);
|
rxbd = fm_eth_free_one(fm_eth, rxbd);
|
||||||
muram_writew(&rxbd->len, 0);
|
|
||||||
sync();
|
|
||||||
|
|
||||||
/* advance RxBD */
|
|
||||||
rxbd++;
|
|
||||||
rxbd_base = (struct fm_port_bd *)fm_eth->rx_bd_ring;
|
|
||||||
if (rxbd >= (rxbd_base + RX_BD_RING_SIZE))
|
|
||||||
rxbd = rxbd_base;
|
|
||||||
/* read next status */
|
/* read next status */
|
||||||
status = muram_readw(&rxbd->status);
|
status = muram_readw(&rxbd->status);
|
||||||
|
|
||||||
/* update RxQD */
|
|
||||||
offset_out = muram_readw(&pram->rxqd.offset_out);
|
|
||||||
offset_out += sizeof(struct fm_port_bd);
|
|
||||||
if (offset_out >= muram_readw(&pram->rxqd.bd_ring_size))
|
|
||||||
offset_out = 0;
|
|
||||||
muram_writew(&pram->rxqd.offset_out, offset_out);
|
|
||||||
sync();
|
|
||||||
}
|
}
|
||||||
fm_eth->cur_rxbd = (void *)rxbd;
|
fm_eth->cur_rxbd = (void *)rxbd;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user