{
        struct qedf_ctx *qedf = container_of(fip, struct qedf_ctx, ctlr);
        struct ethhdr *eth_hdr;
-       struct vlan_ethhdr *vlan_hdr;
        struct fip_header *fiph;
        u16 op, vlan_tci = 0;
        u8 sub;
        op = ntohs(fiph->fip_op);
        sub = fiph->fip_subcode;
 
-       if (!qedf->vlan_hw_insert) {
-               vlan_hdr = skb_push(skb, sizeof(*vlan_hdr) - sizeof(*eth_hdr));
-               memcpy(vlan_hdr, eth_hdr, 2 * ETH_ALEN);
-               vlan_hdr->h_vlan_proto = htons(ETH_P_8021Q);
-               vlan_hdr->h_vlan_encapsulated_proto = eth_hdr->h_proto;
-               vlan_hdr->h_vlan_TCI = vlan_tci =  htons(qedf->vlan_id);
-       }
+       /*
+        * Add VLAN tag to non-offload FIP frame based on current stored VLAN
+        * for FIP/FCoE traffic.
+        */
+       __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), qedf->vlan_id);
 
-       /* Update eth_hdr since we added a VLAN tag */
-       eth_hdr = (struct ethhdr *)skb_mac_header(skb);
+       /* Get VLAN ID from skb for printing purposes */
+       __vlan_hwaccel_get_tag(skb, &vlan_tci);
 
        QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_LL2, "FIP frame send: "
            "dest=%pM op=%x sub=%x vlan=%04x.", eth_hdr->h_dest, op, sub,
        /* Handle FIP VLAN resp in the driver */
        if (op == FIP_OP_VLAN && sub == FIP_SC_VL_NOTE) {
                qedf_fcoe_process_vlan_resp(qedf, skb);
-               qedf->vlan_hw_insert = 0;
                kfree_skb(skb);
        } else if (op == FIP_OP_CTRL && sub == FIP_SC_CLR_VLINK) {
                QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_DISC, "Clear virtual "
 
                QEDF_WARN(&(qedf->dbg_ctx), "Did not receive FIP VLAN "
                           "response, falling back to default VLAN %d.\n",
                           qedf_fallback_vlan);
-               qedf_set_vlan_id(qedf, QEDF_FALLBACK_VLAN);
+               qedf_set_vlan_id(qedf, qedf_fallback_vlan);
 
                /*
                 * Zero out data_src_addr so we'll update it with the new
        /* Since the link when down and up to verify which vlan we're on */
        qedf->fipvlan_retries = qedf_fipvlan_retries;
        rc = qedf_initiate_fipvlan_req(qedf);
+       /* If getting the VLAN fails, set the VLAN to the fallback one */
        if (!rc)
-               return;
+               qedf_set_vlan_id(qedf, qedf_fallback_vlan);
 
        /*
         * We need to wait for an FCF to be selected due to the
        skb->mac_len = elen;
        skb->protocol = htons(ETH_P_FCOE);
 
+       /*
+        * Add VLAN tag to non-offload FCoE frame based on current stored VLAN
+        * for FIP/FCoE traffic.
+        */
        __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), qedf->vlan_id);
 
        /* fill up mac and fcoe headers */
        }
        set_bit(QEDF_LL2_STARTED, &qedf->flags);
 
-       /* hw will be insterting vlan tag*/
-       qedf->vlan_hw_insert = 1;
+       /* Set initial FIP/FCoE VLAN to NULL */
        qedf->vlan_id = 0;
 
        /*