xref: /freebsd/sys/dev/qlnx/qlnxe/ecore_vfpf_if.h (revision 85732ac8)
1 /*
2  * Copyright (c) 2017-2018 Cavium, Inc.
3  * All rights reserved.
4  *
5  *  Redistribution and use in source and binary forms, with or without
6  *  modification, are permitted provided that the following conditions
7  *  are met:
8  *
9  *  1. Redistributions of source code must retain the above copyright
10  *     notice, this list of conditions and the following disclaimer.
11  *  2. Redistributions in binary form must reproduce the above copyright
12  *     notice, this list of conditions and the following disclaimer in the
13  *     documentation and/or other materials provided with the distribution.
14  *
15  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16  *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17  *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18  *  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
19  *  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20  *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21  *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22  *  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23  *  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24  *  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25  *  POSSIBILITY OF SUCH DAMAGE.
26  *
27  * $FreeBSD$
28  *
29  */
30 
31 
32 #ifndef __ECORE_VF_PF_IF_H__
33 #define __ECORE_VF_PF_IF_H__
34 
35 #define T_ETH_INDIRECTION_TABLE_SIZE 128 /* @@@ TBD MichalK this should be HSI? */
36 #define T_ETH_RSS_KEY_SIZE 10 /* @@@ TBD this should be HSI? */
37 #ifndef LINUX_REMOVE
38 #ifndef ETH_ALEN
39 #define ETH_ALEN 6 /* @@@ TBD MichalK - should this be defined here?*/
40 #endif
41 #endif
42 
43 /***********************************************
44  *
45  * Common definitions for all HVs
46  *
47  **/
48 struct vf_pf_resc_request {
49 	u8 num_rxqs;
50 	u8 num_txqs;
51 	u8 num_sbs;
52 	u8 num_mac_filters;
53 	u8 num_vlan_filters;
54 	u8 num_mc_filters; /* No limit  so superfluous */
55 	u8 num_cids;
56 	u8 padding;
57 };
58 
59 struct hw_sb_info {
60 	u16 hw_sb_id;    /* aka absolute igu id, used to ack the sb */
61 	u8 sb_qid;      /* used to update DHC for sb */
62 	u8 padding[5];
63 };
64 
65 /***********************************************
66  *
67  * HW VF-PF channel definitions
68  *
69  * A.K.A VF-PF mailbox
70  *
71  **/
72 #define TLV_BUFFER_SIZE 		1024
73 
74 /* vf pf channel tlvs */
75 /* general tlv header (used for both vf->pf request and pf->vf response) */
76 struct channel_tlv {
77 	u16 type;
78 	u16 length;
79 };
80 
81 /* header of first vf->pf tlv carries the offset used to calculate reponse
82  * buffer address
83  */
84 struct vfpf_first_tlv {
85 	struct channel_tlv tl;
86 	u32 padding;
87 	u64 reply_address;
88 };
89 
90 /* header of pf->vf tlvs, carries the status of handling the request */
91 struct pfvf_tlv {
92 	struct channel_tlv tl;
93 	u8 status;
94 	u8 padding[3];
95 };
96 
97 /* response tlv used for most tlvs */
98 struct pfvf_def_resp_tlv {
99 	struct pfvf_tlv hdr;
100 };
101 
102 /* used to terminate and pad a tlv list */
103 struct channel_list_end_tlv {
104 	struct channel_tlv tl;
105 	u8 padding[4];
106 };
107 
108 /* Acquire */
109 struct vfpf_acquire_tlv {
110 	struct vfpf_first_tlv first_tlv;
111 
112 	struct vf_pf_vfdev_info {
113 #ifndef LINUX_REMOVE
114 	/* First bit was used on 8.7.x and 8.8.x versions, which had different
115 	 * FWs used but with the same faspath HSI. As this was prior to the
116 	 * fastpath versioning, wanted to have ability to override fw matching
117 	 * and allow them to interact.
118 	 */
119 #endif
120 #define VFPF_ACQUIRE_CAP_PRE_FP_HSI	(1 << 0) /* VF pre-FP hsi version */
121 #define VFPF_ACQUIRE_CAP_100G		(1 << 1) /* VF can support 100g */
122 
123 	/* A requirement for supporting multi-Tx queues on a single queue-zone,
124 	 * VF would pass qids as additional information whenever passing queue
125 	 * references.
126 	 * TODO - due to the CID limitations in Bar0, VFs currently don't pass
127 	 * this, and use the legacy CID scheme.
128 	 */
129 #define VFPF_ACQUIRE_CAP_QUEUE_QIDS	(1 << 2)
130 
131 	/* The VF is using the physical bar. While this is mostly internal
132 	 * to the VF, might affect the number of CIDs supported assuming
133 	 * QUEUE_QIDS is set.
134 	 */
135 #define VFPF_ACQUIRE_CAP_PHYSICAL_BAR	(1 << 3)
136 		u64 capabilities;
137 		u8 fw_major;
138 		u8 fw_minor;
139 		u8 fw_revision;
140 		u8 fw_engineering;
141 		u32 driver_version;
142 		u16 opaque_fid; /* ME register value */
143 		u8 os_type; /* VFPF_ACQUIRE_OS_* value */
144 		u8 eth_fp_hsi_major;
145 		u8 eth_fp_hsi_minor;
146 		u8 padding[3];
147 	} vfdev_info;
148 
149 	struct vf_pf_resc_request resc_request;
150 
151 	u64 bulletin_addr;
152 	u32 bulletin_size;
153 	u32 padding;
154 };
155 
156 /* receive side scaling tlv */
157 struct vfpf_vport_update_rss_tlv {
158 	struct channel_tlv	tl;
159 
160 	u8 update_rss_flags;
161 	#define VFPF_UPDATE_RSS_CONFIG_FLAG	  (1 << 0)
162 	#define VFPF_UPDATE_RSS_CAPS_FLAG	  (1 << 1)
163 	#define VFPF_UPDATE_RSS_IND_TABLE_FLAG	  (1 << 2)
164 	#define VFPF_UPDATE_RSS_KEY_FLAG	  (1 << 3)
165 
166 	u8 rss_enable;
167 	u8 rss_caps;
168 	u8 rss_table_size_log; /* The table size is 2 ^ rss_table_size_log */
169 	u16 rss_ind_table[T_ETH_INDIRECTION_TABLE_SIZE];
170 	u32 rss_key[T_ETH_RSS_KEY_SIZE];
171 };
172 
173 struct pfvf_storm_stats {
174 	u32 address;
175 	u32 len;
176 };
177 
178 struct pfvf_stats_info {
179 	struct pfvf_storm_stats mstats;
180 	struct pfvf_storm_stats pstats;
181 	struct pfvf_storm_stats tstats;
182 	struct pfvf_storm_stats ustats;
183 };
184 
185 /* acquire response tlv - carries the allocated resources */
186 struct pfvf_acquire_resp_tlv {
187 	struct pfvf_tlv hdr;
188 
189 	struct pf_vf_pfdev_info {
190 		u32 chip_num;
191 		u32 mfw_ver;
192 
193 		u16 fw_major;
194 		u16 fw_minor;
195 		u16 fw_rev;
196 		u16 fw_eng;
197 
198 		u64 capabilities;
199 #define PFVF_ACQUIRE_CAP_DEFAULT_UNTAGGED	(1 << 0)
200 #define PFVF_ACQUIRE_CAP_100G			(1 << 1) /* If set, 100g PF */
201 /* There are old PF versions where the PF might mistakenly override the sanity
202  * mechanism [version-based] and allow a VF that can't be supported to pass
203  * the acquisition phase.
204  * To overcome this, PFs now indicate that they're past that point and the new
205  * VFs would fail probe on the older PFs that fail to do so.
206  */
207 #ifndef LINUX_REMOVE
208 /* Said bug was in quest/serpens; Can't be certain no official release included
209  * the bug since the fix arrived very late in the programs.
210  */
211 #endif
212 #define PFVF_ACQUIRE_CAP_POST_FW_OVERRIDE	(1 << 2)
213 
214 	/* PF expects queues to be received with additional qids */
215 #define PFVF_ACQUIRE_CAP_QUEUE_QIDS		(1 << 3)
216 
217 		u16 db_size;
218 		u8  indices_per_sb;
219 		u8 os_type;
220 
221 		/* These should match the PF's ecore_dev values */
222 		u16 chip_rev;
223 		u8 dev_type;
224 
225 		/* Doorbell bar size configured in HW: log(size) or 0 */
226 		u8 bar_size;
227 
228 		struct pfvf_stats_info stats_info;
229 
230 		u8 port_mac[ETH_ALEN];
231 
232 		/* It's possible PF had to configure an older fastpath HSI
233 		 * [in case VF is newer than PF]. This is communicated back
234 		 * to the VF. It can also be used in case of error due to
235 		 * non-matching versions to shed light in VF about failure.
236 		 */
237 		u8 major_fp_hsi;
238 		u8 minor_fp_hsi;
239 	} pfdev_info;
240 
241 	struct pf_vf_resc {
242 		/* in case of status NO_RESOURCE in message hdr, pf will fill
243 		 * this struct with suggested amount of resources for next
244 		 * acquire request
245 		 */
246 		#define PFVF_MAX_QUEUES_PER_VF         16
247 		#define PFVF_MAX_SBS_PER_VF            16
248 		struct hw_sb_info hw_sbs[PFVF_MAX_SBS_PER_VF];
249 		u8      hw_qid[PFVF_MAX_QUEUES_PER_VF];
250 		u8      cid[PFVF_MAX_QUEUES_PER_VF];
251 
252 		u8      num_rxqs;
253 		u8      num_txqs;
254 		u8      num_sbs;
255 		u8      num_mac_filters;
256 		u8      num_vlan_filters;
257 		u8      num_mc_filters;
258 		u8	num_cids;
259 		u8      padding;
260 	} resc;
261 
262 	u32 bulletin_size;
263 	u32 padding;
264 };
265 
266 struct pfvf_start_queue_resp_tlv {
267 	struct pfvf_tlv hdr;
268 	u32 offset; /* offset to consumer/producer of queue */
269 	u8 padding[4];
270 };
271 
272 /* Extended queue information - additional index for reference inside qzone.
273  * If commmunicated between VF/PF, each TLV relating to queues should be
274  * extended by one such [or have a future base TLV that already contains info].
275  */
276 struct vfpf_qid_tlv {
277 	struct channel_tlv	tl;
278 	u8			qid;
279 	u8			padding[3];
280 };
281 
282 /* Setup Queue */
283 struct vfpf_start_rxq_tlv {
284 	struct vfpf_first_tlv	first_tlv;
285 
286 	/* physical addresses */
287 	u64		rxq_addr;
288 	u64		deprecated_sge_addr;
289 	u64		cqe_pbl_addr;
290 
291 	u16			cqe_pbl_size;
292 	u16			hw_sb;
293 	u16			rx_qid;
294 	u16			hc_rate; /* desired interrupts per sec. */
295 
296 	u16			bd_max_bytes;
297 	u16			stat_id;
298 	u8			sb_index;
299 	u8			padding[3];
300 
301 };
302 
303 struct vfpf_start_txq_tlv {
304 	struct vfpf_first_tlv	first_tlv;
305 
306 	/* physical addresses */
307 	u64		pbl_addr;
308 	u16			pbl_size;
309 	u16			stat_id;
310 	u16			tx_qid;
311 	u16			hw_sb;
312 
313 	u32			flags; /* VFPF_QUEUE_FLG_X flags */
314 	u16			hc_rate; /* desired interrupts per sec. */
315 	u8			sb_index;
316 	u8			padding[3];
317 };
318 
319 /* Stop RX Queue */
320 struct vfpf_stop_rxqs_tlv {
321 	struct vfpf_first_tlv	first_tlv;
322 
323 	u16			rx_qid;
324 
325 	/* While the API supports multiple Rx-queues on a single TLV
326 	 * message, in practice older VFs always used it as one [ecore].
327 	 * And there are PFs [starting with the CHANNEL_TLV_QID] which
328 	 * would start assuming this is always a '1'. So in practice this
329 	 * field should be considered deprecated and *Always* set to '1'.
330 	 */
331 	u8			num_rxqs;
332 
333 	u8			cqe_completion;
334 	u8			padding[4];
335 };
336 
337 /* Stop TX Queues */
338 struct vfpf_stop_txqs_tlv {
339 	struct vfpf_first_tlv	first_tlv;
340 
341 	u16			tx_qid;
342 
343 	/* While the API supports multiple Tx-queues on a single TLV
344 	 * message, in practice older VFs always used it as one [ecore].
345 	 * And there are PFs [starting with the CHANNEL_TLV_QID] which
346 	 * would start assuming this is always a '1'. So in practice this
347 	 * field should be considered deprecated and *Always* set to '1'.
348 	 */
349 	u8			num_txqs;
350 	u8			padding[5];
351 };
352 
353 struct vfpf_update_rxq_tlv {
354 	struct vfpf_first_tlv	first_tlv;
355 
356 	u64		deprecated_sge_addr[PFVF_MAX_QUEUES_PER_VF];
357 
358 	u16			rx_qid;
359 	u8			num_rxqs;
360 	u8			flags;
361 	#define VFPF_RXQ_UPD_INIT_SGE_DEPRECATE_FLAG	(1 << 0)
362 	#define VFPF_RXQ_UPD_COMPLETE_CQE_FLAG		(1 << 1)
363 	#define VFPF_RXQ_UPD_COMPLETE_EVENT_FLAG	(1 << 2)
364 
365 	u8			padding[4];
366 };
367 
368 /* Set Queue Filters */
369 struct vfpf_q_mac_vlan_filter {
370 	u32 flags;
371 	#define VFPF_Q_FILTER_DEST_MAC_VALID    0x01
372 	#define VFPF_Q_FILTER_VLAN_TAG_VALID    0x02
373 	#define VFPF_Q_FILTER_SET_MAC   	0x100   /* set/clear */
374 
375 	u8  mac[ETH_ALEN];
376 	u16 vlan_tag;
377 
378 	u8	padding[4];
379 };
380 
381 /* Start a vport */
382 struct vfpf_vport_start_tlv {
383 	struct vfpf_first_tlv	first_tlv;
384 
385 	u64		sb_addr[PFVF_MAX_SBS_PER_VF];
386 
387 	u32			tpa_mode;
388 	u16			dep1;
389 	u16			mtu;
390 
391 	u8			vport_id;
392 	u8			inner_vlan_removal;
393 
394 	u8			only_untagged;
395 	u8			max_buffers_per_cqe;
396 
397 	u8			zero_placement_offset;
398 	u8			padding[3];
399 };
400 
401 /* Extended tlvs - need to add rss, mcast, accept mode tlvs */
402 struct vfpf_vport_update_activate_tlv {
403 	struct channel_tlv	tl;
404 	u8			update_rx;
405 	u8			update_tx;
406 	u8			active_rx;
407 	u8			active_tx;
408 };
409 
410 struct vfpf_vport_update_tx_switch_tlv {
411 	struct channel_tlv	tl;
412 	u8			tx_switching;
413 	u8			padding[3];
414 };
415 
416 struct vfpf_vport_update_vlan_strip_tlv {
417 	struct channel_tlv	tl;
418 	u8			remove_vlan;
419 	u8			padding[3];
420 };
421 
422 struct vfpf_vport_update_mcast_bin_tlv {
423 	struct channel_tlv	tl;
424 	u8			padding[4];
425 
426 	/* This was a mistake; There are only 256 approx bins,
427 	 * and in HSI they're divided into 32-bit values.
428 	 * As old VFs used to set-bit to the values on its side,
429 	 * the upper half of the array is never expected to contain any data.
430 	 */
431 	u64		bins[4];
432 	u64		obsolete_bins[4];
433 };
434 
435 struct vfpf_vport_update_accept_param_tlv {
436 	struct channel_tlv tl;
437 	u8	update_rx_mode;
438 	u8	update_tx_mode;
439 	u8	rx_accept_filter;
440 	u8	tx_accept_filter;
441 };
442 
443 struct vfpf_vport_update_accept_any_vlan_tlv {
444 	struct channel_tlv tl;
445 	u8 update_accept_any_vlan_flg;
446 	u8 accept_any_vlan;
447 
448 	u8 padding[2];
449 };
450 
451 struct vfpf_vport_update_sge_tpa_tlv {
452 	struct channel_tlv	tl;
453 
454 	u16			sge_tpa_flags;
455 	#define VFPF_TPA_IPV4_EN_FLAG	     (1 << 0)
456 	#define VFPF_TPA_IPV6_EN_FLAG        (1 << 1)
457 	#define VFPF_TPA_PKT_SPLIT_FLAG      (1 << 2)
458 	#define VFPF_TPA_HDR_DATA_SPLIT_FLAG (1 << 3)
459 	#define VFPF_TPA_GRO_CONSIST_FLAG    (1 << 4)
460 
461 	u8			update_sge_tpa_flags;
462 	#define VFPF_UPDATE_SGE_DEPRECATED_FLAG	   (1 << 0)
463 	#define VFPF_UPDATE_TPA_EN_FLAG    (1 << 1)
464 	#define VFPF_UPDATE_TPA_PARAM_FLAG (1 << 2)
465 
466 	u8			max_buffers_per_cqe;
467 
468 	u16			deprecated_sge_buff_size;
469 	u16			tpa_max_size;
470 	u16			tpa_min_size_to_start;
471 	u16			tpa_min_size_to_cont;
472 
473 	u8			tpa_max_aggs_num;
474 	u8			padding[7];
475 
476 };
477 
478 /* Primary tlv as a header for various extended tlvs for
479  * various functionalities in vport update ramrod.
480  */
481 struct vfpf_vport_update_tlv {
482 	struct vfpf_first_tlv first_tlv;
483 };
484 
485 struct vfpf_ucast_filter_tlv {
486 	struct vfpf_first_tlv	first_tlv;
487 
488 	u8			opcode;
489 	u8			type;
490 
491 	u8			mac[ETH_ALEN];
492 
493 	u16			vlan;
494 	u16			padding[3];
495 };
496 
497 /* tunnel update param tlv */
498 struct vfpf_update_tunn_param_tlv {
499 	struct vfpf_first_tlv   first_tlv;
500 
501 	u8			tun_mode_update_mask;
502 	u8			tunn_mode;
503 	u8			update_tun_cls;
504 	u8			vxlan_clss;
505 	u8			l2gre_clss;
506 	u8			ipgre_clss;
507 	u8			l2geneve_clss;
508 	u8			ipgeneve_clss;
509 	u8			update_geneve_port;
510 	u8			update_vxlan_port;
511 	u16			geneve_port;
512 	u16			vxlan_port;
513 	u8			padding[2];
514 };
515 
516 struct pfvf_update_tunn_param_tlv {
517 	struct pfvf_tlv hdr;
518 
519 	u16			tunn_feature_mask;
520 	u8			vxlan_mode;
521 	u8			l2geneve_mode;
522 	u8			ipgeneve_mode;
523 	u8			l2gre_mode;
524 	u8			ipgre_mode;
525 	u8			vxlan_clss;
526 	u8			l2gre_clss;
527 	u8			ipgre_clss;
528 	u8			l2geneve_clss;
529 	u8			ipgeneve_clss;
530 	u16			vxlan_udp_port;
531 	u16			geneve_udp_port;
532 };
533 
534 struct tlv_buffer_size {
535 	u8 tlv_buffer[TLV_BUFFER_SIZE];
536 };
537 
538 struct vfpf_update_coalesce {
539 	struct vfpf_first_tlv first_tlv;
540 	u16 rx_coal;
541 	u16 tx_coal;
542 	u16 qid;
543 	u8 padding[2];
544 };
545 
546 struct vfpf_read_coal_req_tlv {
547 	struct vfpf_first_tlv first_tlv;
548 	u16 qid;
549 	u8 is_rx;
550 	u8 padding[5];
551 };
552 
553 struct pfvf_read_coal_resp_tlv {
554 	struct pfvf_tlv hdr;
555 	u16 coal;
556 	u8 padding[6];
557 };
558 
559 union vfpf_tlvs {
560 	struct vfpf_first_tlv			first_tlv;
561 	struct vfpf_acquire_tlv			acquire;
562 	struct vfpf_start_rxq_tlv		start_rxq;
563 	struct vfpf_start_txq_tlv		start_txq;
564 	struct vfpf_stop_rxqs_tlv		stop_rxqs;
565 	struct vfpf_stop_txqs_tlv		stop_txqs;
566 	struct vfpf_update_rxq_tlv		update_rxq;
567 	struct vfpf_vport_start_tlv		start_vport;
568 	struct vfpf_vport_update_tlv		vport_update;
569 	struct vfpf_ucast_filter_tlv		ucast_filter;
570 	struct vfpf_update_tunn_param_tlv	tunn_param_update;
571 	struct vfpf_update_coalesce		update_coalesce;
572 	struct vfpf_read_coal_req_tlv		read_coal_req;
573 	struct tlv_buffer_size			tlv_buf_size;
574 };
575 
576 union pfvf_tlvs {
577 	struct pfvf_def_resp_tlv		default_resp;
578 	struct pfvf_acquire_resp_tlv		acquire_resp;
579 	struct tlv_buffer_size			tlv_buf_size;
580 	struct pfvf_start_queue_resp_tlv	queue_start;
581 	struct pfvf_update_tunn_param_tlv	tunn_param_resp;
582 	struct pfvf_read_coal_resp_tlv		read_coal_resp;
583 };
584 
585 /* This is a structure which is allocated in the VF, which the PF may update
586  * when it deems it necessary to do so. The bulletin board is sampled
587  * periodically by the VF. A copy per VF is maintained in the PF (to prevent
588  * loss of data upon multiple updates (or the need for read modify write)).
589  */
590 enum ecore_bulletin_bit {
591 	/* Alert the VF that a forced MAC was set by the PF */
592 	MAC_ADDR_FORCED = 0,
593 
594 	/* The VF should not access the vfpf channel */
595 	VFPF_CHANNEL_INVALID = 1,
596 
597 	/* Alert the VF that a forced VLAN was set by the PF */
598 	VLAN_ADDR_FORCED = 2,
599 
600 	/* Indicate that `default_only_untagged' contains actual data */
601 	VFPF_BULLETIN_UNTAGGED_DEFAULT = 3,
602 	VFPF_BULLETIN_UNTAGGED_DEFAULT_FORCED = 4,
603 
604 	/* Alert the VF that suggested mac was sent by the PF.
605 	 * MAC_ADDR will be disabled in case MAC_ADDR_FORCED is set
606 	 */
607 	VFPF_BULLETIN_MAC_ADDR = 5
608 };
609 
610 struct ecore_bulletin_content {
611 	/* crc of structure to ensure is not in mid-update */
612 	u32 crc;
613 
614 	u32 version;
615 
616 	/* bitmap indicating which fields hold valid values */
617 	u64 valid_bitmap;
618 
619 	/* used for MAC_ADDR or MAC_ADDR_FORCED */
620 	u8 mac[ETH_ALEN];
621 
622 	/* If valid, 1 => only untagged Rx if no vlan is configured */
623 	u8 default_only_untagged;
624 	u8 padding;
625 
626 	/* The following is a 'copy' of ecore_mcp_link_state,
627 	 * ecore_mcp_link_params and ecore_mcp_link_capabilities. Since it's
628 	 * possible the structs will increase further along the road we cannot
629 	 * have it here; Instead we need to have all of its fields.
630 	 */
631 	u8 req_autoneg;
632 	u8 req_autoneg_pause;
633 	u8 req_forced_rx;
634 	u8 req_forced_tx;
635 	u8 padding2[4];
636 
637 	u32 req_adv_speed;
638 	u32 req_forced_speed;
639 	u32 req_loopback;
640 	u32 padding3;
641 
642 	u8 link_up;
643 	u8 full_duplex;
644 	u8 autoneg;
645 	u8 autoneg_complete;
646 	u8 parallel_detection;
647 	u8 pfc_enabled;
648 	u8 partner_tx_flow_ctrl_en;
649 	u8 partner_rx_flow_ctrl_en;
650 
651 	u8 partner_adv_pause;
652 	u8 sfp_tx_fault;
653 	u16 vxlan_udp_port;
654 	u16 geneve_udp_port;
655 	u8 padding4[2];
656 
657 	u32 speed;
658 	u32 partner_adv_speed;
659 
660 	u32 capability_speed;
661 
662 	/* Forced vlan */
663 	u16 pvid;
664 	u16 padding5;
665 };
666 
667 struct ecore_bulletin {
668 	dma_addr_t phys;
669 	struct ecore_bulletin_content *p_virt;
670 	u32 size;
671 };
672 
673 enum {
674 /*!!!!! Make sure to update STRINGS structure accordingly !!!!!*/
675 
676 	CHANNEL_TLV_NONE, /* ends tlv sequence */
677 	CHANNEL_TLV_ACQUIRE,
678 	CHANNEL_TLV_VPORT_START,
679 	CHANNEL_TLV_VPORT_UPDATE,
680 	CHANNEL_TLV_VPORT_TEARDOWN,
681 	CHANNEL_TLV_START_RXQ,
682 	CHANNEL_TLV_START_TXQ,
683 	CHANNEL_TLV_STOP_RXQS,
684 	CHANNEL_TLV_STOP_TXQS,
685 	CHANNEL_TLV_UPDATE_RXQ,
686 	CHANNEL_TLV_INT_CLEANUP,
687 	CHANNEL_TLV_CLOSE,
688 	CHANNEL_TLV_RELEASE,
689 	CHANNEL_TLV_LIST_END,
690 	CHANNEL_TLV_UCAST_FILTER,
691 	CHANNEL_TLV_VPORT_UPDATE_ACTIVATE,
692 	CHANNEL_TLV_VPORT_UPDATE_TX_SWITCH,
693 	CHANNEL_TLV_VPORT_UPDATE_VLAN_STRIP,
694 	CHANNEL_TLV_VPORT_UPDATE_MCAST,
695 	CHANNEL_TLV_VPORT_UPDATE_ACCEPT_PARAM,
696 	CHANNEL_TLV_VPORT_UPDATE_RSS,
697 	CHANNEL_TLV_VPORT_UPDATE_ACCEPT_ANY_VLAN,
698 	CHANNEL_TLV_VPORT_UPDATE_SGE_TPA,
699 	CHANNEL_TLV_UPDATE_TUNN_PARAM,
700 	CHANNEL_TLV_COALESCE_UPDATE,
701 	CHANNEL_TLV_QID,
702 	CHANNEL_TLV_COALESCE_READ,
703 	CHANNEL_TLV_MAX,
704 
705 	/* Required for iterating over vport-update tlvs.
706 	 * Will break in case non-sequential vport-update tlvs.
707 	 */
708 	CHANNEL_TLV_VPORT_UPDATE_MAX = CHANNEL_TLV_VPORT_UPDATE_SGE_TPA + 1,
709 
710 /*!!!!! Make sure to update STRINGS structure accordingly !!!!!*/
711 };
712 extern const char *ecore_channel_tlvs_string[];
713 
714 #endif /* __ECORE_VF_PF_IF_H__ */
715