[U-Boot] [PATCH] dm: eth: Provide a way for drivers to manage packet buffers

Joe Hershberger joe.hershberger at ni.com
Mon Mar 30 22:44:29 CEST 2015


Some drivers need a chance to manage their receive buffers after the
packet has been handled by the network stack. Add an operation that
will allow the driver to be called in that case.

Reported-by: Simon Glass <sjg at chromium.org>
Signed-off-by: Joe Hershberger <joe.hershberger at ni.com>
---
This patch depends on dm/next

 include/net.h | 4 ++++
 net/eth.c     | 8 ++++++--
 2 files changed, 10 insertions(+), 2 deletions(-)

diff --git a/include/net.h b/include/net.h
index e7f28d7..f9df532 100644
--- a/include/net.h
+++ b/include/net.h
@@ -98,6 +98,9 @@ struct eth_pdata {
  * 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
+ * free_pkt: Give the driver an opportunity to manage its packet buffer memory
+ *	     when the network stack is finished processing it. This will only be
+ *	     called when a packet was successfully returned from recv - optional
  * 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
@@ -113,6 +116,7 @@ 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 (*free_pkt)(struct udevice *dev, uchar *packet, int length);
 	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 13b7723..889ad8f 100644
--- a/net/eth.c
+++ b/net/eth.c
@@ -342,10 +342,14 @@ int eth_rx(void)
 	/* 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)
+		if (ret > 0) {
 			net_process_received_packet(packet, ret);
-		else
+			if (eth_get_ops(current)->free_pkt)
+				eth_get_ops(current)->free_pkt(current, packet,
+							       ret);
+		} else {
 			break;
+		}
 	}
 	if (ret == -EAGAIN)
 		ret = 0;
-- 
1.7.11.5



More information about the U-Boot mailing list