Commit | Line | Data |
---|---|---|
1f4d4ed6 | 1 | /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) */ |
32a47e72 | 2 | /* QLogic qed NIC Driver |
e8f1cb50 | 3 | * Copyright (c) 2015-2017 QLogic Corporation |
32a47e72 YM |
4 | */ |
5 | ||
6 | #ifndef _QED_VF_H | |
7 | #define _QED_VF_H | |
8 | ||
dacd88d6 | 9 | #include "qed_l2.h" |
36558c3d | 10 | #include "qed_mcp.h" |
dacd88d6 YM |
11 | |
12 | #define T_ETH_INDIRECTION_TABLE_SIZE 128 | |
13 | #define T_ETH_RSS_KEY_SIZE 10 | |
14 | ||
1408cc1f YM |
15 | struct vf_pf_resc_request { |
16 | u8 num_rxqs; | |
17 | u8 num_txqs; | |
18 | u8 num_sbs; | |
19 | u8 num_mac_filters; | |
20 | u8 num_vlan_filters; | |
21 | u8 num_mc_filters; | |
08bc8f15 MY |
22 | u8 num_cids; |
23 | u8 padding; | |
1408cc1f YM |
24 | }; |
25 | ||
26 | struct hw_sb_info { | |
27 | u16 hw_sb_id; | |
28 | u8 sb_qid; | |
29 | u8 padding[5]; | |
30 | }; | |
31 | ||
dacd88d6 YM |
32 | #define TLV_BUFFER_SIZE 1024 |
33 | ||
37bff2b9 YM |
34 | enum { |
35 | PFVF_STATUS_WAITING, | |
36 | PFVF_STATUS_SUCCESS, | |
37 | PFVF_STATUS_FAILURE, | |
38 | PFVF_STATUS_NOT_SUPPORTED, | |
39 | PFVF_STATUS_NO_RESOURCE, | |
40 | PFVF_STATUS_FORCED, | |
7eff82b0 | 41 | PFVF_STATUS_MALICIOUS, |
37bff2b9 YM |
42 | }; |
43 | ||
44 | /* vf pf channel tlvs */ | |
45 | /* general tlv header (used for both vf->pf request and pf->vf response) */ | |
46 | struct channel_tlv { | |
47 | u16 type; | |
48 | u16 length; | |
49 | }; | |
50 | ||
51 | /* header of first vf->pf tlv carries the offset used to calculate reponse | |
52 | * buffer address | |
53 | */ | |
54 | struct vfpf_first_tlv { | |
55 | struct channel_tlv tl; | |
56 | u32 padding; | |
57 | u64 reply_address; | |
58 | }; | |
59 | ||
60 | /* header of pf->vf tlvs, carries the status of handling the request */ | |
61 | struct pfvf_tlv { | |
62 | struct channel_tlv tl; | |
63 | u8 status; | |
64 | u8 padding[3]; | |
65 | }; | |
66 | ||
67 | /* response tlv used for most tlvs */ | |
68 | struct pfvf_def_resp_tlv { | |
69 | struct pfvf_tlv hdr; | |
70 | }; | |
71 | ||
72 | /* used to terminate and pad a tlv list */ | |
73 | struct channel_list_end_tlv { | |
74 | struct channel_tlv tl; | |
75 | u8 padding[4]; | |
76 | }; | |
77 | ||
1408cc1f YM |
78 | #define VFPF_ACQUIRE_OS_LINUX (0) |
79 | #define VFPF_ACQUIRE_OS_WINDOWS (1) | |
80 | #define VFPF_ACQUIRE_OS_ESX (2) | |
81 | #define VFPF_ACQUIRE_OS_SOLARIS (3) | |
82 | #define VFPF_ACQUIRE_OS_LINUX_USERSPACE (4) | |
83 | ||
84 | struct vfpf_acquire_tlv { | |
85 | struct vfpf_first_tlv first_tlv; | |
86 | ||
87 | struct vf_pf_vfdev_info { | |
a044df83 | 88 | #define VFPF_ACQUIRE_CAP_PRE_FP_HSI (1 << 0) /* VF pre-FP hsi version */ |
1408cc1f | 89 | #define VFPF_ACQUIRE_CAP_100G (1 << 1) /* VF can support 100g */ |
08bc8f15 MY |
90 | /* A requirement for supporting multi-Tx queues on a single queue-zone, |
91 | * VF would pass qids as additional information whenever passing queue | |
92 | * references. | |
93 | */ | |
94 | #define VFPF_ACQUIRE_CAP_QUEUE_QIDS BIT(2) | |
1a850bfc MY |
95 | |
96 | /* The VF is using the physical bar. While this is mostly internal | |
97 | * to the VF, might affect the number of CIDs supported assuming | |
98 | * QUEUE_QIDS is set. | |
99 | */ | |
100 | #define VFPF_ACQUIRE_CAP_PHYSICAL_BAR BIT(3) | |
1408cc1f YM |
101 | u64 capabilities; |
102 | u8 fw_major; | |
103 | u8 fw_minor; | |
104 | u8 fw_revision; | |
105 | u8 fw_engineering; | |
106 | u32 driver_version; | |
107 | u16 opaque_fid; /* ME register value */ | |
108 | u8 os_type; /* VFPF_ACQUIRE_OS_* value */ | |
1fe614d1 YM |
109 | u8 eth_fp_hsi_major; |
110 | u8 eth_fp_hsi_minor; | |
111 | u8 padding[3]; | |
1408cc1f YM |
112 | } vfdev_info; |
113 | ||
114 | struct vf_pf_resc_request resc_request; | |
115 | ||
116 | u64 bulletin_addr; | |
117 | u32 bulletin_size; | |
118 | u32 padding; | |
119 | }; | |
120 | ||
dacd88d6 YM |
121 | /* receive side scaling tlv */ |
122 | struct vfpf_vport_update_rss_tlv { | |
123 | struct channel_tlv tl; | |
124 | ||
125 | u8 update_rss_flags; | |
126 | #define VFPF_UPDATE_RSS_CONFIG_FLAG BIT(0) | |
127 | #define VFPF_UPDATE_RSS_CAPS_FLAG BIT(1) | |
128 | #define VFPF_UPDATE_RSS_IND_TABLE_FLAG BIT(2) | |
129 | #define VFPF_UPDATE_RSS_KEY_FLAG BIT(3) | |
130 | ||
131 | u8 rss_enable; | |
132 | u8 rss_caps; | |
133 | u8 rss_table_size_log; /* The table size is 2 ^ rss_table_size_log */ | |
134 | u16 rss_ind_table[T_ETH_INDIRECTION_TABLE_SIZE]; | |
135 | u32 rss_key[T_ETH_RSS_KEY_SIZE]; | |
136 | }; | |
137 | ||
1408cc1f YM |
138 | struct pfvf_storm_stats { |
139 | u32 address; | |
140 | u32 len; | |
141 | }; | |
142 | ||
143 | struct pfvf_stats_info { | |
144 | struct pfvf_storm_stats mstats; | |
145 | struct pfvf_storm_stats pstats; | |
146 | struct pfvf_storm_stats tstats; | |
147 | struct pfvf_storm_stats ustats; | |
148 | }; | |
149 | ||
150 | struct pfvf_acquire_resp_tlv { | |
151 | struct pfvf_tlv hdr; | |
152 | ||
153 | struct pf_vf_pfdev_info { | |
154 | u32 chip_num; | |
155 | u32 mfw_ver; | |
156 | ||
157 | u16 fw_major; | |
158 | u16 fw_minor; | |
159 | u16 fw_rev; | |
160 | u16 fw_eng; | |
161 | ||
162 | u64 capabilities; | |
163 | #define PFVF_ACQUIRE_CAP_DEFAULT_UNTAGGED BIT(0) | |
164 | #define PFVF_ACQUIRE_CAP_100G BIT(1) /* If set, 100g PF */ | |
165 | /* There are old PF versions where the PF might mistakenly override the sanity | |
166 | * mechanism [version-based] and allow a VF that can't be supported to pass | |
167 | * the acquisition phase. | |
168 | * To overcome this, PFs now indicate that they're past that point and the new | |
169 | * VFs would fail probe on the older PFs that fail to do so. | |
170 | */ | |
171 | #define PFVF_ACQUIRE_CAP_POST_FW_OVERRIDE BIT(2) | |
172 | ||
08bc8f15 MY |
173 | /* PF expects queues to be received with additional qids */ |
174 | #define PFVF_ACQUIRE_CAP_QUEUE_QIDS BIT(3) | |
175 | ||
1408cc1f YM |
176 | u16 db_size; |
177 | u8 indices_per_sb; | |
178 | u8 os_type; | |
179 | ||
180 | /* These should match the PF's qed_dev values */ | |
181 | u16 chip_rev; | |
182 | u8 dev_type; | |
183 | ||
1a850bfc MY |
184 | /* Doorbell bar size configured in HW: log(size) or 0 */ |
185 | u8 bar_size; | |
1408cc1f YM |
186 | |
187 | struct pfvf_stats_info stats_info; | |
188 | ||
189 | u8 port_mac[ETH_ALEN]; | |
1fe614d1 YM |
190 | |
191 | /* It's possible PF had to configure an older fastpath HSI | |
192 | * [in case VF is newer than PF]. This is communicated back | |
193 | * to the VF. It can also be used in case of error due to | |
194 | * non-matching versions to shed light in VF about failure. | |
195 | */ | |
196 | u8 major_fp_hsi; | |
197 | u8 minor_fp_hsi; | |
1408cc1f YM |
198 | } pfdev_info; |
199 | ||
200 | struct pf_vf_resc { | |
201 | #define PFVF_MAX_QUEUES_PER_VF 16 | |
202 | #define PFVF_MAX_SBS_PER_VF 16 | |
203 | struct hw_sb_info hw_sbs[PFVF_MAX_SBS_PER_VF]; | |
204 | u8 hw_qid[PFVF_MAX_QUEUES_PER_VF]; | |
205 | u8 cid[PFVF_MAX_QUEUES_PER_VF]; | |
206 | ||
207 | u8 num_rxqs; | |
208 | u8 num_txqs; | |
209 | u8 num_sbs; | |
210 | u8 num_mac_filters; | |
211 | u8 num_vlan_filters; | |
212 | u8 num_mc_filters; | |
08bc8f15 MY |
213 | u8 num_cids; |
214 | u8 padding; | |
1408cc1f YM |
215 | } resc; |
216 | ||
217 | u32 bulletin_size; | |
218 | u32 padding; | |
219 | }; | |
220 | ||
dacd88d6 YM |
221 | struct pfvf_start_queue_resp_tlv { |
222 | struct pfvf_tlv hdr; | |
223 | u32 offset; /* offset to consumer/producer of queue */ | |
224 | u8 padding[4]; | |
225 | }; | |
226 | ||
08bc8f15 MY |
227 | /* Extended queue information - additional index for reference inside qzone. |
228 | * If commmunicated between VF/PF, each TLV relating to queues should be | |
229 | * extended by one such [or have a future base TLV that already contains info]. | |
230 | */ | |
231 | struct vfpf_qid_tlv { | |
232 | struct channel_tlv tl; | |
233 | u8 qid; | |
234 | u8 padding[3]; | |
235 | }; | |
236 | ||
dacd88d6 YM |
237 | /* Setup Queue */ |
238 | struct vfpf_start_rxq_tlv { | |
239 | struct vfpf_first_tlv first_tlv; | |
240 | ||
241 | /* physical addresses */ | |
242 | u64 rxq_addr; | |
243 | u64 deprecated_sge_addr; | |
244 | u64 cqe_pbl_addr; | |
245 | ||
246 | u16 cqe_pbl_size; | |
247 | u16 hw_sb; | |
248 | u16 rx_qid; | |
249 | u16 hc_rate; /* desired interrupts per sec. */ | |
250 | ||
251 | u16 bd_max_bytes; | |
252 | u16 stat_id; | |
253 | u8 sb_index; | |
254 | u8 padding[3]; | |
255 | }; | |
256 | ||
257 | struct vfpf_start_txq_tlv { | |
258 | struct vfpf_first_tlv first_tlv; | |
259 | ||
260 | /* physical addresses */ | |
261 | u64 pbl_addr; | |
262 | u16 pbl_size; | |
263 | u16 stat_id; | |
264 | u16 tx_qid; | |
265 | u16 hw_sb; | |
266 | ||
267 | u32 flags; /* VFPF_QUEUE_FLG_X flags */ | |
268 | u16 hc_rate; /* desired interrupts per sec. */ | |
269 | u8 sb_index; | |
270 | u8 padding[3]; | |
271 | }; | |
272 | ||
273 | /* Stop RX Queue */ | |
274 | struct vfpf_stop_rxqs_tlv { | |
275 | struct vfpf_first_tlv first_tlv; | |
276 | ||
277 | u16 rx_qid; | |
4c4fa793 MY |
278 | |
279 | /* this field is deprecated and should *always* be set to '1' */ | |
dacd88d6 YM |
280 | u8 num_rxqs; |
281 | u8 cqe_completion; | |
282 | u8 padding[4]; | |
283 | }; | |
284 | ||
285 | /* Stop TX Queues */ | |
286 | struct vfpf_stop_txqs_tlv { | |
287 | struct vfpf_first_tlv first_tlv; | |
288 | ||
289 | u16 tx_qid; | |
4c4fa793 MY |
290 | |
291 | /* this field is deprecated and should *always* be set to '1' */ | |
dacd88d6 YM |
292 | u8 num_txqs; |
293 | u8 padding[5]; | |
294 | }; | |
295 | ||
296 | struct vfpf_update_rxq_tlv { | |
297 | struct vfpf_first_tlv first_tlv; | |
298 | ||
299 | u64 deprecated_sge_addr[PFVF_MAX_QUEUES_PER_VF]; | |
300 | ||
301 | u16 rx_qid; | |
302 | u8 num_rxqs; | |
303 | u8 flags; | |
304 | #define VFPF_RXQ_UPD_INIT_SGE_DEPRECATE_FLAG BIT(0) | |
305 | #define VFPF_RXQ_UPD_COMPLETE_CQE_FLAG BIT(1) | |
306 | #define VFPF_RXQ_UPD_COMPLETE_EVENT_FLAG BIT(2) | |
307 | ||
308 | u8 padding[4]; | |
309 | }; | |
310 | ||
311 | /* Set Queue Filters */ | |
312 | struct vfpf_q_mac_vlan_filter { | |
313 | u32 flags; | |
314 | #define VFPF_Q_FILTER_DEST_MAC_VALID 0x01 | |
315 | #define VFPF_Q_FILTER_VLAN_TAG_VALID 0x02 | |
316 | #define VFPF_Q_FILTER_SET_MAC 0x100 /* set/clear */ | |
317 | ||
318 | u8 mac[ETH_ALEN]; | |
319 | u16 vlan_tag; | |
320 | ||
321 | u8 padding[4]; | |
322 | }; | |
323 | ||
324 | /* Start a vport */ | |
325 | struct vfpf_vport_start_tlv { | |
326 | struct vfpf_first_tlv first_tlv; | |
327 | ||
328 | u64 sb_addr[PFVF_MAX_SBS_PER_VF]; | |
329 | ||
330 | u32 tpa_mode; | |
331 | u16 dep1; | |
332 | u16 mtu; | |
333 | ||
334 | u8 vport_id; | |
335 | u8 inner_vlan_removal; | |
336 | ||
337 | u8 only_untagged; | |
338 | u8 max_buffers_per_cqe; | |
339 | ||
340 | u8 padding[4]; | |
341 | }; | |
342 | ||
343 | /* Extended tlvs - need to add rss, mcast, accept mode tlvs */ | |
344 | struct vfpf_vport_update_activate_tlv { | |
345 | struct channel_tlv tl; | |
346 | u8 update_rx; | |
347 | u8 update_tx; | |
348 | u8 active_rx; | |
349 | u8 active_tx; | |
350 | }; | |
351 | ||
17b235c1 YM |
352 | struct vfpf_vport_update_tx_switch_tlv { |
353 | struct channel_tlv tl; | |
354 | u8 tx_switching; | |
355 | u8 padding[3]; | |
356 | }; | |
357 | ||
358 | struct vfpf_vport_update_vlan_strip_tlv { | |
359 | struct channel_tlv tl; | |
360 | u8 remove_vlan; | |
361 | u8 padding[3]; | |
362 | }; | |
363 | ||
dacd88d6 YM |
364 | struct vfpf_vport_update_mcast_bin_tlv { |
365 | struct channel_tlv tl; | |
366 | u8 padding[4]; | |
367 | ||
25c020a9 SRK |
368 | /* There are only 256 approx bins, and in HSI they're divided into |
369 | * 32-bit values. As old VFs used to set-bit to the values on its side, | |
370 | * the upper half of the array is never expected to contain any data. | |
371 | */ | |
372 | u64 bins[4]; | |
373 | u64 obsolete_bins[4]; | |
dacd88d6 YM |
374 | }; |
375 | ||
376 | struct vfpf_vport_update_accept_param_tlv { | |
377 | struct channel_tlv tl; | |
378 | u8 update_rx_mode; | |
379 | u8 update_tx_mode; | |
380 | u8 rx_accept_filter; | |
381 | u8 tx_accept_filter; | |
382 | }; | |
383 | ||
17b235c1 YM |
384 | struct vfpf_vport_update_accept_any_vlan_tlv { |
385 | struct channel_tlv tl; | |
386 | u8 update_accept_any_vlan_flg; | |
387 | u8 accept_any_vlan; | |
388 | ||
389 | u8 padding[2]; | |
390 | }; | |
391 | ||
392 | struct vfpf_vport_update_sge_tpa_tlv { | |
393 | struct channel_tlv tl; | |
394 | ||
395 | u16 sge_tpa_flags; | |
396 | #define VFPF_TPA_IPV4_EN_FLAG BIT(0) | |
397 | #define VFPF_TPA_IPV6_EN_FLAG BIT(1) | |
398 | #define VFPF_TPA_PKT_SPLIT_FLAG BIT(2) | |
399 | #define VFPF_TPA_HDR_DATA_SPLIT_FLAG BIT(3) | |
400 | #define VFPF_TPA_GRO_CONSIST_FLAG BIT(4) | |
401 | ||
402 | u8 update_sge_tpa_flags; | |
403 | #define VFPF_UPDATE_SGE_DEPRECATED_FLAG BIT(0) | |
404 | #define VFPF_UPDATE_TPA_EN_FLAG BIT(1) | |
405 | #define VFPF_UPDATE_TPA_PARAM_FLAG BIT(2) | |
406 | ||
407 | u8 max_buffers_per_cqe; | |
408 | ||
409 | u16 deprecated_sge_buff_size; | |
410 | u16 tpa_max_size; | |
411 | u16 tpa_min_size_to_start; | |
412 | u16 tpa_min_size_to_cont; | |
413 | ||
414 | u8 tpa_max_aggs_num; | |
415 | u8 padding[7]; | |
416 | }; | |
417 | ||
dacd88d6 YM |
418 | /* Primary tlv as a header for various extended tlvs for |
419 | * various functionalities in vport update ramrod. | |
420 | */ | |
421 | struct vfpf_vport_update_tlv { | |
422 | struct vfpf_first_tlv first_tlv; | |
423 | }; | |
424 | ||
425 | struct vfpf_ucast_filter_tlv { | |
426 | struct vfpf_first_tlv first_tlv; | |
427 | ||
428 | u8 opcode; | |
429 | u8 type; | |
430 | ||
431 | u8 mac[ETH_ALEN]; | |
432 | ||
433 | u16 vlan; | |
434 | u16 padding[3]; | |
435 | }; | |
436 | ||
eaf3c0c6 CM |
437 | /* tunnel update param tlv */ |
438 | struct vfpf_update_tunn_param_tlv { | |
439 | struct vfpf_first_tlv first_tlv; | |
440 | ||
441 | u8 tun_mode_update_mask; | |
442 | u8 tunn_mode; | |
443 | u8 update_tun_cls; | |
444 | u8 vxlan_clss; | |
445 | u8 l2gre_clss; | |
446 | u8 ipgre_clss; | |
447 | u8 l2geneve_clss; | |
448 | u8 ipgeneve_clss; | |
449 | u8 update_geneve_port; | |
450 | u8 update_vxlan_port; | |
451 | u16 geneve_port; | |
452 | u16 vxlan_port; | |
453 | u8 padding[2]; | |
454 | }; | |
455 | ||
456 | struct pfvf_update_tunn_param_tlv { | |
457 | struct pfvf_tlv hdr; | |
458 | ||
459 | u16 tunn_feature_mask; | |
460 | u8 vxlan_mode; | |
461 | u8 l2geneve_mode; | |
462 | u8 ipgeneve_mode; | |
463 | u8 l2gre_mode; | |
464 | u8 ipgre_mode; | |
465 | u8 vxlan_clss; | |
466 | u8 l2gre_clss; | |
467 | u8 ipgre_clss; | |
468 | u8 l2geneve_clss; | |
469 | u8 ipgeneve_clss; | |
470 | u16 vxlan_udp_port; | |
471 | u16 geneve_udp_port; | |
472 | }; | |
473 | ||
32a47e72 YM |
474 | struct tlv_buffer_size { |
475 | u8 tlv_buffer[TLV_BUFFER_SIZE]; | |
476 | }; | |
477 | ||
477f2d14 RV |
478 | struct vfpf_update_coalesce { |
479 | struct vfpf_first_tlv first_tlv; | |
480 | u16 rx_coal; | |
481 | u16 tx_coal; | |
482 | u16 qid; | |
483 | u8 padding[2]; | |
484 | }; | |
bf5a94bf RV |
485 | |
486 | struct vfpf_read_coal_req_tlv { | |
487 | struct vfpf_first_tlv first_tlv; | |
488 | u16 qid; | |
489 | u8 is_rx; | |
490 | u8 padding[5]; | |
491 | }; | |
492 | ||
493 | struct pfvf_read_coal_resp_tlv { | |
494 | struct pfvf_tlv hdr; | |
495 | u16 coal; | |
496 | u8 padding[6]; | |
497 | }; | |
498 | ||
809c45a0 SS |
499 | struct vfpf_bulletin_update_mac_tlv { |
500 | struct vfpf_first_tlv first_tlv; | |
501 | u8 mac[ETH_ALEN]; | |
502 | u8 padding[2]; | |
503 | }; | |
504 | ||
32a47e72 | 505 | union vfpf_tlvs { |
37bff2b9 | 506 | struct vfpf_first_tlv first_tlv; |
1408cc1f | 507 | struct vfpf_acquire_tlv acquire; |
dacd88d6 YM |
508 | struct vfpf_start_rxq_tlv start_rxq; |
509 | struct vfpf_start_txq_tlv start_txq; | |
510 | struct vfpf_stop_rxqs_tlv stop_rxqs; | |
511 | struct vfpf_stop_txqs_tlv stop_txqs; | |
17b235c1 | 512 | struct vfpf_update_rxq_tlv update_rxq; |
dacd88d6 YM |
513 | struct vfpf_vport_start_tlv start_vport; |
514 | struct vfpf_vport_update_tlv vport_update; | |
515 | struct vfpf_ucast_filter_tlv ucast_filter; | |
eaf3c0c6 | 516 | struct vfpf_update_tunn_param_tlv tunn_param_update; |
477f2d14 | 517 | struct vfpf_update_coalesce update_coalesce; |
bf5a94bf | 518 | struct vfpf_read_coal_req_tlv read_coal_req; |
809c45a0 | 519 | struct vfpf_bulletin_update_mac_tlv bulletin_update_mac; |
32a47e72 YM |
520 | struct tlv_buffer_size tlv_buf_size; |
521 | }; | |
522 | ||
523 | union pfvf_tlvs { | |
37bff2b9 | 524 | struct pfvf_def_resp_tlv default_resp; |
1408cc1f | 525 | struct pfvf_acquire_resp_tlv acquire_resp; |
32a47e72 | 526 | struct tlv_buffer_size tlv_buf_size; |
dacd88d6 | 527 | struct pfvf_start_queue_resp_tlv queue_start; |
eaf3c0c6 | 528 | struct pfvf_update_tunn_param_tlv tunn_param_resp; |
bf5a94bf | 529 | struct pfvf_read_coal_resp_tlv read_coal_resp; |
32a47e72 YM |
530 | }; |
531 | ||
08feecd7 | 532 | enum qed_bulletin_bit { |
eff16960 YM |
533 | /* Alert the VF that a forced MAC was set by the PF */ |
534 | MAC_ADDR_FORCED = 0, | |
08feecd7 YM |
535 | /* Alert the VF that a forced VLAN was set by the PF */ |
536 | VLAN_ADDR_FORCED = 2, | |
537 | ||
538 | /* Indicate that `default_only_untagged' contains actual data */ | |
539 | VFPF_BULLETIN_UNTAGGED_DEFAULT = 3, | |
540 | VFPF_BULLETIN_UNTAGGED_DEFAULT_FORCED = 4, | |
541 | ||
eff16960 YM |
542 | /* Alert the VF that suggested mac was sent by the PF. |
543 | * MAC_ADDR will be disabled in case MAC_ADDR_FORCED is set. | |
544 | */ | |
545 | VFPF_BULLETIN_MAC_ADDR = 5 | |
08feecd7 YM |
546 | }; |
547 | ||
32a47e72 YM |
548 | struct qed_bulletin_content { |
549 | /* crc of structure to ensure is not in mid-update */ | |
550 | u32 crc; | |
551 | ||
552 | u32 version; | |
553 | ||
554 | /* bitmap indicating which fields hold valid values */ | |
555 | u64 valid_bitmap; | |
36558c3d YM |
556 | |
557 | /* used for MAC_ADDR or MAC_ADDR_FORCED */ | |
558 | u8 mac[ETH_ALEN]; | |
559 | ||
560 | /* If valid, 1 => only untagged Rx if no vlan is configured */ | |
561 | u8 default_only_untagged; | |
562 | u8 padding; | |
563 | ||
564 | /* The following is a 'copy' of qed_mcp_link_state, | |
565 | * qed_mcp_link_params and qed_mcp_link_capabilities. Since it's | |
566 | * possible the structs will increase further along the road we cannot | |
567 | * have it here; Instead we need to have all of its fields. | |
568 | */ | |
569 | u8 req_autoneg; | |
570 | u8 req_autoneg_pause; | |
571 | u8 req_forced_rx; | |
572 | u8 req_forced_tx; | |
573 | u8 padding2[4]; | |
574 | ||
575 | u32 req_adv_speed; | |
576 | u32 req_forced_speed; | |
577 | u32 req_loopback; | |
578 | u32 padding3; | |
579 | ||
580 | u8 link_up; | |
581 | u8 full_duplex; | |
582 | u8 autoneg; | |
583 | u8 autoneg_complete; | |
584 | u8 parallel_detection; | |
585 | u8 pfc_enabled; | |
586 | u8 partner_tx_flow_ctrl_en; | |
587 | u8 partner_rx_flow_ctrl_en; | |
588 | u8 partner_adv_pause; | |
589 | u8 sfp_tx_fault; | |
97379f15 CM |
590 | u16 vxlan_udp_port; |
591 | u16 geneve_udp_port; | |
592 | u8 padding4[2]; | |
36558c3d YM |
593 | |
594 | u32 speed; | |
595 | u32 partner_adv_speed; | |
596 | ||
597 | u32 capability_speed; | |
08feecd7 YM |
598 | |
599 | /* Forced vlan */ | |
600 | u16 pvid; | |
601 | u16 padding5; | |
32a47e72 YM |
602 | }; |
603 | ||
604 | struct qed_bulletin { | |
605 | dma_addr_t phys; | |
606 | struct qed_bulletin_content *p_virt; | |
607 | u32 size; | |
608 | }; | |
609 | ||
37bff2b9 YM |
610 | enum { |
611 | CHANNEL_TLV_NONE, /* ends tlv sequence */ | |
1408cc1f | 612 | CHANNEL_TLV_ACQUIRE, |
dacd88d6 YM |
613 | CHANNEL_TLV_VPORT_START, |
614 | CHANNEL_TLV_VPORT_UPDATE, | |
615 | CHANNEL_TLV_VPORT_TEARDOWN, | |
616 | CHANNEL_TLV_START_RXQ, | |
617 | CHANNEL_TLV_START_TXQ, | |
618 | CHANNEL_TLV_STOP_RXQS, | |
619 | CHANNEL_TLV_STOP_TXQS, | |
17b235c1 | 620 | CHANNEL_TLV_UPDATE_RXQ, |
0b55e27d YM |
621 | CHANNEL_TLV_INT_CLEANUP, |
622 | CHANNEL_TLV_CLOSE, | |
623 | CHANNEL_TLV_RELEASE, | |
37bff2b9 | 624 | CHANNEL_TLV_LIST_END, |
dacd88d6 YM |
625 | CHANNEL_TLV_UCAST_FILTER, |
626 | CHANNEL_TLV_VPORT_UPDATE_ACTIVATE, | |
17b235c1 YM |
627 | CHANNEL_TLV_VPORT_UPDATE_TX_SWITCH, |
628 | CHANNEL_TLV_VPORT_UPDATE_VLAN_STRIP, | |
dacd88d6 YM |
629 | CHANNEL_TLV_VPORT_UPDATE_MCAST, |
630 | CHANNEL_TLV_VPORT_UPDATE_ACCEPT_PARAM, | |
631 | CHANNEL_TLV_VPORT_UPDATE_RSS, | |
17b235c1 YM |
632 | CHANNEL_TLV_VPORT_UPDATE_ACCEPT_ANY_VLAN, |
633 | CHANNEL_TLV_VPORT_UPDATE_SGE_TPA, | |
eaf3c0c6 | 634 | CHANNEL_TLV_UPDATE_TUNN_PARAM, |
477f2d14 | 635 | CHANNEL_TLV_COALESCE_UPDATE, |
08bc8f15 | 636 | CHANNEL_TLV_QID, |
bf5a94bf | 637 | CHANNEL_TLV_COALESCE_READ, |
809c45a0 | 638 | CHANNEL_TLV_BULLETIN_UPDATE_MAC, |
dacd88d6 YM |
639 | CHANNEL_TLV_MAX, |
640 | ||
641 | /* Required for iterating over vport-update tlvs. | |
642 | * Will break in case non-sequential vport-update tlvs. | |
643 | */ | |
17b235c1 | 644 | CHANNEL_TLV_VPORT_UPDATE_MAX = CHANNEL_TLV_VPORT_UPDATE_SGE_TPA + 1, |
37bff2b9 YM |
645 | }; |
646 | ||
08bc8f15 MY |
647 | /* Default number of CIDs [total of both Rx and Tx] to be requested |
648 | * by default, and maximum possible number. | |
649 | */ | |
650 | #define QED_ETH_VF_DEFAULT_NUM_CIDS (32) | |
651 | #define QED_ETH_VF_MAX_NUM_CIDS (250) | |
652 | ||
1408cc1f YM |
653 | /* This data is held in the qed_hwfn structure for VFs only. */ |
654 | struct qed_vf_iov { | |
655 | union vfpf_tlvs *vf2pf_request; | |
656 | dma_addr_t vf2pf_request_phys; | |
657 | union pfvf_tlvs *pf2vf_reply; | |
658 | dma_addr_t pf2vf_reply_phys; | |
659 | ||
660 | /* Should be taken whenever the mailbox buffers are accessed */ | |
661 | struct mutex mutex; | |
662 | u8 *offset; | |
663 | ||
664 | /* Bulletin Board */ | |
665 | struct qed_bulletin bulletin; | |
666 | struct qed_bulletin_content bulletin_shadow; | |
667 | ||
668 | /* we set aside a copy of the acquire response */ | |
669 | struct pfvf_acquire_resp_tlv acquire_resp; | |
d8c2c7e3 YM |
670 | |
671 | /* In case PF originates prior to the fp-hsi version comparison, | |
672 | * this has to be propagated as it affects the fastpath. | |
673 | */ | |
674 | bool b_pre_fp_hsi; | |
50a20714 MY |
675 | |
676 | /* Current day VFs are passing the SBs physical address on vport | |
677 | * start, and as they lack an IGU mapping they need to store the | |
678 | * addresses of previously registered SBs. | |
679 | * Even if we were to change configuration flow, due to backward | |
680 | * compatibility [with older PFs] we'd still need to store these. | |
681 | */ | |
682 | struct qed_sb_info *sbs_info[PFVF_MAX_SBS_PER_VF]; | |
1a850bfc MY |
683 | |
684 | /* Determines whether VF utilizes doorbells via limited register | |
685 | * bar or via the doorbell bar. | |
686 | */ | |
687 | bool b_doorbell_bar; | |
1408cc1f YM |
688 | }; |
689 | ||
477f2d14 | 690 | /** |
19198e4e PK |
691 | * qed_vf_pf_set_coalesce(): VF - Set Rx/Tx coalesce per VF's relative queue. |
692 | * Coalesce value '0' will omit the | |
693 | * configuration. | |
477f2d14 | 694 | * |
19198e4e PK |
695 | * @p_hwfn: HW device data. |
696 | * @rx_coal: coalesce value in micro second for rx queue. | |
697 | * @tx_coal: coalesce value in micro second for tx queue. | |
698 | * @p_cid: queue cid. | |
699 | * | |
700 | * Return: Int. | |
477f2d14 RV |
701 | * |
702 | **/ | |
703 | int qed_vf_pf_set_coalesce(struct qed_hwfn *p_hwfn, | |
704 | u16 rx_coal, | |
705 | u16 tx_coal, struct qed_queue_cid *p_cid); | |
706 | ||
bf5a94bf | 707 | /** |
19198e4e | 708 | * qed_vf_pf_get_coalesce(): VF - Get coalesce per VF's relative queue. |
bf5a94bf | 709 | * |
19198e4e PK |
710 | * @p_hwfn: HW device data. |
711 | * @p_coal: coalesce value in micro second for VF queues. | |
712 | * @p_cid: queue cid. | |
bf5a94bf | 713 | * |
19198e4e | 714 | * Return: Int. |
bf5a94bf RV |
715 | **/ |
716 | int qed_vf_pf_get_coalesce(struct qed_hwfn *p_hwfn, | |
717 | u16 *p_coal, struct qed_queue_cid *p_cid); | |
718 | ||
1408cc1f | 719 | #ifdef CONFIG_QED_SRIOV |
36558c3d | 720 | /** |
19198e4e | 721 | * qed_vf_read_bulletin(): Read the VF bulletin and act on it if needed. |
36558c3d | 722 | * |
19198e4e PK |
723 | * @p_hwfn: HW device data. |
724 | * @p_change: qed fills 1 iff bulletin board has changed, 0 otherwise. | |
36558c3d | 725 | * |
19198e4e | 726 | * Return: enum _qed_status. |
36558c3d YM |
727 | */ |
728 | int qed_vf_read_bulletin(struct qed_hwfn *p_hwfn, u8 *p_change); | |
729 | ||
730 | /** | |
19198e4e PK |
731 | * qed_vf_get_link_params(): Get link parameters for VF from qed |
732 | * | |
733 | * @p_hwfn: HW device data. | |
734 | * @params: the link params structure to be filled for the VF. | |
36558c3d | 735 | * |
19198e4e | 736 | * Return: Void. |
36558c3d YM |
737 | */ |
738 | void qed_vf_get_link_params(struct qed_hwfn *p_hwfn, | |
739 | struct qed_mcp_link_params *params); | |
740 | ||
741 | /** | |
19198e4e PK |
742 | * qed_vf_get_link_state(): Get link state for VF from qed. |
743 | * | |
744 | * @p_hwfn: HW device data. | |
745 | * @link: the link state structure to be filled for the VF | |
36558c3d | 746 | * |
19198e4e | 747 | * Return: Void. |
36558c3d YM |
748 | */ |
749 | void qed_vf_get_link_state(struct qed_hwfn *p_hwfn, | |
750 | struct qed_mcp_link_state *link); | |
751 | ||
752 | /** | |
19198e4e | 753 | * qed_vf_get_link_caps(): Get link capabilities for VF from qed. |
36558c3d | 754 | * |
19198e4e PK |
755 | * @p_hwfn: HW device data. |
756 | * @p_link_caps: the link capabilities structure to be filled for the VF | |
757 | * | |
758 | * Return: Void. | |
36558c3d YM |
759 | */ |
760 | void qed_vf_get_link_caps(struct qed_hwfn *p_hwfn, | |
761 | struct qed_mcp_link_capabilities *p_link_caps); | |
762 | ||
1408cc1f | 763 | /** |
19198e4e PK |
764 | * qed_vf_get_num_rxqs(): Get number of Rx queues allocated for VF by qed |
765 | * | |
766 | * @p_hwfn: HW device data. | |
767 | * @num_rxqs: allocated RX queues | |
1408cc1f | 768 | * |
19198e4e | 769 | * Return: Void. |
1408cc1f YM |
770 | */ |
771 | void qed_vf_get_num_rxqs(struct qed_hwfn *p_hwfn, u8 *num_rxqs); | |
772 | ||
0db711bb | 773 | /** |
19198e4e | 774 | * qed_vf_get_num_txqs(): Get number of Rx queues allocated for VF by qed |
0db711bb | 775 | * |
19198e4e PK |
776 | * @p_hwfn: HW device data. |
777 | * @num_txqs: allocated RX queues | |
778 | * | |
779 | * Return: Void. | |
0db711bb MY |
780 | */ |
781 | void qed_vf_get_num_txqs(struct qed_hwfn *p_hwfn, u8 *num_txqs); | |
782 | ||
cbb8a12c | 783 | /** |
19198e4e PK |
784 | * qed_vf_get_num_cids(): Get number of available connections |
785 | * [both Rx and Tx] for VF | |
786 | * | |
787 | * @p_hwfn: HW device data. | |
788 | * @num_cids: allocated number of connections | |
cbb8a12c | 789 | * |
19198e4e | 790 | * Return: Void. |
cbb8a12c MY |
791 | */ |
792 | void qed_vf_get_num_cids(struct qed_hwfn *p_hwfn, u8 *num_cids); | |
793 | ||
1408cc1f | 794 | /** |
19198e4e | 795 | * qed_vf_get_port_mac(): Get port mac address for VF. |
1408cc1f | 796 | * |
19198e4e PK |
797 | * @p_hwfn: HW device data. |
798 | * @port_mac: destination location for port mac | |
799 | * | |
800 | * Return: Void. | |
1408cc1f YM |
801 | */ |
802 | void qed_vf_get_port_mac(struct qed_hwfn *p_hwfn, u8 *port_mac); | |
803 | ||
804 | /** | |
19198e4e PK |
805 | * qed_vf_get_num_vlan_filters(): Get number of VLAN filters allocated |
806 | * for VF by qed. | |
807 | * | |
808 | * @p_hwfn: HW device data. | |
809 | * @num_vlan_filters: allocated VLAN filters | |
1408cc1f | 810 | * |
19198e4e | 811 | * Return: Void. |
1408cc1f YM |
812 | */ |
813 | void qed_vf_get_num_vlan_filters(struct qed_hwfn *p_hwfn, | |
814 | u8 *num_vlan_filters); | |
815 | ||
b0fca312 | 816 | /** |
19198e4e PK |
817 | * qed_vf_get_num_mac_filters(): Get number of MAC filters allocated |
818 | * for VF by qed | |
b0fca312 | 819 | * |
19198e4e PK |
820 | * @p_hwfn: HW device data. |
821 | * @num_mac_filters: allocated MAC filters | |
822 | * | |
823 | * Return: Void. | |
b0fca312 MY |
824 | */ |
825 | void qed_vf_get_num_mac_filters(struct qed_hwfn *p_hwfn, u8 *num_mac_filters); | |
826 | ||
eff16960 | 827 | /** |
19198e4e | 828 | * qed_vf_check_mac(): Check if VF can set a MAC address |
eff16960 | 829 | * |
19198e4e PK |
830 | * @p_hwfn: HW device data. |
831 | * @mac: Mac. | |
eff16960 | 832 | * |
19198e4e | 833 | * Return: bool. |
eff16960 YM |
834 | */ |
835 | bool qed_vf_check_mac(struct qed_hwfn *p_hwfn, u8 *mac); | |
836 | ||
1408cc1f | 837 | /** |
19198e4e PK |
838 | * qed_vf_get_fw_version(): Set firmware version information |
839 | * in dev_info from VFs acquire response tlv | |
840 | * | |
841 | * @p_hwfn: HW device data. | |
842 | * @fw_major: FW major. | |
843 | * @fw_minor: FW minor. | |
844 | * @fw_rev: FW rev. | |
845 | * @fw_eng: FW eng. | |
1408cc1f | 846 | * |
19198e4e | 847 | * Return: Void. |
1408cc1f YM |
848 | */ |
849 | void qed_vf_get_fw_version(struct qed_hwfn *p_hwfn, | |
850 | u16 *fw_major, u16 *fw_minor, | |
851 | u16 *fw_rev, u16 *fw_eng); | |
852 | ||
853 | /** | |
19198e4e | 854 | * qed_vf_hw_prepare(): hw preparation for VF sends ACQUIRE message |
1408cc1f | 855 | * |
19198e4e | 856 | * @p_hwfn: HW device data. |
1408cc1f | 857 | * |
19198e4e | 858 | * Return: Int. |
1408cc1f YM |
859 | */ |
860 | int qed_vf_hw_prepare(struct qed_hwfn *p_hwfn); | |
861 | ||
dacd88d6 | 862 | /** |
19198e4e PK |
863 | * qed_vf_pf_rxq_start(): start the RX Queue by sending a message to the PF |
864 | * | |
865 | * @p_hwfn: HW device data. | |
866 | * @p_cid: Only relative fields are relevant | |
867 | * @bd_max_bytes: maximum number of bytes per bd | |
868 | * @bd_chain_phys_addr: physical address of bd chain | |
869 | * @cqe_pbl_addr: physical address of pbl | |
870 | * @cqe_pbl_size: pbl size | |
871 | * @pp_prod: pointer to the producer to be used in fastpath | |
dacd88d6 | 872 | * |
19198e4e | 873 | * Return: Int. |
dacd88d6 YM |
874 | */ |
875 | int qed_vf_pf_rxq_start(struct qed_hwfn *p_hwfn, | |
3da7a37a | 876 | struct qed_queue_cid *p_cid, |
dacd88d6 YM |
877 | u16 bd_max_bytes, |
878 | dma_addr_t bd_chain_phys_addr, | |
879 | dma_addr_t cqe_pbl_addr, | |
880 | u16 cqe_pbl_size, void __iomem **pp_prod); | |
881 | ||
882 | /** | |
19198e4e PK |
883 | * qed_vf_pf_txq_start(): VF - start the TX queue by sending a message to the |
884 | * PF. | |
dacd88d6 | 885 | * |
19198e4e PK |
886 | * @p_hwfn: HW device data. |
887 | * @p_cid: CID. | |
888 | * @pbl_addr: PBL address. | |
889 | * @pbl_size: PBL Size. | |
890 | * @pp_doorbell: pointer to address to which to write the doorbell too. | |
dacd88d6 | 891 | * |
19198e4e | 892 | * Return: Int. |
dacd88d6 | 893 | */ |
3da7a37a MY |
894 | int |
895 | qed_vf_pf_txq_start(struct qed_hwfn *p_hwfn, | |
896 | struct qed_queue_cid *p_cid, | |
897 | dma_addr_t pbl_addr, | |
898 | u16 pbl_size, void __iomem **pp_doorbell); | |
dacd88d6 YM |
899 | |
900 | /** | |
19198e4e | 901 | * qed_vf_pf_rxq_stop(): VF - stop the RX queue by sending a message to the PF. |
dacd88d6 | 902 | * |
19198e4e PK |
903 | * @p_hwfn: HW device data. |
904 | * @p_cid: CID. | |
905 | * @cqe_completion: CQE Completion. | |
dacd88d6 | 906 | * |
19198e4e | 907 | * Return: Int. |
dacd88d6 YM |
908 | */ |
909 | int qed_vf_pf_rxq_stop(struct qed_hwfn *p_hwfn, | |
3da7a37a | 910 | struct qed_queue_cid *p_cid, bool cqe_completion); |
dacd88d6 YM |
911 | |
912 | /** | |
19198e4e | 913 | * qed_vf_pf_txq_stop(): VF - stop the TX queue by sending a message to the PF. |
dacd88d6 | 914 | * |
19198e4e PK |
915 | * @p_hwfn: HW device data. |
916 | * @p_cid: CID. | |
dacd88d6 | 917 | * |
19198e4e | 918 | * Return: Int. |
dacd88d6 | 919 | */ |
3da7a37a | 920 | int qed_vf_pf_txq_stop(struct qed_hwfn *p_hwfn, struct qed_queue_cid *p_cid); |
dacd88d6 YM |
921 | |
922 | /** | |
19198e4e | 923 | * qed_vf_pf_vport_update(): VF - send a vport update command. |
dacd88d6 | 924 | * |
19198e4e PK |
925 | * @p_hwfn: HW device data. |
926 | * @p_params: Params | |
dacd88d6 | 927 | * |
19198e4e | 928 | * Return: Int. |
dacd88d6 YM |
929 | */ |
930 | int qed_vf_pf_vport_update(struct qed_hwfn *p_hwfn, | |
931 | struct qed_sp_vport_update_params *p_params); | |
932 | ||
0b55e27d | 933 | /** |
19198e4e | 934 | * qed_vf_pf_reset(): VF - send a close message to PF. |
0b55e27d | 935 | * |
19198e4e | 936 | * @p_hwfn: HW device data. |
0b55e27d | 937 | * |
19198e4e | 938 | * Return: enum _qed_status |
0b55e27d YM |
939 | */ |
940 | int qed_vf_pf_reset(struct qed_hwfn *p_hwfn); | |
941 | ||
942 | /** | |
19198e4e | 943 | * qed_vf_pf_release(): VF - free vf`s memories. |
0b55e27d | 944 | * |
19198e4e | 945 | * @p_hwfn: HW device data. |
0b55e27d | 946 | * |
19198e4e | 947 | * Return: enum _qed_status |
0b55e27d YM |
948 | */ |
949 | int qed_vf_pf_release(struct qed_hwfn *p_hwfn); | |
36558c3d | 950 | |
1408cc1f | 951 | /** |
19198e4e | 952 | * qed_vf_get_igu_sb_id(): Get the IGU SB ID for a given |
1408cc1f YM |
953 | * sb_id. For VFs igu sbs don't have to be contiguous |
954 | * | |
19198e4e PK |
955 | * @p_hwfn: HW device data. |
956 | * @sb_id: SB ID. | |
1408cc1f | 957 | * |
19198e4e | 958 | * Return: INLINE u16 |
1408cc1f YM |
959 | */ |
960 | u16 qed_vf_get_igu_sb_id(struct qed_hwfn *p_hwfn, u16 sb_id); | |
0b55e27d | 961 | |
50a20714 | 962 | /** |
19198e4e PK |
963 | * qed_vf_set_sb_info(): Stores [or removes] a configured sb_info. |
964 | * | |
965 | * @p_hwfn: HW device data. | |
966 | * @sb_id: zero-based SB index [for fastpath] | |
967 | * @p_sb: may be NULL [during removal]. | |
50a20714 | 968 | * |
19198e4e | 969 | * Return: Void. |
50a20714 MY |
970 | */ |
971 | void qed_vf_set_sb_info(struct qed_hwfn *p_hwfn, | |
972 | u16 sb_id, struct qed_sb_info *p_sb); | |
973 | ||
dacd88d6 | 974 | /** |
19198e4e | 975 | * qed_vf_pf_vport_start(): perform vport start for VF. |
dacd88d6 | 976 | * |
19198e4e PK |
977 | * @p_hwfn: HW device data. |
978 | * @vport_id: Vport ID. | |
979 | * @mtu: MTU. | |
980 | * @inner_vlan_removal: Innter VLAN removal. | |
981 | * @tpa_mode: TPA mode | |
982 | * @max_buffers_per_cqe: Max buffer pre CQE. | |
983 | * @only_untagged: default behavior regarding vlan acceptance | |
dacd88d6 | 984 | * |
19198e4e | 985 | * Return: enum _qed_status |
dacd88d6 YM |
986 | */ |
987 | int qed_vf_pf_vport_start(struct qed_hwfn *p_hwfn, | |
988 | u8 vport_id, | |
989 | u16 mtu, | |
990 | u8 inner_vlan_removal, | |
991 | enum qed_tpa_mode tpa_mode, | |
08feecd7 | 992 | u8 max_buffers_per_cqe, u8 only_untagged); |
dacd88d6 YM |
993 | |
994 | /** | |
19198e4e | 995 | * qed_vf_pf_vport_stop(): stop the VF's vport |
dacd88d6 | 996 | * |
19198e4e | 997 | * @p_hwfn: HW device data. |
dacd88d6 | 998 | * |
19198e4e | 999 | * Return: enum _qed_status |
dacd88d6 YM |
1000 | */ |
1001 | int qed_vf_pf_vport_stop(struct qed_hwfn *p_hwfn); | |
1002 | ||
1003 | int qed_vf_pf_filter_ucast(struct qed_hwfn *p_hwfn, | |
1004 | struct qed_filter_ucast *p_param); | |
1005 | ||
1006 | void qed_vf_pf_filter_mcast(struct qed_hwfn *p_hwfn, | |
1007 | struct qed_filter_mcast *p_filter_cmd); | |
1008 | ||
0b55e27d | 1009 | /** |
19198e4e | 1010 | * qed_vf_pf_int_cleanup(): clean the SB of the VF |
0b55e27d | 1011 | * |
19198e4e | 1012 | * @p_hwfn: HW device data. |
0b55e27d | 1013 | * |
19198e4e | 1014 | * Return: enum _qed_status |
0b55e27d YM |
1015 | */ |
1016 | int qed_vf_pf_int_cleanup(struct qed_hwfn *p_hwfn); | |
36558c3d YM |
1017 | |
1018 | /** | |
19198e4e | 1019 | * __qed_vf_get_link_params(): return the link params in a given bulletin board |
36558c3d | 1020 | * |
19198e4e PK |
1021 | * @p_hwfn: HW device data. |
1022 | * @p_params: pointer to a struct to fill with link params | |
1023 | * @p_bulletin: Bulletin. | |
1024 | * | |
1025 | * Return: Void. | |
36558c3d YM |
1026 | */ |
1027 | void __qed_vf_get_link_params(struct qed_hwfn *p_hwfn, | |
1028 | struct qed_mcp_link_params *p_params, | |
1029 | struct qed_bulletin_content *p_bulletin); | |
1030 | ||
1031 | /** | |
19198e4e PK |
1032 | * __qed_vf_get_link_state(): return the link state in a given bulletin board |
1033 | * | |
1034 | * @p_hwfn: HW device data. | |
1035 | * @p_link: pointer to a struct to fill with link state | |
1036 | * @p_bulletin: Bulletin. | |
36558c3d | 1037 | * |
19198e4e | 1038 | * Return: Void. |
36558c3d YM |
1039 | */ |
1040 | void __qed_vf_get_link_state(struct qed_hwfn *p_hwfn, | |
1041 | struct qed_mcp_link_state *p_link, | |
1042 | struct qed_bulletin_content *p_bulletin); | |
1043 | ||
1044 | /** | |
19198e4e PK |
1045 | * __qed_vf_get_link_caps(): return the link capabilities in a given |
1046 | * bulletin board | |
36558c3d | 1047 | * |
19198e4e PK |
1048 | * @p_hwfn: HW device data. |
1049 | * @p_link_caps: pointer to a struct to fill with link capabilities | |
1050 | * @p_bulletin: Bulletin. | |
1051 | * | |
1052 | * Return: Void. | |
36558c3d YM |
1053 | */ |
1054 | void __qed_vf_get_link_caps(struct qed_hwfn *p_hwfn, | |
1055 | struct qed_mcp_link_capabilities *p_link_caps, | |
1056 | struct qed_bulletin_content *p_bulletin); | |
1057 | ||
1058 | void qed_iov_vf_task(struct work_struct *work); | |
eaf3c0c6 CM |
1059 | void qed_vf_set_vf_start_tunn_update_param(struct qed_tunnel_info *p_tun); |
1060 | int qed_vf_pf_tunnel_param_update(struct qed_hwfn *p_hwfn, | |
1061 | struct qed_tunnel_info *p_tunn); | |
1a850bfc MY |
1062 | |
1063 | u32 qed_vf_hw_bar_size(struct qed_hwfn *p_hwfn, enum BAR_ID bar_id); | |
809c45a0 | 1064 | /** |
19198e4e PK |
1065 | * qed_vf_pf_bulletin_update_mac(): Ask PF to update the MAC address in |
1066 | * it's bulletin board | |
1067 | * | |
1068 | * @p_hwfn: HW device data. | |
1069 | * @p_mac: mac address to be updated in bulletin board | |
809c45a0 | 1070 | * |
19198e4e | 1071 | * Return: Int. |
809c45a0 SS |
1072 | */ |
1073 | int qed_vf_pf_bulletin_update_mac(struct qed_hwfn *p_hwfn, u8 *p_mac); | |
1074 | ||
1408cc1f | 1075 | #else |
36558c3d YM |
1076 | static inline void qed_vf_get_link_params(struct qed_hwfn *p_hwfn, |
1077 | struct qed_mcp_link_params *params) | |
1078 | { | |
1079 | } | |
1080 | ||
1081 | static inline void qed_vf_get_link_state(struct qed_hwfn *p_hwfn, | |
1082 | struct qed_mcp_link_state *link) | |
1083 | { | |
1084 | } | |
1085 | ||
1086 | static inline void | |
1087 | qed_vf_get_link_caps(struct qed_hwfn *p_hwfn, | |
1088 | struct qed_mcp_link_capabilities *p_link_caps) | |
1089 | { | |
1090 | } | |
1091 | ||
1408cc1f YM |
1092 | static inline void qed_vf_get_num_rxqs(struct qed_hwfn *p_hwfn, u8 *num_rxqs) |
1093 | { | |
1094 | } | |
1095 | ||
0db711bb MY |
1096 | static inline void qed_vf_get_num_txqs(struct qed_hwfn *p_hwfn, u8 *num_txqs) |
1097 | { | |
1098 | } | |
1099 | ||
cbb8a12c MY |
1100 | static inline void qed_vf_get_num_cids(struct qed_hwfn *p_hwfn, u8 *num_cids) |
1101 | { | |
1102 | } | |
1103 | ||
1408cc1f YM |
1104 | static inline void qed_vf_get_port_mac(struct qed_hwfn *p_hwfn, u8 *port_mac) |
1105 | { | |
1106 | } | |
1107 | ||
1108 | static inline void qed_vf_get_num_vlan_filters(struct qed_hwfn *p_hwfn, | |
1109 | u8 *num_vlan_filters) | |
1110 | { | |
1111 | } | |
1112 | ||
b0fca312 MY |
1113 | static inline void qed_vf_get_num_mac_filters(struct qed_hwfn *p_hwfn, |
1114 | u8 *num_mac_filters) | |
1115 | { | |
1116 | } | |
1117 | ||
eff16960 YM |
1118 | static inline bool qed_vf_check_mac(struct qed_hwfn *p_hwfn, u8 *mac) |
1119 | { | |
1120 | return false; | |
1121 | } | |
1122 | ||
1408cc1f YM |
1123 | static inline void qed_vf_get_fw_version(struct qed_hwfn *p_hwfn, |
1124 | u16 *fw_major, u16 *fw_minor, | |
1125 | u16 *fw_rev, u16 *fw_eng) | |
1126 | { | |
1127 | } | |
1128 | ||
1129 | static inline int qed_vf_hw_prepare(struct qed_hwfn *p_hwfn) | |
1130 | { | |
1131 | return -EINVAL; | |
1132 | } | |
1133 | ||
dacd88d6 | 1134 | static inline int qed_vf_pf_rxq_start(struct qed_hwfn *p_hwfn, |
3da7a37a | 1135 | struct qed_queue_cid *p_cid, |
dacd88d6 YM |
1136 | u16 bd_max_bytes, |
1137 | dma_addr_t bd_chain_phys_adr, | |
1138 | dma_addr_t cqe_pbl_addr, | |
1139 | u16 cqe_pbl_size, void __iomem **pp_prod) | |
1140 | { | |
1141 | return -EINVAL; | |
1142 | } | |
1143 | ||
1144 | static inline int qed_vf_pf_txq_start(struct qed_hwfn *p_hwfn, | |
3da7a37a | 1145 | struct qed_queue_cid *p_cid, |
dacd88d6 YM |
1146 | dma_addr_t pbl_addr, |
1147 | u16 pbl_size, void __iomem **pp_doorbell) | |
1148 | { | |
1149 | return -EINVAL; | |
1150 | } | |
1151 | ||
1152 | static inline int qed_vf_pf_rxq_stop(struct qed_hwfn *p_hwfn, | |
3da7a37a MY |
1153 | struct qed_queue_cid *p_cid, |
1154 | bool cqe_completion) | |
dacd88d6 YM |
1155 | { |
1156 | return -EINVAL; | |
1157 | } | |
1158 | ||
3da7a37a MY |
1159 | static inline int qed_vf_pf_txq_stop(struct qed_hwfn *p_hwfn, |
1160 | struct qed_queue_cid *p_cid) | |
dacd88d6 YM |
1161 | { |
1162 | return -EINVAL; | |
1163 | } | |
1164 | ||
1165 | static inline int | |
1166 | qed_vf_pf_vport_update(struct qed_hwfn *p_hwfn, | |
1167 | struct qed_sp_vport_update_params *p_params) | |
1168 | { | |
1169 | return -EINVAL; | |
1170 | } | |
1171 | ||
0b55e27d YM |
1172 | static inline int qed_vf_pf_reset(struct qed_hwfn *p_hwfn) |
1173 | { | |
1174 | return -EINVAL; | |
1175 | } | |
1176 | ||
1177 | static inline int qed_vf_pf_release(struct qed_hwfn *p_hwfn) | |
1178 | { | |
1179 | return -EINVAL; | |
1180 | } | |
1181 | ||
1408cc1f YM |
1182 | static inline u16 qed_vf_get_igu_sb_id(struct qed_hwfn *p_hwfn, u16 sb_id) |
1183 | { | |
1184 | return 0; | |
1185 | } | |
0b55e27d | 1186 | |
2f3ca449 AB |
1187 | static inline void qed_vf_set_sb_info(struct qed_hwfn *p_hwfn, u16 sb_id, |
1188 | struct qed_sb_info *p_sb) | |
1189 | { | |
1190 | } | |
1191 | ||
dacd88d6 YM |
1192 | static inline int qed_vf_pf_vport_start(struct qed_hwfn *p_hwfn, |
1193 | u8 vport_id, | |
1194 | u16 mtu, | |
1195 | u8 inner_vlan_removal, | |
1196 | enum qed_tpa_mode tpa_mode, | |
08feecd7 YM |
1197 | u8 max_buffers_per_cqe, |
1198 | u8 only_untagged) | |
dacd88d6 YM |
1199 | { |
1200 | return -EINVAL; | |
1201 | } | |
1202 | ||
1203 | static inline int qed_vf_pf_vport_stop(struct qed_hwfn *p_hwfn) | |
1204 | { | |
1205 | return -EINVAL; | |
1206 | } | |
1207 | ||
1208 | static inline int qed_vf_pf_filter_ucast(struct qed_hwfn *p_hwfn, | |
1209 | struct qed_filter_ucast *p_param) | |
1210 | { | |
1211 | return -EINVAL; | |
1212 | } | |
1213 | ||
1214 | static inline void qed_vf_pf_filter_mcast(struct qed_hwfn *p_hwfn, | |
1215 | struct qed_filter_mcast *p_filter_cmd) | |
1216 | { | |
1217 | } | |
1218 | ||
0b55e27d YM |
1219 | static inline int qed_vf_pf_int_cleanup(struct qed_hwfn *p_hwfn) |
1220 | { | |
1221 | return -EINVAL; | |
1222 | } | |
36558c3d YM |
1223 | |
1224 | static inline void __qed_vf_get_link_params(struct qed_hwfn *p_hwfn, | |
1225 | struct qed_mcp_link_params | |
1226 | *p_params, | |
1227 | struct qed_bulletin_content | |
1228 | *p_bulletin) | |
1229 | { | |
1230 | } | |
1231 | ||
1232 | static inline void __qed_vf_get_link_state(struct qed_hwfn *p_hwfn, | |
1233 | struct qed_mcp_link_state *p_link, | |
1234 | struct qed_bulletin_content | |
1235 | *p_bulletin) | |
1236 | { | |
1237 | } | |
1238 | ||
1239 | static inline void | |
1240 | __qed_vf_get_link_caps(struct qed_hwfn *p_hwfn, | |
1241 | struct qed_mcp_link_capabilities *p_link_caps, | |
1242 | struct qed_bulletin_content *p_bulletin) | |
1243 | { | |
1244 | } | |
1245 | ||
1246 | static inline void qed_iov_vf_task(struct work_struct *work) | |
1247 | { | |
1248 | } | |
eaf3c0c6 CM |
1249 | |
1250 | static inline void | |
1251 | qed_vf_set_vf_start_tunn_update_param(struct qed_tunnel_info *p_tun) | |
1252 | { | |
1253 | } | |
1254 | ||
1255 | static inline int qed_vf_pf_tunnel_param_update(struct qed_hwfn *p_hwfn, | |
1256 | struct qed_tunnel_info *p_tunn) | |
1257 | { | |
1258 | return -EINVAL; | |
1259 | } | |
1a850bfc | 1260 | |
809c45a0 SS |
1261 | static inline int qed_vf_pf_bulletin_update_mac(struct qed_hwfn *p_hwfn, |
1262 | u8 *p_mac) | |
1263 | { | |
1264 | return -EINVAL; | |
1265 | } | |
1266 | ||
1a850bfc MY |
1267 | static inline u32 |
1268 | qed_vf_hw_bar_size(struct qed_hwfn *p_hwfn, | |
1269 | enum BAR_ID bar_id) | |
1270 | { | |
1271 | return 0; | |
1272 | } | |
1408cc1f YM |
1273 | #endif |
1274 | ||
32a47e72 | 1275 | #endif |