mirror of
https://github.com/Fishwaldo/u-boot.git
synced 2025-03-21 22:51:37 +00:00
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
1 changed files with 36 additions and 24 deletions
|
@ -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);
|
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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,
|
||||||
};
|
};
|
||||||
|
|
Loading…
Add table
Reference in a new issue