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

Simon Glass sjg at chromium.org
Tue Apr 7 20:39:01 CEST 2015


On 5 April 2015 at 12:31, Simon Glass <sjg at chromium.org> wrote:
> 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.

Applied to u-boot-dm/next, thanks!

- Simon


More information about the U-Boot mailing list