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