|
@@ -2103,6 +2103,13 @@ static struct sk_buff *sky2_receive(struct net_device *dev,
|
|
|
struct sky2_port *sky2 = netdev_priv(dev);
|
|
|
struct rx_ring_info *re = sky2->rx_ring + sky2->rx_next;
|
|
|
struct sk_buff *skb = NULL;
|
|
|
+ u16 count = (status & GMR_FS_LEN) >> 16;
|
|
|
+
|
|
|
+#ifdef SKY2_VLAN_TAG_USED
|
|
|
+ /* Account for vlan tag */
|
|
|
+ if (sky2->vlgrp && (status & GMR_FS_VLAN))
|
|
|
+ count -= VLAN_HLEN;
|
|
|
+#endif
|
|
|
|
|
|
if (unlikely(netif_msg_rx_status(sky2)))
|
|
|
printk(KERN_DEBUG PFX "%s: rx slot %u status 0x%x len %d\n",
|
|
@@ -2117,7 +2124,8 @@ static struct sk_buff *sky2_receive(struct net_device *dev,
|
|
|
if (!(status & GMR_FS_RX_OK))
|
|
|
goto resubmit;
|
|
|
|
|
|
- if (status >> 16 != length)
|
|
|
+ /* if length reported by DMA does not match PHY, packet was truncated */
|
|
|
+ if (length != count)
|
|
|
goto len_mismatch;
|
|
|
|
|
|
if (length < copybreak)
|
|
@@ -2133,6 +2141,10 @@ len_mismatch:
|
|
|
/* Truncation of overlength packets
|
|
|
causes PHY length to not match MAC length */
|
|
|
++sky2->net_stats.rx_length_errors;
|
|
|
+ if (netif_msg_rx_err(sky2) && net_ratelimit())
|
|
|
+ pr_info(PFX "%s: rx length mismatch: length %d status %#x\n",
|
|
|
+ dev->name, length, status);
|
|
|
+ goto resubmit;
|
|
|
|
|
|
error:
|
|
|
++sky2->net_stats.rx_errors;
|