diff options
author | Marek Vasut <marek.vasut+renesas@gmail.com> | 2018-01-21 15:39:50 +0100 |
---|---|---|
committer | Marek Vasut <marex@denx.de> | 2018-01-27 20:38:53 +0100 |
commit | 52c15e220bc28eda298d899f552bc023131de7f3 (patch) | |
tree | 1fa80d481d3ba95c4f216adb71e48a059a8a4cff /drivers/net/sh_eth.c | |
parent | dca221bd92cf3befa387a711a2256f1e4e06e51e (diff) |
net: sh_eth: Split sh_eth_recv
Split sh_eth_recv into two functions, one which checks whether
a packet was received and one which handles the received packet.
This is done in preparation for DM support, which handles these
two parts separately.
Signed-off-by: Marek Vasut <marek.vasut+renesas@gmail.com>
Cc: Nobuhiro Iwamatsu <iwamatsu@nigauri.org>
Cc: Joe Hershberger <joe.hershberger@ni.com>
Diffstat (limited to 'drivers/net/sh_eth.c')
-rw-r--r-- | drivers/net/sh_eth.c | 73 |
1 files changed, 46 insertions, 27 deletions
diff --git a/drivers/net/sh_eth.c b/drivers/net/sh_eth.c index 7b11a5a0d3..99eab4c688 100644 --- a/drivers/net/sh_eth.c +++ b/drivers/net/sh_eth.c @@ -118,39 +118,58 @@ static int sh_eth_send_legacy(struct eth_device *dev, void *packet, int len) return sh_eth_send_common(eth, packet, len); } -static int sh_eth_recv_common(struct sh_eth_dev *eth) +static int sh_eth_recv_start(struct sh_eth_dev *eth) { int port = eth->port, len = 0; struct sh_eth_info *port_info = ð->port_info[port]; - uchar *packet; /* 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)) { - /* Check for errors */ - if (!(port_info->rx_desc_cur->rd0 & RD_RFE)) { - len = port_info->rx_desc_cur->rd1 & 0xffff; - packet = (uchar *) - ADDR_TO_P2(port_info->rx_desc_cur->rd2); - invalidate_cache(packet, len); - net_process_received_packet(packet, len); - } - - /* Make current descriptor available again */ - if (port_info->rx_desc_cur->rd0 & RD_RDLE) - port_info->rx_desc_cur->rd0 = RD_RACT | RD_RDLE; - else - port_info->rx_desc_cur->rd0 = RD_RACT; - - flush_cache_wback(port_info->rx_desc_cur, - sizeof(struct rx_desc_s)); - - /* Point to the next descriptor */ - port_info->rx_desc_cur++; - if (port_info->rx_desc_cur >= - port_info->rx_desc_base + NUM_RX_DESC) - port_info->rx_desc_cur = port_info->rx_desc_base; - } + if (port_info->rx_desc_cur->rd0 & RD_RACT) + return -EINVAL; + + /* Check for errors */ + if (port_info->rx_desc_cur->rd0 & RD_RFE) + return -EINVAL; + + len = port_info->rx_desc_cur->rd1 & 0xffff; + + return len; +} + +static void sh_eth_recv_finish(struct sh_eth_dev *eth) +{ + struct sh_eth_info *port_info = ð->port_info[eth->port]; + + /* Make current descriptor available again */ + if (port_info->rx_desc_cur->rd0 & RD_RDLE) + port_info->rx_desc_cur->rd0 = RD_RACT | RD_RDLE; + else + port_info->rx_desc_cur->rd0 = RD_RACT; + + flush_cache_wback(port_info->rx_desc_cur, + sizeof(struct rx_desc_s)); + + /* Point to the next descriptor */ + port_info->rx_desc_cur++; + if (port_info->rx_desc_cur >= + port_info->rx_desc_base + NUM_RX_DESC) + port_info->rx_desc_cur = port_info->rx_desc_base; +} + +static int sh_eth_recv_common(struct sh_eth_dev *eth) +{ + int port = eth->port, len = 0; + struct sh_eth_info *port_info = ð->port_info[port]; + uchar *packet = (uchar *)ADDR_TO_P2(port_info->rx_desc_cur->rd2); + + len = sh_eth_recv_start(eth); + if (len > 0) { + invalidate_cache(packet, len); + net_process_received_packet(packet, len); + sh_eth_recv_finish(eth); + } else + len = 0; /* Restart the receiver if disabled */ if (!(sh_eth_read(port_info, EDRRR) & EDRRR_R)) |