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