summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/net.h6
-rw-r--r--net/eth.c15
2 files changed, 18 insertions, 3 deletions
diff --git a/include/net.h b/include/net.h
index a536fcc0617..0a1b3a827ce 100644
--- a/include/net.h
+++ b/include/net.h
@@ -95,7 +95,9 @@ struct eth_pdata {
*
* start: Prepare the hardware to send and receive packets
* send: Send the bytes passed in "packet" as a packet on the wire
- * recv: Check if the hardware received a packet. Call the network stack if so
+ * recv: Check if the hardware received a packet. If so, set the pointer to the
+ * packet buffer in the packetp parameter. If not, return an error or 0 to
+ * indicate that the hardware receive FIFO is empty
* stop: Stop the hardware from looking for packets - may be called even if
* state == PASSIVE
* mcast: Join or leave a multicast group (for TFTP) - optional
@@ -110,7 +112,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 1abf0274b48..058c55a0e6e 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,17 @@ 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;
+ }
+ if (ret == -EAGAIN)
+ ret = 0;
+ return ret;
}
static int eth_write_hwaddr(struct udevice *dev)