From bcdfef7a26170bc9ec9bfe19469cad68ee07312d Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Wed, 9 Dec 2015 09:29:12 +0100 Subject: net: gem: Setup default phy address to -1 Undefined phy address is -1 not 0. Signed-off-by: Michal Simek Acked-by: Joe Hershberger --- drivers/net/zynq_gem.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'drivers/net/zynq_gem.c') diff --git a/drivers/net/zynq_gem.c b/drivers/net/zynq_gem.c index 0a41281e901..b0755f5e3b4 100644 --- a/drivers/net/zynq_gem.c +++ b/drivers/net/zynq_gem.c @@ -666,11 +666,12 @@ static int zynq_gem_ofdata_to_platdata(struct udevice *dev) priv->iobase = (struct zynq_gem_regs *)pdata->iobase; /* Hardcode for now */ priv->emio = 0; + priv->phyaddr = -1; offset = fdtdec_lookup_phandle(gd->fdt_blob, dev->of_offset, "phy-handle"); if (offset > 0) - priv->phyaddr = fdtdec_get_int(gd->fdt_blob, offset, "reg", 0); + priv->phyaddr = fdtdec_get_int(gd->fdt_blob, offset, "reg", -1); phy_mode = fdt_getprop(gd->fdt_blob, dev->of_offset, "phy-mode", NULL); if (phy_mode) -- cgit v1.2.3 From da872d7c136cdbc111f4937becfd0bb36e425df6 Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Wed, 9 Dec 2015 14:16:32 +0100 Subject: net: gem: Fix return value from recv recv function should return 0 instead of frame_len not to proceed the same packet again in core. Signed-off-by: Michal Simek Acked-by: Joe Hershberger --- drivers/net/zynq_gem.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'drivers/net/zynq_gem.c') diff --git a/drivers/net/zynq_gem.c b/drivers/net/zynq_gem.c index b0755f5e3b4..5f0f2005ceb 100644 --- a/drivers/net/zynq_gem.c +++ b/drivers/net/zynq_gem.c @@ -569,7 +569,7 @@ static int zynq_gem_recv(struct udevice *dev, int flags, uchar **packetp) priv->rxbd_current = 0; } - return frame_len; + return 0; } static void zynq_gem_halt(struct udevice *dev) -- cgit v1.2.3 From 9d9211ac11796898a12cc74b79302b08b5a6db93 Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Wed, 9 Dec 2015 14:26:48 +0100 Subject: 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 Acked-by: Joe Hershberger --- drivers/net/zynq_gem.c | 52 +++++++++++++++++++++++++++++++------------------- 1 file changed, 32 insertions(+), 20 deletions(-) (limited to 'drivers/net/zynq_gem.c') diff --git a/drivers/net/zynq_gem.c b/drivers/net/zynq_gem.c index 5f0f2005ceb..f7c20dc9cd5 100644 --- a/drivers/net/zynq_gem.c +++ b/drivers/net/zynq_gem.c @@ -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); + if (!frame_len) { + printf("%s: Zero size packet?\n", __func__); + 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) - priv->rx_first_buf = priv->rxbd_current; - else { - current_bd->addr &= ~ZYNQ_GEM_RXBUF_NEW_MASK; - current_bd->status = 0xF0000000; /* FIXME */ - } + return frame_len; +} - 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; - } +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 ((++priv->rxbd_current) >= RX_BUF) - priv->rxbd_current = 0; + 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, }; -- cgit v1.2.3 From 7bccc75a2b3f728981920abde4454ba4ea4e481a Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Fri, 11 Dec 2015 09:14:31 +0100 Subject: net: gem: Add driver dependencies to PHYLIB Clear driver dependecies via Kconfig. Remove PHYLIB dependency from the driver. Signed-off-by: Michal Simek --- drivers/net/zynq_gem.c | 4 ---- 1 file changed, 4 deletions(-) (limited to 'drivers/net/zynq_gem.c') diff --git a/drivers/net/zynq_gem.c b/drivers/net/zynq_gem.c index f7c20dc9cd5..7059c8432a3 100644 --- a/drivers/net/zynq_gem.c +++ b/drivers/net/zynq_gem.c @@ -27,10 +27,6 @@ DECLARE_GLOBAL_DATA_PTR; -#if !defined(CONFIG_PHYLIB) -# error XILINX_GEM_ETHERNET requires PHYLIB -#endif - /* Bit/mask specification */ #define ZYNQ_GEM_PHYMNTNC_OP_MASK 0x40020000 /* operation mask bits */ #define ZYNQ_GEM_PHYMNTNC_OP_R_MASK 0x20000000 /* read operation */ -- cgit v1.2.3