|
|
@@ -7914,8 +7914,6 @@ static netdev_tx_t tg3_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|
|
|
|
|
entry = tnapi->tx_prod;
|
|
|
base_flags = 0;
|
|
|
- if (skb->ip_summed == CHECKSUM_PARTIAL)
|
|
|
- base_flags |= TXD_FLAG_TCPUDP_CSUM;
|
|
|
|
|
|
mss = skb_shinfo(skb)->gso_size;
|
|
|
if (mss) {
|
|
|
@@ -7929,6 +7927,13 @@ static netdev_tx_t tg3_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|
|
|
|
|
hdr_len = skb_transport_offset(skb) + tcp_hdrlen(skb) - ETH_HLEN;
|
|
|
|
|
|
+ /* HW/FW can not correctly segment packets that have been
|
|
|
+ * vlan encapsulated.
|
|
|
+ */
|
|
|
+ if (skb->protocol == htons(ETH_P_8021Q) ||
|
|
|
+ skb->protocol == htons(ETH_P_8021AD))
|
|
|
+ return tg3_tso_bug(tp, tnapi, txq, skb);
|
|
|
+
|
|
|
if (!skb_is_gso_v6(skb)) {
|
|
|
if (unlikely((ETH_HLEN + hdr_len) > 80) &&
|
|
|
tg3_flag(tp, TSO_BUG))
|
|
|
@@ -7979,6 +7984,17 @@ static netdev_tx_t tg3_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|
|
base_flags |= tsflags << 12;
|
|
|
}
|
|
|
}
|
|
|
+ } else if (skb->ip_summed == CHECKSUM_PARTIAL) {
|
|
|
+ /* HW/FW can not correctly checksum packets that have been
|
|
|
+ * vlan encapsulated.
|
|
|
+ */
|
|
|
+ if (skb->protocol == htons(ETH_P_8021Q) ||
|
|
|
+ skb->protocol == htons(ETH_P_8021AD)) {
|
|
|
+ if (skb_checksum_help(skb))
|
|
|
+ goto drop;
|
|
|
+ } else {
|
|
|
+ base_flags |= TXD_FLAG_TCPUDP_CSUM;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
if (tg3_flag(tp, USE_JUMBO_BDFLAG) &&
|