Commit f1122a34 authored by Shradha Shah's avatar Shradha Shah Committed by David S. Miller

sfc: Store the efx_nic struct of the current VF in the VF data struct

Initialised in efx_probe_vf and removal is dealt with in
efx_ef10_remove.

vf->efx is needed in future patches to change the MAC address
of the VF via the parent PF, while the driver is bound to the
VF.
Example: ip link set dev vf NUM mac LLADDR
Signed-off-by: default avatarShradha Shah <sshah@solarflare.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent cfc77c2f
...@@ -544,6 +544,25 @@ static void efx_ef10_remove(struct efx_nic *efx) ...@@ -544,6 +544,25 @@ static void efx_ef10_remove(struct efx_nic *efx)
struct efx_ef10_nic_data *nic_data = efx->nic_data; struct efx_ef10_nic_data *nic_data = efx->nic_data;
int rc; 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_ptp_remove(efx);
efx_mcdi_mon_remove(efx); efx_mcdi_mon_remove(efx);
...@@ -582,6 +601,19 @@ static int efx_ef10_probe_vf(struct efx_nic *efx) ...@@ -582,6 +601,19 @@ static int efx_ef10_probe_vf(struct efx_nic *efx)
if (rc) if (rc)
goto fail; 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; return 0;
fail: fail:
......
...@@ -160,6 +160,8 @@ static void efx_ef10_sriov_free_vf_vports(struct efx_nic *efx) ...@@ -160,6 +160,8 @@ static void efx_ef10_sriov_free_vf_vports(struct efx_nic *efx)
efx_ef10_vport_free(efx, vf->vport_id); efx_ef10_vport_free(efx, vf->vport_id);
vf->vport_id = 0; vf->vport_id = 0;
} }
vf->efx = NULL;
} }
} }
...@@ -215,6 +217,7 @@ static int efx_ef10_sriov_alloc_vf_vswitching(struct efx_nic *efx) ...@@ -215,6 +217,7 @@ static int efx_ef10_sriov_alloc_vf_vswitching(struct efx_nic *efx)
for (i = 0; i < efx->vf_count; i++) { for (i = 0; i < efx->vf_count; i++) {
random_ether_addr(nic_data->vf[i].mac); random_ether_addr(nic_data->vf[i].mac);
nic_data->vf[i].efx = NULL;
rc = efx_ef10_sriov_assign_vf_vport(efx, i); rc = efx_ef10_sriov_assign_vf_vport(efx, i);
if (rc) if (rc)
......
...@@ -14,11 +14,13 @@ ...@@ -14,11 +14,13 @@
/** /**
* struct ef10_vf - PF's store of VF data * 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_id: vport ID for the VF
* @vport_assigned: record whether the vport is currently assigned to 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 * @mac: MAC address for the VF, zero when address is removed from the vport
*/ */
struct ef10_vf { struct ef10_vf {
struct efx_nic *efx;
unsigned int vport_id; unsigned int vport_id;
unsigned int vport_assigned; unsigned int vport_assigned;
u8 mac[ETH_ALEN]; u8 mac[ETH_ALEN];
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment