xref: /dpdk/drivers/net/dpaa/fmlib/fm_port_ext.h (revision 7be78d027918dbc846e502780faf94d5acdf5f75)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright 2008-2012 Freescale Semiconductor Inc.
3  * Copyright 2017-2020 NXP
4  */
5 
6 #ifndef __FM_PORT_EXT_H
7 #define __FM_PORT_EXT_H
8 
9 #include <errno.h>
10 #include "ncsw_ext.h"
11 #include "fm_pcd_ext.h"
12 #include "fm_ext.h"
13 #include "net_ext.h"
14 #include "dpaa_integration.h"
15 
16 /*
17  * @Description   FM Port routines
18  */
19 
20 /*
21  *
22  * @Group	  lnx_ioctl_FM_grp Frame Manager Linux IOCTL API
23  *
24  * @Description   FM Linux ioctls definitions and enums
25  *
26  * @{
27  */
28 
29 /*
30  * @Group	  lnx_ioctl_FM_PORT_grp FM Port
31  *
32  * @Description   FM Port API
33  *
34  *		  The FM uses a general module called "port" to represent a Tx
35  *		  port (MAC), an Rx port (MAC), offline parsing flow or host
36  *		  command flow. There may be up to 17 (may change) ports in an
37  *		  FM - 5 Tx ports (4 for the 1G MACs, 1 for the 10G MAC), 5 Rx
38  *		  Ports, and 7 Host command/Offline parsing ports. The SW driver
39  *		  manages these ports as sub-modules of the FM, i.e. after an FM
40  *		  is initialized, its ports may be initialized and operated
41  *		  upon.
42  *
43  *		  The port is initialized aware of its type, but other functions
44  *		  on a port may be indifferent to its type. When necessary, the
45  *		  driver verifies coherency and returns error if applicable.
46  *
47  *		  On initialization, user specifies the port type and it's index
48  *		  (relative to the port's type). Host command and Offline
49  *		  parsing ports share the same id range, I.e user may not
50  *		  initialized host command port 0 and offline parsing port 0.
51  *
52  * @{
53  */
54 
55 /*
56  * @Description   An enum for defining port PCD modes.
57  *		  (Must match enum e_fm_port_pcd_support defined in
58  *		  fm_port_ext.h)
59  *
60  *		  This enum defines the superset of PCD engines support - i.e.
61  *		  not all engines have to be used, but all have to be enabled.
62  *		  The real flow of a specific frame depends on the PCD
63  *		  configuration and the frame headers and payload. Note: the
64  *		  first engine and the first engine after the parser (if exists)
65  *		  should be in order, the order is important as it will define
66  *		  the flow of the port. However, as for the rest engines (the
67  *		  ones that follows), the order is not important anymore as it
68  *		  is defined by the PCD graph itself.
69  */
70 typedef enum ioc_fm_port_pcd_support {
71 	e_IOC_FM_PCD_NONE = 0
72 			/**< BMI to BMI, PCD is not used */
73 	, e_IOC_FM_PCD_PRS_ONLY	/**< Use only Parser */
74 	, e_IOC_FM_PCD_PLCR_ONLY	/**< Use only Policer */
75 	, e_IOC_FM_PCD_PRS_PLCR/**< Use Parser and Policer */
76 	, e_IOC_FM_PCD_PRS_KG	/**< Use Parser and Keygen */
77 	, e_IOC_FM_PCD_PRS_KG_AND_CC
78 			/**< Use Parser, Keygen and Coarse Classification */
79 	, e_IOC_FM_PCD_PRS_KG_AND_CC_AND_PLCR
80 			/**< Use all PCD engines */
81 	, e_IOC_FM_PCD_PRS_KG_AND_PLCR
82 			/**< Use Parser, Keygen and Policer */
83 	, e_IOC_FM_PCD_PRS_CC
84 			/**< Use Parser and Coarse Classification */
85 	, e_IOC_FM_PCD_PRS_CC_AND_PLCR
86 			/**< Use Parser and Coarse Classification and Policer */
87 	, e_IOC_FM_PCD_CC_ONLY
88 			/**< Use only Coarse Classification */
89 } ioc_fm_port_pcd_support;
90 
91 /*
92  * @Collection   FM Frame error
93  */
94 typedef uint32_t	ioc_fm_port_frame_err_select_t;
95 	/**< typedef for defining Frame Descriptor errors */
96 
97 /* @} */
98 
99 /*
100  * @Description   An enum for defining Dual Tx rate limiting scale.
101  *		  (Must match e_fm_port_dual_rate_limiter_scale_down defined in
102  *		  fm_port_ext.h)
103  */
104 typedef enum ioc_fm_port_dual_rate_limiter_scale_down {
105 	e_IOC_FM_PORT_DUAL_RATE_LIMITER_NONE = 0,
106 			/**< Use only single rate limiter*/
107 	e_IOC_FM_PORT_DUAL_RATE_LIMITER_SCALE_DOWN_BY_2,
108 			/**< Divide high rate limiter by 2 */
109 	e_IOC_FM_PORT_DUAL_RATE_LIMITER_SCALE_DOWN_BY_4,
110 			/**< Divide high rate limiter by 4 */
111 	e_IOC_FM_PORT_DUAL_RATE_LIMITER_SCALE_DOWN_BY_8
112 			/**< Divide high rate limiter by 8 */
113 } ioc_fm_port_dual_rate_limiter_scale_down;
114 
115 /*
116  * @Description   A structure for defining Tx rate limiting
117  *		  (Must match struct t_fm_port_rate_limit defined in
118  *		  fm_port_ext.h)
119  */
120 typedef struct ioc_fm_port_rate_limit_t {
121 	uint16_t	max_burst_size;
122 			/**< in KBytes for Tx ports, in frames for offline
123 			 * parsing ports. (note that for early chips burst size
124 			 * is rounded up to a multiply of 1000 frames).
125 			 */
126 	uint32_t	rate_limit;
127 			/**< in Kb/sec for Tx ports, in frame/sec for offline
128 			 * parsing ports. Rate limit refers to data rate (rather
129 			 * than line rate).
130 			 */
131 	ioc_fm_port_dual_rate_limiter_scale_down rate_limit_divider;
132 			/**< For offline parsing ports only. Not-valid for some
133 			 * earlier chip revisions
134 			 */
135 } ioc_fm_port_rate_limit_t;
136 
137 
138 /*
139  * @Group	  lnx_ioctl_FM_PORT_runtime_control_grp FM Port Runtime Control
140  *		  Unit
141  *
142  * @Description   FM Port Runtime control unit API functions, definitions and
143  *		  enums.
144  *
145  * @{
146  */
147 
148 /*
149  * @Description   An enum for defining FM Port counters.
150  *		  (Must match enum e_fm_port_counters defined in fm_port_ext.h)
151  */
152 typedef enum ioc_fm_port_counters {
153 	e_IOC_FM_PORT_COUNTERS_CYCLE,	/**< BMI performance counter */
154 	e_IOC_FM_PORT_COUNTERS_TASK_UTIL,	/**< BMI performance counter */
155 	e_IOC_FM_PORT_COUNTERS_QUEUE_UTIL,	/**< BMI performance counter */
156 	e_IOC_FM_PORT_COUNTERS_DMA_UTIL,	/**< BMI performance counter */
157 	e_IOC_FM_PORT_COUNTERS_FIFO_UTIL,	/**< BMI performance counter */
158 	e_IOC_FM_PORT_COUNTERS_RX_PAUSE_ACTIVATION,
159 				/**< BMI Rx only performance counter */
160 	e_IOC_FM_PORT_COUNTERS_FRAME,		/**< BMI statistics counter */
161 	e_IOC_FM_PORT_COUNTERS_DISCARD_FRAME,	/**< BMI statistics counter */
162 	e_IOC_FM_PORT_COUNTERS_DEALLOC_BUF,
163 				/**< BMI deallocate buffer statistics counter */
164 	e_IOC_FM_PORT_COUNTERS_RX_BAD_FRAME,
165 				/**< BMI Rx only statistics counter */
166 	e_IOC_FM_PORT_COUNTERS_RX_LARGE_FRAME,
167 				/**< BMI Rx only statistics counter */
168 	e_IOC_FM_PORT_COUNTERS_RX_FILTER_FRAME,
169 				/**< BMI Rx & OP only statistics counter */
170 	e_IOC_FM_PORT_COUNTERS_RX_LIST_DMA_ERR,
171 				/**< BMI Rx, OP & HC only statistics counter */
172 	e_IOC_FM_PORT_COUNTERS_RX_OUT_OF_BUFFERS_DISCARD,
173 				/**< BMI Rx, OP & HC statistics counter */
174 	e_IOC_FM_PORT_COUNTERS_PREPARE_TO_ENQUEUE_COUNTER,
175 				/**< BMI Rx, OP & HC only statistics counter */
176 	e_IOC_FM_PORT_COUNTERS_WRED_DISCARD,
177 				/**< BMI OP & HC only statistics counter */
178 	e_IOC_FM_PORT_COUNTERS_LENGTH_ERR,
179 				/**< BMI non-Rx statistics counter */
180 	e_IOC_FM_PORT_COUNTERS_UNSUPPRTED_FORMAT,
181 				/**< BMI non-Rx statistics counter */
182 	e_IOC_FM_PORT_COUNTERS_DEQ_TOTAL,/**< QMI total QM dequeues counter */
183 	e_IOC_FM_PORT_COUNTERS_ENQ_TOTAL,/**< QMI total QM enqueues counter */
184 	e_IOC_FM_PORT_COUNTERS_DEQ_FROM_DEFAULT,/**< QMI counter */
185 	e_IOC_FM_PORT_COUNTERS_DEQ_CONFIRM	/**< QMI counter */
186 } ioc_fm_port_counters;
187 
188 typedef struct ioc_fm_port_bmi_stats_t {
189 	uint32_t cnt_cycle;
190 	uint32_t cnt_task_util;
191 	uint32_t cnt_queue_util;
192 	uint32_t cnt_dma_util;
193 	uint32_t cnt_fifo_util;
194 	uint32_t cnt_rx_pause_activation;
195 	uint32_t cnt_frame;
196 	uint32_t cnt_discard_frame;
197 	uint32_t cnt_dealloc_buf;
198 	uint32_t cnt_rx_bad_frame;
199 	uint32_t cnt_rx_large_frame;
200 	uint32_t cnt_rx_filter_frame;
201 	uint32_t cnt_rx_list_dma_err;
202 	uint32_t cnt_rx_out_of_buffers_discard;
203 	uint32_t cnt_wred_discard;
204 	uint32_t cnt_length_err;
205 	uint32_t cnt_unsupported_format;
206 } ioc_fm_port_bmi_stats_t;
207 
208 /*
209  * @Description   Structure for Port id parameters.
210  *		  (Description may be inaccurate;
211  *		  must match struct t_fm_port_congestion_grps defined in
212  *		  fm_port_ext.h)
213  *
214  *		  Fields commented 'IN' are passed by the port module to be used
215  *		  by the FM module. Fields commented 'OUT' will be filled by FM
216  *		  before returning to port.
217  */
218 typedef struct ioc_fm_port_congestion_groups_t {
219 	uint16_t	num_of_congestion_grps_to_consider;
220 			/**< The number of required congestion groups to define
221 			 * the size of the following array
222 			 */
223 	uint8_t	congestion_grps_to_consider[FM_NUM_CONG_GRPS];
224 			/**< An array of CG indexes; Note that the size of the
225 			 * array should be 'num_of_congestion_grps_to_consider'.
226 			 */
227 	bool	pfc_priorities_enable[FM_NUM_CONG_GRPS][FM_MAX_PFC_PRIO];
228 			/**< A matrix that represents the map between the CG ids
229 			 * defined in 'congestion_grps_to_consider' to the
230 			 * priorities mapping array.
231 			 */
232 } ioc_fm_port_congestion_groups_t;
233 
234 
235 /*
236  * @Function	  fm_port_disable
237  *
238  * @Description   Gracefully disable an FM port. The port will not start new
239  *		  tasks after all tasks associated with the port are terminated.
240  *
241  * @Return	  0 on success; error code otherwise.
242  *
243  * @Cautions	  This is a blocking routine, it returns after port is
244  *		  gracefully stopped, i.e. the port will not except new frames,
245  *		  but it will finish all frames or tasks which were already
246  *		  began
247  */
248 #define FM_PORT_IOC_DISABLE   _IO(FM_IOC_TYPE_BASE, FM_PORT_IOC_NUM(1))
249 
250 /*
251  * @Function	  fm_port_enable
252  *
253  * @Description   A runtime routine provided to allow disable/enable of port.
254  *
255  * @Return	  0 on success; error code otherwise.
256  */
257 #define FM_PORT_IOC_ENABLE   _IO(FM_IOC_TYPE_BASE, FM_PORT_IOC_NUM(2))
258 
259 /*
260  * @Function	  fm_port_set_rate_limit
261  *
262  * @Description   Calling this routine enables rate limit algorithm.
263  *		  By default, this functionality is disabled.
264  *
265  *		  Note that rate - limit mechanism uses the FM time stamp.
266  *		  The selected rate limit specified here would be
267  *		  rounded DOWN to the nearest 16M.
268  *
269  *		  May be used for Tx and offline parsing ports only
270  *
271  * @Param[in]	  ioc_fm_port_rate_limit	A structure of rate limit
272  *						parameters
273  *
274  * @Return	0 on success; error code otherwise.
275  */
276 #define FM_PORT_IOC_SET_RATE_LIMIT \
277 	IOW(FM_IOC_TYPE_BASE, FM_PORT_IOC_NUM(3), ioc_fm_port_rate_limit_t)
278 
279 /*
280  * @Function	  fm_port_delete_rate_limit
281  *
282  * @Description   Calling this routine disables the previously enabled rate
283  *		  limit.
284  *
285  *		  May be used for Tx and offline parsing ports only
286  *
287  * @Return	  0 on success; error code otherwise.
288  */
289 #define FM_PORT_IOC_DELETE_RATE_LIMIT _IO(FM_IOC_TYPE_BASE, FM_PORT_IOC_NUM(5))
290 #define FM_PORT_IOC_REMOVE_RATE_LIMIT FM_PORT_IOC_DELETE_RATE_LIMIT
291 
292 /*
293  * @Function	  fm_port_add_congestion_grps
294  *
295  * @Description   This routine effects the corresponding Tx port.
296  *		  It should be called in order to enable pause frame
297  *		  transmission in case of congestion in one or more of the
298  *		  congestion groups relevant to this port.
299  *		  Each call to this routine may add one or more congestion
300  *		  groups to be considered relevant to this port.
301  *
302  *		  May be used for Rx, or RX+OP ports only (depending on chip)
303  *
304  * @Param[in]	  ioc_fm_port_congestion_groups_t	A pointer to an array of
305  *							congestion group ids to
306  *							consider.
307  *
308  * @Return	  0 on success; error code otherwise.
309  */
310 #define FM_PORT_IOC_ADD_CONGESTION_GRPS	\
311 	_IOW(FM_IOC_TYPE_BASE, FM_PORT_IOC_NUM(34), \
312 	     ioc_fm_port_congestion_groups_t)
313 
314 /*
315  * @Function	fm_port_remove_congestion_grps
316  *
317  * @Description   This routine effects the corresponding Tx port. It should be
318  *		  called when congestion groups were defined for this port and
319  *		  are no longer relevant, or pause frames transmitting is not
320  *		  required on their behalf. Each call to this routine may remove
321  *		  one or more congestion groups to be considered relevant to
322  *		  this port.
323  *
324  *		  May be used for Rx, or RX+OP ports only (depending on chip)
325  *
326  * @Param[in]	  ioc_fm_port_congestion_groups_t	A pointer to an array of
327  *							congestion group ids to
328  *							consider.
329  *
330  * @Return	0 on success; error code otherwise.
331  */
332 #define FM_PORT_IOC_REMOVE_CONGESTION_GRPS	\
333 	_IOW(FM_IOC_TYPE_BASE, FM_PORT_IOC_NUM(35), \
334 	     ioc_fm_port_congestion_groups_t)
335 
336 /*
337  * @Function	  fm_port_set_errors_route
338  *
339  * @Description   Errors selected for this routine will cause a frame with that
340  *		  error to be enqueued to error queue.
341  *		  Errors not selected for this routine will cause a frame with
342  *		  that error to be enqueued to the one of the other port queues.
343  *		  By default all errors are defined to be enqueued to error
344  *		  queue. Errors that were configured to be discarded (at
345  *		  initialization) may not be selected here.
346  *
347  *		  May be used for Rx and offline parsing ports only
348  *
349  * @Param[in]	  ioc_fm_port_frame_err_select_t	A list of errors to
350  *							enqueue to error queue
351  *
352  * @Return	  0 on success; error code otherwise.
353  *
354  * @Cautions	  Allowed only following fm_port_config() and before
355  *		  fm_port_init().
356  *		  (szbs001: How is it possible to have one function that needs
357  *		  to be called BEFORE fm_port_init() implemented as an ioctl,
358  *		  which will ALWAYS be called AFTER the fm_port_init() for that
359  I		  port!?!?!?!???!?!??!?!?)
360  */
361 #define FM_PORT_IOC_SET_ERRORS_ROUTE \
362 	_IOW(FM_IOC_TYPE_BASE, FM_PORT_IOC_NUM(4), \
363 	     ioc_fm_port_frame_err_select_t)
364 
365 /*
366  * @Group	  lnx_ioctl_FM_PORT_pcd_runtime_control_grp FM Port PCD Runtime
367  *		  Control Unit
368  *
369  * @Description   FM Port PCD Runtime control unit API functions, definitions
370  *		  and enums.
371  *
372  * @{
373  */
374 
375 /*
376  * @Description   A structure defining the KG scheme after the parser.
377  *		  (Must match struct ioc_fm_pcd_kg_scheme_select_t defined in
378  *		  fm_port_ext.h)
379  *
380  *		  This is relevant only to change scheme selection mode - from
381  *		  direct to indirect and vice versa, or when the scheme is
382  *		  selected directly, to select the scheme id.
383  *
384  */
385 typedef struct ioc_fm_pcd_kg_scheme_select_t {
386 	bool	direct;
387 		/**< TRUE to use 'scheme_id' directly, FALSE to use LCV.*/
388 	void	*scheme_id;
389 		/**< Relevant for 'direct'=TRUE only. 'scheme_id' selects the
390 		 * scheme after parser.
391 		 */
392 } ioc_fm_pcd_kg_scheme_select_t;
393 
394 /*
395  * @Description   Scheme IDs structure
396  *		  (Must match struct ioc_fm_pcd_port_schemes_params_t defined
397  *		  in fm_port_ext.h)
398  */
399 typedef struct ioc_fm_pcd_port_schemes_params_t {
400 	uint8_t	num_schemes;
401 		/**< Number of schemes for port to be bound to. */
402 	void	*scheme_ids[FM_PCD_KG_NUM_OF_SCHEMES];
403 		/**< Array of 'num_schemes' schemes for the port to be bound
404 		 * to
405 		 */
406 } ioc_fm_pcd_port_schemes_params_t;
407 
408 /*
409  * @Description   A union for defining port protocol parameters for parser
410  *		  (Must match union u_FmPcdHdrPrsOpts defined in fm_port_ext.h)
411  */
412 typedef union ioc_fm_pcd_hdr_prs_opts_u {
413 	/* MPLS */
414 	struct {
415 	bool label_interpretation_enable;
416 		/**< When this bit is set, the last MPLS label will be
417 		 * interpreted as described in HW spec table. When the bit is
418 		 * cleared, the parser will advance to MPLS next parse
419 		 */
420 	ioc_net_header_type next_parse;
421 		/**< must be equal or higher than IPv4 */
422 	} mpls_prs_options;
423 
424 	/* VLAN */
425 	struct {
426 	uint16_t	tag_protocol_id1;
427 		/**< User defined Tag Protocol Identifier, to be recognized on
428 		 * VLAN TAG on top of 0x8100 and 0x88A8
429 		 */
430 	uint16_t	tag_protocol_id2;
431 		/**< User defined Tag Protocol Identifier, to be recognized on
432 		 * VLAN TAG on top of 0x8100 and 0x88A8
433 		 */
434 	} vlan_prs_options;
435 
436 	/* PPP */
437 	struct{
438 		bool		enable_mtu_check;
439 		/**< Check validity of MTU according to RFC2516 */
440 	} pppoe_prs_options;
441 
442 	/* IPV6 */
443 	struct {
444 		bool		routing_hdr_disable;
445 		/**< Disable routing header */
446 	} ipv6_prs_options;
447 
448 	/* UDP */
449 	struct {
450 		bool		pad_ignore_checksum;
451 		/**< TRUE to ignore pad in checksum */
452 	} udp_prs_options;
453 
454 	/* TCP */
455 	struct {
456 		bool		pad_ignore_checksum;
457 		/**< TRUE to ignore pad in checksum */
458 	} tcp_prs_options;
459 } ioc_fm_pcd_hdr_prs_opts_u;
460 
461 /*
462  * @Description   A structure for defining each header for the parser
463  *		  (must match struct t_FmPcdPrsAdditionalHdrParams defined in
464  *		  fm_port_ext.h)
465  */
466 typedef struct ioc_fm_pcd_prs_additional_hdr_params_t {
467 	ioc_net_header_type	hdr; /**< Selected header */
468 	bool	err_disable; /**< TRUE to disable error indication */
469 	bool	soft_prs_enable;
470 		/**< Enable jump to SW parser when this header is recognized by
471 		 * the HW parser.
472 		 */
473 	uint8_t	index_per_hdr;
474 		/**< Normally 0, if more than one sw parser attachments exists
475 		 * for the same header, (in the main sw parser code) use this
476 		 * index to distinguish between them.
477 		 */
478 	bool	use_prs_opts;	/**< TRUE to use parser options. */
479 	ioc_fm_pcd_hdr_prs_opts_u prs_opts;
480 		/**< A unuion according to header type, defining the parser
481 		 * options selected.
482 		 */
483 } ioc_fm_pcd_prs_additional_hdr_params_t;
484 
485 /*
486  * @Description   A structure for defining port PCD parameters
487  *		  (Must match t_fm_portPcdPrsParams defined in fm_port_ext.h)
488  */
489 typedef struct ioc_fm_port_pcd_prs_params_t {
490 	uint8_t		prs_res_priv_info;
491 		/**< The private info provides a method of inserting port
492 		 * information into the parser result. This information may be
493 		 * extracted by KeyGen and be used for frames distribution when
494 		 * a per-port distinction is required, it may also be used as a
495 		 * port logical id for analyzing incoming frames.
496 		 */
497 	uint8_t		parsing_offset;
498 		/**< Number of bytes from beginning of packet to start parsing
499 		 */
500 	ioc_net_header_type	first_prs_hdr;
501 		/**< The type of the first header expected at 'parsing_offset'
502 		 */
503 	bool		include_in_prs_statistics;
504 		/**< TRUE to include this port in the parser statistics */
505 	uint8_t		num_of_hdrs_with_additional_params;
506 		/**< Normally 0, some headers may get special parameters */
507 	ioc_fm_pcd_prs_additional_hdr_params_t
508 			additional_params[IOC_FM_PCD_PRS_NUM_OF_HDRS];
509 		/**< 'num_of_hdrs_with_additional_params' structures additional
510 		 * parameters for each header that requires them
511 		 */
512 	bool		set_vlan_tpid1;
513 		/**< TRUE to configure user selection of Ethertype to indicate a
514 		 * VLAN tag (in addition to the TPID values 0x8100 and 0x88A8).
515 		 */
516 	uint16_t	vlan_tpid1;
517 		/**< extra tag to use if set_vlan_tpid1=TRUE. */
518 	bool		set_vlan_tpid2;
519 		/**< TRUE to configure user selection of Ethertype to indicate a
520 		 * VLAN tag (in addition to the TPID values 0x8100 and 0x88A8).
521 		 */
522 	uint16_t	vlan_tpid2;
523 		/**< extra tag to use if set_vlan_tpid1=TRUE. */
524 } ioc_fm_port_pcd_prs_params_t;
525 
526 /*
527  * @Description   A structure for defining coarse classification parameters
528  *		  (Must match t_fm_portPcdCcParams defined in fm_port_ext.h)
529  */
530 typedef struct ioc_fm_port_pcd_cc_params_t {
531 	void		*cc_tree_id; /**< CC tree id */
532 } ioc_fm_port_pcd_cc_params_t;
533 
534 /*
535  * @Description   A structure for defining keygen parameters
536  *		  (Must match t_fm_portPcdKgParams defined in fm_port_ext.h)
537  */
538 typedef struct ioc_fm_port_pcd_kg_params_t {
539 	uint8_t		num_schemes;
540 			/**< Number of schemes for port to be bound to. */
541 	void		*scheme_ids[FM_PCD_KG_NUM_OF_SCHEMES];
542 			/**< Array of 'num_schemes' schemes for the port to
543 			 * be bound to
544 			 */
545 	bool		direct_scheme;
546 			/**< TRUE for going from parser to a specific scheme,
547 			 * regardless of parser result
548 			 */
549 	void		*direct_scheme_id;
550 			/**< Scheme id, as returned by FM_PCD_KgSetScheme;
551 			 * relevant only if direct=TRUE.
552 			 */
553 } ioc_fm_port_pcd_kg_params_t;
554 
555 /*
556  * @Description   A structure for defining policer parameters
557  *		  (Must match t_fm_portPcdPlcrParams defined in fm_port_ext.h)
558  */
559 typedef struct ioc_fm_port_pcd_plcr_params_t {
560 	void	*plcr_profile_id;
561 		/**< Selected profile handle;
562 		 * relevant in one of the following cases:
563 		 * e_IOC_FM_PCD_PLCR_ONLY or
564 		 * e_IOC_FM_PCD_PRS_PLCR were selected, or if
565 		 * any flow uses a KG scheme where policer profile is not
566 		 * generated (bypass_plcr_profile_generation selected)
567 		 */
568 } ioc_fm_port_pcd_plcr_params_t;
569 
570 /*
571  * @Description   A structure for defining port PCD parameters
572  *		  (Must match struct t_fm_portPcdParams defined in
573  *		  fm_port_ext.h)
574  */
575 typedef struct ioc_fm_port_pcd_params_t {
576 	ioc_fm_port_pcd_support	pcd_support;
577 		/**< Relevant for Rx and offline ports only.
578 		 * Describes the active PCD engines for this port.
579 		 */
580 	void		*net_env_id;	/**< HL Unused in PLCR only mode */
581 	ioc_fm_port_pcd_prs_params_t	*p_prs_params;
582 		/**< Parser parameters for this port */
583 	ioc_fm_port_pcd_cc_params_t	*p_cc_params;
584 		/**< Coarse classification parameters for this port */
585 	ioc_fm_port_pcd_kg_params_t	*p_kg_params;
586 		/**< Keygen parameters for this port */
587 	ioc_fm_port_pcd_plcr_params_t	*p_plcr_params;
588 		/**< Policer parameters for this port */
589 	void		*p_ip_reassembly_manip;
590 		/**< IP Reassembly manipulation */
591 	void		*p_capwap_reassembly_manip;
592 		/**< CAPWAP Reassembly manipulation */
593 } ioc_fm_port_pcd_params_t;
594 
595 /*
596  * @Description   A structure for defining the Parser starting point
597  *		  (Must match struct ioc_fm_pcd_prs_start_t defined in
598  *		  fm_port_ext.h)
599  */
600 typedef struct ioc_fm_pcd_prs_start_t {
601 	uint8_t	parsing_offset;
602 		/**< Number of bytes from beginning of packet to start parsing
603 		 */
604 	ioc_net_header_type first_prs_hdr;
605 		/**< The type of the first header expected at 'parsing_offset'
606 		 */
607 } ioc_fm_pcd_prs_start_t;
608 
609 /*
610  * @Description   FQID parameters structure
611  */
612 typedef struct ioc_fm_port_pcd_fqids_params_t {
613 	uint32_t	num_fqids;
614 		/**< Number of fqids to be allocated for the port */
615 	uint8_t		alignment;
616 		/**< Alignment required for this port */
617 	uint32_t	base_fqid;
618 		/**< output parameter - the base fqid */
619 } ioc_fm_port_pcd_fqids_params_t;
620 
621 /*
622  * @Function	  FM_PORT_IOC_ALLOC_PCD_FQIDS
623  *
624  * @Description   Allocates FQID's
625  *		  May be used for Rx and offline parsing ports only
626  *
627  * @Param[in,out] ioc_fm_port_pcd_fqids_params_t	Parameters for
628  *							allocating FQID's
629  *
630  * @Return	  0 on success; error code otherwise.
631  */
632 #define FM_PORT_IOC_ALLOC_PCD_FQIDS \
633 	_IOWR(FM_IOC_TYPE_BASE, FM_PORT_IOC_NUM(19), \
634 	      ioc_fm_port_pcd_fqids_params_t)
635 
636 /*
637  * @Function	  FM_PORT_IOC_FREE_PCD_FQIDS
638  *
639  * @Description   Frees previously-allocated FQIDs
640  *		  May be used for Rx and offline parsing ports only
641  *
642  * @Param[in]	  uint32_t	Base FQID of previously allocated range.
643  *
644  * @Return	  0 on success; error code otherwise.
645  */
646 #define FM_PORT_IOC_FREE_PCD_FQIDS \
647 	_IOW(FM_IOC_TYPE_BASE, FM_PORT_IOC_NUM(19), uint32_t)
648 
649 /*
650  * @Function	fm_port_set_pcd
651  *
652  * @Description   Calling this routine defines the port's PCD configuration.
653  *		  It changes it from its default configuration which is PCD
654  *		  disabled (BMI to BMI) and configures it according to the
655  *		  passed parameters.
656  *		  May be used for Rx and offline parsing ports only
657  *
658  * @Param[in]	  ioc_fm_port_pcd_params_t	A Structure of parameters
659  *						defining the port's PCD
660  *						configuration.
661  *
662  * @Return	  0 on success; error code otherwise.
663  */
664 #define FM_PORT_IOC_SET_PCD \
665 	_IOW(FM_IOC_TYPE_BASE, FM_PORT_IOC_NUM(20), ioc_fm_port_pcd_params_t)
666 
667 /*
668  * @Function	  fm_port_delete_pcd
669  *
670  * @Description   Calling this routine releases the port's PCD configuration.
671  *		  The port returns to its default configuration which is PCD
672  *		  disabled (BMI to BMI) and all PCD configuration is removed.
673  *		  May be used for Rx and offline parsing ports which are in PCD
674  *		  mode only
675  *
676  * @Return	  0 on success; error code otherwise.
677  */
678 #define FM_PORT_IOC_DELETE_PCD _IO(FM_IOC_TYPE_BASE, FM_PORT_IOC_NUM(21))
679 
680 /*
681  * @Function	  fm_port_attach_pcd
682  *
683  * @Description   This routine may be called after fm_port_detach_pcd was
684  *		  called, to return to the originally configured PCD support
685  *		  flow. The couple of routines are used to allow PCD
686  *		  configuration changes that demand that PCD will not be used
687  *		  while changes take place.
688  *
689  *		  May be used for Rx and offline parsing ports which are in PCD
690  *		  mode only
691  *
692  * @Return	  0 on success; error code otherwise.
693  */
694 #define FM_PORT_IOC_ATTACH_PCD _IO(FM_IOC_TYPE_BASE, FM_PORT_IOC_NUM(23))
695 
696 /*
697  * @Function	  fm_port_detach_pcd
698  *
699  * @Description   Calling this routine detaches the port from its PCD
700  *		  functionality. The port returns to its default flow which is
701  *		  BMI to BMI.
702  *
703  *		  May be used for Rx and offline parsing ports which are in PCD
704  *		  mode only
705  *
706  * @Return	  0 on success; error code otherwise.
707  */
708 #define FM_PORT_IOC_DETACH_PCD _IO(FM_IOC_TYPE_BASE, FM_PORT_IOC_NUM(22))
709 
710 /*
711  * @Function	  fm_port_pcd_plcr_alloc_profiles
712  *
713  * @Description   This routine may be called only for ports that use the Policer
714  *		  in order to allocate private policer profiles.
715  *
716  * @Param[in]	  uint16_t	The number of required policer profiles
717  *
718  * @Return	  0 on success; error code otherwise.
719  *
720  * @Cautions	  Allowed before fm_port_set_pcd() only.
721  */
722 #define FM_PORT_IOC_PCD_PLCR_ALLOC_PROFILES	\
723 	_IOW(FM_IOC_TYPE_BASE, FM_PORT_IOC_NUM(24), uint16_t)
724 
725 /*
726  * @Function	  fm_port_pcd_plcr_free_profiles
727  *
728  * @Description   This routine should be called for freeing private policer
729  *		  profiles.
730  *
731  * @Return	  0 on success; error code otherwise.
732  *
733  * @Cautions	  Allowed before fm_port_set_pcd() only.
734  */
735 #define FM_PORT_IOC_PCD_PLCR_FREE_PROFILES	\
736 	_IO(FM_IOC_TYPE_BASE, FM_PORT_IOC_NUM(25))
737 
738 /*
739  * @Function	  fm_port_pcd_kg_modify_initial_scheme
740  *
741  * @Description   This routine may be called only for ports that use the keygen
742  *		  in order to change the initial scheme frame should be routed
743  *		  to.The change may be of a scheme id (in case of direct mode),
744  *		  from direct to indirect, or from indirect to direct -
745  *		  specifying the scheme id.
746  *
747  * @Param[in]	  ioc_fm_pcd_kg_scheme_select_t
748  *		  A structure of parameters for defining whether a scheme is
749  *		  direct/indirect, and if direct - scheme id.
750  *
751  * @Return	  0 on success; error code otherwise.
752  */
753 #define FM_PORT_IOC_PCD_KG_MODIFY_INITIAL_SCHEME \
754 	_IOW(FM_IOC_TYPE_BASE, FM_PORT_IOC_NUM(26), \
755 	     ioc_fm_pcd_kg_scheme_select_t)
756 
757 /*
758  * @Function	  fm_port_pcd_plcr_modify_initial_profile
759  *
760  * @Description   This routine may be called for ports with flows
761  *		  e_IOC_FM_PCD_SUPPORT_PLCR_ONLY or
762  *		  e_IOC_FM_PCD_SUPPORT_PRS_AND_PLCR only, to change the initial
763  *		  Policer profile frame should be routed to.
764  *		  The change may be of a profile and / or absolute / direct mode
765  *		  selection.
766  *
767  * @Param[in]	  ioc_fm_obj_t		Policer profile Id as returned from
768  *					FM_PCD_PlcrSetProfile.
769  *
770  * @Return	  0 on success; error code otherwise.
771  */
772 #define FM_PORT_IOC_PCD_PLCR_MODIFY_INITIAL_PROFILE \
773 	_IOW(FM_IOC_TYPE_BASE, FM_PORT_IOC_NUM(27), ioc_fm_obj_t)
774 
775 /*
776  * @Function	  fm_port_pcd_cc_modify_tree
777  *
778  * @Description   This routine may be called to change this port connection to
779  *		  a pre - initializes coarse classification Tree.
780  *
781  * @Param[in]	  ioc_fm_obj_t	Id of new coarse classification tree selected
782  *				for this port.
783  *
784  * @Return	  0 on success; error code otherwise.
785  *
786  * @Cautions	  Allowed only following fm_port_set_pcd() and
787  *		  fm_port_detach_pcd()
788  */
789 #define FM_PORT_IOC_PCD_CC_MODIFY_TREE \
790 	_IOW(FM_IOC_TYPE_BASE, FM_PORT_IOC_NUM(28), ioc_fm_obj_t)
791 
792 /*
793  * @Function	  fm_port_pcd_kg_bind_schemes
794  *
795  * @Description   These routines may be called for modifying the binding of
796  *		  ports to schemes. The scheme itself is not added, just this
797  *		  specific port starts using it.
798  *
799  * @Param[in]	  ioc_fm_pcd_port_schemes_params_t	Schemes parameters
800  *							structure
801  *
802  * @Return	  0 on success; error code otherwise.
803  *
804  * @Cautions	  Allowed only following fm_port_set_pcd().
805  */
806 #define FM_PORT_IOC_PCD_KG_BIND_SCHEMES \
807 	_IOW(FM_IOC_TYPE_BASE, FM_PORT_IOC_NUM(30), \
808 	     ioc_fm_pcd_port_schemes_params_t)
809 
810 /*
811  * @Function	  fm_port_pcd_kg_unbind_schemes
812  *
813  * @Description   These routines may be called for modifying the binding of
814  *		  ports to schemes. The scheme itself is not removed or
815  *		  invalidated, just this specific port stops using it.
816  *
817  * @Param[in]	  ioc_fm_pcd_port_schemes_params_t	Schemes parameters
818  *							structure
819  *
820  * @Return	  0 on success; error code otherwise.
821  *
822  * @Cautions	  Allowed only following fm_port_set_pcd().
823  */
824 #define FM_PORT_IOC_PCD_KG_UNBIND_SCHEMES \
825 	_IOW(FM_IOC_TYPE_BASE, FM_PORT_IOC_NUM(31), \
826 	     ioc_fm_pcd_port_schemes_params_t)
827 
828 #define ENET_NUM_OCTETS_PER_ADDRESS 6
829 		/**< Number of octets (8-bit bytes) in an ethernet address */
830 typedef struct ioc_fm_port_mac_addr_params_t {
831 	uint8_t addr[ENET_NUM_OCTETS_PER_ADDRESS];
832 } ioc_fm_port_mac_addr_params_t;
833 
834 /*
835  * @Function	  FM_MAC_AddHashMacAddr
836  *
837  * @Description   Add an Address to the hash table. This is for filter purpose
838  *		  only.
839  *
840  * @Param[in]	  ioc_fm_port_mac_addr_params_t		Ethernet Mac address
841  *
842  * @Return	  E_OK on success; Error code otherwise.
843  *
844  * @Cautions	  Allowed only following FM_MAC_Init(). It is a filter only
845  *		  address.
846  * @Cautions	  Some address need to be filtered out in upper FM blocks.
847  */
848 #define FM_PORT_IOC_ADD_RX_HASH_MAC_ADDR  \
849 	_IOW(FM_IOC_TYPE_BASE, FM_PORT_IOC_NUM(36), \
850 	     ioc_fm_port_mac_addr_params_t)
851 
852 /*
853  * @Function	  FM_MAC_RemoveHashMacAddr
854  *
855  * @Description   Delete an Address to the hash table. This is for filter
856  *		  purpose only.
857  *
858  * @Param[in]	  ioc_fm_port_mac_addr_params_t		Ethernet Mac address
859  *
860  * @Return	  E_OK on success; Error code otherwise.
861  *
862  * @Cautions	  Allowed only following FM_MAC_Init().
863  */
864 #define FM_PORT_IOC_REMOVE_RX_HASH_MAC_ADDR  \
865 	_IOW(FM_IOC_TYPE_BASE, FM_PORT_IOC_NUM(37), \
866 	     ioc_fm_port_mac_addr_params_t)
867 
868 typedef struct ioc_fm_port_tx_pause_frames_t {
869 	uint8_t  priority;
870 	uint16_t pause_time;
871 	uint16_t thresh_time;
872 } ioc_fm_port_tx_pause_frames_t;
873 
874 /*
875  * @Function	  FM_MAC_SetTxPauseFrames
876  *
877  * @Description   Enable/Disable transmission of Pause-Frames. The routine
878  *		  changes the default configuration: pause-time - [0xf000]
879  *		  threshold-time - [0]
880  *
881  * @Param[in]	  ioc_fm_port_tx_pause_frames_params_t
882  *		  A structure holding the required parameters.
883  *
884  * @Return	  E_OK on success; Error code otherwise.
885  *
886  * @Cautions	  Allowed only following FM_MAC_Init(). PFC is supported only on
887  *		  new mEMAC; i.e. in MACs that don't have PFC support (10G-MAC
888  *		  and dTSEC), user should use 'FM_MAC_NO_PFC' in the 'priority'
889  *		  field.
890  */
891 #define FM_PORT_IOC_SET_TX_PAUSE_FRAMES	\
892 	_IOW(FM_IOC_TYPE_BASE, FM_PORT_IOC_NUM(40), \
893 		ioc_fm_port_tx_pause_frames_t)
894 
895 typedef struct ioc_fm_port_mac_statistics_t {
896 	/* RMON */
897 	uint64_t  e_stat_pkts_64;
898 		/**< r-10G tr-DT 64 byte frame counter */
899 	uint64_t  e_stat_pkts_65_to_127;
900 		/**< r-10G 65 to 127 byte frame counter */
901 	uint64_t  e_stat_pkts_128_to_255;
902 		/**< r-10G 128 to 255 byte frame counter */
903 	uint64_t  e_stat_pkts_256_to_511;
904 		/**< r-10G 256 to 511 byte frame counter */
905 	uint64_t  e_stat_pkts_512_to_1023;
906 		/**< r-10G 512 to 1023 byte frame counter*/
907 	uint64_t  e_stat_pkts_1024_to_1518;
908 		/**< r-10G 1024 to 1518 byte frame counter */
909 	uint64_t  e_stat_pkts_1519_to_1522;
910 		/**< r-10G 1519 to 1522 byte good frame count */
911 	/* */
912 	uint64_t  e_stat_fragments;
913 		/**< Total number of packets that were less than 64 octets long
914 		 * with a wrong CRC.
915 		 */
916 	uint64_t  e_stat_jabbers;
917 		/**< Total number of packets longer than valid maximum length
918 		 * octets
919 		 */
920 	uint64_t  e_stat_drop_events;
921 		/**< number of dropped packets due to internal errors of the MAC
922 		 * Client (during receive).
923 		 */
924 	uint64_t  e_stat_CRC_align_errors;
925 		/**< Incremented when frames of correct length but with CRC
926 		 * error are received.
927 		 */
928 	uint64_t  e_stat_undersize_pkts;
929 		/**< Incremented for frames under 64 bytes with a valid FCS and
930 		 * otherwise well formed; This count does not include range
931 		 * length errors
932 		 */
933 	uint64_t  e_stat_oversize_pkts;
934 		/**< Incremented for frames which exceed 1518 (non VLAN) or 1522
935 		 * (VLAN) and contains a valid FCS and otherwise well formed
936 		 */
937 	/* Pause */
938 	uint64_t  rx_stat_pause;	/**< Pause MAC Control received */
939 	uint64_t  tx_stat_pause;	/**< Pause MAC Control sent */
940 	/* MIB II */
941 	uint64_t  if_in_octets;		/**< Total number of byte received. */
942 	uint64_t  if_in_pkts;		/**< Total number of packets received.*/
943 	uint64_t  if_in_ucast_pkts;
944 		/**< Total number of unicast frame received;
945 		 * NOTE: this counter is not supported on dTSEC MAC
946 		 */
947 	uint64_t  if_in_mcast_pkts;
948 		/**< Total number of multicast frame received*/
949 	uint64_t  if_in_bcast_pkts;
950 		/**< Total number of broadcast frame received */
951 	uint64_t  if_in_discards;
952 		/**< Frames received, but discarded due to problems within the
953 		 * MAC RX.
954 		 */
955 	uint64_t  if_in_errors;
956 		/**< Number of frames received with error:
957 		 *	- FIFO Overflow Error
958 		 *	- CRC Error
959 		 *	- Frame Too Long Error
960 		 *	- Alignment Error
961 		 *	- The dedicated Error Code (0xfe, not a code error) was
962 		 *	  received
963 		 */
964 	uint64_t  if_out_octets;	/**< Total number of byte sent. */
965 	uint64_t  if_out_pkts;		/**< Total number of packets sent .*/
966 	uint64_t  if_out_ucast_pkts;
967 		/**< Total number of unicast frame sent;
968 		 * NOTE: this counter is not supported on dTSEC MAC
969 		 */
970 	uint64_t  if_out_mcast_pkts;
971 		/**< Total number of multicast frame sent */
972 	uint64_t  if_out_bcast_pkts;
973 		/**< Total number of multicast frame sent */
974 	uint64_t  if_out_discards;
975 		/**< Frames received, but discarded due to problems within the
976 		 * MAC TX N/A!.
977 		 */
978 	uint64_t  if_out_errors;
979 		/**< Number of frames transmitted with error:
980 		 *	- FIFO Overflow Error
981 		 *	- FIFO Underflow Error
982 		 *	- Other
983 		 */
984 } ioc_fm_port_mac_statistics_t;
985 
986 /*
987  * @Function	  FM_MAC_GetStatistics
988  *
989  * @Description   get all MAC statistics counters
990  *
991  * @Param[out]	  ioc_fm_port_mac_statistics_t	A structure holding the
992  *						statistics
993  *
994  * @Return	  E_OK on success; Error code otherwise.
995  *
996  * @Cautions	  Allowed only following FM_Init().
997  */
998 #define FM_PORT_IOC_GET_MAC_STATISTICS	\
999 	_IOR(FM_IOC_TYPE_BASE, FM_PORT_IOC_NUM(41), \
1000 	     ioc_fm_port_mac_statistics_t)
1001 
1002 /*
1003  * @Function	  fm_port_get_bmi_counters
1004  *
1005  * @Description   Read port's BMI stat counters and place them into
1006  *		  a designated structure of counters.
1007  *
1008  * @Param[in]	  h_fm_port	A handle to a FM Port module.
1009  * @Param[out]	  p_bmi_stats	counters structure
1010  *
1011  * @Return	  E_OK on success; Error code otherwise.
1012  *
1013  * @Cautions	  Allowed only following fm_port_init().
1014  */
1015 
1016 #define FM_PORT_IOC_GET_BMI_COUNTERS \
1017 	_IOR(FM_IOC_TYPE_BASE, FM_PORT_IOC_NUM(42), ioc_fm_port_bmi_stats_t)
1018 
1019 /** @} */ /* end of lnx_ioctl_FM_PORT_pcd_runtime_control_grp group */
1020 /** @} */ /* end of lnx_ioctl_FM_PORT_runtime_control_grp group */
1021 
1022 /** @} */ /* end of lnx_ioctl_FM_PORT_grp group */
1023 /** @} */ /* end of lnx_ioctl_FM_grp group */
1024 
1025 
1026 /*
1027  * @Group	  gen_id	General Drivers Utilities
1028  *
1029  * @Description   External routines.
1030  *
1031  * @{
1032  */
1033 
1034 /*
1035  * @Group	  gen_error_id	Errors, Events and Debug
1036  *
1037  * @Description   External routines.
1038  *
1039  * @{
1040  */
1041 
1042 /*
1043  * The scheme below provides the bits description for error codes:
1044  *
1045  *  0   1   2   3   4   5   6   7   8   9   10   11   12   13   14   15
1046  * |	Reserved (should be zero)	|	Module ID		|
1047  *
1048  *  16   17   18   19   20   21   22  23   24   25   26   27   28   29   30   31
1049  * |				Error Type			       |
1050  */
1051 
1052 #define ERROR_CODE(_err)  ((((uint32_t)_err) & 0x0000FFFF) | __ERR_MODULE__)
1053 
1054 #define GET_ERROR_TYPE(_errcode)	((_errcode) & 0x0000FFFF)
1055 			/**< Extract module code from error code (#uint32_t) */
1056 
1057 #define GET_ERROR_MODULE(_errcode)  ((_errcode) & 0x00FF0000)
1058 			/**< Extract error type (#e_error_type) from
1059 			 * error code (#uint32_t)
1060 			 */
1061 
1062 #define RETURN_ERROR(_level, _err, _vmsg) { return ERROR_CODE(_err); }
1063 
1064 /*
1065  * @Description  Error Type Enumeration
1066  */
1067 typedef enum e_error_type {
1068 	E_OK = 0
1069 		/* Never use "RETURN_ERROR" with E_OK; Use "return E_OK;"*/
1070 	, E_WRITE_FAILED = EIO
1071 		/**< Write access failed on memory/device.*/
1072 		/* String: none, or device name.*/
1073 	, E_NO_DEVICE = ENXIO
1074 		/**< The associated device is not initialized.*/
1075 		/* String: none.*/
1076 	, E_NOT_AVAILABLE = EAGAIN
1077 		/**< Resource is unavailable.*/
1078 		/* String: none, unless the operation is not the main goal of
1079 		 *	   the function (in this case add resource description).
1080 		 */
1081 	, E_NO_MEMORY = ENOMEM
1082 		/**< External memory allocation failed.*/
1083 		/* String: description of item for which allocation failed. */
1084 	, E_INVALID_ADDRESS = EFAULT
1085 		/**< Invalid address.*/
1086 		/*   String: description of the specific violation.*/
1087 	, E_BUSY = EBUSY
1088 		/**< Resource or module is busy.*/
1089 		/* String: none, unless the operation is not the main goal
1090 		 *	   of the function (in this case add resource
1091 		 *	   description).
1092 		 */
1093 	, E_ALREADY_EXISTS = EEXIST
1094 		/**< Requested resource or item already exists.*/
1095 		/* Use when resource duplication or sharing are not allowed.
1096 		 * String: none, unless the operation is not the main goal
1097 		 *	   of the function (in this case add item description).
1098 		 */
1099 	, E_INVALID_OPERATION = ENODEV
1100 		/**< The operation/command is invalid (unrecognized).*/
1101 		/* String: none.*/
1102 	, E_INVALID_VALUE = EDOM
1103 		/**< Invalid value.*/
1104 		/* Use for non-enumeration parameters, and only when other error
1105 		 * types are not suitable.
1106 		 * String: parameter description + "(should be <attribute>)",
1107 		 *	   e.g: "Maximum Rx buffer length (should be divisible
1108 		 *	   by 8)", "Channel number (should be even)".
1109 		 */
1110 	, E_NOT_IN_RANGE = ERANGE
1111 		/**< Parameter value is out of range.*/
1112 		/* Don't use this error for enumeration parameters.
1113 		 * String: parameter description + "(should be %d-%d)",
1114 		 *	   e.g: "Number of pad characters (should be 0-15)".
1115 		 */
1116 	, E_NOT_SUPPORTED = ENOSYS
1117 		/**< The function is not supported or not implemented.*/
1118 		/* String: none.*/
1119 	, E_INVALID_STATE
1120 		/**< The operation is not allowed in current module state.*/
1121 		/* String: none.*/
1122 	, E_INVALID_HANDLE
1123 		/**< Invalid handle of module or object.*/
1124 		/* String: none, unless the function takes in more than one
1125 		 *	   handle (in this case add the handle description)
1126 		 */
1127 	, E_INVALID_ID
1128 		/**< Invalid module ID (usually enumeration or index).*/
1129 		/* String: none, unless the function takes in more than one ID
1130 		 *	   (in this case add the ID description)
1131 		 */
1132 	, E_NULL_POINTER
1133 		/**< Unexpected NULL pointer.*/
1134 		/* String: pointer description.*/
1135 	, E_INVALID_SELECTION
1136 		/**< Invalid selection or mode.*/
1137 		/* Use for enumeration values, only when other error types are
1138 		 * not suitable.
1139 		 * String: parameter description.
1140 		 */
1141 	, E_INVALID_COMM_MODE
1142 		/**< Invalid communication mode.*/
1143 		/* String: none, unless the function takes in more than one
1144 		 *	   communication mode indications (in this case add
1145 		 *	   parameter description).
1146 		 */
1147 	, E_INVALID_MEMORY_TYPE
1148 		/**< Invalid memory type.*/
1149 		/* String: none, unless the function takes in more than one
1150 		 *	   memory types (in this case add memory description,
1151 		 *	   e.g: "Data memory", "Buffer descriptors memory").
1152 		 */
1153 	, E_INVALID_CLOCK
1154 		/**< Invalid clock.*/
1155 		/* String: none, unless the function takes in more than one
1156 		 *	   clocks (in this case add clock description, e.g: "Rx
1157 		 *	   clock", "Tx clock").
1158 		 */
1159 	, E_CONFLICT
1160 		/**< Some setting conflicts with another setting.*/
1161 		/* String: description of the conflicting settings.*/
1162 	, E_NOT_ALIGNED
1163 		/**< Non-aligned address.*/
1164 		/* String: parameter description + "(should be %d-bytes
1165 		 *	   aligned)", e.g: "Rx data buffer (should be 32-bytes
1166 		 *	   aligned)".
1167 		 */
1168 	, E_NOT_FOUND
1169 		/**< Requested resource or item was not found.*/
1170 		/* Use only when the resource/item is uniquely identified.
1171 		 * String: none, unless the operation is not the main goal
1172 		 *	   of the function (in this case add item description).
1173 		 */
1174 	, E_FULL
1175 		/**< Resource is full.*/
1176 		/* String: none, unless the operation is not the main goal of
1177 		 *	   the function (in this case add resource description).
1178 		 */
1179 	, E_EMPTY
1180 		/**< Resource is empty.*/
1181 		/* String: none, unless the operation is not the main goal of
1182 		 *	   the function (in this case add resource description).
1183 		 */
1184 	, E_ALREADY_FREE
1185 		/**< Specified resource or item is already free or deleted.*/
1186 		/* String: none, unless the operation is not the main goal
1187 		 *	   of the function (in this case add item description).
1188 		 */
1189 	, E_READ_FAILED
1190 		/**< Read access failed on memory/device.*/
1191 		/* String: none, or device name.*/
1192 	, E_INVALID_FRAME
1193 		/**< Invalid frame object (NULL handle or missing buffers).*/
1194 		/* String: none.*/
1195 	, E_SEND_FAILED
1196 		/**< Send operation failed on device.*/
1197 		/* String: none, or device name.*/
1198 	, E_RECEIVE_FAILED
1199 		/**< Receive operation failed on device.*/
1200 		/* String: none, or device name.*/
1201 	, E_TIMEOUT/* = ETIMEDOUT*/
1202 		/**< The operation timed out.*/
1203 		/* String: none.*/
1204 
1205 	, E_DUMMY_LAST	/* NEVER USED */
1206 
1207 } e_error_type;
1208 
1209 /*
1210  *
1211  * @Group	  FM_grp Frame Manager API
1212  *
1213  * @Description   FM API functions, definitions and enums
1214  *
1215  * @{
1216  */
1217 
1218 /*
1219  * @Group	  FM_PORT_grp FM Port
1220  *
1221  * @Description   FM Port API
1222  *
1223  *		  The FM uses a general module called "port" to represent a Tx
1224  *		  port (MAC), an Rx port (MAC) or Offline Parsing port. The
1225  *		  number of ports in an FM varies between SOCs. The SW driver
1226  *		  manages these ports as sub-modules of the FM, i.e. after an FM
1227  *		  is initialized, its ports may be initialized and operated
1228  *		  upon.
1229  *
1230  *		  The port is initialized aware of its type, but other functions
1231  *		  on a port may be indifferent to its type. When necessary, the
1232  *		  driver verifies coherence and returns error if applicable.
1233  *
1234  *		  On initialization, user specifies the port type and it's index
1235  *		  (relative to the port's type) - always starting at 0.
1236  *
1237  * @{
1238  */
1239 
1240 /*
1241  * @Description   An enum for defining port PCD modes.
1242  *		  This enum defines the superset of PCD engines support - i.e.
1243  *		  not all engines have to be used, but all have to be enabled.
1244  *		  The real flow of a specific frame depends on the PCD
1245  *		  configuration and the frame headers and payload. Note: the
1246  *		  first engine and the first engine after the parser (if exists)
1247  *		  should be in order, the order is important as it will define
1248  *		  the flow of the port. However, as for the rest engines (the
1249  *		  ones that follows), the order is not important anymore as it
1250  *		  is defined by the PCD graph itself.
1251  */
1252 typedef enum e_fm_port_pcd_support {
1253 	e_FM_PORT_PCD_SUPPORT_NONE = 0
1254 		/**< BMI to BMI, PCD is not used */
1255 	, e_FM_PORT_PCD_SUPPORT_PRS_ONLY
1256 		/**< Use only Parser */
1257 	, e_FM_PORT_PCD_SUPPORT_PLCR_ONLY
1258 		/**< Use only Policer */
1259 	, e_FM_PORT_PCD_SUPPORT_PRS_AND_PLCR
1260 		/**< Use Parser and Policer */
1261 	, e_FM_PORT_PCD_SUPPORT_PRS_AND_KG
1262 		/**< Use Parser and Keygen */
1263 	, e_FM_PORT_PCD_SUPPORT_PRS_AND_KG_AND_CC
1264 		/**< Use Parser, Keygen and Coarse Classification */
1265 	, e_FM_PORT_PCD_SUPPORT_PRS_AND_KG_AND_CC_AND_PLCR
1266 		/**< Use all PCD engines */
1267 	, e_FM_PORT_PCD_SUPPORT_PRS_AND_KG_AND_PLCR
1268 		/**< Use Parser, Keygen and Policer */
1269 	, e_FM_PORT_PCD_SUPPORT_PRS_AND_CC
1270 		/**< Use Parser and Coarse Classification */
1271 	, e_FM_PORT_PCD_SUPPORT_PRS_AND_CC_AND_PLCR
1272 		/**< Use Parser and Coarse Classification and Policer */
1273 	, e_FM_PORT_PCD_SUPPORT_CC_ONLY
1274 		/**< Use only Coarse Classification */
1275 #ifdef FM_CAPWAP_SUPPORT
1276 	, e_FM_PORT_PCD_SUPPORT_CC_AND_KG
1277 		/**< Use Coarse Classification,and Keygen */
1278 	, e_FM_PORT_PCD_SUPPORT_CC_AND_KG_AND_PLCR
1279 		/**< Use Coarse Classification, Keygen and Policer */
1280 #endif /* FM_CAPWAP_SUPPORT */
1281 } e_fm_port_pcd_support;
1282 
1283 /*
1284  * @Description   Port interrupts
1285  */
1286 typedef enum e_fm_port_exceptions {
1287 	e_FM_PORT_EXCEPTION_IM_BUSY	/**< Independent-Mode Rx-BUSY */
1288 } e_fm_port_exceptions;
1289 
1290 /*
1291  * @Collection	General FM Port defines
1292  */
1293 #define FM_PORT_PRS_RESULT_NUM_OF_WORDS	8
1294 		/**< Number of 4 bytes words in parser result */
1295 /* @} */
1296 
1297 /*
1298  * @Collection   FM Frame error
1299  */
1300 typedef uint32_t	fm_port_frame_err_select_t;
1301 			/**< typedef for defining Frame Descriptor errors */
1302 
1303 #define FM_PORT_FRM_ERR_UNSUPPORTED_FORMAT FM_FD_ERR_UNSUPPORTED_FORMAT
1304 			/**< Not for Rx-Port! Unsupported Format */
1305 #define FM_PORT_FRM_ERR_LENGTH		FM_FD_ERR_LENGTH
1306 			/**< Not for Rx-Port! Length Error */
1307 #define FM_PORT_FRM_ERR_DMA		FM_FD_ERR_DMA	/**< DMA Data error */
1308 #define FM_PORT_FRM_ERR_NON_FM		FM_FD_RX_STATUS_ERR_NON_FM
1309 			/**< non Frame-Manager error; probably come from SEC
1310 			 * that was chained to FM
1311 			 */
1312 
1313 #define FM_PORT_FRM_ERR_IPRE		(FM_FD_ERR_IPR & ~FM_FD_IPR)
1314 			/**< IPR error */
1315 #define FM_PORT_FRM_ERR_IPR_NCSP	(FM_FD_ERR_IPR_NCSP & ~FM_FD_IPR)
1316 			/**< IPR non-consistent-sp */
1317 
1318 #define FM_PORT_FRM_ERR_IPFE		0
1319 			/**< Obsolete; will be removed in the future */
1320 
1321 #ifdef FM_CAPWAP_SUPPORT
1322 #define FM_PORT_FRM_ERR_CRE		FM_FD_ERR_CRE
1323 #define FM_PORT_FRM_ERR_CHE		FM_FD_ERR_CHE
1324 #endif /* FM_CAPWAP_SUPPORT */
1325 
1326 #define FM_PORT_FRM_ERR_PHYSICAL	FM_FD_ERR_PHYSICAL
1327 			/**< Rx FIFO overflow, FCS error, code error, running
1328 			 * disparity error (SGMII and TBI modes), FIFO parity
1329 			 * error. PHY Sequence error, PHY error control
1330 			 * character detected.
1331 			 */
1332 #define FM_PORT_FRM_ERR_SIZE		FM_FD_ERR_SIZE
1333 			/**< Frame too long OR Frame size exceeds
1334 			 * max_length_frame
1335 			 */
1336 #define FM_PORT_FRM_ERR_CLS_DISCARD	FM_FD_ERR_CLS_DISCARD
1337 			/**< indicates a classifier "drop" operation */
1338 #define FM_PORT_FRM_ERR_EXTRACTION	FM_FD_ERR_EXTRACTION
1339 			/**< Extract Out of Frame */
1340 #define FM_PORT_FRM_ERR_NO_SCHEME	FM_FD_ERR_NO_SCHEME
1341 			/**< No Scheme Selected */
1342 #define FM_PORT_FRM_ERR_KEYSIZE_OVERFLOW FM_FD_ERR_KEYSIZE_OVERFLOW
1343 			/**< Keysize Overflow */
1344 #define FM_PORT_FRM_ERR_COLOR_RED	FM_FD_ERR_COLOR_RED
1345 			/**< Frame color is red */
1346 #define FM_PORT_FRM_ERR_COLOR_YELLOW	FM_FD_ERR_COLOR_YELLOW
1347 			/**< Frame color is yellow */
1348 #define FM_PORT_FRM_ERR_ILL_PLCR	FM_FD_ERR_ILL_PLCR
1349 			/**< Illegal Policer Profile selected */
1350 #define FM_PORT_FRM_ERR_PLCR_FRAME_LEN	FM_FD_ERR_PLCR_FRAME_LEN
1351 			/**< Policer frame length error */
1352 #define FM_PORT_FRM_ERR_PRS_TIMEOUT	FM_FD_ERR_PRS_TIMEOUT
1353 			/**< Parser Time out Exceed */
1354 #define FM_PORT_FRM_ERR_PRS_ILL_INSTRUCT FM_FD_ERR_PRS_ILL_INSTRUCT
1355 			/**< Invalid Soft Parser instruction */
1356 #define FM_PORT_FRM_ERR_PRS_HDR_ERR	FM_FD_ERR_PRS_HDR_ERR
1357 			/**< Header error was identified during parsing */
1358 #define FM_PORT_FRM_ERR_BLOCK_LIMIT_EXCEEDED	FM_FD_ERR_BLOCK_LIMIT_EXCEEDED
1359 			/**< Frame parsed beyond 256 first bytes */
1360 #define FM_PORT_FRM_ERR_PROCESS_TIMEOUT	0x00000001
1361 			/**< FPM Frame Processing Timeout Exceeded */
1362 /* @} */
1363 
1364 
1365 /*
1366  * @Group	  FM_PORT_init_grp FM Port Initialization Unit
1367  *
1368  * @Description   FM Port Initialization Unit
1369  *
1370  * @{
1371  */
1372 
1373 /*
1374  * @Description   Exceptions user callback routine, will be called upon an
1375  *		  exception passing the exception identification.
1376  *
1377  * @Param[in]	  h_app		User's application descriptor.
1378  * @Param[in]	  exception	The exception.
1379  */
1380 typedef void (t_fm_port_exception_callback) (t_handle h_app,
1381 					e_fm_port_exceptions exception);
1382 
1383 /*
1384  * @Description   User callback function called by driver with received data.
1385  *		  User provides this function. Driver invokes it.
1386  *
1387  * @Param[in]	  h_app		Application's handle originally specified to
1388  *				the API Config function
1389  * @Param[in]	  p_data	A pointer to data received
1390  * @Param[in]	  length	length of received data
1391  * @Param[in]	  status	receive status and errors
1392  * @Param[in]	  position	position of buffer in frame
1393  * @Param[in]	  h_buf_context	A handle of the user associated with this buffer
1394  *
1395  * @Retval	  e_RX_STORE_RESPONSE_CONTINUE
1396  *		  order the driver to continue Rx operation for all ready data.
1397  * @Retval	  e_RX_STORE_RESPONSE_PAUSE
1398  *		  order the driver to stop Rx operation.
1399  */
1400 typedef e_rx_store_response(t_fm_port_im_rx_store_callback) (t_handle h_app,
1401 					uint8_t  *p_data,
1402 					uint16_t length,
1403 					uint16_t status,
1404 					uint8_t  position,
1405 					t_handle h_buf_context);
1406 
1407 /*
1408  * @Description   User callback function called by driver when transmit
1409  *		  completed.
1410  *		  User provides this function. Driver invokes it.
1411  *
1412  * @Param[in]	  h_app		Application's handle originally specified to
1413  *				the API Config function
1414  * @Param[in]	  p_data	A pointer to data received
1415  * @Param[in]	  status	transmit status and errors
1416  * @Param[in]	  last_buffer	is last buffer in frame
1417  * @Param[in]	  h_buf_context	A handle of the user associated with this buffer
1418  */
1419 typedef void (t_fm_port_im_tx_conf_callback) (t_handle   h_app,
1420 				uint8_t	*p_data,
1421 				uint16_t   status,
1422 				t_handle   h_buf_context);
1423 
1424 /*
1425  * @Description   A structure for additional Rx port parameters
1426  */
1427 typedef struct t_fm_port_rx_params {
1428 	uint32_t		err_fqid;	/**< Error Queue Id. */
1429 	uint32_t		dflt_fqid;	/**< Default Queue Id.*/
1430 	uint16_t		liodn_offset;	/**< Port's LIODN offset. */
1431 	t_fm_ext_pools		ext_buf_pools;
1432 			/**< Which external buffer pools are used
1433 			 * (up to FM_PORT_MAX_NUM_OF_EXT_POOLS), and their sizes
1434 			 */
1435 } t_fm_port_rx_params;
1436 
1437 /*
1438  * @Description   A structure for additional non-Rx port parameters
1439  */
1440 typedef struct t_fm_port_non_rx_params {
1441 	uint32_t		err_fqid;	/**< Error Queue Id. */
1442 	uint32_t		dflt_fqid;
1443 			/**< For Tx - Default Confirmation queue,
1444 			 * 0 means no Tx confirmation for processed frames.
1445 			 * For OP port - default Rx queue.
1446 			 */
1447 	uint32_t		qm_channel;
1448 			/**< QM-channel dedicated to this port; will be used by
1449 			 * the FM for dequeue.
1450 			 */
1451 } t_fm_port_non_rx_params;
1452 
1453 /*
1454  * @Description   A structure for additional Rx port parameters
1455  */
1456 typedef struct t_fm_port_im_rx_tx_params {
1457 	t_handle			h_fm_muram;
1458 			/**< A handle of the FM-MURAM partition */
1459 	uint16_t			liodn_offset;
1460 			/**< For Rx ports only. Port's LIODN Offset. */
1461 	uint8_t			data_mem_id;
1462 			/**< Memory partition ID for data buffers */
1463 	uint32_t			data_mem_attributes;
1464 			/**< Memory attributes for data buffers */
1465 	t_buffer_pool_info		rx_pool_params;
1466 			/**< For Rx ports only. */
1467 	t_fm_port_im_rx_store_callback   *f_rx_store;
1468 			/**< For Rx ports only. */
1469 	t_fm_port_im_tx_conf_callback	*f_tx_conf;
1470 			/**< For Tx ports only. */
1471 } t_fm_port_im_rx_tx_params;
1472 
1473 /*
1474  * @Description   A union for additional parameters depending on port type
1475  */
1476 typedef union u_fm_port_specific_params {
1477 	t_fm_port_im_rx_tx_params	im_rx_tx_params;
1478 			/**< Rx/Tx Independent-Mode port parameter structure */
1479 	t_fm_port_rx_params	rx_params;
1480 			/**< Rx port parameters structure */
1481 	t_fm_port_non_rx_params	non_rx_params;
1482 			/**< Non-Rx port parameters structure */
1483 } u_fm_port_specific_params;
1484 
1485 /*
1486  * @Description   A structure representing FM initialization parameters
1487  */
1488 typedef struct t_fm_port_params {
1489 	uintptr_t	base_addr;
1490 			/**< Virtual Address of memory mapped FM Port registers.
1491 			 */
1492 	t_handle	h_fm;
1493 			/**< A handle to the FM object this port related to */
1494 	e_fm_port_type	port_type;	/**< Port type */
1495 	uint8_t		port_id;
1496 			/**< Port Id - relative to type;
1497 			 * NOTE: When configuring Offline Parsing port for
1498 			 * FMANv3 devices (DPAA_VERSION 11 and higher),
1499 			 * it is highly recommended NOT to use port_id=0 due to
1500 			 * lack of HW resources on port_id=0.
1501 			 */
1502 	bool		independent_mode_enable;
1503 			/**< This port is Independent-Mode - Used for Rx/Tx
1504 			 * ports only!
1505 			 */
1506 	uint16_t		liodn_base;
1507 			/**< Irrelevant for P4080 rev 1. LIODN base for this
1508 			 * port, to be used together with LIODN offset.
1509 			 */
1510 	u_fm_port_specific_params	specific_params;
1511 			/**< Additional parameters depending on port type. */
1512 
1513 	t_fm_port_exception_callback   *f_exception;
1514 			/**< Relevant for IM only Callback routine to be called
1515 			 * on BUSY exception
1516 			 */
1517 	t_handle		h_app;
1518 			/**< A handle to an application layer object; This
1519 			 * handle will be passed by the driver upon calling the
1520 			 * above callbacks
1521 			 */
1522 } t_fm_port_params;
1523 
1524 /*
1525  * @Function	  fm_port_config
1526  *
1527  * @Description   Creates a descriptor for the FM PORT module.
1528  *
1529  *		  The routine returns a handle(descriptor) to the FM PORT
1530  *		  object. This descriptor must be passed as first parameter to
1531  *		  all other FM PORT function calls.
1532  *
1533  *		  No actual initialization or configuration of FM hardware is
1534  *		  done by this routine.
1535  *
1536  * @Param[in]	  p_fm_port_params	Pointer to data structure of parameters
1537  *
1538  * @Retval	  Handle to FM object, or NULL for Failure.
1539  */
1540 t_handle fm_port_config(t_fm_port_params *p_fm_port_params);
1541 
1542 /*
1543  * @Function	  fm_port_init
1544  *
1545  * @Description   Initializes the FM PORT module by defining the software
1546  *		  structure and configuring the hardware registers.
1547  *
1548  * @Param[in]	  h_fm_port - FM PORT module descriptor
1549  *
1550  * @Return	  E_OK on success; Error code otherwise.
1551  */
1552 uint32_t fm_port_init(t_handle h_fm_port);
1553 
1554 /*
1555  * @Function	  fm_port_free
1556  *
1557  * @Description   Frees all resources that were assigned to FM PORT module.
1558  *
1559  *		  Calling this routine invalidates the descriptor.
1560  *
1561  * @Param[in]	  h_fm_port - FM PORT module descriptor
1562  *
1563  * @Return	  E_OK on success; Error code otherwise.
1564  */
1565 uint32_t fm_port_free(t_handle h_fm_port);
1566 
1567 t_handle fm_port_open(t_fm_port_params *p_fm_port_params);
1568 void fm_port_close(t_handle h_fm_port);
1569 
1570 
1571 /*
1572  * @Group	  FM_PORT_advanced_init_grp	FM Port Advanced Configuration
1573  *						Unit
1574  *
1575  * @Description   Configuration functions used to change default values.
1576  *
1577  * @{
1578  */
1579 
1580 /*
1581  * @Description   enum for defining QM frame dequeue
1582  */
1583 typedef enum e_fm_port_deq_type {
1584 	e_FM_PORT_DEQ_TYPE1,
1585 		/**< Dequeue from the SP channel - with priority precedence,
1586 		 * and Intra-Class Scheduling respected.
1587 		 */
1588 	e_FM_PORT_DEQ_TYPE2,
1589 		/**< Dequeue from the SP channel - with active FQ precedence,
1590 		 * and Intra-Class Scheduling respected.
1591 		 */
1592 	e_FM_PORT_DEQ_TYPE3
1593 		/**< Dequeue from the SP channel - with active FQ precedence,
1594 		 * and override Intra-Class Scheduling
1595 		 */
1596 } e_fm_port_deq_type;
1597 
1598 /*
1599  * @Description   enum for defining QM frame dequeue
1600  */
1601 typedef enum e_fm_port_deq_prefetch_option {
1602 	e_FM_PORT_DEQ_NO_PREFETCH,
1603 		/**< QMI performs a dequeue action for a single frame
1604 		 * only when a dedicated portID Tnum is waiting.
1605 		 */
1606 	e_FM_PORT_DEQ_PARTIAL_PREFETCH,
1607 		/**< QMI performs a dequeue action for 3 frames
1608 		 * when one dedicated port_id tnum is waiting.
1609 		 */
1610 	e_FM_PORT_DEQ_FULL_PREFETCH
1611 		/**< QMI performs a dequeue action for 3 frames when
1612 		 * no dedicated port_id tnums are waiting.
1613 		 */
1614 
1615 } e_fm_port_deq_prefetch_option;
1616 
1617 /*
1618  * @Description   enum for defining port default color
1619  */
1620 typedef enum e_fm_port_color {
1621 	e_FM_PORT_COLOR_GREEN,	/**< Default port color is green */
1622 	e_FM_PORT_COLOR_YELLOW,	/**< Default port color is yellow */
1623 	e_FM_PORT_COLOR_RED,	/**< Default port color is red */
1624 	e_FM_PORT_COLOR_OVERRIDE/**< Ignore color */
1625 } e_fm_port_color;
1626 
1627 /*
1628  * @Description   A structure for defining Dual Tx rate limiting scale
1629  */
1630 typedef enum e_fm_port_dual_rate_limiter_scale_down {
1631 	e_FM_PORT_DUAL_RATE_LIMITER_NONE = 0,
1632 		/**< Use only single rate limiter*/
1633 	e_FM_PORT_DUAL_RATE_LIMITER_SCALE_DOWN_BY_2,
1634 		/**< Divide high rate limiter by 2 */
1635 	e_FM_PORT_DUAL_RATE_LIMITER_SCALE_DOWN_BY_4,
1636 		/**< Divide high rate limiter by 4 */
1637 	e_FM_PORT_DUAL_RATE_LIMITER_SCALE_DOWN_BY_8
1638 		/**< Divide high rate limiter by 8 */
1639 } e_fm_port_dual_rate_limiter_scale_down;
1640 
1641 /*
1642  * @Description   A structure for defining FM port resources
1643  */
1644 typedef struct t_fm_port_rsrc {
1645 	uint32_t	num;
1646 			/**< Committed required resource */
1647 	uint32_t	extra;
1648 			/**< Extra (not committed) required resource */
1649 } t_fm_port_rsrc;
1650 
1651 /*
1652  * @Description   A structure for defining Tx rate limiting
1653  */
1654 typedef struct t_fm_port_rate_limit {
1655 	uint16_t		max_burst_size;
1656 				/**< in KBytes for Tx ports, in frames for OP
1657 				 * ports. (note that for early chips burst size
1658 				 * is rounded up to a multiply of 1000 frames).
1659 				 */
1660 	uint32_t		rate_limit;
1661 				/**< in Kb/sec for Tx ports, in frame/sec for OP
1662 				 * ports. Rate limit refers to data rate
1663 				 * (rather than line rate).
1664 				 */
1665 	e_fm_port_dual_rate_limiter_scale_down	rate_limit_divider;
1666 				/**< For OP ports only. Not-valid for some
1667 				 * earlier chip revisions
1668 				 */
1669 } t_fm_port_rate_limit;
1670 
1671 /*
1672  * @Description   A structure for defining the parameters of
1673  *		  the Rx port performance counters
1674  */
1675 typedef struct t_fm_port_performance_cnt {
1676 	uint8_t	task_comp_val;
1677 		/**< Task compare value */
1678 	uint8_t	queue_comp_val;
1679 		/**< Rx queue/Tx confirm queue compare value (unused for H/O) */
1680 	uint8_t	dma_comp_val;
1681 		/**< Dma compare value */
1682 	uint32_t	fifo_comp_val;
1683 			/**< Fifo compare value (in bytes) */
1684 } t_fm_port_performance_cnt;
1685 
1686 /*
1687  * @Function	  fm_port_config_num_of_open_dmas
1688  *
1689  * @Description   Calling this routine changes the max number of open DMA's
1690  *		  available for this port. It changes this parameter in the
1691  *		  internal driver data base from its default configuration
1692  *		  [OP: 1]
1693  *		  [1G-RX, 1G-TX: 1 (+1)]
1694  *		  [10G-RX, 10G-TX: 8 (+8)]
1695  *
1696  * @Param[in]	  h_fm_port	A handle to a FM Port module.
1697  * @Param[in]	  p_open_dmas	A pointer to a structure of parameters defining
1698  *				the open DMA allocation.
1699  *
1700  * @Return	  E_OK on success; Error code otherwise.
1701  *
1702  * @Cautions	  Allowed only following fm_port_config() and before
1703  *		  fm_port_init().
1704  */
1705 uint32_t fm_port_config_num_of_open_dmas(t_handle h_fm_port,
1706 						t_fm_port_rsrc *p_open_dmas);
1707 
1708 /*
1709  * @Function	  fm_port_config_num_of_tasks
1710  *
1711  * @Description   Calling this routine changes the max number of tasks available
1712  *		  for this port. It changes this parameter in the internal
1713  *		  driver data base from its default configuration
1714  *		  [OP : 1]
1715  *		  [1G - RX, 1G - TX : 3 ( + 2)]
1716  *		  [10G - RX, 10G - TX : 16 ( + 8)]
1717  *
1718  * @Param[in]	  h_fm_port		A handle to a FM Port module.
1719  * @Param[in]	  p_num_of_tasks	A pointer to a structure of parameters
1720  *					defining the tasks allocation.
1721  *
1722  * @Return	  E_OK on success; Error code otherwise.
1723  *
1724  * @Cautions	  Allowed only following fm_port_config() and before
1725  *		  fm_port_init().
1726  */
1727 uint32_t fm_port_config_num_of_tasks(t_handle h_fm_port,
1728 					t_fm_port_rsrc *p_num_of_tasks);
1729 
1730 /*
1731  * @Function	  fm_port_config_size_of_fifo
1732  *
1733  * @Description   Calling this routine changes the max FIFO size configured for
1734  *		  this port.
1735  *
1736  *		  This function changes the internal driver data base from its
1737  *		  default configuration. Please refer to the driver's User Guide
1738  *		  for information on default FIFO sizes in the various devices.
1739  *		  [OP: 2KB]
1740  *		  [1G-RX, 1G-TX: 11KB]
1741  *		  [10G-RX, 10G-TX: 12KB]
1742  *
1743  * @Param[in]	  h_fm_port		A handle to a FM Port module.
1744  * @Param[in]	  p_size_of_fifo	A pointer to a structure of parameters
1745  *					defining the FIFO allocation.
1746  *
1747  * @Return	  E_OK on success; Error code otherwise.
1748  *
1749  * @Cautions	  Allowed only following fm_port_config() and before
1750  *		  fm_port_init().
1751  */
1752 uint32_t fm_port_config_size_of_fifo(t_handle h_fm_port,
1753 					t_fm_port_rsrc *p_size_of_fifo);
1754 
1755 /*
1756  * @Function	  fm_port_config_deq_high_priority
1757  *
1758  * @Description   Calling this routine changes the dequeue priority in the
1759  *		  internal driver data base from its default configuration
1760  *		  1G: [DEFAULT_PORT_deqHighPriority_1G]
1761  *		  10G: [DEFAULT_PORT_deqHighPriority_10G]
1762  *
1763  *		  May be used for Non - Rx ports only
1764  *
1765  * @Param[in]	  h_fm_port	A handle to a FM Port module.
1766  * @Param[in]	  high_pri	TRUE to select high priority, FALSE for normal
1767  *				operation.
1768  *
1769  * @Return	  E_OK on success; Error code otherwise.
1770  *
1771  * @Cautions	  Allowed only following fm_port_config() and before
1772  *		  fm_port_init().
1773  */
1774 uint32_t fm_port_config_deq_high_priority(t_handle h_fm_port, bool high_pri);
1775 
1776 /*
1777  * @Function	  fm_port_config_deq_type
1778  *
1779  * @Description   Calling this routine changes the dequeue type parameter in the
1780  *		  internal driver data base from its default configuration
1781  *		  [DEFAULT_PORT_deq_type].
1782  *
1783  *		  May be used for Non - Rx ports only
1784  *
1785  * @Param[in]	  h_fm_port	A handle to a FM Port module.
1786  * @Param[in]	  deq_type	According to QM definition.
1787  *
1788  * @Return	  E_OK on success; Error code otherwise.
1789  *
1790  * @Cautions	  Allowed only following fm_port_config() and before
1791  *		  fm_port_init().
1792  */
1793 uint32_t fm_port_config_deq_type(t_handle h_fm_port,
1794 					e_fm_port_deq_type deq_type);
1795 
1796 /*
1797  * @Function	  fm_port_config_deq_prefetch_option
1798  *
1799  * @Description   Calling this routine changes the dequeue prefetch option
1800  *		  parameter in the internal driver data base from its default
1801  *		  configuration [DEFAULT_PORT_deq_prefetch_option]
1802  *		  Note: Available for some chips only
1803  *
1804  *		  May be used for Non - Rx ports only
1805  *
1806  * @Param[in]	  h_fm_port		A handle to a FM Port module.
1807  * @Param[in]	  deq_prefetch_option	New option
1808  *
1809  * @Return	  E_OK on success; Error code otherwise.
1810  *
1811  * @Cautions	  Allowed only following fm_port_config() and before
1812  *		  fm_port_init().
1813  */
1814 uint32_t fm_port_config_deq_prefetch_option(t_handle h_fm_port,
1815 			e_fm_port_deq_prefetch_option deq_prefetch_option);
1816 
1817 /*
1818  * @Function	  fm_port_config_deq_byte_cnt
1819  *
1820  * @Description   Calling this routine changes the dequeue byte count parameter
1821  *		  in the internal driver data base from its default
1822  *		  configuration.
1823  *		  1G:[DEFAULT_PORT_deq_byte_cnt_1G].
1824  *		  10G:[DEFAULT_PORT_deq_byte_cnt_10G].
1825  *
1826  *		  May be used for Non - Rx ports only
1827  *
1828  * @Param[in]	  h_fm_port	A handle to a FM Port module.
1829  * @Param[in]	  deq_byte_cnt	New byte count
1830  *
1831  * @Return	  E_OK on success; Error code otherwise.
1832  *
1833  * @Cautions	  Allowed only following fm_port_config() and before
1834  *		  fm_port_init().
1835  */
1836 uint32_t fm_port_config_deq_byte_cnt(t_handle h_fm_port,
1837 					uint16_t deq_byte_cnt);
1838 
1839 /*
1840  * @Function	  fm_port_config_buffer_prefix_content
1841  *
1842  * @Description   Defines the structure, size and content of the application
1843  *		  buffer. The prefix will In Tx ports, if 'pass_prs_result', the
1844  *		  application should set a value to their offsets in the prefix
1845  *		  of the FM will save the first 'priv_data_size', than,
1846  *		  depending on 'pass_prs_result' and 'pass_time_stamp', copy
1847  *		  parse result and timeStamp, and the packet itself (in this
1848  *		  order), to the application buffer, and to offset.
1849  *		  Calling this routine changes the buffer margins definitions in
1850  *		  the internal driver data base from its default configuration:
1851  *		  Data size:  [DEFAULT_PORT_bufferPrefixContent_priv_data_size]
1852  *		  Pass Parser result:
1853  *		  [DEFAULT_PORT_bufferPrefixContent_pass_prs_result].
1854  *		  Pass timestamp:
1855  *		  [DEFAULT_PORT_bufferPrefixContent_pass_time_stamp].
1856  *
1857  *		  May be used for all ports
1858  *
1859  *
1860  * @Param[in]		h_fm_port			A handle to a FM Port
1861  *							module.
1862  * @Param[in,out]	p_fm_buffer_prefix_content	A structure of
1863  *							parameters describing
1864  *							the structure of the
1865  *							buffer.
1866  *							Out parameter: Start
1867  *							margin - offset of data
1868  *							from start of external
1869  *							buffer.
1870  *
1871  * @Return	  E_OK on success; Error code otherwise.
1872  *
1873  * @Cautions	  Allowed only following fm_port_config() and before
1874  *		  fm_port_init().
1875  */
1876 uint32_t fm_port_config_buffer_prefix_content(t_handle	h_fm_port,
1877 		t_fm_buffer_prefix_content	*p_fm_buffer_prefix_content);
1878 
1879 /*
1880  * @Function	  fm_port_config_checksum_last_bytes_ignore
1881  *
1882  * @Description   Calling this routine changes the number of checksum bytes to
1883  *		  ignore parameter in the internal driver data base from its
1884  *		  default configuration.
1885  *
1886  *		  May be used by Tx & Rx ports only
1887  *
1888  * @Param[in]	  h_fm_port			A handle to a FM Port module.
1889  * @Param[in]	  checksum_last_bytes_ignore	New value
1890  *
1891  * @Return	  E_OK on success; Error code otherwise.
1892  *
1893  * @Cautions	  Allowed only following fm_port_config() and before
1894  *		  fm_port_init().
1895  */
1896 uint32_t fm_port_config_checksum_last_bytes_ignore(t_handle h_fm_port,
1897 			uint8_t checksum_last_bytes_ignore);
1898 
1899 /*
1900  * @Function	  fm_port_config_cut_bytes_from_end
1901  *
1902  * @Description   Calling this routine changes the number of bytes to cut from a
1903  *		  frame's end parameter in the internal driver data base
1904  *		  from its default configuration
1905  *		  [DEFAULT_PORT_cut_bytes_from_end]
1906  *		  Note that if the result of (frame length before chop -
1907  *		  cut_bytes_from_end) is less than 14 bytes, the chop operation
1908  *		  is not executed.
1909  *
1910  *		  May be used for Rx ports only
1911  *
1912  * @Param[in]	  h_fm_port		A handle to a FM Port module.
1913  * @Param[in]	  cut_bytes_from_end	New value
1914  *
1915  * @Return	  E_OK on success; Error code otherwise.
1916  *
1917  * @Cautions	  Allowed only following fm_port_config() and before
1918  *		  fm_port_init().
1919  */
1920 uint32_t fm_port_config_cut_bytes_from_end(t_handle h_fm_port,
1921 			uint8_t cut_bytes_from_end);
1922 
1923 /*
1924  * @Function	  fm_port_config_ext_buf_pools
1925  *
1926  * @Description   This routine should be called for OP ports that internally use
1927  *		  BM buffer pools. In such cases, e.g. for fragmentation and
1928  *		  re-assembly, the FM needs new BM buffers. By calling this
1929  *		  routine the user specifies the BM buffer pools that should be
1930  *		  used.
1931  *
1932  *		  Note: Available for some chips only
1933  *
1934  *		  May be used for OP ports only
1935  *
1936  * @Param[in]	  h_fm_port		A handle to a FM Port module.
1937  * @Param[in]	  p_fm_ext_pools	A structure of parameters for the
1938  *					external pools.
1939  *
1940  * @Return	  E_OK on success; Error code otherwise.
1941  *
1942  * @Cautions	  Allowed only following fm_port_config() and before
1943  *		  fm_port_init().
1944  */
1945 uint32_t fm_port_config_ext_buf_pools(t_handle h_fm_port,
1946 			t_fm_ext_pools *p_fm_ext_pools);
1947 
1948 /*
1949  * @Function	  fm_port_config_backup_pools
1950  *
1951  * @Description   Calling this routine allows the configuration of some of the
1952  *		  BM pools defined for this port as backup pools.
1953  *		  A pool configured to be a backup pool will be used only if all
1954  *		  other enabled non - backup pools are depleted.
1955  *
1956  *		  May be used for Rx ports only
1957  *
1958  * @Param[in]	  h_fm_port			A handle to a FM Port module.
1959  * @Param[in]	  p_fm_port_backup_bm_pools	An array of pool id's. All pools
1960  *						specified here will be defined
1961  *						as backup pools.
1962  *
1963  * @Return	  E_OK on success; Error code otherwise.
1964  *
1965  * @Cautions	  Allowed only following fm_port_config() and before
1966  *		  fm_port_init().
1967  */
1968 uint32_t fm_port_config_backup_pools(t_handle h_fm_port,
1969 			t_fm_backup_bm_pools *p_fm_port_backup_bm_pools);
1970 
1971 /*
1972  * @Function	  fm_port_config_frm_discard_override
1973  *
1974  * @Description   Calling this routine changes the error frames destination
1975  *		  parameter in the internal driver data base from its default
1976  *		  configuration: override =[DEFAULT_PORT_frmDiscardOverride]
1977  *
1978  *		  May be used for Rx and OP ports only
1979  *
1980  * @Param[in]	  h_fm_port	A handle to a FM Port module.
1981  * @Param[in]	  override	TRUE to override discarding of error frames and
1982  *				enqueueing them to error queue.
1983  *
1984  * @Return	  E_OK on success; Error code otherwise.
1985  *
1986  * @Cautions	  Allowed only following fm_port_config() and before
1987  *		  fm_port_init().
1988  */
1989 uint32_t fm_port_config_frm_discard_override(t_handle h_fm_port,
1990 			bool override);
1991 
1992 /*
1993  * @Function	fm_port_config_errors_to_discard
1994  *
1995  * @Description   Calling this routine changes the behaviour on error parameter
1996  *		  in the internal driver data base from its default
1997  *		  configuration: [DEFAULT_PORT_errorsToDiscard].
1998  *		  If a requested error was previously defined as
1999  *		  "ErrorsToEnqueue" it's definition will change and the frame
2000  *		  will be discarded. Errors that were not defined either as
2001  *		  "ErrorsToEnqueue" nor as "ErrorsToDiscard", will be forwarded
2002  *		  to CPU.
2003  *
2004  *		  May be used for Rx and OP ports only
2005  *
2006  * @Param[in]	  h_fm_port	A handle to a FM Port module.
2007  * @Param[in]	  errs		A list of errors to discard
2008  *
2009  * @Return	  E_OK on success; Error code otherwise.
2010  *
2011  * @Cautions	  Allowed only following fm_port_config() and before
2012  *		  fm_port_init().
2013  */
2014 uint32_t fm_port_config_errors_to_discard(t_handle h_fm_port,
2015 		fm_port_frame_err_select_t errs);
2016 
2017 /*
2018  * @Function	  fm_port_config_dma_ic_cache_attr
2019  *
2020  * @Description   Calling this routine changes the internal context cache
2021  *		  attribute parameter in the internal driver data base
2022  *		  from its default configuration:
2023  *		  [DEFAULT_PORT_dmaIntContextCacheAttr]
2024  *
2025  *		  May be used for all port types
2026  *
2027  * @Param[in]	  h_fm_port			A handle to a FM Port module.
2028  * @Param[in]	  int_context_cache_attr	New selection
2029  *
2030  * @Return	  E_OK on success; Error code otherwise.
2031  *
2032  * @Cautions	  Allowed only following fm_port_config() and before
2033  *		  fm_port_init().
2034  */
2035 uint32_t fm_port_config_dma_ic_cache_attr(t_handle h_fm_port,
2036 		e_fm_dma_cache_option int_context_cache_attr);
2037 
2038 /*
2039  * @Function	  fm_port_config_dma_hdr_attr
2040  *
2041  * @Description   Calling this routine changes the header cache attribute
2042  *		  parameter in the internal driver data base from its default
2043  *		  configuration[DEFAULT_PORT_dmaHeaderCacheAttr]
2044  *
2045  *		  May be used for all port types
2046  *
2047  * @Param[in]	  h_fm_port		A handle to a FM Port module.
2048  * @Param[in]	  header_cache_attr	New selection
2049  *
2050  * @Return	  E_OK on success; Error code otherwise.
2051  *
2052  * @Cautions	  Allowed only following fm_port_config() and before
2053  *		  fm_port_init().
2054  */
2055 uint32_t fm_port_config_dma_hdr_attr(t_handle h_fm_port,
2056 		e_fm_dma_cache_option header_cache_attr);
2057 
2058 /*
2059  * @Function	fm_port_config_dma_scatter_gather_attr
2060  *
2061  * @Description   Calling this routine changes the scatter gather cache
2062  *		  attribute parameter in the internal driver data base from its
2063  *		  default configuration[DEFAULT_PORT_dmaScatterGatherCacheAttr]
2064  *
2065  *		  May be used for all port types
2066  *
2067  * @Param[in]	  h_fm_port			A handle to a FM Port module.
2068  * @Param[in]	  scatter_gather_cache_attr	New selection
2069  *
2070  * @Return	  E_OK on success; Error code otherwise.
2071  *
2072  * @Cautions	  Allowed only following fm_port_config() and before
2073  *		  fm_port_init().
2074  */
2075 uint32_t fm_port_config_dma_scatter_gather_attr(t_handle h_fm_port,
2076 		e_fm_dma_cache_option scatter_gather_cache_attr);
2077 
2078 /*
2079  * @Function	  fm_port_config_dma_write_optimize
2080  *
2081  * @Description   Calling this routine changes the write optimization parameter
2082  *		  in the internal driver data base from its default
2083  *		  configuration : By default optimize =
2084  *		  [DEFAULT_PORT_dmaWriteOptimize].
2085  *		  Note:
2086  *		  1. For head optimization, data alignment must be >= 16
2087  *		     (supported by default).
2088  *
2089  *		  2. For tail optimization, note that the optimization is
2090  *		     performed by extending the write transaction of the frame
2091  *		     payload at the tail as needed to achieve optimal bus
2092  *		     transfers, so that the last write is extended to be on
2093  *		     16 / 64 bytes aligned block (chip dependent).
2094  *
2095  *		  Relevant for non - Tx port types
2096  *
2097  * @Param[in]	  h_fm_port	A handle to a FM Port module.
2098  * @Param[in]	  optimize	TRUE to enable optimization, FALSE for normal
2099  *				operation
2100  *
2101  * @Return	  E_OK on success; Error code otherwise.
2102  *
2103  * @Cautions	  Allowed only following fm_port_config() and before
2104  *		  fm_port_init().
2105  */
2106 uint32_t fm_port_config_dma_write_optimize(t_handle h_fm_port,
2107 						bool optimize);
2108 
2109 /*
2110  * @Function	  fm_port_config_no_scather_gather
2111  *
2112  * @Description   Calling this routine changes the no_scather_gather parameter
2113  *		  in internal driver data base from its default configuration.
2114  *
2115  * @Param[in]	  h_fm_port		A handle to a FM Port module.
2116  * @Param[in]	  no_scather_gather	TRUE - frame is discarded if can not be
2117  *					stored in single buffer,
2118  *					FALSE - frame can be stored in scatter
2119  *					gather (S / G) format.
2120  *
2121  * @Return	  E_OK on success; Error code otherwise.
2122  *
2123  * @Cautions	  Allowed only following fm_port_config() and before
2124  *		  fm_port_init().
2125  */
2126 uint32_t fm_port_config_no_scather_gather(t_handle h_fm_port,
2127 						bool no_scather_gather);
2128 
2129 /*
2130  * @Function	  fm_port_config_dflt_color
2131  *
2132  * @Description   Calling this routine changes the internal default color
2133  *		  parameter in the internal driver data base
2134  *		  from its default configuration[DEFAULT_PORT_color]
2135  *
2136  *		  May be used for all port types
2137  *
2138  * @Param[in]	  h_fm_port	A handle to a FM Port module.
2139  * @Param[in]	  color		New selection
2140  *
2141  * @Return	  E_OK on success; Error code otherwise.
2142  *
2143  * @Cautions	  Allowed only following fm_port_config() and before
2144  *		  fm_port_init().
2145  */
2146 uint32_t fm_port_config_dflt_color(t_handle h_fm_port, e_fm_port_color color);
2147 
2148 /*
2149  * @Function	  fm_port_config_sync_req
2150  *
2151  * @Description   Calling this routine changes the synchronization attribute
2152  *		  parameter in the internal driver data base from its default
2153  *		  configuration: sync_req =[DEFAULT_PORT_sync_req]
2154  *
2155  *		  May be used for all port types
2156  *
2157  * @Param[in]	  h_fm_port	A handle to a FM Port module.
2158  * @Param[in]	  sync_req	TRUE to request synchronization, FALSE
2159  *				otherwise.
2160  *
2161  * @Return	  E_OK on success; Error code otherwise.
2162  *
2163  * @Cautions	  Allowed only following fm_port_config() and before
2164  *		  fm_port_init().
2165  */
2166 uint32_t fm_port_config_sync_req(t_handle h_fm_port, bool sync_req);
2167 
2168 /*
2169  * @Function	  fm_port_config_forward_reuse_int_context
2170  *
2171  * @Description   This routine is relevant for Rx ports that are routed to OP
2172  *		  port. It changes the internal context reuse option in the
2173  *		  internal driver data base from its default configuration:
2174  *		  reuse =[DEFAULT_PORT_forwardIntContextReuse]
2175  *
2176  *		  May be used for Rx ports only
2177  *
2178  * @Param[in]	  h_fm_port	A handle to a FM Port module.
2179  * @Param[in]	  reuse		TRUE to reuse internal context on frames
2180  *				forwarded to OP port.
2181  *
2182  * @Return	  E_OK on success; Error code otherwise.
2183  *
2184  * @Cautions	  Allowed only following fm_port_config() and before
2185  *		  fm_port_init().
2186  */
2187 uint32_t fm_port_config_forward_reuse_int_context(t_handle h_fm_port,
2188 						bool reuse);
2189 
2190 /*
2191  * @Function	  fm_port_config_donot_release_tx_buf_to_bm
2192  *
2193  * @Description   This routine should be called if no Tx confirmation
2194  *		  is done, and yet buffers should not be released to the BM.
2195  *
2196  *		  Normally, buffers are returned using the Tx confirmation
2197  *		  process. When Tx confirmation is not used (defFqid = 0),
2198  *		  buffers are typically released to the BM. This routine
2199  *		  may be called to avoid this behavior and not release the
2200  *		  buffers.
2201  *
2202  *		  May be used for Tx ports only
2203  *
2204  * @Param[in]	  h_fm_port	A handle to a FM Port module.
2205  *
2206  * @Return	  E_OK on success; Error code otherwise.
2207  *
2208  * @Cautions	  Allowed only following fm_port_config() and before
2209  *		  fm_port_init().
2210  */
2211 uint32_t fm_port_config_donot_release_tx_buf_to_bm(t_handle h_fm_port);
2212 
2213 /*
2214  * @Function	  fm_port_config_immax_rx_buf_length
2215  *
2216  * @Description   Changes the maximum receive buffer length from its default
2217  *		  configuration: Closest rounded down power of 2 value of the
2218  *		  data buffer size.
2219  *
2220  *		  The maximum receive buffer length directly affects the
2221  *		  structure of received frames (single- or multi-buffered) and
2222  *		  the performance of both the FM and the driver.
2223  *
2224  *		  The selection between single- or multi-buffered frames should
2225  *		  be done according to the characteristics of the specific
2226  *		  application. The recommended mode is to use a single data
2227  *		  buffer per packet, as this mode provides the best performance.
2228  *		  However, the user can select to use multiple data buffers per
2229  *		  packet.
2230  *
2231  * @Param[in]	  h_fm_port	A handle to a FM Port module.
2232  * @Param[in]	  new_val	Maximum receive buffer length (in bytes).
2233  *
2234  * @Return	  E_OK on success; Error code otherwise.
2235  *
2236  * @Cautions	  Allowed only following fm_port_config() and before
2237  *		  fm_port_init(). This routine is to be used only if
2238  *		  Independent-Mode is enabled.
2239  */
2240 uint32_t fm_port_config_immax_rx_buf_length(t_handle h_fm_port,
2241 						uint16_t new_val);
2242 
2243 /*
2244  * @Function	  fm_port_config_imrx_bd_ring_length
2245  *
2246  * @Description   Changes the receive BD ring length from its default
2247  *		  configuration:[DEFAULT_PORT_rxBdRingLength]
2248  *
2249  * @Param[in]	  h_fm_port	A handle to a FM Port module.
2250  * @Param[in]	  new_val	The desired BD ring length.
2251  *
2252  * @Return	  E_OK on success; Error code otherwise.
2253  *
2254  * @Cautions	  Allowed only following fm_port_config() and before
2255  *		  fm_port_init(). This routine is to be used only if
2256  *		  Independent-Mode is enabled.
2257  */
2258 uint32_t fm_port_config_imrx_bd_ring_length(t_handle h_fm_port,
2259 						uint16_t new_val);
2260 
2261 /*
2262  * @Function	fm_port_config_imtx_bd_ring_length
2263  *
2264  * @Description   Changes the transmit BD ring length from its default
2265  *		  configuration:[DEFAULT_PORT_txBdRingLength]
2266  *
2267  * @Param[in]	  h_fm_port	A handle to a FM Port module.
2268  * @Param[in]	  new_val	The desired BD ring length.
2269  *
2270  * @Return	  E_OK on success; Error code otherwise.
2271  *
2272  * @Cautions	  Allowed only following fm_port_config() and before
2273  *		  fm_port_init(). This routine is to be used only if
2274  *		  Independent-Mode is enabled.
2275  */
2276 uint32_t fm_port_config_imtx_bd_ring_length(t_handle h_fm_port,
2277 					uint16_t new_val);
2278 
2279 /*
2280  * @Function	  fm_port_config_imfman_ctrl_external_structs_memory
2281  *
2282  * @Description   Configures memory partition and attributes for FMan-Controller
2283  *		  data structures (e.g. BD rings).
2284  *		  Calling this routine changes the internal driver data base
2285  *		  from its default configuration
2286  *		  [DEFAULT_PORT_ImfwExtStructsMemId,
2287  *		  DEFAULT_PORT_ImfwExtStructsMemAttr].
2288  *
2289  * @Param[in]	  h_fm_port		A handle to a FM Port module.
2290  * @Param[in]	  mem_id		Memory partition ID.
2291  * @Param[in]	  mem_attributes	Memory attributes mask (a combination of
2292  *					MEMORY_ATTR_x flags).
2293  *
2294  * @Return	  E_OK on success; Error code otherwise.
2295  */
2296 uint32_t  fm_port_config_imfman_ctrl_external_structs_memory(t_handle h_fm_port,
2297 				uint8_t mem_id,
2298 				uint32_t mem_attributes);
2299 
2300 /*
2301  * @Function	  fm_port_config_impolling
2302  *
2303  * @Description   Changes the Rx flow from interrupt driven (default) to
2304  *		  polling.
2305  *
2306  * @Param[in]	  h_fm_port	A handle to a FM Port module.
2307  *
2308  * @Return	  E_OK on success; Error code otherwise.
2309  *
2310  * @Cautions	  Allowed only following fm_port_config() and before
2311  *		  fm_port_init().
2312  *		  This routine is to be used only if Independent-Mode is
2313  *		  enabled.
2314  */
2315 uint32_t fm_port_config_impolling(t_handle h_fm_port);
2316 
2317 /*
2318  * @Function	  fm_port_config_max_frame_length
2319  *
2320  * @Description   Changes the definition of the max size of frame that should be
2321  *		  transmitted/received on this port from its default value
2322  *		  [DEFAULT_PORT_maxFrameLength].
2323  *		  This parameter is used for confirmation of the minimum Fifo
2324  *		  size calculations and only for Tx ports or ports working in
2325  *		  independent mode. This should be larger than the maximum
2326  *		  possible MTU that will be used for this port (i.e. its MAC).
2327  *
2328  * @Param[in]	  h_fm_port	A handle to a FM Port module.
2329  * @Param[in]	  length	Max size of frame
2330  *
2331  * @Return	  E_OK on success; Error code otherwise.
2332  *
2333  * @Cautions	  Allowed only following fm_port_config() and before
2334  *		  fm_port_init(). This routine is to be used only if
2335  *		  Independent-Mode is enabled.
2336  */
2337 uint32_t fm_port_config_max_frame_length(t_handle h_fm_port,
2338 					uint16_t length);
2339 
2340 /*
2341  * @Function	  fm_port_config_tx_fifo_min_fill_level
2342  *
2343  * @Description   Calling this routine changes the fifo minimum fill level
2344  *		  parameter in the internal driver data base from its default
2345  *		  configuration[DEFAULT_PORT_txFifoMinFillLevel]
2346  *
2347  *		  May be used for Tx ports only
2348  *
2349  * @Param[in]	  h_fm_port		A handle to a FM Port module.
2350  * @Param[in]	  min_fill_level	New value
2351  *
2352  * @Return	  E_OK on success; Error code otherwise.
2353  *
2354  * @Cautions	  Allowed only following fm_port_config() and before
2355  *		  fm_port_init().
2356  */
2357 uint32_t fm_port_config_tx_fifo_min_fill_level(t_handle h_fm_port,
2358 					uint32_t min_fill_level);
2359 
2360 /*
2361  * @Function	  fm_port_config_fifo_deq_pipeline_depth
2362  *
2363  * @Description   Calling this routine changes the fifo dequeue pipeline depth
2364  *		  parameter in the internal driver data base
2365  *
2366  *		  from its default configuration :
2367  *		  1G ports : [DEFAULT_PORT_fifoDeqPipelineDepth_1G],
2368  *		  10G port : [DEFAULT_PORT_fifoDeqPipelineDepth_10G],
2369  *		  OP port : [DEFAULT_PORT_fifoDeqPipelineDepth_OH]
2370  *
2371  *		  May be used for Tx / OP ports only
2372  *
2373  * @Param[in]	  h_fm_port		A handle to a FM Port module.
2374  * @Param[in]	  deq_pipeline_depth	New value
2375  *
2376  * @Return	  E_OK on success; Error code otherwise.
2377  *
2378  * @Cautions	  Allowed only following fm_port_config() and before
2379  *		  fm_port_init().
2380  */
2381 uint32_t fm_port_config_fifo_deq_pipeline_depth(t_handle h_fm_port,
2382 				uint8_t deq_pipeline_depth);
2383 
2384 /*
2385  * @Function	  fm_port_config_tx_fifo_low_comf_level
2386  *
2387  * @Description   Calling this routine changes the fifo low comfort level
2388  *		  parameter in internal driver data base from its default
2389  *		  configuration[DEFAULT_PORT_txFifoLowComfLevel]
2390  *
2391  *		  May be used for Tx ports only
2392  *
2393  * @Param[in]	  h_fm_port		A handle to a FM Port module.
2394  * @Param[in]	  fifo_low_comf_level	New value
2395  *
2396  * @Return	  E_OK on success; Error code otherwise.
2397  *
2398  * @Cautions	  Allowed only following fm_port_config() and before
2399  *		  fm_port_init().
2400  */
2401 uint32_t fm_port_config_tx_fifo_low_comf_level(t_handle h_fm_port,
2402 					uint32_t fifo_low_comf_level);
2403 
2404 /*
2405  * @Function	  fm_port_config_rx_fifo_threshold
2406  *
2407  * @Description   Calling this routine changes the threshold of the FIFO fill
2408  *		  level parameter in the internal driver data base from its
2409  *		  default configuration[DEFAULT_PORT_rxFifoThreshold]
2410  *
2411  *		  If the total number of buffers which are currently in use and
2412  *		  associated with the specific RX port exceed this threshold,
2413  *		  the BMI will signal the MAC to send a pause frame over the
2414  *		  link.
2415  *
2416  *		  May be used for Rx ports only
2417  *
2418  * @Param[in]	  h_fm_port		A handle to a FM Port module.
2419  * @Param[in]	  fifo_threshold	New value
2420  *
2421  * @Return	  E_OK on success; Error code otherwise.
2422  *
2423  * @Cautions	  Allowed only following fm_port_config() and before
2424  *		  fm_port_init().
2425  */
2426 uint32_t fm_port_config_rx_fifo_threshold(t_handle h_fm_port,
2427 						uint32_t fifo_threshold);
2428 
2429 /*
2430  * @Function	  fm_port_config_rx_fifo_pri_elevation_level
2431  *
2432  * @Description   Calling this routine changes the priority elevation level
2433  *		  parameter in the internal driver data base from its default
2434  *		  configuration[DEFAULT_PORT_rxFifoPriElevationLevel]
2435  *
2436  *		  If the total number of buffers which are currently in use and
2437  *		  associated with the specific RX port exceed the amount
2438  *		  specified in pri_elevation_level, BMI will signal the main
2439  *		  FM's DMA to elevate the FM priority on the system bus.
2440  *
2441  *		  May be used for Rx ports only
2442  *
2443  * @Param[in]	  h_fm_port		A handle to a FM Port module.
2444  * @Param[in]	  pri_elevation_level   New value
2445  *
2446  * @Return	  E_OK on success; Error code otherwise.
2447  *
2448  * @Cautions	  Allowed only following fm_port_config() and before
2449  *		  fm_port_init().
2450  */
2451 uint32_t fm_port_config_rx_fifo_pri_elevation_level(t_handle h_fm_port,
2452 						uint32_t pri_elevation_level);
2453 
2454 #ifdef FM_HEAVY_TRAFFIC_HANG_ERRATA_FMAN_A005669
2455 /*
2456  * @Function	  fm_port_config_bcbworkaround
2457  *
2458  * @Description   Configures BCB errata workaround.
2459  *
2460  *		  When BCB errata is applicable, the workaround is always
2461  *		  performed by FM Controller. Thus, this function does not
2462  *		  actually enable errata workaround but rather allows driver to
2463  *		  perform adjustments required due to errata workaround
2464  *		  execution in FM controller.
2465  *
2466  *		  Applying BCB workaround also configures
2467  *		  FM_PORT_FRM_ERR_PHYSICAL errors to be discarded. Thus
2468  *		  FM_PORT_FRM_ERR_PHYSICAL can't be set by
2469  *		  fm_port_set_errors_route() function.
2470  *
2471  * @Param[in]	  h_fm_port		A handle to a FM Port module.
2472  *
2473  * @Return	  E_OK on success; Error code otherwise.
2474  *
2475  * @Cautions	  Allowed only following fm_port_config() and before
2476  *		  fm_port_init().
2477  */
2478 uint32_t fm_port_config_bcbworkaround(t_handle h_fm_port);
2479 #endif /* FM_HEAVY_TRAFFIC_HANG_ERRATA_FMAN_A005669 */
2480 
2481 /*
2482  * @Function	  fm_port_config_internal_buff_offset
2483  *
2484  * @Description   Configures internal buffer offset.
2485  *
2486  *		  May be used for Rx and OP ports only
2487  *
2488  * @Param[in]	  h_fm_port	A handle to a FM Port module.
2489  * @Param[in]	  val		New value
2490  *
2491  * @Return	  E_OK on success; Error code otherwise.
2492  *
2493  * @Cautions	  Allowed only following fm_port_config() and before
2494  *		  fm_port_init().
2495  */
2496 uint32_t fm_port_config_internal_buff_offset(t_handle h_fm_port, uint8_t val);
2497 
2498 /** @} */ /* end of FM_PORT_advanced_init_grp group */
2499 /** @} */ /* end of FM_PORT_init_grp group */
2500 
2501 /*
2502  * @Group	  FM_PORT_runtime_control_grp FM Port Runtime Control Unit
2503  *
2504  * @Description   FM Port Runtime control unit API functions, definitions and
2505  *		  enums.
2506  *
2507  * @{
2508  */
2509 
2510 /*
2511  * @Description   enum for defining FM Port counters
2512  */
2513 typedef enum e_fm_port_counters {
2514 	e_FM_PORT_COUNTERS_CYCLE,		/**< BMI performance counter */
2515 	e_FM_PORT_COUNTERS_TASK_UTIL,		/**< BMI performance counter */
2516 	e_FM_PORT_COUNTERS_QUEUE_UTIL,		/**< BMI performance counter */
2517 	e_FM_PORT_COUNTERS_DMA_UTIL,		/**< BMI performance counter */
2518 	e_FM_PORT_COUNTERS_FIFO_UTIL,		/**< BMI performance counter */
2519 	e_FM_PORT_COUNTERS_RX_PAUSE_ACTIVATION,
2520 			/**< BMI Rx only performance counter */
2521 	e_FM_PORT_COUNTERS_FRAME,		/**< BMI statistics counter */
2522 	e_FM_PORT_COUNTERS_DISCARD_FRAME,	/**< BMI statistics counter */
2523 	e_FM_PORT_COUNTERS_DEALLOC_BUF,
2524 			/**< BMI deallocate buffer statistics counter */
2525 	e_FM_PORT_COUNTERS_RX_BAD_FRAME,
2526 			/**< BMI Rx only statistics counter */
2527 	e_FM_PORT_COUNTERS_RX_LARGE_FRAME,
2528 			/**< BMI Rx only statistics counter */
2529 	e_FM_PORT_COUNTERS_RX_FILTER_FRAME,
2530 			/**< BMI Rx & OP only statistics counter */
2531 	e_FM_PORT_COUNTERS_RX_LIST_DMA_ERR,
2532 			/**< BMI Rx, OP & HC only statistics counter */
2533 	e_FM_PORT_COUNTERS_RX_OUT_OF_BUFFERS_DISCARD,
2534 			/**< BMI Rx, OP & HC statistics counter */
2535 	e_FM_PORT_COUNTERS_PREPARE_TO_ENQUEUE_COUNTER,
2536 			/**< BMI Rx, OP & HC only statistics counter */
2537 	e_FM_PORT_COUNTERS_WRED_DISCARD,
2538 			/**< BMI OP & HC only statistics counter */
2539 	e_FM_PORT_COUNTERS_LENGTH_ERR,
2540 			/**< BMI non-Rx statistics counter */
2541 	e_FM_PORT_COUNTERS_UNSUPPRTED_FORMAT,
2542 			/**< BMI non-Rx statistics counter */
2543 	e_FM_PORT_COUNTERS_DEQ_TOTAL,	/**< QMI total QM dequeues counter */
2544 	e_FM_PORT_COUNTERS_ENQ_TOTAL,	/**< QMI total QM enqueues counter */
2545 	e_FM_PORT_COUNTERS_DEQ_FROM_DEFAULT,	/**< QMI counter */
2546 	e_FM_PORT_COUNTERS_DEQ_CONFIRM		/**< QMI counter */
2547 } e_fm_port_counters;
2548 
2549 typedef struct t_fm_port_bmi_stats {
2550 	uint32_t cnt_cycle;
2551 	uint32_t cnt_task_util;
2552 	uint32_t cnt_queue_util;
2553 	uint32_t cnt_dma_util;
2554 	uint32_t cnt_fifo_util;
2555 	uint32_t cnt_rx_pause_activation;
2556 	uint32_t cnt_frame;
2557 	uint32_t cnt_discard_frame;
2558 	uint32_t cnt_dealloc_buf;
2559 	uint32_t cnt_rx_bad_frame;
2560 	uint32_t cnt_rx_large_frame;
2561 	uint32_t cnt_rx_filter_frame;
2562 	uint32_t cnt_rx_list_dma_err;
2563 	uint32_t cnt_rx_out_of_buffers_discard;
2564 	uint32_t cnt_wred_discard;
2565 	uint32_t cnt_length_err;
2566 	uint32_t cnt_unsupported_format;
2567 } t_fm_port_bmi_stats;
2568 
2569 /*
2570  * @Description   Structure for Port id parameters.
2571  *		  Fields commented 'IN' are passed by the port module to be used
2572  *		  by the FM module.
2573  *		  Fields commented 'OUT' will be filled by FM before returning
2574  *		  to port.
2575  */
2576 typedef struct t_fm_port_congestion_grps {
2577 	uint16_t	num_of_congestion_grps_to_consider;
2578 			/**< The number of required CGs to define the size of
2579 			 * the following array
2580 			 */
2581 	uint8_t	congestion_grps_to_consider[FM_NUM_CONG_GRPS];
2582 			/**< An array of CG indexes; Note that the size of the
2583 			 * array should be 'num_of_congestion_grps_to_consider'.
2584 			 */
2585 	bool	pfc_prio_enable[FM_NUM_CONG_GRPS][FM_MAX_PFC_PRIO];
2586 			/**< a matrix that represents the map between the CG ids
2587 			 * defined in 'congestion_grps_to_consider' to the
2588 			 * priorities mapping array.
2589 			 */
2590 } t_fm_port_congestion_grps;
2591 
2592 
2593 #if (defined(DEBUG_ERRORS) && (DEBUG_ERRORS > 0))
2594 /*
2595  * @Function	  fm_port_dump_regs
2596  *
2597  * @Description   Dump all regs.
2598  *
2599  *		  Calling this routine invalidates the descriptor.
2600  *
2601  * @Param[in]	  h_fm_port	FM PORT module descriptor
2602  *
2603  * @Return	  E_OK on success; Error code otherwise.
2604  *
2605  * @Cautions	  Allowed only following fm_port_init().
2606  */
2607 uint32_t fm_port_dump_regs(t_handle h_fm_port);
2608 #endif /* (defined(DEBUG_ERRORS) && ... */
2609 
2610 /*
2611  * @Function	  fm_port_get_buffer_data_offset
2612  *
2613  * @Description   Relevant for Rx ports. Returns the data offset from the
2614  *		  beginning of the data buffer
2615  *
2616  * @Param[in]	  h_fm_port	FM PORT module descriptor
2617  *
2618  * @Return	  data offset.
2619  *
2620  * @Cautions	  Allowed only following fm_port_init().
2621  */
2622 uint32_t fm_port_get_buffer_data_offset(t_handle h_fm_port);
2623 
2624 /*
2625  * @Function	  fm_port_get_buffer_icinfo
2626  *
2627  * @Description   Returns the Internal Context offset from the beginning of the
2628  *		  data buffer
2629  *
2630  * @Param[in]	  h_fm_port	FM PORT module descriptor
2631  * @Param[in]	  p_data	A pointer to the data buffer.
2632  *
2633  * @Return	  Internal context info pointer on success, NULL if
2634  *		  'allOtherInfo' was not configured for this port.
2635  *
2636  * @Cautions	  Allowed only following fm_port_init().
2637  */
2638 uint8_t *fm_port_get_buffer_icinfo(t_handle h_fm_port, char *p_data);
2639 
2640 /*
2641  * @Function	  fm_port_get_buffer_prs_result
2642  *
2643  * @Description   Returns the pointer to the parse result in the data buffer.
2644  *		  In Rx ports this is relevant after reception, if parse result
2645  *		  is configured to be part of the data passed to the
2646  *		  application. For non Rx ports it may be used to get the
2647  *		  pointer of the area in the buffer where parse result should be
2648  *		  initialized - if so configured.
2649  *		  See fm_port_config_buffer_prefix_content for data buffer
2650  *		  prefix configuration.
2651  *
2652  * @Param[in]	  h_fm_port	FM PORT module descriptor
2653  * @Param[in]	  p_data	A pointer to the data buffer.
2654  *
2655  * @Return	  Parse result pointer on success, NULL if parse result was not
2656  *		  configured for this port.
2657  *
2658  * @Cautions	  Allowed only following fm_port_init().
2659  */
2660 t_fm_prs_result *fm_port_get_buffer_prs_result(t_handle h_fm_port,
2661 						char *p_data);
2662 
2663 /*
2664  * @Function	  fm_port_get_buffer_time_stamp
2665  *
2666  * @Description   Returns the time stamp in the data buffer.
2667  *		  Relevant for Rx ports for getting the buffer time stamp.
2668  *		  See fm_port_config_buffer_prefix_content for data buffer
2669  *		  prefix configuration.
2670  *
2671  * @Param[in]	  h_fm_port	FM PORT module descriptor
2672  * @Param[in]	  p_data	A pointer to the data buffer.
2673  *
2674  * @Return	  A pointer to the hash result on success, NULL otherwise.
2675  *
2676  * @Cautions	  Allowed only following fm_port_init().
2677  */
2678 uint64_t *fm_port_get_buffer_time_stamp(t_handle h_fm_port, char *p_data);
2679 
2680 /*
2681  * @Function	  fm_port_get_buffer_hash_result
2682  *
2683  * @Description   Given a data buffer, on the condition that hash result was
2684  *		  defined as a part of the buffer content(see
2685  *		  fm_port_config_buffer_prefix_content) this routine will return
2686  *		  the pointer to the hash result location in the buffer prefix.
2687  *
2688  * @Param[in]	  h_fm_port	FM PORT module descriptor
2689  * @Param[in]	  p_data	A pointer to the data buffer.
2690  *
2691  * @Return	  A pointer to the hash result on success, NULL otherwise.
2692  *
2693  * @Cautions	  Allowed only following fm_port_init().
2694  */
2695 uint8_t *fm_port_get_buffer_hash_result(t_handle h_fm_port, char *p_data);
2696 
2697 /*
2698  * @Function	  fm_port_disable
2699  *
2700  * @Description   Gracefully disable an FM port. The port will not start new
2701  *		  tasks after all tasks associated with the port are terminated.
2702  *
2703  * @Param[in]	  h_fm_port	A handle to a FM Port module.
2704  *
2705  * @Return	  E_OK on success; Error code otherwise.
2706  *
2707  * @Cautions	  Allowed only following fm_port_init().
2708  *		  This is a blocking routine, it returns after port is
2709  *		  gracefully stopped, i.e. the port will not except new frames,
2710  *		  but it will finish all frames or tasks which were already
2711  *		  began
2712  */
2713 uint32_t fm_port_disable(t_handle h_fm_port);
2714 
2715 /*
2716  * @Function	  fm_port_enable
2717  *
2718  * @Description   A runtime routine provided to allow disable/enable of port.
2719  *
2720  * @Param[in]	  h_fm_port	A handle to a FM Port module.
2721  *
2722  * @Return	  E_OK on success; Error code otherwise.
2723  *
2724  * @Cautions	 Allowed only following fm_port_init().
2725  */
2726 uint32_t fm_port_enable(t_handle h_fm_port);
2727 
2728 /*
2729  * @Function	  fm_port_set_rate_limit
2730  *
2731  * @Description   Calling this routine enables rate limit algorithm.
2732  *		  By default, this functionality is disabled.
2733  *
2734  *		  Note that rate - limit mechanism uses the FM time stamp.
2735  *		  The selected rate limit specified here would be
2736  *		  rounded DOWN to the nearest 16M.
2737  *
2738  *		  May be used for Tx and OP ports only
2739  *
2740  * @Param[in]	  h_fm_port	A handle to a FM Port module.
2741  * @Param[in]	  p_rate_limit	A structure of rate limit parameters
2742  *
2743  * @Return	  E_OK on success; Error code otherwise.
2744  *
2745  * @Cautions	  Allowed only following fm_port_init(). If rate limit is set
2746  *		  on a port that need to send PFC frames, it might violate the
2747  *		  stop transmit timing.
2748  */
2749 uint32_t fm_port_set_rate_limit(t_handle h_fm_port,
2750 				t_fm_port_rate_limit *p_rate_limit);
2751 
2752 /*
2753  * @Function	  fm_port_delete_rate_limit
2754  *
2755  * @Description   Calling this routine disables and clears rate limit
2756  *		  initialization.
2757  *
2758  *		  May be used for Tx and OP ports only
2759  *
2760  * @Param[in]	  h_fm_port	A handle to a FM Port module.
2761  *
2762  * @Return	  E_OK on success; Error code otherwise.
2763  *
2764  * @Cautions	  Allowed only following fm_port_init().
2765  */
2766 uint32_t fm_port_delete_rate_limit(t_handle h_fm_port);
2767 
2768 /*
2769  * @Function	  fm_port_set_pfc_priorities_mapping_to_qman_wq
2770 
2771  * @Description   Calling this routine maps each PFC received priority to the
2772  *		  transmit WQ. This WQ will be blocked upon receiving a PFC
2773  *		  frame with this priority.
2774  *
2775  *		  May be used for Tx ports only.
2776  *
2777  * @Param[in]	  h_fm_port	A handle to a FM Port module.
2778  * @Param[in]	  prio		PFC priority (0 - 7).
2779  * @Param[in]	  wq		Work Queue (0 - 7).
2780  *
2781  * @Return	  E_OK on success; Error code otherwise.
2782  *
2783  * @Cautions	  Allowed only following fm_port_init().
2784  */
2785 uint32_t fm_port_set_pfc_priorities_mapping_to_qman_wq(t_handle h_fm_port,
2786 						uint8_t prio, uint8_t wq);
2787 
2788 /*
2789  * @Function	  fm_port_set_statistics_counters
2790  *
2791  * @Description   Calling this routine enables/disables port's statistics
2792  *		  counters. By default, counters are enabled.
2793  *
2794  *		  May be used for all port types
2795  *
2796  * @Param[in]	  h_fm_port	A handle to a FM Port module.
2797  * @Param[in]	  enable	TRUE to enable, FALSE to disable.
2798  *
2799  * @Return	  E_OK on success; Error code otherwise.
2800  *
2801  * @Cautions	  Allowed only following fm_port_init().
2802  */
2803 uint32_t fm_port_set_statistics_counters(t_handle h_fm_port, bool enable);
2804 
2805 /*
2806  * @Function	  fm_port_set_frame_queue_counters
2807  *
2808  * @Description   Calling this routine enables/disables port's enqueue/dequeue
2809  *		  counters. By default, counters are enabled.
2810  *
2811  *		  May be used for all ports
2812  *
2813  * @Param[in]	  h_fm_port	A handle to a FM Port module.
2814  * @Param[in]	  enable	TRUE to enable, FALSE to disable.
2815  *
2816  * @Return	  E_OK on success; Error code otherwise.
2817  *
2818  * @Cautions	  Allowed only following fm_port_init().
2819  */
2820 uint32_t fm_port_set_frame_queue_counters(t_handle h_fm_port,
2821 						bool enable);
2822 
2823 /*
2824  * @Function	  fm_port_analyze_performance_params
2825  *
2826  * @Description   User may call this routine to so the driver will analyze if
2827  *		  the basic performance parameters are correct and also the
2828  *		  driver may suggest of improvements; The basic parameters are
2829  *		  FIFO sizes, number of DMAs and number of TNUMs for the port.
2830  *
2831  *		  May be used for all port types
2832  *
2833  * @Param[in]	  h_fm_port		A handle to a FM Port module.
2834  *
2835  * @Return	  E_OK on success; Error code otherwise.
2836  *
2837  * @Cautions	  Allowed only following fm_port_init().
2838  */
2839 uint32_t fm_port_analyze_performance_params(t_handle h_fm_port);
2840 
2841 /*
2842  * @Function	  fm_port_set_alloc_buf_counter
2843  *
2844  * @Description   Calling this routine enables/disables BM pool allocate
2845  *		  buffer counters.
2846  *		  By default, counters are enabled.
2847  *
2848  *		  May be used for Rx ports only
2849  *
2850  * @Param[in]	  h_fm_port	A handle to a FM Port module.
2851  * @Param[in]	  pool_id	BM pool id.
2852  * @Param[in]	  enable	TRUE to enable, FALSE to disable.
2853  *
2854  * @Return	  E_OK on success; Error code otherwise.
2855  *
2856  * @Cautions	  Allowed only following fm_port_init().
2857  */
2858 uint32_t fm_port_set_alloc_buf_counter(t_handle h_fm_port,
2859 						uint8_t pool_id, bool enable);
2860 
2861 /*
2862  * @Function	fm_port_get_bmi_counters
2863  *
2864  * @Description   Read port's BMI stat counters and place them into
2865  *		  a designated structure of counters.
2866  *
2867  * @Param[in]	  h_fm_port	A handle to a FM Port module.
2868  * @Param[out]	  p_bmi_stats	counters structure
2869  *
2870  * @Return	  E_OK on success; Error code otherwise.
2871  *
2872  * @Cautions	  Allowed only following fm_port_init().
2873  */
2874 uint32_t fm_port_get_bmi_counters(t_handle h_fm_port,
2875 					t_fm_port_bmi_stats *p_bmi_stats);
2876 
2877 /*
2878  * @Function	  fm_port_get_counter
2879  *
2880  * @Description   Reads one of the FM PORT counters.
2881  *
2882  * @Param[in]	  h_fm_port		A handle to a FM Port module.
2883  * @Param[in]	  fm_port_counter	The requested counter.
2884  *
2885  * @Return	  Counter's current value.
2886  *
2887  * @Cautions	  Allowed only following fm_port_init().
2888  *		  Note that it is user's responsibility to call this routine
2889  *		  only for enabled counters, and there will be no indication if
2890  *		  a disabled counter is accessed.
2891  */
2892 uint32_t fm_port_get_counter(t_handle h_fm_port,
2893 		e_fm_port_counters fm_port_counter);
2894 
2895 /*
2896  * @Function	  fm_port_modify_counter
2897  *
2898  * @Description   Sets a value to an enabled counter. Use "0" to reset the
2899  *		  counter.
2900  *
2901  * @Param[in]	  h_fm_port		A handle to a FM Port module.
2902  * @Param[in]	  fm_port_counter	The requested counter.
2903  * @Param[in]	  value			The requested value to be written into
2904  *					the counter.
2905  *
2906  * @Return	  E_OK on success; Error code otherwise.
2907  *
2908  * @Cautions	  Allowed only following fm_port_init().
2909  */
2910 uint32_t fm_port_modify_counter(t_handle h_fm_port,
2911 		e_fm_port_counters fm_port_counter, uint32_t value);
2912 
2913 /*
2914  * @Function	  fm_port_get_alloc_buf_counter
2915  *
2916  * @Description   Reads one of the FM PORT buffer counters.
2917  *
2918  * @Param[in]	  h_fm_port		A handle to a FM Port module.
2919  * @Param[in]	  pool_id		The requested pool.
2920  *
2921  * @Return	  Counter's current value.
2922  *
2923  * @Cautions	  Allowed only following fm_port_init().
2924  *		  Note that it is user's responsibility to call this routine
2925  *		  only for enabled counters, and there will be no indication if
2926  *		  a disabled counter is accessed.
2927  */
2928 uint32_t fm_port_get_alloc_buf_counter(t_handle h_fm_port,
2929 			uint8_t pool_id);
2930 
2931 /*
2932  * @Function	  fm_port_modify_alloc_buf_counter
2933  *
2934  * @Description   Sets a value to an enabled counter. Use "0" to reset the
2935  *		  counter.
2936  *
2937  * @Param[in]	  h_fm_port	A handle to a FM Port module.
2938  * @Param[in]	  pool_id	The requested pool.
2939  * @Param[in]	  value		The requested value to be written into the
2940  *				counter.
2941  *
2942  * @Return	  E_OK on success; Error code otherwise.
2943  *
2944  * @Cautions	  Allowed only following fm_port_init().
2945  */
2946 uint32_t fm_port_modify_alloc_buf_counter(t_handle h_fm_port,
2947 			uint8_t pool_id, uint32_t value);
2948 
2949 /*
2950  * @Function	fm_port_add_congestion_grps
2951  *
2952  * @Description   This routine effects the corresponding Tx port.
2953  *		  It should be called in order to enable pause
2954  *		  frame transmission in case of congestion in one or more
2955  *		  of the congestion groups relevant to this port.
2956  *		  Each call to this routine may add one or more congestion
2957  *		  groups to be considered relevant to this port.
2958  *
2959  *		  May be used for Rx, or RX + OP ports only (depending on chip)
2960  *
2961  * @Param[in]	  h_fm_port		A handle to a FM Port module.
2962  * @Param[in]	  p_congestion_grps	A pointer to an array of congestion
2963  *					groups id's to consider.
2964  *
2965  * @Return	  E_OK on success; Error code otherwise.
2966  *
2967  * @Cautions	  Allowed only following fm_port_init().
2968  */
2969 uint32_t fm_port_add_congestion_grps(t_handle h_fm_port,
2970 			t_fm_port_congestion_grps *p_congestion_grps);
2971 
2972 /*
2973  * @Function	  fm_port_remove_congestion_grps
2974  *
2975  * @Description   This routine effects the corresponding Tx port. It should be
2976  *		  called when congestion groups were defined for this port and
2977  *		  are no longer relevant, or pause frames transmitting is not
2978  *		  required on their behalf.
2979  *		  Each call to this routine may remove one or more congestion
2980  *		  groups to be considered relevant to this port.
2981  *
2982  *		  May be used for Rx, or RX + OP ports only (depending on chip)
2983  *
2984  * @Param[in]	  h_fm_port		A handle to a FM Port module.
2985  * @Param[in]	  p_congestion_grps	A pointer to an array of congestion
2986  *					groups id's to consider.
2987  *
2988  * @Return	  E_OK on success; Error code otherwise.
2989  *
2990  * @Cautions	  Allowed only following fm_port_init().
2991  */
2992 uint32_t fm_port_remove_congestion_grps(t_handle h_fm_port,
2993 			t_fm_port_congestion_grps *p_congestion_grps);
2994 
2995 /*
2996  * @Function	  fm_port_is_stalled
2997  *
2998  * @Description   A routine for checking whether the specified port is stalled.
2999  *
3000  * @Param[in]	  h_fm_port	A handle to a FM Port module.
3001  *
3002  * @Return	  TRUE if port is stalled, FALSE otherwise
3003  *
3004  * @Cautions	  Allowed only following fm_port_init().
3005  */
3006 bool fm_port_is_stalled(t_handle h_fm_port);
3007 
3008 /*
3009  * @Function	fm_port_release_stalled
3010  *
3011  * @Description   This routine may be called in case the port was stalled and
3012  *		  may now be released.
3013  *		  Note that this routine is available only on older FMan
3014  *		  revisions (FMan v2, DPAA v1.0 only).
3015  *
3016  * @Param[in]	  h_fm_port	A handle to a FM Port module.
3017  *
3018  * @Return	  E_OK on success; Error code otherwise.
3019  *
3020  * @Cautions	  Allowed only following fm_port_init().
3021  */
3022 uint32_t fm_port_release_stalled(t_handle h_fm_port);
3023 
3024 /*
3025  * @Function	  fm_port_set_rx_l4checksum_verify
3026  *
3027  * @Description   This routine is relevant for Rx ports (1G and 10G). The
3028  *		  routine set / clear the L3 / L4 checksum verification (on RX
3029  *		  side). Note that this takes affect only if hw - parser is
3030  *		  enabled !
3031  *
3032  * @Param[in]	  h_fm_port	A handle to a FM Port module.
3033  * @Param[in]	  l_4checksum	boolean indicates whether to do L3/L4 checksum
3034  *				on frames or not.
3035  *
3036  * @Return	  E_OK on success; Error code otherwise.
3037  *
3038  * @Cautions	  Allowed only following fm_port_init().
3039  */
3040 uint32_t fm_port_set_rx_l4checksum_verify(t_handle h_fm_port,
3041 			bool l_4checksum);
3042 
3043 /*
3044  * @Function	  fm_port_set_errors_route
3045  *
3046  * @Description   Errors selected for this routine will cause a frame with that
3047  *		  error to be enqueued to error queue.
3048  *		  Errors not selected for this routine will cause a frame with
3049  *		  that error to be enqueued to the one of the other port queues.
3050  *		  By default all errors are defined to be enqueued to error
3051  *		  queue. Errors that were configured to be discarded(at
3052  *		  initialization) may not be selected here.
3053  *
3054  *		  May be used for Rx and OP ports only
3055  *
3056  * @Param[in]	  h_fm_port	A handle to a FM Port module.
3057  * @Param[in]	  errs		A list of errors to enqueue to error queue
3058  *
3059  * @Return	  E_OK on success; Error code otherwise.
3060  *
3061  * @Cautions	  Allowed only following fm_port_config() and before
3062  *		  fm_port_init().
3063  */
3064 uint32_t fm_port_set_errors_route(t_handle h_fm_port,
3065 				fm_port_frame_err_select_t errs);
3066 
3067 /*
3068  * @Function	  fm_port_set_imexceptions
3069  *
3070  * @Description   Calling this routine enables/disables FM PORT interrupts.
3071  *
3072  * @Param[in]	  h_fm_port	FM PORT module descriptor.
3073  * @Param[in]	  exception	The exception to be selected.
3074  * @Param[in]	  enable	TRUE to enable interrupt, FALSE to mask it.
3075  *
3076  * @Return	  E_OK on success; Error code otherwise.
3077  *
3078  * @Cautions	  Allowed only following fm_port_init().
3079  *		  This routine should NOT be called from guest-partition
3080  *		  (i.e. guestId != NCSW_PRIMARY_ID)
3081  */
3082 uint32_t fm_port_set_imexceptions(t_handle h_fm_port,
3083 				e_fm_port_exceptions exception, bool enable);
3084 
3085 /*
3086  * @Function	  fm_port_set_performance_counters
3087  *
3088  * @Description   Calling this routine enables/disables port's performance
3089  *		  counters. By default, counters are enabled.
3090  *
3091  *		  May be used for all port types
3092  *
3093  * @Param[in]	  h_fm_port		A handle to a FM Port module.
3094  * @Param[in]	  enable		TRUE to enable, FALSE to disable.
3095  *
3096  * @Return	  E_OK on success; Error code otherwise.
3097  *
3098  * @Cautions	Allowed only following fm_port_init().
3099  */
3100 uint32_t fm_port_set_performance_counters(t_handle h_fm_port,
3101 						bool enable);
3102 
3103 /*
3104  * @Function	  fm_port_set_performance_counters_params
3105  *
3106  * @Description   Calling this routine defines port's performance counters
3107  *		  parameters.
3108  *
3109  *		  May be used for all port types
3110  *
3111  * @Param[in]	  h_fm_port			A handle to a FM Port module.
3112  * @Param[in]	  p_fm_port_performance_cnt	A pointer to a structure of
3113  *						performance counters parameters.
3114  *
3115  * @Return	  E_OK on success; Error code otherwise.
3116  *
3117  * @Cautions	  Allowed only following fm_port_init().
3118  */
3119 uint32_t fm_port_set_performance_counters_params(t_handle h_fm_port,
3120 			t_fm_port_performance_cnt *p_fm_port_performance_cnt);
3121 
3122 /*
3123  * @Group	  FM_PORT_pcd_runtime_control_grp
3124  *		  FM Port PCD Runtime Control Unit
3125  *
3126  * @Description   FM Port PCD Runtime control unit API functions, definitions
3127  *		  and enums.
3128  *
3129  * @Function	  fm_port_set_pcd
3130  *
3131  * @Description   Calling this routine defines the port's PCD configuration. It
3132  *		  changes it from its default configuration which is PCD
3133  *		  disabled (BMI to BMI) and configures it according to the
3134  *		  passed parameters.
3135  *
3136  *		  May be used for Rx and OP ports only
3137  *
3138  * @Param[in]	  h_fm_port	A handle to a FM Port module.
3139  * @Param[in]	  p_fm_port_pcd	A Structure of parameters defining the port's
3140  *				PCD configuration.
3141  *
3142  * @Return	  E_OK on success; Error code otherwise.
3143  *
3144  * @Cautions	  Allowed only following fm_port_init().
3145  */
3146 uint32_t fm_port_set_pcd(t_handle h_fm_port,
3147 			ioc_fm_port_pcd_params_t *p_fm_port_pcd);
3148 
3149 /*
3150  * @Function	  fm_port_delete_pcd
3151  *
3152  * @Description   Calling this routine releases the port's PCD configuration.
3153  *		  The port returns to its default configuration which is PCD
3154  *		  disabled (BMI to BMI) and all PCD configuration is removed.
3155  *
3156  *		  May be used for Rx and OP ports which are in PCD mode only
3157  *
3158  * @Param[in]	  h_fm_port	A handle to a FM Port module.
3159  *
3160  * @Return	  E_OK on success; Error code otherwise.
3161  *
3162  * @Cautions	  Allowed only following fm_port_init().
3163  */
3164 uint32_t fm_port_delete_pcd(t_handle h_fm_port);
3165 
3166 /*
3167  * @Function	  fm_port_attach_pcd
3168  *
3169  * @Description   This routine may be called after fm_port_detach_pcd was
3170  *		  called, to return to the originally configured PCD support
3171  *		  flow. The couple of routines are used to allow PCD
3172  *		  configuration changes that demand that PCD will not be used
3173  *		  while changes take place.
3174  *
3175  *		  May be used for Rx and OP ports which are in PCD mode only
3176  *
3177  * @Param[in]	  h_fm_port	A handle to a FM Port module.
3178  *
3179  * @Return	  E_OK on success; Error code otherwise.
3180  *
3181  * @Cautions	  Allowed only following fm_port_init().
3182  */
3183 uint32_t fm_port_attach_pcd(t_handle h_fm_port);
3184 
3185 /*
3186  * @Function	  fm_port_detach_pcd
3187  *
3188  * @Description   Calling this routine detaches the port from its PCD
3189  *		  functionality. The port returns to its default flow which is
3190  *		  BMI to BMI.
3191  *
3192  *		  May be used for Rx and OP ports which are in PCD mode only
3193  *
3194  * @Param[in]	  h_fm_port	A handle to a FM Port module.
3195  *
3196  * @Return	  E_OK on success; Error code otherwise.
3197  *
3198  * @Cautions	  Allowed only following fm_port_attach_pcd().
3199  */
3200 uint32_t fm_port_detach_pcd(t_handle h_fm_port);
3201 
3202 /*
3203  * @Function	  fm_port_pcd_plcr_alloc_profiles
3204  *
3205  * @Description   This routine may be called only for ports that use the Policer
3206  *		  in order to allocate private policer profiles.
3207  *
3208  * @Param[in]	  h_fm_port		A handle to a FM Port module.
3209  * @Param[in]	  num_of_profiles	The number of required policer profiles
3210  *
3211  * @Return	  E_OK on success; Error code otherwise.
3212  *
3213  * @Cautions	  Allowed only following fm_port_init() and fm_pcd_init(), and
3214  *		  before fm_port_set_pcd().
3215  */
3216 uint32_t fm_port_pcd_plcr_alloc_profiles(t_handle h_fm_port,
3217 			uint16_t num_of_profiles);
3218 
3219 /*
3220  * @Function	  fm_port_pcd_plcr_free_profiles
3221  *
3222  * @Description   This routine should be called for freeing private policer
3223  *		  profiles.
3224  *
3225  * @Param[in]	  h_fm_port		A handle to a FM Port module.
3226  *
3227  * @Return	  E_OK on success; Error code otherwise.
3228  *
3229  * @Cautions	  Allowed only following fm_port_init() and fm_pcd_init(), and
3230  *		  before fm_port_set_pcd().
3231  */
3232 uint32_t fm_port_pcd_plcr_free_profiles(t_handle h_fm_port);
3233 
3234 /*
3235  * @Function	  fm_port_pcd_kg_modify_initial_scheme
3236  *
3237  * @Description   This routine may be called only for ports that use the keygen
3238  *		  in order to change the initial scheme frame should be routed
3239  *		  to. The change may be of a scheme id(in case of direct mode),
3240  *		  from direct to indirect, or from indirect to direct -
3241  *		  specifying the scheme id.
3242  *
3243  * @Param[in]	  h_fm_port		A handle to a FM Port module.
3244  * @Param[in]	  p_fm_pcd_kg_scheme	A structure of parameters for defining
3245  *					whether a scheme is direct / indirect,
3246  *					and if direct - scheme id.
3247  *
3248  * @Return	  E_OK on success; Error code otherwise.
3249  *
3250  * @Cautions	  Allowed only following fm_port_init() and fm_port_set_pcd().
3251  */
3252 uint32_t fm_port_pcd_kg_modify_initial_scheme(t_handle h_fm_port,
3253 		ioc_fm_pcd_kg_scheme_select_t *p_fm_pcd_kg_scheme);
3254 
3255 /*
3256  * @Function	  fm_port_pcd_plcr_modify_initial_profile
3257  *
3258  * @Description   This routine may be called for ports with flows
3259  *		  e_FM_PORT_PCD_SUPPORT_PLCR_ONLY or
3260  *		  e_FM_PORT_PCD_SUPPORT_PRS_AND_PLCR only, to change the initial
3261  *		  Policer profile frame should be routed to. The change may be
3262  *		  of a profile and / or absolute / direct mode selection.
3263  *
3264  * @Param[in]	  h_fm_port		A handle to a FM Port module.
3265  * @Param[in]	  h_profile		Policer profile handle
3266  *
3267  * @Return	  E_OK on success; Error code otherwise.
3268  *
3269  * @Cautions	  Allowed only following fm_port_init() and fm_port_set_pcd().
3270  */
3271 uint32_t fm_port_pcd_plcr_modify_initial_profile(t_handle h_fm_port,
3272 						t_handle h_profile);
3273 
3274 /*
3275  * @Function	  fm_port_pcd_cc_modify_tree
3276  *
3277  * @Description   This routine may be called for ports that use coarse
3278  *		  classification tree if the user wishes to replace the tree.
3279  *		  The routine may not be called while port receives packets
3280  *		  using the PCD functionalities, therefore port must be first
3281  *		  detached from the PCD, only than the routine may be called,
3282  *		  and than port be attached to PCD again.
3283  *
3284  * @Param[in]	  h_fm_port	A handle to a FM Port module.
3285  * @Param[in]	  h_cc_tree	A CC tree that was already built. The tree id as
3286  *				returned from the BuildTree routine.
3287  *
3288  * @Return	  E_OK on success; Error code otherwise.
3289  *
3290  * @Cautions	  Allowed only following fm_port_init(), fm_port_set_pcd() and
3291  *		  fm_port_detach_pcd()
3292  */
3293 uint32_t fm_port_pcd_cc_modify_tree(t_handle h_fm_port, t_handle h_cc_tree);
3294 
3295 /*
3296  * @Function	  fm_port_pcd_kg_bind_schemes
3297  *
3298  * @Description   These routines may be called for adding more schemes for the
3299  *		  port to be bound to. The selected schemes are not added, just
3300  *		  this specific port starts using them.
3301  *
3302  * @Param[in]	  h_fm_port		A handle to a FM Port module.
3303  * @Param[in]	  p_port_scheme		A structure defining the list of schemes
3304  *					to be added.
3305  *
3306  * @Return	  E_OK on success; Error code otherwise.
3307  *
3308  * @Cautions	  Allowed only following fm_port_init() and fm_port_set_pcd().
3309  */
3310 uint32_t fm_port_pcd_kg_bind_schemes(t_handle h_fm_port,
3311 			ioc_fm_pcd_port_schemes_params_t *p_port_scheme);
3312 
3313 /*
3314  * @Function	  fm_port_pcd_kg_unbind_schemes
3315  *
3316  * @Description   These routines may be called for adding more schemes for the
3317  *		  port to be bound to. The selected schemes are not removed or
3318  *		  invalidated, just this specific port stops using them.
3319  *
3320  * @Param[in]	  h_fm_port		A handle to a FM Port module.
3321  * @Param[in]	  p_port_scheme		A structure defining the list of schemes
3322  *					to be added.
3323  *
3324  * @Return	  E_OK on success; Error code otherwise.
3325  *
3326  * @Cautions	  Allowed only following fm_port_init() and fm_port_set_pcd().
3327  */
3328 uint32_t fm_port_pcd_kg_unbind_schemes(t_handle h_fm_port,
3329 			ioc_fm_pcd_port_schemes_params_t *p_port_scheme);
3330 
3331 /*
3332  * @Function	  fm_port_get_ipv_4options_count
3333  *
3334  * @Description   TODO
3335  *
3336  * @Param[in]	  h_fm_port		A handle to a FM Port module.
3337  * @Param[out]	  p_ipv_4options_count  will hold the counter value
3338  *
3339  * @Return	  E_OK on success; Error code otherwise.
3340  *
3341  * @Cautions	  Allowed only following fm_port_init()
3342  */
3343 uint32_t fm_port_get_ipv_4options_count(t_handle h_fm_port,
3344 				uint32_t *p_ipv_4options_count);
3345 
3346 /** @} */ /* end of FM_PORT_pcd_runtime_control_grp group */
3347 /** @} */ /* end of FM_PORT_runtime_control_grp group */
3348 /** @} */ /* end of FM_PORT_grp group */
3349 /** @} */ /* end of FM_grp group */
3350 #endif /* __FM_PORT_EXT_H */
3351