Linux-libre 5.3.12-gnu
[librecmc/linux-libre.git] / drivers / net / ethernet / qlogic / qlcnic / qlcnic_sriov_pf.c
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 }