diff options
-rw-r--r-- | drivers/net/ethernet/freescale/fec_main.c | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c index 781b2c5a5abe..e8a241754a46 100644 --- a/drivers/net/ethernet/freescale/fec_main.c +++ b/drivers/net/ethernet/freescale/fec_main.c @@ -1277,7 +1277,13 @@ fec_enet_rx(struct net_device *ndev, int budget) /* Process the incoming frame. */ ndev->stats.rx_packets++; - pkt_len = bdp->bd.cbd_datlen; + + /* + * The packet length includes FCS, but we don't want + * to include that when passing upstream as it messes + * up bridging applications. + */ + pkt_len = bdp->bd.cbd_datlen - 4; ndev->stats.rx_bytes += pkt_len; data = fep->rx_skbuff[index]->data; @@ -1301,18 +1307,15 @@ fec_enet_rx(struct net_device *ndev, int budget) } /* This does 16 byte alignment, exactly what we need. - * The packet length includes FCS, but we don't want to - * include that when passing upstream as it messes up - * bridging applications. */ - skb = netdev_alloc_skb(ndev, pkt_len - 4 + NET_IP_ALIGN); + skb = netdev_alloc_skb(ndev, pkt_len + NET_IP_ALIGN); if (unlikely(!skb)) { ndev->stats.rx_dropped++; } else { int payload_offset = (2 * ETH_ALEN); skb_reserve(skb, NET_IP_ALIGN); - skb_put(skb, pkt_len - 4); /* Make room */ + skb_put(skb, pkt_len); /* Make room */ /* Extract the frame data without the VLAN header. */ skb_copy_to_linear_data(skb, data, (2 * ETH_ALEN)); @@ -1320,7 +1323,7 @@ fec_enet_rx(struct net_device *ndev, int budget) payload_offset = (2 * ETH_ALEN) + VLAN_HLEN; skb_copy_to_linear_data_offset(skb, (2 * ETH_ALEN), data + payload_offset, - pkt_len - 4 - (2 * ETH_ALEN)); + pkt_len - (2 * ETH_ALEN)); skb->protocol = eth_type_trans(skb, ndev); |