return 0;
 }
 
-static u16 fec_enet_get_raw_vlan_tci(struct sk_buff *skb)
-{
-       struct vlan_ethhdr *vhdr;
-       unsigned short vlan_TCI = 0;
-
-       if (skb->protocol == htons(ETH_P_ALL)) {
-               vhdr = (struct vlan_ethhdr *)(skb->data);
-               vlan_TCI = ntohs(vhdr->h_vlan_TCI);
-       }
-
-       return vlan_TCI;
-}
-
 static u16 fec_enet_select_queue(struct net_device *ndev, struct sk_buff *skb,
                                 struct net_device *sb_dev)
 {
        struct fec_enet_private *fep = netdev_priv(ndev);
-       u16 vlan_tag;
+       u16 vlan_tag = 0;
 
        if (!(fep->quirks & FEC_QUIRK_HAS_AVB))
                return netdev_pick_tx(ndev, skb, NULL);
 
-       vlan_tag = fec_enet_get_raw_vlan_tci(skb);
-       if (!vlan_tag)
+       /* VLAN is present in the payload.*/
+       if (eth_type_vlan(skb->protocol)) {
+               struct vlan_ethhdr *vhdr = skb_vlan_eth_hdr(skb);
+
+               vlan_tag = ntohs(vhdr->h_vlan_TCI);
+       /*  VLAN is present in the skb but not yet pushed in the payload.*/
+       } else if (skb_vlan_tag_present(skb)) {
+               vlan_tag = skb->vlan_tci;
+       } else {
                return vlan_tag;
+       }
 
        return fec_enet_vlan_pri_to_queue[vlan_tag >> 13];
 }