diff options
Diffstat (limited to 'drivers/net/ethernet/intel/e1000')
| -rw-r--r-- | drivers/net/ethernet/intel/e1000/e1000_main.c | 11 | 
1 files changed, 11 insertions, 0 deletions
diff --git a/drivers/net/ethernet/intel/e1000/e1000_main.c b/drivers/net/ethernet/intel/e1000/e1000_main.c index 3bfbb8df898..bde337ee1a3 100644 --- a/drivers/net/ethernet/intel/e1000/e1000_main.c +++ b/drivers/net/ethernet/intel/e1000/e1000_main.c @@ -3149,6 +3149,17 @@ static netdev_tx_t e1000_xmit_frame(struct sk_buff *skb,  		return NETDEV_TX_OK;  	} +	/* On PCI/PCI-X HW, if packet size is less than ETH_ZLEN, +	 * packets may get corrupted during padding by HW. +	 * To WA this issue, pad all small packets manually. +	 */ +	if (skb->len < ETH_ZLEN) { +		if (skb_pad(skb, ETH_ZLEN - skb->len)) +			return NETDEV_TX_OK; +		skb->len = ETH_ZLEN; +		skb_set_tail_pointer(skb, ETH_ZLEN); +	} +  	mss = skb_shinfo(skb)->gso_size;  	/* The controller does a simple calculation to  	 * make sure there is enough room in the FIFO before  |