net: gem: Separate recv and free_pkt functions
Use core to call net_process_received_packet() instead of call inside the driver. Signed-off-by: Michal Simek <michal.simek@xilinx.com> Acked-by: Joe Hershberger <joe.hershberger@ni.com>
This commit is contained in:
parent
da872d7c13
commit
9d9211ac11
@ -532,43 +532,54 @@ static int zynq_gem_send(struct udevice *dev, void *ptr, int len)
|
||||
static int zynq_gem_recv(struct udevice *dev, int flags, uchar **packetp)
|
||||
{
|
||||
int frame_len;
|
||||
u32 addr;
|
||||
struct zynq_gem_priv *priv = dev_get_priv(dev);
|
||||
struct emac_bd *current_bd = &priv->rx_bd[priv->rxbd_current];
|
||||
struct emac_bd *first_bd;
|
||||
|
||||
if (!(current_bd->addr & ZYNQ_GEM_RXBUF_NEW_MASK))
|
||||
return 0;
|
||||
return -1;
|
||||
|
||||
if (!(current_bd->status &
|
||||
(ZYNQ_GEM_RXBUF_SOF_MASK | ZYNQ_GEM_RXBUF_EOF_MASK))) {
|
||||
printf("GEM: SOF or EOF not set for last buffer received!\n");
|
||||
return 0;
|
||||
return -1;
|
||||
}
|
||||
|
||||
frame_len = current_bd->status & ZYNQ_GEM_RXBUF_LEN_MASK;
|
||||
if (frame_len) {
|
||||
u32 addr = current_bd->addr & ZYNQ_GEM_RXBUF_ADD_MASK;
|
||||
addr &= ~(ARCH_DMA_MINALIGN - 1);
|
||||
|
||||
net_process_received_packet((u8 *)(ulong)addr, frame_len);
|
||||
|
||||
if (current_bd->status & ZYNQ_GEM_RXBUF_SOF_MASK)
|
||||
priv->rx_first_buf = priv->rxbd_current;
|
||||
else {
|
||||
current_bd->addr &= ~ZYNQ_GEM_RXBUF_NEW_MASK;
|
||||
current_bd->status = 0xF0000000; /* FIXME */
|
||||
}
|
||||
|
||||
if (current_bd->status & ZYNQ_GEM_RXBUF_EOF_MASK) {
|
||||
first_bd = &priv->rx_bd[priv->rx_first_buf];
|
||||
first_bd->addr &= ~ZYNQ_GEM_RXBUF_NEW_MASK;
|
||||
first_bd->status = 0xF0000000;
|
||||
}
|
||||
|
||||
if ((++priv->rxbd_current) >= RX_BUF)
|
||||
priv->rxbd_current = 0;
|
||||
if (!frame_len) {
|
||||
printf("%s: Zero size packet?\n", __func__);
|
||||
return -1;
|
||||
}
|
||||
|
||||
addr = current_bd->addr & ZYNQ_GEM_RXBUF_ADD_MASK;
|
||||
addr &= ~(ARCH_DMA_MINALIGN - 1);
|
||||
*packetp = (uchar *)(uintptr_t)addr;
|
||||
|
||||
return frame_len;
|
||||
}
|
||||
|
||||
static int zynq_gem_free_pkt(struct udevice *dev, uchar *packet, int length)
|
||||
{
|
||||
struct zynq_gem_priv *priv = dev_get_priv(dev);
|
||||
struct emac_bd *current_bd = &priv->rx_bd[priv->rxbd_current];
|
||||
struct emac_bd *first_bd;
|
||||
|
||||
if (current_bd->status & ZYNQ_GEM_RXBUF_SOF_MASK) {
|
||||
priv->rx_first_buf = priv->rxbd_current;
|
||||
} else {
|
||||
current_bd->addr &= ~ZYNQ_GEM_RXBUF_NEW_MASK;
|
||||
current_bd->status = 0xF0000000; /* FIXME */
|
||||
}
|
||||
|
||||
if (current_bd->status & ZYNQ_GEM_RXBUF_EOF_MASK) {
|
||||
first_bd = &priv->rx_bd[priv->rx_first_buf];
|
||||
first_bd->addr &= ~ZYNQ_GEM_RXBUF_NEW_MASK;
|
||||
first_bd->status = 0xF0000000;
|
||||
}
|
||||
|
||||
if ((++priv->rxbd_current) >= RX_BUF)
|
||||
priv->rxbd_current = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -651,6 +662,7 @@ static const struct eth_ops zynq_gem_ops = {
|
||||
.start = zynq_gem_init,
|
||||
.send = zynq_gem_send,
|
||||
.recv = zynq_gem_recv,
|
||||
.free_pkt = zynq_gem_free_pkt,
|
||||
.stop = zynq_gem_halt,
|
||||
.write_hwaddr = zynq_gem_setup_mac,
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user