mirror of
https://github.com/AsahiLinux/u-boot
synced 2025-02-18 06:58:54 +00:00
net: dc2114x: Split RX path
Split the RX data check from the rest of the RX function, so that the check can be performed separately from the processing of the packet and the release of the received packet once the processing is finished. Signed-off-by: Marek Vasut <marek.vasut+renesas@gmail.com> Cc: Joe Hershberger <joe.hershberger@ni.com> Cc: Ramon Fried <rfried.dev@gmail.com>
This commit is contained in:
parent
32d8d11800
commit
05c4917958
1 changed files with 43 additions and 24 deletions
|
@ -367,29 +367,48 @@ done:
|
|||
return status;
|
||||
}
|
||||
|
||||
static int dc21x4x_recv(struct eth_device *dev)
|
||||
static int dc21x4x_recv_check(struct dc2114x_priv *priv)
|
||||
{
|
||||
struct dc2114x_priv *priv =
|
||||
container_of(dev, struct dc2114x_priv, dev);
|
||||
int length = 0;
|
||||
u32 status;
|
||||
|
||||
while (true) {
|
||||
status = le32_to_cpu(priv->rx_ring[priv->rx_new].status);
|
||||
|
||||
if (status & R_OWN)
|
||||
break;
|
||||
return 0;
|
||||
|
||||
if (status & RD_LS) {
|
||||
/* Valid frame status. */
|
||||
if (status & RD_ES) {
|
||||
/* There was an error. */
|
||||
printf("RX error status = 0x%08X\n", status);
|
||||
return -EINVAL;
|
||||
} else {
|
||||
/* A valid frame received. */
|
||||
length = (le32_to_cpu(priv->rx_ring[priv->rx_new].status)
|
||||
>> 16);
|
||||
|
||||
return length;
|
||||
}
|
||||
}
|
||||
|
||||
return -EAGAIN;
|
||||
}
|
||||
|
||||
static int dc21x4x_recv(struct eth_device *dev)
|
||||
{
|
||||
struct dc2114x_priv *priv =
|
||||
container_of(dev, struct dc2114x_priv, dev);
|
||||
int length = 0;
|
||||
int ret;
|
||||
|
||||
while (true) {
|
||||
ret = dc21x4x_recv_check(priv);
|
||||
if (!ret)
|
||||
break;
|
||||
|
||||
if (ret > 0) {
|
||||
length = ret;
|
||||
/* Pass the packet up to the protocol layers */
|
||||
net_process_received_packet
|
||||
(net_rx_packets[priv->rx_new], length - 4);
|
||||
|
@ -399,8 +418,8 @@ static int dc21x4x_recv(struct eth_device *dev)
|
|||
* Change buffer ownership for this frame,
|
||||
* back to the adapter.
|
||||
*/
|
||||
if (ret != -EAGAIN)
|
||||
priv->rx_ring[priv->rx_new].status = cpu_to_le32(R_OWN);
|
||||
}
|
||||
|
||||
/* Update entry information. */
|
||||
priv->rx_new = (priv->rx_new + 1) % priv->rx_ring_size;
|
||||
|
|
Loading…
Add table
Reference in a new issue