net_device_ctx->vf_alloc = nvmsg->msg.v4_msg.vf_assoc.allocated;
        net_device_ctx->vf_serial = nvmsg->msg.v4_msg.vf_assoc.serial;
+
+       if (net_device_ctx->vf_alloc)
+               complete(&net_device_ctx->vf_add);
+
        netdev_info(ndev, "VF slot %u %s\n",
                    net_device_ctx->vf_serial,
                    net_device_ctx->vf_alloc ? "added" : "removed");
 
 
        }
 
+       /* Fallback path to check synthetic vf with
+        * help of mac addr
+        */
+       list_for_each_entry(ndev_ctx, &netvsc_dev_list, list) {
+               ndev = hv_get_drvdata(ndev_ctx->device_ctx);
+               if (ether_addr_equal(vf_netdev->perm_addr, ndev->perm_addr)) {
+                       netdev_notice(vf_netdev,
+                                     "falling back to mac addr based matching\n");
+                       return ndev;
+               }
+       }
+
        netdev_notice(vf_netdev,
                      "no netdev found for vf serial:%u\n", serial);
        return NULL;
        if (net_device_ctx->data_path_is_vf == vf_is_up)
                return NOTIFY_OK;
 
+       if (vf_is_up && !net_device_ctx->vf_alloc) {
+               netdev_info(ndev, "Waiting for the VF association from host\n");
+               wait_for_completion(&net_device_ctx->vf_add);
+       }
+
        ret = netvsc_switch_datapath(ndev, vf_is_up);
 
        if (ret) {
 
        netvsc_vf_setxdp(vf_netdev, NULL);
 
+       reinit_completion(&net_device_ctx->vf_add);
        netdev_rx_handler_unregister(vf_netdev);
        netdev_upper_dev_unlink(vf_netdev, ndev);
        RCU_INIT_POINTER(net_device_ctx->vf_netdev, NULL);
 
        INIT_DELAYED_WORK(&net_device_ctx->dwork, netvsc_link_change);
 
+       init_completion(&net_device_ctx->vf_add);
        spin_lock_init(&net_device_ctx->lock);
        INIT_LIST_HEAD(&net_device_ctx->reconfig_events);
        INIT_DELAYED_WORK(&net_device_ctx->vf_takeover, netvsc_vf_setup);