On 5 April 2015 at 12:31, Simon Glass <s...@chromium.org> wrote: > Hi Joe, > > On 3 April 2015 at 19:09, Joe Hershberger <joe.hershber...@ni.com> wrote: >> 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 <s...@chromium.org> >> Signed-off-by: Joe Hershberger <joe.hershber...@ni.com> >> Acked-by: Simon Glass <s...@chromium.org> >> Tested-by: Simon Glass <s...@chromium.org> >> Tested-on: pcduino3 >> --- >> This patch depends on dm/next >> >> Changes in v2: >> -Call free_pkt() even when driver returns 0 >> -Add more comments about this new behavior >> >> include/net.h | 8 +++++++- >> net/eth.c | 4 +++- >> 2 files changed, 10 insertions(+), 2 deletions(-) >> >> diff --git a/include/net.h b/include/net.h >> index e7f28d7..35602cd 100644 >> --- a/include/net.h >> +++ b/include/net.h >> @@ -97,7 +97,12 @@ struct eth_pdata { >> * send: Send the bytes passed in "packet" as a packet on the wire >> * 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 >> + * indicate that the hardware receive FIFO is empty. If 0 is returned, >> the >> + * network stack will not process the empty packet, but free_pkt() >> will be >> + * called if supplied >> + * 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 no error was 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 +118,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..05411f1 100644 >> --- a/net/eth.c >> +++ b/net/eth.c >> @@ -344,7 +344,9 @@ int eth_rx(void) >> ret = eth_get_ops(current)->recv(current, &packet); >> if (ret > 0) >> net_process_received_packet(packet, ret); >> - else >> + if (ret >= 0 && eth_get_ops(current)->free_pkt) >> + eth_get_ops(current)->free_pkt(current, packet, ret); >> + if (ret <= 0) >> break; >> } >> if (ret == -EAGAIN) >> -- >> 1.7.11.5 >> > > Looks good, I will pick this up for u-boot-dm/next.
Applied to u-boot-dm/next, thanks! - Simon _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot