root/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. qlcnic_sriov_pf_set_vport_info
  2. qlcnic_sriov_pf_cal_res_limit
  3. qlcnic_sriov_pf_set_ff_max_res
  4. qlcnic_sriov_set_vf_max_vlan
  5. qlcnic_sriov_get_pf_info
  6. qlcnic_sriov_pf_reset_vport_handle
  7. qlcnic_sriov_pf_set_vport_handle
  8. qlcnic_sriov_pf_get_vport_handle
  9. qlcnic_sriov_pf_config_vport
  10. qlcnic_sriov_pf_cfg_vlan_filtering
  11. qlcnic_sriov_pf_cfg_flood
  12. qlcnic_sriov_pf_cfg_eswitch
  13. qlcnic_sriov_pf_del_flr_queue
  14. qlcnic_sriov_pf_create_flr_queue
  15. qlcnic_sriov_pf_cleanup
  16. qlcnic_sriov_pf_disable
  17. qlcnic_pci_sriov_disable
  18. qlcnic_sriov_pf_init
  19. qlcnic_sriov_pf_enable
  20. __qlcnic_pci_sriov_enable
  21. qlcnic_pci_sriov_enable
  22. qlcnic_pci_sriov_configure
  23. qlcnic_sriov_set_vf_acl
  24. qlcnic_sriov_set_vf_vport_info
  25. qlcnic_sriov_pf_channel_cfg_cmd
  26. qlcnic_sriov_cfg_vf_def_mac
  27. qlcnic_sriov_validate_create_rx_ctx
  28. qlcnic_83xx_cfg_default_mac_vlan
  29. qlcnic_sriov_pf_create_rx_ctx_cmd
  30. qlcnic_sriov_pf_mac_address_cmd
  31. qlcnic_sriov_validate_create_tx_ctx
  32. qlcnic_sriov_pf_create_tx_ctx_cmd
  33. qlcnic_sriov_validate_del_rx_ctx
  34. qlcnic_sriov_pf_del_rx_ctx_cmd
  35. qlcnic_sriov_validate_del_tx_ctx
  36. qlcnic_sriov_pf_del_tx_ctx_cmd
  37. qlcnic_sriov_validate_cfg_lro
  38. qlcnic_sriov_pf_cfg_lro_cmd
  39. qlcnic_sriov_pf_cfg_ip_cmd
  40. qlcnic_sriov_validate_cfg_intrpt
  41. qlcnic_sriov_pf_cfg_intrpt_cmd
  42. qlcnic_sriov_validate_mtu
  43. qlcnic_sriov_pf_set_mtu_cmd
  44. qlcnic_sriov_validate_get_nic_info
  45. qlcnic_sriov_pf_get_nic_info_cmd
  46. qlcnic_sriov_validate_cfg_rss
  47. qlcnic_sriov_pf_cfg_rss_cmd
  48. qlcnic_sriov_validate_cfg_intrcoal
  49. qlcnic_sriov_pf_cfg_intrcoal_cmd
  50. qlcnic_sriov_validate_cfg_macvlan
  51. qlcnic_sriov_pf_cfg_macvlan_cmd
  52. qlcnic_sriov_validate_linkevent
  53. qlcnic_sriov_pf_linkevent_cmd
  54. qlcnic_sriov_pf_cfg_promisc_cmd
  55. qlcnic_sriov_pf_get_acl_cmd
  56. qlcnic_sriov_pf_del_guest_vlan
  57. qlcnic_sriov_pf_add_guest_vlan
  58. qlcnic_sriov_pf_cfg_guest_vlan_cmd
  59. qlcnic_sriov_pf_process_bc_cmd
  60. qlcnic_pf_set_interface_id_create_rx_ctx
  61. qlcnic_pf_set_interface_id_del_rx_ctx
  62. qlcnic_pf_set_interface_id_create_tx_ctx
  63. qlcnic_pf_set_interface_id_del_tx_ctx
  64. qlcnic_pf_set_interface_id_promisc
  65. qlcnic_pf_set_interface_id_ipaddr
  66. qlcnic_pf_set_interface_id_macaddr
  67. qlcnic_sriov_del_rx_ctx
  68. qlcnic_sriov_del_tx_ctx
  69. qlcnic_sriov_add_act_list_irqsave
  70. __qlcnic_sriov_process_flr
  71. qlcnic_sriov_pf_process_flr
  72. qlcnic_sriov_schedule_flr
  73. qlcnic_sriov_handle_soft_flr
  74. qlcnic_sriov_soft_flr_check
  75. qlcnic_sriov_pf_handle_flr
  76. qlcnic_sriov_pf_reset
  77. qlcnic_sriov_pf_reinit
  78. qlcnic_sriov_set_vf_mac
  79. qlcnic_sriov_set_vf_tx_rate
  80. qlcnic_sriov_set_vf_vlan
  81. qlcnic_sriov_get_vf_vlan
  82. qlcnic_sriov_get_vf_config
  83. qlcnic_sriov_set_vf_spoofchk

   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 
  22 static int qlcnic_sriov_pf_get_vport_handle(struct qlcnic_adapter *, u8);
  23 
  24 struct qlcnic_sriov_cmd_handler {
  25         int (*fn) (struct qlcnic_bc_trans *, struct qlcnic_cmd_args *);
  26 };
  27 
  28 struct qlcnic_sriov_fw_cmd_handler {
  29         u32 cmd;
  30         int (*fn) (struct qlcnic_bc_trans *, struct qlcnic_cmd_args *);
  31 };
  32 
  33 static 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 
  68 static 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 
 137 static 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 
 156 static 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 
 175 static 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 
 228 out:
 229         qlcnic_free_mbx_args(&cmd);
 230         return err;
 231 }
 232 
 233 static 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 
 251 static 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 
 269 static 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 
 289 static 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 
 325 out:
 326         qlcnic_free_mbx_args(&cmd);
 327         return ret;
 328 }
 329 
 330 static 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 */
 360 static 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 
 381 static 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 
 407 static 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 
 419 static 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 
 434 void 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 
 451 void 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 
 465 static 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 
 504 static 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 
 555 delete_vport:
 556         qlcnic_sriov_pf_config_vport(adapter, 0, func);
 557 
 558 disable_eswitch:
 559         qlcnic_sriov_pf_cfg_eswitch(adapter, func, 0);
 560 
 561 disable_vlan_filtering:
 562         qlcnic_sriov_pf_cfg_vlan_filtering(adapter, 0);
 563 
 564         return err;
 565 }
 566 
 567 static 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 
 581 static 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 
 605 del_flr_queue:
 606         qlcnic_sriov_pf_del_flr_queue(adapter);
 607 
 608 sriov_cleanup:
 609         __qlcnic_sriov_cleanup(adapter);
 610 
 611 clear_op_mode:
 612         clear_bit(__QLCNIC_SRIOV_ENABLE, &adapter->state);
 613         adapter->ahw->op_mode = QLCNIC_MGMT_FUNC;
 614         return err;
 615 }
 616 
 617 static 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 
 653 error:
 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 
 666 int 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 
 683 static 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 
 722 static 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 
 739 static 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 
 782 err_out:
 783         cmd->rsp.arg[0] |= (2 << 25);
 784         return err;
 785 }
 786 
 787 static 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 
 839 free_args:
 840         qlcnic_free_mbx_args(cmd);
 841 free_cmd:
 842         kfree(cmd);
 843         return err;
 844 }
 845 
 846 static 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 
 854 static 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 
 883 static 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 
 911 static 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 
 935 static 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 
 943 static 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 
 969 static 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 
 981 static 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 
1004 static 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 
1016 static 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 
1038 static 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 
1047 static 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 
1064 static 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 
1078 static 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 
1093 static 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 
1109 static 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 
1122 static 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 
1138 static 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 
1151 static 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 
1168 static 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 
1177 static 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 
1193 static 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 
1226 err_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 
1236 static 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 
1253 static 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 
1278 static 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 
1295 static 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 
1304 static 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 
1321 static 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 
1334 static 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 
1367 static 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 
1392 static 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 
1430 static 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 
1455 static 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 
1463 static 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 
1470 static 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 
1488 void 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 
1524 void 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 
1534 void 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 
1544 void 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 
1554 void 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 
1564 void 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 
1574 void 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 
1584 void 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 
1594 static 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 
1620 static 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 
1646 static 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 
1661 static 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 
1685 static 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 
1694 static 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 
1705 static 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 
1720 bool 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 
1736 void 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 
1761 void 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 
1782 int 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 
1801 int 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 
1848 int 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 
1913 int 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 
1969 static __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 
1992 int 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 
2023 int 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 }

/* [<][>][^][v][top][bottom][index][help] */