netdev: bfin_mac: handler RX status errors
authorPeter Meerwald <pmeerw@pmeerw.net>
Tue, 18 May 2010 00:20:50 +0000 (17:20 -0700)
committerDavid S. Miller <davem@davemloft.net>
Tue, 18 May 2010 00:20:50 +0000 (17:20 -0700)
Signed-off-by: Peter Meerwald <pmeerw@pmeerw.net>
Signed-off-by: Graf Yang <graf.yang@analog.com>
Signed-off-by: Mike Frysinger <vapier@gentoo.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/bfin_mac.c

index a173d8a..16f2a37 100644 (file)
@@ -980,12 +980,25 @@ out:
        return NETDEV_TX_OK;
 }
 
+#define RX_ERROR_MASK (RX_LONG | RX_ALIGN | RX_CRC | RX_LEN | \
+       RX_FRAG | RX_ADDR | RX_DMAO | RX_PHY | RX_LATE | RX_RANGE)
+
 static void bfin_mac_rx(struct net_device *dev)
 {
        struct sk_buff *skb, *new_skb;
        unsigned short len;
        struct bfin_mac_local *lp __maybe_unused = netdev_priv(dev);
 
+       /* check if frame status word reports an error condition
+        * we which case we simply drop the packet
+        */
+       if (current_rx_ptr->status.status_word & RX_ERROR_MASK) {
+               printk(KERN_NOTICE DRV_NAME
+                      ": rx: receive error - packet dropped\n");
+               dev->stats.rx_dropped++;
+               goto out;
+       }
+
        /* allocate a new skb for next time receive */
        skb = current_rx_ptr->skb;
 
@@ -1024,11 +1037,9 @@ static void bfin_mac_rx(struct net_device *dev)
        netif_rx(skb);
        dev->stats.rx_packets++;
        dev->stats.rx_bytes += len;
+out:
        current_rx_ptr->status.status_word = 0x00000000;
        current_rx_ptr = current_rx_ptr->next;
-
-out:
-       return;
 }
 
 /* interrupt routine to handle rx and error signal */