summaryrefslogtreecommitdiff
path: root/drivers/net/ethernet/freescale/fec_main.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/ethernet/freescale/fec_main.c')
-rw-r--r--drivers/net/ethernet/freescale/fec_main.c17
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);