]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
net: sh_eth: Fix RX error handling
authorValentine Barshak <valentine.barshak@cogentembedded.com>
Tue, 30 May 2023 22:51:31 +0000 (00:51 +0200)
committerMarek Vasut <marek.vasut+renesas@mailbox.org>
Sat, 10 Jun 2023 11:34:05 +0000 (13:34 +0200)
In case RX error occurs, and the RD_RFE bit is set, the descriptor
is never returned back to the queue. Make sh_eth_recv_start return
zero length in this case so that the descriptor can be released
and pushed back to the list. Also return the more appropriate
-EAGAIN instead of -EINVAL if the descriptor is not ready yet.

Signed-off-by: Valentine Barshak <valentine.barshak@cogentembedded.com>
Reviewed-by: Marek Vasut <marek.vasut+renesas@mailbox.org>
Reviewed-by: Ramon Fried <rfried.dev@gmail.com>
drivers/net/sh_eth.c

index 7314caadfdc1efeb53cc098303906e17fc4ef5d1..7b1f59dc498961f6ff018f30041288ca1e0621aa 100644 (file)
@@ -129,11 +129,11 @@ static int sh_eth_recv_start(struct sh_eth_dev *eth)
        /* Check if the rx descriptor is ready */
        invalidate_cache(port_info->rx_desc_cur, sizeof(struct rx_desc_s));
        if (port_info->rx_desc_cur->rd0 & RD_RACT)
-               return -EINVAL;
+               return -EAGAIN;
 
        /* Check for errors */
        if (port_info->rx_desc_cur->rd0 & RD_RFE)
-               return -EINVAL;
+               return 0;
 
        return port_info->rx_desc_cur->rd1 & 0xffff;
 }
@@ -556,15 +556,13 @@ static int sh_ether_recv(struct udevice *dev, int flags, uchar **packetp)
                *packetp = packet;
 
                return len;
-       } else {
-               len = 0;
+       }
 
-               /* Restart the receiver if disabled */
-               if (!(sh_eth_read(port_info, EDRRR) & EDRRR_R))
-                       sh_eth_write(port_info, EDRRR_R, EDRRR);
+       /* Restart the receiver if disabled */
+       if (!(sh_eth_read(port_info, EDRRR) & EDRRR_R))
+               sh_eth_write(port_info, EDRRR_R, EDRRR);
 
-               return -EAGAIN;
-       }
+       return len;
 }
 
 static int sh_ether_free_pkt(struct udevice *dev, uchar *packet, int length)