struct efx_ef10_nic_data *nic_data = efx->nic_data;
        int rc;
 
+#ifdef CONFIG_SFC_SRIOV
+       struct efx_ef10_nic_data *nic_data_pf;
+       struct pci_dev *pci_dev_pf;
+       struct efx_nic *efx_pf;
+       struct ef10_vf *vf;
+
+       if (efx->pci_dev->is_virtfn) {
+               pci_dev_pf = efx->pci_dev->physfn;
+               if (pci_dev_pf) {
+                       efx_pf = pci_get_drvdata(pci_dev_pf);
+                       nic_data_pf = efx_pf->nic_data;
+                       vf = nic_data_pf->vf + nic_data->vf_index;
+                       vf->efx = NULL;
+               } else
+                       netif_info(efx, drv, efx->net_dev,
+                                  "Could not get the PF id from VF\n");
+       }
+#endif
+
        efx_ptp_remove(efx);
 
        efx_mcdi_mon_remove(efx);
        if (rc)
                goto fail;
 
+       if (efx->pci_dev->is_virtfn) {
+               if (efx->pci_dev->physfn) {
+                       struct efx_nic *efx_pf =
+                               pci_get_drvdata(efx->pci_dev->physfn);
+                       struct efx_ef10_nic_data *nic_data_p = efx_pf->nic_data;
+                       struct efx_ef10_nic_data *nic_data = efx->nic_data;
+
+                       nic_data_p->vf[nic_data->vf_index].efx = efx;
+               } else
+                       netif_info(efx, drv, efx->net_dev,
+                                  "Could not get the PF id from VF\n");
+       }
+
        return 0;
 
 fail:
 
                        efx_ef10_vport_free(efx, vf->vport_id);
                        vf->vport_id = 0;
                }
+
+               vf->efx = NULL;
        }
 }
 
 
        for (i = 0; i < efx->vf_count; i++) {
                random_ether_addr(nic_data->vf[i].mac);
+               nic_data->vf[i].efx = NULL;
 
                rc = efx_ef10_sriov_assign_vf_vport(efx, i);
                if (rc)
 
 
 /**
  * struct ef10_vf - PF's store of VF data
+ * @efx: efx_nic struct for the current VF
  * @vport_id: vport ID for the VF
  * @vport_assigned: record whether the vport is currently assigned to the VF
  * @mac: MAC address for the VF, zero when address is removed from the vport
  */
 struct ef10_vf {
+       struct efx_nic *efx;
        unsigned int vport_id;
        unsigned int vport_assigned;
        u8 mac[ETH_ALEN];