|
@@ -1370,6 +1370,19 @@ static int i40e_tx_prepare_vlan_flags(struct sk_buff *skb,
|
|
|
__be16 protocol = skb->protocol;
|
|
|
u32 tx_flags = 0;
|
|
|
|
|
|
+ if (protocol == htons(ETH_P_8021Q) &&
|
|
|
+ !(tx_ring->netdev->features & NETIF_F_HW_VLAN_CTAG_TX)) {
|
|
|
+ /* When HW VLAN acceleration is turned off by the user the
|
|
|
+ * stack sets the protocol to 8021q so that the driver
|
|
|
+ * can take any steps required to support the SW only
|
|
|
+ * VLAN handling. In our case the driver doesn't need
|
|
|
+ * to take any further steps so just set the protocol
|
|
|
+ * to the encapsulated ethertype.
|
|
|
+ */
|
|
|
+ skb->protocol = vlan_get_protocol(skb);
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+
|
|
|
/* if we have a HW VLAN tag being added, default to the HW one */
|
|
|
if (skb_vlan_tag_present(skb)) {
|
|
|
tx_flags |= skb_vlan_tag_get(skb) << I40E_TX_FLAGS_VLAN_SHIFT;
|
|
@@ -1386,6 +1399,7 @@ static int i40e_tx_prepare_vlan_flags(struct sk_buff *skb,
|
|
|
tx_flags |= I40E_TX_FLAGS_SW_VLAN;
|
|
|
}
|
|
|
|
|
|
+out:
|
|
|
*flags = tx_flags;
|
|
|
return 0;
|
|
|
}
|