|
@@ -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
|