mv643xx_eth: move receive error handling out of line
authorLennert Buytenhek <buytenh@marvell.com>
Thu, 20 Nov 2008 11:58:46 +0000 (03:58 -0800)
committerDavid S. Miller <davem@davemloft.net>
Thu, 20 Nov 2008 11:58:46 +0000 (03:58 -0800)
Signed-off-by: Lennert Buytenhek <buytenh@marvell.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/mv643xx_eth.c

index 9f3ee7d..d56724a 100644 (file)
@@ -543,35 +543,38 @@ static int rxq_process(struct rx_queue *rxq, int budget)
                 * on, or the error summary bit is set, the packet needs
                 * to be dropped.
                 */
-               if (((cmd_sts & (RX_FIRST_DESC | RX_LAST_DESC)) !=
-                                       (RX_FIRST_DESC | RX_LAST_DESC))
-                               || (cmd_sts & ERROR_SUMMARY)) {
-                       stats->rx_dropped++;
-
-                       if ((cmd_sts & (RX_FIRST_DESC | RX_LAST_DESC)) !=
-                               (RX_FIRST_DESC | RX_LAST_DESC)) {
-                               if (net_ratelimit())
-                                       dev_printk(KERN_ERR, &mp->dev->dev,
-                                                  "received packet spanning "
-                                                  "multiple descriptors\n");
-                       }
+               if ((cmd_sts & (RX_FIRST_DESC | RX_LAST_DESC | ERROR_SUMMARY))
+                       != (RX_FIRST_DESC | RX_LAST_DESC))
+                       goto err;
 
-                       if (cmd_sts & ERROR_SUMMARY)
-                               stats->rx_errors++;
+               /*
+                * The -4 is for the CRC in the trailer of the
+                * received packet
+                */
+               skb_put(skb, byte_cnt - 2 - 4);
 
-                       dev_kfree_skb(skb);
-               } else {
-                       /*
-                        * The -4 is for the CRC in the trailer of the
-                        * received packet
-                        */
-                       skb_put(skb, byte_cnt - 2 - 4);
-
-                       if (cmd_sts & LAYER_4_CHECKSUM_OK)
-                               skb->ip_summed = CHECKSUM_UNNECESSARY;
-                       skb->protocol = eth_type_trans(skb, mp->dev);
-                       netif_receive_skb(skb);
+               if (cmd_sts & LAYER_4_CHECKSUM_OK)
+                       skb->ip_summed = CHECKSUM_UNNECESSARY;
+               skb->protocol = eth_type_trans(skb, mp->dev);
+               netif_receive_skb(skb);
+
+               continue;
+
+err:
+               stats->rx_dropped++;
+
+               if ((cmd_sts & (RX_FIRST_DESC | RX_LAST_DESC)) !=
+                       (RX_FIRST_DESC | RX_LAST_DESC)) {
+                       if (net_ratelimit())
+                               dev_printk(KERN_ERR, &mp->dev->dev,
+                                          "received packet spanning "
+                                          "multiple descriptors\n");
                }
+
+               if (cmd_sts & ERROR_SUMMARY)
+                       stats->rx_errors++;
+
+               dev_kfree_skb(skb);
        }
 
        if (rx < budget)