2 * QLogic qlcnic NIC Driver
3 * Copyright (c) 2009-2013 QLogic Corporation
5 * See LICENSE.qlcnic for copyright and licensing details.
8 #include "qlcnic_sriov.h"
10 #include <linux/types.h>
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 #define QLC_SRIOV_ALLOW_VLAN0 BIT_19
22 static int qlcnic_sriov_pf_get_vport_handle(struct qlcnic_adapter *, u8);
24 struct qlcnic_sriov_cmd_handler {
25 int (*fn) (struct qlcnic_bc_trans *, struct qlcnic_cmd_args *);
28 struct qlcnic_sriov_fw_cmd_handler {
30 int (*fn) (struct qlcnic_bc_trans *, struct qlcnic_cmd_args *);
33 static int qlcnic_sriov_pf_set_vport_info(struct qlcnic_adapter *adapter,
34 struct qlcnic_info *npar_info,
37 struct qlcnic_cmd_args cmd;
40 if (qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_SET_NIC_INFO))
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;
59 err = qlcnic_issue_cmd(adapter, &cmd);
61 dev_err(&adapter->pdev->dev,
62 "Failed to set vport info, err=%d\n", err);
64 qlcnic_free_mbx_args(&cmd);
68 static int qlcnic_sriov_pf_cal_res_limit(struct qlcnic_adapter *adapter,
69 struct qlcnic_info *info, u16 func)
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;
78 vpid = qlcnic_sriov_pf_get_vport_handle(adapter, func);
82 num_vfs = sriov->num_vfs;
84 info->bit_offsets = 0xffff;
85 info->max_tx_ques = res->num_tx_queues / max;
87 if (qlcnic_83xx_pf_check(adapter))
90 info->max_rx_mcast_mac_filters = res->num_rx_mcast_mac_filters;
92 if (adapter->ahw->pci_func == func) {
94 info->max_tx_bw = MAX_BW;
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;
104 info->max_tx_ques = res->num_tx_queues - sriov->num_vfs;
106 id = qlcnic_sriov_func_to_index(adapter, func);
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;
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;
118 info->max_tx_ques = QLCNIC_SINGLE_RING;
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;
130 ret = qlcnic_sriov_pf_set_vport_info(adapter, info, vpid);
137 static void qlcnic_sriov_pf_set_ff_max_res(struct qlcnic_adapter *adapter,
138 struct qlcnic_info *info)
140 struct qlcnic_resources *ff_max = &adapter->ahw->sriov->ff_max;
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;
156 static void qlcnic_sriov_set_vf_max_vlan(struct qlcnic_adapter *adapter,
157 struct qlcnic_info *npar_info)
159 struct qlcnic_sriov *sriov = adapter->ahw->sriov;
162 temp = npar_info->max_rx_mcast_mac_filters;
163 total_fn = sriov->num_vfs + 1;
165 temp = temp / (QLCNIC_SRIOV_VF_MAX_MAC * total_fn);
166 sriov->num_allowed_vlans = temp - 1;
168 if (qlcnic_83xx_pf_check(adapter))
169 sriov->num_allowed_vlans = 1;
171 netdev_info(adapter->netdev, "Max Guest VLANs supported per VF = %d\n",
172 sriov->num_allowed_vlans);
175 static int qlcnic_sriov_get_pf_info(struct qlcnic_adapter *adapter,
176 struct qlcnic_info *npar_info)
179 struct qlcnic_cmd_args cmd;
181 if (qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_GET_NIC_INFO))
184 cmd.req.arg[1] = 0x2;
185 err = qlcnic_issue_cmd(adapter, &cmd);
187 dev_err(&adapter->pdev->dev,
188 "Failed to get PF info, err=%d\n", err);
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]);
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);
229 qlcnic_free_mbx_args(&cmd);
233 static void qlcnic_sriov_pf_reset_vport_handle(struct qlcnic_adapter *adapter,
236 struct qlcnic_sriov *sriov = adapter->ahw->sriov;
237 struct qlcnic_vport *vp;
240 if (adapter->ahw->pci_func == func) {
241 sriov->vp_handle = 0;
243 index = qlcnic_sriov_func_to_index(adapter, func);
246 vp = sriov->vf_info[index].vp;
251 static void qlcnic_sriov_pf_set_vport_handle(struct qlcnic_adapter *adapter,
252 u16 vport_handle, u8 func)
254 struct qlcnic_sriov *sriov = adapter->ahw->sriov;
255 struct qlcnic_vport *vp;
258 if (adapter->ahw->pci_func == func) {
259 sriov->vp_handle = vport_handle;
261 index = qlcnic_sriov_func_to_index(adapter, func);
264 vp = sriov->vf_info[index].vp;
265 vp->handle = vport_handle;
269 static int qlcnic_sriov_pf_get_vport_handle(struct qlcnic_adapter *adapter,
272 struct qlcnic_sriov *sriov = adapter->ahw->sriov;
273 struct qlcnic_vf_info *vf_info;
276 if (adapter->ahw->pci_func == func) {
277 return sriov->vp_handle;
279 index = qlcnic_sriov_func_to_index(adapter, func);
281 vf_info = &sriov->vf_info[index];
282 return vf_info->vp->handle;
289 static int qlcnic_sriov_pf_config_vport(struct qlcnic_adapter *adapter,
292 struct qlcnic_cmd_args cmd;
296 if (qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_CONFIG_VPORT))
300 cmd.req.arg[3] = func << 8;
302 vpid = qlcnic_sriov_pf_get_vport_handle(adapter, func);
307 cmd.req.arg[3] = ((vpid & 0xffff) << 8) | 1;
310 ret = qlcnic_issue_cmd(adapter, &cmd);
312 dev_err(&adapter->pdev->dev,
313 "Failed %s vport, err %d for func 0x%x\n",
314 (flag ? "enable" : "disable"), ret, func);
319 vpid = cmd.rsp.arg[2] & 0xffff;
320 qlcnic_sriov_pf_set_vport_handle(adapter, vpid, func);
322 qlcnic_sriov_pf_reset_vport_handle(adapter, func);
326 qlcnic_free_mbx_args(&cmd);
330 static int qlcnic_sriov_pf_cfg_vlan_filtering(struct qlcnic_adapter *adapter,
333 struct qlcnic_cmd_args cmd;
336 err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_SET_NIC_INFO);
340 cmd.req.arg[1] = 0x4;
342 cmd.req.arg[1] |= BIT_16;
343 if (qlcnic_84xx_check(adapter))
344 cmd.req.arg[1] |= QLC_SRIOV_ALLOW_VLAN0;
347 err = qlcnic_issue_cmd(adapter, &cmd);
349 dev_err(&adapter->pdev->dev,
350 "Failed to configure VLAN filtering, err=%d\n", err);
352 qlcnic_free_mbx_args(&cmd);
356 /* On configuring VF flood bit, PFD will receive traffic from all VFs */
357 static int qlcnic_sriov_pf_cfg_flood(struct qlcnic_adapter *adapter)
359 struct qlcnic_cmd_args cmd;
362 err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_SET_NIC_INFO);
366 cmd.req.arg[1] = QLC_FLOOD_MODE | QLC_VF_FLOOD_BIT;
368 err = qlcnic_issue_cmd(adapter, &cmd);
370 dev_err(&adapter->pdev->dev,
371 "Failed to configure VF Flood bit on PF, err=%d\n",
374 qlcnic_free_mbx_args(&cmd);
378 static int qlcnic_sriov_pf_cfg_eswitch(struct qlcnic_adapter *adapter,
381 struct qlcnic_cmd_args cmd;
384 if (qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_TOGGLE_ESWITCH))
387 cmd.req.arg[0] |= (3 << 29);
388 cmd.req.arg[1] = ((func & 0xf) << 2) | BIT_6 | BIT_1;
390 cmd.req.arg[1] |= BIT_0;
392 err = qlcnic_issue_cmd(adapter, &cmd);
394 if (err != QLCNIC_RCODE_SUCCESS) {
395 dev_err(&adapter->pdev->dev,
396 "Failed to enable sriov eswitch%d\n", err);
400 qlcnic_free_mbx_args(&cmd);
404 static void qlcnic_sriov_pf_del_flr_queue(struct qlcnic_adapter *adapter)
406 struct qlcnic_sriov *sriov = adapter->ahw->sriov;
407 struct qlcnic_back_channel *bc = &sriov->bc;
410 for (i = 0; i < sriov->num_vfs; i++)
411 cancel_work_sync(&sriov->vf_info[i].flr_work);
413 destroy_workqueue(bc->bc_flr_wq);
416 static int qlcnic_sriov_pf_create_flr_queue(struct qlcnic_adapter *adapter)
418 struct qlcnic_back_channel *bc = &adapter->ahw->sriov->bc;
419 struct workqueue_struct *wq;
421 wq = create_singlethread_workqueue("qlcnic-flr");
423 dev_err(&adapter->pdev->dev, "Cannot create FLR workqueue\n");
431 void qlcnic_sriov_pf_cleanup(struct qlcnic_adapter *adapter)
433 u8 func = adapter->ahw->pci_func;
435 if (!qlcnic_sriov_enable_check(adapter))
438 qlcnic_sriov_pf_del_flr_queue(adapter);
439 qlcnic_sriov_cfg_bc_intr(adapter, 0);
440 qlcnic_sriov_pf_config_vport(adapter, 0, func);
441 qlcnic_sriov_pf_cfg_eswitch(adapter, func, 0);
442 qlcnic_sriov_pf_cfg_vlan_filtering(adapter, 0);
443 __qlcnic_sriov_cleanup(adapter);
444 adapter->ahw->op_mode = QLCNIC_MGMT_FUNC;
445 clear_bit(__QLCNIC_SRIOV_ENABLE, &adapter->state);
448 void qlcnic_sriov_pf_disable(struct qlcnic_adapter *adapter)
450 if (!qlcnic_sriov_pf_check(adapter))
453 if (!qlcnic_sriov_enable_check(adapter))
456 pci_disable_sriov(adapter->pdev);
457 netdev_info(adapter->netdev,
458 "SR-IOV is disabled successfully on port %d\n",
462 static int qlcnic_pci_sriov_disable(struct qlcnic_adapter *adapter)
464 struct net_device *netdev = adapter->netdev;
467 if (netif_running(netdev))
468 __qlcnic_down(adapter, netdev);
470 qlcnic_sriov_pf_disable(adapter);
472 qlcnic_sriov_free_vlans(adapter);
474 qlcnic_sriov_pf_cleanup(adapter);
476 /* After disabling SRIOV re-init the driver in default mode
477 configure opmode based on op_mode of function
479 if (qlcnic_83xx_configure_opmode(adapter)) {
484 if (netif_running(netdev))
485 __qlcnic_up(adapter, netdev);
491 static int qlcnic_sriov_pf_init(struct qlcnic_adapter *adapter)
493 struct qlcnic_hardware_context *ahw = adapter->ahw;
494 struct qlcnic_info nic_info, pf_info, vp_info;
496 u8 func = ahw->pci_func;
498 if (!qlcnic_sriov_enable_check(adapter))
501 err = qlcnic_sriov_pf_cfg_vlan_filtering(adapter, 1);
505 if (qlcnic_84xx_check(adapter)) {
506 err = qlcnic_sriov_pf_cfg_flood(adapter);
508 goto disable_vlan_filtering;
511 err = qlcnic_sriov_pf_cfg_eswitch(adapter, func, 1);
513 goto disable_vlan_filtering;
515 err = qlcnic_sriov_pf_config_vport(adapter, 1, func);
517 goto disable_eswitch;
519 err = qlcnic_sriov_get_pf_info(adapter, &pf_info);
523 err = qlcnic_get_nic_info(adapter, &nic_info, func);
527 err = qlcnic_sriov_pf_cal_res_limit(adapter, &vp_info, func);
531 err = qlcnic_sriov_cfg_bc_intr(adapter, 1);
535 ahw->physical_port = (u8) nic_info.phys_port;
536 ahw->switch_mode = nic_info.switch_mode;
537 ahw->max_mtu = nic_info.max_mtu;
538 ahw->capabilities = nic_info.capabilities;
539 ahw->nic_mode = QLC_83XX_SRIOV_MODE;
543 qlcnic_sriov_pf_config_vport(adapter, 0, func);
546 qlcnic_sriov_pf_cfg_eswitch(adapter, func, 0);
548 disable_vlan_filtering:
549 qlcnic_sriov_pf_cfg_vlan_filtering(adapter, 0);
554 static int qlcnic_sriov_pf_enable(struct qlcnic_adapter *adapter, int num_vfs)
558 if (!qlcnic_sriov_enable_check(adapter))
561 err = pci_enable_sriov(adapter->pdev, num_vfs);
563 qlcnic_sriov_pf_cleanup(adapter);
568 static int __qlcnic_pci_sriov_enable(struct qlcnic_adapter *adapter,
573 set_bit(__QLCNIC_SRIOV_ENABLE, &adapter->state);
574 adapter->ahw->op_mode = QLCNIC_SRIOV_PF_FUNC;
576 err = qlcnic_sriov_init(adapter, num_vfs);
580 err = qlcnic_sriov_pf_create_flr_queue(adapter);
584 err = qlcnic_sriov_pf_init(adapter);
588 qlcnic_sriov_alloc_vlans(adapter);
590 err = qlcnic_sriov_pf_enable(adapter, num_vfs);
594 qlcnic_sriov_pf_del_flr_queue(adapter);
597 __qlcnic_sriov_cleanup(adapter);
600 clear_bit(__QLCNIC_SRIOV_ENABLE, &adapter->state);
601 adapter->ahw->op_mode = QLCNIC_MGMT_FUNC;
605 static int qlcnic_pci_sriov_enable(struct qlcnic_adapter *adapter, int num_vfs)
607 struct net_device *netdev = adapter->netdev;
610 if (!(adapter->flags & QLCNIC_MSIX_ENABLED)) {
612 "SR-IOV cannot be enabled, when legacy interrupts are enabled\n");
617 if (netif_running(netdev))
618 __qlcnic_down(adapter, netdev);
620 err = __qlcnic_pci_sriov_enable(adapter, num_vfs);
622 netdev_info(netdev, "Failed to enable SR-IOV on port %d\n",
626 if (qlcnic_83xx_configure_opmode(adapter))
630 "SR-IOV is enabled successfully on port %d\n",
632 /* Return number of vfs enabled */
635 if (netif_running(netdev))
636 __qlcnic_up(adapter, netdev);
643 int qlcnic_pci_sriov_configure(struct pci_dev *dev, int num_vfs)
645 struct qlcnic_adapter *adapter = pci_get_drvdata(dev);
648 if (test_and_set_bit(__QLCNIC_RESETTING, &adapter->state))
652 err = qlcnic_pci_sriov_disable(adapter);
654 err = qlcnic_pci_sriov_enable(adapter, num_vfs);
656 clear_bit(__QLCNIC_RESETTING, &adapter->state);
660 static int qlcnic_sriov_set_vf_acl(struct qlcnic_adapter *adapter, u8 func)
662 struct qlcnic_cmd_args cmd;
663 struct qlcnic_vport *vp;
667 id = qlcnic_sriov_func_to_index(adapter, func);
671 vp = adapter->ahw->sriov->vf_info[id].vp;
672 err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_SET_NIC_INFO);
676 cmd.req.arg[1] = 0x3 | func << 16;
677 if (vp->spoofchk == true) {
679 cmd.req.arg[2] |= BIT_1 | BIT_3 | BIT_8;
680 cmd.req.arg[4] = mac[5] | mac[4] << 8 | mac[3] << 16 |
682 cmd.req.arg[5] = mac[1] | mac[0] << 8;
685 if (vp->vlan_mode == QLC_PVID_MODE) {
686 cmd.req.arg[2] |= BIT_6;
687 cmd.req.arg[3] |= vp->pvid << 8;
690 err = qlcnic_issue_cmd(adapter, &cmd);
692 dev_err(&adapter->pdev->dev, "Failed to set ACL, err=%d\n",
695 qlcnic_free_mbx_args(&cmd);
699 static int qlcnic_sriov_set_vf_vport_info(struct qlcnic_adapter *adapter,
702 struct qlcnic_info defvp_info;
705 err = qlcnic_sriov_pf_cal_res_limit(adapter, &defvp_info, func);
709 err = qlcnic_sriov_set_vf_acl(adapter, func);
716 static int qlcnic_sriov_pf_channel_cfg_cmd(struct qlcnic_bc_trans *trans,
717 struct qlcnic_cmd_args *cmd)
719 struct qlcnic_vf_info *vf = trans->vf;
720 struct qlcnic_vport *vp = vf->vp;
721 struct qlcnic_adapter *adapter;
722 struct qlcnic_sriov *sriov;
723 u16 func = vf->pci_func;
727 adapter = vf->adapter;
728 sriov = adapter->ahw->sriov;
730 if (trans->req_hdr->cmd_op == QLCNIC_BC_CMD_CHANNEL_INIT) {
731 err = qlcnic_sriov_pf_config_vport(adapter, 1, func);
733 err = qlcnic_sriov_set_vf_vport_info(adapter, func);
735 qlcnic_sriov_pf_config_vport(adapter, 0, func);
738 if (vp->vlan_mode == QLC_GUEST_VLAN_MODE) {
739 size = sizeof(*vf->sriov_vlans);
740 size = size * sriov->num_allowed_vlans;
741 memset(vf->sriov_vlans, 0, size);
744 err = qlcnic_sriov_pf_config_vport(adapter, 0, func);
750 cmd->rsp.arg[0] |= (1 << 25);
752 if (trans->req_hdr->cmd_op == QLCNIC_BC_CMD_CHANNEL_INIT)
753 set_bit(QLC_BC_VF_STATE, &vf->state);
755 clear_bit(QLC_BC_VF_STATE, &vf->state);
760 cmd->rsp.arg[0] |= (2 << 25);
764 static int qlcnic_sriov_cfg_vf_def_mac(struct qlcnic_adapter *adapter,
765 struct qlcnic_vf_info *vf,
768 struct qlcnic_cmd_args cmd;
769 struct qlcnic_macvlan_mbx mv;
770 struct qlcnic_vport *vp;
778 if (qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_CONFIG_MAC_VLAN))
781 vpid = qlcnic_sriov_pf_get_vport_handle(adapter, vf->pci_func);
788 op = ((op == QLCNIC_MAC_ADD || op == QLCNIC_MAC_VLAN_ADD) ?
789 QLCNIC_MAC_VLAN_ADD : QLCNIC_MAC_VLAN_DEL);
791 cmd.req.arg[1] = op | (1 << 8) | (3 << 6);
792 cmd.req.arg[1] |= ((vpid & 0xffff) << 16) | BIT_31;
796 mv.mac_addr0 = addr[0];
797 mv.mac_addr1 = addr[1];
798 mv.mac_addr2 = addr[2];
799 mv.mac_addr3 = addr[3];
800 mv.mac_addr4 = addr[4];
801 mv.mac_addr5 = addr[5];
802 buf = &cmd.req.arg[2];
803 memcpy(buf, &mv, sizeof(struct qlcnic_macvlan_mbx));
805 err = qlcnic_issue_cmd(adapter, &cmd);
808 dev_err(&adapter->pdev->dev,
809 "MAC-VLAN %s to CAM failed, err=%d.\n",
810 ((op == 1) ? "add " : "delete "), err);
813 qlcnic_free_mbx_args(&cmd);
817 static int qlcnic_sriov_validate_create_rx_ctx(struct qlcnic_cmd_args *cmd)
819 if ((cmd->req.arg[0] >> 29) != 0x3)
825 static void qlcnic_83xx_cfg_default_mac_vlan(struct qlcnic_adapter *adapter,
826 struct qlcnic_vf_info *vf,
829 struct qlcnic_sriov *sriov;
833 sriov = adapter->ahw->sriov;
835 mutex_lock(&vf->vlan_list_lock);
837 for (i = 0; i < sriov->num_allowed_vlans; i++) {
838 vlan = vf->sriov_vlans[i];
840 qlcnic_sriov_cfg_vf_def_mac(adapter, vf, vlan,
844 mutex_unlock(&vf->vlan_list_lock);
846 if (vf->vp->vlan_mode != QLC_PVID_MODE) {
847 if (qlcnic_83xx_pf_check(adapter) &&
848 qlcnic_sriov_check_any_vlan(vf))
850 qlcnic_sriov_cfg_vf_def_mac(adapter, vf, 0, opcode);
854 static int qlcnic_sriov_pf_create_rx_ctx_cmd(struct qlcnic_bc_trans *tran,
855 struct qlcnic_cmd_args *cmd)
857 struct qlcnic_vf_info *vf = tran->vf;
858 struct qlcnic_adapter *adapter = vf->adapter;
859 struct qlcnic_rcv_mbx_out *mbx_out;
862 err = qlcnic_sriov_validate_create_rx_ctx(cmd);
864 cmd->rsp.arg[0] |= (0x6 << 25);
868 cmd->req.arg[6] = vf->vp->handle;
869 err = qlcnic_issue_cmd(adapter, cmd);
872 mbx_out = (struct qlcnic_rcv_mbx_out *)&cmd->rsp.arg[1];
873 vf->rx_ctx_id = mbx_out->ctx_id;
874 qlcnic_83xx_cfg_default_mac_vlan(adapter, vf, QLCNIC_MAC_ADD);
882 static int qlcnic_sriov_pf_mac_address_cmd(struct qlcnic_bc_trans *trans,
883 struct qlcnic_cmd_args *cmd)
885 struct qlcnic_vf_info *vf = trans->vf;
888 type = cmd->req.arg[1];
890 case QLCNIC_SET_STATION_MAC:
891 case QLCNIC_SET_FAC_DEF_MAC:
892 cmd->rsp.arg[0] = (2 << 25);
894 case QLCNIC_GET_CURRENT_MAC:
895 cmd->rsp.arg[0] = (1 << 25);
897 cmd->rsp.arg[2] = mac[1] | ((mac[0] << 8) & 0xff00);
898 cmd->rsp.arg[1] = mac[5] | ((mac[4] << 8) & 0xff00) |
899 ((mac[3]) << 16 & 0xff0000) |
900 ((mac[2]) << 24 & 0xff000000);
906 static int qlcnic_sriov_validate_create_tx_ctx(struct qlcnic_cmd_args *cmd)
908 if ((cmd->req.arg[0] >> 29) != 0x3)
914 static int qlcnic_sriov_pf_create_tx_ctx_cmd(struct qlcnic_bc_trans *trans,
915 struct qlcnic_cmd_args *cmd)
917 struct qlcnic_vf_info *vf = trans->vf;
918 struct qlcnic_adapter *adapter = vf->adapter;
919 struct qlcnic_tx_mbx_out *mbx_out;
922 err = qlcnic_sriov_validate_create_tx_ctx(cmd);
924 cmd->rsp.arg[0] |= (0x6 << 25);
928 cmd->req.arg[5] |= vf->vp->handle << 16;
929 err = qlcnic_issue_cmd(adapter, cmd);
931 mbx_out = (struct qlcnic_tx_mbx_out *)&cmd->rsp.arg[2];
932 vf->tx_ctx_id = mbx_out->ctx_id;
940 static int qlcnic_sriov_validate_del_rx_ctx(struct qlcnic_vf_info *vf,
941 struct qlcnic_cmd_args *cmd)
943 if ((cmd->req.arg[0] >> 29) != 0x3)
946 if ((cmd->req.arg[1] & 0xffff) != vf->rx_ctx_id)
952 static int qlcnic_sriov_pf_del_rx_ctx_cmd(struct qlcnic_bc_trans *trans,
953 struct qlcnic_cmd_args *cmd)
955 struct qlcnic_vf_info *vf = trans->vf;
956 struct qlcnic_adapter *adapter = vf->adapter;
959 err = qlcnic_sriov_validate_del_rx_ctx(vf, cmd);
961 cmd->rsp.arg[0] |= (0x6 << 25);
965 qlcnic_83xx_cfg_default_mac_vlan(adapter, vf, QLCNIC_MAC_DEL);
966 cmd->req.arg[1] |= vf->vp->handle << 16;
967 err = qlcnic_issue_cmd(adapter, cmd);
975 static int qlcnic_sriov_validate_del_tx_ctx(struct qlcnic_vf_info *vf,
976 struct qlcnic_cmd_args *cmd)
978 if ((cmd->req.arg[0] >> 29) != 0x3)
981 if ((cmd->req.arg[1] & 0xffff) != vf->tx_ctx_id)
987 static int qlcnic_sriov_pf_del_tx_ctx_cmd(struct qlcnic_bc_trans *trans,
988 struct qlcnic_cmd_args *cmd)
990 struct qlcnic_vf_info *vf = trans->vf;
991 struct qlcnic_adapter *adapter = vf->adapter;
994 err = qlcnic_sriov_validate_del_tx_ctx(vf, cmd);
996 cmd->rsp.arg[0] |= (0x6 << 25);
1000 cmd->req.arg[1] |= vf->vp->handle << 16;
1001 err = qlcnic_issue_cmd(adapter, cmd);
1009 static int qlcnic_sriov_validate_cfg_lro(struct qlcnic_vf_info *vf,
1010 struct qlcnic_cmd_args *cmd)
1012 if ((cmd->req.arg[1] >> 16) != vf->rx_ctx_id)
1018 static int qlcnic_sriov_pf_cfg_lro_cmd(struct qlcnic_bc_trans *trans,
1019 struct qlcnic_cmd_args *cmd)
1021 struct qlcnic_vf_info *vf = trans->vf;
1022 struct qlcnic_adapter *adapter = vf->adapter;
1025 err = qlcnic_sriov_validate_cfg_lro(vf, cmd);
1027 cmd->rsp.arg[0] |= (0x6 << 25);
1031 err = qlcnic_issue_cmd(adapter, cmd);
1035 static int qlcnic_sriov_pf_cfg_ip_cmd(struct qlcnic_bc_trans *trans,
1036 struct qlcnic_cmd_args *cmd)
1038 struct qlcnic_vf_info *vf = trans->vf;
1039 struct qlcnic_adapter *adapter = vf->adapter;
1043 op = cmd->req.arg[1] & 0xff;
1045 cmd->req.arg[1] |= vf->vp->handle << 16;
1046 cmd->req.arg[1] |= BIT_31;
1048 err = qlcnic_issue_cmd(adapter, cmd);
1052 static int qlcnic_sriov_validate_cfg_intrpt(struct qlcnic_vf_info *vf,
1053 struct qlcnic_cmd_args *cmd)
1055 if (((cmd->req.arg[1] >> 8) & 0xff) != vf->pci_func)
1058 if (!(cmd->req.arg[1] & BIT_16))
1061 if ((cmd->req.arg[1] & 0xff) != 0x1)
1067 static int qlcnic_sriov_pf_cfg_intrpt_cmd(struct qlcnic_bc_trans *trans,
1068 struct qlcnic_cmd_args *cmd)
1070 struct qlcnic_vf_info *vf = trans->vf;
1071 struct qlcnic_adapter *adapter = vf->adapter;
1074 err = qlcnic_sriov_validate_cfg_intrpt(vf, cmd);
1076 cmd->rsp.arg[0] |= (0x6 << 25);
1078 err = qlcnic_issue_cmd(adapter, cmd);
1083 static int qlcnic_sriov_validate_mtu(struct qlcnic_adapter *adapter,
1084 struct qlcnic_vf_info *vf,
1085 struct qlcnic_cmd_args *cmd)
1087 if (cmd->req.arg[1] != vf->rx_ctx_id)
1090 if (cmd->req.arg[2] > adapter->ahw->max_mtu)
1096 static int qlcnic_sriov_pf_set_mtu_cmd(struct qlcnic_bc_trans *trans,
1097 struct qlcnic_cmd_args *cmd)
1099 struct qlcnic_vf_info *vf = trans->vf;
1100 struct qlcnic_adapter *adapter = vf->adapter;
1103 err = qlcnic_sriov_validate_mtu(adapter, vf, cmd);
1105 cmd->rsp.arg[0] |= (0x6 << 25);
1107 err = qlcnic_issue_cmd(adapter, cmd);
1112 static int qlcnic_sriov_validate_get_nic_info(struct qlcnic_vf_info *vf,
1113 struct qlcnic_cmd_args *cmd)
1115 if (cmd->req.arg[1] & BIT_31) {
1116 if (((cmd->req.arg[1] >> 16) & 0x7fff) != vf->pci_func)
1119 cmd->req.arg[1] |= vf->vp->handle << 16;
1125 static int qlcnic_sriov_pf_get_nic_info_cmd(struct qlcnic_bc_trans *trans,
1126 struct qlcnic_cmd_args *cmd)
1128 struct qlcnic_vf_info *vf = trans->vf;
1129 struct qlcnic_adapter *adapter = vf->adapter;
1132 err = qlcnic_sriov_validate_get_nic_info(vf, cmd);
1134 cmd->rsp.arg[0] |= (0x6 << 25);
1138 err = qlcnic_issue_cmd(adapter, cmd);
1142 static int qlcnic_sriov_validate_cfg_rss(struct qlcnic_vf_info *vf,
1143 struct qlcnic_cmd_args *cmd)
1145 if (cmd->req.arg[1] != vf->rx_ctx_id)
1151 static int qlcnic_sriov_pf_cfg_rss_cmd(struct qlcnic_bc_trans *trans,
1152 struct qlcnic_cmd_args *cmd)
1154 struct qlcnic_vf_info *vf = trans->vf;
1155 struct qlcnic_adapter *adapter = vf->adapter;
1158 err = qlcnic_sriov_validate_cfg_rss(vf, cmd);
1160 cmd->rsp.arg[0] |= (0x6 << 25);
1162 err = qlcnic_issue_cmd(adapter, cmd);
1167 static int qlcnic_sriov_validate_cfg_intrcoal(struct qlcnic_adapter *adapter,
1168 struct qlcnic_vf_info *vf,
1169 struct qlcnic_cmd_args *cmd)
1171 struct qlcnic_nic_intr_coalesce *coal = &adapter->ahw->coal;
1172 u16 ctx_id, pkts, time;
1174 ctx_id = cmd->req.arg[1] >> 16;
1175 pkts = cmd->req.arg[2] & 0xffff;
1176 time = cmd->req.arg[2] >> 16;
1178 if (ctx_id != vf->rx_ctx_id)
1180 if (pkts > coal->rx_packets)
1182 if (time < coal->rx_time_us)
1188 static int qlcnic_sriov_pf_cfg_intrcoal_cmd(struct qlcnic_bc_trans *tran,
1189 struct qlcnic_cmd_args *cmd)
1191 struct qlcnic_vf_info *vf = tran->vf;
1192 struct qlcnic_adapter *adapter = vf->adapter;
1195 err = qlcnic_sriov_validate_cfg_intrcoal(adapter, vf, cmd);
1197 cmd->rsp.arg[0] |= (0x6 << 25);
1201 err = qlcnic_issue_cmd(adapter, cmd);
1205 static int qlcnic_sriov_validate_cfg_macvlan(struct qlcnic_adapter *adapter,
1206 struct qlcnic_vf_info *vf,
1207 struct qlcnic_cmd_args *cmd)
1209 struct qlcnic_macvlan_mbx *macvlan;
1210 struct qlcnic_vport *vp = vf->vp;
1213 if (((cmd->req.arg[1] & QLC_MAC_OPCODE_MASK) == QLC_MAC_STAR_ADD) ||
1214 ((cmd->req.arg[1] & QLC_MAC_OPCODE_MASK) == QLC_MAC_STAR_DEL)) {
1215 netdev_err(adapter->netdev, "MAC + any VLAN filter not allowed from VF %d\n",
1220 if (!(cmd->req.arg[1] & BIT_8))
1223 cmd->req.arg[1] |= (vf->vp->handle << 16);
1224 cmd->req.arg[1] |= BIT_31;
1226 macvlan = (struct qlcnic_macvlan_mbx *)&cmd->req.arg[2];
1227 if (!(macvlan->mac_addr0 & BIT_0)) {
1228 dev_err(&adapter->pdev->dev,
1229 "MAC address change is not allowed from VF %d",
1234 if (vp->vlan_mode == QLC_PVID_MODE) {
1235 op = cmd->req.arg[1] & 0x7;
1236 cmd->req.arg[1] &= ~0x7;
1237 new_op = (op == QLCNIC_MAC_ADD || op == QLCNIC_MAC_VLAN_ADD) ?
1238 QLCNIC_MAC_VLAN_ADD : QLCNIC_MAC_VLAN_DEL;
1239 cmd->req.arg[3] |= vp->pvid << 16;
1240 cmd->req.arg[1] |= new_op;
1246 static int qlcnic_sriov_pf_cfg_macvlan_cmd(struct qlcnic_bc_trans *trans,
1247 struct qlcnic_cmd_args *cmd)
1249 struct qlcnic_vf_info *vf = trans->vf;
1250 struct qlcnic_adapter *adapter = vf->adapter;
1253 err = qlcnic_sriov_validate_cfg_macvlan(adapter, vf, cmd);
1255 cmd->rsp.arg[0] |= (0x6 << 25);
1259 err = qlcnic_issue_cmd(adapter, cmd);
1263 static int qlcnic_sriov_validate_linkevent(struct qlcnic_vf_info *vf,
1264 struct qlcnic_cmd_args *cmd)
1266 if ((cmd->req.arg[1] >> 16) != vf->rx_ctx_id)
1272 static int qlcnic_sriov_pf_linkevent_cmd(struct qlcnic_bc_trans *trans,
1273 struct qlcnic_cmd_args *cmd)
1275 struct qlcnic_vf_info *vf = trans->vf;
1276 struct qlcnic_adapter *adapter = vf->adapter;
1279 err = qlcnic_sriov_validate_linkevent(vf, cmd);
1281 cmd->rsp.arg[0] |= (0x6 << 25);
1285 err = qlcnic_issue_cmd(adapter, cmd);
1289 static int qlcnic_sriov_pf_cfg_promisc_cmd(struct qlcnic_bc_trans *trans,
1290 struct qlcnic_cmd_args *cmd)
1292 struct qlcnic_vf_info *vf = trans->vf;
1293 struct qlcnic_adapter *adapter = vf->adapter;
1296 cmd->req.arg[1] |= vf->vp->handle << 16;
1297 cmd->req.arg[1] |= BIT_31;
1298 err = qlcnic_issue_cmd(adapter, cmd);
1302 static int qlcnic_sriov_pf_get_acl_cmd(struct qlcnic_bc_trans *trans,
1303 struct qlcnic_cmd_args *cmd)
1305 struct qlcnic_vf_info *vf = trans->vf;
1306 struct qlcnic_vport *vp = vf->vp;
1307 u8 cmd_op, mode = vp->vlan_mode;
1308 struct qlcnic_adapter *adapter;
1309 struct qlcnic_sriov *sriov;
1311 adapter = vf->adapter;
1312 sriov = adapter->ahw->sriov;
1314 cmd_op = trans->req_hdr->cmd_op;
1315 cmd->rsp.arg[0] |= 1 << 25;
1317 /* For 84xx adapter in case of PVID , PFD should send vlan mode as
1318 * QLC_NO_VLAN_MODE to VFD which is zero in mailbox response
1320 if (qlcnic_84xx_check(adapter) && mode == QLC_PVID_MODE)
1324 case QLC_GUEST_VLAN_MODE:
1325 cmd->rsp.arg[1] = mode | 1 << 8;
1326 cmd->rsp.arg[2] = sriov->num_allowed_vlans << 16;
1329 cmd->rsp.arg[1] = mode | 1 << 8 | vp->pvid << 16;
1336 static int qlcnic_sriov_pf_del_guest_vlan(struct qlcnic_adapter *adapter,
1337 struct qlcnic_vf_info *vf,
1338 struct qlcnic_cmd_args *cmd)
1340 struct qlcnic_sriov *sriov = adapter->ahw->sriov;
1343 if (!qlcnic_sriov_check_any_vlan(vf))
1346 vlan = cmd->req.arg[1] >> 16;
1347 if (!vf->rx_ctx_id) {
1348 qlcnic_sriov_del_vlan_id(sriov, vf, vlan);
1352 qlcnic_sriov_cfg_vf_def_mac(adapter, vf, vlan, QLCNIC_MAC_DEL);
1353 qlcnic_sriov_del_vlan_id(sriov, vf, vlan);
1355 if (qlcnic_83xx_pf_check(adapter))
1356 qlcnic_sriov_cfg_vf_def_mac(adapter, vf,
1361 static int qlcnic_sriov_pf_add_guest_vlan(struct qlcnic_adapter *adapter,
1362 struct qlcnic_vf_info *vf,
1363 struct qlcnic_cmd_args *cmd)
1365 struct qlcnic_sriov *sriov = adapter->ahw->sriov;
1369 if (qlcnic_83xx_pf_check(adapter) && qlcnic_sriov_check_any_vlan(vf))
1372 vlan = cmd->req.arg[1] >> 16;
1374 if (!vf->rx_ctx_id) {
1375 qlcnic_sriov_add_vlan_id(sriov, vf, vlan);
1379 if (qlcnic_83xx_pf_check(adapter)) {
1380 err = qlcnic_sriov_cfg_vf_def_mac(adapter, vf, 0,
1386 err = qlcnic_sriov_cfg_vf_def_mac(adapter, vf, vlan, QLCNIC_MAC_ADD);
1389 if (qlcnic_83xx_pf_check(adapter))
1390 qlcnic_sriov_cfg_vf_def_mac(adapter, vf, 0,
1395 qlcnic_sriov_add_vlan_id(sriov, vf, vlan);
1399 static int qlcnic_sriov_pf_cfg_guest_vlan_cmd(struct qlcnic_bc_trans *tran,
1400 struct qlcnic_cmd_args *cmd)
1402 struct qlcnic_vf_info *vf = tran->vf;
1403 struct qlcnic_adapter *adapter = vf->adapter;
1404 struct qlcnic_vport *vp = vf->vp;
1408 if (vp->vlan_mode != QLC_GUEST_VLAN_MODE) {
1409 cmd->rsp.arg[0] |= 2 << 25;
1413 op = cmd->req.arg[1] & 0xf;
1416 err = qlcnic_sriov_pf_add_guest_vlan(adapter, vf, cmd);
1418 err = qlcnic_sriov_pf_del_guest_vlan(adapter, vf, cmd);
1420 cmd->rsp.arg[0] |= err ? 2 << 25 : 1 << 25;
1424 static const int qlcnic_pf_passthru_supp_cmds[] = {
1425 QLCNIC_CMD_GET_STATISTICS,
1426 QLCNIC_CMD_GET_PORT_CONFIG,
1427 QLCNIC_CMD_GET_LINK_STATUS,
1428 QLCNIC_CMD_INIT_NIC_FUNC,
1429 QLCNIC_CMD_STOP_NIC_FUNC,
1432 static const struct qlcnic_sriov_cmd_handler qlcnic_pf_bc_cmd_hdlr[] = {
1433 [QLCNIC_BC_CMD_CHANNEL_INIT] = {&qlcnic_sriov_pf_channel_cfg_cmd},
1434 [QLCNIC_BC_CMD_CHANNEL_TERM] = {&qlcnic_sriov_pf_channel_cfg_cmd},
1435 [QLCNIC_BC_CMD_GET_ACL] = {&qlcnic_sriov_pf_get_acl_cmd},
1436 [QLCNIC_BC_CMD_CFG_GUEST_VLAN] = {&qlcnic_sriov_pf_cfg_guest_vlan_cmd},
1439 static const struct qlcnic_sriov_fw_cmd_handler qlcnic_pf_fw_cmd_hdlr[] = {
1440 {QLCNIC_CMD_CREATE_RX_CTX, qlcnic_sriov_pf_create_rx_ctx_cmd},
1441 {QLCNIC_CMD_CREATE_TX_CTX, qlcnic_sriov_pf_create_tx_ctx_cmd},
1442 {QLCNIC_CMD_MAC_ADDRESS, qlcnic_sriov_pf_mac_address_cmd},
1443 {QLCNIC_CMD_DESTROY_RX_CTX, qlcnic_sriov_pf_del_rx_ctx_cmd},
1444 {QLCNIC_CMD_DESTROY_TX_CTX, qlcnic_sriov_pf_del_tx_ctx_cmd},
1445 {QLCNIC_CMD_CONFIGURE_HW_LRO, qlcnic_sriov_pf_cfg_lro_cmd},
1446 {QLCNIC_CMD_CONFIGURE_IP_ADDR, qlcnic_sriov_pf_cfg_ip_cmd},
1447 {QLCNIC_CMD_CONFIG_INTRPT, qlcnic_sriov_pf_cfg_intrpt_cmd},
1448 {QLCNIC_CMD_SET_MTU, qlcnic_sriov_pf_set_mtu_cmd},
1449 {QLCNIC_CMD_GET_NIC_INFO, qlcnic_sriov_pf_get_nic_info_cmd},
1450 {QLCNIC_CMD_CONFIGURE_RSS, qlcnic_sriov_pf_cfg_rss_cmd},
1451 {QLCNIC_CMD_CONFIG_INTR_COAL, qlcnic_sriov_pf_cfg_intrcoal_cmd},
1452 {QLCNIC_CMD_CONFIG_MAC_VLAN, qlcnic_sriov_pf_cfg_macvlan_cmd},
1453 {QLCNIC_CMD_GET_LINK_EVENT, qlcnic_sriov_pf_linkevent_cmd},
1454 {QLCNIC_CMD_CONFIGURE_MAC_RX_MODE, qlcnic_sriov_pf_cfg_promisc_cmd},
1457 void qlcnic_sriov_pf_process_bc_cmd(struct qlcnic_adapter *adapter,
1458 struct qlcnic_bc_trans *trans,
1459 struct qlcnic_cmd_args *cmd)
1463 cmd_op = trans->req_hdr->cmd_op;
1465 if (trans->req_hdr->op_type == QLC_BC_CMD) {
1466 size = ARRAY_SIZE(qlcnic_pf_bc_cmd_hdlr);
1467 if (cmd_op < size) {
1468 qlcnic_pf_bc_cmd_hdlr[cmd_op].fn(trans, cmd);
1473 size = ARRAY_SIZE(qlcnic_pf_fw_cmd_hdlr);
1474 for (i = 0; i < size; i++) {
1475 if (cmd_op == qlcnic_pf_fw_cmd_hdlr[i].cmd) {
1476 qlcnic_pf_fw_cmd_hdlr[i].fn(trans, cmd);
1481 size = ARRAY_SIZE(qlcnic_pf_passthru_supp_cmds);
1482 for (i = 0; i < size; i++) {
1483 if (cmd_op == qlcnic_pf_passthru_supp_cmds[i]) {
1484 qlcnic_issue_cmd(adapter, cmd);
1490 cmd->rsp.arg[0] |= (0x9 << 25);
1493 void qlcnic_pf_set_interface_id_create_rx_ctx(struct qlcnic_adapter *adapter,
1498 vpid = qlcnic_sriov_pf_get_vport_handle(adapter,
1499 adapter->ahw->pci_func);
1503 void qlcnic_pf_set_interface_id_del_rx_ctx(struct qlcnic_adapter *adapter,
1508 vpid = qlcnic_sriov_pf_get_vport_handle(adapter,
1509 adapter->ahw->pci_func);
1510 *int_id |= vpid << 16;
1513 void qlcnic_pf_set_interface_id_create_tx_ctx(struct qlcnic_adapter *adapter,
1518 vpid = qlcnic_sriov_pf_get_vport_handle(adapter,
1519 adapter->ahw->pci_func);
1520 *int_id |= vpid << 16;
1523 void qlcnic_pf_set_interface_id_del_tx_ctx(struct qlcnic_adapter *adapter,
1528 vpid = qlcnic_sriov_pf_get_vport_handle(adapter,
1529 adapter->ahw->pci_func);
1530 *int_id |= vpid << 16;
1533 void qlcnic_pf_set_interface_id_promisc(struct qlcnic_adapter *adapter,
1538 vpid = qlcnic_sriov_pf_get_vport_handle(adapter,
1539 adapter->ahw->pci_func);
1540 *int_id |= (vpid << 16) | BIT_31;
1543 void qlcnic_pf_set_interface_id_ipaddr(struct qlcnic_adapter *adapter,
1548 vpid = qlcnic_sriov_pf_get_vport_handle(adapter,
1549 adapter->ahw->pci_func);
1550 *int_id |= (vpid << 16) | BIT_31;
1553 void qlcnic_pf_set_interface_id_macaddr(struct qlcnic_adapter *adapter,
1558 vpid = qlcnic_sriov_pf_get_vport_handle(adapter,
1559 adapter->ahw->pci_func);
1560 *int_id |= (vpid << 16) | BIT_31;
1563 static void qlcnic_sriov_del_rx_ctx(struct qlcnic_adapter *adapter,
1564 struct qlcnic_vf_info *vf)
1566 struct qlcnic_cmd_args cmd;
1572 if (qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_DESTROY_RX_CTX))
1575 vpid = qlcnic_sriov_pf_get_vport_handle(adapter, vf->pci_func);
1577 cmd.req.arg[1] = vf->rx_ctx_id | (vpid & 0xffff) << 16;
1578 if (qlcnic_issue_cmd(adapter, &cmd))
1579 dev_err(&adapter->pdev->dev,
1580 "Failed to delete Tx ctx in firmware for func 0x%x\n",
1586 qlcnic_free_mbx_args(&cmd);
1589 static void qlcnic_sriov_del_tx_ctx(struct qlcnic_adapter *adapter,
1590 struct qlcnic_vf_info *vf)
1592 struct qlcnic_cmd_args cmd;
1598 if (qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_DESTROY_TX_CTX))
1601 vpid = qlcnic_sriov_pf_get_vport_handle(adapter, vf->pci_func);
1603 cmd.req.arg[1] |= vf->tx_ctx_id | (vpid & 0xffff) << 16;
1604 if (qlcnic_issue_cmd(adapter, &cmd))
1605 dev_err(&adapter->pdev->dev,
1606 "Failed to delete Tx ctx in firmware for func 0x%x\n",
1612 qlcnic_free_mbx_args(&cmd);
1615 static int qlcnic_sriov_add_act_list_irqsave(struct qlcnic_sriov *sriov,
1616 struct qlcnic_vf_info *vf,
1617 struct qlcnic_bc_trans *trans)
1619 struct qlcnic_trans_list *t_list = &vf->rcv_act;
1622 spin_lock_irqsave(&t_list->lock, flag);
1624 __qlcnic_sriov_add_act_list(sriov, vf, trans);
1626 spin_unlock_irqrestore(&t_list->lock, flag);
1630 static void __qlcnic_sriov_process_flr(struct qlcnic_vf_info *vf)
1632 struct qlcnic_adapter *adapter = vf->adapter;
1634 qlcnic_sriov_cleanup_list(&vf->rcv_pend);
1635 cancel_work_sync(&vf->trans_work);
1636 qlcnic_sriov_cleanup_list(&vf->rcv_act);
1638 if (test_bit(QLC_BC_VF_SOFT_FLR, &vf->state)) {
1639 qlcnic_sriov_del_tx_ctx(adapter, vf);
1640 qlcnic_sriov_del_rx_ctx(adapter, vf);
1643 qlcnic_sriov_pf_config_vport(adapter, 0, vf->pci_func);
1645 clear_bit(QLC_BC_VF_FLR, &vf->state);
1646 if (test_bit(QLC_BC_VF_SOFT_FLR, &vf->state)) {
1647 qlcnic_sriov_add_act_list_irqsave(adapter->ahw->sriov, vf,
1649 clear_bit(QLC_BC_VF_SOFT_FLR, &vf->state);
1650 vf->flr_trans = NULL;
1654 static void qlcnic_sriov_pf_process_flr(struct work_struct *work)
1656 struct qlcnic_vf_info *vf;
1658 vf = container_of(work, struct qlcnic_vf_info, flr_work);
1659 __qlcnic_sriov_process_flr(vf);
1663 static void qlcnic_sriov_schedule_flr(struct qlcnic_sriov *sriov,
1664 struct qlcnic_vf_info *vf,
1667 if (test_bit(__QLCNIC_RESETTING, &vf->adapter->state))
1670 INIT_WORK(&vf->flr_work, func);
1671 queue_work(sriov->bc.bc_flr_wq, &vf->flr_work);
1674 static void qlcnic_sriov_handle_soft_flr(struct qlcnic_adapter *adapter,
1675 struct qlcnic_bc_trans *trans,
1676 struct qlcnic_vf_info *vf)
1678 struct qlcnic_sriov *sriov = adapter->ahw->sriov;
1680 set_bit(QLC_BC_VF_FLR, &vf->state);
1681 clear_bit(QLC_BC_VF_STATE, &vf->state);
1682 set_bit(QLC_BC_VF_SOFT_FLR, &vf->state);
1683 vf->flr_trans = trans;
1684 qlcnic_sriov_schedule_flr(sriov, vf, qlcnic_sriov_pf_process_flr);
1685 netdev_info(adapter->netdev, "Software FLR for PCI func %d\n",
1689 bool qlcnic_sriov_soft_flr_check(struct qlcnic_adapter *adapter,
1690 struct qlcnic_bc_trans *trans,
1691 struct qlcnic_vf_info *vf)
1693 struct qlcnic_bc_hdr *hdr = trans->req_hdr;
1695 if ((hdr->cmd_op == QLCNIC_BC_CMD_CHANNEL_INIT) &&
1696 (hdr->op_type == QLC_BC_CMD) &&
1697 test_bit(QLC_BC_VF_STATE, &vf->state)) {
1698 qlcnic_sriov_handle_soft_flr(adapter, trans, vf);
1705 void qlcnic_sriov_pf_handle_flr(struct qlcnic_sriov *sriov,
1706 struct qlcnic_vf_info *vf)
1708 struct net_device *dev = vf->adapter->netdev;
1709 struct qlcnic_vport *vp = vf->vp;
1711 if (!test_and_clear_bit(QLC_BC_VF_STATE, &vf->state)) {
1712 clear_bit(QLC_BC_VF_FLR, &vf->state);
1716 if (test_and_set_bit(QLC_BC_VF_FLR, &vf->state)) {
1717 netdev_info(dev, "FLR for PCI func %d in progress\n",
1722 if (vp->vlan_mode == QLC_GUEST_VLAN_MODE)
1723 memset(vf->sriov_vlans, 0,
1724 sizeof(*vf->sriov_vlans) * sriov->num_allowed_vlans);
1726 qlcnic_sriov_schedule_flr(sriov, vf, qlcnic_sriov_pf_process_flr);
1727 netdev_info(dev, "FLR received for PCI func %d\n", vf->pci_func);
1730 void qlcnic_sriov_pf_reset(struct qlcnic_adapter *adapter)
1732 struct qlcnic_hardware_context *ahw = adapter->ahw;
1733 struct qlcnic_sriov *sriov = ahw->sriov;
1734 struct qlcnic_vf_info *vf;
1735 u16 num_vfs = sriov->num_vfs;
1738 for (i = 0; i < num_vfs; i++) {
1739 vf = &sriov->vf_info[i];
1742 cancel_work_sync(&vf->flr_work);
1743 __qlcnic_sriov_process_flr(vf);
1744 clear_bit(QLC_BC_VF_STATE, &vf->state);
1747 qlcnic_sriov_pf_reset_vport_handle(adapter, ahw->pci_func);
1748 QLCWRX(ahw, QLCNIC_MBX_INTR_ENBL, (ahw->num_msix - 1) << 8);
1751 int qlcnic_sriov_pf_reinit(struct qlcnic_adapter *adapter)
1753 struct qlcnic_hardware_context *ahw = adapter->ahw;
1756 if (!qlcnic_sriov_enable_check(adapter))
1759 ahw->op_mode = QLCNIC_SRIOV_PF_FUNC;
1761 err = qlcnic_sriov_pf_init(adapter);
1765 dev_info(&adapter->pdev->dev, "%s: op_mode %d\n",
1766 __func__, ahw->op_mode);
1770 int qlcnic_sriov_set_vf_mac(struct net_device *netdev, int vf, u8 *mac)
1772 struct qlcnic_adapter *adapter = netdev_priv(netdev);
1773 struct qlcnic_sriov *sriov = adapter->ahw->sriov;
1775 struct qlcnic_vf_info *vf_info;
1778 if (!qlcnic_sriov_pf_check(adapter))
1781 num_vfs = sriov->num_vfs;
1783 if (!is_valid_ether_addr(mac) || vf >= num_vfs)
1786 if (ether_addr_equal(adapter->mac_addr, mac)) {
1787 netdev_err(netdev, "MAC address is already in use by the PF\n");
1791 for (i = 0; i < num_vfs; i++) {
1792 vf_info = &sriov->vf_info[i];
1793 if (ether_addr_equal(vf_info->vp->mac, mac)) {
1795 "MAC address is already in use by VF %d\n",
1801 vf_info = &sriov->vf_info[vf];
1802 curr_mac = vf_info->vp->mac;
1804 if (test_bit(QLC_BC_VF_STATE, &vf_info->state)) {
1806 "MAC address change failed for VF %d, as VF driver is loaded. Please unload VF driver and retry the operation\n",
1811 memcpy(curr_mac, mac, netdev->addr_len);
1812 netdev_info(netdev, "MAC Address %pM is configured for VF %d\n",
1817 int qlcnic_sriov_set_vf_tx_rate(struct net_device *netdev, int vf, int tx_rate)
1819 struct qlcnic_adapter *adapter = netdev_priv(netdev);
1820 struct qlcnic_sriov *sriov = adapter->ahw->sriov;
1821 struct qlcnic_vf_info *vf_info;
1822 struct qlcnic_info nic_info;
1823 struct qlcnic_vport *vp;
1826 if (!qlcnic_sriov_pf_check(adapter))
1829 if (vf >= sriov->num_vfs)
1832 if (tx_rate >= 10000 || tx_rate < 100) {
1834 "Invalid Tx rate, allowed range is [%d - %d]",
1835 QLC_VF_MIN_TX_RATE, QLC_VF_MAX_TX_RATE);
1842 vf_info = &sriov->vf_info[vf];
1846 if (test_bit(QLC_BC_VF_STATE, &vf_info->state)) {
1847 if (qlcnic_sriov_get_vf_vport_info(adapter, &nic_info, vpid))
1850 nic_info.max_tx_bw = tx_rate / 100;
1851 nic_info.bit_offsets = BIT_0;
1853 if (qlcnic_sriov_pf_set_vport_info(adapter, &nic_info, vpid))
1857 vp->max_tx_bw = tx_rate / 100;
1859 "Setting Tx rate %d (Mbps), %d %% of PF bandwidth, for VF %d\n",
1860 tx_rate, vp->max_tx_bw, vf);
1864 int qlcnic_sriov_set_vf_vlan(struct net_device *netdev, int vf,
1867 struct qlcnic_adapter *adapter = netdev_priv(netdev);
1868 struct qlcnic_sriov *sriov = adapter->ahw->sriov;
1869 struct qlcnic_vf_info *vf_info;
1870 struct qlcnic_vport *vp;
1872 if (!qlcnic_sriov_pf_check(adapter))
1875 if (vf >= sriov->num_vfs || qos > 7)
1878 if (vlan > MAX_VLAN_ID) {
1880 "Invalid VLAN ID, allowed range is [0 - %d]\n",
1885 vf_info = &sriov->vf_info[vf];
1887 if (test_bit(QLC_BC_VF_STATE, &vf_info->state)) {
1889 "VLAN change failed for VF %d, as VF driver is loaded. Please unload VF driver and retry the operation\n",
1894 memset(vf_info->sriov_vlans, 0,
1895 sizeof(*vf_info->sriov_vlans) * sriov->num_allowed_vlans);
1899 vp->vlan_mode = QLC_GUEST_VLAN_MODE;
1902 vp->vlan_mode = QLC_NO_VLAN_MODE;
1906 vp->vlan_mode = QLC_PVID_MODE;
1907 qlcnic_sriov_add_vlan_id(sriov, vf_info, vlan);
1912 netdev_info(netdev, "Setting VLAN %d, QoS %d, for VF %d\n",
1917 static __u32 qlcnic_sriov_get_vf_vlan(struct qlcnic_adapter *adapter,
1918 struct qlcnic_vport *vp, int vf)
1922 switch (vp->vlan_mode) {
1926 case QLC_GUEST_VLAN_MODE:
1929 case QLC_NO_VLAN_MODE:
1933 netdev_info(adapter->netdev, "Invalid VLAN mode = %d for VF %d\n",
1940 int qlcnic_sriov_get_vf_config(struct net_device *netdev,
1941 int vf, struct ifla_vf_info *ivi)
1943 struct qlcnic_adapter *adapter = netdev_priv(netdev);
1944 struct qlcnic_sriov *sriov = adapter->ahw->sriov;
1945 struct qlcnic_vport *vp;
1947 if (!qlcnic_sriov_pf_check(adapter))
1950 if (vf >= sriov->num_vfs)
1953 vp = sriov->vf_info[vf].vp;
1954 memcpy(&ivi->mac, vp->mac, ETH_ALEN);
1955 ivi->vlan = qlcnic_sriov_get_vf_vlan(adapter, vp, vf);
1957 ivi->spoofchk = vp->spoofchk;
1958 if (vp->max_tx_bw == MAX_BW)
1961 ivi->tx_rate = vp->max_tx_bw * 100;
1967 int qlcnic_sriov_set_vf_spoofchk(struct net_device *netdev, int vf, bool chk)
1969 struct qlcnic_adapter *adapter = netdev_priv(netdev);
1970 struct qlcnic_sriov *sriov = adapter->ahw->sriov;
1971 struct qlcnic_vf_info *vf_info;
1972 struct qlcnic_vport *vp;
1974 if (!qlcnic_sriov_pf_check(adapter))
1977 if (vf >= sriov->num_vfs)
1980 vf_info = &sriov->vf_info[vf];
1982 if (test_bit(QLC_BC_VF_STATE, &vf_info->state)) {
1984 "Spoof check change failed for VF %d, as VF driver is loaded. Please unload VF driver and retry the operation\n",