cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

ef10_sriov.c (20451B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/****************************************************************************
      3 * Driver for Solarflare network controllers and boards
      4 * Copyright 2015 Solarflare Communications Inc.
      5 */
      6#include <linux/etherdevice.h>
      7#include <linux/pci.h>
      8#include <linux/module.h>
      9#include "net_driver.h"
     10#include "ef10_sriov.h"
     11#include "efx.h"
     12#include "nic.h"
     13#include "mcdi_pcol.h"
     14
     15static int efx_ef10_evb_port_assign(struct efx_nic *efx, unsigned int port_id,
     16				    unsigned int vf_fn)
     17{
     18	MCDI_DECLARE_BUF(inbuf, MC_CMD_EVB_PORT_ASSIGN_IN_LEN);
     19	struct efx_ef10_nic_data *nic_data = efx->nic_data;
     20
     21	MCDI_SET_DWORD(inbuf, EVB_PORT_ASSIGN_IN_PORT_ID, port_id);
     22	MCDI_POPULATE_DWORD_2(inbuf, EVB_PORT_ASSIGN_IN_FUNCTION,
     23			      EVB_PORT_ASSIGN_IN_PF, nic_data->pf_index,
     24			      EVB_PORT_ASSIGN_IN_VF, vf_fn);
     25
     26	return efx_mcdi_rpc(efx, MC_CMD_EVB_PORT_ASSIGN, inbuf, sizeof(inbuf),
     27			    NULL, 0, NULL);
     28}
     29
     30static int efx_ef10_vswitch_alloc(struct efx_nic *efx, unsigned int port_id,
     31				  unsigned int vswitch_type)
     32{
     33	MCDI_DECLARE_BUF(inbuf, MC_CMD_VSWITCH_ALLOC_IN_LEN);
     34	int rc;
     35
     36	MCDI_SET_DWORD(inbuf, VSWITCH_ALLOC_IN_UPSTREAM_PORT_ID, port_id);
     37	MCDI_SET_DWORD(inbuf, VSWITCH_ALLOC_IN_TYPE, vswitch_type);
     38	MCDI_SET_DWORD(inbuf, VSWITCH_ALLOC_IN_NUM_VLAN_TAGS, 2);
     39	MCDI_POPULATE_DWORD_1(inbuf, VSWITCH_ALLOC_IN_FLAGS,
     40			      VSWITCH_ALLOC_IN_FLAG_AUTO_PORT, 0);
     41
     42	/* Quietly try to allocate 2 VLAN tags */
     43	rc = efx_mcdi_rpc_quiet(efx, MC_CMD_VSWITCH_ALLOC, inbuf, sizeof(inbuf),
     44				NULL, 0, NULL);
     45
     46	/* If 2 VLAN tags is too many, revert to trying with 1 VLAN tags */
     47	if (rc == -EPROTO) {
     48		MCDI_SET_DWORD(inbuf, VSWITCH_ALLOC_IN_NUM_VLAN_TAGS, 1);
     49		rc = efx_mcdi_rpc(efx, MC_CMD_VSWITCH_ALLOC, inbuf,
     50				  sizeof(inbuf), NULL, 0, NULL);
     51	} else if (rc) {
     52		efx_mcdi_display_error(efx, MC_CMD_VSWITCH_ALLOC,
     53				       MC_CMD_VSWITCH_ALLOC_IN_LEN,
     54				       NULL, 0, rc);
     55	}
     56	return rc;
     57}
     58
     59static int efx_ef10_vswitch_free(struct efx_nic *efx, unsigned int port_id)
     60{
     61	MCDI_DECLARE_BUF(inbuf, MC_CMD_VSWITCH_FREE_IN_LEN);
     62
     63	MCDI_SET_DWORD(inbuf, VSWITCH_FREE_IN_UPSTREAM_PORT_ID, port_id);
     64
     65	return efx_mcdi_rpc(efx, MC_CMD_VSWITCH_FREE, inbuf, sizeof(inbuf),
     66			    NULL, 0, NULL);
     67}
     68
     69static int efx_ef10_vport_alloc(struct efx_nic *efx,
     70				unsigned int port_id_in,
     71				unsigned int vport_type,
     72				u16 vlan,
     73				unsigned int *port_id_out)
     74{
     75	MCDI_DECLARE_BUF(inbuf, MC_CMD_VPORT_ALLOC_IN_LEN);
     76	MCDI_DECLARE_BUF(outbuf, MC_CMD_VPORT_ALLOC_OUT_LEN);
     77	size_t outlen;
     78	int rc;
     79
     80	EFX_WARN_ON_PARANOID(!port_id_out);
     81
     82	MCDI_SET_DWORD(inbuf, VPORT_ALLOC_IN_UPSTREAM_PORT_ID, port_id_in);
     83	MCDI_SET_DWORD(inbuf, VPORT_ALLOC_IN_TYPE, vport_type);
     84	MCDI_SET_DWORD(inbuf, VPORT_ALLOC_IN_NUM_VLAN_TAGS,
     85		       (vlan != EFX_EF10_NO_VLAN));
     86	MCDI_POPULATE_DWORD_1(inbuf, VPORT_ALLOC_IN_FLAGS,
     87			      VPORT_ALLOC_IN_FLAG_AUTO_PORT, 0);
     88	if (vlan != EFX_EF10_NO_VLAN)
     89		MCDI_POPULATE_DWORD_1(inbuf, VPORT_ALLOC_IN_VLAN_TAGS,
     90				      VPORT_ALLOC_IN_VLAN_TAG_0, vlan);
     91
     92	rc = efx_mcdi_rpc(efx, MC_CMD_VPORT_ALLOC, inbuf, sizeof(inbuf),
     93			  outbuf, sizeof(outbuf), &outlen);
     94	if (rc)
     95		return rc;
     96	if (outlen < MC_CMD_VPORT_ALLOC_OUT_LEN)
     97		return -EIO;
     98
     99	*port_id_out = MCDI_DWORD(outbuf, VPORT_ALLOC_OUT_VPORT_ID);
    100	return 0;
    101}
    102
    103static int efx_ef10_vport_free(struct efx_nic *efx, unsigned int port_id)
    104{
    105	MCDI_DECLARE_BUF(inbuf, MC_CMD_VPORT_FREE_IN_LEN);
    106
    107	MCDI_SET_DWORD(inbuf, VPORT_FREE_IN_VPORT_ID, port_id);
    108
    109	return efx_mcdi_rpc(efx, MC_CMD_VPORT_FREE, inbuf, sizeof(inbuf),
    110			    NULL, 0, NULL);
    111}
    112
    113static void efx_ef10_sriov_free_vf_vports(struct efx_nic *efx)
    114{
    115	struct efx_ef10_nic_data *nic_data = efx->nic_data;
    116	int i;
    117
    118	if (!nic_data->vf)
    119		return;
    120
    121	for (i = 0; i < efx->vf_count; i++) {
    122		struct ef10_vf *vf = nic_data->vf + i;
    123
    124		/* If VF is assigned, do not free the vport  */
    125		if (vf->pci_dev && pci_is_dev_assigned(vf->pci_dev))
    126			continue;
    127
    128		if (vf->vport_assigned) {
    129			efx_ef10_evb_port_assign(efx, EVB_PORT_ID_NULL, i);
    130			vf->vport_assigned = 0;
    131		}
    132
    133		if (!is_zero_ether_addr(vf->mac)) {
    134			efx_ef10_vport_del_mac(efx, vf->vport_id, vf->mac);
    135			eth_zero_addr(vf->mac);
    136		}
    137
    138		if (vf->vport_id) {
    139			efx_ef10_vport_free(efx, vf->vport_id);
    140			vf->vport_id = 0;
    141		}
    142
    143		vf->efx = NULL;
    144	}
    145}
    146
    147static void efx_ef10_sriov_free_vf_vswitching(struct efx_nic *efx)
    148{
    149	struct efx_ef10_nic_data *nic_data = efx->nic_data;
    150
    151	efx_ef10_sriov_free_vf_vports(efx);
    152	kfree(nic_data->vf);
    153	nic_data->vf = NULL;
    154}
    155
    156static int efx_ef10_sriov_assign_vf_vport(struct efx_nic *efx,
    157					  unsigned int vf_i)
    158{
    159	struct efx_ef10_nic_data *nic_data = efx->nic_data;
    160	struct ef10_vf *vf = nic_data->vf + vf_i;
    161	int rc;
    162
    163	if (WARN_ON_ONCE(!nic_data->vf))
    164		return -EOPNOTSUPP;
    165
    166	rc = efx_ef10_vport_alloc(efx, EVB_PORT_ID_ASSIGNED,
    167				  MC_CMD_VPORT_ALLOC_IN_VPORT_TYPE_NORMAL,
    168				  vf->vlan, &vf->vport_id);
    169	if (rc)
    170		return rc;
    171
    172	rc = efx_ef10_vport_add_mac(efx, vf->vport_id, vf->mac);
    173	if (rc) {
    174		eth_zero_addr(vf->mac);
    175		return rc;
    176	}
    177
    178	rc =  efx_ef10_evb_port_assign(efx, vf->vport_id, vf_i);
    179	if (rc)
    180		return rc;
    181
    182	vf->vport_assigned = 1;
    183	return 0;
    184}
    185
    186static int efx_ef10_sriov_alloc_vf_vswitching(struct efx_nic *efx)
    187{
    188	struct efx_ef10_nic_data *nic_data = efx->nic_data;
    189	unsigned int i;
    190	int rc;
    191
    192	nic_data->vf = kcalloc(efx->vf_count, sizeof(struct ef10_vf),
    193			       GFP_KERNEL);
    194	if (!nic_data->vf)
    195		return -ENOMEM;
    196
    197	for (i = 0; i < efx->vf_count; i++) {
    198		eth_random_addr(nic_data->vf[i].mac);
    199		nic_data->vf[i].efx = NULL;
    200		nic_data->vf[i].vlan = EFX_EF10_NO_VLAN;
    201
    202		rc = efx_ef10_sriov_assign_vf_vport(efx, i);
    203		if (rc)
    204			goto fail;
    205	}
    206
    207	return 0;
    208fail:
    209	efx_ef10_sriov_free_vf_vswitching(efx);
    210	return rc;
    211}
    212
    213static int efx_ef10_sriov_restore_vf_vswitching(struct efx_nic *efx)
    214{
    215	unsigned int i;
    216	int rc;
    217
    218	for (i = 0; i < efx->vf_count; i++) {
    219		rc = efx_ef10_sriov_assign_vf_vport(efx, i);
    220		if (rc)
    221			goto fail;
    222	}
    223
    224	return 0;
    225fail:
    226	efx_ef10_sriov_free_vf_vswitching(efx);
    227	return rc;
    228}
    229
    230static int efx_ef10_vadaptor_alloc_set_features(struct efx_nic *efx)
    231{
    232	u32 port_flags;
    233	int rc;
    234
    235	rc = efx_ef10_vadaptor_alloc(efx, efx->vport_id);
    236	if (rc)
    237		goto fail_vadaptor_alloc;
    238
    239	rc = efx_ef10_vadaptor_query(efx, efx->vport_id,
    240				     &port_flags, NULL, NULL);
    241	if (rc)
    242		goto fail_vadaptor_query;
    243
    244	if (port_flags &
    245	    (1 << MC_CMD_VPORT_ALLOC_IN_FLAG_VLAN_RESTRICT_LBN))
    246		efx->fixed_features |= NETIF_F_HW_VLAN_CTAG_FILTER;
    247	else
    248		efx->fixed_features &= ~NETIF_F_HW_VLAN_CTAG_FILTER;
    249
    250	return 0;
    251
    252fail_vadaptor_query:
    253	efx_ef10_vadaptor_free(efx, EVB_PORT_ID_ASSIGNED);
    254fail_vadaptor_alloc:
    255	return rc;
    256}
    257
    258/* On top of the default firmware vswitch setup, create a VEB vswitch and
    259 * expansion vport for use by this function.
    260 */
    261int efx_ef10_vswitching_probe_pf(struct efx_nic *efx)
    262{
    263	struct efx_ef10_nic_data *nic_data = efx->nic_data;
    264	struct net_device *net_dev = efx->net_dev;
    265	int rc;
    266
    267	if (pci_sriov_get_totalvfs(efx->pci_dev) <= 0) {
    268		/* vswitch not needed as we have no VFs */
    269		efx_ef10_vadaptor_alloc_set_features(efx);
    270		return 0;
    271	}
    272
    273	rc = efx_ef10_vswitch_alloc(efx, EVB_PORT_ID_ASSIGNED,
    274				    MC_CMD_VSWITCH_ALLOC_IN_VSWITCH_TYPE_VEB);
    275	if (rc)
    276		goto fail1;
    277
    278	rc = efx_ef10_vport_alloc(efx, EVB_PORT_ID_ASSIGNED,
    279				  MC_CMD_VPORT_ALLOC_IN_VPORT_TYPE_NORMAL,
    280				  EFX_EF10_NO_VLAN, &efx->vport_id);
    281	if (rc)
    282		goto fail2;
    283
    284	rc = efx_ef10_vport_add_mac(efx, efx->vport_id, net_dev->dev_addr);
    285	if (rc)
    286		goto fail3;
    287	ether_addr_copy(nic_data->vport_mac, net_dev->dev_addr);
    288
    289	rc = efx_ef10_vadaptor_alloc_set_features(efx);
    290	if (rc)
    291		goto fail4;
    292
    293	return 0;
    294fail4:
    295	efx_ef10_vport_del_mac(efx, efx->vport_id, nic_data->vport_mac);
    296	eth_zero_addr(nic_data->vport_mac);
    297fail3:
    298	efx_ef10_vport_free(efx, efx->vport_id);
    299	efx->vport_id = EVB_PORT_ID_ASSIGNED;
    300fail2:
    301	efx_ef10_vswitch_free(efx, EVB_PORT_ID_ASSIGNED);
    302fail1:
    303	return rc;
    304}
    305
    306int efx_ef10_vswitching_probe_vf(struct efx_nic *efx)
    307{
    308	return efx_ef10_vadaptor_alloc_set_features(efx);
    309}
    310
    311int efx_ef10_vswitching_restore_pf(struct efx_nic *efx)
    312{
    313	struct efx_ef10_nic_data *nic_data = efx->nic_data;
    314	int rc;
    315
    316	if (!nic_data->must_probe_vswitching)
    317		return 0;
    318
    319	rc = efx_ef10_vswitching_probe_pf(efx);
    320	if (rc)
    321		goto fail;
    322
    323	rc = efx_ef10_sriov_restore_vf_vswitching(efx);
    324	if (rc)
    325		goto fail;
    326
    327	nic_data->must_probe_vswitching = false;
    328fail:
    329	return rc;
    330}
    331
    332int efx_ef10_vswitching_restore_vf(struct efx_nic *efx)
    333{
    334	struct efx_ef10_nic_data *nic_data = efx->nic_data;
    335	int rc;
    336
    337	if (!nic_data->must_probe_vswitching)
    338		return 0;
    339
    340	rc = efx_ef10_vadaptor_free(efx, EVB_PORT_ID_ASSIGNED);
    341	if (rc)
    342		return rc;
    343
    344	nic_data->must_probe_vswitching = false;
    345	return 0;
    346}
    347
    348void efx_ef10_vswitching_remove_pf(struct efx_nic *efx)
    349{
    350	struct efx_ef10_nic_data *nic_data = efx->nic_data;
    351
    352	efx_ef10_sriov_free_vf_vswitching(efx);
    353
    354	efx_ef10_vadaptor_free(efx, efx->vport_id);
    355
    356	if (efx->vport_id == EVB_PORT_ID_ASSIGNED)
    357		return; /* No vswitch was ever created */
    358
    359	if (!is_zero_ether_addr(nic_data->vport_mac)) {
    360		efx_ef10_vport_del_mac(efx, efx->vport_id,
    361				       efx->net_dev->dev_addr);
    362		eth_zero_addr(nic_data->vport_mac);
    363	}
    364	efx_ef10_vport_free(efx, efx->vport_id);
    365	efx->vport_id = EVB_PORT_ID_ASSIGNED;
    366
    367	/* Only free the vswitch if no VFs are assigned */
    368	if (!pci_vfs_assigned(efx->pci_dev))
    369		efx_ef10_vswitch_free(efx, efx->vport_id);
    370}
    371
    372void efx_ef10_vswitching_remove_vf(struct efx_nic *efx)
    373{
    374	efx_ef10_vadaptor_free(efx, EVB_PORT_ID_ASSIGNED);
    375}
    376
    377static int efx_ef10_pci_sriov_enable(struct efx_nic *efx, int num_vfs)
    378{
    379	int rc = 0;
    380	struct pci_dev *dev = efx->pci_dev;
    381
    382	efx->vf_count = num_vfs;
    383
    384	rc = efx_ef10_sriov_alloc_vf_vswitching(efx);
    385	if (rc)
    386		goto fail1;
    387
    388	rc = pci_enable_sriov(dev, num_vfs);
    389	if (rc)
    390		goto fail2;
    391
    392	return 0;
    393fail2:
    394	efx_ef10_sriov_free_vf_vswitching(efx);
    395fail1:
    396	efx->vf_count = 0;
    397	netif_err(efx, probe, efx->net_dev,
    398		  "Failed to enable SRIOV VFs\n");
    399	return rc;
    400}
    401
    402/* Disable SRIOV and remove VFs
    403 * If some VFs are attached to a guest (using Xen, only) nothing is
    404 * done if force=false, and vports are freed if force=true (for the non
    405 * attachedc ones, only) but SRIOV is not disabled and VFs are not
    406 * removed in either case.
    407 */
    408static int efx_ef10_pci_sriov_disable(struct efx_nic *efx, bool force)
    409{
    410	struct pci_dev *dev = efx->pci_dev;
    411	unsigned int vfs_assigned = pci_vfs_assigned(dev);
    412	int rc = 0;
    413
    414	if (vfs_assigned && !force) {
    415		netif_info(efx, drv, efx->net_dev, "VFs are assigned to guests; "
    416			   "please detach them before disabling SR-IOV\n");
    417		return -EBUSY;
    418	}
    419
    420	if (!vfs_assigned)
    421		pci_disable_sriov(dev);
    422	else
    423		rc = -EBUSY;
    424
    425	efx_ef10_sriov_free_vf_vswitching(efx);
    426	efx->vf_count = 0;
    427	return rc;
    428}
    429
    430int efx_ef10_sriov_configure(struct efx_nic *efx, int num_vfs)
    431{
    432	if (num_vfs == 0)
    433		return efx_ef10_pci_sriov_disable(efx, false);
    434	else
    435		return efx_ef10_pci_sriov_enable(efx, num_vfs);
    436}
    437
    438int efx_ef10_sriov_init(struct efx_nic *efx)
    439{
    440	return 0;
    441}
    442
    443void efx_ef10_sriov_fini(struct efx_nic *efx)
    444{
    445	struct efx_ef10_nic_data *nic_data = efx->nic_data;
    446	int rc;
    447
    448	if (!nic_data->vf) {
    449		/* Remove any un-assigned orphaned VFs. This can happen if the PF driver
    450		 * was unloaded while any VF was assigned to a guest (using Xen, only).
    451		 */
    452		if (pci_num_vf(efx->pci_dev) && !pci_vfs_assigned(efx->pci_dev))
    453			pci_disable_sriov(efx->pci_dev);
    454		return;
    455	}
    456
    457	/* Disable SRIOV and remove any VFs in the host */
    458	rc = efx_ef10_pci_sriov_disable(efx, true);
    459	if (rc)
    460		netif_dbg(efx, drv, efx->net_dev,
    461			  "Disabling SRIOV was not successful rc=%d\n", rc);
    462	else
    463		netif_dbg(efx, drv, efx->net_dev, "SRIOV disabled\n");
    464}
    465
    466static int efx_ef10_vport_del_vf_mac(struct efx_nic *efx, unsigned int port_id,
    467				     u8 *mac)
    468{
    469	MCDI_DECLARE_BUF(inbuf, MC_CMD_VPORT_DEL_MAC_ADDRESS_IN_LEN);
    470	MCDI_DECLARE_BUF_ERR(outbuf);
    471	size_t outlen;
    472	int rc;
    473
    474	MCDI_SET_DWORD(inbuf, VPORT_DEL_MAC_ADDRESS_IN_VPORT_ID, port_id);
    475	ether_addr_copy(MCDI_PTR(inbuf, VPORT_DEL_MAC_ADDRESS_IN_MACADDR), mac);
    476
    477	rc = efx_mcdi_rpc(efx, MC_CMD_VPORT_DEL_MAC_ADDRESS, inbuf,
    478			  sizeof(inbuf), outbuf, sizeof(outbuf), &outlen);
    479
    480	return rc;
    481}
    482
    483int efx_ef10_sriov_set_vf_mac(struct efx_nic *efx, int vf_i, const u8 *mac)
    484{
    485	struct efx_ef10_nic_data *nic_data = efx->nic_data;
    486	struct ef10_vf *vf;
    487	int rc;
    488
    489	if (!nic_data->vf)
    490		return -EOPNOTSUPP;
    491
    492	if (vf_i >= efx->vf_count)
    493		return -EINVAL;
    494	vf = nic_data->vf + vf_i;
    495
    496	if (vf->efx) {
    497		efx_device_detach_sync(vf->efx);
    498		efx_net_stop(vf->efx->net_dev);
    499
    500		down_write(&vf->efx->filter_sem);
    501		vf->efx->type->filter_table_remove(vf->efx);
    502
    503		rc = efx_ef10_vadaptor_free(vf->efx, EVB_PORT_ID_ASSIGNED);
    504		if (rc) {
    505			up_write(&vf->efx->filter_sem);
    506			return rc;
    507		}
    508	}
    509
    510	rc = efx_ef10_evb_port_assign(efx, EVB_PORT_ID_NULL, vf_i);
    511	if (rc)
    512		return rc;
    513
    514	if (!is_zero_ether_addr(vf->mac)) {
    515		rc = efx_ef10_vport_del_vf_mac(efx, vf->vport_id, vf->mac);
    516		if (rc)
    517			return rc;
    518	}
    519
    520	if (!is_zero_ether_addr(mac)) {
    521		rc = efx_ef10_vport_add_mac(efx, vf->vport_id, mac);
    522		if (rc)
    523			goto fail;
    524
    525		if (vf->efx)
    526			eth_hw_addr_set(vf->efx->net_dev, mac);
    527	}
    528
    529	ether_addr_copy(vf->mac, mac);
    530
    531	rc = efx_ef10_evb_port_assign(efx, vf->vport_id, vf_i);
    532	if (rc)
    533		goto fail;
    534
    535	if (vf->efx) {
    536		/* VF cannot use the vport_id that the PF created */
    537		rc = efx_ef10_vadaptor_alloc(vf->efx, EVB_PORT_ID_ASSIGNED);
    538		if (rc) {
    539			up_write(&vf->efx->filter_sem);
    540			return rc;
    541		}
    542		vf->efx->type->filter_table_probe(vf->efx);
    543		up_write(&vf->efx->filter_sem);
    544		efx_net_open(vf->efx->net_dev);
    545		efx_device_attach_if_not_resetting(vf->efx);
    546	}
    547
    548	return 0;
    549
    550fail:
    551	eth_zero_addr(vf->mac);
    552	return rc;
    553}
    554
    555int efx_ef10_sriov_set_vf_vlan(struct efx_nic *efx, int vf_i, u16 vlan,
    556			       u8 qos)
    557{
    558	struct efx_ef10_nic_data *nic_data = efx->nic_data;
    559	struct ef10_vf *vf;
    560	u16 new_vlan;
    561	int rc = 0, rc2 = 0;
    562
    563	if (vf_i >= efx->vf_count)
    564		return -EINVAL;
    565	if (qos != 0)
    566		return -EINVAL;
    567
    568	vf = nic_data->vf + vf_i;
    569
    570	new_vlan = (vlan == 0) ? EFX_EF10_NO_VLAN : vlan;
    571	if (new_vlan == vf->vlan)
    572		return 0;
    573
    574	if (vf->efx) {
    575		efx_device_detach_sync(vf->efx);
    576		efx_net_stop(vf->efx->net_dev);
    577
    578		mutex_lock(&vf->efx->mac_lock);
    579		down_write(&vf->efx->filter_sem);
    580		vf->efx->type->filter_table_remove(vf->efx);
    581
    582		rc = efx_ef10_vadaptor_free(vf->efx, EVB_PORT_ID_ASSIGNED);
    583		if (rc)
    584			goto restore_filters;
    585	}
    586
    587	if (vf->vport_assigned) {
    588		rc = efx_ef10_evb_port_assign(efx, EVB_PORT_ID_NULL, vf_i);
    589		if (rc) {
    590			netif_warn(efx, drv, efx->net_dev,
    591				   "Failed to change vlan on VF %d.\n", vf_i);
    592			netif_warn(efx, drv, efx->net_dev,
    593				   "This is likely because the VF is bound to a driver in a VM.\n");
    594			netif_warn(efx, drv, efx->net_dev,
    595				   "Please unload the driver in the VM.\n");
    596			goto restore_vadaptor;
    597		}
    598		vf->vport_assigned = 0;
    599	}
    600
    601	if (!is_zero_ether_addr(vf->mac)) {
    602		rc = efx_ef10_vport_del_mac(efx, vf->vport_id, vf->mac);
    603		if (rc)
    604			goto restore_evb_port;
    605	}
    606
    607	if (vf->vport_id) {
    608		rc = efx_ef10_vport_free(efx, vf->vport_id);
    609		if (rc)
    610			goto restore_mac;
    611		vf->vport_id = 0;
    612	}
    613
    614	/* Do the actual vlan change */
    615	vf->vlan = new_vlan;
    616
    617	/* Restore everything in reverse order */
    618	rc = efx_ef10_vport_alloc(efx, EVB_PORT_ID_ASSIGNED,
    619				  MC_CMD_VPORT_ALLOC_IN_VPORT_TYPE_NORMAL,
    620				  vf->vlan, &vf->vport_id);
    621	if (rc)
    622		goto reset_nic_up_write;
    623
    624restore_mac:
    625	if (!is_zero_ether_addr(vf->mac)) {
    626		rc2 = efx_ef10_vport_add_mac(efx, vf->vport_id, vf->mac);
    627		if (rc2) {
    628			eth_zero_addr(vf->mac);
    629			goto reset_nic_up_write;
    630		}
    631	}
    632
    633restore_evb_port:
    634	rc2 = efx_ef10_evb_port_assign(efx, vf->vport_id, vf_i);
    635	if (rc2)
    636		goto reset_nic_up_write;
    637	else
    638		vf->vport_assigned = 1;
    639
    640restore_vadaptor:
    641	if (vf->efx) {
    642		rc2 = efx_ef10_vadaptor_alloc(vf->efx, EVB_PORT_ID_ASSIGNED);
    643		if (rc2)
    644			goto reset_nic_up_write;
    645	}
    646
    647restore_filters:
    648	if (vf->efx) {
    649		rc2 = vf->efx->type->filter_table_probe(vf->efx);
    650		if (rc2)
    651			goto reset_nic_up_write;
    652
    653		up_write(&vf->efx->filter_sem);
    654		mutex_unlock(&vf->efx->mac_lock);
    655
    656		rc2 = efx_net_open(vf->efx->net_dev);
    657		if (rc2)
    658			goto reset_nic;
    659
    660		efx_device_attach_if_not_resetting(vf->efx);
    661	}
    662	return rc;
    663
    664reset_nic_up_write:
    665	if (vf->efx) {
    666		up_write(&vf->efx->filter_sem);
    667		mutex_unlock(&vf->efx->mac_lock);
    668	}
    669reset_nic:
    670	if (vf->efx) {
    671		netif_err(efx, drv, efx->net_dev,
    672			  "Failed to restore VF - scheduling reset.\n");
    673		efx_schedule_reset(vf->efx, RESET_TYPE_DATAPATH);
    674	} else {
    675		netif_err(efx, drv, efx->net_dev,
    676			  "Failed to restore the VF and cannot reset the VF "
    677			  "- VF is not functional.\n");
    678		netif_err(efx, drv, efx->net_dev,
    679			  "Please reload the driver attached to the VF.\n");
    680	}
    681
    682	return rc ? rc : rc2;
    683}
    684
    685static int efx_ef10_sriov_set_privilege_mask(struct efx_nic *efx, int vf_i,
    686					     u32 mask, u32 value)
    687{
    688	MCDI_DECLARE_BUF(pm_outbuf, MC_CMD_PRIVILEGE_MASK_OUT_LEN);
    689	MCDI_DECLARE_BUF(pm_inbuf, MC_CMD_PRIVILEGE_MASK_IN_LEN);
    690	struct efx_ef10_nic_data *nic_data = efx->nic_data;
    691	u32 old_mask, new_mask;
    692	size_t outlen;
    693	int rc;
    694
    695	EFX_WARN_ON_PARANOID((value & ~mask) != 0);
    696
    697	/* Get privilege mask */
    698	MCDI_POPULATE_DWORD_2(pm_inbuf, PRIVILEGE_MASK_IN_FUNCTION,
    699			      PRIVILEGE_MASK_IN_FUNCTION_PF, nic_data->pf_index,
    700			      PRIVILEGE_MASK_IN_FUNCTION_VF, vf_i);
    701
    702	rc = efx_mcdi_rpc(efx, MC_CMD_PRIVILEGE_MASK,
    703			  pm_inbuf, sizeof(pm_inbuf),
    704			  pm_outbuf, sizeof(pm_outbuf), &outlen);
    705
    706	if (rc != 0)
    707		return rc;
    708	if (outlen != MC_CMD_PRIVILEGE_MASK_OUT_LEN)
    709		return -EIO;
    710
    711	old_mask = MCDI_DWORD(pm_outbuf, PRIVILEGE_MASK_OUT_OLD_MASK);
    712
    713	new_mask = old_mask & ~mask;
    714	new_mask |= value;
    715
    716	if (new_mask == old_mask)
    717		return 0;
    718
    719	new_mask |= MC_CMD_PRIVILEGE_MASK_IN_DO_CHANGE;
    720
    721	/* Set privilege mask */
    722	MCDI_SET_DWORD(pm_inbuf, PRIVILEGE_MASK_IN_NEW_MASK, new_mask);
    723
    724	rc = efx_mcdi_rpc(efx, MC_CMD_PRIVILEGE_MASK,
    725			  pm_inbuf, sizeof(pm_inbuf),
    726			  pm_outbuf, sizeof(pm_outbuf), &outlen);
    727
    728	if (rc != 0)
    729		return rc;
    730	if (outlen != MC_CMD_PRIVILEGE_MASK_OUT_LEN)
    731		return -EIO;
    732
    733	return 0;
    734}
    735
    736int efx_ef10_sriov_set_vf_spoofchk(struct efx_nic *efx, int vf_i, bool spoofchk)
    737{
    738	struct efx_ef10_nic_data *nic_data = efx->nic_data;
    739
    740	/* Can't enable spoofchk if firmware doesn't support it. */
    741	if (!(nic_data->datapath_caps &
    742	      BIT(MC_CMD_GET_CAPABILITIES_OUT_TX_MAC_SECURITY_FILTERING_LBN)) &&
    743	    spoofchk)
    744		return -EOPNOTSUPP;
    745
    746	return efx_ef10_sriov_set_privilege_mask(efx, vf_i,
    747		MC_CMD_PRIVILEGE_MASK_IN_GRP_MAC_SPOOFING_TX,
    748		spoofchk ? 0 : MC_CMD_PRIVILEGE_MASK_IN_GRP_MAC_SPOOFING_TX);
    749}
    750
    751int efx_ef10_sriov_set_vf_link_state(struct efx_nic *efx, int vf_i,
    752				     int link_state)
    753{
    754	MCDI_DECLARE_BUF(inbuf, MC_CMD_LINK_STATE_MODE_IN_LEN);
    755	struct efx_ef10_nic_data *nic_data = efx->nic_data;
    756
    757	BUILD_BUG_ON(IFLA_VF_LINK_STATE_AUTO !=
    758		     MC_CMD_LINK_STATE_MODE_IN_LINK_STATE_AUTO);
    759	BUILD_BUG_ON(IFLA_VF_LINK_STATE_ENABLE !=
    760		     MC_CMD_LINK_STATE_MODE_IN_LINK_STATE_UP);
    761	BUILD_BUG_ON(IFLA_VF_LINK_STATE_DISABLE !=
    762		     MC_CMD_LINK_STATE_MODE_IN_LINK_STATE_DOWN);
    763	MCDI_POPULATE_DWORD_2(inbuf, LINK_STATE_MODE_IN_FUNCTION,
    764			      LINK_STATE_MODE_IN_FUNCTION_PF,
    765			      nic_data->pf_index,
    766			      LINK_STATE_MODE_IN_FUNCTION_VF, vf_i);
    767	MCDI_SET_DWORD(inbuf, LINK_STATE_MODE_IN_NEW_MODE, link_state);
    768	return efx_mcdi_rpc(efx, MC_CMD_LINK_STATE_MODE, inbuf, sizeof(inbuf),
    769			    NULL, 0, NULL); /* don't care what old mode was */
    770}
    771
    772int efx_ef10_sriov_get_vf_config(struct efx_nic *efx, int vf_i,
    773				 struct ifla_vf_info *ivf)
    774{
    775	MCDI_DECLARE_BUF(inbuf, MC_CMD_LINK_STATE_MODE_IN_LEN);
    776	MCDI_DECLARE_BUF(outbuf, MC_CMD_LINK_STATE_MODE_OUT_LEN);
    777
    778	struct efx_ef10_nic_data *nic_data = efx->nic_data;
    779	struct ef10_vf *vf;
    780	size_t outlen;
    781	int rc;
    782
    783	if (vf_i >= efx->vf_count)
    784		return -EINVAL;
    785
    786	if (!nic_data->vf)
    787		return -EOPNOTSUPP;
    788
    789	vf = nic_data->vf + vf_i;
    790
    791	ivf->vf = vf_i;
    792	ivf->min_tx_rate = 0;
    793	ivf->max_tx_rate = 0;
    794	ether_addr_copy(ivf->mac, vf->mac);
    795	ivf->vlan = (vf->vlan == EFX_EF10_NO_VLAN) ? 0 : vf->vlan;
    796	ivf->qos = 0;
    797
    798	MCDI_POPULATE_DWORD_2(inbuf, LINK_STATE_MODE_IN_FUNCTION,
    799			      LINK_STATE_MODE_IN_FUNCTION_PF,
    800			      nic_data->pf_index,
    801			      LINK_STATE_MODE_IN_FUNCTION_VF, vf_i);
    802	MCDI_SET_DWORD(inbuf, LINK_STATE_MODE_IN_NEW_MODE,
    803		       MC_CMD_LINK_STATE_MODE_IN_DO_NOT_CHANGE);
    804	rc = efx_mcdi_rpc(efx, MC_CMD_LINK_STATE_MODE, inbuf, sizeof(inbuf),
    805			  outbuf, sizeof(outbuf), &outlen);
    806	if (rc)
    807		return rc;
    808	if (outlen < MC_CMD_LINK_STATE_MODE_OUT_LEN)
    809		return -EIO;
    810	ivf->linkstate = MCDI_DWORD(outbuf, LINK_STATE_MODE_OUT_OLD_MODE);
    811
    812	return 0;
    813}