linux/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * QLogic qlcnic NIC Driver
   4 * Copyright (c) 2009-2013 QLogic Corporation
   5 */
   6
   7#include <linux/types.h>
   8
   9#include "qlcnic_sriov.h"
  10#include "qlcnic.h"
  11
  12#define QLCNIC_SRIOV_VF_MAX_MAC 7
  13#define QLC_VF_MIN_TX_RATE      100
  14#define QLC_VF_MAX_TX_RATE      9999
  15#define QLC_MAC_OPCODE_MASK     0x7
  16#define QLC_VF_FLOOD_BIT        BIT_16
  17#define QLC_FLOOD_MODE          0x5
  18#define QLC_SRIOV_ALLOW_VLAN0   BIT_19
  19#define QLC_INTR_COAL_TYPE_MASK 0x7
  20
  21static int qlcnic_sriov_pf_get_vport_handle(struct qlcnic_adapter *, u8);
  22
  23struct qlcnic_sriov_cmd_handler {
  24        int (*fn) (struct qlcnic_bc_trans *, struct qlcnic_cmd_args *);
  25};
  26
  27struct qlcnic_sriov_fw_cmd_handler {
  28        u32 cmd;
  29        int (*fn) (struct qlcnic_bc_trans *, struct qlcnic_cmd_args *);
  30};
  31
  32static int qlcnic_sriov_pf_set_vport_info(struct qlcnic_adapter *adapter,
  33                                          struct qlcnic_info *npar_info,
  34                                          u16 vport_id)
  35{
  36        struct qlcnic_cmd_args cmd;
  37        int err;
  38
  39        if (qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_SET_NIC_INFO))
  40                return -ENOMEM;
  41
  42        cmd.req.arg[1] = (vport_id << 16) | 0x1;
  43        cmd.req.arg[2] = npar_info->bit_offsets;
  44        cmd.req.arg[2] |= npar_info->min_tx_bw << 16;
  45        cmd.req.arg[3] = npar_info->max_tx_bw | (npar_info->max_tx_ques << 16);
  46        cmd.req.arg[4] = npar_info->max_tx_mac_filters;
  47        cmd.req.arg[4] |= npar_info->max_rx_mcast_mac_filters << 16;
  48        cmd.req.arg[5] = npar_info->max_rx_ucast_mac_filters |
  49                         (npar_info->max_rx_ip_addr << 16);
  50        cmd.req.arg[6] = npar_info->max_rx_lro_flow |
  51                         (npar_info->max_rx_status_rings << 16);
  52        cmd.req.arg[7] = npar_info->max_rx_buf_rings |
  53                         (npar_info->max_rx_ques << 16);
  54        cmd.req.arg[8] = npar_info->max_tx_vlan_keys;
  55        cmd.req.arg[8] |= npar_info->max_local_ipv6_addrs << 16;
  56        cmd.req.arg[9] = npar_info->max_remote_ipv6_addrs;
  57
  58        err = qlcnic_issue_cmd(adapter, &cmd);
  59        if (err)
  60                dev_err(&adapter->pdev->dev,
  61                        "Failed to set vport info, err=%d\n", err);
  62
  63        qlcnic_free_mbx_args(&cmd);
  64        return err;
  65}
  66
  67static int qlcnic_sriov_pf_cal_res_limit(struct qlcnic_adapter *adapter,
  68                                         struct qlcnic_info *info, u16 func)
  69{
  70        struct qlcnic_sriov *sriov = adapter->ahw->sriov;
  71        struct qlcnic_resources *res = &sriov->ff_max;
  72        u16 num_macs = sriov->num_allowed_vlans + 1;
  73        int ret = -EIO, vpid, id;
  74        struct qlcnic_vport *vp;
  75        u32 num_vfs, max, temp;
  76
  77        vpid = qlcnic_sriov_pf_get_vport_handle(adapter, func);
  78        if (vpid < 0)
  79                return -EINVAL;
  80
  81        num_vfs = sriov->num_vfs;
  82        max = num_vfs + 1;
  83        info->bit_offsets = 0xffff;
  84        info->max_tx_ques = res->num_tx_queues / max;
  85
  86        if (qlcnic_83xx_pf_check(adapter))
  87                num_macs = QLCNIC_83XX_SRIOV_VF_MAX_MAC;
  88
  89        info->max_rx_mcast_mac_filters = res->num_rx_mcast_mac_filters;
  90
  91        if (adapter->ahw->pci_func == func) {
  92                info->min_tx_bw = 0;
  93                info->max_tx_bw = MAX_BW;
  94
  95                temp = res->num_rx_ucast_mac_filters - num_macs * num_vfs;
  96                info->max_rx_ucast_mac_filters = temp;
  97                temp = res->num_tx_mac_filters - num_macs * num_vfs;
  98                info->max_tx_mac_filters = temp;
  99                temp = num_macs * num_vfs * QLCNIC_SRIOV_VF_MAX_MAC;
 100                temp = res->num_rx_mcast_mac_filters - temp;
 101                info->max_rx_mcast_mac_filters = temp;
 102
 103                info->max_tx_ques = res->num_tx_queues - sriov->num_vfs;
 104        } else {
 105                id = qlcnic_sriov_func_to_index(adapter, func);
 106                if (id < 0)
 107                        return id;
 108                vp = sriov->vf_info[id].vp;
 109                info->min_tx_bw = vp->min_tx_bw;
 110                info->max_tx_bw = vp->max_tx_bw;
 111
 112                info->max_rx_ucast_mac_filters = num_macs;
 113                info->max_tx_mac_filters = num_macs;
 114                temp = num_macs * QLCNIC_SRIOV_VF_MAX_MAC;
 115                info->max_rx_mcast_mac_filters = temp;
 116
 117                info->max_tx_ques = QLCNIC_SINGLE_RING;
 118        }
 119
 120        info->max_rx_ip_addr = res->num_destip / max;
 121        info->max_rx_status_rings = res->num_rx_status_rings / max;
 122        info->max_rx_buf_rings = res->num_rx_buf_rings / max;
 123        info->max_rx_ques = res->num_rx_queues / max;
 124        info->max_rx_lro_flow = res->num_lro_flows_supported / max;
 125        info->max_tx_vlan_keys = res->num_txvlan_keys;
 126        info->max_local_ipv6_addrs = res->max_local_ipv6_addrs;
 127        info->max_remote_ipv6_addrs = res->max_remote_ipv6_addrs;
 128
 129        ret = qlcnic_sriov_pf_set_vport_info(adapter, info, vpid);
 130        if (ret)
 131                return ret;
 132
 133        return 0;
 134}
 135
 136static void qlcnic_sriov_pf_set_ff_max_res(struct qlcnic_adapter *adapter,
 137                                           struct qlcnic_info *info)
 138{
 139        struct qlcnic_resources *ff_max = &adapter->ahw->sriov->ff_max;
 140
 141        ff_max->num_tx_mac_filters = info->max_tx_mac_filters;
 142        ff_max->num_rx_ucast_mac_filters = info->max_rx_ucast_mac_filters;
 143        ff_max->num_rx_mcast_mac_filters = info->max_rx_mcast_mac_filters;
 144        ff_max->num_txvlan_keys = info->max_tx_vlan_keys;
 145        ff_max->num_rx_queues = info->max_rx_ques;
 146        ff_max->num_tx_queues = info->max_tx_ques;
 147        ff_max->num_lro_flows_supported = info->max_rx_lro_flow;
 148        ff_max->num_destip = info->max_rx_ip_addr;
 149        ff_max->num_rx_buf_rings = info->max_rx_buf_rings;
 150        ff_max->num_rx_status_rings = info->max_rx_status_rings;
 151        ff_max->max_remote_ipv6_addrs = info->max_remote_ipv6_addrs;
 152        ff_max->max_local_ipv6_addrs = info->max_local_ipv6_addrs;
 153}
 154
 155static void qlcnic_sriov_set_vf_max_vlan(struct qlcnic_adapter *adapter,
 156                                         struct qlcnic_info *npar_info)
 157{
 158        struct qlcnic_sriov *sriov = adapter->ahw->sriov;
 159        int temp, total_fn;
 160
 161        temp = npar_info->max_rx_mcast_mac_filters;
 162        total_fn = sriov->num_vfs + 1;
 163
 164        temp = temp / (QLCNIC_SRIOV_VF_MAX_MAC * total_fn);
 165        sriov->num_allowed_vlans = temp - 1;
 166
 167        if (qlcnic_83xx_pf_check(adapter))
 168                sriov->num_allowed_vlans = 1;
 169
 170        netdev_info(adapter->netdev, "Max Guest VLANs supported per VF = %d\n",
 171                    sriov->num_allowed_vlans);
 172}
 173
 174static int qlcnic_sriov_get_pf_info(struct qlcnic_adapter *adapter,
 175                                    struct qlcnic_info *npar_info)
 176{
 177        int err;
 178        struct qlcnic_cmd_args cmd;
 179
 180        if (qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_GET_NIC_INFO))
 181                return -ENOMEM;
 182
 183        cmd.req.arg[1] = 0x2;
 184        err = qlcnic_issue_cmd(adapter, &cmd);
 185        if (err) {
 186                dev_err(&adapter->pdev->dev,
 187                        "Failed to get PF info, err=%d\n", err);
 188                goto out;
 189        }
 190
 191        npar_info->total_pf = cmd.rsp.arg[2] & 0xff;
 192        npar_info->total_rss_engines = (cmd.rsp.arg[2] >> 8) & 0xff;
 193        npar_info->max_vports = MSW(cmd.rsp.arg[2]);
 194        npar_info->max_tx_ques =  LSW(cmd.rsp.arg[3]);
 195        npar_info->max_tx_mac_filters = MSW(cmd.rsp.arg[3]);
 196        npar_info->max_rx_mcast_mac_filters = LSW(cmd.rsp.arg[4]);
 197        npar_info->max_rx_ucast_mac_filters = MSW(cmd.rsp.arg[4]);
 198        npar_info->max_rx_ip_addr = LSW(cmd.rsp.arg[5]);
 199        npar_info->max_rx_lro_flow = MSW(cmd.rsp.arg[5]);
 200        npar_info->max_rx_status_rings = LSW(cmd.rsp.arg[6]);
 201        npar_info->max_rx_buf_rings = MSW(cmd.rsp.arg[6]);
 202        npar_info->max_rx_ques = LSW(cmd.rsp.arg[7]);
 203        npar_info->max_tx_vlan_keys = MSW(cmd.rsp.arg[7]);
 204        npar_info->max_local_ipv6_addrs = LSW(cmd.rsp.arg[8]);
 205        npar_info->max_remote_ipv6_addrs = MSW(cmd.rsp.arg[8]);
 206
 207        qlcnic_sriov_set_vf_max_vlan(adapter, npar_info);
 208        qlcnic_sriov_pf_set_ff_max_res(adapter, npar_info);
 209        dev_info(&adapter->pdev->dev,
 210                 "\n\ttotal_pf: %d,\n"
 211                 "\n\ttotal_rss_engines: %d max_vports: %d max_tx_ques %d,\n"
 212                 "\tmax_tx_mac_filters: %d max_rx_mcast_mac_filters: %d,\n"
 213                 "\tmax_rx_ucast_mac_filters: 0x%x, max_rx_ip_addr: %d,\n"
 214                 "\tmax_rx_lro_flow: %d max_rx_status_rings: %d,\n"
 215                 "\tmax_rx_buf_rings: %d, max_rx_ques: %d, max_tx_vlan_keys %d\n"
 216                 "\tmax_local_ipv6_addrs: %d, max_remote_ipv6_addrs: %d\n",
 217                 npar_info->total_pf, npar_info->total_rss_engines,
 218                 npar_info->max_vports, npar_info->max_tx_ques,
 219                 npar_info->max_tx_mac_filters,
 220                 npar_info->max_rx_mcast_mac_filters,
 221                 npar_info->max_rx_ucast_mac_filters, npar_info->max_rx_ip_addr,
 222                 npar_info->max_rx_lro_flow, npar_info->max_rx_status_rings,
 223                 npar_info->max_rx_buf_rings, npar_info->max_rx_ques,
 224                 npar_info->max_tx_vlan_keys, npar_info->max_local_ipv6_addrs,
 225                 npar_info->max_remote_ipv6_addrs);
 226
 227out:
 228        qlcnic_free_mbx_args(&cmd);
 229        return err;
 230}
 231
 232static void qlcnic_sriov_pf_reset_vport_handle(struct qlcnic_adapter *adapter,
 233                                               u8 func)
 234{
 235        struct qlcnic_sriov  *sriov = adapter->ahw->sriov;
 236        struct qlcnic_vport *vp;
 237        int index;
 238
 239        if (adapter->ahw->pci_func == func) {
 240                sriov->vp_handle = 0;
 241        } else {
 242                index = qlcnic_sriov_func_to_index(adapter, func);
 243                if (index < 0)
 244                        return;
 245                vp = sriov->vf_info[index].vp;
 246                vp->handle = 0;
 247        }
 248}
 249
 250static void qlcnic_sriov_pf_set_vport_handle(struct qlcnic_adapter *adapter,
 251                                             u16 vport_handle, u8 func)
 252{
 253        struct qlcnic_sriov  *sriov = adapter->ahw->sriov;
 254        struct qlcnic_vport *vp;
 255        int index;
 256
 257        if (adapter->ahw->pci_func == func) {
 258                sriov->vp_handle = vport_handle;
 259        } else {
 260                index = qlcnic_sriov_func_to_index(adapter, func);
 261                if (index < 0)
 262                        return;
 263                vp = sriov->vf_info[index].vp;
 264                vp->handle = vport_handle;
 265        }
 266}
 267
 268static int qlcnic_sriov_pf_get_vport_handle(struct qlcnic_adapter *adapter,
 269                                            u8 func)
 270{
 271        struct qlcnic_sriov  *sriov = adapter->ahw->sriov;
 272        struct qlcnic_vf_info *vf_info;
 273        int index;
 274
 275        if (adapter->ahw->pci_func == func) {
 276                return sriov->vp_handle;
 277        } else {
 278                index = qlcnic_sriov_func_to_index(adapter, func);
 279                if (index >= 0) {
 280                        vf_info = &sriov->vf_info[index];
 281                        return vf_info->vp->handle;
 282                }
 283        }
 284
 285        return -EINVAL;
 286}
 287
 288static int qlcnic_sriov_pf_config_vport(struct qlcnic_adapter *adapter,
 289                                        u8 flag, u16 func)
 290{
 291        struct qlcnic_cmd_args cmd;
 292        int ret;
 293        int vpid;
 294
 295        if (qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_CONFIG_VPORT))
 296                return -ENOMEM;
 297
 298        if (flag) {
 299                cmd.req.arg[3] = func << 8;
 300        } else {
 301                vpid = qlcnic_sriov_pf_get_vport_handle(adapter, func);
 302                if (vpid < 0) {
 303                        ret = -EINVAL;
 304                        goto out;
 305                }
 306                cmd.req.arg[3] = ((vpid & 0xffff) << 8) | 1;
 307        }
 308
 309        ret = qlcnic_issue_cmd(adapter, &cmd);
 310        if (ret) {
 311                dev_err(&adapter->pdev->dev,
 312                        "Failed %s vport, err %d for func 0x%x\n",
 313                        (flag ? "enable" : "disable"), ret, func);
 314                goto out;
 315        }
 316
 317        if (flag) {
 318                vpid = cmd.rsp.arg[2] & 0xffff;
 319                qlcnic_sriov_pf_set_vport_handle(adapter, vpid, func);
 320        } else {
 321                qlcnic_sriov_pf_reset_vport_handle(adapter, func);
 322        }
 323
 324out:
 325        qlcnic_free_mbx_args(&cmd);
 326        return ret;
 327}
 328
 329static int qlcnic_sriov_pf_cfg_vlan_filtering(struct qlcnic_adapter *adapter,
 330                                              u8 enable)
 331{
 332        struct qlcnic_cmd_args cmd;
 333        int err;
 334
 335        err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_SET_NIC_INFO);
 336        if (err)
 337                return err;
 338
 339        cmd.req.arg[1] = 0x4;
 340        if (enable) {
 341                adapter->flags |= QLCNIC_VLAN_FILTERING;
 342                cmd.req.arg[1] |= BIT_16;
 343                if (qlcnic_84xx_check(adapter))
 344                        cmd.req.arg[1] |= QLC_SRIOV_ALLOW_VLAN0;
 345        } else {
 346                adapter->flags &= ~QLCNIC_VLAN_FILTERING;
 347        }
 348
 349        err = qlcnic_issue_cmd(adapter, &cmd);
 350        if (err)
 351                dev_err(&adapter->pdev->dev,
 352                        "Failed to configure VLAN filtering, err=%d\n", err);
 353
 354        qlcnic_free_mbx_args(&cmd);
 355        return err;
 356}
 357
 358/* On configuring VF flood bit, PFD will receive traffic from all VFs */
 359static int qlcnic_sriov_pf_cfg_flood(struct qlcnic_adapter *adapter)
 360{
 361        struct qlcnic_cmd_args cmd;
 362        int err;
 363
 364        err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_SET_NIC_INFO);
 365        if (err)
 366                return err;
 367
 368        cmd.req.arg[1] = QLC_FLOOD_MODE | QLC_VF_FLOOD_BIT;
 369
 370        err = qlcnic_issue_cmd(adapter, &cmd);
 371        if (err)
 372                dev_err(&adapter->pdev->dev,
 373                        "Failed to configure VF Flood bit on PF, err=%d\n",
 374                        err);
 375
 376        qlcnic_free_mbx_args(&cmd);
 377        return err;
 378}
 379
 380static int qlcnic_sriov_pf_cfg_eswitch(struct qlcnic_adapter *adapter,
 381                                       u8 func, u8 enable)
 382{
 383        struct qlcnic_cmd_args cmd;
 384        int err = -EIO;
 385
 386        if (qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_TOGGLE_ESWITCH))
 387                return -ENOMEM;
 388
 389        cmd.req.arg[0] |= (3 << 29);
 390        cmd.req.arg[1] = ((func & 0xf) << 2) | BIT_6 | BIT_1;
 391        if (enable)
 392                cmd.req.arg[1] |= BIT_0;
 393
 394        err = qlcnic_issue_cmd(adapter, &cmd);
 395
 396        if (err != QLCNIC_RCODE_SUCCESS) {
 397                dev_err(&adapter->pdev->dev,
 398                        "Failed to enable sriov eswitch%d\n", err);
 399                err = -EIO;
 400        }
 401
 402        qlcnic_free_mbx_args(&cmd);
 403        return err;
 404}
 405
 406static void qlcnic_sriov_pf_del_flr_queue(struct qlcnic_adapter *adapter)
 407{
 408        struct qlcnic_sriov *sriov = adapter->ahw->sriov;
 409        struct qlcnic_back_channel *bc = &sriov->bc;
 410        int i;
 411
 412        for (i = 0; i < sriov->num_vfs; i++)
 413                cancel_work_sync(&sriov->vf_info[i].flr_work);
 414
 415        destroy_workqueue(bc->bc_flr_wq);
 416}
 417
 418static int qlcnic_sriov_pf_create_flr_queue(struct qlcnic_adapter *adapter)
 419{
 420        struct qlcnic_back_channel *bc = &adapter->ahw->sriov->bc;
 421        struct workqueue_struct *wq;
 422
 423        wq = create_singlethread_workqueue("qlcnic-flr");
 424        if (wq == NULL) {
 425                dev_err(&adapter->pdev->dev, "Cannot create FLR workqueue\n");
 426                return -ENOMEM;
 427        }
 428
 429        bc->bc_flr_wq =  wq;
 430        return 0;
 431}
 432
 433void qlcnic_sriov_pf_cleanup(struct qlcnic_adapter *adapter)
 434{
 435        u8 func = adapter->ahw->pci_func;
 436
 437        if (!qlcnic_sriov_enable_check(adapter))
 438                return;
 439
 440        qlcnic_sriov_pf_del_flr_queue(adapter);
 441        qlcnic_sriov_cfg_bc_intr(adapter, 0);
 442        qlcnic_sriov_pf_config_vport(adapter, 0, func);
 443        qlcnic_sriov_pf_cfg_eswitch(adapter, func, 0);
 444        qlcnic_sriov_pf_cfg_vlan_filtering(adapter, 0);
 445        __qlcnic_sriov_cleanup(adapter);
 446        adapter->ahw->op_mode = QLCNIC_MGMT_FUNC;
 447        clear_bit(__QLCNIC_SRIOV_ENABLE, &adapter->state);
 448}
 449
 450void qlcnic_sriov_pf_disable(struct qlcnic_adapter *adapter)
 451{
 452        if (!qlcnic_sriov_pf_check(adapter))
 453                return;
 454
 455        if (!qlcnic_sriov_enable_check(adapter))
 456                return;
 457
 458        pci_disable_sriov(adapter->pdev);
 459        netdev_info(adapter->netdev,
 460                    "SR-IOV is disabled successfully on port %d\n",
 461                    adapter->portnum);
 462}
 463
 464static int qlcnic_pci_sriov_disable(struct qlcnic_adapter *adapter)
 465{
 466        struct net_device *netdev = adapter->netdev;
 467
 468        if (pci_vfs_assigned(adapter->pdev)) {
 469                netdev_err(adapter->netdev,
 470                           "SR-IOV VFs belonging to port %d are assigned to VMs. SR-IOV can not be disabled on this port\n",
 471                           adapter->portnum);
 472                netdev_info(adapter->netdev,
 473                            "Please detach SR-IOV VFs belonging to port %d from VMs, and then try to disable SR-IOV on this port\n",
 474                            adapter->portnum);
 475                return -EPERM;
 476        }
 477
 478        qlcnic_sriov_pf_disable(adapter);
 479
 480        rtnl_lock();
 481        if (netif_running(netdev))
 482                __qlcnic_down(adapter, netdev);
 483
 484        qlcnic_sriov_free_vlans(adapter);
 485
 486        qlcnic_sriov_pf_cleanup(adapter);
 487
 488        /* After disabling SRIOV re-init the driver in default mode
 489           configure opmode based on op_mode of function
 490         */
 491        if (qlcnic_83xx_configure_opmode(adapter)) {
 492                rtnl_unlock();
 493                return -EIO;
 494        }
 495
 496        if (netif_running(netdev))
 497                __qlcnic_up(adapter, netdev);
 498
 499        rtnl_unlock();
 500        return 0;
 501}
 502
 503static int qlcnic_sriov_pf_init(struct qlcnic_adapter *adapter)
 504{
 505        struct qlcnic_hardware_context *ahw = adapter->ahw;
 506        struct qlcnic_info nic_info, pf_info, vp_info;
 507        int err;
 508        u8 func = ahw->pci_func;
 509
 510        if (!qlcnic_sriov_enable_check(adapter))
 511                return 0;
 512
 513        err = qlcnic_sriov_pf_cfg_vlan_filtering(adapter, 1);
 514        if (err)
 515                return err;
 516
 517        if (qlcnic_84xx_check(adapter)) {
 518                err = qlcnic_sriov_pf_cfg_flood(adapter);
 519                if (err)
 520                        goto disable_vlan_filtering;
 521        }
 522
 523        err = qlcnic_sriov_pf_cfg_eswitch(adapter, func, 1);
 524        if (err)
 525                goto disable_vlan_filtering;
 526
 527        err = qlcnic_sriov_pf_config_vport(adapter, 1, func);
 528        if (err)
 529                goto disable_eswitch;
 530
 531        err = qlcnic_sriov_get_pf_info(adapter, &pf_info);
 532        if (err)
 533                goto delete_vport;
 534
 535        err = qlcnic_get_nic_info(adapter, &nic_info, func);
 536        if (err)
 537                goto delete_vport;
 538
 539        err = qlcnic_sriov_pf_cal_res_limit(adapter, &vp_info, func);
 540        if (err)
 541                goto delete_vport;
 542
 543        err = qlcnic_sriov_cfg_bc_intr(adapter, 1);
 544        if (err)
 545                goto delete_vport;
 546
 547        ahw->physical_port = (u8) nic_info.phys_port;
 548        ahw->switch_mode = nic_info.switch_mode;
 549        ahw->max_mtu = nic_info.max_mtu;
 550        ahw->capabilities = nic_info.capabilities;
 551        ahw->nic_mode = QLC_83XX_SRIOV_MODE;
 552        return err;
 553
 554delete_vport:
 555        qlcnic_sriov_pf_config_vport(adapter, 0, func);
 556
 557disable_eswitch:
 558        qlcnic_sriov_pf_cfg_eswitch(adapter, func, 0);
 559
 560disable_vlan_filtering:
 561        qlcnic_sriov_pf_cfg_vlan_filtering(adapter, 0);
 562
 563        return err;
 564}
 565
 566static int qlcnic_sriov_pf_enable(struct qlcnic_adapter *adapter, int num_vfs)
 567{
 568        int err;
 569
 570        if (!qlcnic_sriov_enable_check(adapter))
 571                return 0;
 572
 573        err = pci_enable_sriov(adapter->pdev, num_vfs);
 574        if (err)
 575                qlcnic_sriov_pf_cleanup(adapter);
 576
 577        return err;
 578}
 579
 580static int __qlcnic_pci_sriov_enable(struct qlcnic_adapter *adapter,
 581                                     int num_vfs)
 582{
 583        int err = 0;
 584
 585        set_bit(__QLCNIC_SRIOV_ENABLE, &adapter->state);
 586        adapter->ahw->op_mode = QLCNIC_SRIOV_PF_FUNC;
 587
 588        err = qlcnic_sriov_init(adapter, num_vfs);
 589        if (err)
 590                goto clear_op_mode;
 591
 592        err = qlcnic_sriov_pf_create_flr_queue(adapter);
 593        if (err)
 594                goto sriov_cleanup;
 595
 596        err = qlcnic_sriov_pf_init(adapter);
 597        if (err)
 598                goto del_flr_queue;
 599
 600        err = qlcnic_sriov_alloc_vlans(adapter);
 601        if (err)
 602                goto del_flr_queue;
 603
 604        return err;
 605
 606del_flr_queue:
 607        qlcnic_sriov_pf_del_flr_queue(adapter);
 608
 609sriov_cleanup:
 610        __qlcnic_sriov_cleanup(adapter);
 611
 612clear_op_mode:
 613        clear_bit(__QLCNIC_SRIOV_ENABLE, &adapter->state);
 614        adapter->ahw->op_mode = QLCNIC_MGMT_FUNC;
 615        return err;
 616}
 617
 618static int qlcnic_pci_sriov_enable(struct qlcnic_adapter *adapter, int num_vfs)
 619{
 620        struct net_device *netdev = adapter->netdev;
 621        int err;
 622
 623        if (!(adapter->flags & QLCNIC_MSIX_ENABLED)) {
 624                netdev_err(netdev,
 625                           "SR-IOV cannot be enabled, when legacy interrupts are enabled\n");
 626                return -EIO;
 627        }
 628
 629        rtnl_lock();
 630        if (netif_running(netdev))
 631                __qlcnic_down(adapter, netdev);
 632
 633        err = __qlcnic_pci_sriov_enable(adapter, num_vfs);
 634        if (err)
 635                goto error;
 636
 637        if (netif_running(netdev))
 638                __qlcnic_up(adapter, netdev);
 639
 640        rtnl_unlock();
 641        err = qlcnic_sriov_pf_enable(adapter, num_vfs);
 642        if (!err) {
 643                netdev_info(netdev,
 644                            "SR-IOV is enabled successfully on port %d\n",
 645                            adapter->portnum);
 646                /* Return number of vfs enabled */
 647                return num_vfs;
 648        }
 649
 650        rtnl_lock();
 651        if (netif_running(netdev))
 652                __qlcnic_down(adapter, netdev);
 653
 654error:
 655        if (!qlcnic_83xx_configure_opmode(adapter)) {
 656                if (netif_running(netdev))
 657                        __qlcnic_up(adapter, netdev);
 658        }
 659
 660        rtnl_unlock();
 661        netdev_info(netdev, "Failed to enable SR-IOV on port %d\n",
 662                    adapter->portnum);
 663
 664        return err;
 665}
 666
 667int qlcnic_pci_sriov_configure(struct pci_dev *dev, int num_vfs)
 668{
 669        struct qlcnic_adapter *adapter = pci_get_drvdata(dev);
 670        int err;
 671
 672        if (test_and_set_bit(__QLCNIC_RESETTING, &adapter->state))
 673                return -EBUSY;
 674
 675        if (num_vfs == 0)
 676                err = qlcnic_pci_sriov_disable(adapter);
 677        else
 678                err = qlcnic_pci_sriov_enable(adapter, num_vfs);
 679
 680        clear_bit(__QLCNIC_RESETTING, &adapter->state);
 681        return err;
 682}
 683
 684static int qlcnic_sriov_set_vf_acl(struct qlcnic_adapter *adapter, u8 func)
 685{
 686        struct qlcnic_cmd_args cmd;
 687        struct qlcnic_vport *vp;
 688        int err, id;
 689        u8 *mac;
 690
 691        id = qlcnic_sriov_func_to_index(adapter, func);
 692        if (id < 0)
 693                return id;
 694
 695        vp = adapter->ahw->sriov->vf_info[id].vp;
 696        err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_SET_NIC_INFO);
 697        if (err)
 698                return err;
 699
 700        cmd.req.arg[1] = 0x3 | func << 16;
 701        if (vp->spoofchk == true) {
 702                mac = vp->mac;
 703                cmd.req.arg[2] |= BIT_1 | BIT_3 | BIT_8;
 704                cmd.req.arg[4] = mac[5] | mac[4] << 8 | mac[3] << 16 |
 705                                 mac[2] << 24;
 706                cmd.req.arg[5] = mac[1] | mac[0] << 8;
 707        }
 708
 709        if (vp->vlan_mode == QLC_PVID_MODE) {
 710                cmd.req.arg[2] |= BIT_6;
 711                cmd.req.arg[3] |= vp->pvid << 8;
 712        }
 713
 714        err = qlcnic_issue_cmd(adapter, &cmd);
 715        if (err)
 716                dev_err(&adapter->pdev->dev, "Failed to set ACL, err=%d\n",
 717                        err);
 718
 719        qlcnic_free_mbx_args(&cmd);
 720        return err;
 721}
 722
 723static int qlcnic_sriov_set_vf_vport_info(struct qlcnic_adapter *adapter,
 724                                          u16 func)
 725{
 726        struct qlcnic_info defvp_info;
 727        int err;
 728
 729        err = qlcnic_sriov_pf_cal_res_limit(adapter, &defvp_info, func);
 730        if (err)
 731                return -EIO;
 732
 733        err = qlcnic_sriov_set_vf_acl(adapter, func);
 734        if (err)
 735                return err;
 736
 737        return 0;
 738}
 739
 740static int qlcnic_sriov_pf_channel_cfg_cmd(struct qlcnic_bc_trans *trans,
 741                                           struct qlcnic_cmd_args *cmd)
 742{
 743        struct qlcnic_vf_info *vf = trans->vf;
 744        struct qlcnic_vport *vp = vf->vp;
 745        struct qlcnic_adapter *adapter;
 746        struct qlcnic_sriov *sriov;
 747        u16 func = vf->pci_func;
 748        size_t size;
 749        int err;
 750
 751        adapter = vf->adapter;
 752        sriov = adapter->ahw->sriov;
 753
 754        if (trans->req_hdr->cmd_op == QLCNIC_BC_CMD_CHANNEL_INIT) {
 755                err = qlcnic_sriov_pf_config_vport(adapter, 1, func);
 756                if (!err) {
 757                        err = qlcnic_sriov_set_vf_vport_info(adapter, func);
 758                        if (err)
 759                                qlcnic_sriov_pf_config_vport(adapter, 0, func);
 760                }
 761        } else {
 762                if (vp->vlan_mode == QLC_GUEST_VLAN_MODE) {
 763                        size = sizeof(*vf->sriov_vlans);
 764                        size = size * sriov->num_allowed_vlans;
 765                        memset(vf->sriov_vlans, 0, size);
 766                }
 767
 768                err = qlcnic_sriov_pf_config_vport(adapter, 0, func);
 769        }
 770
 771        if (err)
 772                goto err_out;
 773
 774        cmd->rsp.arg[0] |= (1 << 25);
 775
 776        if (trans->req_hdr->cmd_op == QLCNIC_BC_CMD_CHANNEL_INIT)
 777                set_bit(QLC_BC_VF_STATE, &vf->state);
 778        else
 779                clear_bit(QLC_BC_VF_STATE, &vf->state);
 780
 781        return err;
 782
 783err_out:
 784        cmd->rsp.arg[0] |= (2 << 25);
 785        return err;
 786}
 787
 788static int qlcnic_sriov_cfg_vf_def_mac(struct qlcnic_adapter *adapter,
 789                                       struct qlcnic_vf_info *vf,
 790                                       u16 vlan, u8 op)
 791{
 792        struct qlcnic_cmd_args *cmd;
 793        struct qlcnic_macvlan_mbx mv;
 794        struct qlcnic_vport *vp;
 795        u8 *addr;
 796        int err;
 797        u32 *buf;
 798        int vpid;
 799
 800        vp = vf->vp;
 801
 802        cmd = kzalloc(sizeof(*cmd), GFP_ATOMIC);
 803        if (!cmd)
 804                return -ENOMEM;
 805
 806        err = qlcnic_alloc_mbx_args(cmd, adapter, QLCNIC_CMD_CONFIG_MAC_VLAN);
 807        if (err)
 808                goto free_cmd;
 809
 810        cmd->type = QLC_83XX_MBX_CMD_NO_WAIT;
 811        vpid = qlcnic_sriov_pf_get_vport_handle(adapter, vf->pci_func);
 812        if (vpid < 0) {
 813                err = -EINVAL;
 814                goto free_args;
 815        }
 816
 817        if (vlan)
 818                op = ((op == QLCNIC_MAC_ADD || op == QLCNIC_MAC_VLAN_ADD) ?
 819                      QLCNIC_MAC_VLAN_ADD : QLCNIC_MAC_VLAN_DEL);
 820
 821        cmd->req.arg[1] = op | (1 << 8) | (3 << 6);
 822        cmd->req.arg[1] |= ((vpid & 0xffff) << 16) | BIT_31;
 823
 824        addr = vp->mac;
 825        mv.vlan = vlan;
 826        mv.mac_addr0 = addr[0];
 827        mv.mac_addr1 = addr[1];
 828        mv.mac_addr2 = addr[2];
 829        mv.mac_addr3 = addr[3];
 830        mv.mac_addr4 = addr[4];
 831        mv.mac_addr5 = addr[5];
 832        buf = &cmd->req.arg[2];
 833        memcpy(buf, &mv, sizeof(struct qlcnic_macvlan_mbx));
 834
 835        err = qlcnic_issue_cmd(adapter, cmd);
 836
 837        if (!err)
 838                return err;
 839
 840free_args:
 841        qlcnic_free_mbx_args(cmd);
 842free_cmd:
 843        kfree(cmd);
 844        return err;
 845}
 846
 847static int qlcnic_sriov_validate_create_rx_ctx(struct qlcnic_cmd_args *cmd)
 848{
 849        if ((cmd->req.arg[0] >> 29) != 0x3)
 850                return -EINVAL;
 851
 852        return 0;
 853}
 854
 855static void qlcnic_83xx_cfg_default_mac_vlan(struct qlcnic_adapter *adapter,
 856                                             struct qlcnic_vf_info *vf,
 857                                             int opcode)
 858{
 859        struct qlcnic_sriov *sriov;
 860        u16 vlan;
 861        int i;
 862
 863        sriov = adapter->ahw->sriov;
 864
 865        spin_lock_bh(&vf->vlan_list_lock);
 866        if (vf->num_vlan) {
 867                for (i = 0; i < sriov->num_allowed_vlans; i++) {
 868                        vlan = vf->sriov_vlans[i];
 869                        if (vlan)
 870                                qlcnic_sriov_cfg_vf_def_mac(adapter, vf, vlan,
 871                                                            opcode);
 872                }
 873        }
 874        spin_unlock_bh(&vf->vlan_list_lock);
 875
 876        if (vf->vp->vlan_mode != QLC_PVID_MODE) {
 877                if (qlcnic_83xx_pf_check(adapter) &&
 878                    qlcnic_sriov_check_any_vlan(vf))
 879                        return;
 880                qlcnic_sriov_cfg_vf_def_mac(adapter, vf, 0, opcode);
 881        }
 882}
 883
 884static int qlcnic_sriov_pf_create_rx_ctx_cmd(struct qlcnic_bc_trans *tran,
 885                                             struct qlcnic_cmd_args *cmd)
 886{
 887        struct qlcnic_vf_info *vf = tran->vf;
 888        struct qlcnic_adapter *adapter = vf->adapter;
 889        struct qlcnic_rcv_mbx_out *mbx_out;
 890        int err;
 891
 892        err = qlcnic_sriov_validate_create_rx_ctx(cmd);
 893        if (err) {
 894                cmd->rsp.arg[0] |= (0x6 << 25);
 895                return err;
 896        }
 897
 898        cmd->req.arg[6] = vf->vp->handle;
 899        err = qlcnic_issue_cmd(adapter, cmd);
 900
 901        if (!err) {
 902                mbx_out = (struct qlcnic_rcv_mbx_out *)&cmd->rsp.arg[1];
 903                vf->rx_ctx_id = mbx_out->ctx_id;
 904                qlcnic_83xx_cfg_default_mac_vlan(adapter, vf, QLCNIC_MAC_ADD);
 905        } else {
 906                vf->rx_ctx_id = 0;
 907        }
 908
 909        return err;
 910}
 911
 912static int qlcnic_sriov_pf_mac_address_cmd(struct qlcnic_bc_trans *trans,
 913                                           struct qlcnic_cmd_args *cmd)
 914{
 915        struct qlcnic_vf_info *vf = trans->vf;
 916        u8 type, *mac;
 917
 918        type = cmd->req.arg[1];
 919        switch (type) {
 920        case QLCNIC_SET_STATION_MAC:
 921        case QLCNIC_SET_FAC_DEF_MAC:
 922                cmd->rsp.arg[0] = (2 << 25);
 923                break;
 924        case QLCNIC_GET_CURRENT_MAC:
 925                cmd->rsp.arg[0] = (1 << 25);
 926                mac = vf->vp->mac;
 927                cmd->rsp.arg[2] = mac[1] | ((mac[0] << 8) & 0xff00);
 928                cmd->rsp.arg[1] = mac[5] | ((mac[4] << 8) & 0xff00) |
 929                                  ((mac[3]) << 16 & 0xff0000) |
 930                                  ((mac[2]) << 24 & 0xff000000);
 931        }
 932
 933        return 0;
 934}
 935
 936static int qlcnic_sriov_validate_create_tx_ctx(struct qlcnic_cmd_args *cmd)
 937{
 938        if ((cmd->req.arg[0] >> 29) != 0x3)
 939                return -EINVAL;
 940
 941        return 0;
 942}
 943
 944static int qlcnic_sriov_pf_create_tx_ctx_cmd(struct qlcnic_bc_trans *trans,
 945                                             struct qlcnic_cmd_args *cmd)
 946{
 947        struct qlcnic_vf_info *vf = trans->vf;
 948        struct qlcnic_adapter *adapter = vf->adapter;
 949        struct qlcnic_tx_mbx_out *mbx_out;
 950        int err;
 951
 952        err = qlcnic_sriov_validate_create_tx_ctx(cmd);
 953        if (err) {
 954                cmd->rsp.arg[0] |= (0x6 << 25);
 955                return err;
 956        }
 957
 958        cmd->req.arg[5] |= vf->vp->handle << 16;
 959        err = qlcnic_issue_cmd(adapter, cmd);
 960        if (!err) {
 961                mbx_out = (struct qlcnic_tx_mbx_out *)&cmd->rsp.arg[2];
 962                vf->tx_ctx_id = mbx_out->ctx_id;
 963        } else {
 964                vf->tx_ctx_id = 0;
 965        }
 966
 967        return err;
 968}
 969
 970static int qlcnic_sriov_validate_del_rx_ctx(struct qlcnic_vf_info *vf,
 971                                            struct qlcnic_cmd_args *cmd)
 972{
 973        if ((cmd->req.arg[0] >> 29) != 0x3)
 974                return -EINVAL;
 975
 976        if ((cmd->req.arg[1] & 0xffff) != vf->rx_ctx_id)
 977                return -EINVAL;
 978
 979        return 0;
 980}
 981
 982static int qlcnic_sriov_pf_del_rx_ctx_cmd(struct qlcnic_bc_trans *trans,
 983                                          struct qlcnic_cmd_args *cmd)
 984{
 985        struct qlcnic_vf_info *vf = trans->vf;
 986        struct qlcnic_adapter *adapter = vf->adapter;
 987        int err;
 988
 989        err = qlcnic_sriov_validate_del_rx_ctx(vf, cmd);
 990        if (err) {
 991                cmd->rsp.arg[0] |= (0x6 << 25);
 992                return err;
 993        }
 994
 995        qlcnic_83xx_cfg_default_mac_vlan(adapter, vf, QLCNIC_MAC_DEL);
 996        cmd->req.arg[1] |= vf->vp->handle << 16;
 997        err = qlcnic_issue_cmd(adapter, cmd);
 998
 999        if (!err)
1000                vf->rx_ctx_id = 0;
1001
1002        return err;
1003}
1004
1005static int qlcnic_sriov_validate_del_tx_ctx(struct qlcnic_vf_info *vf,
1006                                            struct qlcnic_cmd_args *cmd)
1007{
1008        if ((cmd->req.arg[0] >> 29) != 0x3)
1009                return -EINVAL;
1010
1011        if ((cmd->req.arg[1] & 0xffff) != vf->tx_ctx_id)
1012                return -EINVAL;
1013
1014        return 0;
1015}
1016
1017static int qlcnic_sriov_pf_del_tx_ctx_cmd(struct qlcnic_bc_trans *trans,
1018                                          struct qlcnic_cmd_args *cmd)
1019{
1020        struct qlcnic_vf_info *vf = trans->vf;
1021        struct qlcnic_adapter *adapter = vf->adapter;
1022        int err;
1023
1024        err = qlcnic_sriov_validate_del_tx_ctx(vf, cmd);
1025        if (err) {
1026                cmd->rsp.arg[0] |= (0x6 << 25);
1027                return err;
1028        }
1029
1030        cmd->req.arg[1] |= vf->vp->handle << 16;
1031        err = qlcnic_issue_cmd(adapter, cmd);
1032
1033        if (!err)
1034                vf->tx_ctx_id = 0;
1035
1036        return err;
1037}
1038
1039static int qlcnic_sriov_validate_cfg_lro(struct qlcnic_vf_info *vf,
1040                                         struct qlcnic_cmd_args *cmd)
1041{
1042        if ((cmd->req.arg[1] >> 16) != vf->rx_ctx_id)
1043                return -EINVAL;
1044
1045        return 0;
1046}
1047
1048static int qlcnic_sriov_pf_cfg_lro_cmd(struct qlcnic_bc_trans *trans,
1049                                       struct qlcnic_cmd_args *cmd)
1050{
1051        struct qlcnic_vf_info *vf = trans->vf;
1052        struct qlcnic_adapter *adapter = vf->adapter;
1053        int err;
1054
1055        err = qlcnic_sriov_validate_cfg_lro(vf, cmd);
1056        if (err) {
1057                cmd->rsp.arg[0] |= (0x6 << 25);
1058                return err;
1059        }
1060
1061        err = qlcnic_issue_cmd(adapter, cmd);
1062        return err;
1063}
1064
1065static int qlcnic_sriov_pf_cfg_ip_cmd(struct qlcnic_bc_trans *trans,
1066                                      struct qlcnic_cmd_args *cmd)
1067{
1068        struct qlcnic_vf_info *vf = trans->vf;
1069        struct qlcnic_adapter *adapter = vf->adapter;
1070        int err;
1071
1072        cmd->req.arg[1] |= vf->vp->handle << 16;
1073        cmd->req.arg[1] |= BIT_31;
1074
1075        err = qlcnic_issue_cmd(adapter, cmd);
1076        return err;
1077}
1078
1079static int qlcnic_sriov_validate_cfg_intrpt(struct qlcnic_vf_info *vf,
1080                                            struct qlcnic_cmd_args *cmd)
1081{
1082        if (((cmd->req.arg[1] >> 8) & 0xff) != vf->pci_func)
1083                return -EINVAL;
1084
1085        if (!(cmd->req.arg[1] & BIT_16))
1086                return -EINVAL;
1087
1088        if ((cmd->req.arg[1] & 0xff) != 0x1)
1089                return -EINVAL;
1090
1091        return 0;
1092}
1093
1094static int qlcnic_sriov_pf_cfg_intrpt_cmd(struct qlcnic_bc_trans *trans,
1095                                          struct qlcnic_cmd_args *cmd)
1096{
1097        struct qlcnic_vf_info *vf = trans->vf;
1098        struct qlcnic_adapter *adapter = vf->adapter;
1099        int err;
1100
1101        err = qlcnic_sriov_validate_cfg_intrpt(vf, cmd);
1102        if (err)
1103                cmd->rsp.arg[0] |= (0x6 << 25);
1104        else
1105                err = qlcnic_issue_cmd(adapter, cmd);
1106
1107        return err;
1108}
1109
1110static int qlcnic_sriov_validate_mtu(struct qlcnic_adapter *adapter,
1111                                     struct qlcnic_vf_info *vf,
1112                                     struct qlcnic_cmd_args *cmd)
1113{
1114        if (cmd->req.arg[1] != vf->rx_ctx_id)
1115                return -EINVAL;
1116
1117        if (cmd->req.arg[2] > adapter->ahw->max_mtu)
1118                return -EINVAL;
1119
1120        return 0;
1121}
1122
1123static int qlcnic_sriov_pf_set_mtu_cmd(struct qlcnic_bc_trans *trans,
1124                                       struct qlcnic_cmd_args *cmd)
1125{
1126        struct qlcnic_vf_info *vf = trans->vf;
1127        struct qlcnic_adapter *adapter = vf->adapter;
1128        int err;
1129
1130        err = qlcnic_sriov_validate_mtu(adapter, vf, cmd);
1131        if (err)
1132                cmd->rsp.arg[0] |= (0x6 << 25);
1133        else
1134                err = qlcnic_issue_cmd(adapter, cmd);
1135
1136        return err;
1137}
1138
1139static int qlcnic_sriov_validate_get_nic_info(struct qlcnic_vf_info *vf,
1140                                              struct qlcnic_cmd_args *cmd)
1141{
1142        if (cmd->req.arg[1] & BIT_31) {
1143                if (((cmd->req.arg[1] >> 16) & 0x7fff) != vf->pci_func)
1144                        return -EINVAL;
1145        } else {
1146                cmd->req.arg[1] |= vf->vp->handle << 16;
1147        }
1148
1149        return 0;
1150}
1151
1152static int qlcnic_sriov_pf_get_nic_info_cmd(struct qlcnic_bc_trans *trans,
1153                                            struct qlcnic_cmd_args *cmd)
1154{
1155        struct qlcnic_vf_info *vf = trans->vf;
1156        struct qlcnic_adapter *adapter = vf->adapter;
1157        int err;
1158
1159        err = qlcnic_sriov_validate_get_nic_info(vf, cmd);
1160        if (err) {
1161                cmd->rsp.arg[0] |= (0x6 << 25);
1162                return err;
1163        }
1164
1165        err = qlcnic_issue_cmd(adapter, cmd);
1166        return err;
1167}
1168
1169static int qlcnic_sriov_validate_cfg_rss(struct qlcnic_vf_info *vf,
1170                                         struct qlcnic_cmd_args *cmd)
1171{
1172        if (cmd->req.arg[1] != vf->rx_ctx_id)
1173                return -EINVAL;
1174
1175        return 0;
1176}
1177
1178static int qlcnic_sriov_pf_cfg_rss_cmd(struct qlcnic_bc_trans *trans,
1179                                       struct qlcnic_cmd_args *cmd)
1180{
1181        struct qlcnic_vf_info *vf = trans->vf;
1182        struct qlcnic_adapter *adapter = vf->adapter;
1183        int err;
1184
1185        err = qlcnic_sriov_validate_cfg_rss(vf, cmd);
1186        if (err)
1187                cmd->rsp.arg[0] |= (0x6 << 25);
1188        else
1189                err = qlcnic_issue_cmd(adapter, cmd);
1190
1191        return err;
1192}
1193
1194static int qlcnic_sriov_validate_cfg_intrcoal(struct qlcnic_adapter *adapter,
1195                                              struct qlcnic_vf_info *vf,
1196                                              struct qlcnic_cmd_args *cmd)
1197{
1198        struct qlcnic_nic_intr_coalesce *coal = &adapter->ahw->coal;
1199        u16 ctx_id, pkts, time;
1200        int err = -EINVAL;
1201        u8 type;
1202
1203        type = cmd->req.arg[1] & QLC_INTR_COAL_TYPE_MASK;
1204        ctx_id = cmd->req.arg[1] >> 16;
1205        pkts = cmd->req.arg[2] & 0xffff;
1206        time = cmd->req.arg[2] >> 16;
1207
1208        switch (type) {
1209        case QLCNIC_INTR_COAL_TYPE_RX:
1210                if (ctx_id != vf->rx_ctx_id || pkts > coal->rx_packets ||
1211                    time < coal->rx_time_us)
1212                        goto err_label;
1213                break;
1214        case QLCNIC_INTR_COAL_TYPE_TX:
1215                if (ctx_id != vf->tx_ctx_id || pkts > coal->tx_packets ||
1216                    time < coal->tx_time_us)
1217                        goto err_label;
1218                break;
1219        default:
1220                netdev_err(adapter->netdev, "Invalid coalescing type 0x%x received\n",
1221                           type);
1222                return err;
1223        }
1224
1225        return 0;
1226
1227err_label:
1228        netdev_err(adapter->netdev, "Expected: rx_ctx_id 0x%x rx_packets 0x%x rx_time_us 0x%x tx_ctx_id 0x%x tx_packets 0x%x tx_time_us 0x%x\n",
1229                   vf->rx_ctx_id, coal->rx_packets, coal->rx_time_us,
1230                   vf->tx_ctx_id, coal->tx_packets, coal->tx_time_us);
1231        netdev_err(adapter->netdev, "Received: ctx_id 0x%x packets 0x%x time_us 0x%x type 0x%x\n",
1232                   ctx_id, pkts, time, type);
1233
1234        return err;
1235}
1236
1237static int qlcnic_sriov_pf_cfg_intrcoal_cmd(struct qlcnic_bc_trans *tran,
1238                                            struct qlcnic_cmd_args *cmd)
1239{
1240        struct qlcnic_vf_info *vf = tran->vf;
1241        struct qlcnic_adapter *adapter = vf->adapter;
1242        int err;
1243
1244        err = qlcnic_sriov_validate_cfg_intrcoal(adapter, vf, cmd);
1245        if (err) {
1246                cmd->rsp.arg[0] |= (0x6 << 25);
1247                return err;
1248        }
1249
1250        err = qlcnic_issue_cmd(adapter, cmd);
1251        return err;
1252}
1253
1254static int qlcnic_sriov_validate_cfg_macvlan(struct qlcnic_adapter *adapter,
1255                                             struct qlcnic_vf_info *vf,
1256                                             struct qlcnic_cmd_args *cmd)
1257{
1258        struct qlcnic_vport *vp = vf->vp;
1259        u8 op, new_op;
1260
1261        if (!(cmd->req.arg[1] & BIT_8))
1262                return -EINVAL;
1263
1264        cmd->req.arg[1] |= (vf->vp->handle << 16);
1265        cmd->req.arg[1] |= BIT_31;
1266
1267        if (vp->vlan_mode == QLC_PVID_MODE) {
1268                op = cmd->req.arg[1] & 0x7;
1269                cmd->req.arg[1] &= ~0x7;
1270                new_op = (op == QLCNIC_MAC_ADD || op == QLCNIC_MAC_VLAN_ADD) ?
1271                         QLCNIC_MAC_VLAN_ADD : QLCNIC_MAC_VLAN_DEL;
1272                cmd->req.arg[3] |= vp->pvid << 16;
1273                cmd->req.arg[1] |= new_op;
1274        }
1275
1276        return 0;
1277}
1278
1279static int qlcnic_sriov_pf_cfg_macvlan_cmd(struct qlcnic_bc_trans *trans,
1280                                           struct qlcnic_cmd_args *cmd)
1281{
1282        struct qlcnic_vf_info *vf = trans->vf;
1283        struct qlcnic_adapter *adapter = vf->adapter;
1284        int err;
1285
1286        err = qlcnic_sriov_validate_cfg_macvlan(adapter, vf, cmd);
1287        if (err) {
1288                cmd->rsp.arg[0] |= (0x6 << 25);
1289                return err;
1290        }
1291
1292        err = qlcnic_issue_cmd(adapter, cmd);
1293        return err;
1294}
1295
1296static int qlcnic_sriov_validate_linkevent(struct qlcnic_vf_info *vf,
1297                                           struct qlcnic_cmd_args *cmd)
1298{
1299        if ((cmd->req.arg[1] >> 16) != vf->rx_ctx_id)
1300                return -EINVAL;
1301
1302        return 0;
1303}
1304
1305static int qlcnic_sriov_pf_linkevent_cmd(struct qlcnic_bc_trans *trans,
1306                                         struct qlcnic_cmd_args *cmd)
1307{
1308        struct qlcnic_vf_info *vf = trans->vf;
1309        struct qlcnic_adapter *adapter = vf->adapter;
1310        int err;
1311
1312        err = qlcnic_sriov_validate_linkevent(vf, cmd);
1313        if (err) {
1314                cmd->rsp.arg[0] |= (0x6 << 25);
1315                return err;
1316        }
1317
1318        err = qlcnic_issue_cmd(adapter, cmd);
1319        return err;
1320}
1321
1322static int qlcnic_sriov_pf_cfg_promisc_cmd(struct qlcnic_bc_trans *trans,
1323                                           struct qlcnic_cmd_args *cmd)
1324{
1325        struct qlcnic_vf_info *vf = trans->vf;
1326        struct qlcnic_adapter *adapter = vf->adapter;
1327        int err;
1328
1329        cmd->req.arg[1] |= vf->vp->handle << 16;
1330        cmd->req.arg[1] |= BIT_31;
1331        err = qlcnic_issue_cmd(adapter, cmd);
1332        return err;
1333}
1334
1335static int qlcnic_sriov_pf_get_acl_cmd(struct qlcnic_bc_trans *trans,
1336                                       struct qlcnic_cmd_args *cmd)
1337{
1338        struct qlcnic_vf_info *vf = trans->vf;
1339        struct qlcnic_vport *vp = vf->vp;
1340        u8 mode = vp->vlan_mode;
1341        struct qlcnic_adapter *adapter;
1342        struct qlcnic_sriov *sriov;
1343
1344        adapter = vf->adapter;
1345        sriov = adapter->ahw->sriov;
1346
1347        cmd->rsp.arg[0] |= 1 << 25;
1348
1349        /* For 84xx adapter in case of PVID , PFD should send vlan mode as
1350         * QLC_NO_VLAN_MODE to VFD which is zero in mailbox response
1351         */
1352        if (qlcnic_84xx_check(adapter) && mode == QLC_PVID_MODE)
1353                return 0;
1354
1355        switch (mode) {
1356        case QLC_GUEST_VLAN_MODE:
1357                cmd->rsp.arg[1] = mode | 1 << 8;
1358                cmd->rsp.arg[2] = sriov->num_allowed_vlans << 16;
1359                break;
1360        case QLC_PVID_MODE:
1361                cmd->rsp.arg[1] = mode | 1 << 8 | vp->pvid << 16;
1362                break;
1363        }
1364
1365        return 0;
1366}
1367
1368static int qlcnic_sriov_pf_del_guest_vlan(struct qlcnic_adapter *adapter,
1369                                          struct qlcnic_vf_info *vf,
1370                                          struct qlcnic_cmd_args *cmd)
1371{
1372        struct qlcnic_sriov *sriov = adapter->ahw->sriov;
1373        u16 vlan;
1374
1375        if (!qlcnic_sriov_check_any_vlan(vf))
1376                return -EINVAL;
1377
1378        vlan = cmd->req.arg[1] >> 16;
1379        if (!vf->rx_ctx_id) {
1380                qlcnic_sriov_del_vlan_id(sriov, vf, vlan);
1381                return 0;
1382        }
1383
1384        qlcnic_sriov_cfg_vf_def_mac(adapter, vf, vlan, QLCNIC_MAC_DEL);
1385        qlcnic_sriov_del_vlan_id(sriov, vf, vlan);
1386
1387        if (qlcnic_83xx_pf_check(adapter))
1388                qlcnic_sriov_cfg_vf_def_mac(adapter, vf,
1389                                            0, QLCNIC_MAC_ADD);
1390        return 0;
1391}
1392
1393static int qlcnic_sriov_pf_add_guest_vlan(struct qlcnic_adapter *adapter,
1394                                          struct qlcnic_vf_info *vf,
1395                                          struct qlcnic_cmd_args *cmd)
1396{
1397        struct qlcnic_sriov *sriov = adapter->ahw->sriov;
1398        int err = -EIO;
1399        u16 vlan;
1400
1401        if (qlcnic_83xx_pf_check(adapter) && qlcnic_sriov_check_any_vlan(vf))
1402                return err;
1403
1404        vlan = cmd->req.arg[1] >> 16;
1405
1406        if (!vf->rx_ctx_id) {
1407                qlcnic_sriov_add_vlan_id(sriov, vf, vlan);
1408                return 0;
1409        }
1410
1411        if (qlcnic_83xx_pf_check(adapter)) {
1412                err = qlcnic_sriov_cfg_vf_def_mac(adapter, vf, 0,
1413                                                  QLCNIC_MAC_DEL);
1414                if (err)
1415                        return err;
1416        }
1417
1418        err = qlcnic_sriov_cfg_vf_def_mac(adapter, vf, vlan, QLCNIC_MAC_ADD);
1419
1420        if (err) {
1421                if (qlcnic_83xx_pf_check(adapter))
1422                        qlcnic_sriov_cfg_vf_def_mac(adapter, vf, 0,
1423                                                    QLCNIC_MAC_ADD);
1424                return err;
1425        }
1426
1427        qlcnic_sriov_add_vlan_id(sriov, vf, vlan);
1428        return err;
1429}
1430
1431static int qlcnic_sriov_pf_cfg_guest_vlan_cmd(struct qlcnic_bc_trans *tran,
1432                                              struct qlcnic_cmd_args *cmd)
1433{
1434        struct qlcnic_vf_info  *vf = tran->vf;
1435        struct qlcnic_adapter *adapter =  vf->adapter;
1436        struct qlcnic_vport *vp = vf->vp;
1437        int err = -EIO;
1438        u8 op;
1439
1440        if (vp->vlan_mode != QLC_GUEST_VLAN_MODE) {
1441                cmd->rsp.arg[0] |= 2 << 25;
1442                return err;
1443        }
1444
1445        op = cmd->req.arg[1] & 0xf;
1446
1447        if (op)
1448                err = qlcnic_sriov_pf_add_guest_vlan(adapter, vf, cmd);
1449        else
1450                err = qlcnic_sriov_pf_del_guest_vlan(adapter, vf, cmd);
1451
1452        cmd->rsp.arg[0] |= err ? 2 << 25 : 1 << 25;
1453        return err;
1454}
1455
1456static const int qlcnic_pf_passthru_supp_cmds[] = {
1457        QLCNIC_CMD_GET_STATISTICS,
1458        QLCNIC_CMD_GET_PORT_CONFIG,
1459        QLCNIC_CMD_GET_LINK_STATUS,
1460        QLCNIC_CMD_INIT_NIC_FUNC,
1461        QLCNIC_CMD_STOP_NIC_FUNC,
1462};
1463
1464static const struct qlcnic_sriov_cmd_handler qlcnic_pf_bc_cmd_hdlr[] = {
1465        [QLCNIC_BC_CMD_CHANNEL_INIT] = {&qlcnic_sriov_pf_channel_cfg_cmd},
1466        [QLCNIC_BC_CMD_CHANNEL_TERM] = {&qlcnic_sriov_pf_channel_cfg_cmd},
1467        [QLCNIC_BC_CMD_GET_ACL] = {&qlcnic_sriov_pf_get_acl_cmd},
1468        [QLCNIC_BC_CMD_CFG_GUEST_VLAN]  = {&qlcnic_sriov_pf_cfg_guest_vlan_cmd},
1469};
1470
1471static const struct qlcnic_sriov_fw_cmd_handler qlcnic_pf_fw_cmd_hdlr[] = {
1472        {QLCNIC_CMD_CREATE_RX_CTX, qlcnic_sriov_pf_create_rx_ctx_cmd},
1473        {QLCNIC_CMD_CREATE_TX_CTX, qlcnic_sriov_pf_create_tx_ctx_cmd},
1474        {QLCNIC_CMD_MAC_ADDRESS, qlcnic_sriov_pf_mac_address_cmd},
1475        {QLCNIC_CMD_DESTROY_RX_CTX, qlcnic_sriov_pf_del_rx_ctx_cmd},
1476        {QLCNIC_CMD_DESTROY_TX_CTX, qlcnic_sriov_pf_del_tx_ctx_cmd},
1477        {QLCNIC_CMD_CONFIGURE_HW_LRO, qlcnic_sriov_pf_cfg_lro_cmd},
1478        {QLCNIC_CMD_CONFIGURE_IP_ADDR, qlcnic_sriov_pf_cfg_ip_cmd},
1479        {QLCNIC_CMD_CONFIG_INTRPT, qlcnic_sriov_pf_cfg_intrpt_cmd},
1480        {QLCNIC_CMD_SET_MTU, qlcnic_sriov_pf_set_mtu_cmd},
1481        {QLCNIC_CMD_GET_NIC_INFO, qlcnic_sriov_pf_get_nic_info_cmd},
1482        {QLCNIC_CMD_CONFIGURE_RSS, qlcnic_sriov_pf_cfg_rss_cmd},
1483        {QLCNIC_CMD_CONFIG_INTR_COAL, qlcnic_sriov_pf_cfg_intrcoal_cmd},
1484        {QLCNIC_CMD_CONFIG_MAC_VLAN, qlcnic_sriov_pf_cfg_macvlan_cmd},
1485        {QLCNIC_CMD_GET_LINK_EVENT, qlcnic_sriov_pf_linkevent_cmd},
1486        {QLCNIC_CMD_CONFIGURE_MAC_RX_MODE, qlcnic_sriov_pf_cfg_promisc_cmd},
1487};
1488
1489void qlcnic_sriov_pf_process_bc_cmd(struct qlcnic_adapter *adapter,
1490                                    struct qlcnic_bc_trans *trans,
1491                                    struct qlcnic_cmd_args *cmd)
1492{
1493        u8 size, cmd_op;
1494
1495        cmd_op = trans->req_hdr->cmd_op;
1496
1497        if (trans->req_hdr->op_type == QLC_BC_CMD) {
1498                size = ARRAY_SIZE(qlcnic_pf_bc_cmd_hdlr);
1499                if (cmd_op < size) {
1500                        qlcnic_pf_bc_cmd_hdlr[cmd_op].fn(trans, cmd);
1501                        return;
1502                }
1503        } else {
1504                int i;
1505                size = ARRAY_SIZE(qlcnic_pf_fw_cmd_hdlr);
1506                for (i = 0; i < size; i++) {
1507                        if (cmd_op == qlcnic_pf_fw_cmd_hdlr[i].cmd) {
1508                                qlcnic_pf_fw_cmd_hdlr[i].fn(trans, cmd);
1509                                return;
1510                        }
1511                }
1512
1513                size = ARRAY_SIZE(qlcnic_pf_passthru_supp_cmds);
1514                for (i = 0; i < size; i++) {
1515                        if (cmd_op == qlcnic_pf_passthru_supp_cmds[i]) {
1516                                qlcnic_issue_cmd(adapter, cmd);
1517                                return;
1518                        }
1519                }
1520        }
1521
1522        cmd->rsp.arg[0] |= (0x9 << 25);
1523}
1524
1525void qlcnic_pf_set_interface_id_create_rx_ctx(struct qlcnic_adapter *adapter,
1526                                             u32 *int_id)
1527{
1528        u16 vpid;
1529
1530        vpid = qlcnic_sriov_pf_get_vport_handle(adapter,
1531                                                adapter->ahw->pci_func);
1532        *int_id |= vpid;
1533}
1534
1535void qlcnic_pf_set_interface_id_del_rx_ctx(struct qlcnic_adapter *adapter,
1536                                           u32 *int_id)
1537{
1538        u16 vpid;
1539
1540        vpid = qlcnic_sriov_pf_get_vport_handle(adapter,
1541                                                adapter->ahw->pci_func);
1542        *int_id |= vpid << 16;
1543}
1544
1545void qlcnic_pf_set_interface_id_create_tx_ctx(struct qlcnic_adapter *adapter,
1546                                              u32 *int_id)
1547{
1548        int vpid;
1549
1550        vpid = qlcnic_sriov_pf_get_vport_handle(adapter,
1551                                                adapter->ahw->pci_func);
1552        *int_id |= vpid << 16;
1553}
1554
1555void qlcnic_pf_set_interface_id_del_tx_ctx(struct qlcnic_adapter *adapter,
1556                                           u32 *int_id)
1557{
1558        u16 vpid;
1559
1560        vpid = qlcnic_sriov_pf_get_vport_handle(adapter,
1561                                                adapter->ahw->pci_func);
1562        *int_id |= vpid << 16;
1563}
1564
1565void qlcnic_pf_set_interface_id_promisc(struct qlcnic_adapter *adapter,
1566                                        u32 *int_id)
1567{
1568        u16 vpid;
1569
1570        vpid = qlcnic_sriov_pf_get_vport_handle(adapter,
1571                                                adapter->ahw->pci_func);
1572        *int_id |= (vpid << 16) | BIT_31;
1573}
1574
1575void qlcnic_pf_set_interface_id_ipaddr(struct qlcnic_adapter *adapter,
1576                                       u32 *int_id)
1577{
1578        u16 vpid;
1579
1580        vpid = qlcnic_sriov_pf_get_vport_handle(adapter,
1581                                                adapter->ahw->pci_func);
1582        *int_id |= (vpid << 16) | BIT_31;
1583}
1584
1585void qlcnic_pf_set_interface_id_macaddr(struct qlcnic_adapter *adapter,
1586                                        u32 *int_id)
1587{
1588        u16 vpid;
1589
1590        vpid = qlcnic_sriov_pf_get_vport_handle(adapter,
1591                                                adapter->ahw->pci_func);
1592        *int_id |= (vpid << 16) | BIT_31;
1593}
1594
1595static void qlcnic_sriov_del_rx_ctx(struct qlcnic_adapter *adapter,
1596                                    struct qlcnic_vf_info *vf)
1597{
1598        struct qlcnic_cmd_args cmd;
1599        int vpid;
1600
1601        if (!vf->rx_ctx_id)
1602                return;
1603
1604        if (qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_DESTROY_RX_CTX))
1605                return;
1606
1607        vpid = qlcnic_sriov_pf_get_vport_handle(adapter, vf->pci_func);
1608        if (vpid >= 0) {
1609                cmd.req.arg[1] = vf->rx_ctx_id | (vpid & 0xffff) << 16;
1610                if (qlcnic_issue_cmd(adapter, &cmd))
1611                        dev_err(&adapter->pdev->dev,
1612                                "Failed to delete Tx ctx in firmware for func 0x%x\n",
1613                                vf->pci_func);
1614                else
1615                        vf->rx_ctx_id = 0;
1616        }
1617
1618        qlcnic_free_mbx_args(&cmd);
1619}
1620
1621static void qlcnic_sriov_del_tx_ctx(struct qlcnic_adapter *adapter,
1622                                    struct qlcnic_vf_info *vf)
1623{
1624        struct qlcnic_cmd_args cmd;
1625        int vpid;
1626
1627        if (!vf->tx_ctx_id)
1628                return;
1629
1630        if (qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_DESTROY_TX_CTX))
1631                return;
1632
1633        vpid = qlcnic_sriov_pf_get_vport_handle(adapter, vf->pci_func);
1634        if (vpid >= 0) {
1635                cmd.req.arg[1] |= vf->tx_ctx_id | (vpid & 0xffff) << 16;
1636                if (qlcnic_issue_cmd(adapter, &cmd))
1637                        dev_err(&adapter->pdev->dev,
1638                                "Failed to delete Tx ctx in firmware for func 0x%x\n",
1639                                vf->pci_func);
1640                else
1641                        vf->tx_ctx_id = 0;
1642        }
1643
1644        qlcnic_free_mbx_args(&cmd);
1645}
1646
1647static int qlcnic_sriov_add_act_list_irqsave(struct qlcnic_sriov *sriov,
1648                                             struct qlcnic_vf_info *vf,
1649                                             struct qlcnic_bc_trans *trans)
1650{
1651        struct qlcnic_trans_list *t_list = &vf->rcv_act;
1652        unsigned long flag;
1653
1654        spin_lock_irqsave(&t_list->lock, flag);
1655
1656        __qlcnic_sriov_add_act_list(sriov, vf, trans);
1657
1658        spin_unlock_irqrestore(&t_list->lock, flag);
1659        return 0;
1660}
1661
1662static void __qlcnic_sriov_process_flr(struct qlcnic_vf_info *vf)
1663{
1664        struct qlcnic_adapter *adapter = vf->adapter;
1665
1666        qlcnic_sriov_cleanup_list(&vf->rcv_pend);
1667        cancel_work_sync(&vf->trans_work);
1668        qlcnic_sriov_cleanup_list(&vf->rcv_act);
1669
1670        if (test_bit(QLC_BC_VF_SOFT_FLR, &vf->state)) {
1671                qlcnic_sriov_del_tx_ctx(adapter, vf);
1672                qlcnic_sriov_del_rx_ctx(adapter, vf);
1673        }
1674
1675        qlcnic_sriov_pf_config_vport(adapter, 0, vf->pci_func);
1676
1677        clear_bit(QLC_BC_VF_FLR, &vf->state);
1678        if (test_bit(QLC_BC_VF_SOFT_FLR, &vf->state)) {
1679                qlcnic_sriov_add_act_list_irqsave(adapter->ahw->sriov, vf,
1680                                                  vf->flr_trans);
1681                clear_bit(QLC_BC_VF_SOFT_FLR, &vf->state);
1682                vf->flr_trans = NULL;
1683        }
1684}
1685
1686static void qlcnic_sriov_pf_process_flr(struct work_struct *work)
1687{
1688        struct qlcnic_vf_info *vf;
1689
1690        vf = container_of(work, struct qlcnic_vf_info, flr_work);
1691        __qlcnic_sriov_process_flr(vf);
1692        return;
1693}
1694
1695static void qlcnic_sriov_schedule_flr(struct qlcnic_sriov *sriov,
1696                                      struct qlcnic_vf_info *vf,
1697                                      work_func_t func)
1698{
1699        if (test_bit(__QLCNIC_RESETTING, &vf->adapter->state))
1700                return;
1701
1702        INIT_WORK(&vf->flr_work, func);
1703        queue_work(sriov->bc.bc_flr_wq, &vf->flr_work);
1704}
1705
1706static void qlcnic_sriov_handle_soft_flr(struct qlcnic_adapter *adapter,
1707                                         struct qlcnic_bc_trans *trans,
1708                                         struct qlcnic_vf_info *vf)
1709{
1710        struct qlcnic_sriov *sriov = adapter->ahw->sriov;
1711
1712        set_bit(QLC_BC_VF_FLR, &vf->state);
1713        clear_bit(QLC_BC_VF_STATE, &vf->state);
1714        set_bit(QLC_BC_VF_SOFT_FLR, &vf->state);
1715        vf->flr_trans = trans;
1716        qlcnic_sriov_schedule_flr(sriov, vf, qlcnic_sriov_pf_process_flr);
1717        netdev_info(adapter->netdev, "Software FLR for PCI func %d\n",
1718                    vf->pci_func);
1719}
1720
1721bool qlcnic_sriov_soft_flr_check(struct qlcnic_adapter *adapter,
1722                                 struct qlcnic_bc_trans *trans,
1723                                 struct qlcnic_vf_info *vf)
1724{
1725        struct qlcnic_bc_hdr *hdr = trans->req_hdr;
1726
1727        if ((hdr->cmd_op == QLCNIC_BC_CMD_CHANNEL_INIT) &&
1728            (hdr->op_type == QLC_BC_CMD) &&
1729             test_bit(QLC_BC_VF_STATE, &vf->state)) {
1730                qlcnic_sriov_handle_soft_flr(adapter, trans, vf);
1731                return true;
1732        }
1733
1734        return false;
1735}
1736
1737void qlcnic_sriov_pf_handle_flr(struct qlcnic_sriov *sriov,
1738                                struct qlcnic_vf_info *vf)
1739{
1740        struct net_device *dev = vf->adapter->netdev;
1741        struct qlcnic_vport *vp = vf->vp;
1742
1743        if (!test_and_clear_bit(QLC_BC_VF_STATE, &vf->state)) {
1744                clear_bit(QLC_BC_VF_FLR, &vf->state);
1745                return;
1746        }
1747
1748        if (test_and_set_bit(QLC_BC_VF_FLR, &vf->state)) {
1749                netdev_info(dev, "FLR for PCI func %d in progress\n",
1750                            vf->pci_func);
1751                return;
1752        }
1753
1754        if (vp->vlan_mode == QLC_GUEST_VLAN_MODE)
1755                memset(vf->sriov_vlans, 0,
1756                       sizeof(*vf->sriov_vlans) * sriov->num_allowed_vlans);
1757
1758        qlcnic_sriov_schedule_flr(sriov, vf, qlcnic_sriov_pf_process_flr);
1759        netdev_info(dev, "FLR received for PCI func %d\n", vf->pci_func);
1760}
1761
1762void qlcnic_sriov_pf_reset(struct qlcnic_adapter *adapter)
1763{
1764        struct qlcnic_hardware_context *ahw = adapter->ahw;
1765        struct qlcnic_sriov *sriov = ahw->sriov;
1766        struct qlcnic_vf_info *vf;
1767        u16 num_vfs = sriov->num_vfs;
1768        int i;
1769
1770        for (i = 0; i < num_vfs; i++) {
1771                vf = &sriov->vf_info[i];
1772                vf->rx_ctx_id = 0;
1773                vf->tx_ctx_id = 0;
1774                cancel_work_sync(&vf->flr_work);
1775                __qlcnic_sriov_process_flr(vf);
1776                clear_bit(QLC_BC_VF_STATE, &vf->state);
1777        }
1778
1779        qlcnic_sriov_pf_reset_vport_handle(adapter, ahw->pci_func);
1780        QLCWRX(ahw, QLCNIC_MBX_INTR_ENBL, (ahw->num_msix - 1) << 8);
1781}
1782
1783int qlcnic_sriov_pf_reinit(struct qlcnic_adapter *adapter)
1784{
1785        struct qlcnic_hardware_context *ahw = adapter->ahw;
1786        int err;
1787
1788        if (!qlcnic_sriov_enable_check(adapter))
1789                return 0;
1790
1791        ahw->op_mode = QLCNIC_SRIOV_PF_FUNC;
1792
1793        err = qlcnic_sriov_pf_init(adapter);
1794        if (err)
1795                return err;
1796
1797        dev_info(&adapter->pdev->dev, "%s: op_mode %d\n",
1798                 __func__, ahw->op_mode);
1799        return err;
1800}
1801
1802int qlcnic_sriov_set_vf_mac(struct net_device *netdev, int vf, u8 *mac)
1803{
1804        struct qlcnic_adapter *adapter = netdev_priv(netdev);
1805        struct qlcnic_sriov *sriov = adapter->ahw->sriov;
1806        int i, num_vfs;
1807        struct qlcnic_vf_info *vf_info;
1808        u8 *curr_mac;
1809
1810        if (!qlcnic_sriov_pf_check(adapter))
1811                return -EOPNOTSUPP;
1812
1813        num_vfs = sriov->num_vfs;
1814
1815        if (!is_valid_ether_addr(mac) || vf >= num_vfs)
1816                return -EINVAL;
1817
1818        if (ether_addr_equal(adapter->mac_addr, mac)) {
1819                netdev_err(netdev, "MAC address is already in use by the PF\n");
1820                return -EINVAL;
1821        }
1822
1823        for (i = 0; i < num_vfs; i++) {
1824                vf_info = &sriov->vf_info[i];
1825                if (ether_addr_equal(vf_info->vp->mac, mac)) {
1826                        netdev_err(netdev,
1827                                   "MAC address is already in use by VF %d\n",
1828                                   i);
1829                        return -EINVAL;
1830                }
1831        }
1832
1833        vf_info = &sriov->vf_info[vf];
1834        curr_mac = vf_info->vp->mac;
1835
1836        if (test_bit(QLC_BC_VF_STATE, &vf_info->state)) {
1837                netdev_err(netdev,
1838                           "MAC address change failed for VF %d, as VF driver is loaded. Please unload VF driver and retry the operation\n",
1839                           vf);
1840                return -EOPNOTSUPP;
1841        }
1842
1843        memcpy(curr_mac, mac, netdev->addr_len);
1844        netdev_info(netdev, "MAC Address %pM  is configured for VF %d\n",
1845                    mac, vf);
1846        return 0;
1847}
1848
1849int qlcnic_sriov_set_vf_tx_rate(struct net_device *netdev, int vf,
1850                                int min_tx_rate, int max_tx_rate)
1851{
1852        struct qlcnic_adapter *adapter = netdev_priv(netdev);
1853        struct qlcnic_sriov *sriov = adapter->ahw->sriov;
1854        struct qlcnic_vf_info *vf_info;
1855        struct qlcnic_info nic_info;
1856        struct qlcnic_vport *vp;
1857        u16 vpid;
1858
1859        if (!qlcnic_sriov_pf_check(adapter))
1860                return -EOPNOTSUPP;
1861
1862        if (vf >= sriov->num_vfs)
1863                return -EINVAL;
1864
1865        vf_info = &sriov->vf_info[vf];
1866        vp = vf_info->vp;
1867        vpid = vp->handle;
1868
1869        if (!min_tx_rate)
1870                min_tx_rate = QLC_VF_MIN_TX_RATE;
1871
1872        if (max_tx_rate &&
1873            (max_tx_rate >= 10000 || max_tx_rate < min_tx_rate)) {
1874                netdev_err(netdev,
1875                           "Invalid max Tx rate, allowed range is [%d - %d]",
1876                           min_tx_rate, QLC_VF_MAX_TX_RATE);
1877                return -EINVAL;
1878        }
1879
1880        if (!max_tx_rate)
1881                max_tx_rate = 10000;
1882
1883        if (min_tx_rate &&
1884            (min_tx_rate > max_tx_rate || min_tx_rate < QLC_VF_MIN_TX_RATE)) {
1885                netdev_err(netdev,
1886                           "Invalid min Tx rate, allowed range is [%d - %d]",
1887                           QLC_VF_MIN_TX_RATE, max_tx_rate);
1888                return -EINVAL;
1889        }
1890
1891        if (test_bit(QLC_BC_VF_STATE, &vf_info->state)) {
1892                if (qlcnic_sriov_get_vf_vport_info(adapter, &nic_info, vpid))
1893                        return -EIO;
1894
1895                nic_info.max_tx_bw = max_tx_rate / 100;
1896                nic_info.min_tx_bw = min_tx_rate / 100;
1897                nic_info.bit_offsets = BIT_0;
1898
1899                if (qlcnic_sriov_pf_set_vport_info(adapter, &nic_info, vpid))
1900                        return -EIO;
1901        }
1902
1903        vp->max_tx_bw = max_tx_rate / 100;
1904        netdev_info(netdev,
1905                    "Setting Max Tx rate %d (Mbps), %d %% of PF bandwidth, for VF %d\n",
1906                    max_tx_rate, vp->max_tx_bw, vf);
1907        vp->min_tx_bw = min_tx_rate / 100;
1908        netdev_info(netdev,
1909                    "Setting Min Tx rate %d (Mbps), %d %% of PF bandwidth, for VF %d\n",
1910                    min_tx_rate, vp->min_tx_bw, vf);
1911        return 0;
1912}
1913
1914int qlcnic_sriov_set_vf_vlan(struct net_device *netdev, int vf,
1915                             u16 vlan, u8 qos, __be16 vlan_proto)
1916{
1917        struct qlcnic_adapter *adapter = netdev_priv(netdev);
1918        struct qlcnic_sriov *sriov = adapter->ahw->sriov;
1919        struct qlcnic_vf_info *vf_info;
1920        struct qlcnic_vport *vp;
1921
1922        if (!qlcnic_sriov_pf_check(adapter))
1923                return -EOPNOTSUPP;
1924
1925        if (vf >= sriov->num_vfs || qos > 7)
1926                return -EINVAL;
1927
1928        if (vlan_proto != htons(ETH_P_8021Q))
1929                return -EPROTONOSUPPORT;
1930
1931        if (vlan > MAX_VLAN_ID) {
1932                netdev_err(netdev,
1933                           "Invalid VLAN ID, allowed range is [0 - %d]\n",
1934                           MAX_VLAN_ID);
1935                return -EINVAL;
1936        }
1937
1938        vf_info = &sriov->vf_info[vf];
1939        vp = vf_info->vp;
1940        if (test_bit(QLC_BC_VF_STATE, &vf_info->state)) {
1941                netdev_err(netdev,
1942                           "VLAN change failed for VF %d, as VF driver is loaded. Please unload VF driver and retry the operation\n",
1943                           vf);
1944                return -EOPNOTSUPP;
1945        }
1946
1947        memset(vf_info->sriov_vlans, 0,
1948               sizeof(*vf_info->sriov_vlans) * sriov->num_allowed_vlans);
1949
1950        switch (vlan) {
1951        case 4095:
1952                vp->vlan_mode = QLC_GUEST_VLAN_MODE;
1953                break;
1954        case 0:
1955                vp->vlan_mode = QLC_NO_VLAN_MODE;
1956                vp->qos = 0;
1957                break;
1958        default:
1959                vp->vlan_mode = QLC_PVID_MODE;
1960                qlcnic_sriov_add_vlan_id(sriov, vf_info, vlan);
1961                vp->qos = qos;
1962                vp->pvid = vlan;
1963        }
1964
1965        netdev_info(netdev, "Setting VLAN %d, QoS %d, for VF %d\n",
1966                    vlan, qos, vf);
1967        return 0;
1968}
1969
1970static __u32 qlcnic_sriov_get_vf_vlan(struct qlcnic_adapter *adapter,
1971                                      struct qlcnic_vport *vp, int vf)
1972{
1973        __u32 vlan = 0;
1974
1975        switch (vp->vlan_mode) {
1976        case QLC_PVID_MODE:
1977                vlan = vp->pvid;
1978                break;
1979        case QLC_GUEST_VLAN_MODE:
1980                vlan = MAX_VLAN_ID;
1981                break;
1982        case QLC_NO_VLAN_MODE:
1983                vlan = 0;
1984                break;
1985        default:
1986                netdev_info(adapter->netdev, "Invalid VLAN mode = %d for VF %d\n",
1987                            vp->vlan_mode, vf);
1988        }
1989
1990        return vlan;
1991}
1992
1993int qlcnic_sriov_get_vf_config(struct net_device *netdev,
1994                               int vf, struct ifla_vf_info *ivi)
1995{
1996        struct qlcnic_adapter *adapter = netdev_priv(netdev);
1997        struct qlcnic_sriov *sriov = adapter->ahw->sriov;
1998        struct qlcnic_vport *vp;
1999
2000        if (!qlcnic_sriov_pf_check(adapter))
2001                return -EOPNOTSUPP;
2002
2003        if (vf >= sriov->num_vfs)
2004                return -EINVAL;
2005
2006        vp = sriov->vf_info[vf].vp;
2007        memcpy(&ivi->mac, vp->mac, ETH_ALEN);
2008        ivi->vlan = qlcnic_sriov_get_vf_vlan(adapter, vp, vf);
2009        ivi->qos = vp->qos;
2010        ivi->spoofchk = vp->spoofchk;
2011        if (vp->max_tx_bw == MAX_BW)
2012                ivi->max_tx_rate = 0;
2013        else
2014                ivi->max_tx_rate = vp->max_tx_bw * 100;
2015        if (vp->min_tx_bw == MIN_BW)
2016                ivi->min_tx_rate = 0;
2017        else
2018                ivi->min_tx_rate = vp->min_tx_bw * 100;
2019
2020        ivi->vf = vf;
2021        return 0;
2022}
2023
2024int qlcnic_sriov_set_vf_spoofchk(struct net_device *netdev, int vf, bool chk)
2025{
2026        struct qlcnic_adapter *adapter = netdev_priv(netdev);
2027        struct qlcnic_sriov *sriov = adapter->ahw->sriov;
2028        struct qlcnic_vf_info *vf_info;
2029        struct qlcnic_vport *vp;
2030
2031        if (!qlcnic_sriov_pf_check(adapter))
2032                return -EOPNOTSUPP;
2033
2034        if (vf >= sriov->num_vfs)
2035                return -EINVAL;
2036
2037        vf_info = &sriov->vf_info[vf];
2038        vp = vf_info->vp;
2039        if (test_bit(QLC_BC_VF_STATE, &vf_info->state)) {
2040                netdev_err(netdev,
2041                           "Spoof check change failed for VF %d, as VF driver is loaded. Please unload VF driver and retry the operation\n",
2042                           vf);
2043                return -EOPNOTSUPP;
2044        }
2045
2046        vp->spoofchk = chk;
2047        return 0;
2048}
2049