Skip to content
Snippets Groups Projects
Commit 9d9211ac authored by Michal Simek's avatar Michal Simek
Browse files

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: default avatarMichal Simek <michal.simek@xilinx.com>
Acked-by: default avatarJoe Hershberger <joe.hershberger@ni.com>
parent da872d7c
No related branches found
No related tags found
No related merge requests found
...@@ -532,43 +532,54 @@ static int zynq_gem_send(struct udevice *dev, void *ptr, int len) ...@@ -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) static int zynq_gem_recv(struct udevice *dev, int flags, uchar **packetp)
{ {
int frame_len; int frame_len;
u32 addr;
struct zynq_gem_priv *priv = dev_get_priv(dev); struct zynq_gem_priv *priv = dev_get_priv(dev);
struct emac_bd *current_bd = &priv->rx_bd[priv->rxbd_current]; 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)) if (!(current_bd->addr & ZYNQ_GEM_RXBUF_NEW_MASK))
return 0; return -1;
if (!(current_bd->status & if (!(current_bd->status &
(ZYNQ_GEM_RXBUF_SOF_MASK | ZYNQ_GEM_RXBUF_EOF_MASK))) { (ZYNQ_GEM_RXBUF_SOF_MASK | ZYNQ_GEM_RXBUF_EOF_MASK))) {
printf("GEM: SOF or EOF not set for last buffer received!\n"); 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; frame_len = current_bd->status & ZYNQ_GEM_RXBUF_LEN_MASK;
if (frame_len) { if (!frame_len) {
u32 addr = current_bd->addr & ZYNQ_GEM_RXBUF_ADD_MASK; printf("%s: Zero size packet?\n", __func__);
addr &= ~(ARCH_DMA_MINALIGN - 1); return -1;
}
net_process_received_packet((u8 *)(ulong)addr, frame_len); addr = current_bd->addr & ZYNQ_GEM_RXBUF_ADD_MASK;
addr &= ~(ARCH_DMA_MINALIGN - 1);
*packetp = (uchar *)(uintptr_t)addr;
if (current_bd->status & ZYNQ_GEM_RXBUF_SOF_MASK) return frame_len;
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) { static int zynq_gem_free_pkt(struct udevice *dev, uchar *packet, int length)
first_bd = &priv->rx_bd[priv->rx_first_buf]; {
first_bd->addr &= ~ZYNQ_GEM_RXBUF_NEW_MASK; struct zynq_gem_priv *priv = dev_get_priv(dev);
first_bd->status = 0xF0000000; 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 ((++priv->rxbd_current) >= RX_BUF) if (current_bd->status & ZYNQ_GEM_RXBUF_EOF_MASK) {
priv->rxbd_current = 0; 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; return 0;
} }
...@@ -651,6 +662,7 @@ static const struct eth_ops zynq_gem_ops = { ...@@ -651,6 +662,7 @@ static const struct eth_ops zynq_gem_ops = {
.start = zynq_gem_init, .start = zynq_gem_init,
.send = zynq_gem_send, .send = zynq_gem_send,
.recv = zynq_gem_recv, .recv = zynq_gem_recv,
.free_pkt = zynq_gem_free_pkt,
.stop = zynq_gem_halt, .stop = zynq_gem_halt,
.write_hwaddr = zynq_gem_setup_mac, .write_hwaddr = zynq_gem_setup_mac,
}; };
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment