diff options
-rw-r--r-- | drivers/net/designware.c | 2 | ||||
-rw-r--r-- | drivers/net/sandbox-raw.c | 2 | ||||
-rw-r--r-- | drivers/net/sandbox.c | 2 | ||||
-rw-r--r-- | drivers/net/sunxi_emac.c | 2 | ||||
-rw-r--r-- | include/net.h | 10 | ||||
-rw-r--r-- | net/eth.c | 5 |
6 files changed, 17 insertions, 6 deletions
diff --git a/drivers/net/designware.c b/drivers/net/designware.c index 645ca64..bcae842 100644 --- a/drivers/net/designware.c +++ b/drivers/net/designware.c @@ -528,7 +528,7 @@ static int designware_eth_send(struct udevice *dev, void *packet, int length) return _dw_eth_send(priv, packet, length); } -static int designware_eth_recv(struct udevice *dev, uchar **packetp) +static int designware_eth_recv(struct udevice *dev, int flags, uchar **packetp) { struct dw_eth_dev *priv = dev_get_priv(dev); diff --git a/drivers/net/sandbox-raw.c b/drivers/net/sandbox-raw.c index 45c3b18..5912427 100644 --- a/drivers/net/sandbox-raw.c +++ b/drivers/net/sandbox-raw.c @@ -65,7 +65,7 @@ static int sb_eth_raw_send(struct udevice *dev, void *packet, int length) return sandbox_eth_raw_os_send(packet, length, priv); } -static int sb_eth_raw_recv(struct udevice *dev, uchar **packetp) +static int sb_eth_raw_recv(struct udevice *dev, int flags, uchar **packetp) { struct eth_pdata *pdata = dev_get_platdata(dev); struct eth_sandbox_raw_priv *priv = dev_get_priv(dev); diff --git a/drivers/net/sandbox.c b/drivers/net/sandbox.c index 4e083d3..6763a24 100644 --- a/drivers/net/sandbox.c +++ b/drivers/net/sandbox.c @@ -152,7 +152,7 @@ static int sb_eth_send(struct udevice *dev, void *packet, int length) return 0; } -static int sb_eth_recv(struct udevice *dev, uchar **packetp) +static int sb_eth_recv(struct udevice *dev, int flags, uchar **packetp) { struct eth_sandbox_priv *priv = dev_get_priv(dev); diff --git a/drivers/net/sunxi_emac.c b/drivers/net/sunxi_emac.c index e939bf2..11cd0ea 100644 --- a/drivers/net/sunxi_emac.c +++ b/drivers/net/sunxi_emac.c @@ -527,7 +527,7 @@ static int sunxi_emac_eth_send(struct udevice *dev, void *packet, int length) return _sunxi_emac_eth_send(priv, packet, length); } -static int sunxi_emac_eth_recv(struct udevice *dev, uchar **packetp) +static int sunxi_emac_eth_recv(struct udevice *dev, int flags, uchar **packetp) { struct emac_eth_dev *priv = dev_get_priv(dev); int rx_len; diff --git a/include/net.h b/include/net.h index d17173d..b9c13f2 100644 --- a/include/net.h +++ b/include/net.h @@ -93,6 +93,14 @@ struct eth_pdata { int phy_interface; }; +enum eth_recv_flags { + /* + * Check hardware device for new packets (otherwise only return those + * which are already in the memory buffer ready to process) + */ + ETH_RECV_CHECK_DEVICE = 1 << 0, +}; + /** * struct eth_ops - functions of Ethernet MAC controllers * @@ -120,7 +128,7 @@ struct eth_pdata { struct eth_ops { int (*start)(struct udevice *dev); int (*send)(struct udevice *dev, void *packet, int length); - int (*recv)(struct udevice *dev, uchar **packetp); + int (*recv)(struct udevice *dev, int flags, uchar **packetp); int (*free_pkt)(struct udevice *dev, uchar *packet, int length); void (*stop)(struct udevice *dev); #ifdef CONFIG_MCAST_TFTP @@ -404,6 +404,7 @@ int eth_rx(void) { struct udevice *current; uchar *packet; + int flags; int ret; int i; @@ -415,8 +416,10 @@ int eth_rx(void) return -EINVAL; /* Process up to 32 packets at one time */ + flags = ETH_RECV_CHECK_DEVICE; for (i = 0; i < 32; i++) { - ret = eth_get_ops(current)->recv(current, &packet); + ret = eth_get_ops(current)->recv(current, flags, &packet); + flags = 0; if (ret > 0) net_process_received_packet(packet, ret); if (ret >= 0 && eth_get_ops(current)->free_pkt) |