2 * QLogic qlcnic NIC Driver
3 * Copyright (c) 2009-2013 QLogic Corporation
5 * See LICENSE.qlcnic for copyright and licensing details.
8 #include <linux/types.h>
10 #include "qlcnic_sriov.h"
13 #define QLCNIC_SRIOV_VF_MAX_MAC 7
14 #define QLC_VF_MIN_TX_RATE 100
15 #define QLC_VF_MAX_TX_RATE 9999
16 #define QLC_MAC_OPCODE_MASK 0x7
17 #define QLC_VF_FLOOD_BIT BIT_16
18 #define QLC_FLOOD_MODE 0x5
19 #define QLC_SRIOV_ALLOW_VLAN0 BIT_19
20 #define QLC_INTR_COAL_TYPE_MASK 0x7
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
))
88 num_macs
= QLCNIC_83XX_SRIOV_VF_MAX_MAC
;
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 adapter
->flags
|= QLCNIC_VLAN_FILTERING
;
343 cmd
.req
.arg
[1] |= BIT_16
;
344 if (qlcnic_84xx_check(adapter
))
345 cmd
.req
.arg
[1] |= QLC_SRIOV_ALLOW_VLAN0
;
347 adapter
->flags
&= ~QLCNIC_VLAN_FILTERING
;
350 err
= qlcnic_issue_cmd(adapter
, &cmd
);
352 dev_err(&adapter
->pdev
->dev
,
353 "Failed to configure VLAN filtering, err=%d\n", err
);
355 qlcnic_free_mbx_args(&cmd
);
359 /* On configuring VF flood bit, PFD will receive traffic from all VFs */
360 static int qlcnic_sriov_pf_cfg_flood(struct qlcnic_adapter
*adapter
)
362 struct qlcnic_cmd_args cmd
;
365 err
= qlcnic_alloc_mbx_args(&cmd
, adapter
, QLCNIC_CMD_SET_NIC_INFO
);
369 cmd
.req
.arg
[1] = QLC_FLOOD_MODE
| QLC_VF_FLOOD_BIT
;
371 err
= qlcnic_issue_cmd(adapter
, &cmd
);
373 dev_err(&adapter
->pdev
->dev
,
374 "Failed to configure VF Flood bit on PF, err=%d\n",
377 qlcnic_free_mbx_args(&cmd
);
381 static int qlcnic_sriov_pf_cfg_eswitch(struct qlcnic_adapter
*adapter
,
384 struct qlcnic_cmd_args cmd
;
387 if (qlcnic_alloc_mbx_args(&cmd
, adapter
, QLCNIC_CMD_TOGGLE_ESWITCH
))
390 cmd
.req
.arg
[0] |= (3 << 29);
391 cmd
.req
.arg
[1] = ((func
& 0xf) << 2) | BIT_6
| BIT_1
;
393 cmd
.req
.arg
[1] |= BIT_0
;
395 err
= qlcnic_issue_cmd(adapter
, &cmd
);
397 if (err
!= QLCNIC_RCODE_SUCCESS
) {
398 dev_err(&adapter
->pdev
->dev
,
399 "Failed to enable sriov eswitch%d\n", err
);
403 qlcnic_free_mbx_args(&cmd
);
407 static void qlcnic_sriov_pf_del_flr_queue(struct qlcnic_adapter
*adapter
)
409 struct qlcnic_sriov
*sriov
= adapter
->ahw
->sriov
;
410 struct qlcnic_back_channel
*bc
= &sriov
->bc
;
413 for (i
= 0; i
< sriov
->num_vfs
; i
++)
414 cancel_work_sync(&sriov
->vf_info
[i
].flr_work
);
416 destroy_workqueue(bc
->bc_flr_wq
);
419 static int qlcnic_sriov_pf_create_flr_queue(struct qlcnic_adapter
*adapter
)
421 struct qlcnic_back_channel
*bc
= &adapter
->ahw
->sriov
->bc
;
422 struct workqueue_struct
*wq
;
424 wq
= create_singlethread_workqueue("qlcnic-flr");
426 dev_err(&adapter
->pdev
->dev
, "Cannot create FLR workqueue\n");
434 void qlcnic_sriov_pf_cleanup(struct qlcnic_adapter
*adapter
)
436 u8 func
= adapter
->ahw
->pci_func
;
438 if (!qlcnic_sriov_enable_check(adapter
))
441 qlcnic_sriov_pf_del_flr_queue(adapter
);
442 qlcnic_sriov_cfg_bc_intr(adapter
, 0);
443 qlcnic_sriov_pf_config_vport(adapter
, 0, func
);
444 qlcnic_sriov_pf_cfg_eswitch(adapter
, func
, 0);
445 qlcnic_sriov_pf_cfg_vlan_filtering(adapter
, 0);
446 __qlcnic_sriov_cleanup(adapter
);
447 adapter
->ahw
->op_mode
= QLCNIC_MGMT_FUNC
;
448 clear_bit(__QLCNIC_SRIOV_ENABLE
, &adapter
->state
);
451 void qlcnic_sriov_pf_disable(struct qlcnic_adapter
*adapter
)
453 if (!qlcnic_sriov_pf_check(adapter
))
456 if (!qlcnic_sriov_enable_check(adapter
))
459 pci_disable_sriov(adapter
->pdev
);
460 netdev_info(adapter
->netdev
,
461 "SR-IOV is disabled successfully on port %d\n",
465 static int qlcnic_pci_sriov_disable(struct qlcnic_adapter
*adapter
)
467 struct net_device
*netdev
= adapter
->netdev
;
469 if (pci_vfs_assigned(adapter
->pdev
)) {
470 netdev_err(adapter
->netdev
,
471 "SR-IOV VFs belonging to port %d are assigned to VMs. SR-IOV can not be disabled on this port\n",
473 netdev_info(adapter
->netdev
,
474 "Please detach SR-IOV VFs belonging to port %d from VMs, and then try to disable SR-IOV on this port\n",
479 qlcnic_sriov_pf_disable(adapter
);
482 if (netif_running(netdev
))
483 __qlcnic_down(adapter
, netdev
);
485 qlcnic_sriov_free_vlans(adapter
);
487 qlcnic_sriov_pf_cleanup(adapter
);
489 /* After disabling SRIOV re-init the driver in default mode
490 configure opmode based on op_mode of function
492 if (qlcnic_83xx_configure_opmode(adapter
)) {
497 if (netif_running(netdev
))
498 __qlcnic_up(adapter
, netdev
);
504 static int qlcnic_sriov_pf_init(struct qlcnic_adapter
*adapter
)
506 struct qlcnic_hardware_context
*ahw
= adapter
->ahw
;
507 struct qlcnic_info nic_info
, pf_info
, vp_info
;
509 u8 func
= ahw
->pci_func
;
511 if (!qlcnic_sriov_enable_check(adapter
))
514 err
= qlcnic_sriov_pf_cfg_vlan_filtering(adapter
, 1);
518 if (qlcnic_84xx_check(adapter
)) {
519 err
= qlcnic_sriov_pf_cfg_flood(adapter
);
521 goto disable_vlan_filtering
;
524 err
= qlcnic_sriov_pf_cfg_eswitch(adapter
, func
, 1);
526 goto disable_vlan_filtering
;
528 err
= qlcnic_sriov_pf_config_vport(adapter
, 1, func
);
530 goto disable_eswitch
;
532 err
= qlcnic_sriov_get_pf_info(adapter
, &pf_info
);
536 err
= qlcnic_get_nic_info(adapter
, &nic_info
, func
);
540 err
= qlcnic_sriov_pf_cal_res_limit(adapter
, &vp_info
, func
);
544 err
= qlcnic_sriov_cfg_bc_intr(adapter
, 1);
548 ahw
->physical_port
= (u8
) nic_info
.phys_port
;
549 ahw
->switch_mode
= nic_info
.switch_mode
;
550 ahw
->max_mtu
= nic_info
.max_mtu
;
551 ahw
->capabilities
= nic_info
.capabilities
;
552 ahw
->nic_mode
= QLC_83XX_SRIOV_MODE
;
556 qlcnic_sriov_pf_config_vport(adapter
, 0, func
);
559 qlcnic_sriov_pf_cfg_eswitch(adapter
, func
, 0);
561 disable_vlan_filtering
:
562 qlcnic_sriov_pf_cfg_vlan_filtering(adapter
, 0);
567 static int qlcnic_sriov_pf_enable(struct qlcnic_adapter
*adapter
, int num_vfs
)
571 if (!qlcnic_sriov_enable_check(adapter
))
574 err
= pci_enable_sriov(adapter
->pdev
, num_vfs
);
576 qlcnic_sriov_pf_cleanup(adapter
);
581 static int __qlcnic_pci_sriov_enable(struct qlcnic_adapter
*adapter
,
586 set_bit(__QLCNIC_SRIOV_ENABLE
, &adapter
->state
);
587 adapter
->ahw
->op_mode
= QLCNIC_SRIOV_PF_FUNC
;
589 err
= qlcnic_sriov_init(adapter
, num_vfs
);
593 err
= qlcnic_sriov_pf_create_flr_queue(adapter
);
597 err
= qlcnic_sriov_pf_init(adapter
);
601 qlcnic_sriov_alloc_vlans(adapter
);
606 qlcnic_sriov_pf_del_flr_queue(adapter
);
609 __qlcnic_sriov_cleanup(adapter
);
612 clear_bit(__QLCNIC_SRIOV_ENABLE
, &adapter
->state
);
613 adapter
->ahw
->op_mode
= QLCNIC_MGMT_FUNC
;
617 static int qlcnic_pci_sriov_enable(struct qlcnic_adapter
*adapter
, int num_vfs
)
619 struct net_device
*netdev
= adapter
->netdev
;
622 if (!(adapter
->flags
& QLCNIC_MSIX_ENABLED
)) {
624 "SR-IOV cannot be enabled, when legacy interrupts are enabled\n");
629 if (netif_running(netdev
))
630 __qlcnic_down(adapter
, netdev
);
632 err
= __qlcnic_pci_sriov_enable(adapter
, num_vfs
);
636 if (netif_running(netdev
))
637 __qlcnic_up(adapter
, netdev
);
640 err
= qlcnic_sriov_pf_enable(adapter
, num_vfs
);
643 "SR-IOV is enabled successfully on port %d\n",
645 /* Return number of vfs enabled */
650 if (netif_running(netdev
))
651 __qlcnic_down(adapter
, netdev
);
654 if (!qlcnic_83xx_configure_opmode(adapter
)) {
655 if (netif_running(netdev
))
656 __qlcnic_up(adapter
, netdev
);
660 netdev_info(netdev
, "Failed to enable SR-IOV on port %d\n",
666 int qlcnic_pci_sriov_configure(struct pci_dev
*dev
, int num_vfs
)
668 struct qlcnic_adapter
*adapter
= pci_get_drvdata(dev
);
671 if (test_and_set_bit(__QLCNIC_RESETTING
, &adapter
->state
))
675 err
= qlcnic_pci_sriov_disable(adapter
);
677 err
= qlcnic_pci_sriov_enable(adapter
, num_vfs
);
679 clear_bit(__QLCNIC_RESETTING
, &adapter
->state
);
683 static int qlcnic_sriov_set_vf_acl(struct qlcnic_adapter
*adapter
, u8 func
)
685 struct qlcnic_cmd_args cmd
;
686 struct qlcnic_vport
*vp
;
690 id
= qlcnic_sriov_func_to_index(adapter
, func
);
694 vp
= adapter
->ahw
->sriov
->vf_info
[id
].vp
;
695 err
= qlcnic_alloc_mbx_args(&cmd
, adapter
, QLCNIC_CMD_SET_NIC_INFO
);
699 cmd
.req
.arg
[1] = 0x3 | func
<< 16;
700 if (vp
->spoofchk
== true) {
702 cmd
.req
.arg
[2] |= BIT_1
| BIT_3
| BIT_8
;
703 cmd
.req
.arg
[4] = mac
[5] | mac
[4] << 8 | mac
[3] << 16 |
705 cmd
.req
.arg
[5] = mac
[1] | mac
[0] << 8;
708 if (vp
->vlan_mode
== QLC_PVID_MODE
) {
709 cmd
.req
.arg
[2] |= BIT_6
;
710 cmd
.req
.arg
[3] |= vp
->pvid
<< 8;
713 err
= qlcnic_issue_cmd(adapter
, &cmd
);
715 dev_err(&adapter
->pdev
->dev
, "Failed to set ACL, err=%d\n",
718 qlcnic_free_mbx_args(&cmd
);
722 static int qlcnic_sriov_set_vf_vport_info(struct qlcnic_adapter
*adapter
,
725 struct qlcnic_info defvp_info
;
728 err
= qlcnic_sriov_pf_cal_res_limit(adapter
, &defvp_info
, func
);
732 err
= qlcnic_sriov_set_vf_acl(adapter
, func
);
739 static int qlcnic_sriov_pf_channel_cfg_cmd(struct qlcnic_bc_trans
*trans
,
740 struct qlcnic_cmd_args
*cmd
)
742 struct qlcnic_vf_info
*vf
= trans
->vf
;
743 struct qlcnic_vport
*vp
= vf
->vp
;
744 struct qlcnic_adapter
*adapter
;
745 struct qlcnic_sriov
*sriov
;
746 u16 func
= vf
->pci_func
;
750 adapter
= vf
->adapter
;
751 sriov
= adapter
->ahw
->sriov
;
753 if (trans
->req_hdr
->cmd_op
== QLCNIC_BC_CMD_CHANNEL_INIT
) {
754 err
= qlcnic_sriov_pf_config_vport(adapter
, 1, func
);
756 err
= qlcnic_sriov_set_vf_vport_info(adapter
, func
);
758 qlcnic_sriov_pf_config_vport(adapter
, 0, func
);
761 if (vp
->vlan_mode
== QLC_GUEST_VLAN_MODE
) {
762 size
= sizeof(*vf
->sriov_vlans
);
763 size
= size
* sriov
->num_allowed_vlans
;
764 memset(vf
->sriov_vlans
, 0, size
);
767 err
= qlcnic_sriov_pf_config_vport(adapter
, 0, func
);
773 cmd
->rsp
.arg
[0] |= (1 << 25);
775 if (trans
->req_hdr
->cmd_op
== QLCNIC_BC_CMD_CHANNEL_INIT
)
776 set_bit(QLC_BC_VF_STATE
, &vf
->state
);
778 clear_bit(QLC_BC_VF_STATE
, &vf
->state
);
783 cmd
->rsp
.arg
[0] |= (2 << 25);
787 static int qlcnic_sriov_cfg_vf_def_mac(struct qlcnic_adapter
*adapter
,
788 struct qlcnic_vf_info
*vf
,
791 struct qlcnic_cmd_args
*cmd
;
792 struct qlcnic_macvlan_mbx mv
;
793 struct qlcnic_vport
*vp
;
801 cmd
= kzalloc(sizeof(*cmd
), GFP_ATOMIC
);
805 err
= qlcnic_alloc_mbx_args(cmd
, adapter
, QLCNIC_CMD_CONFIG_MAC_VLAN
);
809 cmd
->type
= QLC_83XX_MBX_CMD_NO_WAIT
;
810 vpid
= qlcnic_sriov_pf_get_vport_handle(adapter
, vf
->pci_func
);
817 op
= ((op
== QLCNIC_MAC_ADD
|| op
== QLCNIC_MAC_VLAN_ADD
) ?
818 QLCNIC_MAC_VLAN_ADD
: QLCNIC_MAC_VLAN_DEL
);
820 cmd
->req
.arg
[1] = op
| (1 << 8) | (3 << 6);
821 cmd
->req
.arg
[1] |= ((vpid
& 0xffff) << 16) | BIT_31
;
825 mv
.mac_addr0
= addr
[0];
826 mv
.mac_addr1
= addr
[1];
827 mv
.mac_addr2
= addr
[2];
828 mv
.mac_addr3
= addr
[3];
829 mv
.mac_addr4
= addr
[4];
830 mv
.mac_addr5
= addr
[5];
831 buf
= &cmd
->req
.arg
[2];
832 memcpy(buf
, &mv
, sizeof(struct qlcnic_macvlan_mbx
));
834 err
= qlcnic_issue_cmd(adapter
, cmd
);
840 qlcnic_free_mbx_args(cmd
);
846 static int qlcnic_sriov_validate_create_rx_ctx(struct qlcnic_cmd_args
*cmd
)
848 if ((cmd
->req
.arg
[0] >> 29) != 0x3)
854 static void qlcnic_83xx_cfg_default_mac_vlan(struct qlcnic_adapter
*adapter
,
855 struct qlcnic_vf_info
*vf
,
858 struct qlcnic_sriov
*sriov
;
862 sriov
= adapter
->ahw
->sriov
;
864 spin_lock_bh(&vf
->vlan_list_lock
);
866 for (i
= 0; i
< sriov
->num_allowed_vlans
; i
++) {
867 vlan
= vf
->sriov_vlans
[i
];
869 qlcnic_sriov_cfg_vf_def_mac(adapter
, vf
, vlan
,
873 spin_unlock_bh(&vf
->vlan_list_lock
);
875 if (vf
->vp
->vlan_mode
!= QLC_PVID_MODE
) {
876 if (qlcnic_83xx_pf_check(adapter
) &&
877 qlcnic_sriov_check_any_vlan(vf
))
879 qlcnic_sriov_cfg_vf_def_mac(adapter
, vf
, 0, opcode
);
883 static int qlcnic_sriov_pf_create_rx_ctx_cmd(struct qlcnic_bc_trans
*tran
,
884 struct qlcnic_cmd_args
*cmd
)
886 struct qlcnic_vf_info
*vf
= tran
->vf
;
887 struct qlcnic_adapter
*adapter
= vf
->adapter
;
888 struct qlcnic_rcv_mbx_out
*mbx_out
;
891 err
= qlcnic_sriov_validate_create_rx_ctx(cmd
);
893 cmd
->rsp
.arg
[0] |= (0x6 << 25);
897 cmd
->req
.arg
[6] = vf
->vp
->handle
;
898 err
= qlcnic_issue_cmd(adapter
, cmd
);
901 mbx_out
= (struct qlcnic_rcv_mbx_out
*)&cmd
->rsp
.arg
[1];
902 vf
->rx_ctx_id
= mbx_out
->ctx_id
;
903 qlcnic_83xx_cfg_default_mac_vlan(adapter
, vf
, QLCNIC_MAC_ADD
);
911 static int qlcnic_sriov_pf_mac_address_cmd(struct qlcnic_bc_trans
*trans
,
912 struct qlcnic_cmd_args
*cmd
)
914 struct qlcnic_vf_info
*vf
= trans
->vf
;
917 type
= cmd
->req
.arg
[1];
919 case QLCNIC_SET_STATION_MAC
:
920 case QLCNIC_SET_FAC_DEF_MAC
:
921 cmd
->rsp
.arg
[0] = (2 << 25);
923 case QLCNIC_GET_CURRENT_MAC
:
924 cmd
->rsp
.arg
[0] = (1 << 25);
926 cmd
->rsp
.arg
[2] = mac
[1] | ((mac
[0] << 8) & 0xff00);
927 cmd
->rsp
.arg
[1] = mac
[5] | ((mac
[4] << 8) & 0xff00) |
928 ((mac
[3]) << 16 & 0xff0000) |
929 ((mac
[2]) << 24 & 0xff000000);
935 static int qlcnic_sriov_validate_create_tx_ctx(struct qlcnic_cmd_args
*cmd
)
937 if ((cmd
->req
.arg
[0] >> 29) != 0x3)
943 static int qlcnic_sriov_pf_create_tx_ctx_cmd(struct qlcnic_bc_trans
*trans
,
944 struct qlcnic_cmd_args
*cmd
)
946 struct qlcnic_vf_info
*vf
= trans
->vf
;
947 struct qlcnic_adapter
*adapter
= vf
->adapter
;
948 struct qlcnic_tx_mbx_out
*mbx_out
;
951 err
= qlcnic_sriov_validate_create_tx_ctx(cmd
);
953 cmd
->rsp
.arg
[0] |= (0x6 << 25);
957 cmd
->req
.arg
[5] |= vf
->vp
->handle
<< 16;
958 err
= qlcnic_issue_cmd(adapter
, cmd
);
960 mbx_out
= (struct qlcnic_tx_mbx_out
*)&cmd
->rsp
.arg
[2];
961 vf
->tx_ctx_id
= mbx_out
->ctx_id
;
969 static int qlcnic_sriov_validate_del_rx_ctx(struct qlcnic_vf_info
*vf
,
970 struct qlcnic_cmd_args
*cmd
)
972 if ((cmd
->req
.arg
[0] >> 29) != 0x3)
975 if ((cmd
->req
.arg
[1] & 0xffff) != vf
->rx_ctx_id
)
981 static int qlcnic_sriov_pf_del_rx_ctx_cmd(struct qlcnic_bc_trans
*trans
,
982 struct qlcnic_cmd_args
*cmd
)
984 struct qlcnic_vf_info
*vf
= trans
->vf
;
985 struct qlcnic_adapter
*adapter
= vf
->adapter
;
988 err
= qlcnic_sriov_validate_del_rx_ctx(vf
, cmd
);
990 cmd
->rsp
.arg
[0] |= (0x6 << 25);
994 qlcnic_83xx_cfg_default_mac_vlan(adapter
, vf
, QLCNIC_MAC_DEL
);
995 cmd
->req
.arg
[1] |= vf
->vp
->handle
<< 16;
996 err
= qlcnic_issue_cmd(adapter
, cmd
);
1004 static int qlcnic_sriov_validate_del_tx_ctx(struct qlcnic_vf_info
*vf
,
1005 struct qlcnic_cmd_args
*cmd
)
1007 if ((cmd
->req
.arg
[0] >> 29) != 0x3)
1010 if ((cmd
->req
.arg
[1] & 0xffff) != vf
->tx_ctx_id
)
1016 static int qlcnic_sriov_pf_del_tx_ctx_cmd(struct qlcnic_bc_trans
*trans
,
1017 struct qlcnic_cmd_args
*cmd
)
1019 struct qlcnic_vf_info
*vf
= trans
->vf
;
1020 struct qlcnic_adapter
*adapter
= vf
->adapter
;
1023 err
= qlcnic_sriov_validate_del_tx_ctx(vf
, cmd
);
1025 cmd
->rsp
.arg
[0] |= (0x6 << 25);
1029 cmd
->req
.arg
[1] |= vf
->vp
->handle
<< 16;
1030 err
= qlcnic_issue_cmd(adapter
, cmd
);
1038 static int qlcnic_sriov_validate_cfg_lro(struct qlcnic_vf_info
*vf
,
1039 struct qlcnic_cmd_args
*cmd
)
1041 if ((cmd
->req
.arg
[1] >> 16) != vf
->rx_ctx_id
)
1047 static int qlcnic_sriov_pf_cfg_lro_cmd(struct qlcnic_bc_trans
*trans
,
1048 struct qlcnic_cmd_args
*cmd
)
1050 struct qlcnic_vf_info
*vf
= trans
->vf
;
1051 struct qlcnic_adapter
*adapter
= vf
->adapter
;
1054 err
= qlcnic_sriov_validate_cfg_lro(vf
, cmd
);
1056 cmd
->rsp
.arg
[0] |= (0x6 << 25);
1060 err
= qlcnic_issue_cmd(adapter
, cmd
);
1064 static int qlcnic_sriov_pf_cfg_ip_cmd(struct qlcnic_bc_trans
*trans
,
1065 struct qlcnic_cmd_args
*cmd
)
1067 struct qlcnic_vf_info
*vf
= trans
->vf
;
1068 struct qlcnic_adapter
*adapter
= vf
->adapter
;
1071 cmd
->req
.arg
[1] |= vf
->vp
->handle
<< 16;
1072 cmd
->req
.arg
[1] |= BIT_31
;
1074 err
= qlcnic_issue_cmd(adapter
, cmd
);
1078 static int qlcnic_sriov_validate_cfg_intrpt(struct qlcnic_vf_info
*vf
,
1079 struct qlcnic_cmd_args
*cmd
)
1081 if (((cmd
->req
.arg
[1] >> 8) & 0xff) != vf
->pci_func
)
1084 if (!(cmd
->req
.arg
[1] & BIT_16
))
1087 if ((cmd
->req
.arg
[1] & 0xff) != 0x1)
1093 static int qlcnic_sriov_pf_cfg_intrpt_cmd(struct qlcnic_bc_trans
*trans
,
1094 struct qlcnic_cmd_args
*cmd
)
1096 struct qlcnic_vf_info
*vf
= trans
->vf
;
1097 struct qlcnic_adapter
*adapter
= vf
->adapter
;
1100 err
= qlcnic_sriov_validate_cfg_intrpt(vf
, cmd
);
1102 cmd
->rsp
.arg
[0] |= (0x6 << 25);
1104 err
= qlcnic_issue_cmd(adapter
, cmd
);
1109 static int qlcnic_sriov_validate_mtu(struct qlcnic_adapter
*adapter
,
1110 struct qlcnic_vf_info
*vf
,
1111 struct qlcnic_cmd_args
*cmd
)
1113 if (cmd
->req
.arg
[1] != vf
->rx_ctx_id
)
1116 if (cmd
->req
.arg
[2] > adapter
->ahw
->max_mtu
)
1122 static int qlcnic_sriov_pf_set_mtu_cmd(struct qlcnic_bc_trans
*trans
,
1123 struct qlcnic_cmd_args
*cmd
)
1125 struct qlcnic_vf_info
*vf
= trans
->vf
;
1126 struct qlcnic_adapter
*adapter
= vf
->adapter
;
1129 err
= qlcnic_sriov_validate_mtu(adapter
, vf
, cmd
);
1131 cmd
->rsp
.arg
[0] |= (0x6 << 25);
1133 err
= qlcnic_issue_cmd(adapter
, cmd
);
1138 static int qlcnic_sriov_validate_get_nic_info(struct qlcnic_vf_info
*vf
,
1139 struct qlcnic_cmd_args
*cmd
)
1141 if (cmd
->req
.arg
[1] & BIT_31
) {
1142 if (((cmd
->req
.arg
[1] >> 16) & 0x7fff) != vf
->pci_func
)
1145 cmd
->req
.arg
[1] |= vf
->vp
->handle
<< 16;
1151 static int qlcnic_sriov_pf_get_nic_info_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_get_nic_info(vf
, cmd
);
1160 cmd
->rsp
.arg
[0] |= (0x6 << 25);
1164 err
= qlcnic_issue_cmd(adapter
, cmd
);
1168 static int qlcnic_sriov_validate_cfg_rss(struct qlcnic_vf_info
*vf
,
1169 struct qlcnic_cmd_args
*cmd
)
1171 if (cmd
->req
.arg
[1] != vf
->rx_ctx_id
)
1177 static int qlcnic_sriov_pf_cfg_rss_cmd(struct qlcnic_bc_trans
*trans
,
1178 struct qlcnic_cmd_args
*cmd
)
1180 struct qlcnic_vf_info
*vf
= trans
->vf
;
1181 struct qlcnic_adapter
*adapter
= vf
->adapter
;
1184 err
= qlcnic_sriov_validate_cfg_rss(vf
, cmd
);
1186 cmd
->rsp
.arg
[0] |= (0x6 << 25);
1188 err
= qlcnic_issue_cmd(adapter
, cmd
);
1193 static int qlcnic_sriov_validate_cfg_intrcoal(struct qlcnic_adapter
*adapter
,
1194 struct qlcnic_vf_info
*vf
,
1195 struct qlcnic_cmd_args
*cmd
)
1197 struct qlcnic_nic_intr_coalesce
*coal
= &adapter
->ahw
->coal
;
1198 u16 ctx_id
, pkts
, time
;
1202 type
= cmd
->req
.arg
[1] & QLC_INTR_COAL_TYPE_MASK
;
1203 ctx_id
= cmd
->req
.arg
[1] >> 16;
1204 pkts
= cmd
->req
.arg
[2] & 0xffff;
1205 time
= cmd
->req
.arg
[2] >> 16;
1208 case QLCNIC_INTR_COAL_TYPE_RX
:
1209 if (ctx_id
!= vf
->rx_ctx_id
|| pkts
> coal
->rx_packets
||
1210 time
< coal
->rx_time_us
)
1213 case QLCNIC_INTR_COAL_TYPE_TX
:
1214 if (ctx_id
!= vf
->tx_ctx_id
|| pkts
> coal
->tx_packets
||
1215 time
< coal
->tx_time_us
)
1219 netdev_err(adapter
->netdev
, "Invalid coalescing type 0x%x received\n",
1227 netdev_err(adapter
->netdev
, "Expected: rx_ctx_id 0x%x rx_packets 0x%x rx_time_us 0x%x tx_ctx_id 0x%x tx_packets 0x%x tx_time_us 0x%x\n",
1228 vf
->rx_ctx_id
, coal
->rx_packets
, coal
->rx_time_us
,
1229 vf
->tx_ctx_id
, coal
->tx_packets
, coal
->tx_time_us
);
1230 netdev_err(adapter
->netdev
, "Received: ctx_id 0x%x packets 0x%x time_us 0x%x type 0x%x\n",
1231 ctx_id
, pkts
, time
, type
);
1236 static int qlcnic_sriov_pf_cfg_intrcoal_cmd(struct qlcnic_bc_trans
*tran
,
1237 struct qlcnic_cmd_args
*cmd
)
1239 struct qlcnic_vf_info
*vf
= tran
->vf
;
1240 struct qlcnic_adapter
*adapter
= vf
->adapter
;
1243 err
= qlcnic_sriov_validate_cfg_intrcoal(adapter
, vf
, cmd
);
1245 cmd
->rsp
.arg
[0] |= (0x6 << 25);
1249 err
= qlcnic_issue_cmd(adapter
, cmd
);
1253 static int qlcnic_sriov_validate_cfg_macvlan(struct qlcnic_adapter
*adapter
,
1254 struct qlcnic_vf_info
*vf
,
1255 struct qlcnic_cmd_args
*cmd
)
1257 struct qlcnic_vport
*vp
= vf
->vp
;
1260 if (!(cmd
->req
.arg
[1] & BIT_8
))
1263 cmd
->req
.arg
[1] |= (vf
->vp
->handle
<< 16);
1264 cmd
->req
.arg
[1] |= BIT_31
;
1266 if (vp
->vlan_mode
== QLC_PVID_MODE
) {
1267 op
= cmd
->req
.arg
[1] & 0x7;
1268 cmd
->req
.arg
[1] &= ~0x7;
1269 new_op
= (op
== QLCNIC_MAC_ADD
|| op
== QLCNIC_MAC_VLAN_ADD
) ?
1270 QLCNIC_MAC_VLAN_ADD
: QLCNIC_MAC_VLAN_DEL
;
1271 cmd
->req
.arg
[3] |= vp
->pvid
<< 16;
1272 cmd
->req
.arg
[1] |= new_op
;
1278 static int qlcnic_sriov_pf_cfg_macvlan_cmd(struct qlcnic_bc_trans
*trans
,
1279 struct qlcnic_cmd_args
*cmd
)
1281 struct qlcnic_vf_info
*vf
= trans
->vf
;
1282 struct qlcnic_adapter
*adapter
= vf
->adapter
;
1285 err
= qlcnic_sriov_validate_cfg_macvlan(adapter
, vf
, cmd
);
1287 cmd
->rsp
.arg
[0] |= (0x6 << 25);
1291 err
= qlcnic_issue_cmd(adapter
, cmd
);
1295 static int qlcnic_sriov_validate_linkevent(struct qlcnic_vf_info
*vf
,
1296 struct qlcnic_cmd_args
*cmd
)
1298 if ((cmd
->req
.arg
[1] >> 16) != vf
->rx_ctx_id
)
1304 static int qlcnic_sriov_pf_linkevent_cmd(struct qlcnic_bc_trans
*trans
,
1305 struct qlcnic_cmd_args
*cmd
)
1307 struct qlcnic_vf_info
*vf
= trans
->vf
;
1308 struct qlcnic_adapter
*adapter
= vf
->adapter
;
1311 err
= qlcnic_sriov_validate_linkevent(vf
, cmd
);
1313 cmd
->rsp
.arg
[0] |= (0x6 << 25);
1317 err
= qlcnic_issue_cmd(adapter
, cmd
);
1321 static int qlcnic_sriov_pf_cfg_promisc_cmd(struct qlcnic_bc_trans
*trans
,
1322 struct qlcnic_cmd_args
*cmd
)
1324 struct qlcnic_vf_info
*vf
= trans
->vf
;
1325 struct qlcnic_adapter
*adapter
= vf
->adapter
;
1328 cmd
->req
.arg
[1] |= vf
->vp
->handle
<< 16;
1329 cmd
->req
.arg
[1] |= BIT_31
;
1330 err
= qlcnic_issue_cmd(adapter
, cmd
);
1334 static int qlcnic_sriov_pf_get_acl_cmd(struct qlcnic_bc_trans
*trans
,
1335 struct qlcnic_cmd_args
*cmd
)
1337 struct qlcnic_vf_info
*vf
= trans
->vf
;
1338 struct qlcnic_vport
*vp
= vf
->vp
;
1339 u8 mode
= vp
->vlan_mode
;
1340 struct qlcnic_adapter
*adapter
;
1341 struct qlcnic_sriov
*sriov
;
1343 adapter
= vf
->adapter
;
1344 sriov
= adapter
->ahw
->sriov
;
1346 cmd
->rsp
.arg
[0] |= 1 << 25;
1348 /* For 84xx adapter in case of PVID , PFD should send vlan mode as
1349 * QLC_NO_VLAN_MODE to VFD which is zero in mailbox response
1351 if (qlcnic_84xx_check(adapter
) && mode
== QLC_PVID_MODE
)
1355 case QLC_GUEST_VLAN_MODE
:
1356 cmd
->rsp
.arg
[1] = mode
| 1 << 8;
1357 cmd
->rsp
.arg
[2] = sriov
->num_allowed_vlans
<< 16;
1360 cmd
->rsp
.arg
[1] = mode
| 1 << 8 | vp
->pvid
<< 16;
1367 static int qlcnic_sriov_pf_del_guest_vlan(struct qlcnic_adapter
*adapter
,
1368 struct qlcnic_vf_info
*vf
,
1369 struct qlcnic_cmd_args
*cmd
)
1371 struct qlcnic_sriov
*sriov
= adapter
->ahw
->sriov
;
1374 if (!qlcnic_sriov_check_any_vlan(vf
))
1377 vlan
= cmd
->req
.arg
[1] >> 16;
1378 if (!vf
->rx_ctx_id
) {
1379 qlcnic_sriov_del_vlan_id(sriov
, vf
, vlan
);
1383 qlcnic_sriov_cfg_vf_def_mac(adapter
, vf
, vlan
, QLCNIC_MAC_DEL
);
1384 qlcnic_sriov_del_vlan_id(sriov
, vf
, vlan
);
1386 if (qlcnic_83xx_pf_check(adapter
))
1387 qlcnic_sriov_cfg_vf_def_mac(adapter
, vf
,
1392 static int qlcnic_sriov_pf_add_guest_vlan(struct qlcnic_adapter
*adapter
,
1393 struct qlcnic_vf_info
*vf
,
1394 struct qlcnic_cmd_args
*cmd
)
1396 struct qlcnic_sriov
*sriov
= adapter
->ahw
->sriov
;
1400 if (qlcnic_83xx_pf_check(adapter
) && qlcnic_sriov_check_any_vlan(vf
))
1403 vlan
= cmd
->req
.arg
[1] >> 16;
1405 if (!vf
->rx_ctx_id
) {
1406 qlcnic_sriov_add_vlan_id(sriov
, vf
, vlan
);
1410 if (qlcnic_83xx_pf_check(adapter
)) {
1411 err
= qlcnic_sriov_cfg_vf_def_mac(adapter
, vf
, 0,
1417 err
= qlcnic_sriov_cfg_vf_def_mac(adapter
, vf
, vlan
, QLCNIC_MAC_ADD
);
1420 if (qlcnic_83xx_pf_check(adapter
))
1421 qlcnic_sriov_cfg_vf_def_mac(adapter
, vf
, 0,
1426 qlcnic_sriov_add_vlan_id(sriov
, vf
, vlan
);
1430 static int qlcnic_sriov_pf_cfg_guest_vlan_cmd(struct qlcnic_bc_trans
*tran
,
1431 struct qlcnic_cmd_args
*cmd
)
1433 struct qlcnic_vf_info
*vf
= tran
->vf
;
1434 struct qlcnic_adapter
*adapter
= vf
->adapter
;
1435 struct qlcnic_vport
*vp
= vf
->vp
;
1439 if (vp
->vlan_mode
!= QLC_GUEST_VLAN_MODE
) {
1440 cmd
->rsp
.arg
[0] |= 2 << 25;
1444 op
= cmd
->req
.arg
[1] & 0xf;
1447 err
= qlcnic_sriov_pf_add_guest_vlan(adapter
, vf
, cmd
);
1449 err
= qlcnic_sriov_pf_del_guest_vlan(adapter
, vf
, cmd
);
1451 cmd
->rsp
.arg
[0] |= err
? 2 << 25 : 1 << 25;
1455 static const int qlcnic_pf_passthru_supp_cmds
[] = {
1456 QLCNIC_CMD_GET_STATISTICS
,
1457 QLCNIC_CMD_GET_PORT_CONFIG
,
1458 QLCNIC_CMD_GET_LINK_STATUS
,
1459 QLCNIC_CMD_INIT_NIC_FUNC
,
1460 QLCNIC_CMD_STOP_NIC_FUNC
,
1463 static const struct qlcnic_sriov_cmd_handler qlcnic_pf_bc_cmd_hdlr
[] = {
1464 [QLCNIC_BC_CMD_CHANNEL_INIT
] = {&qlcnic_sriov_pf_channel_cfg_cmd
},
1465 [QLCNIC_BC_CMD_CHANNEL_TERM
] = {&qlcnic_sriov_pf_channel_cfg_cmd
},
1466 [QLCNIC_BC_CMD_GET_ACL
] = {&qlcnic_sriov_pf_get_acl_cmd
},
1467 [QLCNIC_BC_CMD_CFG_GUEST_VLAN
] = {&qlcnic_sriov_pf_cfg_guest_vlan_cmd
},
1470 static const struct qlcnic_sriov_fw_cmd_handler qlcnic_pf_fw_cmd_hdlr
[] = {
1471 {QLCNIC_CMD_CREATE_RX_CTX
, qlcnic_sriov_pf_create_rx_ctx_cmd
},
1472 {QLCNIC_CMD_CREATE_TX_CTX
, qlcnic_sriov_pf_create_tx_ctx_cmd
},
1473 {QLCNIC_CMD_MAC_ADDRESS
, qlcnic_sriov_pf_mac_address_cmd
},
1474 {QLCNIC_CMD_DESTROY_RX_CTX
, qlcnic_sriov_pf_del_rx_ctx_cmd
},
1475 {QLCNIC_CMD_DESTROY_TX_CTX
, qlcnic_sriov_pf_del_tx_ctx_cmd
},
1476 {QLCNIC_CMD_CONFIGURE_HW_LRO
, qlcnic_sriov_pf_cfg_lro_cmd
},
1477 {QLCNIC_CMD_CONFIGURE_IP_ADDR
, qlcnic_sriov_pf_cfg_ip_cmd
},
1478 {QLCNIC_CMD_CONFIG_INTRPT
, qlcnic_sriov_pf_cfg_intrpt_cmd
},
1479 {QLCNIC_CMD_SET_MTU
, qlcnic_sriov_pf_set_mtu_cmd
},
1480 {QLCNIC_CMD_GET_NIC_INFO
, qlcnic_sriov_pf_get_nic_info_cmd
},
1481 {QLCNIC_CMD_CONFIGURE_RSS
, qlcnic_sriov_pf_cfg_rss_cmd
},
1482 {QLCNIC_CMD_CONFIG_INTR_COAL
, qlcnic_sriov_pf_cfg_intrcoal_cmd
},
1483 {QLCNIC_CMD_CONFIG_MAC_VLAN
, qlcnic_sriov_pf_cfg_macvlan_cmd
},
1484 {QLCNIC_CMD_GET_LINK_EVENT
, qlcnic_sriov_pf_linkevent_cmd
},
1485 {QLCNIC_CMD_CONFIGURE_MAC_RX_MODE
, qlcnic_sriov_pf_cfg_promisc_cmd
},
1488 void qlcnic_sriov_pf_process_bc_cmd(struct qlcnic_adapter
*adapter
,
1489 struct qlcnic_bc_trans
*trans
,
1490 struct qlcnic_cmd_args
*cmd
)
1494 cmd_op
= trans
->req_hdr
->cmd_op
;
1496 if (trans
->req_hdr
->op_type
== QLC_BC_CMD
) {
1497 size
= ARRAY_SIZE(qlcnic_pf_bc_cmd_hdlr
);
1498 if (cmd_op
< size
) {
1499 qlcnic_pf_bc_cmd_hdlr
[cmd_op
].fn(trans
, cmd
);
1504 size
= ARRAY_SIZE(qlcnic_pf_fw_cmd_hdlr
);
1505 for (i
= 0; i
< size
; i
++) {
1506 if (cmd_op
== qlcnic_pf_fw_cmd_hdlr
[i
].cmd
) {
1507 qlcnic_pf_fw_cmd_hdlr
[i
].fn(trans
, cmd
);
1512 size
= ARRAY_SIZE(qlcnic_pf_passthru_supp_cmds
);
1513 for (i
= 0; i
< size
; i
++) {
1514 if (cmd_op
== qlcnic_pf_passthru_supp_cmds
[i
]) {
1515 qlcnic_issue_cmd(adapter
, cmd
);
1521 cmd
->rsp
.arg
[0] |= (0x9 << 25);
1524 void qlcnic_pf_set_interface_id_create_rx_ctx(struct qlcnic_adapter
*adapter
,
1529 vpid
= qlcnic_sriov_pf_get_vport_handle(adapter
,
1530 adapter
->ahw
->pci_func
);
1534 void qlcnic_pf_set_interface_id_del_rx_ctx(struct qlcnic_adapter
*adapter
,
1539 vpid
= qlcnic_sriov_pf_get_vport_handle(adapter
,
1540 adapter
->ahw
->pci_func
);
1541 *int_id
|= vpid
<< 16;
1544 void qlcnic_pf_set_interface_id_create_tx_ctx(struct qlcnic_adapter
*adapter
,
1549 vpid
= qlcnic_sriov_pf_get_vport_handle(adapter
,
1550 adapter
->ahw
->pci_func
);
1551 *int_id
|= vpid
<< 16;
1554 void qlcnic_pf_set_interface_id_del_tx_ctx(struct qlcnic_adapter
*adapter
,
1559 vpid
= qlcnic_sriov_pf_get_vport_handle(adapter
,
1560 adapter
->ahw
->pci_func
);
1561 *int_id
|= vpid
<< 16;
1564 void qlcnic_pf_set_interface_id_promisc(struct qlcnic_adapter
*adapter
,
1569 vpid
= qlcnic_sriov_pf_get_vport_handle(adapter
,
1570 adapter
->ahw
->pci_func
);
1571 *int_id
|= (vpid
<< 16) | BIT_31
;
1574 void qlcnic_pf_set_interface_id_ipaddr(struct qlcnic_adapter
*adapter
,
1579 vpid
= qlcnic_sriov_pf_get_vport_handle(adapter
,
1580 adapter
->ahw
->pci_func
);
1581 *int_id
|= (vpid
<< 16) | BIT_31
;
1584 void qlcnic_pf_set_interface_id_macaddr(struct qlcnic_adapter
*adapter
,
1589 vpid
= qlcnic_sriov_pf_get_vport_handle(adapter
,
1590 adapter
->ahw
->pci_func
);
1591 *int_id
|= (vpid
<< 16) | BIT_31
;
1594 static void qlcnic_sriov_del_rx_ctx(struct qlcnic_adapter
*adapter
,
1595 struct qlcnic_vf_info
*vf
)
1597 struct qlcnic_cmd_args cmd
;
1603 if (qlcnic_alloc_mbx_args(&cmd
, adapter
, QLCNIC_CMD_DESTROY_RX_CTX
))
1606 vpid
= qlcnic_sriov_pf_get_vport_handle(adapter
, vf
->pci_func
);
1608 cmd
.req
.arg
[1] = vf
->rx_ctx_id
| (vpid
& 0xffff) << 16;
1609 if (qlcnic_issue_cmd(adapter
, &cmd
))
1610 dev_err(&adapter
->pdev
->dev
,
1611 "Failed to delete Tx ctx in firmware for func 0x%x\n",
1617 qlcnic_free_mbx_args(&cmd
);
1620 static void qlcnic_sriov_del_tx_ctx(struct qlcnic_adapter
*adapter
,
1621 struct qlcnic_vf_info
*vf
)
1623 struct qlcnic_cmd_args cmd
;
1629 if (qlcnic_alloc_mbx_args(&cmd
, adapter
, QLCNIC_CMD_DESTROY_TX_CTX
))
1632 vpid
= qlcnic_sriov_pf_get_vport_handle(adapter
, vf
->pci_func
);
1634 cmd
.req
.arg
[1] |= vf
->tx_ctx_id
| (vpid
& 0xffff) << 16;
1635 if (qlcnic_issue_cmd(adapter
, &cmd
))
1636 dev_err(&adapter
->pdev
->dev
,
1637 "Failed to delete Tx ctx in firmware for func 0x%x\n",
1643 qlcnic_free_mbx_args(&cmd
);
1646 static int qlcnic_sriov_add_act_list_irqsave(struct qlcnic_sriov
*sriov
,
1647 struct qlcnic_vf_info
*vf
,
1648 struct qlcnic_bc_trans
*trans
)
1650 struct qlcnic_trans_list
*t_list
= &vf
->rcv_act
;
1653 spin_lock_irqsave(&t_list
->lock
, flag
);
1655 __qlcnic_sriov_add_act_list(sriov
, vf
, trans
);
1657 spin_unlock_irqrestore(&t_list
->lock
, flag
);
1661 static void __qlcnic_sriov_process_flr(struct qlcnic_vf_info
*vf
)
1663 struct qlcnic_adapter
*adapter
= vf
->adapter
;
1665 qlcnic_sriov_cleanup_list(&vf
->rcv_pend
);
1666 cancel_work_sync(&vf
->trans_work
);
1667 qlcnic_sriov_cleanup_list(&vf
->rcv_act
);
1669 if (test_bit(QLC_BC_VF_SOFT_FLR
, &vf
->state
)) {
1670 qlcnic_sriov_del_tx_ctx(adapter
, vf
);
1671 qlcnic_sriov_del_rx_ctx(adapter
, vf
);
1674 qlcnic_sriov_pf_config_vport(adapter
, 0, vf
->pci_func
);
1676 clear_bit(QLC_BC_VF_FLR
, &vf
->state
);
1677 if (test_bit(QLC_BC_VF_SOFT_FLR
, &vf
->state
)) {
1678 qlcnic_sriov_add_act_list_irqsave(adapter
->ahw
->sriov
, vf
,
1680 clear_bit(QLC_BC_VF_SOFT_FLR
, &vf
->state
);
1681 vf
->flr_trans
= NULL
;
1685 static void qlcnic_sriov_pf_process_flr(struct work_struct
*work
)
1687 struct qlcnic_vf_info
*vf
;
1689 vf
= container_of(work
, struct qlcnic_vf_info
, flr_work
);
1690 __qlcnic_sriov_process_flr(vf
);
1694 static void qlcnic_sriov_schedule_flr(struct qlcnic_sriov
*sriov
,
1695 struct qlcnic_vf_info
*vf
,
1698 if (test_bit(__QLCNIC_RESETTING
, &vf
->adapter
->state
))
1701 INIT_WORK(&vf
->flr_work
, func
);
1702 queue_work(sriov
->bc
.bc_flr_wq
, &vf
->flr_work
);
1705 static void qlcnic_sriov_handle_soft_flr(struct qlcnic_adapter
*adapter
,
1706 struct qlcnic_bc_trans
*trans
,
1707 struct qlcnic_vf_info
*vf
)
1709 struct qlcnic_sriov
*sriov
= adapter
->ahw
->sriov
;
1711 set_bit(QLC_BC_VF_FLR
, &vf
->state
);
1712 clear_bit(QLC_BC_VF_STATE
, &vf
->state
);
1713 set_bit(QLC_BC_VF_SOFT_FLR
, &vf
->state
);
1714 vf
->flr_trans
= trans
;
1715 qlcnic_sriov_schedule_flr(sriov
, vf
, qlcnic_sriov_pf_process_flr
);
1716 netdev_info(adapter
->netdev
, "Software FLR for PCI func %d\n",
1720 bool qlcnic_sriov_soft_flr_check(struct qlcnic_adapter
*adapter
,
1721 struct qlcnic_bc_trans
*trans
,
1722 struct qlcnic_vf_info
*vf
)
1724 struct qlcnic_bc_hdr
*hdr
= trans
->req_hdr
;
1726 if ((hdr
->cmd_op
== QLCNIC_BC_CMD_CHANNEL_INIT
) &&
1727 (hdr
->op_type
== QLC_BC_CMD
) &&
1728 test_bit(QLC_BC_VF_STATE
, &vf
->state
)) {
1729 qlcnic_sriov_handle_soft_flr(adapter
, trans
, vf
);
1736 void qlcnic_sriov_pf_handle_flr(struct qlcnic_sriov
*sriov
,
1737 struct qlcnic_vf_info
*vf
)
1739 struct net_device
*dev
= vf
->adapter
->netdev
;
1740 struct qlcnic_vport
*vp
= vf
->vp
;
1742 if (!test_and_clear_bit(QLC_BC_VF_STATE
, &vf
->state
)) {
1743 clear_bit(QLC_BC_VF_FLR
, &vf
->state
);
1747 if (test_and_set_bit(QLC_BC_VF_FLR
, &vf
->state
)) {
1748 netdev_info(dev
, "FLR for PCI func %d in progress\n",
1753 if (vp
->vlan_mode
== QLC_GUEST_VLAN_MODE
)
1754 memset(vf
->sriov_vlans
, 0,
1755 sizeof(*vf
->sriov_vlans
) * sriov
->num_allowed_vlans
);
1757 qlcnic_sriov_schedule_flr(sriov
, vf
, qlcnic_sriov_pf_process_flr
);
1758 netdev_info(dev
, "FLR received for PCI func %d\n", vf
->pci_func
);
1761 void qlcnic_sriov_pf_reset(struct qlcnic_adapter
*adapter
)
1763 struct qlcnic_hardware_context
*ahw
= adapter
->ahw
;
1764 struct qlcnic_sriov
*sriov
= ahw
->sriov
;
1765 struct qlcnic_vf_info
*vf
;
1766 u16 num_vfs
= sriov
->num_vfs
;
1769 for (i
= 0; i
< num_vfs
; i
++) {
1770 vf
= &sriov
->vf_info
[i
];
1773 cancel_work_sync(&vf
->flr_work
);
1774 __qlcnic_sriov_process_flr(vf
);
1775 clear_bit(QLC_BC_VF_STATE
, &vf
->state
);
1778 qlcnic_sriov_pf_reset_vport_handle(adapter
, ahw
->pci_func
);
1779 QLCWRX(ahw
, QLCNIC_MBX_INTR_ENBL
, (ahw
->num_msix
- 1) << 8);
1782 int qlcnic_sriov_pf_reinit(struct qlcnic_adapter
*adapter
)
1784 struct qlcnic_hardware_context
*ahw
= adapter
->ahw
;
1787 if (!qlcnic_sriov_enable_check(adapter
))
1790 ahw
->op_mode
= QLCNIC_SRIOV_PF_FUNC
;
1792 err
= qlcnic_sriov_pf_init(adapter
);
1796 dev_info(&adapter
->pdev
->dev
, "%s: op_mode %d\n",
1797 __func__
, ahw
->op_mode
);
1801 int qlcnic_sriov_set_vf_mac(struct net_device
*netdev
, int vf
, u8
*mac
)
1803 struct qlcnic_adapter
*adapter
= netdev_priv(netdev
);
1804 struct qlcnic_sriov
*sriov
= adapter
->ahw
->sriov
;
1806 struct qlcnic_vf_info
*vf_info
;
1809 if (!qlcnic_sriov_pf_check(adapter
))
1812 num_vfs
= sriov
->num_vfs
;
1814 if (!is_valid_ether_addr(mac
) || vf
>= num_vfs
)
1817 if (ether_addr_equal(adapter
->mac_addr
, mac
)) {
1818 netdev_err(netdev
, "MAC address is already in use by the PF\n");
1822 for (i
= 0; i
< num_vfs
; i
++) {
1823 vf_info
= &sriov
->vf_info
[i
];
1824 if (ether_addr_equal(vf_info
->vp
->mac
, mac
)) {
1826 "MAC address is already in use by VF %d\n",
1832 vf_info
= &sriov
->vf_info
[vf
];
1833 curr_mac
= vf_info
->vp
->mac
;
1835 if (test_bit(QLC_BC_VF_STATE
, &vf_info
->state
)) {
1837 "MAC address change failed for VF %d, as VF driver is loaded. Please unload VF driver and retry the operation\n",
1842 memcpy(curr_mac
, mac
, netdev
->addr_len
);
1843 netdev_info(netdev
, "MAC Address %pM is configured for VF %d\n",
1848 int qlcnic_sriov_set_vf_tx_rate(struct net_device
*netdev
, int vf
,
1849 int min_tx_rate
, int max_tx_rate
)
1851 struct qlcnic_adapter
*adapter
= netdev_priv(netdev
);
1852 struct qlcnic_sriov
*sriov
= adapter
->ahw
->sriov
;
1853 struct qlcnic_vf_info
*vf_info
;
1854 struct qlcnic_info nic_info
;
1855 struct qlcnic_vport
*vp
;
1858 if (!qlcnic_sriov_pf_check(adapter
))
1861 if (vf
>= sriov
->num_vfs
)
1864 vf_info
= &sriov
->vf_info
[vf
];
1869 min_tx_rate
= QLC_VF_MIN_TX_RATE
;
1872 (max_tx_rate
>= 10000 || max_tx_rate
< min_tx_rate
)) {
1874 "Invalid max Tx rate, allowed range is [%d - %d]",
1875 min_tx_rate
, QLC_VF_MAX_TX_RATE
);
1880 max_tx_rate
= 10000;
1883 (min_tx_rate
> max_tx_rate
|| min_tx_rate
< QLC_VF_MIN_TX_RATE
)) {
1885 "Invalid min Tx rate, allowed range is [%d - %d]",
1886 QLC_VF_MIN_TX_RATE
, max_tx_rate
);
1890 if (test_bit(QLC_BC_VF_STATE
, &vf_info
->state
)) {
1891 if (qlcnic_sriov_get_vf_vport_info(adapter
, &nic_info
, vpid
))
1894 nic_info
.max_tx_bw
= max_tx_rate
/ 100;
1895 nic_info
.min_tx_bw
= min_tx_rate
/ 100;
1896 nic_info
.bit_offsets
= BIT_0
;
1898 if (qlcnic_sriov_pf_set_vport_info(adapter
, &nic_info
, vpid
))
1902 vp
->max_tx_bw
= max_tx_rate
/ 100;
1904 "Setting Max Tx rate %d (Mbps), %d %% of PF bandwidth, for VF %d\n",
1905 max_tx_rate
, vp
->max_tx_bw
, vf
);
1906 vp
->min_tx_bw
= min_tx_rate
/ 100;
1908 "Setting Min Tx rate %d (Mbps), %d %% of PF bandwidth, for VF %d\n",
1909 min_tx_rate
, vp
->min_tx_bw
, vf
);
1913 int qlcnic_sriov_set_vf_vlan(struct net_device
*netdev
, int vf
,
1914 u16 vlan
, u8 qos
, __be16 vlan_proto
)
1916 struct qlcnic_adapter
*adapter
= netdev_priv(netdev
);
1917 struct qlcnic_sriov
*sriov
= adapter
->ahw
->sriov
;
1918 struct qlcnic_vf_info
*vf_info
;
1919 struct qlcnic_vport
*vp
;
1921 if (!qlcnic_sriov_pf_check(adapter
))
1924 if (vf
>= sriov
->num_vfs
|| qos
> 7)
1927 if (vlan_proto
!= htons(ETH_P_8021Q
))
1928 return -EPROTONOSUPPORT
;
1930 if (vlan
> MAX_VLAN_ID
) {
1932 "Invalid VLAN ID, allowed range is [0 - %d]\n",
1937 vf_info
= &sriov
->vf_info
[vf
];
1939 if (test_bit(QLC_BC_VF_STATE
, &vf_info
->state
)) {
1941 "VLAN change failed for VF %d, as VF driver is loaded. Please unload VF driver and retry the operation\n",
1946 memset(vf_info
->sriov_vlans
, 0,
1947 sizeof(*vf_info
->sriov_vlans
) * sriov
->num_allowed_vlans
);
1951 vp
->vlan_mode
= QLC_GUEST_VLAN_MODE
;
1954 vp
->vlan_mode
= QLC_NO_VLAN_MODE
;
1958 vp
->vlan_mode
= QLC_PVID_MODE
;
1959 qlcnic_sriov_add_vlan_id(sriov
, vf_info
, vlan
);
1964 netdev_info(netdev
, "Setting VLAN %d, QoS %d, for VF %d\n",
1969 static __u32
qlcnic_sriov_get_vf_vlan(struct qlcnic_adapter
*adapter
,
1970 struct qlcnic_vport
*vp
, int vf
)
1974 switch (vp
->vlan_mode
) {
1978 case QLC_GUEST_VLAN_MODE
:
1981 case QLC_NO_VLAN_MODE
:
1985 netdev_info(adapter
->netdev
, "Invalid VLAN mode = %d for VF %d\n",
1992 int qlcnic_sriov_get_vf_config(struct net_device
*netdev
,
1993 int vf
, struct ifla_vf_info
*ivi
)
1995 struct qlcnic_adapter
*adapter
= netdev_priv(netdev
);
1996 struct qlcnic_sriov
*sriov
= adapter
->ahw
->sriov
;
1997 struct qlcnic_vport
*vp
;
1999 if (!qlcnic_sriov_pf_check(adapter
))
2002 if (vf
>= sriov
->num_vfs
)
2005 vp
= sriov
->vf_info
[vf
].vp
;
2006 memcpy(&ivi
->mac
, vp
->mac
, ETH_ALEN
);
2007 ivi
->vlan
= qlcnic_sriov_get_vf_vlan(adapter
, vp
, vf
);
2009 ivi
->spoofchk
= vp
->spoofchk
;
2010 if (vp
->max_tx_bw
== MAX_BW
)
2011 ivi
->max_tx_rate
= 0;
2013 ivi
->max_tx_rate
= vp
->max_tx_bw
* 100;
2014 if (vp
->min_tx_bw
== MIN_BW
)
2015 ivi
->min_tx_rate
= 0;
2017 ivi
->min_tx_rate
= vp
->min_tx_bw
* 100;
2023 int qlcnic_sriov_set_vf_spoofchk(struct net_device
*netdev
, int vf
, bool chk
)
2025 struct qlcnic_adapter
*adapter
= netdev_priv(netdev
);
2026 struct qlcnic_sriov
*sriov
= adapter
->ahw
->sriov
;
2027 struct qlcnic_vf_info
*vf_info
;
2028 struct qlcnic_vport
*vp
;
2030 if (!qlcnic_sriov_pf_check(adapter
))
2033 if (vf
>= sriov
->num_vfs
)
2036 vf_info
= &sriov
->vf_info
[vf
];
2038 if (test_bit(QLC_BC_VF_STATE
, &vf_info
->state
)) {
2040 "Spoof check change failed for VF %d, as VF driver is loaded. Please unload VF driver and retry the operation\n",