mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-10 23:24:38 +00:00
net: sh_eth: Fix RX error handling
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>
This commit is contained in:
parent
d49ba9c8d7
commit
41a0cfd0c5
1 changed files with 8 additions and 10 deletions
|
@ -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);
|
||||
|
||||
return -EAGAIN;
|
||||
}
|
||||
|
||||
/* Restart the receiver if disabled */
|
||||
if (!(sh_eth_read(port_info, EDRRR) & EDRRR_R))
|
||||
sh_eth_write(port_info, EDRRR_R, EDRRR);
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
static int sh_ether_free_pkt(struct udevice *dev, uchar *packet, int length)
|
||||
|
|
Loading…
Reference in a new issue