[U-Boot] [PATCH v2] dm: eth: Provide a way for drivers to manage packet buffers
Simon Glass
sjg at chromium.org
Sun Apr 5 20:31:01 CEST 2015
Hi Joe,
On 3 April 2015 at 19:09, Joe Hershberger <joe.hershberger at 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 <sjg at chromium.org>
> Signed-off-by: Joe Hershberger <joe.hershberger at ni.com>
> Acked-by: Simon Glass <sjg at chromium.org>
> Tested-by: Simon Glass <sjg at 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.
Regards,
Simon
More information about the U-Boot
mailing list