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