]> git.sur5r.net Git - u-boot/commitdiff
net: sh_eth: Split sh_eth_recv
authorMarek Vasut <marek.vasut+renesas@gmail.com>
Sun, 21 Jan 2018 14:39:50 +0000 (15:39 +0100)
committerMarek Vasut <marex@denx.de>
Sat, 27 Jan 2018 19:38:53 +0000 (20:38 +0100)
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>
drivers/net/sh_eth.c

index 7b11a5a0d3064392a63fa73ea406b18c5cdec5fb..99eab4c68838e755c8ec15a1921753cfc2dc913c 100644 (file)
@@ -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 = &eth->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 = &eth->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 = &eth->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))