
Stop forcing drivers to call net_process_received_packet() - formerly called NetReceive(). Now the uclass will handle calling the driver for each packet until the driver errors or has nothing to return. The uclass will then pass the good packets off to the network stack by calling net_process_received_packet().
Signed-off-by: Joe Hershberger joe.hershberger@ni.com
---
Changes in v5: -New to v5
Changes in v4: None Changes in v3: None Changes in v2: None
include/net.h | 2 +- net/eth.c | 13 ++++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-)
diff --git a/include/net.h b/include/net.h index 4e44832..37d1f36 100644 --- a/include/net.h +++ b/include/net.h @@ -110,7 +110,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); + int (*recv)(struct udevice *dev, uchar **packetp); void (*stop)(struct udevice *dev); #ifdef CONFIG_MCAST_TFTP int (*mcast)(struct udevice *dev, const u8 *enetaddr, int join); diff --git a/net/eth.c b/net/eth.c index 1abf027..b66d253 100644 --- a/net/eth.c +++ b/net/eth.c @@ -259,6 +259,9 @@ int eth_send(void *packet, int length) int eth_rx(void) { struct udevice *current; + uchar *packet; + int ret; + int i;
current = eth_get_dev(); if (!current) @@ -267,7 +270,15 @@ int eth_rx(void) if (!device_active(current)) return -EINVAL;
- return eth_get_ops(current)->recv(current); + /* Process up to 32 packets at one time */ + for (i = 0; i < 32; i++) { + ret = eth_get_ops(current)->recv(current, &packet); + if (ret > 0) + net_process_received_packet(packet, ret); + else + break; + } + return ret; }
static int eth_write_hwaddr(struct udevice *dev)