linux/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c
<<
>>
Prefs
   1/*
   2 * QLogic qlcnic NIC Driver
   3 * Copyright (c) 2009-2013 QLogic Corporation
   4 *
   5 * See LICENSE.qlcnic for copyright and licensing details.
   6 */
   7
   8#include "qlcnic_sriov.h"
   9#include "qlcnic.h"
  10#include <linux/types.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        qlcnic_sriov_alloc_vlans(adapter);
 601
 602        return err;
 603
 604del_flr_queue:
 605        qlcnic_sriov_pf_del_flr_queue(adapter);
 606
 607sriov_cleanup:
 608        __qlcnic_sriov_cleanup(adapter);
 609
 610clear_op_mode:
 611        clear_bit(__QLCNIC_SRIOV_ENABLE, &adapter->state);
 612        adapter->ahw->op_mode = QLCNIC_MGMT_FUNC;
 613        return err;
 614}
 615
 616static int qlcnic_pci_sriov_enable(struct qlcnic_adapter *adapter, int num_vfs)
 617{
 618        struct net_device *netdev = adapter->netdev;
 619        int err;
 620
 621        if (!(adapter->flags & QLCNIC_MSIX_ENABLED)) {
 622                netdev_err(netdev,
 623                           "SR-IOV cannot be enabled, when legacy interrupts are enabled\n");
 624                return -EIO;
 625        }
 626
 627        rtnl_lock();
 628        if (netif_running(netdev))
 629                __qlcnic_down(adapter, netdev);
 630
 631        err = __qlcnic_pci_sriov_enable(adapter, num_vfs);
 632        if (err)
 633                goto error;
 634
 635        if (netif_running(netdev))
 636                __qlcnic_up(adapter, netdev);
 637
 638        rtnl_unlock();
 639        err = qlcnic_sriov_pf_enable(adapter, num_vfs);
 640        if (!err) {
 641                netdev_info(netdev,
 642                            "SR-IOV is enabled successfully on port %d\n",
 643                            adapter->portnum);
 644                /* Return number of vfs enabled */
 645                return num_vfs;
 646        }
 647
 648        rtnl_lock();
 649        if (netif_running(netdev))
 650                __qlcnic_down(adapter, netdev);
 651
 652error:
 653        if (!qlcnic_83xx_configure_opmode(adapter)) {
 654                if (netif_running(netdev))
 655                        __qlcnic_up(adapter, netdev);
 656        }
 657
 658        rtnl_unlock();
 659        netdev_info(netdev, "Failed to enable SR-IOV on port %d\n",
 660                    adapter->portnum);
 661
 662        return err;
 663}
 664
 665int qlcnic_pci_sriov_configure(struct pci_dev *dev, int num_vfs)
 666{
 667        struct qlcnic_adapter *adapter = pci_get_drvdata(dev);
 668        int err;
 669
 670        if (test_and_set_bit(__QLCNIC_RESETTING, &adapter->state))
 671                return -EBUSY;
 672
 673        if (num_vfs == 0)
 674                err = qlcnic_pci_sriov_disable(adapter);
 675        else
 676                err = qlcnic_pci_sriov_enable(adapter, num_vfs);
 677
 678        clear_bit(__QLCNIC_RESETTING, &adapter->state);
 679        return err;
 680}
 681
 682static int qlcnic_sriov_set_vf_acl(struct qlcnic_adapter *adapter, u8 func)
 683{
 684        struct qlcnic_cmd_args cmd;
 685        struct qlcnic_vport *vp;
 686        int err, id;
 687        u8 *mac;
 688
 689        id = qlcnic_sriov_func_to_index(adapter, func);
 690        if (id < 0)
 691                return id;
 692
 693        vp = adapter->ahw->sriov->vf_info[id].vp;
 694        err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_SET_NIC_INFO);
 695        if (err)
 696                return err;
 697
 698        cmd.req.arg[1] = 0x3 | func << 16;
 699        if (vp->spoofchk == true) {
 700                mac = vp->mac;
 701                cmd.req.arg[2] |= BIT_1 | BIT_3 | BIT_8;
 702                cmd.req.arg[4] = mac[5] | mac[4] << 8 | mac[3] << 16 |
 703                                 mac[2] << 24;
 704                cmd.req.arg[5] = mac[1] | mac[0] << 8;
 705        }
 706
 707        if (vp->vlan_mode == QLC_PVID_MODE) {
 708                cmd.req.arg[2] |= BIT_6;
 709                cmd.req.arg[3] |= vp->pvid << 8;
 710        }
 711
 712        err = qlcnic_issue_cmd(adapter, &cmd);
 713        if (err)
 714                dev_err(&adapter->pdev->dev, "Failed to set ACL, err=%d\n",
 715                        err);
 716
 717        qlcnic_free_mbx_args(&cmd);
 718        return err;
 719}
 720
 721static int qlcnic_sriov_set_vf_vport_info(struct qlcnic_adapter *adapter,
 722                                          u16 func)
 723{
 724        struct qlcnic_info defvp_info;
 725        int err;
 726
 727        err = qlcnic_sriov_pf_cal_res_limit(adapter, &defvp_info, func);
 728        if (err)
 729                return -EIO;
 730
 731        err = qlcnic_sriov_set_vf_acl(adapter, func);
 732        if (err)
 733                return err;
 734
 735        return 0;
 736}
 737
 738static int qlcnic_sriov_pf_channel_cfg_cmd(struct qlcnic_bc_trans *trans,
 739                                           struct qlcnic_cmd_args *cmd)
 740{
 741        struct qlcnic_vf_info *vf = trans->vf;
 742        struct qlcnic_vport *vp = vf->vp;
 743        struct qlcnic_adapter *adapter;
 744        struct qlcnic_sriov *sriov;
 745        u16 func = vf->pci_func;
 746        size_t size;
 747        int err;
 748
 749        adapter = vf->adapter;
 750        sriov = adapter->ahw->sriov;
 751
 752        if (trans->req_hdr->cmd_op == QLCNIC_BC_CMD_CHANNEL_INIT) {
 753                err = qlcnic_sriov_pf_config_vport(adapter, 1, func);
 754                if (!err) {
 755                        err = qlcnic_sriov_set_vf_vport_info(adapter, func);
 756                        if (err)
 757                                qlcnic_sriov_pf_config_vport(adapter, 0, func);
 758                }
 759        } else {
 760                if (vp->vlan_mode == QLC_GUEST_VLAN_MODE) {
 761                        size = sizeof(*vf->sriov_vlans);
 762                        size = size * sriov->num_allowed_vlans;
 763                        memset(vf->sriov_vlans, 0, size);
 764                }
 765
 766                err = qlcnic_sriov_pf_config_vport(adapter, 0, func);
 767        }
 768
 769        if (err)
 770                goto err_out;
 771
 772        cmd->rsp.arg[0] |= (1 << 25);
 773
 774        if (trans->req_hdr->cmd_op == QLCNIC_BC_CMD_CHANNEL_INIT)
 775                set_bit(QLC_BC_VF_STATE, &vf->state);
 776        else
 777                clear_bit(QLC_BC_VF_STATE, &vf->state);
 778
 779        return err;
 780
 781err_out:
 782        cmd->rsp.arg[0] |= (2 << 25);
 783        return err;
 784}
 785
 786static int qlcnic_sriov_cfg_vf_def_mac(struct qlcnic_adapter *adapter,
 787                                       struct qlcnic_vf_info *vf,
 788                                       u16 vlan, u8 op)
 789{
 790        struct qlcnic_cmd_args *cmd;
 791        struct qlcnic_macvlan_mbx mv;
 792        struct qlcnic_vport *vp;
 793        u8 *addr;
 794        int err;
 795        u32 *buf;
 796        int vpid;
 797
 798        vp = vf->vp;
 799
 800        cmd = kzalloc(sizeof(*cmd), GFP_ATOMIC);
 801        if (!cmd)
 802                return -ENOMEM;
 803
 804        err = qlcnic_alloc_mbx_args(cmd, adapter, QLCNIC_CMD_CONFIG_MAC_VLAN);
 805        if (err)
 806                goto free_cmd;
 807
 808        cmd->type = QLC_83XX_MBX_CMD_NO_WAIT;
 809        vpid = qlcnic_sriov_pf_get_vport_handle(adapter, vf->pci_func);
 810        if (vpid < 0) {
 811                err = -EINVAL;
 812                goto free_args;
 813        }
 814
 815        if (vlan)
 816                op = ((op == QLCNIC_MAC_ADD || op == QLCNIC_MAC_VLAN_ADD) ?
 817                      QLCNIC_MAC_VLAN_ADD : QLCNIC_MAC_VLAN_DEL);
 818
 819        cmd->req.arg[1] = op | (1 << 8) | (3 << 6);
 820        cmd->req.arg[1] |= ((vpid & 0xffff) << 16) | BIT_31;
 821
 822        addr = vp->mac;
 823        mv.vlan = vlan;
 824        mv.mac_addr0 = addr[0];
 825        mv.mac_addr1 = addr[1];
 826        mv.mac_addr2 = addr[2];
 827        mv.mac_addr3 = addr[3];
 828        mv.mac_addr4 = addr[4];
 829        mv.mac_addr5 = addr[5];
 830        buf = &cmd->req.arg[2];
 831        memcpy(buf, &mv, sizeof(struct qlcnic_macvlan_mbx));
 832
 833        err = qlcnic_issue_cmd(adapter, cmd);
 834
 835        if (!err)
 836                return err;
 837
 838free_args:
 839        qlcnic_free_mbx_args(cmd);
 840free_cmd:
 841        kfree(cmd);
 842        return err;
 843}
 844
 845static int qlcnic_sriov_validate_create_rx_ctx(struct qlcnic_cmd_args *cmd)
 846{
 847        if ((cmd->req.arg[0] >> 29) != 0x3)
 848                return -EINVAL;
 849
 850        return 0;
 851}
 852
 853static void qlcnic_83xx_cfg_default_mac_vlan(struct qlcnic_adapter *adapter,
 854                                             struct qlcnic_vf_info *vf,
 855                                             int opcode)
 856{
 857        struct qlcnic_sriov *sriov;
 858        u16 vlan;
 859        int i;
 860
 861        sriov = adapter->ahw->sriov;
 862
 863        spin_lock_bh(&vf->vlan_list_lock);
 864        if (vf->num_vlan) {
 865                for (i = 0; i < sriov->num_allowed_vlans; i++) {
 866                        vlan = vf->sriov_vlans[i];
 867                        if (vlan)
 868                                qlcnic_sriov_cfg_vf_def_mac(adapter, vf, vlan,
 869                                                            opcode);
 870                }
 871        }
 872        spin_unlock_bh(&vf->vlan_list_lock);
 873
 874        if (vf->vp->vlan_mode != QLC_PVID_MODE) {
 875                if (qlcnic_83xx_pf_check(adapter) &&
 876                    qlcnic_sriov_check_any_vlan(vf))
 877                        return;
 878                qlcnic_sriov_cfg_vf_def_mac(adapter, vf, 0, opcode);
 879        }
 880}
 881
 882static int qlcnic_sriov_pf_create_rx_ctx_cmd(struct qlcnic_bc_trans *tran,
 883                                             struct qlcnic_cmd_args *cmd)
 884{
 885        struct qlcnic_vf_info *vf = tran->vf;
 886        struct qlcnic_adapter *adapter = vf->adapter;
 887        struct qlcnic_rcv_mbx_out *mbx_out;
 888        int err;
 889
 890        err = qlcnic_sriov_validate_create_rx_ctx(cmd);
 891        if (err) {
 892                cmd->rsp.arg[0] |= (0x6 << 25);
 893                return err;
 894        }
 895
 896        cmd->req.arg[6] = vf->vp->handle;
 897        err = qlcnic_issue_cmd(adapter, cmd);
 898
 899        if (!err) {
 900                mbx_out = (struct qlcnic_rcv_mbx_out *)&cmd->rsp.arg[1];
 901                vf->rx_ctx_id = mbx_out->ctx_id;
 902                qlcnic_83xx_cfg_default_mac_vlan(adapter, vf, QLCNIC_MAC_ADD);
 903        } else {
 904                vf->rx_ctx_id = 0;
 905        }
 906
 907        return err;
 908}
 909
 910static int qlcnic_sriov_pf_mac_address_cmd(struct qlcnic_bc_trans *trans,
 911                                           struct qlcnic_cmd_args *cmd)
 912{
 913        struct qlcnic_vf_info *vf = trans->vf;
 914        u8 type, *mac;
 915
 916        type = cmd->req.arg[1];
 917        switch (type) {
 918        case QLCNIC_SET_STATION_MAC:
 919        case QLCNIC_SET_FAC_DEF_MAC:
 920                cmd->rsp.arg[0] = (2 << 25);
 921                break;
 922        case QLCNIC_GET_CURRENT_MAC:
 923                cmd->rsp.arg[0] = (1 << 25);
 924                mac = vf->vp->mac;
 925                cmd->rsp.arg[2] = mac[1] | ((mac[0] << 8) & 0xff00);
 926                cmd->rsp.arg[1] = mac[5] | ((mac[4] << 8) & 0xff00) |
 927                                  ((mac[3]) << 16 & 0xff0000) |
 928                                  ((mac[2]) << 24 & 0xff000000);
 929        }
 930
 931        return 0;
 932}
 933
 934static int qlcnic_sriov_validate_create_tx_ctx(struct qlcnic_cmd_args *cmd)
 935{
 936        if ((cmd->req.arg[0] >> 29) != 0x3)
 937                return -EINVAL;
 938
 939        return 0;
 940}
 941
 942static int qlcnic_sriov_pf_create_tx_ctx_cmd(struct qlcnic_bc_trans *trans,
 943                                             struct qlcnic_cmd_args *cmd)
 944{
 945        struct qlcnic_vf_info *vf = trans->vf;
 946        struct qlcnic_adapter *adapter = vf->adapter;
 947        struct qlcnic_tx_mbx_out *mbx_out;
 948        int err;
 949
 950        err = qlcnic_sriov_validate_create_tx_ctx(cmd);
 951        if (err) {
 952                cmd->rsp.arg[0] |= (0x6 << 25);
 953                return err;
 954        }
 955
 956        cmd->req.arg[5] |= vf->vp->handle << 16;
 957        err = qlcnic_issue_cmd(adapter, cmd);
 958        if (!err) {
 959                mbx_out = (struct qlcnic_tx_mbx_out *)&cmd->rsp.arg[2];
 960                vf->tx_ctx_id = mbx_out->ctx_id;
 961        } else {
 962                vf->tx_ctx_id = 0;
 963        }
 964
 965        return err;
 966}
 967
 968static int qlcnic_sriov_validate_del_rx_ctx(struct qlcnic_vf_info *vf,
 969                                            struct qlcnic_cmd_args *cmd)
 970{
 971        if ((cmd->req.arg[0] >> 29) != 0x3)
 972                return -EINVAL;
 973
 974        if ((cmd->req.arg[1] & 0xffff) != vf->rx_ctx_id)
 975                return -EINVAL;
 976
 977        return 0;
 978}
 979
 980static int qlcnic_sriov_pf_del_rx_ctx_cmd(struct qlcnic_bc_trans *trans,
 981                                          struct qlcnic_cmd_args *cmd)
 982{
 983        struct qlcnic_vf_info *vf = trans->vf;
 984        struct qlcnic_adapter *adapter = vf->adapter;
 985        int err;
 986
 987        err = qlcnic_sriov_validate_del_rx_ctx(vf, cmd);
 988        if (err) {
 989                cmd->rsp.arg[0] |= (0x6 << 25);
 990                return err;
 991        }
 992
 993        qlcnic_83xx_cfg_default_mac_vlan(adapter, vf, QLCNIC_MAC_DEL);
 994        cmd->req.arg[1] |= vf->vp->handle << 16;
 995        err = qlcnic_issue_cmd(adapter, cmd);
 996
 997        if (!err)
 998                vf->rx_ctx_id = 0;
 999
1000        return err;
1001}
1002
1003static int qlcnic_sriov_validate_del_tx_ctx(struct qlcnic_vf_info *vf,
1004                                            struct qlcnic_cmd_args *cmd)
1005{
1006        if ((cmd->req.arg[0] >> 29) != 0x3)
1007                return -EINVAL;
1008
1009        if ((cmd->req.arg[1] & 0xffff) != vf->tx_ctx_id)
1010                return -EINVAL;
1011
1012        return 0;
1013}
1014
1015static int qlcnic_sriov_pf_del_tx_ctx_cmd(struct qlcnic_bc_trans *trans,
1016                                          struct qlcnic_cmd_args *cmd)
1017{
1018        struct qlcnic_vf_info *vf = trans->vf;
1019        struct qlcnic_adapter *adapter = vf->adapter;
1020        int err;
1021
1022        err = qlcnic_sriov_validate_del_tx_ctx(vf, cmd);
1023        if (err) {
1024                cmd->rsp.arg[0] |= (0x6 << 25);
1025                return err;
1026        }
1027
1028        cmd->req.arg[1] |= vf->vp->handle << 16;
1029        err = qlcnic_issue_cmd(adapter, cmd);
1030
1031        if (!err)
1032                vf->tx_ctx_id = 0;
1033
1034        return err;
1035}
1036
1037static int qlcnic_sriov_validate_cfg_lro(struct qlcnic_vf_info *vf,
1038                                         struct qlcnic_cmd_args *cmd)
1039{
1040        if ((cmd->req.arg[1] >> 16) != vf->rx_ctx_id)
1041                return -EINVAL;
1042
1043        return 0;
1044}
1045
1046static int qlcnic_sriov_pf_cfg_lro_cmd(struct qlcnic_bc_trans *trans,
1047                                       struct qlcnic_cmd_args *cmd)
1048{
1049        struct qlcnic_vf_info *vf = trans->vf;
1050        struct qlcnic_adapter *adapter = vf->adapter;
1051        int err;
1052
1053        err = qlcnic_sriov_validate_cfg_lro(vf, cmd);
1054        if (err) {
1055                cmd->rsp.arg[0] |= (0x6 << 25);
1056                return err;
1057        }
1058
1059        err = qlcnic_issue_cmd(adapter, cmd);
1060        return err;
1061}
1062
1063static int qlcnic_sriov_pf_cfg_ip_cmd(struct qlcnic_bc_trans *trans,
1064                                      struct qlcnic_cmd_args *cmd)
1065{
1066        struct qlcnic_vf_info *vf = trans->vf;
1067        struct qlcnic_adapter *adapter = vf->adapter;
1068        int err = -EIO;
1069        u8 op;
1070
1071        op =  cmd->req.arg[1] & 0xff;
1072
1073        cmd->req.arg[1] |= vf->vp->handle << 16;
1074        cmd->req.arg[1] |= BIT_31;
1075
1076        err = qlcnic_issue_cmd(adapter, cmd);
1077        return err;
1078}
1079
1080static int qlcnic_sriov_validate_cfg_intrpt(struct qlcnic_vf_info *vf,
1081                                            struct qlcnic_cmd_args *cmd)
1082{
1083        if (((cmd->req.arg[1] >> 8) & 0xff) != vf->pci_func)
1084                return -EINVAL;
1085
1086        if (!(cmd->req.arg[1] & BIT_16))
1087                return -EINVAL;
1088
1089        if ((cmd->req.arg[1] & 0xff) != 0x1)
1090                return -EINVAL;
1091
1092        return 0;
1093}
1094
1095static int qlcnic_sriov_pf_cfg_intrpt_cmd(struct qlcnic_bc_trans *trans,
1096                                          struct qlcnic_cmd_args *cmd)
1097{
1098        struct qlcnic_vf_info *vf = trans->vf;
1099        struct qlcnic_adapter *adapter = vf->adapter;
1100        int err;
1101
1102        err = qlcnic_sriov_validate_cfg_intrpt(vf, cmd);
1103        if (err)
1104                cmd->rsp.arg[0] |= (0x6 << 25);
1105        else
1106                err = qlcnic_issue_cmd(adapter, cmd);
1107
1108        return err;
1109}
1110
1111static int qlcnic_sriov_validate_mtu(struct qlcnic_adapter *adapter,
1112                                     struct qlcnic_vf_info *vf,
1113                                     struct qlcnic_cmd_args *cmd)
1114{
1115        if (cmd->req.arg[1] != vf->rx_ctx_id)
1116                return -EINVAL;
1117
1118        if (cmd->req.arg[2] > adapter->ahw->max_mtu)
1119                return -EINVAL;
1120
1121        return 0;
1122}
1123
1124static int qlcnic_sriov_pf_set_mtu_cmd(struct qlcnic_bc_trans *trans,
1125                                       struct qlcnic_cmd_args *cmd)
1126{
1127        struct qlcnic_vf_info *vf = trans->vf;
1128        struct qlcnic_adapter *adapter = vf->adapter;
1129        int err;
1130
1131        err = qlcnic_sriov_validate_mtu(adapter, vf, cmd);
1132        if (err)
1133                cmd->rsp.arg[0] |= (0x6 << 25);
1134        else
1135                err = qlcnic_issue_cmd(adapter, cmd);
1136
1137        return err;
1138}
1139
1140static int qlcnic_sriov_validate_get_nic_info(struct qlcnic_vf_info *vf,
1141                                              struct qlcnic_cmd_args *cmd)
1142{
1143        if (cmd->req.arg[1] & BIT_31) {
1144                if (((cmd->req.arg[1] >> 16) & 0x7fff) != vf->pci_func)
1145                        return -EINVAL;
1146        } else {
1147                cmd->req.arg[1] |= vf->vp->handle << 16;
1148        }
1149
1150        return 0;
1151}
1152
1153static int qlcnic_sriov_pf_get_nic_info_cmd(struct qlcnic_bc_trans *trans,
1154                                            struct qlcnic_cmd_args *cmd)
1155{
1156        struct qlcnic_vf_info *vf = trans->vf;
1157        struct qlcnic_adapter *adapter = vf->adapter;
1158        int err;
1159
1160        err = qlcnic_sriov_validate_get_nic_info(vf, cmd);
1161        if (err) {
1162                cmd->rsp.arg[0] |= (0x6 << 25);
1163                return err;
1164        }
1165
1166        err = qlcnic_issue_cmd(adapter, cmd);
1167        return err;
1168}
1169
1170static int qlcnic_sriov_validate_cfg_rss(struct qlcnic_vf_info *vf,
1171                                         struct qlcnic_cmd_args *cmd)
1172{
1173        if (cmd->req.arg[1] != vf->rx_ctx_id)
1174                return -EINVAL;
1175
1176        return 0;
1177}
1178
1179static int qlcnic_sriov_pf_cfg_rss_cmd(struct qlcnic_bc_trans *trans,
1180                                       struct qlcnic_cmd_args *cmd)
1181{
1182        struct qlcnic_vf_info *vf = trans->vf;
1183        struct qlcnic_adapter *adapter = vf->adapter;
1184        int err;
1185
1186        err = qlcnic_sriov_validate_cfg_rss(vf, cmd);
1187        if (err)
1188                cmd->rsp.arg[0] |= (0x6 << 25);
1189        else
1190                err = qlcnic_issue_cmd(adapter, cmd);
1191
1192        return err;
1193}
1194
1195static int qlcnic_sriov_validate_cfg_intrcoal(struct qlcnic_adapter *adapter,
1196                                              struct qlcnic_vf_info *vf,
1197                                              struct qlcnic_cmd_args *cmd)
1198{
1199        struct qlcnic_nic_intr_coalesce *coal = &adapter->ahw->coal;
1200        u16 ctx_id, pkts, time;
1201        int err = -EINVAL;
1202        u8 type;
1203
1204        type = cmd->req.arg[1] & QLC_INTR_COAL_TYPE_MASK;
1205        ctx_id = cmd->req.arg[1] >> 16;
1206        pkts = cmd->req.arg[2] & 0xffff;
1207        time = cmd->req.arg[2] >> 16;
1208
1209        switch (type) {
1210        case QLCNIC_INTR_COAL_TYPE_RX:
1211                if (ctx_id != vf->rx_ctx_id || pkts > coal->rx_packets ||
1212                    time < coal->rx_time_us)
1213                        goto err_label;
1214                break;
1215        case QLCNIC_INTR_COAL_TYPE_TX:
1216                if (ctx_id != vf->tx_ctx_id || pkts > coal->tx_packets ||
1217                    time < coal->tx_time_us)
1218                        goto err_label;
1219                break;
1220        default:
1221                netdev_err(adapter->netdev, "Invalid coalescing type 0x%x received\n",
1222                           type);
1223                return err;
1224        }
1225
1226        return 0;
1227
1228err_label:
1229        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",
1230                   vf->rx_ctx_id, coal->rx_packets, coal->rx_time_us,
1231                   vf->tx_ctx_id, coal->tx_packets, coal->tx_time_us);
1232        netdev_err(adapter->netdev, "Received: ctx_id 0x%x packets 0x%x time_us 0x%x type 0x%x\n",
1233                   ctx_id, pkts, time, type);
1234
1235        return err;
1236}
1237
1238static int qlcnic_sriov_pf_cfg_intrcoal_cmd(struct qlcnic_bc_trans *tran,
1239                                            struct qlcnic_cmd_args *cmd)
1240{
1241        struct qlcnic_vf_info *vf = tran->vf;
1242        struct qlcnic_adapter *adapter = vf->adapter;
1243        int err;
1244
1245        err = qlcnic_sriov_validate_cfg_intrcoal(adapter, vf, cmd);
1246        if (err) {
1247                cmd->rsp.arg[0] |= (0x6 << 25);
1248                return err;
1249        }
1250
1251        err = qlcnic_issue_cmd(adapter, cmd);
1252        return err;
1253}
1254
1255static int qlcnic_sriov_validate_cfg_macvlan(struct qlcnic_adapter *adapter,
1256                                             struct qlcnic_vf_info *vf,
1257                                             struct qlcnic_cmd_args *cmd)
1258{
1259        struct qlcnic_vport *vp = vf->vp;
1260        u8 op, new_op;
1261
1262        if (!(cmd->req.arg[1] & BIT_8))
1263                return -EINVAL;
1264
1265        cmd->req.arg[1] |= (vf->vp->handle << 16);
1266        cmd->req.arg[1] |= BIT_31;
1267
1268        if (vp->vlan_mode == QLC_PVID_MODE) {
1269                op = cmd->req.arg[1] & 0x7;
1270                cmd->req.arg[1] &= ~0x7;
1271                new_op = (op == QLCNIC_MAC_ADD || op == QLCNIC_MAC_VLAN_ADD) ?
1272                         QLCNIC_MAC_VLAN_ADD : QLCNIC_MAC_VLAN_DEL;
1273                cmd->req.arg[3] |= vp->pvid << 16;
1274                cmd->req.arg[1] |= new_op;
1275        }
1276
1277        return 0;
1278}
1279
1280static int qlcnic_sriov_pf_cfg_macvlan_cmd(struct qlcnic_bc_trans *trans,
1281                                           struct qlcnic_cmd_args *cmd)
1282{
1283        struct qlcnic_vf_info *vf = trans->vf;
1284        struct qlcnic_adapter *adapter = vf->adapter;
1285        int err;
1286
1287        err = qlcnic_sriov_validate_cfg_macvlan(adapter, vf, cmd);
1288        if (err) {
1289                cmd->rsp.arg[0] |= (0x6 << 25);
1290                return err;
1291        }
1292
1293        err = qlcnic_issue_cmd(adapter, cmd);
1294        return err;
1295}
1296
1297static int qlcnic_sriov_validate_linkevent(struct qlcnic_vf_info *vf,
1298                                           struct qlcnic_cmd_args *cmd)
1299{
1300        if ((cmd->req.arg[1] >> 16) != vf->rx_ctx_id)
1301                return -EINVAL;
1302
1303        return 0;
1304}
1305
1306static int qlcnic_sriov_pf_linkevent_cmd(struct qlcnic_bc_trans *trans,
1307                                         struct qlcnic_cmd_args *cmd)
1308{
1309        struct qlcnic_vf_info *vf = trans->vf;
1310        struct qlcnic_adapter *adapter = vf->adapter;
1311        int err;
1312
1313        err = qlcnic_sriov_validate_linkevent(vf, cmd);
1314        if (err) {
1315                cmd->rsp.arg[0] |= (0x6 << 25);
1316                return err;
1317        }
1318
1319        err = qlcnic_issue_cmd(adapter, cmd);
1320        return err;
1321}
1322
1323static int qlcnic_sriov_pf_cfg_promisc_cmd(struct qlcnic_bc_trans *trans,
1324                                           struct qlcnic_cmd_args *cmd)
1325{
1326        struct qlcnic_vf_info *vf = trans->vf;
1327        struct qlcnic_adapter *adapter = vf->adapter;
1328        int err;
1329
1330        cmd->req.arg[1] |= vf->vp->handle << 16;
1331        cmd->req.arg[1] |= BIT_31;
1332        err = qlcnic_issue_cmd(adapter, cmd);
1333        return err;
1334}
1335
1336static int qlcnic_sriov_pf_get_acl_cmd(struct qlcnic_bc_trans *trans,
1337                                       struct qlcnic_cmd_args *cmd)
1338{
1339        struct qlcnic_vf_info *vf = trans->vf;
1340        struct qlcnic_vport *vp = vf->vp;
1341        u8 cmd_op, mode = vp->vlan_mode;
1342        struct qlcnic_adapter *adapter;
1343        struct qlcnic_sriov *sriov;
1344
1345        adapter = vf->adapter;
1346        sriov = adapter->ahw->sriov;
1347
1348        cmd_op = trans->req_hdr->cmd_op;
1349        cmd->rsp.arg[0] |= 1 << 25;
1350
1351        /* For 84xx adapter in case of PVID , PFD should send vlan mode as
1352         * QLC_NO_VLAN_MODE to VFD which is zero in mailbox response
1353         */
1354        if (qlcnic_84xx_check(adapter) && mode == QLC_PVID_MODE)
1355                return 0;
1356
1357        switch (mode) {
1358        case QLC_GUEST_VLAN_MODE:
1359                cmd->rsp.arg[1] = mode | 1 << 8;
1360                cmd->rsp.arg[2] = sriov->num_allowed_vlans << 16;
1361                break;
1362        case QLC_PVID_MODE:
1363                cmd->rsp.arg[1] = mode | 1 << 8 | vp->pvid << 16;
1364                break;
1365        }
1366
1367        return 0;
1368}
1369
1370static int qlcnic_sriov_pf_del_guest_vlan(struct qlcnic_adapter *adapter,
1371                                          struct qlcnic_vf_info *vf,
1372                                          struct qlcnic_cmd_args *cmd)
1373{
1374        struct qlcnic_sriov *sriov = adapter->ahw->sriov;
1375        u16 vlan;
1376
1377        if (!qlcnic_sriov_check_any_vlan(vf))
1378                return -EINVAL;
1379
1380        vlan = cmd->req.arg[1] >> 16;
1381        if (!vf->rx_ctx_id) {
1382                qlcnic_sriov_del_vlan_id(sriov, vf, vlan);
1383                return 0;
1384        }
1385
1386        qlcnic_sriov_cfg_vf_def_mac(adapter, vf, vlan, QLCNIC_MAC_DEL);
1387        qlcnic_sriov_del_vlan_id(sriov, vf, vlan);
1388
1389        if (qlcnic_83xx_pf_check(adapter))
1390                qlcnic_sriov_cfg_vf_def_mac(adapter, vf,
1391                                            0, QLCNIC_MAC_ADD);
1392        return 0;
1393}
1394
1395static int qlcnic_sriov_pf_add_guest_vlan(struct qlcnic_adapter *adapter,
1396                                          struct qlcnic_vf_info *vf,
1397                                          struct qlcnic_cmd_args *cmd)
1398{
1399        struct qlcnic_sriov *sriov = adapter->ahw->sriov;
1400        int err = -EIO;
1401        u16 vlan;
1402
1403        if (qlcnic_83xx_pf_check(adapter) && qlcnic_sriov_check_any_vlan(vf))
1404                return err;
1405
1406        vlan = cmd->req.arg[1] >> 16;
1407
1408        if (!vf->rx_ctx_id) {
1409                qlcnic_sriov_add_vlan_id(sriov, vf, vlan);
1410                return 0;
1411        }
1412
1413        if (qlcnic_83xx_pf_check(adapter)) {
1414                err = qlcnic_sriov_cfg_vf_def_mac(adapter, vf, 0,
1415                                                  QLCNIC_MAC_DEL);
1416                if (err)
1417                        return err;
1418        }
1419
1420        err = qlcnic_sriov_cfg_vf_def_mac(adapter, vf, vlan, QLCNIC_MAC_ADD);
1421
1422        if (err) {
1423                if (qlcnic_83xx_pf_check(adapter))
1424                        qlcnic_sriov_cfg_vf_def_mac(adapter, vf, 0,
1425                                                    QLCNIC_MAC_ADD);
1426                return err;
1427        }
1428
1429        qlcnic_sriov_add_vlan_id(sriov, vf, vlan);
1430        return err;
1431}
1432
1433static int qlcnic_sriov_pf_cfg_guest_vlan_cmd(struct qlcnic_bc_trans *tran,
1434                                              struct qlcnic_cmd_args *cmd)
1435{
1436        struct qlcnic_vf_info  *vf = tran->vf;
1437        struct qlcnic_adapter *adapter =  vf->adapter;
1438        struct qlcnic_vport *vp = vf->vp;
1439        int err = -EIO;
1440        u8 op;
1441
1442        if (vp->vlan_mode != QLC_GUEST_VLAN_MODE) {
1443                cmd->rsp.arg[0] |= 2 << 25;
1444                return err;
1445        }
1446
1447        op = cmd->req.arg[1] & 0xf;
1448
1449        if (op)
1450                err = qlcnic_sriov_pf_add_guest_vlan(adapter, vf, cmd);
1451        else
1452                err = qlcnic_sriov_pf_del_guest_vlan(adapter, vf, cmd);
1453
1454        cmd->rsp.arg[0] |= err ? 2 << 25 : 1 << 25;
1455        return err;
1456}
1457
1458static const int qlcnic_pf_passthru_supp_cmds[] = {
1459        QLCNIC_CMD_GET_STATISTICS,
1460        QLCNIC_CMD_GET_PORT_CONFIG,
1461        QLCNIC_CMD_GET_LINK_STATUS,
1462        QLCNIC_CMD_INIT_NIC_FUNC,
1463        QLCNIC_CMD_STOP_NIC_FUNC,
1464};
1465
1466static const struct qlcnic_sriov_cmd_handler qlcnic_pf_bc_cmd_hdlr[] = {
1467        [QLCNIC_BC_CMD_CHANNEL_INIT] = {&qlcnic_sriov_pf_channel_cfg_cmd},
1468        [QLCNIC_BC_CMD_CHANNEL_TERM] = {&qlcnic_sriov_pf_channel_cfg_cmd},
1469        [QLCNIC_BC_CMD_GET_ACL] = {&qlcnic_sriov_pf_get_acl_cmd},
1470        [QLCNIC_BC_CMD_CFG_GUEST_VLAN]  = {&qlcnic_sriov_pf_cfg_guest_vlan_cmd},
1471};
1472
1473static const struct qlcnic_sriov_fw_cmd_handler qlcnic_pf_fw_cmd_hdlr[] = {
1474        {QLCNIC_CMD_CREATE_RX_CTX, qlcnic_sriov_pf_create_rx_ctx_cmd},
1475        {QLCNIC_CMD_CREATE_TX_CTX, qlcnic_sriov_pf_create_tx_ctx_cmd},
1476        {QLCNIC_CMD_MAC_ADDRESS, qlcnic_sriov_pf_mac_address_cmd},
1477        {QLCNIC_CMD_DESTROY_RX_CTX, qlcnic_sriov_pf_del_rx_ctx_cmd},
1478        {QLCNIC_CMD_DESTROY_TX_CTX, qlcnic_sriov_pf_del_tx_ctx_cmd},
1479        {QLCNIC_CMD_CONFIGURE_HW_LRO, qlcnic_sriov_pf_cfg_lro_cmd},
1480        {QLCNIC_CMD_CONFIGURE_IP_ADDR, qlcnic_sriov_pf_cfg_ip_cmd},
1481        {QLCNIC_CMD_CONFIG_INTRPT, qlcnic_sriov_pf_cfg_intrpt_cmd},
1482        {QLCNIC_CMD_SET_MTU, qlcnic_sriov_pf_set_mtu_cmd},
1483        {QLCNIC_CMD_GET_NIC_INFO, qlcnic_sriov_pf_get_nic_info_cmd},
1484        {QLCNIC_CMD_CONFIGURE_RSS, qlcnic_sriov_pf_cfg_rss_cmd},
1485        {QLCNIC_CMD_CONFIG_INTR_COAL, qlcnic_sriov_pf_cfg_intrcoal_cmd},
1486        {QLCNIC_CMD_CONFIG_MAC_VLAN, qlcnic_sriov_pf_cfg_macvlan_cmd},
1487        {QLCNIC_CMD_GET_LINK_EVENT, qlcnic_sriov_pf_linkevent_cmd},
1488        {QLCNIC_CMD_CONFIGURE_MAC_RX_MODE, qlcnic_sriov_pf_cfg_promisc_cmd},
1489};
1490
1491void qlcnic_sriov_pf_process_bc_cmd(struct qlcnic_adapter *adapter,
1492                                    struct qlcnic_bc_trans *trans,
1493                                    struct qlcnic_cmd_args *cmd)
1494{
1495        u8 size, cmd_op;
1496
1497        cmd_op = trans->req_hdr->cmd_op;
1498
1499        if (trans->req_hdr->op_type == QLC_BC_CMD) {
1500                size = ARRAY_SIZE(qlcnic_pf_bc_cmd_hdlr);
1501                if (cmd_op < size) {
1502                        qlcnic_pf_bc_cmd_hdlr[cmd_op].fn(trans, cmd);
1503                        return;
1504                }
1505        } else {
1506                int i;
1507                size = ARRAY_SIZE(qlcnic_pf_fw_cmd_hdlr);
1508                for (i = 0; i < size; i++) {
1509                        if (cmd_op == qlcnic_pf_fw_cmd_hdlr[i].cmd) {
1510                                qlcnic_pf_fw_cmd_hdlr[i].fn(trans, cmd);
1511                                return;
1512                        }
1513                }
1514
1515                size = ARRAY_SIZE(qlcnic_pf_passthru_supp_cmds);
1516                for (i = 0; i < size; i++) {
1517                        if (cmd_op == qlcnic_pf_passthru_supp_cmds[i]) {
1518                                qlcnic_issue_cmd(adapter, cmd);
1519                                return;
1520                        }
1521                }
1522        }
1523
1524        cmd->rsp.arg[0] |= (0x9 << 25);
1525}
1526
1527void qlcnic_pf_set_interface_id_create_rx_ctx(struct qlcnic_adapter *adapter,
1528                                             u32 *int_id)
1529{
1530        u16 vpid;
1531
1532        vpid = qlcnic_sriov_pf_get_vport_handle(adapter,
1533                                                adapter->ahw->pci_func);
1534        *int_id |= vpid;
1535}
1536
1537void qlcnic_pf_set_interface_id_del_rx_ctx(struct qlcnic_adapter *adapter,
1538                                           u32 *int_id)
1539{
1540        u16 vpid;
1541
1542        vpid = qlcnic_sriov_pf_get_vport_handle(adapter,
1543                                                adapter->ahw->pci_func);
1544        *int_id |= vpid << 16;
1545}
1546
1547void qlcnic_pf_set_interface_id_create_tx_ctx(struct qlcnic_adapter *adapter,
1548                                              u32 *int_id)
1549{
1550        int vpid;
1551
1552        vpid = qlcnic_sriov_pf_get_vport_handle(adapter,
1553                                                adapter->ahw->pci_func);
1554        *int_id |= vpid << 16;
1555}
1556
1557void qlcnic_pf_set_interface_id_del_tx_ctx(struct qlcnic_adapter *adapter,
1558                                           u32 *int_id)
1559{
1560        u16 vpid;
1561
1562        vpid = qlcnic_sriov_pf_get_vport_handle(adapter,
1563                                                adapter->ahw->pci_func);
1564        *int_id |= vpid << 16;
1565}
1566
1567void qlcnic_pf_set_interface_id_promisc(struct qlcnic_adapter *adapter,
1568                                        u32 *int_id)
1569{
1570        u16 vpid;
1571
1572        vpid = qlcnic_sriov_pf_get_vport_handle(adapter,
1573                                                adapter->ahw->pci_func);
1574        *int_id |= (vpid << 16) | BIT_31;
1575}
1576
1577void qlcnic_pf_set_interface_id_ipaddr(struct qlcnic_adapter *adapter,
1578                                       u32 *int_id)
1579{
1580        u16 vpid;
1581
1582        vpid = qlcnic_sriov_pf_get_vport_handle(adapter,
1583                                                adapter->ahw->pci_func);
1584        *int_id |= (vpid << 16) | BIT_31;
1585}
1586
1587void qlcnic_pf_set_interface_id_macaddr(struct qlcnic_adapter *adapter,
1588                                        u32 *int_id)
1589{
1590        u16 vpid;
1591
1592        vpid = qlcnic_sriov_pf_get_vport_handle(adapter,
1593                                                adapter->ahw->pci_func);
1594        *int_id |= (vpid << 16) | BIT_31;
1595}
1596
1597static void qlcnic_sriov_del_rx_ctx(struct qlcnic_adapter *adapter,
1598                                    struct qlcnic_vf_info *vf)
1599{
1600        struct qlcnic_cmd_args cmd;
1601        int vpid;
1602
1603        if (!vf->rx_ctx_id)
1604                return;
1605
1606        if (qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_DESTROY_RX_CTX))
1607                return;
1608
1609        vpid = qlcnic_sriov_pf_get_vport_handle(adapter, vf->pci_func);
1610        if (vpid >= 0) {
1611                cmd.req.arg[1] = vf->rx_ctx_id | (vpid & 0xffff) << 16;
1612                if (qlcnic_issue_cmd(adapter, &cmd))
1613                        dev_err(&adapter->pdev->dev,
1614                                "Failed to delete Tx ctx in firmware for func 0x%x\n",
1615                                vf->pci_func);
1616                else
1617                        vf->rx_ctx_id = 0;
1618        }
1619
1620        qlcnic_free_mbx_args(&cmd);
1621}
1622
1623static void qlcnic_sriov_del_tx_ctx(struct qlcnic_adapter *adapter,
1624                                    struct qlcnic_vf_info *vf)
1625{
1626        struct qlcnic_cmd_args cmd;
1627        int vpid;
1628
1629        if (!vf->tx_ctx_id)
1630                return;
1631
1632        if (qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_DESTROY_TX_CTX))
1633                return;
1634
1635        vpid = qlcnic_sriov_pf_get_vport_handle(adapter, vf->pci_func);
1636        if (vpid >= 0) {
1637                cmd.req.arg[1] |= vf->tx_ctx_id | (vpid & 0xffff) << 16;
1638                if (qlcnic_issue_cmd(adapter, &cmd))
1639                        dev_err(&adapter->pdev->dev,
1640                                "Failed to delete Tx ctx in firmware for func 0x%x\n",
1641                                vf->pci_func);
1642                else
1643                        vf->tx_ctx_id = 0;
1644        }
1645
1646        qlcnic_free_mbx_args(&cmd);
1647}
1648
1649static int qlcnic_sriov_add_act_list_irqsave(struct qlcnic_sriov *sriov,
1650                                             struct qlcnic_vf_info *vf,
1651                                             struct qlcnic_bc_trans *trans)
1652{
1653        struct qlcnic_trans_list *t_list = &vf->rcv_act;
1654        unsigned long flag;
1655
1656        spin_lock_irqsave(&t_list->lock, flag);
1657
1658        __qlcnic_sriov_add_act_list(sriov, vf, trans);
1659
1660        spin_unlock_irqrestore(&t_list->lock, flag);
1661        return 0;
1662}
1663
1664static void __qlcnic_sriov_process_flr(struct qlcnic_vf_info *vf)
1665{
1666        struct qlcnic_adapter *adapter = vf->adapter;
1667
1668        qlcnic_sriov_cleanup_list(&vf->rcv_pend);
1669        cancel_work_sync(&vf->trans_work);
1670        qlcnic_sriov_cleanup_list(&vf->rcv_act);
1671
1672        if (test_bit(QLC_BC_VF_SOFT_FLR, &vf->state)) {
1673                qlcnic_sriov_del_tx_ctx(adapter, vf);
1674                qlcnic_sriov_del_rx_ctx(adapter, vf);
1675        }
1676
1677        qlcnic_sriov_pf_config_vport(adapter, 0, vf->pci_func);
1678
1679        clear_bit(QLC_BC_VF_FLR, &vf->state);
1680        if (test_bit(QLC_BC_VF_SOFT_FLR, &vf->state)) {
1681                qlcnic_sriov_add_act_list_irqsave(adapter->ahw->sriov, vf,
1682                                                  vf->flr_trans);
1683                clear_bit(QLC_BC_VF_SOFT_FLR, &vf->state);
1684                vf->flr_trans = NULL;
1685        }
1686}
1687
1688static void qlcnic_sriov_pf_process_flr(struct work_struct *work)
1689{
1690        struct qlcnic_vf_info *vf;
1691
1692        vf = container_of(work, struct qlcnic_vf_info, flr_work);
1693        __qlcnic_sriov_process_flr(vf);
1694        return;
1695}
1696
1697static void qlcnic_sriov_schedule_flr(struct qlcnic_sriov *sriov,
1698                                      struct qlcnic_vf_info *vf,
1699                                      work_func_t func)
1700{
1701        if (test_bit(__QLCNIC_RESETTING, &vf->adapter->state))
1702                return;
1703
1704        INIT_WORK(&vf->flr_work, func);
1705        queue_work(sriov->bc.bc_flr_wq, &vf->flr_work);
1706}
1707
1708static void qlcnic_sriov_handle_soft_flr(struct qlcnic_adapter *adapter,
1709                                         struct qlcnic_bc_trans *trans,
1710                                         struct qlcnic_vf_info *vf)
1711{
1712        struct qlcnic_sriov *sriov = adapter->ahw->sriov;
1713
1714        set_bit(QLC_BC_VF_FLR, &vf->state);
1715        clear_bit(QLC_BC_VF_STATE, &vf->state);
1716        set_bit(QLC_BC_VF_SOFT_FLR, &vf->state);
1717        vf->flr_trans = trans;
1718        qlcnic_sriov_schedule_flr(sriov, vf, qlcnic_sriov_pf_process_flr);
1719        netdev_info(adapter->netdev, "Software FLR for PCI func %d\n",
1720                    vf->pci_func);
1721}
1722
1723bool qlcnic_sriov_soft_flr_check(struct qlcnic_adapter *adapter,
1724                                 struct qlcnic_bc_trans *trans,
1725                                 struct qlcnic_vf_info *vf)
1726{
1727        struct qlcnic_bc_hdr *hdr = trans->req_hdr;
1728
1729        if ((hdr->cmd_op == QLCNIC_BC_CMD_CHANNEL_INIT) &&
1730            (hdr->op_type == QLC_BC_CMD) &&
1731             test_bit(QLC_BC_VF_STATE, &vf->state)) {
1732                qlcnic_sriov_handle_soft_flr(adapter, trans, vf);
1733                return true;
1734        }
1735
1736        return false;
1737}
1738
1739void qlcnic_sriov_pf_handle_flr(struct qlcnic_sriov *sriov,
1740                                struct qlcnic_vf_info *vf)
1741{
1742        struct net_device *dev = vf->adapter->netdev;
1743        struct qlcnic_vport *vp = vf->vp;
1744
1745        if (!test_and_clear_bit(QLC_BC_VF_STATE, &vf->state)) {
1746                clear_bit(QLC_BC_VF_FLR, &vf->state);
1747                return;
1748        }
1749
1750        if (test_and_set_bit(QLC_BC_VF_FLR, &vf->state)) {
1751                netdev_info(dev, "FLR for PCI func %d in progress\n",
1752                            vf->pci_func);
1753                return;
1754        }
1755
1756        if (vp->vlan_mode == QLC_GUEST_VLAN_MODE)
1757                memset(vf->sriov_vlans, 0,
1758                       sizeof(*vf->sriov_vlans) * sriov->num_allowed_vlans);
1759
1760        qlcnic_sriov_schedule_flr(sriov, vf, qlcnic_sriov_pf_process_flr);
1761        netdev_info(dev, "FLR received for PCI func %d\n", vf->pci_func);
1762}
1763
1764void qlcnic_sriov_pf_reset(struct qlcnic_adapter *adapter)
1765{
1766        struct qlcnic_hardware_context *ahw = adapter->ahw;
1767        struct qlcnic_sriov *sriov = ahw->sriov;
1768        struct qlcnic_vf_info *vf;
1769        u16 num_vfs = sriov->num_vfs;
1770        int i;
1771
1772        for (i = 0; i < num_vfs; i++) {
1773                vf = &sriov->vf_info[i];
1774                vf->rx_ctx_id = 0;
1775                vf->tx_ctx_id = 0;
1776                cancel_work_sync(&vf->flr_work);
1777                __qlcnic_sriov_process_flr(vf);
1778                clear_bit(QLC_BC_VF_STATE, &vf->state);
1779        }
1780
1781        qlcnic_sriov_pf_reset_vport_handle(adapter, ahw->pci_func);
1782        QLCWRX(ahw, QLCNIC_MBX_INTR_ENBL, (ahw->num_msix - 1) << 8);
1783}
1784
1785int qlcnic_sriov_pf_reinit(struct qlcnic_adapter *adapter)
1786{
1787        struct qlcnic_hardware_context *ahw = adapter->ahw;
1788        int err;
1789
1790        if (!qlcnic_sriov_enable_check(adapter))
1791                return 0;
1792
1793        ahw->op_mode = QLCNIC_SRIOV_PF_FUNC;
1794
1795        err = qlcnic_sriov_pf_init(adapter);
1796        if (err)
1797                return err;
1798
1799        dev_info(&adapter->pdev->dev, "%s: op_mode %d\n",
1800                 __func__, ahw->op_mode);
1801        return err;
1802}
1803
1804int qlcnic_sriov_set_vf_mac(struct net_device *netdev, int vf, u8 *mac)
1805{
1806        struct qlcnic_adapter *adapter = netdev_priv(netdev);
1807        struct qlcnic_sriov *sriov = adapter->ahw->sriov;
1808        int i, num_vfs;
1809        struct qlcnic_vf_info *vf_info;
1810        u8 *curr_mac;
1811
1812        if (!qlcnic_sriov_pf_check(adapter))
1813                return -EOPNOTSUPP;
1814
1815        num_vfs = sriov->num_vfs;
1816
1817        if (!is_valid_ether_addr(mac) || vf >= num_vfs)
1818                return -EINVAL;
1819
1820        if (ether_addr_equal(adapter->mac_addr, mac)) {
1821                netdev_err(netdev, "MAC address is already in use by the PF\n");
1822                return -EINVAL;
1823        }
1824
1825        for (i = 0; i < num_vfs; i++) {
1826                vf_info = &sriov->vf_info[i];
1827                if (ether_addr_equal(vf_info->vp->mac, mac)) {
1828                        netdev_err(netdev,
1829                                   "MAC address is already in use by VF %d\n",
1830                                   i);
1831                        return -EINVAL;
1832                }
1833        }
1834
1835        vf_info = &sriov->vf_info[vf];
1836        curr_mac = vf_info->vp->mac;
1837
1838        if (test_bit(QLC_BC_VF_STATE, &vf_info->state)) {
1839                netdev_err(netdev,
1840                           "MAC address change failed for VF %d, as VF driver is loaded. Please unload VF driver and retry the operation\n",
1841                           vf);
1842                return -EOPNOTSUPP;
1843        }
1844
1845        memcpy(curr_mac, mac, netdev->addr_len);
1846        netdev_info(netdev, "MAC Address %pM  is configured for VF %d\n",
1847                    mac, vf);
1848        return 0;
1849}
1850
1851int qlcnic_sriov_set_vf_tx_rate(struct net_device *netdev, int vf,
1852                                int min_tx_rate, int max_tx_rate)
1853{
1854        struct qlcnic_adapter *adapter = netdev_priv(netdev);
1855        struct qlcnic_sriov *sriov = adapter->ahw->sriov;
1856        struct qlcnic_vf_info *vf_info;
1857        struct qlcnic_info nic_info;
1858        struct qlcnic_vport *vp;
1859        u16 vpid;
1860
1861        if (!qlcnic_sriov_pf_check(adapter))
1862                return -EOPNOTSUPP;
1863
1864        if (vf >= sriov->num_vfs)
1865                return -EINVAL;
1866
1867        vf_info = &sriov->vf_info[vf];
1868        vp = vf_info->vp;
1869        vpid = vp->handle;
1870
1871        if (!min_tx_rate)
1872                min_tx_rate = QLC_VF_MIN_TX_RATE;
1873
1874        if (max_tx_rate &&
1875            (max_tx_rate >= 10000 || max_tx_rate < min_tx_rate)) {
1876                netdev_err(netdev,
1877                           "Invalid max Tx rate, allowed range is [%d - %d]",
1878                           min_tx_rate, QLC_VF_MAX_TX_RATE);
1879                return -EINVAL;
1880        }
1881
1882        if (!max_tx_rate)
1883                max_tx_rate = 10000;
1884
1885        if (min_tx_rate &&
1886            (min_tx_rate > max_tx_rate || min_tx_rate < QLC_VF_MIN_TX_RATE)) {
1887                netdev_err(netdev,
1888                           "Invalid min Tx rate, allowed range is [%d - %d]",
1889                           QLC_VF_MIN_TX_RATE, max_tx_rate);
1890                return -EINVAL;
1891        }
1892
1893        if (test_bit(QLC_BC_VF_STATE, &vf_info->state)) {
1894                if (qlcnic_sriov_get_vf_vport_info(adapter, &nic_info, vpid))
1895                        return -EIO;
1896
1897                nic_info.max_tx_bw = max_tx_rate / 100;
1898                nic_info.min_tx_bw = min_tx_rate / 100;
1899                nic_info.bit_offsets = BIT_0;
1900
1901                if (qlcnic_sriov_pf_set_vport_info(adapter, &nic_info, vpid))
1902                        return -EIO;
1903        }
1904
1905        vp->max_tx_bw = max_tx_rate / 100;
1906        netdev_info(netdev,
1907                    "Setting Max Tx rate %d (Mbps), %d %% of PF bandwidth, for VF %d\n",
1908                    max_tx_rate, vp->max_tx_bw, vf);
1909        vp->min_tx_bw = min_tx_rate / 100;
1910        netdev_info(netdev,
1911                    "Setting Min Tx rate %d (Mbps), %d %% of PF bandwidth, for VF %d\n",
1912                    min_tx_rate, vp->min_tx_bw, vf);
1913        return 0;
1914}
1915
1916int qlcnic_sriov_set_vf_vlan(struct net_device *netdev, int vf,
1917                             u16 vlan, u8 qos)
1918{
1919        struct qlcnic_adapter *adapter = netdev_priv(netdev);
1920        struct qlcnic_sriov *sriov = adapter->ahw->sriov;
1921        struct qlcnic_vf_info *vf_info;
1922        struct qlcnic_vport *vp;
1923
1924        if (!qlcnic_sriov_pf_check(adapter))
1925                return -EOPNOTSUPP;
1926
1927        if (vf >= sriov->num_vfs || qos > 7)
1928                return -EINVAL;
1929
1930        if (vlan > MAX_VLAN_ID) {
1931                netdev_err(netdev,
1932                           "Invalid VLAN ID, allowed range is [0 - %d]\n",
1933                           MAX_VLAN_ID);
1934                return -EINVAL;
1935        }
1936
1937        vf_info = &sriov->vf_info[vf];
1938        vp = vf_info->vp;
1939        if (test_bit(QLC_BC_VF_STATE, &vf_info->state)) {
1940                netdev_err(netdev,
1941                           "VLAN change failed for VF %d, as VF driver is loaded. Please unload VF driver and retry the operation\n",
1942                           vf);
1943                return -EOPNOTSUPP;
1944        }
1945
1946        memset(vf_info->sriov_vlans, 0,
1947               sizeof(*vf_info->sriov_vlans) * sriov->num_allowed_vlans);
1948
1949        switch (vlan) {
1950        case 4095:
1951                vp->vlan_mode = QLC_GUEST_VLAN_MODE;
1952                break;
1953        case 0:
1954                vp->vlan_mode = QLC_NO_VLAN_MODE;
1955                vp->qos = 0;
1956                break;
1957        default:
1958                vp->vlan_mode = QLC_PVID_MODE;
1959                qlcnic_sriov_add_vlan_id(sriov, vf_info, vlan);
1960                vp->qos = qos;
1961                vp->pvid = vlan;
1962        }
1963
1964        netdev_info(netdev, "Setting VLAN %d, QoS %d, for VF %d\n",
1965                    vlan, qos, vf);
1966        return 0;
1967}
1968
1969static __u32 qlcnic_sriov_get_vf_vlan(struct qlcnic_adapter *adapter,
1970                                      struct qlcnic_vport *vp, int vf)
1971{
1972        __u32 vlan = 0;
1973
1974        switch (vp->vlan_mode) {
1975        case QLC_PVID_MODE:
1976                vlan = vp->pvid;
1977                break;
1978        case QLC_GUEST_VLAN_MODE:
1979                vlan = MAX_VLAN_ID;
1980                break;
1981        case QLC_NO_VLAN_MODE:
1982                vlan = 0;
1983                break;
1984        default:
1985                netdev_info(adapter->netdev, "Invalid VLAN mode = %d for VF %d\n",
1986                            vp->vlan_mode, vf);
1987        }
1988
1989        return vlan;
1990}
1991
1992int qlcnic_sriov_get_vf_config(struct net_device *netdev,
1993                               int vf, struct ifla_vf_info *ivi)
1994{
1995        struct qlcnic_adapter *adapter = netdev_priv(netdev);
1996        struct qlcnic_sriov *sriov = adapter->ahw->sriov;
1997        struct qlcnic_vport *vp;
1998
1999        if (!qlcnic_sriov_pf_check(adapter))
2000                return -EOPNOTSUPP;
2001
2002        if (vf >= sriov->num_vfs)
2003                return -EINVAL;
2004
2005        vp = sriov->vf_info[vf].vp;
2006        memcpy(&ivi->mac, vp->mac, ETH_ALEN);
2007        ivi->vlan = qlcnic_sriov_get_vf_vlan(adapter, vp, vf);
2008        ivi->qos = vp->qos;
2009        ivi->spoofchk = vp->spoofchk;
2010        if (vp->max_tx_bw == MAX_BW)
2011                ivi->max_tx_rate = 0;
2012        else
2013                ivi->max_tx_rate = vp->max_tx_bw * 100;
2014        if (vp->min_tx_bw == MIN_BW)
2015                ivi->min_tx_rate = 0;
2016        else
2017                ivi->min_tx_rate = vp->min_tx_bw * 100;
2018
2019        ivi->vf = vf;
2020        return 0;
2021}
2022
2023int qlcnic_sriov_set_vf_spoofchk(struct net_device *netdev, int vf, bool chk)
2024{
2025        struct qlcnic_adapter *adapter = netdev_priv(netdev);
2026        struct qlcnic_sriov *sriov = adapter->ahw->sriov;
2027        struct qlcnic_vf_info *vf_info;
2028        struct qlcnic_vport *vp;
2029
2030        if (!qlcnic_sriov_pf_check(adapter))
2031                return -EOPNOTSUPP;
2032
2033        if (vf >= sriov->num_vfs)
2034                return -EINVAL;
2035
2036        vf_info = &sriov->vf_info[vf];
2037        vp = vf_info->vp;
2038        if (test_bit(QLC_BC_VF_STATE, &vf_info->state)) {
2039                netdev_err(netdev,
2040                           "Spoof check change failed for VF %d, as VF driver is loaded. Please unload VF driver and retry the operation\n",
2041                           vf);
2042                return -EOPNOTSUPP;
2043        }
2044
2045        vp->spoofchk = chk;
2046        return 0;
2047}
2048