/* Skip VLAN tag if present */
                if (ether_type == ETH_P_8021Q) {
-                       struct vlan_ethhdr *vhdr =
-                               (struct vlan_ethhdr *)skb->data;
+                       struct vlan_ethhdr *vhdr = skb_vlan_eth_hdr(skb);
 
                        ether_type = ntohs(vhdr->h_vlan_encapsulated_proto);
                }
 
                                                  struct be_wrb_params
                                                  *wrb_params)
 {
-       struct vlan_ethhdr *veh = (struct vlan_ethhdr *)skb->data;
+       struct vlan_ethhdr *veh = skb_vlan_eth_hdr(skb);
        unsigned int eth_hdr_len;
        struct iphdr *ip;
 
 
        if (unlikely(rc < 0))
                return rc;
 
-       vhdr = (struct vlan_ethhdr *)skb->data;
+       vhdr = skb_vlan_eth_hdr(skb);
        vhdr->h_vlan_TCI |= cpu_to_be16((skb->priority << VLAN_PRIO_SHIFT)
                                         & VLAN_PRIO_MASK);
 
 
                        rc = skb_cow_head(skb, 0);
                        if (rc < 0)
                                return rc;
-                       vhdr = (struct vlan_ethhdr *)skb->data;
+                       vhdr = skb_vlan_eth_hdr(skb);
                        vhdr->h_vlan_TCI = htons(tx_flags >>
                                                 I40E_TX_FLAGS_VLAN_SHIFT);
                } else {
 
 
                        if (skb_cow_head(skb, 0))
                                goto out_drop;
-                       vhdr = (struct vlan_ethhdr *)skb->data;
+                       vhdr = skb_vlan_eth_hdr(skb);
                        vhdr->h_vlan_TCI = htons(tx_flags >>
                                                 IXGBE_TX_FLAGS_VLAN_SHIFT);
                } else {
 
 
        if (protocol == cpu_to_be16(ETH_P_8021Q)) {
 
-               vh = (struct vlan_ethhdr *)skb->data;
+               vh = skb_vlan_eth_hdr(skb);
                protocol = vh->h_vlan_encapsulated_proto;
                flags = FLAGS_VLAN_TAGGED;
 
 
 
        if (adapter->flags & QLCNIC_VLAN_FILTERING) {
                if (protocol == ETH_P_8021Q) {
-                       vh = (struct vlan_ethhdr *)skb->data;
+                       vh = skb_vlan_eth_hdr(skb);
                        vlan_id = ntohs(vh->h_vlan_TCI);
                } else if (skb_vlan_tag_present(skb)) {
                        vlan_id = skb_vlan_tag_get(skb);
        u32 producer = tx_ring->producer;
 
        if (protocol == ETH_P_8021Q) {
-               vh = (struct vlan_ethhdr *)skb->data;
+               vh = skb_vlan_eth_hdr(skb);
                flags = QLCNIC_FLAGS_VLAN_TAGGED;
                vlan_tci = ntohs(vh->h_vlan_TCI);
                protocol = ntohs(vh->h_vlan_encapsulated_proto);
 
        EFX_WARN_ON_ONCE_PARANOID(((struct ethhdr *)skb->data)->h_proto !=
                                  protocol);
        if (protocol == htons(ETH_P_8021Q)) {
-               struct vlan_ethhdr *veh = (struct vlan_ethhdr *)skb->data;
+               struct vlan_ethhdr *veh = skb_vlan_eth_hdr(skb);
 
                protocol = veh->h_vlan_encapsulated_proto;
        }
 
 
 static void stmmac_rx_vlan(struct net_device *dev, struct sk_buff *skb)
 {
-       struct vlan_ethhdr *veth;
-       __be16 vlan_proto;
+       struct vlan_ethhdr *veth = skb_vlan_eth_hdr(skb);
+       __be16 vlan_proto = veth->h_vlan_proto;
        u16 vlanid;
 
-       veth = (struct vlan_ethhdr *)skb->data;
-       vlan_proto = veth->h_vlan_proto;
-
        if ((vlan_proto == htons(ETH_P_8021Q) &&
             dev->features & NETIF_F_HW_VLAN_CTAG_RX) ||
            (vlan_proto == htons(ETH_P_8021AD) &&
 
        /* Get ethernet protocol */
        eth = (struct ethhdr *)skb->data;
        if (ntohs(eth->h_proto) == ETH_P_8021Q) {
-               vlan_eth = (struct vlan_ethhdr *)skb->data;
+               vlan_eth = skb_vlan_eth_hdr(skb);
                mac_proto = ntohs(vlan_eth->h_vlan_encapsulated_proto);
                network_data = skb->data + VLAN_ETH_HLEN;
                nic_type |= NIC_TYPE_F_VLAN;
         * driver based on the NIC mac
         */
        if (nic_type & NIC_TYPE_F_VLAN) {
-               struct vlan_ethhdr *vlan_eth = (struct vlan_ethhdr *)skb->data;
+               struct vlan_ethhdr *vlan_eth = skb_vlan_eth_hdr(skb);
 
                nic->vlan_id = ntohs(vlan_eth->h_vlan_TCI) & VLAN_VID_MASK;
                data_buf = skb->data + (VLAN_ETH_HLEN - ETH_HLEN);
 
        return (struct vlan_ethhdr *)skb_mac_header(skb);
 }
 
+/* Prefer this version in TX path, instead of
+ * skb_reset_mac_header() + vlan_eth_hdr()
+ */
+static inline struct vlan_ethhdr *skb_vlan_eth_hdr(const struct sk_buff *skb)
+{
+       return (struct vlan_ethhdr *)skb->data;
+}
+
 #define VLAN_PRIO_MASK         0xe000 /* Priority Code Point */
 #define VLAN_PRIO_SHIFT                13
 #define VLAN_CFI_MASK          0x1000 /* Canonical Format Indicator / Drop Eligible Indicator */
  */
 static inline int __vlan_get_tag(const struct sk_buff *skb, u16 *vlan_tci)
 {
-       struct vlan_ethhdr *veth = (struct vlan_ethhdr *)skb->data;
+       struct vlan_ethhdr *veth = skb_vlan_eth_hdr(skb);
 
        if (!eth_type_vlan(veth->h_vlan_proto))
                return -EINVAL;
                if (unlikely(!pskb_may_pull(skb, VLAN_ETH_HLEN)))
                        return false;
 
-               veh = (struct vlan_ethhdr *)skb->data;
+               veh = skb_vlan_eth_hdr(skb);
                protocol = veh->h_vlan_encapsulated_proto;
        }
 
 
                if (!pskb_may_pull(skb, VLAN_ETH_HLEN))
                        goto dropped;
 
-               vhdr = (struct vlan_ethhdr *)skb->data;
+               vhdr = skb_vlan_eth_hdr(skb);
 
                /* drop batman-in-batman packets to prevent loops */
                if (vhdr->h_vlan_encapsulated_proto != htons(ETH_P_BATMAN))