[U-Boot] [PATCH v5 15/27] dm: eth: Pass the packet pointer as a parameter to recv

Simon Glass sjg at chromium.org
Wed Mar 4 19:35:16 CET 2015


Hi Joe,

On 3 March 2015 at 19:41, Joe Hershberger <joe.hershberger at ni.com> wrote:
> 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 at 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);

Need to update docs above. With serial we return -EAGAIN when there is
nothing more to receive. So you might want to swallow that error
instead of returning it from eth_rx().

>         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)
> --
> 1.7.11.5
>

Regards,
Simon


More information about the U-Boot mailing list