Prechádzať zdrojové kódy

gianfar: Only process completed frames

If the LAST bit is not set in the RxBD, it's possible we're processing
an incomplete frame, which is bad.  While we're at it, add a constant
for the error bitmask, so the whole if-clause fits on one line,
and is more legible.

Signed-off-by: Dai Haruki <dai.haruki@freescale.com>
Signed-off-by: Andy Fleming <afleming@freescale.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
Andy Fleming 17 rokov pred
rodič
commit
99da5003a5
2 zmenil súbory, kde vykonal 4 pridanie a 3 odobranie
  1. 1 3
      drivers/net/gianfar.c
  2. 3 0
      drivers/net/gianfar.h

+ 1 - 3
drivers/net/gianfar.c

@@ -1526,9 +1526,7 @@ int gfar_clean_rx_ring(struct net_device *dev, int rx_work_limit)
 		rmb();
 		rmb();
 		skb = priv->rx_skbuff[priv->skb_currx];
 		skb = priv->rx_skbuff[priv->skb_currx];
 
 
-		if (!(bdp->status &
-		      (RXBD_LARGE | RXBD_SHORT | RXBD_NONOCTET
-		       | RXBD_CRCERR | RXBD_OVERRUN | RXBD_TRUNCATED))) {
+		if ((bdp->status & RXBD_LAST) && !(bdp->status & RXBD_ERR)) {
 			/* Increment the number of packets */
 			/* Increment the number of packets */
 			dev->stats.rx_packets++;
 			dev->stats.rx_packets++;
 			howmany++;
 			howmany++;

+ 3 - 0
drivers/net/gianfar.h

@@ -340,6 +340,9 @@ extern const char gfar_driver_version[];
 #define RXBD_OVERRUN		0x0002
 #define RXBD_OVERRUN		0x0002
 #define RXBD_TRUNCATED		0x0001
 #define RXBD_TRUNCATED		0x0001
 #define RXBD_STATS		0x01ff
 #define RXBD_STATS		0x01ff
+#define RXBD_ERR		(RXBD_LARGE | RXBD_SHORT | RXBD_NONOCTET 	\
+				| RXBD_CRCERR | RXBD_OVERRUN			\
+				| RXBD_TRUNCATED)
 
 
 /* Rx FCB status field bits */
 /* Rx FCB status field bits */
 #define RXFCB_VLN		0x8000
 #define RXFCB_VLN		0x8000