xref: /dpdk/drivers/net/dpaa2/mc/dpni.c (revision 7917b0d38e92e8b9ec5a870415b791420e10f11a)
1 /* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0)
2  *
3  * Copyright 2013-2016 Freescale Semiconductor Inc.
4  * Copyright 2016-2022 NXP
5  *
6  */
7 #include <fsl_mc_sys.h>
8 #include <fsl_mc_cmd.h>
9 #include <fsl_dpni.h>
10 #include <fsl_dpni_cmd.h>
11 
12 /**
13  * dpni_open() - Open a control session for the specified object
14  * @mc_io:	Pointer to MC portal's I/O object
15  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
16  * @dpni_id:	DPNI unique ID
17  * @token:	Returned token; use in subsequent API calls
18  *
19  * This function can be used to open a control session for an
20  * already created object; an object may have been declared in
21  * the DPL or by calling the dpni_create() function.
22  * This function returns a unique authentication token,
23  * associated with the specific object ID and the specific MC
24  * portal; this token must be used in all subsequent commands for
25  * this specific object.
26  *
27  * Return:	'0' on Success; Error code otherwise.
28  */
29 int dpni_open(struct fsl_mc_io *mc_io,
30 	      uint32_t cmd_flags,
31 	      int dpni_id,
32 	      uint16_t *token)
33 {
34 	struct mc_command cmd = { 0 };
35 	struct dpni_cmd_open *cmd_params;
36 
37 	int err;
38 
39 	/* prepare command */
40 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_OPEN,
41 					  cmd_flags,
42 					  0);
43 	cmd_params = (struct dpni_cmd_open *)cmd.params;
44 	cmd_params->dpni_id = cpu_to_le32(dpni_id);
45 
46 	/* send command to mc*/
47 	err = mc_send_command(mc_io, &cmd);
48 	if (err)
49 		return err;
50 
51 	/* retrieve response parameters */
52 	*token = mc_cmd_hdr_read_token(&cmd);
53 
54 	return 0;
55 }
56 
57 /**
58  * dpni_close() - Close the control session of the object
59  * @mc_io:	Pointer to MC portal's I/O object
60  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
61  * @token:	Token of DPNI object
62  *
63  * After this function is called, no further operations are
64  * allowed on the object without opening a new control session.
65  *
66  * Return:	'0' on Success; Error code otherwise.
67  */
68 int dpni_close(struct fsl_mc_io *mc_io,
69 	       uint32_t cmd_flags,
70 	       uint16_t token)
71 {
72 	struct mc_command cmd = { 0 };
73 
74 	/* prepare command */
75 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_CLOSE,
76 					  cmd_flags,
77 					  token);
78 
79 	/* send command to mc*/
80 	return mc_send_command(mc_io, &cmd);
81 }
82 
83 /**
84  * dpni_create() - Create the DPNI object
85  * @mc_io:	Pointer to MC portal's I/O object
86  * @dprc_token:	Parent container token; '0' for default container
87  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
88  * @cfg:	Configuration structure
89  * @obj_id:	Returned object id
90  *
91  * Create the DPNI object, allocate required resources and
92  * perform required initialization.
93  *
94  * The object can be created either by declaring it in the
95  * DPL file, or by calling this function.
96  *
97  * The function accepts an authentication token of a parent
98  * container that this object should be assigned to. The token
99  * can be '0' so the object will be assigned to the default container.
100  * The newly created object can be opened with the returned
101  * object id and using the container's associated tokens and MC portals.
102  *
103  * Return:	'0' on Success; Error code otherwise.
104  */
105 int dpni_create(struct fsl_mc_io *mc_io,
106 		uint16_t dprc_token,
107 		uint32_t cmd_flags,
108 		const struct dpni_cfg *cfg,
109 		uint32_t *obj_id)
110 {
111 	struct dpni_cmd_create *cmd_params;
112 	struct mc_command cmd = { 0 };
113 	int err;
114 
115 	/* prepare command */
116 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_CREATE,
117 					  cmd_flags,
118 					  dprc_token);
119 	cmd_params = (struct dpni_cmd_create *)cmd.params;
120 	cmd_params->options = cpu_to_le32(cfg->options);
121 	cmd_params->num_queues = cfg->num_queues;
122 	cmd_params->num_tcs = cfg->num_tcs;
123 	cmd_params->mac_filter_entries = cfg->mac_filter_entries;
124 	cmd_params->num_rx_tcs = cfg->num_rx_tcs;
125 	cmd_params->vlan_filter_entries =  cfg->vlan_filter_entries;
126 	cmd_params->qos_entries = cfg->qos_entries;
127 	cmd_params->fs_entries = cpu_to_le16(cfg->fs_entries);
128 	cmd_params->num_cgs = cfg->num_cgs;
129 	cmd_params->num_opr = cfg->num_opr;
130 	cmd_params->dist_key_size = cfg->dist_key_size;
131 	cmd_params->num_channels = cfg->num_channels;
132 
133 	/* send command to mc*/
134 	err = mc_send_command(mc_io, &cmd);
135 	if (err)
136 		return err;
137 
138 	/* retrieve response parameters */
139 	*obj_id = mc_cmd_read_object_id(&cmd);
140 
141 	return 0;
142 }
143 
144 /**
145  * dpni_destroy() - Destroy the DPNI object and release all its resources.
146  * @mc_io:	Pointer to MC portal's I/O object
147  * @dprc_token: Parent container token; '0' for default container
148  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
149  * @object_id:	The object id; it must be a valid id within the container that
150  * created this object;
151  *
152  * The function accepts the authentication token of the parent container that
153  * created the object (not the one that currently owns the object). The object
154  * is searched within parent using the provided 'object_id'.
155  * All tokens to the object must be closed before calling destroy.
156  *
157  * Return:	'0' on Success; error code otherwise.
158  */
159 int dpni_destroy(struct fsl_mc_io *mc_io,
160 		 uint16_t dprc_token,
161 		 uint32_t cmd_flags,
162 		 uint32_t object_id)
163 {
164 	struct dpni_cmd_destroy *cmd_params;
165 	struct mc_command cmd = { 0 };
166 
167 	/* prepare command */
168 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_DESTROY,
169 					  cmd_flags,
170 					  dprc_token);
171 	/* set object id to destroy */
172 	cmd_params = (struct dpni_cmd_destroy *)cmd.params;
173 	cmd_params->dpsw_id = cpu_to_le32(object_id);
174 
175 	/* send command to mc*/
176 	return mc_send_command(mc_io, &cmd);
177 }
178 
179 /**
180  * dpni_set_pools() - Set buffer pools configuration
181  * @mc_io:	Pointer to MC portal's I/O object
182  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
183  * @token:	Token of DPNI object
184  * @cfg:	Buffer pools configuration
185  *
186  * mandatory for DPNI operation
187  * warning:Allowed only when DPNI is disabled
188  *
189  * Return:	'0' on Success; Error code otherwise.
190  */
191 int dpni_set_pools(struct fsl_mc_io *mc_io,
192 		   uint32_t cmd_flags,
193 		   uint16_t token,
194 		   const struct dpni_pools_cfg *cfg)
195 {
196 	struct mc_command cmd = { 0 };
197 	struct dpni_cmd_set_pools *cmd_params;
198 	int i;
199 
200 	/* prepare command */
201 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_POOLS,
202 					  cmd_flags,
203 					  token);
204 	cmd_params = (struct dpni_cmd_set_pools *)cmd.params;
205 	cmd_params->num_dpbp = cfg->num_dpbp;
206 	cmd_params->pool_options = cfg->pool_options;
207 	for (i = 0; i < DPNI_MAX_DPBP; i++) {
208 		cmd_params->pool[i].dpbp_id =
209 			cpu_to_le16(cfg->pools[i].dpbp_id);
210 		cmd_params->pool[i].priority_mask =
211 			cfg->pools[i].priority_mask;
212 		cmd_params->buffer_size[i] =
213 			cpu_to_le16(cfg->pools[i].buffer_size);
214 		cmd_params->backup_pool_mask |=
215 			DPNI_BACKUP_POOL(cfg->pools[i].backup_pool, i);
216 	}
217 
218 	/* send command to mc*/
219 	return mc_send_command(mc_io, &cmd);
220 }
221 
222 /**
223  * dpni_enable() - Enable the DPNI, allow sending and receiving frames.
224  * @mc_io:	Pointer to MC portal's I/O object
225  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
226  * @token:	Token of DPNI object
227  *
228  * Return:	'0' on Success; Error code otherwise.
229  */
230 int dpni_enable(struct fsl_mc_io *mc_io,
231 		uint32_t cmd_flags,
232 		uint16_t token)
233 {
234 	struct mc_command cmd = { 0 };
235 
236 	/* prepare command */
237 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_ENABLE,
238 					  cmd_flags,
239 					  token);
240 
241 	/* send command to mc*/
242 	return mc_send_command(mc_io, &cmd);
243 }
244 
245 /**
246  * dpni_disable() - Disable the DPNI, stop sending and receiving frames.
247  * @mc_io:	Pointer to MC portal's I/O object
248  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
249  * @token:	Token of DPNI object
250  *
251  * Return:	'0' on Success; Error code otherwise.
252  */
253 int dpni_disable(struct fsl_mc_io *mc_io,
254 		 uint32_t cmd_flags,
255 		 uint16_t token)
256 {
257 	struct mc_command cmd = { 0 };
258 
259 	/* prepare command */
260 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_DISABLE,
261 					  cmd_flags,
262 					  token);
263 
264 	/* send command to mc*/
265 	return mc_send_command(mc_io, &cmd);
266 }
267 
268 /**
269  * dpni_is_enabled() - Check if the DPNI is enabled.
270  * @mc_io:	Pointer to MC portal's I/O object
271  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
272  * @token:	Token of DPNI object
273  * @en:		Returns '1' if object is enabled; '0' otherwise
274  *
275  * Return:	'0' on Success; Error code otherwise.
276  */
277 int dpni_is_enabled(struct fsl_mc_io *mc_io,
278 		    uint32_t cmd_flags,
279 		    uint16_t token,
280 		    int *en)
281 {
282 	struct mc_command cmd = { 0 };
283 	struct dpni_rsp_is_enabled *rsp_params;
284 	int err;
285 
286 	/* prepare command */
287 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_IS_ENABLED,
288 					  cmd_flags,
289 					  token);
290 
291 	/* send command to mc*/
292 	err = mc_send_command(mc_io, &cmd);
293 	if (err)
294 		return err;
295 
296 	/* retrieve response parameters */
297 	rsp_params = (struct dpni_rsp_is_enabled *)cmd.params;
298 	*en = dpni_get_field(rsp_params->enabled, ENABLE);
299 
300 	return 0;
301 }
302 
303 /**
304  * dpni_reset() - Reset the DPNI, returns the object to initial state.
305  * @mc_io:	Pointer to MC portal's I/O object
306  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
307  * @token:	Token of DPNI object
308  *
309  * Return:	'0' on Success; Error code otherwise.
310  */
311 int dpni_reset(struct fsl_mc_io *mc_io,
312 	       uint32_t cmd_flags,
313 	       uint16_t token)
314 {
315 	struct mc_command cmd = { 0 };
316 
317 	/* prepare command */
318 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_RESET,
319 					  cmd_flags,
320 					  token);
321 
322 	/* send command to mc*/
323 	return mc_send_command(mc_io, &cmd);
324 }
325 
326 /**
327  * dpni_set_irq_enable() - Set overall interrupt state.
328  * @mc_io:	Pointer to MC portal's I/O object
329  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
330  * @token:	Token of DPNI object
331  * @irq_index:	The interrupt index to configure
332  * @en:		Interrupt state: - enable = 1, disable = 0
333  *
334  * Allows GPP software to control when interrupts are generated.
335  * Each interrupt can have up to 32 causes.  The enable/disable control's the
336  * overall interrupt state. if the interrupt is disabled no causes will cause
337  * an interrupt.
338  *
339  * Return:	'0' on Success; Error code otherwise.
340  */
341 int dpni_set_irq_enable(struct fsl_mc_io *mc_io,
342 			uint32_t cmd_flags,
343 			uint16_t token,
344 			uint8_t irq_index,
345 			uint8_t en)
346 {
347 	struct mc_command cmd = { 0 };
348 	struct dpni_cmd_set_irq_enable *cmd_params;
349 
350 	/* prepare command */
351 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_IRQ_ENABLE,
352 					  cmd_flags,
353 					  token);
354 	cmd_params = (struct dpni_cmd_set_irq_enable *)cmd.params;
355 	dpni_set_field(cmd_params->enable, ENABLE, en);
356 	cmd_params->irq_index = irq_index;
357 
358 	/* send command to mc*/
359 	return mc_send_command(mc_io, &cmd);
360 }
361 
362 /**
363  * dpni_get_irq_enable() - Get overall interrupt state
364  * @mc_io:	Pointer to MC portal's I/O object
365  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
366  * @token:	Token of DPNI object
367  * @irq_index:	The interrupt index to configure
368  * @en:		Returned interrupt state - enable = 1, disable = 0
369  *
370  * Return:	'0' on Success; Error code otherwise.
371  */
372 int dpni_get_irq_enable(struct fsl_mc_io *mc_io,
373 			uint32_t cmd_flags,
374 			uint16_t token,
375 			uint8_t irq_index,
376 			uint8_t *en)
377 {
378 	struct mc_command cmd = { 0 };
379 	struct dpni_cmd_get_irq_enable *cmd_params;
380 	struct dpni_rsp_get_irq_enable *rsp_params;
381 
382 	int err;
383 
384 	/* prepare command */
385 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_IRQ_ENABLE,
386 					  cmd_flags,
387 					  token);
388 	cmd_params = (struct dpni_cmd_get_irq_enable *)cmd.params;
389 	cmd_params->irq_index = irq_index;
390 
391 	/* send command to mc*/
392 	err = mc_send_command(mc_io, &cmd);
393 	if (err)
394 		return err;
395 
396 	/* retrieve response parameters */
397 	rsp_params = (struct dpni_rsp_get_irq_enable *)cmd.params;
398 	*en = dpni_get_field(rsp_params->enabled, ENABLE);
399 
400 	return 0;
401 }
402 
403 /**
404  * dpni_set_irq_mask() - Set interrupt mask.
405  * @mc_io:	Pointer to MC portal's I/O object
406  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
407  * @token:	Token of DPNI object
408  * @irq_index:	The interrupt index to configure
409  * @mask:	Event mask to trigger interrupt;
410  *		each bit:
411  *			0 = ignore event
412  *			1 = consider event for asserting IRQ
413  *
414  * Every interrupt can have up to 32 causes and the interrupt model supports
415  * masking/unmasking each cause independently
416  *
417  * Return:	'0' on Success; Error code otherwise.
418  */
419 int dpni_set_irq_mask(struct fsl_mc_io *mc_io,
420 		      uint32_t cmd_flags,
421 		      uint16_t token,
422 		      uint8_t irq_index,
423 		      uint32_t mask)
424 {
425 	struct mc_command cmd = { 0 };
426 	struct dpni_cmd_set_irq_mask *cmd_params;
427 
428 	/* prepare command */
429 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_IRQ_MASK,
430 					  cmd_flags,
431 					  token);
432 	cmd_params = (struct dpni_cmd_set_irq_mask *)cmd.params;
433 	cmd_params->mask = cpu_to_le32(mask);
434 	cmd_params->irq_index = irq_index;
435 
436 	/* send command to mc*/
437 	return mc_send_command(mc_io, &cmd);
438 }
439 
440 /**
441  * dpni_get_irq_mask() - Get interrupt mask.
442  * @mc_io:	Pointer to MC portal's I/O object
443  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
444  * @token:	Token of DPNI object
445  * @irq_index:	The interrupt index to configure
446  * @mask:	Returned event mask to trigger interrupt
447  *
448  * Every interrupt can have up to 32 causes and the interrupt model supports
449  * masking/unmasking each cause independently
450  *
451  * Return:	'0' on Success; Error code otherwise.
452  */
453 int dpni_get_irq_mask(struct fsl_mc_io *mc_io,
454 		      uint32_t cmd_flags,
455 		      uint16_t token,
456 		      uint8_t irq_index,
457 		      uint32_t *mask)
458 {
459 	struct mc_command cmd = { 0 };
460 	struct dpni_cmd_get_irq_mask *cmd_params;
461 	struct dpni_rsp_get_irq_mask *rsp_params;
462 	int err;
463 
464 	/* prepare command */
465 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_IRQ_MASK,
466 					  cmd_flags,
467 					  token);
468 	cmd_params = (struct dpni_cmd_get_irq_mask *)cmd.params;
469 	cmd_params->irq_index = irq_index;
470 
471 	/* send command to mc*/
472 	err = mc_send_command(mc_io, &cmd);
473 	if (err)
474 		return err;
475 
476 	/* retrieve response parameters */
477 	rsp_params = (struct dpni_rsp_get_irq_mask *)cmd.params;
478 	*mask = le32_to_cpu(rsp_params->mask);
479 
480 	return 0;
481 }
482 
483 /**
484  * dpni_get_irq_status() - Get the current status of any pending interrupts.
485  * @mc_io:	Pointer to MC portal's I/O object
486  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
487  * @token:	Token of DPNI object
488  * @irq_index:	The interrupt index to configure
489  * @status:	Returned interrupts status - one bit per cause:
490  *			0 = no interrupt pending
491  *			1 = interrupt pending
492  *
493  * Return:	'0' on Success; Error code otherwise.
494  */
495 int dpni_get_irq_status(struct fsl_mc_io *mc_io,
496 			uint32_t cmd_flags,
497 			uint16_t token,
498 			uint8_t irq_index,
499 			uint32_t *status)
500 {
501 	struct mc_command cmd = { 0 };
502 	struct dpni_cmd_get_irq_status *cmd_params;
503 	struct dpni_rsp_get_irq_status *rsp_params;
504 	int err;
505 
506 	/* prepare command */
507 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_IRQ_STATUS,
508 					  cmd_flags,
509 					  token);
510 	cmd_params = (struct dpni_cmd_get_irq_status *)cmd.params;
511 	cmd_params->status = cpu_to_le32(*status);
512 	cmd_params->irq_index = irq_index;
513 
514 	/* send command to mc*/
515 	err = mc_send_command(mc_io, &cmd);
516 	if (err)
517 		return err;
518 
519 	/* retrieve response parameters */
520 	rsp_params = (struct dpni_rsp_get_irq_status *)cmd.params;
521 	*status = le32_to_cpu(rsp_params->status);
522 
523 	return 0;
524 }
525 
526 /**
527  * dpni_clear_irq_status() - Clear a pending interrupt's status
528  * @mc_io:	Pointer to MC portal's I/O object
529  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
530  * @token:	Token of DPNI object
531  * @irq_index:	The interrupt index to configure
532  * @status:	bits to clear (W1C) - one bit per cause:
533  *			0 = don't change
534  *			1 = clear status bit
535  *
536  * Return:	'0' on Success; Error code otherwise.
537  */
538 int dpni_clear_irq_status(struct fsl_mc_io *mc_io,
539 			  uint32_t cmd_flags,
540 			  uint16_t token,
541 			  uint8_t irq_index,
542 			  uint32_t status)
543 {
544 	struct mc_command cmd = { 0 };
545 	struct dpni_cmd_clear_irq_status *cmd_params;
546 
547 	/* prepare command */
548 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_CLEAR_IRQ_STATUS,
549 					  cmd_flags,
550 					  token);
551 	cmd_params = (struct dpni_cmd_clear_irq_status *)cmd.params;
552 	cmd_params->irq_index = irq_index;
553 	cmd_params->status = cpu_to_le32(status);
554 
555 	/* send command to mc*/
556 	return mc_send_command(mc_io, &cmd);
557 }
558 
559 /**
560  * dpni_get_attributes() - Retrieve DPNI attributes.
561  * @mc_io:	Pointer to MC portal's I/O object
562  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
563  * @token:	Token of DPNI object
564  * @attr:	Object's attributes
565  *
566  * Return:	'0' on Success; Error code otherwise.
567  */
568 int dpni_get_attributes(struct fsl_mc_io *mc_io,
569 			uint32_t cmd_flags,
570 			uint16_t token,
571 			struct dpni_attr *attr)
572 {
573 	struct mc_command cmd = { 0 };
574 	struct dpni_rsp_get_attr *rsp_params;
575 
576 	int err;
577 
578 	/* prepare command */
579 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_ATTR,
580 					  cmd_flags,
581 					  token);
582 
583 	/* send command to mc*/
584 	err = mc_send_command(mc_io, &cmd);
585 	if (err)
586 		return err;
587 
588 	/* retrieve response parameters */
589 	rsp_params = (struct dpni_rsp_get_attr *)cmd.params;
590 	attr->options = le32_to_cpu(rsp_params->options);
591 	attr->num_queues = rsp_params->num_queues;
592 	attr->num_rx_tcs = rsp_params->num_rx_tcs;
593 	attr->num_tx_tcs = rsp_params->num_tx_tcs;
594 	attr->mac_filter_entries = rsp_params->mac_filter_entries;
595 	attr->vlan_filter_entries = rsp_params->vlan_filter_entries;
596 	attr->num_channels = rsp_params->num_channels;
597 	attr->qos_entries = rsp_params->qos_entries;
598 	attr->fs_entries = le16_to_cpu(rsp_params->fs_entries);
599 	attr->num_opr = le16_to_cpu(rsp_params->num_opr);
600 	attr->qos_key_size = rsp_params->qos_key_size;
601 	attr->fs_key_size = rsp_params->fs_key_size;
602 	attr->wriop_version = le16_to_cpu(rsp_params->wriop_version);
603 	attr->num_cgs = rsp_params->num_cgs;
604 
605 	return 0;
606 }
607 
608 /**
609  * dpni_set_errors_behavior() - Set errors behavior
610  * @mc_io:	Pointer to MC portal's I/O object
611  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
612  * @token:	Token of DPNI object
613  * @cfg:	Errors configuration
614  *
615  * This function may be called numerous times with different
616  * error masks
617  *
618  * Return:	'0' on Success; Error code otherwise.
619  */
620 int dpni_set_errors_behavior(struct fsl_mc_io *mc_io,
621 			     uint32_t cmd_flags,
622 			     uint16_t token,
623 			     struct dpni_error_cfg *cfg)
624 {
625 	struct mc_command cmd = { 0 };
626 	struct dpni_cmd_set_errors_behavior *cmd_params;
627 
628 	/* prepare command */
629 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_ERRORS_BEHAVIOR,
630 					  cmd_flags,
631 					  token);
632 	cmd_params = (struct dpni_cmd_set_errors_behavior *)cmd.params;
633 	cmd_params->errors = cpu_to_le32(cfg->errors);
634 	dpni_set_field(cmd_params->flags, ERROR_ACTION, cfg->error_action);
635 	dpni_set_field(cmd_params->flags, FRAME_ANN, cfg->set_frame_annotation);
636 
637 	/* send command to mc*/
638 	return mc_send_command(mc_io, &cmd);
639 }
640 
641 /**
642  * dpni_get_buffer_layout() - Retrieve buffer layout attributes.
643  * @mc_io:	Pointer to MC portal's I/O object
644  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
645  * @token:	Token of DPNI object
646  * @qtype:	Type of queue to retrieve configuration for
647  * @layout:	Returns buffer layout attributes
648  *
649  * Return:	'0' on Success; Error code otherwise.
650  */
651 int dpni_get_buffer_layout(struct fsl_mc_io *mc_io,
652 			   uint32_t cmd_flags,
653 			   uint16_t token,
654 			   enum dpni_queue_type qtype,
655 			   struct dpni_buffer_layout *layout)
656 {
657 	struct mc_command cmd = { 0 };
658 	struct dpni_cmd_get_buffer_layout *cmd_params;
659 	struct dpni_rsp_get_buffer_layout *rsp_params;
660 	int err;
661 
662 	/* prepare command */
663 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_BUFFER_LAYOUT,
664 					  cmd_flags,
665 					  token);
666 	cmd_params = (struct dpni_cmd_get_buffer_layout *)cmd.params;
667 	cmd_params->qtype = qtype;
668 
669 	/* send command to mc*/
670 	err = mc_send_command(mc_io, &cmd);
671 	if (err)
672 		return err;
673 
674 	/* retrieve response parameters */
675 	rsp_params = (struct dpni_rsp_get_buffer_layout *)cmd.params;
676 	layout->pass_timestamp =
677 				(int)dpni_get_field(rsp_params->flags, PASS_TS);
678 	layout->pass_parser_result =
679 				(int)dpni_get_field(rsp_params->flags, PASS_PR);
680 	layout->pass_frame_status =
681 				(int)dpni_get_field(rsp_params->flags, PASS_FS);
682 	layout->pass_sw_opaque =
683 			(int)dpni_get_field(rsp_params->flags, PASS_SWO);
684 	layout->private_data_size = le16_to_cpu(rsp_params->private_data_size);
685 	layout->data_align = le16_to_cpu(rsp_params->data_align);
686 	layout->data_head_room = le16_to_cpu(rsp_params->head_room);
687 	layout->data_tail_room = le16_to_cpu(rsp_params->tail_room);
688 
689 	return 0;
690 }
691 
692 /**
693  * dpni_set_buffer_layout() - Set buffer layout configuration.
694  * @mc_io:	Pointer to MC portal's I/O object
695  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
696  * @token:	Token of DPNI object
697  * @qtype:	Type of queue this configuration applies to
698  * @layout:	Buffer layout configuration
699  *
700  * Return:	'0' on Success; Error code otherwise.
701  *
702  * @warning	Allowed only when DPNI is disabled
703  */
704 int dpni_set_buffer_layout(struct fsl_mc_io *mc_io,
705 			   uint32_t cmd_flags,
706 			   uint16_t token,
707 			   enum dpni_queue_type qtype,
708 			   const struct dpni_buffer_layout *layout)
709 {
710 	struct mc_command cmd = { 0 };
711 	struct dpni_cmd_set_buffer_layout *cmd_params;
712 
713 	/* prepare command */
714 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_BUFFER_LAYOUT,
715 					  cmd_flags,
716 					  token);
717 	cmd_params = (struct dpni_cmd_set_buffer_layout *)cmd.params;
718 	cmd_params->qtype = qtype;
719 	cmd_params->options = cpu_to_le16((uint16_t)layout->options);
720 	dpni_set_field(cmd_params->flags, PASS_TS, layout->pass_timestamp);
721 	dpni_set_field(cmd_params->flags, PASS_PR, layout->pass_parser_result);
722 	dpni_set_field(cmd_params->flags, PASS_FS, layout->pass_frame_status);
723 	dpni_set_field(cmd_params->flags, PASS_SWO, layout->pass_sw_opaque);
724 	cmd_params->private_data_size = cpu_to_le16(layout->private_data_size);
725 	cmd_params->data_align = cpu_to_le16(layout->data_align);
726 	cmd_params->head_room = cpu_to_le16(layout->data_head_room);
727 	cmd_params->tail_room = cpu_to_le16(layout->data_tail_room);
728 
729 	/* send command to mc*/
730 	return mc_send_command(mc_io, &cmd);
731 }
732 
733 /**
734  * dpni_set_offload() - Set DPNI offload configuration.
735  * @mc_io:	Pointer to MC portal's I/O object
736  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
737  * @token:	Token of DPNI object
738  * @type:	Type of DPNI offload
739  * @config:	Offload configuration.
740  *		For checksum offloads, non-zero value enables the offload
741  *
742  * Return:     '0' on Success; Error code otherwise.
743  *
744  * @warning    Allowed only when DPNI is disabled
745  */
746 
747 int dpni_set_offload(struct fsl_mc_io *mc_io,
748 		     uint32_t cmd_flags,
749 		     uint16_t token,
750 		     enum dpni_offload type,
751 		     uint32_t config)
752 {
753 	struct mc_command cmd = { 0 };
754 	struct dpni_cmd_set_offload *cmd_params;
755 
756 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_OFFLOAD,
757 					  cmd_flags,
758 					  token);
759 	cmd_params = (struct dpni_cmd_set_offload *)cmd.params;
760 	cmd_params->dpni_offload = type;
761 	cmd_params->config = cpu_to_le32(config);
762 
763 	return mc_send_command(mc_io, &cmd);
764 }
765 
766 /**
767  * dpni_get_offload() - Get DPNI offload configuration.
768  * @mc_io:	Pointer to MC portal's I/O object
769  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
770  * @token:	Token of DPNI object
771  * @type:	Type of DPNI offload
772  * @config:	Offload configuration.
773  *			For checksum offloads, a value of 1 indicates that the
774  *			offload is enabled.
775  *
776  * Return:	'0' on Success; Error code otherwise.
777  *
778  * @warning	Allowed only when DPNI is disabled
779  */
780 int dpni_get_offload(struct fsl_mc_io *mc_io,
781 		     uint32_t cmd_flags,
782 		     uint16_t token,
783 		     enum dpni_offload type,
784 		     uint32_t *config)
785 {
786 	struct mc_command cmd = { 0 };
787 	struct dpni_cmd_get_offload *cmd_params;
788 	struct dpni_rsp_get_offload *rsp_params;
789 	int err;
790 
791 	/* prepare command */
792 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_OFFLOAD,
793 					  cmd_flags,
794 					  token);
795 	cmd_params = (struct dpni_cmd_get_offload *)cmd.params;
796 	cmd_params->dpni_offload = type;
797 
798 	/* send command to mc*/
799 	err = mc_send_command(mc_io, &cmd);
800 	if (err)
801 		return err;
802 
803 	/* retrieve response parameters */
804 	rsp_params = (struct dpni_rsp_get_offload *)cmd.params;
805 	*config = le32_to_cpu(rsp_params->config);
806 
807 	return 0;
808 }
809 
810 /**
811  * dpni_get_qdid() - Get the Queuing Destination ID (QDID) that should be used
812  *			for enqueue operations
813  * @mc_io:	Pointer to MC portal's I/O object
814  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
815  * @token:	Token of DPNI object
816  * @qtype:	Type of queue to receive QDID for
817  * @qdid:	Returned virtual QDID value that should be used as an argument
818  *			in all enqueue operations
819  *
820  * Return:	'0' on Success; Error code otherwise.
821  *
822  * If dpni object is created using multiple Tc channels this function will return
823  * qdid value for the first channel
824  */
825 int dpni_get_qdid(struct fsl_mc_io *mc_io,
826 		  uint32_t cmd_flags,
827 		  uint16_t token,
828 		  enum dpni_queue_type qtype,
829 		  uint16_t *qdid)
830 {
831 	struct mc_command cmd = { 0 };
832 	struct dpni_cmd_get_qdid *cmd_params;
833 	struct dpni_rsp_get_qdid *rsp_params;
834 	int err;
835 
836 	/* prepare command */
837 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_QDID,
838 					  cmd_flags,
839 					  token);
840 	cmd_params = (struct dpni_cmd_get_qdid *)cmd.params;
841 	cmd_params->qtype = qtype;
842 
843 	/* send command to mc*/
844 	err = mc_send_command(mc_io, &cmd);
845 	if (err)
846 		return err;
847 
848 	/* retrieve response parameters */
849 	rsp_params = (struct dpni_rsp_get_qdid *)cmd.params;
850 	*qdid = le16_to_cpu(rsp_params->qdid);
851 
852 	return 0;
853 }
854 
855 /**
856  * dpni_get_tx_data_offset() - Get the Tx data offset (from start of buffer)
857  * @mc_io:	Pointer to MC portal's I/O object
858  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
859  * @token:	Token of DPNI object
860  * @data_offset: Tx data offset (from start of buffer)
861  *
862  * Return:	'0' on Success; Error code otherwise.
863  */
864 int dpni_get_tx_data_offset(struct fsl_mc_io *mc_io,
865 			    uint32_t cmd_flags,
866 			    uint16_t token,
867 			    uint16_t *data_offset)
868 {
869 	struct mc_command cmd = { 0 };
870 	struct dpni_rsp_get_tx_data_offset *rsp_params;
871 	int err;
872 
873 	/* prepare command */
874 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_TX_DATA_OFFSET,
875 					  cmd_flags,
876 					  token);
877 
878 	/* send command to mc*/
879 	err = mc_send_command(mc_io, &cmd);
880 	if (err)
881 		return err;
882 
883 	/* retrieve response parameters */
884 	rsp_params = (struct dpni_rsp_get_tx_data_offset *)cmd.params;
885 	*data_offset = le16_to_cpu(rsp_params->data_offset);
886 
887 	return 0;
888 }
889 
890 /**
891  * dpni_set_link_cfg() - set the link configuration.
892  * @mc_io:	Pointer to MC portal's I/O object
893  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
894  * @token:	Token of DPNI object
895  * @cfg:	Link configuration
896  *
897  * Return:	'0' on Success; Error code otherwise.
898  */
899 int dpni_set_link_cfg(struct fsl_mc_io *mc_io,
900 		      uint32_t cmd_flags,
901 		      uint16_t token,
902 		      const struct dpni_link_cfg *cfg)
903 {
904 	struct mc_command cmd = { 0 };
905 	struct dpni_cmd_set_link_cfg *cmd_params;
906 
907 	/* prepare command */
908 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_LINK_CFG,
909 					  cmd_flags,
910 					  token);
911 	cmd_params = (struct dpni_cmd_set_link_cfg *)cmd.params;
912 	cmd_params->rate = cpu_to_le32(cfg->rate);
913 	cmd_params->options = cpu_to_le64(cfg->options);
914 	cmd_params->advertising = cpu_to_le64(cfg->advertising);
915 
916 	/* send command to mc*/
917 	return mc_send_command(mc_io, &cmd);
918 }
919 
920 /**
921  * dpni_get_link_cfg() - return the link configuration configured by
922  *			dpni_set_link_cfg().
923  * @mc_io:	Pointer to MC portal's I/O object
924  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
925  * @token:	Token of DPNI object
926  * @cfg:	Link configuration from dpni object
927  *
928  * Return:	'0' on Success; Error code otherwise.
929  */
930 int dpni_get_link_cfg(struct fsl_mc_io *mc_io,
931 		      uint32_t cmd_flags,
932 		      uint16_t token,
933 		      struct dpni_link_cfg *cfg)
934 {
935 	struct mc_command cmd = { 0 };
936 	struct dpni_cmd_set_link_cfg *rsp_params;
937 	int err;
938 
939 	/* prepare command */
940 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_LINK_CFG,
941 					  cmd_flags,
942 					  token);
943 
944 	/* send command to mc*/
945 	err = mc_send_command(mc_io, &cmd);
946 	if (err)
947 		return err;
948 
949 	/* retrieve response parameters */
950 	rsp_params = (struct dpni_cmd_set_link_cfg *)cmd.params;
951 	cfg->advertising	= le64_to_cpu(rsp_params->advertising);
952 	cfg->options		= le64_to_cpu(rsp_params->options);
953 	cfg->rate		= le32_to_cpu(rsp_params->rate);
954 
955 	return err;
956 }
957 
958 /**
959  * dpni_get_link_state() - Return the link state (either up or down)
960  * @mc_io:	Pointer to MC portal's I/O object
961  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
962  * @token:	Token of DPNI object
963  * @state:	Returned link state;
964  *
965  * Return:	'0' on Success; Error code otherwise.
966  */
967 int dpni_get_link_state(struct fsl_mc_io *mc_io,
968 			uint32_t cmd_flags,
969 			uint16_t token,
970 			struct dpni_link_state *state)
971 {
972 	struct mc_command cmd = { 0 };
973 	struct dpni_rsp_get_link_state *rsp_params;
974 	int err;
975 
976 	/* prepare command */
977 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_LINK_STATE,
978 					  cmd_flags,
979 					  token);
980 
981 	/* send command to mc*/
982 	err = mc_send_command(mc_io, &cmd);
983 	if (err)
984 		return err;
985 
986 	/* retrieve response parameters */
987 	rsp_params = (struct dpni_rsp_get_link_state *)cmd.params;
988 	state->up = dpni_get_field(rsp_params->flags, LINK_STATE);
989 	state->state_valid = dpni_get_field(rsp_params->flags, STATE_VALID);
990 	state->rate = le32_to_cpu(rsp_params->rate);
991 	state->options = le64_to_cpu(rsp_params->options);
992 	state->supported = le64_to_cpu(rsp_params->supported);
993 	state->advertising = le64_to_cpu(rsp_params->advertising);
994 
995 	return 0;
996 }
997 
998 /**
999  * dpni_set_tx_shaping() - Set the transmit shaping
1000  * @mc_io:		Pointer to MC portal's I/O object
1001  * @cmd_flags:		Command flags; one or more of 'MC_CMD_FLAG_'
1002  * @token:		Token of DPNI object
1003  * @tx_cr_shaper:	TX committed rate shaping configuration
1004  * @tx_er_shaper:	TX excess rate shaping configuration
1005  * @param:		Special parameters
1006  *			bit0: Committed and excess rates are coupled
1007  *			bit1: 1 modify LNI shaper, 0 modify channel shaper
1008  *			bit8-15: Tx channel to be shaped. Used only if bit1 is set to zero
1009  *			bits16-26: OAL (Overhead accounting length 11bit value). Used only
1010  *			when bit1 is set.
1011  *
1012  * Return:	'0' on Success; Error code otherwise.
1013  */
1014 int dpni_set_tx_shaping(struct fsl_mc_io *mc_io,
1015 			uint32_t cmd_flags,
1016 			uint16_t token,
1017 			const struct dpni_tx_shaping_cfg *tx_cr_shaper,
1018 			const struct dpni_tx_shaping_cfg *tx_er_shaper,
1019 			uint32_t param)
1020 {
1021 	struct dpni_cmd_set_tx_shaping *cmd_params;
1022 	struct mc_command cmd = { 0 };
1023 	int coupled, lni_shaper;
1024 	uint8_t channel_id;
1025 	uint16_t oal;
1026 
1027 	/* prepare command */
1028 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_TX_SHAPING,
1029 					  cmd_flags,
1030 					  token);
1031 	cmd_params = (struct dpni_cmd_set_tx_shaping *)cmd.params;
1032 	cmd_params->tx_cr_max_burst_size =
1033 		cpu_to_le16(tx_cr_shaper->max_burst_size);
1034 	cmd_params->tx_er_max_burst_size =
1035 		cpu_to_le16(tx_er_shaper->max_burst_size);
1036 	cmd_params->tx_cr_rate_limit =
1037 		cpu_to_le32(tx_cr_shaper->rate_limit);
1038 	cmd_params->tx_er_rate_limit =
1039 		cpu_to_le32(tx_er_shaper->rate_limit);
1040 
1041 	coupled = !!(param & 0x01);
1042 	dpni_set_field(cmd_params->options, COUPLED, coupled);
1043 
1044 	lni_shaper = !!((param >> 1) & 0x01);
1045 	dpni_set_field(cmd_params->options, LNI_SHAPER, lni_shaper);
1046 
1047 	channel_id = (param >> 8) & 0xff;
1048 	cmd_params->channel_id = channel_id;
1049 
1050 	oal = (param >> 16) & 0x7FF;
1051 	cmd_params->oal = cpu_to_le16(oal);
1052 
1053 	/* send command to mc*/
1054 	return mc_send_command(mc_io, &cmd);
1055 }
1056 
1057 /**
1058  * dpni_set_max_frame_length() - Set the maximum received frame length.
1059  * @mc_io:		Pointer to MC portal's I/O object
1060  * @cmd_flags:		Command flags; one or more of 'MC_CMD_FLAG_'
1061  * @token:		Token of DPNI object
1062  * @max_frame_length:	Maximum received frame length (in bytes);
1063  *			frame is discarded if its length exceeds this value
1064  *
1065  * Return:	'0' on Success; Error code otherwise.
1066  */
1067 int dpni_set_max_frame_length(struct fsl_mc_io *mc_io,
1068 			      uint32_t cmd_flags,
1069 			      uint16_t token,
1070 			      uint16_t max_frame_length)
1071 {
1072 	struct mc_command cmd = { 0 };
1073 	struct dpni_cmd_set_max_frame_length *cmd_params;
1074 
1075 	/* prepare command */
1076 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_MAX_FRAME_LENGTH,
1077 					  cmd_flags,
1078 					  token);
1079 	cmd_params = (struct dpni_cmd_set_max_frame_length *)cmd.params;
1080 	cmd_params->max_frame_length = cpu_to_le16(max_frame_length);
1081 
1082 	/* send command to mc*/
1083 	return mc_send_command(mc_io, &cmd);
1084 }
1085 
1086 /**
1087  * dpni_get_max_frame_length() - Get the maximum received frame length.
1088  * @mc_io:		Pointer to MC portal's I/O object
1089  * @cmd_flags:		Command flags; one or more of 'MC_CMD_FLAG_'
1090  * @token:		Token of DPNI object
1091  * @max_frame_length:	Maximum received frame length (in bytes);
1092  *			frame is discarded if its length exceeds this value
1093  *
1094  * Return:	'0' on Success; Error code otherwise.
1095  */
1096 int dpni_get_max_frame_length(struct fsl_mc_io *mc_io,
1097 			      uint32_t cmd_flags,
1098 			      uint16_t token,
1099 			      uint16_t *max_frame_length)
1100 {
1101 	struct mc_command cmd = { 0 };
1102 	struct dpni_rsp_get_max_frame_length *rsp_params;
1103 	int err;
1104 
1105 	/* prepare command */
1106 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_MAX_FRAME_LENGTH,
1107 					  cmd_flags,
1108 					  token);
1109 
1110 	/* send command to mc*/
1111 	err = mc_send_command(mc_io, &cmd);
1112 	if (err)
1113 		return err;
1114 
1115 	/* retrieve response parameters */
1116 	rsp_params = (struct dpni_rsp_get_max_frame_length *)cmd.params;
1117 	*max_frame_length = le16_to_cpu(rsp_params->max_frame_length);
1118 
1119 	return 0;
1120 }
1121 
1122 /**
1123  * dpni_set_multicast_promisc() - Enable/disable multicast promiscuous mode
1124  * @mc_io:	Pointer to MC portal's I/O object
1125  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1126  * @token:	Token of DPNI object
1127  * @en:		Set to '1' to enable; '0' to disable
1128  *
1129  * Return:	'0' on Success; Error code otherwise.
1130  */
1131 int dpni_set_multicast_promisc(struct fsl_mc_io *mc_io,
1132 			       uint32_t cmd_flags,
1133 			       uint16_t token,
1134 			       int en)
1135 {
1136 	struct mc_command cmd = { 0 };
1137 	struct dpni_cmd_set_multicast_promisc *cmd_params;
1138 
1139 	/* prepare command */
1140 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_MCAST_PROMISC,
1141 					  cmd_flags,
1142 					  token);
1143 	cmd_params = (struct dpni_cmd_set_multicast_promisc *)cmd.params;
1144 	dpni_set_field(cmd_params->enable, ENABLE, en);
1145 
1146 	/* send command to mc*/
1147 	return mc_send_command(mc_io, &cmd);
1148 }
1149 
1150 /**
1151  * dpni_get_multicast_promisc() - Get multicast promiscuous mode
1152  * @mc_io:	Pointer to MC portal's I/O object
1153  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1154  * @token:	Token of DPNI object
1155  * @en:		Returns '1' if enabled; '0' otherwise
1156  *
1157  * Return:	'0' on Success; Error code otherwise.
1158  */
1159 int dpni_get_multicast_promisc(struct fsl_mc_io *mc_io,
1160 			       uint32_t cmd_flags,
1161 			       uint16_t token,
1162 			       int *en)
1163 {
1164 	struct mc_command cmd = { 0 };
1165 	struct dpni_rsp_get_multicast_promisc *rsp_params;
1166 	int err;
1167 
1168 	/* prepare command */
1169 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_MCAST_PROMISC,
1170 					  cmd_flags,
1171 					  token);
1172 
1173 	/* send command to mc*/
1174 	err = mc_send_command(mc_io, &cmd);
1175 	if (err)
1176 		return err;
1177 
1178 	/* retrieve response parameters */
1179 	rsp_params = (struct dpni_rsp_get_multicast_promisc *)cmd.params;
1180 	*en = dpni_get_field(rsp_params->enabled, ENABLE);
1181 
1182 	return 0;
1183 }
1184 
1185 /**
1186  * dpni_set_unicast_promisc() - Enable/disable unicast promiscuous mode
1187  * @mc_io:	Pointer to MC portal's I/O object
1188  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1189  * @token:	Token of DPNI object
1190  * @en:		Set to '1' to enable; '0' to disable
1191  *
1192  * Return:	'0' on Success; Error code otherwise.
1193  */
1194 int dpni_set_unicast_promisc(struct fsl_mc_io *mc_io,
1195 			     uint32_t cmd_flags,
1196 			     uint16_t token,
1197 			     int en)
1198 {
1199 	struct mc_command cmd = { 0 };
1200 	struct dpni_cmd_set_unicast_promisc *cmd_params;
1201 
1202 	/* prepare command */
1203 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_UNICAST_PROMISC,
1204 					  cmd_flags,
1205 					  token);
1206 	cmd_params = (struct dpni_cmd_set_unicast_promisc *)cmd.params;
1207 	dpni_set_field(cmd_params->enable, ENABLE, en);
1208 
1209 	/* send command to mc*/
1210 	return mc_send_command(mc_io, &cmd);
1211 }
1212 
1213 /**
1214  * dpni_get_unicast_promisc() - Get unicast promiscuous mode
1215  * @mc_io:	Pointer to MC portal's I/O object
1216  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1217  * @token:	Token of DPNI object
1218  * @en:		Returns '1' if enabled; '0' otherwise
1219  *
1220  * Return:	'0' on Success; Error code otherwise.
1221  */
1222 int dpni_get_unicast_promisc(struct fsl_mc_io *mc_io,
1223 			     uint32_t cmd_flags,
1224 			     uint16_t token,
1225 			     int *en)
1226 {
1227 	struct mc_command cmd = { 0 };
1228 	struct dpni_rsp_get_unicast_promisc *rsp_params;
1229 	int err;
1230 
1231 	/* prepare command */
1232 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_UNICAST_PROMISC,
1233 					  cmd_flags,
1234 					  token);
1235 
1236 	/* send command to mc*/
1237 	err = mc_send_command(mc_io, &cmd);
1238 	if (err)
1239 		return err;
1240 
1241 	/* retrieve response parameters */
1242 	rsp_params = (struct dpni_rsp_get_unicast_promisc *)cmd.params;
1243 	*en = dpni_get_field(rsp_params->enabled, ENABLE);
1244 
1245 	return 0;
1246 }
1247 
1248 /**
1249  * dpni_set_primary_mac_addr() - Set the primary MAC address
1250  * @mc_io:	Pointer to MC portal's I/O object
1251  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1252  * @token:	Token of DPNI object
1253  * @mac_addr:	MAC address to set as primary address
1254  *
1255  * Return:	'0' on Success; Error code otherwise.
1256  */
1257 int dpni_set_primary_mac_addr(struct fsl_mc_io *mc_io,
1258 			      uint32_t cmd_flags,
1259 			      uint16_t token,
1260 			      const uint8_t mac_addr[6])
1261 {
1262 	struct mc_command cmd = { 0 };
1263 	struct dpni_cmd_set_primary_mac_addr *cmd_params;
1264 	int i;
1265 
1266 	/* prepare command */
1267 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_PRIM_MAC,
1268 					  cmd_flags,
1269 					  token);
1270 	cmd_params = (struct dpni_cmd_set_primary_mac_addr *)cmd.params;
1271 	for (i = 0; i < 6; i++)
1272 		cmd_params->mac_addr[i] = mac_addr[5 - i];
1273 
1274 	/* send command to mc*/
1275 	return mc_send_command(mc_io, &cmd);
1276 }
1277 
1278 /**
1279  * dpni_get_primary_mac_addr() - Get the primary MAC address
1280  * @mc_io:	Pointer to MC portal's I/O object
1281  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1282  * @token:	Token of DPNI object
1283  * @mac_addr:	Returned MAC address
1284  *
1285  * Return:	'0' on Success; Error code otherwise.
1286  */
1287 int dpni_get_primary_mac_addr(struct fsl_mc_io *mc_io,
1288 			      uint32_t cmd_flags,
1289 			      uint16_t token,
1290 			      uint8_t mac_addr[6])
1291 {
1292 	struct mc_command cmd = { 0 };
1293 	struct dpni_rsp_get_primary_mac_addr *rsp_params;
1294 	int i, err;
1295 
1296 	/* prepare command */
1297 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_PRIM_MAC,
1298 					  cmd_flags,
1299 					  token);
1300 
1301 	/* send command to mc*/
1302 	err = mc_send_command(mc_io, &cmd);
1303 	if (err)
1304 		return err;
1305 
1306 	/* retrieve response parameters */
1307 	rsp_params = (struct dpni_rsp_get_primary_mac_addr *)cmd.params;
1308 	for (i = 0; i < 6; i++)
1309 		mac_addr[5 - i] = rsp_params->mac_addr[i];
1310 
1311 	return 0;
1312 }
1313 
1314 /**
1315  * dpni_add_mac_addr() - Add MAC address filter
1316  * @mc_io:	Pointer to MC portal's I/O object
1317  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1318  * @token:	Token of DPNI object
1319  * @mac_addr:	MAC address to add
1320  * @flags :	0 - tc_id and flow_id will be ignored.
1321  *		  Pkt with this mac_id will be passed to the next
1322  *		  classification stages
1323  *		DPNI_MAC_SET_QUEUE_ACTION
1324  *		  Pkt with this mac will be forward directly to
1325  *		  queue defined by the tc_id and flow_id
1326  * @tc_id : Traffic class selection (0-7)
1327  * @flow_id : Selects the specific queue out of the set allocated for the
1328  *            same as tc_id. Value must be in range 0 to NUM_QUEUES - 1
1329  * Return:	'0' on Success; Error code otherwise.
1330  */
1331 int dpni_add_mac_addr(struct fsl_mc_io *mc_io,
1332 		      uint32_t cmd_flags,
1333 		      uint16_t token,
1334 		      const uint8_t mac_addr[6],
1335 			  uint8_t flags,
1336 			  uint8_t tc_id,
1337 			  uint8_t flow_id)
1338 {
1339 	struct mc_command cmd = { 0 };
1340 	struct dpni_cmd_add_mac_addr *cmd_params;
1341 	int i;
1342 
1343 	/* prepare command */
1344 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_ADD_MAC_ADDR,
1345 					  cmd_flags,
1346 					  token);
1347 	cmd_params = (struct dpni_cmd_add_mac_addr *)cmd.params;
1348 	cmd_params->flags = flags;
1349 	cmd_params->tc_id = tc_id;
1350 	cmd_params->fq_id = flow_id;
1351 
1352 	for (i = 0; i < 6; i++)
1353 		cmd_params->mac_addr[i] = mac_addr[5 - i];
1354 
1355 	/* send command to mc*/
1356 	return mc_send_command(mc_io, &cmd);
1357 }
1358 
1359 /**
1360  * dpni_remove_mac_addr() - Remove MAC address filter
1361  * @mc_io:	Pointer to MC portal's I/O object
1362  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1363  * @token:	Token of DPNI object
1364  * @mac_addr:	MAC address to remove
1365  *
1366  * Return:	'0' on Success; Error code otherwise.
1367  */
1368 int dpni_remove_mac_addr(struct fsl_mc_io *mc_io,
1369 			 uint32_t cmd_flags,
1370 			 uint16_t token,
1371 			 const uint8_t mac_addr[6])
1372 {
1373 	struct mc_command cmd = { 0 };
1374 	struct dpni_cmd_remove_mac_addr *cmd_params;
1375 	int i;
1376 
1377 	/* prepare command */
1378 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_REMOVE_MAC_ADDR,
1379 					  cmd_flags,
1380 					  token);
1381 	cmd_params = (struct dpni_cmd_remove_mac_addr *)cmd.params;
1382 	for (i = 0; i < 6; i++)
1383 		cmd_params->mac_addr[i] = mac_addr[5 - i];
1384 
1385 	/* send command to mc*/
1386 	return mc_send_command(mc_io, &cmd);
1387 }
1388 
1389 /**
1390  * dpni_clear_mac_filters() - Clear all unicast and/or multicast MAC filters
1391  * @mc_io:	Pointer to MC portal's I/O object
1392  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1393  * @token:	Token of DPNI object
1394  * @unicast:	Set to '1' to clear unicast addresses
1395  * @multicast:	Set to '1' to clear multicast addresses
1396  *
1397  * The primary MAC address is not cleared by this operation.
1398  *
1399  * Return:	'0' on Success; Error code otherwise.
1400  */
1401 int dpni_clear_mac_filters(struct fsl_mc_io *mc_io,
1402 			   uint32_t cmd_flags,
1403 			   uint16_t token,
1404 			   int unicast,
1405 			   int multicast)
1406 {
1407 	struct mc_command cmd = { 0 };
1408 	struct dpni_cmd_clear_mac_filters *cmd_params;
1409 
1410 	/* prepare command */
1411 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_CLR_MAC_FILTERS,
1412 					  cmd_flags,
1413 					  token);
1414 	cmd_params = (struct dpni_cmd_clear_mac_filters *)cmd.params;
1415 	dpni_set_field(cmd_params->flags, UNICAST_FILTERS, unicast);
1416 	dpni_set_field(cmd_params->flags, MULTICAST_FILTERS, multicast);
1417 
1418 	/* send command to mc*/
1419 	return mc_send_command(mc_io, &cmd);
1420 }
1421 
1422 /**
1423  * dpni_get_port_mac_addr() - Retrieve MAC address associated to the physical
1424  *			port the DPNI is attached to
1425  * @mc_io:	Pointer to MC portal's I/O object
1426  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1427  * @token:	Token of DPNI object
1428  * @mac_addr:	MAC address of the physical port, if any, otherwise 0
1429  *
1430  * The primary MAC address is not cleared by this operation.
1431  *
1432  * Return:	'0' on Success; Error code otherwise.
1433  */
1434 int dpni_get_port_mac_addr(struct fsl_mc_io *mc_io,
1435 			   uint32_t cmd_flags,
1436 			   uint16_t token,
1437 			   uint8_t mac_addr[6])
1438 {
1439 	struct mc_command cmd = { 0 };
1440 	struct dpni_rsp_get_port_mac_addr *rsp_params;
1441 	int i, err;
1442 
1443 	/* prepare command */
1444 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_PORT_MAC_ADDR,
1445 					  cmd_flags,
1446 					  token);
1447 
1448 	/* send command to mc*/
1449 	err = mc_send_command(mc_io, &cmd);
1450 	if (err)
1451 		return err;
1452 
1453 	/* retrieve response parameters */
1454 	rsp_params = (struct dpni_rsp_get_port_mac_addr *)cmd.params;
1455 	for (i = 0; i < 6; i++)
1456 		mac_addr[5 - i] = rsp_params->mac_addr[i];
1457 
1458 	return 0;
1459 }
1460 
1461 /**
1462  * dpni_enable_vlan_filter() - Enable/disable VLAN filtering mode
1463  * @mc_io:	Pointer to MC portal's I/O object
1464  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1465  * @token:	Token of DPNI object
1466  * @en:		Set to '1' to enable; '0' to disable
1467  *
1468  * Return:	'0' on Success; Error code otherwise.
1469  */
1470 int dpni_enable_vlan_filter(struct fsl_mc_io *mc_io,
1471 			    uint32_t cmd_flags,
1472 			    uint16_t token,
1473 			    int en)
1474 {
1475 	struct dpni_cmd_enable_vlan_filter *cmd_params;
1476 	struct mc_command cmd = { 0 };
1477 
1478 	/* prepare command */
1479 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_ENABLE_VLAN_FILTER,
1480 					  cmd_flags,
1481 					  token);
1482 	cmd_params = (struct dpni_cmd_enable_vlan_filter *)cmd.params;
1483 	dpni_set_field(cmd_params->en, ENABLE, en);
1484 
1485 	/* send command to mc*/
1486 	return mc_send_command(mc_io, &cmd);
1487 }
1488 
1489 /**
1490  * dpni_add_vlan_id() - Add VLAN ID filter
1491  * @mc_io:	Pointer to MC portal's I/O object
1492  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1493  * @token:	Token of DPNI object
1494  * @vlan_id:	VLAN ID to add
1495  * @flags:	0 - tc_id and flow_id will be ignored.
1496  *		  Pkt with this vlan_id will be passed to the next
1497  *		  classification stages
1498  *		DPNI_VLAN_SET_QUEUE_ACTION
1499  *		  Pkt with this vlan_id will be forward directly to
1500  *		  queue defined by the tc_id and flow_id
1501  *
1502  * @tc_id: Traffic class selection (0-7)
1503  * @flow_id: Selects the specific queue out of the set allocated for the
1504  *           same as tc_id. Value must be in range 0 to NUM_QUEUES - 1
1505  *
1506  * Return:	'0' on Success; Error code otherwise.
1507  */
1508 int dpni_add_vlan_id(struct fsl_mc_io *mc_io,
1509 		     uint32_t cmd_flags,
1510 		     uint16_t token,
1511 		     uint16_t vlan_id,
1512 			 uint8_t flags,
1513 			 uint8_t tc_id,
1514 			 uint8_t flow_id)
1515 {
1516 	struct dpni_cmd_vlan_id *cmd_params;
1517 	struct mc_command cmd = { 0 };
1518 
1519 	/* prepare command */
1520 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_ADD_VLAN_ID,
1521 					  cmd_flags,
1522 					  token);
1523 	cmd_params = (struct dpni_cmd_vlan_id *)cmd.params;
1524 	cmd_params->flags = flags;
1525 	cmd_params->tc_id = tc_id;
1526 	cmd_params->flow_id =  flow_id;
1527 	cmd_params->vlan_id = cpu_to_le16(vlan_id);
1528 
1529 	/* send command to mc*/
1530 	return mc_send_command(mc_io, &cmd);
1531 }
1532 
1533 /**
1534  * dpni_remove_vlan_id() - Remove VLAN ID filter
1535  * @mc_io:	Pointer to MC portal's I/O object
1536  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1537  * @token:	Token of DPNI object
1538  * @vlan_id:	VLAN ID to remove
1539  *
1540  * Return:	'0' on Success; Error code otherwise.
1541  */
1542 int dpni_remove_vlan_id(struct fsl_mc_io *mc_io,
1543 			uint32_t cmd_flags,
1544 			uint16_t token,
1545 			uint16_t vlan_id)
1546 {
1547 	struct dpni_cmd_vlan_id *cmd_params;
1548 	struct mc_command cmd = { 0 };
1549 
1550 	/* prepare command */
1551 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_REMOVE_VLAN_ID,
1552 					  cmd_flags,
1553 					  token);
1554 	cmd_params = (struct dpni_cmd_vlan_id *)cmd.params;
1555 	cmd_params->vlan_id = cpu_to_le16(vlan_id);
1556 
1557 	/* send command to mc*/
1558 	return mc_send_command(mc_io, &cmd);
1559 }
1560 
1561 /**
1562  * dpni_clear_vlan_filters() - Clear all VLAN filters
1563  * @mc_io:	Pointer to MC portal's I/O object
1564  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1565  * @token:	Token of DPNI object
1566  *
1567  * Return:	'0' on Success; Error code otherwise.
1568  */
1569 int dpni_clear_vlan_filters(struct fsl_mc_io *mc_io,
1570 			    uint32_t cmd_flags,
1571 			    uint16_t token)
1572 {
1573 	struct mc_command cmd = { 0 };
1574 
1575 	/* prepare command */
1576 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_CLR_VLAN_FILTERS,
1577 					  cmd_flags,
1578 					  token);
1579 
1580 	/* send command to mc*/
1581 	return mc_send_command(mc_io, &cmd);
1582 }
1583 
1584 /**
1585  * dpni_set_tx_priorities() - Set transmission TC priority configuration
1586  * @mc_io:	Pointer to MC portal's I/O object
1587  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1588  * @token:	Token of DPNI object
1589  * @cfg:	Transmission selection configuration
1590  *
1591  * warning:	Allowed only when DPNI is disabled
1592  *
1593  * Return:	'0' on Success; Error code otherwise.
1594  */
1595 int dpni_set_tx_priorities(struct fsl_mc_io *mc_io,
1596 			   uint32_t cmd_flags,
1597 			   uint16_t token,
1598 			   const struct dpni_tx_priorities_cfg *cfg)
1599 {
1600 	struct dpni_cmd_set_tx_priorities *cmd_params;
1601 	struct mc_command cmd = { 0 };
1602 	int i;
1603 
1604 	/* prepare command */
1605 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_TX_PRIORITIES,
1606 					  cmd_flags,
1607 					  token);
1608 	cmd_params = (struct dpni_cmd_set_tx_priorities *)cmd.params;
1609 	cmd_params->channel_idx = cfg->channel_idx;
1610 	dpni_set_field(cmd_params->flags,
1611 				SEPARATE_GRP,
1612 				cfg->separate_groups);
1613 	cmd_params->prio_group_A = cfg->prio_group_A;
1614 	cmd_params->prio_group_B = cfg->prio_group_B;
1615 
1616 	for (i = 0; i + 1 < DPNI_MAX_TC; i = i + 2) {
1617 		dpni_set_field(cmd_params->modes[i / 2],
1618 			       MODE_1,
1619 			       cfg->tc_sched[i].mode);
1620 		dpni_set_field(cmd_params->modes[i / 2],
1621 				   MODE_2,
1622 				   cfg->tc_sched[i + 1].mode);
1623 	}
1624 
1625 	for (i = 0; i < DPNI_MAX_TC; i++) {
1626 		cmd_params->delta_bandwidth[i] =
1627 				cpu_to_le16(cfg->tc_sched[i].delta_bandwidth);
1628 	}
1629 
1630 	/* send command to mc*/
1631 	return mc_send_command(mc_io, &cmd);
1632 }
1633 
1634 /**
1635  * dpni_set_rx_tc_dist() - Set Rx traffic class distribution configuration
1636  * @mc_io:	Pointer to MC portal's I/O object
1637  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1638  * @token:	Token of DPNI object
1639  * @tc_id:	Traffic class selection (0-7)
1640  * @cfg:	Traffic class distribution configuration
1641  *
1642  * warning: if 'dist_mode != DPNI_DIST_MODE_NONE', call dpkg_prepare_key_cfg()
1643  *			first to prepare the key_cfg_iova parameter
1644  *
1645  * Return:	'0' on Success; error code otherwise.
1646  */
1647 int dpni_set_rx_tc_dist(struct fsl_mc_io *mc_io,
1648 			uint32_t cmd_flags,
1649 			uint16_t token,
1650 			uint8_t tc_id,
1651 			const struct dpni_rx_tc_dist_cfg *cfg)
1652 {
1653 	struct mc_command cmd = { 0 };
1654 	struct dpni_cmd_set_rx_tc_dist *cmd_params;
1655 
1656 	/* prepare command */
1657 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_RX_TC_DIST,
1658 					  cmd_flags,
1659 					  token);
1660 	cmd_params = (struct dpni_cmd_set_rx_tc_dist *)cmd.params;
1661 	cmd_params->dist_size = cpu_to_le16(cfg->dist_size);
1662 	cmd_params->tc_id = tc_id;
1663 	cmd_params->default_flow_id = cpu_to_le16(cfg->fs_cfg.default_flow_id);
1664 	cmd_params->key_cfg_iova = cpu_to_le64(cfg->key_cfg_iova);
1665 	dpni_set_field(cmd_params->flags,
1666 		       DIST_MODE,
1667 		       cfg->dist_mode);
1668 	dpni_set_field(cmd_params->flags,
1669 		       MISS_ACTION,
1670 		       cfg->fs_cfg.miss_action);
1671 	dpni_set_field(cmd_params->keep_hash_key,
1672 		       KEEP_HASH_KEY,
1673 		       cfg->fs_cfg.keep_hash_key);
1674 	dpni_set_field(cmd_params->keep_hash_key,
1675 		       KEEP_ENTRIES,
1676 		       cfg->fs_cfg.keep_entries);
1677 
1678 	/* send command to mc*/
1679 	return mc_send_command(mc_io, &cmd);
1680 }
1681 
1682 /**
1683  * dpni_set_tx_confirmation_mode() - Tx confirmation mode
1684  * @mc_io:	Pointer to MC portal's I/O object
1685  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1686  * @token:	Token of DPNI object
1687  * @mode:	Tx confirmation mode
1688  *
1689  * This function is useful only when 'DPNI_OPT_TX_CONF_DISABLED' is not
1690  * selected at DPNI creation.
1691  * Calling this function with 'mode' set to DPNI_CONF_DISABLE disables all
1692  * transmit confirmation (including the private confirmation queues), regardless
1693  * of previous settings; Note that in this case, Tx error frames are still
1694  * enqueued to the general transmit errors queue.
1695  * Calling this function with 'mode' set to DPNI_CONF_SINGLE switches all
1696  * Tx confirmations to a shared Tx conf queue. 'index' field in dpni_get_queue
1697  * command will be ignored.
1698  *
1699  * Return:	'0' on Success; Error code otherwise.
1700  */
1701 int dpni_set_tx_confirmation_mode(struct fsl_mc_io *mc_io,
1702 				  uint32_t cmd_flags,
1703 				  uint16_t token,
1704 				  enum dpni_confirmation_mode mode)
1705 {
1706 	struct dpni_tx_confirmation_mode *cmd_params;
1707 	struct mc_command cmd = { 0 };
1708 
1709 	/* prepare command */
1710 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_TX_CONFIRMATION_MODE,
1711 					  cmd_flags,
1712 					  token);
1713 	cmd_params = (struct dpni_tx_confirmation_mode *)cmd.params;
1714 	cmd_params->confirmation_mode = mode;
1715 
1716 	/* send command to mc*/
1717 	return mc_send_command(mc_io, &cmd);
1718 }
1719 
1720 /**
1721  * dpni_get_tx_confirmation_mode() - Get Tx confirmation mode
1722  * @mc_io:	Pointer to MC portal's I/O object
1723  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1724  * @token:	Token of DPNI object
1725  * @mode:	Tx confirmation mode
1726  *
1727  * Return:  '0' on Success; Error code otherwise.
1728  */
1729 int dpni_get_tx_confirmation_mode(struct fsl_mc_io *mc_io,
1730 				  uint32_t cmd_flags,
1731 				  uint16_t token,
1732 				  enum dpni_confirmation_mode *mode)
1733 {
1734 	struct dpni_tx_confirmation_mode *rsp_params;
1735 	struct mc_command cmd = { 0 };
1736 	int err;
1737 
1738 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_TX_CONFIRMATION_MODE,
1739 					cmd_flags,
1740 					token);
1741 
1742 	err = mc_send_command(mc_io, &cmd);
1743 	if (err)
1744 		return err;
1745 
1746 	rsp_params = (struct dpni_tx_confirmation_mode *)cmd.params;
1747 	*mode =  rsp_params->confirmation_mode;
1748 
1749 	return 0;
1750 }
1751 
1752 /**
1753  * dpni_set_qos_table() - Set QoS mapping table
1754  * @mc_io:	Pointer to MC portal's I/O object
1755  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1756  * @token:	Token of DPNI object
1757  * @cfg:	QoS table configuration
1758  *
1759  * This function and all QoS-related functions require that
1760  *'max_tcs > 1' was set at DPNI creation.
1761  *
1762  * warning: Before calling this function, call dpkg_prepare_key_cfg() to
1763  *			prepare the key_cfg_iova parameter
1764  *
1765  * Return:	'0' on Success; Error code otherwise.
1766  */
1767 int dpni_set_qos_table(struct fsl_mc_io *mc_io,
1768 		       uint32_t cmd_flags,
1769 		       uint16_t token,
1770 		       const struct dpni_qos_tbl_cfg *cfg)
1771 {
1772 	struct dpni_cmd_set_qos_table *cmd_params;
1773 	struct mc_command cmd = { 0 };
1774 
1775 	/* prepare command */
1776 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_QOS_TBL,
1777 					  cmd_flags,
1778 					  token);
1779 	cmd_params = (struct dpni_cmd_set_qos_table *)cmd.params;
1780 	cmd_params->default_tc = cfg->default_tc;
1781 	cmd_params->key_cfg_iova = cpu_to_le64(cfg->key_cfg_iova);
1782 	dpni_set_field(cmd_params->discard_on_miss,
1783 		       ENABLE,
1784 		       cfg->discard_on_miss);
1785 	dpni_set_field(cmd_params->discard_on_miss,
1786 					KEEP_QOS_ENTRIES,
1787 			       cfg->keep_entries);
1788 
1789 	/* send command to mc*/
1790 	return mc_send_command(mc_io, &cmd);
1791 }
1792 
1793 /**
1794  * dpni_add_qos_entry() - Add QoS mapping entry (to select a traffic class)
1795  * @mc_io:	Pointer to MC portal's I/O object
1796  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1797  * @token:	Token of DPNI object
1798  * @cfg:	QoS rule to add
1799  * @tc_id:	Traffic class selection (0-7)
1800  * @index:	Location in the QoS table where to insert the entry.
1801  *		Only relevant if MASKING is enabled for QoS classification on
1802  *		this DPNI, it is ignored for exact match.
1803  *
1804  * Return:	'0' on Success; Error code otherwise.
1805  */
1806 int dpni_add_qos_entry(struct fsl_mc_io *mc_io,
1807 		       uint32_t cmd_flags,
1808 		       uint16_t token,
1809 		       const struct dpni_rule_cfg *cfg,
1810 		       uint8_t tc_id,
1811 		       uint16_t index,
1812 			   uint8_t flags,
1813 			   uint8_t flow_id)
1814 {
1815 	struct dpni_cmd_add_qos_entry *cmd_params;
1816 	struct mc_command cmd = { 0 };
1817 
1818 	/* prepare command */
1819 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_ADD_QOS_ENT,
1820 					  cmd_flags,
1821 					  token);
1822 	cmd_params = (struct dpni_cmd_add_qos_entry *)cmd.params;
1823 	cmd_params->flags = flags;
1824 	cmd_params->flow_id = flow_id;
1825 	cmd_params->tc_id = tc_id;
1826 	cmd_params->key_size = cfg->key_size;
1827 	cmd_params->index = cpu_to_le16(index);
1828 	cmd_params->key_iova = cpu_to_le64(cfg->key_iova);
1829 	cmd_params->mask_iova = cpu_to_le64(cfg->mask_iova);
1830 
1831 	/* send command to mc*/
1832 	return mc_send_command(mc_io, &cmd);
1833 }
1834 
1835 /**
1836  * dpni_remove_qos_entry() - Remove QoS mapping entry
1837  * @mc_io:	Pointer to MC portal's I/O object
1838  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1839  * @token:	Token of DPNI object
1840  * @cfg:	QoS rule to remove
1841  *
1842  * Return:	'0' on Success; Error code otherwise.
1843  */
1844 int dpni_remove_qos_entry(struct fsl_mc_io *mc_io,
1845 			  uint32_t cmd_flags,
1846 			  uint16_t token,
1847 			  const struct dpni_rule_cfg *cfg)
1848 {
1849 	struct dpni_cmd_remove_qos_entry *cmd_params;
1850 	struct mc_command cmd = { 0 };
1851 
1852 	/* prepare command */
1853 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_REMOVE_QOS_ENT,
1854 					  cmd_flags,
1855 					  token);
1856 	cmd_params = (struct dpni_cmd_remove_qos_entry *)cmd.params;
1857 	cmd_params->key_size = cfg->key_size;
1858 	cmd_params->key_iova = cpu_to_le64(cfg->key_iova);
1859 	cmd_params->mask_iova = cpu_to_le64(cfg->mask_iova);
1860 
1861 	/* send command to mc*/
1862 	return mc_send_command(mc_io, &cmd);
1863 }
1864 
1865 /**
1866  * dpni_clear_qos_table() - Clear all QoS mapping entries
1867  * @mc_io:	Pointer to MC portal's I/O object
1868  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1869  * @token:	Token of DPNI object
1870  *
1871  * Following this function call, all frames are directed to
1872  * the default traffic class (0)
1873  *
1874  * Return:	'0' on Success; Error code otherwise.
1875  */
1876 int dpni_clear_qos_table(struct fsl_mc_io *mc_io,
1877 			 uint32_t cmd_flags,
1878 			 uint16_t token)
1879 {
1880 	struct mc_command cmd = { 0 };
1881 
1882 	/* prepare command */
1883 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_CLR_QOS_TBL,
1884 					  cmd_flags,
1885 					  token);
1886 
1887 	/* send command to mc*/
1888 	return mc_send_command(mc_io, &cmd);
1889 }
1890 
1891 /**
1892  * dpni_add_fs_entry() - Add Flow Steering entry for a specific traffic class
1893  *			(to select a flow ID)
1894  * @mc_io:	Pointer to MC portal's I/O object
1895  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1896  * @token:	Token of DPNI object
1897  * @tc_id:	Traffic class selection (0-7)
1898  * @index:	Location in the QoS table where to insert the entry.
1899  *		Only relevant if MASKING is enabled for QoS classification
1900  *		on this DPNI, it is ignored for exact match.
1901  * @cfg:	Flow steering rule to add
1902  * @action:	Action to be taken as result of a classification hit
1903  *
1904  * Return:	'0' on Success; Error code otherwise.
1905  */
1906 int dpni_add_fs_entry(struct fsl_mc_io *mc_io,
1907 		      uint32_t cmd_flags,
1908 		      uint16_t token,
1909 		      uint8_t tc_id,
1910 		      uint16_t index,
1911 		      const struct dpni_rule_cfg *cfg,
1912 		      const struct dpni_fs_action_cfg *action)
1913 {
1914 	struct dpni_cmd_add_fs_entry *cmd_params;
1915 	struct mc_command cmd = { 0 };
1916 
1917 	/* prepare command */
1918 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_ADD_FS_ENT,
1919 					  cmd_flags,
1920 					  token);
1921 	cmd_params = (struct dpni_cmd_add_fs_entry *)cmd.params;
1922 	cmd_params->tc_id = tc_id;
1923 	cmd_params->key_size = cfg->key_size;
1924 	cmd_params->index = cpu_to_le16(index);
1925 	cmd_params->key_iova = cpu_to_le64(cfg->key_iova);
1926 	cmd_params->mask_iova = cpu_to_le64(cfg->mask_iova);
1927 	cmd_params->options = cpu_to_le16(action->options);
1928 	cmd_params->flow_id = cpu_to_le16(action->flow_id);
1929 	cmd_params->flc = cpu_to_le64(action->flc);
1930 	cmd_params->redir_token = cpu_to_le16(action->redirect_obj_token);
1931 
1932 	/* send command to mc*/
1933 	return mc_send_command(mc_io, &cmd);
1934 }
1935 
1936 /**
1937  * dpni_remove_fs_entry() - Remove Flow Steering entry from a specific
1938  *			traffic class
1939  * @mc_io:	Pointer to MC portal's I/O object
1940  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1941  * @token:	Token of DPNI object
1942  * @tc_id:	Traffic class selection (0-7)
1943  * @cfg:	Flow steering rule to remove
1944  *
1945  * Return:	'0' on Success; Error code otherwise.
1946  */
1947 int dpni_remove_fs_entry(struct fsl_mc_io *mc_io,
1948 			 uint32_t cmd_flags,
1949 			 uint16_t token,
1950 			 uint8_t tc_id,
1951 			 const struct dpni_rule_cfg *cfg)
1952 {
1953 	struct dpni_cmd_remove_fs_entry *cmd_params;
1954 	struct mc_command cmd = { 0 };
1955 
1956 	/* prepare command */
1957 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_REMOVE_FS_ENT,
1958 					  cmd_flags,
1959 					  token);
1960 	cmd_params = (struct dpni_cmd_remove_fs_entry *)cmd.params;
1961 	cmd_params->tc_id = tc_id;
1962 	cmd_params->key_size = cfg->key_size;
1963 	cmd_params->key_iova = cpu_to_le64(cfg->key_iova);
1964 	cmd_params->mask_iova = cpu_to_le64(cfg->mask_iova);
1965 
1966 	/* send command to mc*/
1967 	return mc_send_command(mc_io, &cmd);
1968 }
1969 
1970 /**
1971  * dpni_clear_fs_entries() - Clear all Flow Steering entries of a specific
1972  *			traffic class
1973  * @mc_io:	Pointer to MC portal's I/O object
1974  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1975  * @token:	Token of DPNI object
1976  * @tc_id:	Traffic class selection (0-7)
1977  *
1978  * Return:	'0' on Success; Error code otherwise.
1979  */
1980 int dpni_clear_fs_entries(struct fsl_mc_io *mc_io,
1981 			  uint32_t cmd_flags,
1982 			  uint16_t token,
1983 			  uint8_t tc_id)
1984 {
1985 	struct dpni_cmd_clear_fs_entries *cmd_params;
1986 	struct mc_command cmd = { 0 };
1987 
1988 	/* prepare command */
1989 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_CLR_FS_ENT,
1990 					  cmd_flags,
1991 					  token);
1992 	cmd_params = (struct dpni_cmd_clear_fs_entries *)cmd.params;
1993 	cmd_params->tc_id = tc_id;
1994 
1995 	/* send command to mc*/
1996 	return mc_send_command(mc_io, &cmd);
1997 }
1998 
1999 /**
2000  * dpni_set_rx_tc_policing() - Set Rx traffic class policing configuration
2001  * @mc_io:	Pointer to MC portal's I/O object
2002  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
2003  * @token:	Token of DPNI object
2004  * @tc_id:	Traffic class selection (0-7)
2005  * @cfg:	Traffic class policing configuration
2006  *
2007  * Return:	'0' on Success; error code otherwise.
2008  */
2009 int dpni_set_rx_tc_policing(struct fsl_mc_io *mc_io,
2010 			    uint32_t cmd_flags,
2011 			    uint16_t token,
2012 			    uint8_t tc_id,
2013 			    const struct dpni_rx_tc_policing_cfg *cfg)
2014 {
2015 	struct dpni_cmd_set_rx_tc_policing *cmd_params;
2016 	struct mc_command cmd = { 0 };
2017 
2018 	/* prepare command */
2019 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_RX_TC_POLICING,
2020 					  cmd_flags,
2021 					  token);
2022 	cmd_params = (struct dpni_cmd_set_rx_tc_policing *)cmd.params;
2023 	dpni_set_field(cmd_params->mode_color, COLOR, cfg->default_color);
2024 	dpni_set_field(cmd_params->mode_color, MODE, cfg->mode);
2025 	dpni_set_field(cmd_params->units, UNITS, cfg->units);
2026 	cmd_params->options = cpu_to_le32(cfg->options);
2027 	cmd_params->cir = cpu_to_le32(cfg->cir);
2028 	cmd_params->cbs = cpu_to_le32(cfg->cbs);
2029 	cmd_params->eir = cpu_to_le32(cfg->eir);
2030 	cmd_params->ebs = cpu_to_le32(cfg->ebs);
2031 	cmd_params->tc_id = tc_id;
2032 
2033 	/* send command to mc*/
2034 	return mc_send_command(mc_io, &cmd);
2035 }
2036 
2037 /**
2038  * dpni_get_rx_tc_policing() - Get Rx traffic class policing configuration
2039  * @mc_io:	Pointer to MC portal's I/O object
2040  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
2041  * @token:	Token of DPNI object
2042  * @tc_id:	Traffic class selection (0-7)
2043  * @cfg:	Traffic class policing configuration
2044  *
2045  * Return:	'0' on Success; error code otherwise.
2046  */
2047 int dpni_get_rx_tc_policing(struct fsl_mc_io *mc_io,
2048 			    uint32_t cmd_flags,
2049 			    uint16_t token,
2050 			    uint8_t tc_id,
2051 			    struct dpni_rx_tc_policing_cfg *cfg)
2052 {
2053 	struct dpni_rsp_get_rx_tc_policing *rsp_params;
2054 	struct dpni_cmd_get_rx_tc_policing *cmd_params;
2055 	struct mc_command cmd = { 0 };
2056 	int err;
2057 
2058 	/* prepare command */
2059 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_RX_TC_POLICING,
2060 					  cmd_flags,
2061 					  token);
2062 	cmd_params = (struct dpni_cmd_get_rx_tc_policing *)cmd.params;
2063 	cmd_params->tc_id = tc_id;
2064 
2065 
2066 	/* send command to mc*/
2067 	err =  mc_send_command(mc_io, &cmd);
2068 	if (err)
2069 		return err;
2070 
2071 	rsp_params =  (struct dpni_rsp_get_rx_tc_policing *)cmd.params;
2072 	cfg->options = le32_to_cpu(rsp_params->options);
2073 	cfg->cir = le32_to_cpu(rsp_params->cir);
2074 	cfg->cbs = le32_to_cpu(rsp_params->cbs);
2075 	cfg->eir = le32_to_cpu(rsp_params->eir);
2076 	cfg->ebs = le32_to_cpu(rsp_params->ebs);
2077 	cfg->units = dpni_get_field(rsp_params->units, UNITS);
2078 	cfg->mode = dpni_get_field(rsp_params->mode_color, MODE);
2079 	cfg->default_color = dpni_get_field(rsp_params->mode_color, COLOR);
2080 
2081 	return 0;
2082 }
2083 
2084 /**
2085  * dpni_prepare_early_drop() - prepare an early drop.
2086  * @cfg:		Early-drop configuration
2087  * @early_drop_buf:	Zeroed 256 bytes of memory before mapping it to DMA
2088  *
2089  * This function has to be called before dpni_set_rx_tc_early_drop or
2090  * dpni_set_tx_tc_early_drop
2091  *
2092  */
2093 void dpni_prepare_early_drop(const struct dpni_early_drop_cfg *cfg,
2094 			     uint8_t *early_drop_buf)
2095 {
2096 	struct dpni_early_drop *ext_params;
2097 
2098 	ext_params = (struct dpni_early_drop *)early_drop_buf;
2099 
2100 	dpni_set_field(ext_params->flags, DROP_ENABLE, cfg->enable);
2101 	dpni_set_field(ext_params->flags, DROP_UNITS, cfg->units);
2102 	ext_params->green_drop_probability = cfg->green.drop_probability;
2103 	ext_params->green_max_threshold = cpu_to_le64(cfg->green.max_threshold);
2104 	ext_params->green_min_threshold = cpu_to_le64(cfg->green.min_threshold);
2105 	ext_params->yellow_drop_probability = cfg->yellow.drop_probability;
2106 	ext_params->yellow_max_threshold =
2107 		cpu_to_le64(cfg->yellow.max_threshold);
2108 	ext_params->yellow_min_threshold =
2109 		cpu_to_le64(cfg->yellow.min_threshold);
2110 	ext_params->red_drop_probability = cfg->red.drop_probability;
2111 	ext_params->red_max_threshold = cpu_to_le64(cfg->red.max_threshold);
2112 	ext_params->red_min_threshold = cpu_to_le64(cfg->red.min_threshold);
2113 }
2114 
2115 /**
2116  * dpni_extract_early_drop() - extract the early drop configuration.
2117  * @cfg:		Early-drop configuration
2118  * @early_drop_buf:	Zeroed 256 bytes of memory before mapping it to DMA
2119  *
2120  * This function has to be called after dpni_get_rx_tc_early_drop or
2121  * dpni_get_tx_tc_early_drop
2122  *
2123  */
2124 void dpni_extract_early_drop(struct dpni_early_drop_cfg *cfg,
2125 			     const uint8_t *early_drop_buf)
2126 {
2127 	const struct dpni_early_drop *ext_params;
2128 
2129 	ext_params = (const struct dpni_early_drop *)early_drop_buf;
2130 
2131 	cfg->enable = dpni_get_field(ext_params->flags, DROP_ENABLE);
2132 	cfg->units = dpni_get_field(ext_params->flags, DROP_UNITS);
2133 	cfg->green.drop_probability = ext_params->green_drop_probability;
2134 	cfg->green.max_threshold = le64_to_cpu(ext_params->green_max_threshold);
2135 	cfg->green.min_threshold = le64_to_cpu(ext_params->green_min_threshold);
2136 	cfg->yellow.drop_probability = ext_params->yellow_drop_probability;
2137 	cfg->yellow.max_threshold =
2138 		le64_to_cpu(ext_params->yellow_max_threshold);
2139 	cfg->yellow.min_threshold =
2140 		le64_to_cpu(ext_params->yellow_min_threshold);
2141 	cfg->red.drop_probability = ext_params->red_drop_probability;
2142 	cfg->red.max_threshold = le64_to_cpu(ext_params->red_max_threshold);
2143 	cfg->red.min_threshold = le64_to_cpu(ext_params->red_min_threshold);
2144 }
2145 
2146 /**
2147  * dpni_set_early_drop() - Set traffic class early-drop configuration
2148  * @mc_io:	Pointer to MC portal's I/O object
2149  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
2150  * @token:	Token of DPNI object
2151  * @qtype:	Type of queue - only Rx and Tx types are supported
2152  * @param:	Traffic class and channel ID.
2153  *		MSB - channel id; used only for DPNI_QUEUE_TX and DPNI_QUEUE_TX_CONFIRM,
2154  *		ignored for the rest
2155  *		LSB - traffic class
2156  *		Use macro DPNI_BUILD_PARAM() to build correct value.
2157  *		If dpni uses a single channel (uses only channel zero) the parameter can receive
2158  *		traffic class directly.
2159  * @early_drop_iova:  I/O virtual address of 256 bytes DMA-able memory filled
2160  *	with the early-drop configuration by calling dpni_prepare_early_drop()
2161  *
2162  * warning: Before calling this function, call dpni_prepare_early_drop() to
2163  *			prepare the early_drop_iova parameter
2164  *
2165  * Return:	'0' on Success; error code otherwise.
2166  */
2167 int dpni_set_early_drop(struct fsl_mc_io *mc_io,
2168 			uint32_t cmd_flags,
2169 			uint16_t token,
2170 			enum dpni_queue_type qtype,
2171 			uint16_t param,
2172 			uint64_t early_drop_iova)
2173 {
2174 	struct dpni_cmd_early_drop *cmd_params;
2175 	struct mc_command cmd = { 0 };
2176 
2177 	/* prepare command */
2178 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_EARLY_DROP,
2179 					  cmd_flags,
2180 					  token);
2181 	cmd_params = (struct dpni_cmd_early_drop *)cmd.params;
2182 	cmd_params->qtype = qtype;
2183 	cmd_params->tc = (uint8_t)(param & 0xff);
2184 	cmd_params->channel_id = (uint8_t)((param >> 8) & 0xff);
2185 	cmd_params->early_drop_iova = cpu_to_le64(early_drop_iova);
2186 
2187 	/* send command to mc*/
2188 	return mc_send_command(mc_io, &cmd);
2189 }
2190 
2191 /**
2192  * dpni_get_early_drop() - Get Rx traffic class early-drop configuration
2193  * @mc_io:	Pointer to MC portal's I/O object
2194  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
2195  * @token:	Token of DPNI object
2196  * @qtype:	Type of queue - only Rx and Tx types are supported
2197  * @param:	Traffic class and channel ID.
2198  *		MSB - channel id; used only for DPNI_QUEUE_TX and DPNI_QUEUE_TX_CONFIRM,
2199  *		ignored for the rest
2200  *		LSB - traffic class
2201  *		Use macro DPNI_BUILD_PARAM() to build correct value.
2202  *		If dpni uses a single channel (uses only channel zero) the parameter can receive
2203  *		traffic class directly.
2204  * @early_drop_iova:  I/O virtual address of 256 bytes DMA-able memory
2205  *
2206  * warning: After calling this function, call dpni_extract_early_drop() to
2207  *	get the early drop configuration
2208  *
2209  * Return:	'0' on Success; error code otherwise.
2210  */
2211 int dpni_get_early_drop(struct fsl_mc_io *mc_io,
2212 			uint32_t cmd_flags,
2213 			uint16_t token,
2214 			enum dpni_queue_type qtype,
2215 			uint16_t param,
2216 			uint64_t early_drop_iova)
2217 {
2218 	struct dpni_cmd_early_drop *cmd_params;
2219 	struct mc_command cmd = { 0 };
2220 
2221 	/* prepare command */
2222 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_EARLY_DROP,
2223 					  cmd_flags,
2224 					  token);
2225 	cmd_params = (struct dpni_cmd_early_drop *)cmd.params;
2226 	cmd_params->qtype = qtype;
2227 	cmd_params->tc = (uint8_t)(param & 0xff);
2228 	cmd_params->channel_id = (uint8_t)((param >> 8) & 0xff);
2229 	cmd_params->early_drop_iova = cpu_to_le64(early_drop_iova);
2230 
2231 	/* send command to mc*/
2232 	return mc_send_command(mc_io, &cmd);
2233 }
2234 
2235 /**
2236  * dpni_set_congestion_notification() - Set traffic class congestion
2237  *	notification configuration
2238  * @mc_io:	Pointer to MC portal's I/O object
2239  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
2240  * @token:	Token of DPNI object
2241  * @qtype:	Type of queue - Rx, Tx and Tx confirm types are supported
2242  * @param:	Traffic class and channel. Bits[0-7] contain traaffic class,
2243  *		bite[8-15] contains channel id
2244  * @cfg:	congestion notification configuration
2245  *
2246  * Return:	'0' on Success; error code otherwise.
2247  */
2248 int dpni_set_congestion_notification(struct fsl_mc_io *mc_io,
2249 				     uint32_t cmd_flags,
2250 				     uint16_t token,
2251 				     enum dpni_queue_type qtype,
2252 				     uint16_t param,
2253 				     const struct dpni_congestion_notification_cfg *cfg)
2254 {
2255 	struct dpni_cmd_set_congestion_notification *cmd_params;
2256 	struct mc_command cmd = { 0 };
2257 
2258 	/* prepare command */
2259 	cmd.header = mc_encode_cmd_header(
2260 					DPNI_CMDID_SET_CONGESTION_NOTIFICATION,
2261 					cmd_flags,
2262 					token);
2263 	cmd_params = (struct dpni_cmd_set_congestion_notification *)cmd.params;
2264 	cmd_params->qtype = qtype;
2265 	cmd_params->tc = (uint8_t)(param & 0xff);
2266 	cmd_params->channel_id = (uint8_t)((param >> 8) & 0xff);
2267 	cmd_params->congestion_point = cfg->cg_point;
2268 	cmd_params->cgid = (uint8_t)cfg->cgid;
2269 	cmd_params->dest_id = cpu_to_le32(cfg->dest_cfg.dest_id);
2270 	cmd_params->notification_mode = cpu_to_le16(cfg->notification_mode);
2271 	cmd_params->dest_priority = cfg->dest_cfg.priority;
2272 	cmd_params->message_iova = cpu_to_le64(cfg->message_iova);
2273 	cmd_params->message_ctx = cpu_to_le64(cfg->message_ctx);
2274 	cmd_params->threshold_entry = cpu_to_le32(cfg->threshold_entry);
2275 	cmd_params->threshold_exit = cpu_to_le32(cfg->threshold_exit);
2276 	dpni_set_field(cmd_params->type_units,
2277 		       DEST_TYPE,
2278 		       cfg->dest_cfg.dest_type);
2279 	dpni_set_field(cmd_params->type_units,
2280 		       CONG_UNITS,
2281 		       cfg->units);
2282 
2283 	/* send command to mc*/
2284 	return mc_send_command(mc_io, &cmd);
2285 }
2286 
2287 /**
2288  * dpni_get_congestion_notification() - Get traffic class congestion
2289  *	notification configuration
2290  * @mc_io:	Pointer to MC portal's I/O object
2291  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
2292  * @token:	Token of DPNI object
2293  * @qtype:	Type of queue - Rx, Tx and Tx confirm types are supported
2294  * @param:	Traffic class and channel. Bits[0-7] contain traaffic class,
2295  *		byte[8-15] contains channel id
2296  * @cfg:	congestion notification configuration
2297  *
2298  * Return:	'0' on Success; error code otherwise.
2299  */
2300 int dpni_get_congestion_notification(struct fsl_mc_io *mc_io,
2301 				     uint32_t cmd_flags,
2302 				     uint16_t token,
2303 				     enum dpni_queue_type qtype,
2304 				     uint16_t param,
2305 				     struct dpni_congestion_notification_cfg *cfg)
2306 {
2307 	struct dpni_rsp_get_congestion_notification *rsp_params;
2308 	struct dpni_cmd_get_congestion_notification *cmd_params;
2309 	struct mc_command cmd = { 0 };
2310 	int err;
2311 
2312 	/* prepare command */
2313 	cmd.header = mc_encode_cmd_header(
2314 					DPNI_CMDID_GET_CONGESTION_NOTIFICATION,
2315 					cmd_flags,
2316 					token);
2317 	cmd_params = (struct dpni_cmd_get_congestion_notification *)cmd.params;
2318 	cmd_params->qtype = qtype;
2319 	cmd_params->tc = (uint8_t)(param & 0xff);
2320 	cmd_params->channel_id = (uint8_t)((param >> 8) & 0xff);
2321 	cmd_params->congestion_point = cfg->cg_point;
2322 	cmd_params->cgid = cfg->cgid;
2323 
2324 	/* send command to mc*/
2325 	err = mc_send_command(mc_io, &cmd);
2326 	if (err)
2327 		return err;
2328 
2329 	rsp_params = (struct dpni_rsp_get_congestion_notification *)cmd.params;
2330 	cfg->units = dpni_get_field(rsp_params->type_units, CONG_UNITS);
2331 	cfg->threshold_entry = le32_to_cpu(rsp_params->threshold_entry);
2332 	cfg->threshold_exit = le32_to_cpu(rsp_params->threshold_exit);
2333 	cfg->message_ctx = le64_to_cpu(rsp_params->message_ctx);
2334 	cfg->message_iova = le64_to_cpu(rsp_params->message_iova);
2335 	cfg->notification_mode = le16_to_cpu(rsp_params->notification_mode);
2336 	cfg->dest_cfg.dest_id = le32_to_cpu(rsp_params->dest_id);
2337 	cfg->dest_cfg.priority = rsp_params->dest_priority;
2338 	cfg->dest_cfg.dest_type = dpni_get_field(rsp_params->type_units,
2339 						 DEST_TYPE);
2340 
2341 	return 0;
2342 }
2343 
2344 /**
2345  * dpni_get_api_version() - Get Data Path Network Interface API version
2346  * @mc_io:  Pointer to MC portal's I/O object
2347  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
2348  * @major_ver:	Major version of data path network interface API
2349  * @minor_ver:	Minor version of data path network interface API
2350  *
2351  * Return:  '0' on Success; Error code otherwise.
2352  */
2353 int dpni_get_api_version(struct fsl_mc_io *mc_io,
2354 			 uint32_t cmd_flags,
2355 			 uint16_t *major_ver,
2356 			 uint16_t *minor_ver)
2357 {
2358 	struct dpni_rsp_get_api_version *rsp_params;
2359 	struct mc_command cmd = { 0 };
2360 	int err;
2361 
2362 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_API_VERSION,
2363 					cmd_flags,
2364 					0);
2365 
2366 	err = mc_send_command(mc_io, &cmd);
2367 	if (err)
2368 		return err;
2369 
2370 	rsp_params = (struct dpni_rsp_get_api_version *)cmd.params;
2371 	*major_ver = le16_to_cpu(rsp_params->major);
2372 	*minor_ver = le16_to_cpu(rsp_params->minor);
2373 
2374 	return 0;
2375 }
2376 
2377 /**
2378  * dpni_set_queue() - Set queue parameters
2379  * @mc_io:	Pointer to MC portal's I/O object
2380  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
2381  * @token:	Token of DPNI object
2382  * @qtype:	Type of queue - all queue types are supported, although
2383  *		the command is ignored for Tx
2384  * @tc:		Traffic class, in range 0 to NUM_TCS - 1
2385  * @index:	Selects the specific queue out of the set allocated for the
2386  *		same TC. Value must be in range 0 to NUM_QUEUES - 1
2387  * @options:	A combination of DPNI_QUEUE_OPT_ values that control what
2388  *		configuration options are set on the queue
2389  * @queue:	Queue structure
2390  *
2391  * Return:	'0' on Success; Error code otherwise.
2392  */
2393 int dpni_set_queue(struct fsl_mc_io *mc_io,
2394 		   uint32_t cmd_flags,
2395 		   uint16_t token,
2396 		   enum dpni_queue_type qtype,
2397 		   uint16_t param,
2398 		   uint8_t index,
2399 		   uint8_t options,
2400 		   const struct dpni_queue *queue)
2401 {
2402 	struct mc_command cmd = { 0 };
2403 	struct dpni_cmd_set_queue *cmd_params;
2404 
2405 	/* prepare command */
2406 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_QUEUE,
2407 					  cmd_flags,
2408 					  token);
2409 	cmd_params = (struct dpni_cmd_set_queue *)cmd.params;
2410 	cmd_params->qtype = qtype;
2411 	cmd_params->tc = (uint8_t)(param & 0xff);
2412 	cmd_params->channel_id = (uint8_t)((param >> 8) & 0xff);
2413 	cmd_params->index = index;
2414 	cmd_params->options = options;
2415 	cmd_params->dest_id = cpu_to_le32(queue->destination.id);
2416 	cmd_params->dest_prio = queue->destination.priority;
2417 	dpni_set_field(cmd_params->flags, DEST_TYPE, queue->destination.type);
2418 	dpni_set_field(cmd_params->flags, STASH_CTRL, queue->flc.stash_control);
2419 	dpni_set_field(cmd_params->flags, HOLD_ACTIVE,
2420 		       queue->destination.hold_active);
2421 	cmd_params->flc = cpu_to_le64(queue->flc.value);
2422 	cmd_params->user_context = cpu_to_le64(queue->user_context);
2423 	cmd_params->cgid = queue->cgid;
2424 
2425 	/* send command to mc */
2426 	return mc_send_command(mc_io, &cmd);
2427 }
2428 
2429 /**
2430  * dpni_get_queue() - Get queue parameters
2431  * @mc_io:	Pointer to MC portal's I/O object
2432  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
2433  * @token:	Token of DPNI object
2434  * @qtype:	Type of queue - all queue types are supported
2435  * @param:	Traffic class and channel ID.
2436  *		MSB - channel id; used only for DPNI_QUEUE_TX and DPNI_QUEUE_TX_CONFIRM,
2437  *		ignored for the rest
2438  *		LSB - traffic class
2439  *		Use macro DPNI_BUILD_PARAM() to build correct value.
2440  *		If dpni uses a single channel (uses only channel zero) the parameter can receive
2441  *		traffic class directly.
2442  * @index:	Selects the specific queue out of the set allocated for the
2443  *		same TC. Value must be in range 0 to NUM_QUEUES - 1
2444  * @queue:	Queue configuration structure
2445  * @qid:	Queue identification
2446  *
2447  * Return:	'0' on Success; Error code otherwise.
2448  */
2449 int dpni_get_queue(struct fsl_mc_io *mc_io,
2450 		   uint32_t cmd_flags,
2451 		   uint16_t token,
2452 		   enum dpni_queue_type qtype,
2453 		   uint16_t param,
2454 		   uint8_t index,
2455 		   struct dpni_queue *queue,
2456 		   struct dpni_queue_id *qid)
2457 {
2458 	struct mc_command cmd = { 0 };
2459 	struct dpni_cmd_get_queue *cmd_params;
2460 	struct dpni_rsp_get_queue *rsp_params;
2461 	int err;
2462 
2463 	/* prepare command */
2464 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_QUEUE,
2465 					  cmd_flags,
2466 					  token);
2467 	cmd_params = (struct dpni_cmd_get_queue *)cmd.params;
2468 	cmd_params->qtype = qtype;
2469 	cmd_params->tc = (uint8_t)(param & 0xff);
2470 	cmd_params->index = index;
2471 	cmd_params->channel_id = (uint8_t)((param >> 8) & 0xff);
2472 
2473 	/* send command to mc */
2474 	err = mc_send_command(mc_io, &cmd);
2475 	if (err)
2476 		return err;
2477 
2478 	/* retrieve response parameters */
2479 	rsp_params = (struct dpni_rsp_get_queue *)cmd.params;
2480 	queue->destination.id = le32_to_cpu(rsp_params->dest_id);
2481 	queue->destination.priority = rsp_params->dest_prio;
2482 	queue->destination.type = dpni_get_field(rsp_params->flags,
2483 						     DEST_TYPE);
2484 	queue->flc.stash_control = dpni_get_field(rsp_params->flags,
2485 						  STASH_CTRL);
2486 	queue->destination.hold_active = dpni_get_field(rsp_params->flags,
2487 							HOLD_ACTIVE);
2488 	queue->flc.value = le64_to_cpu(rsp_params->flc);
2489 	queue->user_context = le64_to_cpu(rsp_params->user_context);
2490 	qid->fqid = le32_to_cpu(rsp_params->fqid);
2491 	qid->qdbin = le16_to_cpu(rsp_params->qdbin);
2492 	if (dpni_get_field(rsp_params->flags, CGID_VALID))
2493 		queue->cgid = rsp_params->cgid;
2494 	else
2495 		queue->cgid = -1;
2496 
2497 	return 0;
2498 }
2499 
2500 /**
2501  * dpni_get_statistics() - Get DPNI statistics
2502  * @mc_io:	Pointer to MC portal's I/O object
2503  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
2504  * @token:	Token of DPNI object
2505  * @page:	Selects the statistics page to retrieve, see
2506  *		DPNI_GET_STATISTICS output. Pages are numbered 0 to 6.
2507  * @param:  Custom parameter for some pages used to select
2508  *		 a certain statistic source, for example the TC.
2509  *		 - page_0: not used
2510  *		 - page_1: not used
2511  *		 - page_2: not used
2512  *		 - page_3: high_byte - channel_id, low_byte - traffic class
2513  *		 - page_4: high_byte - queue_index have meaning only if dpni is
2514  *		 created using option DPNI_OPT_CUSTOM_CG, low_byte - traffic class
2515  *		 - page_5: not used
2516  *		 - page_6: not used
2517  * @stat:	Structure containing the statistics
2518  *
2519  * Return:	'0' on Success; Error code otherwise.
2520  */
2521 int dpni_get_statistics(struct fsl_mc_io *mc_io,
2522 			uint32_t cmd_flags,
2523 			uint16_t token,
2524 			uint8_t page,
2525 			uint16_t param,
2526 			union dpni_statistics *stat)
2527 {
2528 	struct mc_command cmd = { 0 };
2529 	struct dpni_cmd_get_statistics *cmd_params;
2530 	struct dpni_rsp_get_statistics *rsp_params;
2531 	int i, err;
2532 
2533 	/* prepare command */
2534 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_STATISTICS,
2535 					  cmd_flags,
2536 					  token);
2537 	cmd_params = (struct dpni_cmd_get_statistics *)cmd.params;
2538 	cmd_params->page_number = page;
2539 	cmd_params->param = param;
2540 
2541 	/* send command to mc */
2542 	err = mc_send_command(mc_io, &cmd);
2543 	if (err)
2544 		return err;
2545 
2546 	/* retrieve response parameters */
2547 	rsp_params = (struct dpni_rsp_get_statistics *)cmd.params;
2548 	for (i = 0; i < DPNI_STATISTICS_CNT; i++)
2549 		stat->raw.counter[i] = le64_to_cpu(rsp_params->counter[i]);
2550 
2551 	return 0;
2552 }
2553 
2554 /**
2555  * dpni_reset_statistics() - Clears DPNI statistics
2556  * @mc_io:		Pointer to MC portal's I/O object
2557  * @cmd_flags:		Command flags; one or more of 'MC_CMD_FLAG_'
2558  * @token:		Token of DPNI object
2559  *
2560  * Return:  '0' on Success; Error code otherwise.
2561  */
2562 int dpni_reset_statistics(struct fsl_mc_io *mc_io,
2563 			  uint32_t cmd_flags,
2564 		     uint16_t token)
2565 {
2566 	struct mc_command cmd = { 0 };
2567 
2568 	/* prepare command */
2569 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_RESET_STATISTICS,
2570 					  cmd_flags,
2571 					  token);
2572 
2573 	/* send command to mc*/
2574 	return mc_send_command(mc_io, &cmd);
2575 }
2576 
2577 /**
2578  * dpni_set_taildrop() - Set taildrop per congestion group
2579  *
2580  * Setting a per-TC taildrop (cg_point = DPNI_CP_GROUP) will reset any current
2581  * congestion notification or early drop (WRED) configuration previously applied
2582  * to the same TC.
2583  *
2584  * @mc_io:	Pointer to MC portal's I/O object
2585  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
2586  * @token:	Token of DPNI object
2587  * @cg_point:	Congestion group identifier DPNI_CP_QUEUE is only supported in
2588  *		combination with DPNI_QUEUE_RX.
2589  * @q_type:	Queue type, can be DPNI_QUEUE_RX or DPNI_QUEUE_TX.
2590  * @tc:		Traffic class to apply this taildrop to
2591  * @index/cgid:	Index of the queue if the DPNI supports multiple queues for
2592  *		traffic distribution.
2593  *		If CONGESTION_POINT is DPNI_CP_CONGESTION_GROUP then it
2594  *		represent the cgid of the congestion point
2595  * @taildrop:	Taildrop structure
2596  *
2597  * Return:	'0' on Success; Error code otherwise.
2598  */
2599 int dpni_set_taildrop(struct fsl_mc_io *mc_io,
2600 		      uint32_t cmd_flags,
2601 		      uint16_t token,
2602 		      enum dpni_congestion_point cg_point,
2603 		      enum dpni_queue_type qtype,
2604 		      uint16_t param,
2605 		      uint8_t index,
2606 		      struct dpni_taildrop *taildrop)
2607 {
2608 	struct mc_command cmd = { 0 };
2609 	struct dpni_cmd_set_taildrop *cmd_params;
2610 
2611 	/* prepare command */
2612 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_TAILDROP,
2613 					  cmd_flags,
2614 					  token);
2615 	cmd_params = (struct dpni_cmd_set_taildrop *)cmd.params;
2616 	cmd_params->congestion_point = cg_point;
2617 	cmd_params->qtype = qtype;
2618 	cmd_params->tc = (uint8_t)(param & 0xff);
2619 	cmd_params->channel_id = (uint8_t)((param >> 8) & 0xff);
2620 	cmd_params->index = index;
2621 	cmd_params->units = taildrop->units;
2622 	cmd_params->threshold = cpu_to_le32(taildrop->threshold);
2623 	dpni_set_field(cmd_params->enable_oal_lo, ENABLE, taildrop->enable);
2624 	dpni_set_field(cmd_params->enable_oal_lo, OAL_LO, taildrop->oal);
2625 	dpni_set_field(cmd_params->oal_hi,
2626 		       OAL_HI,
2627 		       taildrop->oal >> DPNI_OAL_LO_SIZE);
2628 
2629 	/* send command to mc */
2630 	return mc_send_command(mc_io, &cmd);
2631 }
2632 
2633 /**
2634  * dpni_get_taildrop() - Get taildrop information
2635  * @mc_io:	Pointer to MC portal's I/O object
2636  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
2637  * @token:	Token of DPNI object
2638  * @cg_point:	Congestion point
2639  * @q_type:	Queue type on which the taildrop is configured.
2640  *		Only Rx queues are supported for now
2641  * @tc:		Traffic class to apply this taildrop to
2642  * @q_index:	Index of the queue if the DPNI supports multiple queues for
2643  *		traffic distribution. Ignored if CONGESTION_POINT is not 0.
2644  * @taildrop:	Taildrop structure
2645  *
2646  * Return:	'0' on Success; Error code otherwise.
2647  */
2648 int dpni_get_taildrop(struct fsl_mc_io *mc_io,
2649 		      uint32_t cmd_flags,
2650 		      uint16_t token,
2651 		      enum dpni_congestion_point cg_point,
2652 		      enum dpni_queue_type qtype,
2653 		      uint8_t tc,
2654 		      uint8_t index,
2655 		      struct dpni_taildrop *taildrop)
2656 {
2657 	struct mc_command cmd = { 0 };
2658 	struct dpni_cmd_get_taildrop *cmd_params;
2659 	struct dpni_rsp_get_taildrop *rsp_params;
2660 	uint8_t oal_lo, oal_hi;
2661 	int err;
2662 
2663 	/* prepare command */
2664 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_TAILDROP,
2665 					  cmd_flags,
2666 					  token);
2667 	cmd_params = (struct dpni_cmd_get_taildrop *)cmd.params;
2668 	cmd_params->congestion_point = cg_point;
2669 	cmd_params->qtype = qtype;
2670 	cmd_params->tc = tc;
2671 	cmd_params->index = index;
2672 
2673 	/* send command to mc */
2674 	err = mc_send_command(mc_io, &cmd);
2675 	if (err)
2676 		return err;
2677 
2678 	/* retrieve response parameters */
2679 	rsp_params = (struct dpni_rsp_get_taildrop *)cmd.params;
2680 	taildrop->enable = dpni_get_field(rsp_params->enable_oal_lo, ENABLE);
2681 	taildrop->units = rsp_params->units;
2682 	taildrop->threshold = le32_to_cpu(rsp_params->threshold);
2683 	oal_lo = dpni_get_field(rsp_params->enable_oal_lo, OAL_LO);
2684 	oal_hi = dpni_get_field(rsp_params->oal_hi, OAL_HI);
2685 	taildrop->oal = oal_hi << DPNI_OAL_LO_SIZE | oal_lo;
2686 
2687 	/* Fill the first 4 bits, 'oal' is a 2's complement value of 12 bits */
2688 	if (taildrop->oal >= 0x0800)
2689 		taildrop->oal |= 0xF000;
2690 
2691 	return 0;
2692 }
2693 
2694 /**
2695  * dpni_set_opr() - Set Order Restoration configuration.
2696  * @mc_io:	Pointer to MC portal's I/O object
2697  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
2698  * @token:	Token of DPNI object
2699  * @tc:		Traffic class, in range 0 to NUM_TCS - 1
2700  * @index:	Selects the specific queue out of the set allocated
2701  *			for the same TC. Value must be in range 0 to
2702  *			NUM_QUEUES - 1
2703  * @options:	Configuration mode options
2704  *			can be OPR_OPT_CREATE or OPR_OPT_RETIRE
2705  * @cfg:	Configuration options for the OPR
2706  *
2707  * Return:	'0' on Success; Error code otherwise.
2708  */
2709 int dpni_set_opr(struct fsl_mc_io *mc_io,
2710 		 uint32_t cmd_flags,
2711 		 uint16_t token,
2712 		 uint8_t tc,
2713 		 uint8_t index,
2714 		 uint8_t options,
2715 		 struct opr_cfg *cfg,
2716 		 uint8_t opr_id)
2717 {
2718 	struct dpni_cmd_set_opr *cmd_params;
2719 	struct mc_command cmd = { 0 };
2720 
2721 	/* prepare command */
2722 	cmd.header = mc_encode_cmd_header(
2723 			DPNI_CMDID_SET_OPR,
2724 			cmd_flags,
2725 			token);
2726 	cmd_params = (struct dpni_cmd_set_opr *)cmd.params;
2727 	cmd_params->tc_id = tc;
2728 	cmd_params->index = index;
2729 	cmd_params->options = options;
2730 	cmd_params->opr_id = opr_id;
2731 	cmd_params->oloe = cfg->oloe;
2732 	cmd_params->oeane = cfg->oeane;
2733 	cmd_params->olws = cfg->olws;
2734 	cmd_params->oa = cfg->oa;
2735 	cmd_params->oprrws = cfg->oprrws;
2736 
2737 	/* send command to mc*/
2738 	return mc_send_command(mc_io, &cmd);
2739 }
2740 
2741 /**
2742  * dpni_get_opr() - Retrieve Order Restoration config and query.
2743  * @mc_io:	Pointer to MC portal's I/O object
2744  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
2745  * @token:	Token of DPNI object
2746  * @tc:		Traffic class, in range 0 to NUM_TCS - 1
2747  * @index:	Selects the specific queue out of the set allocated
2748  *			for the same TC. Value must be in range 0 to
2749  *			NUM_QUEUES - 1
2750  * @cfg:	Returned OPR configuration
2751  * @qry:	Returned OPR query
2752  *
2753  * Return:	'0' on Success; Error code otherwise.
2754  */
2755 int dpni_get_opr(struct fsl_mc_io *mc_io,
2756 		 uint32_t cmd_flags,
2757 		 uint16_t token,
2758 		 uint8_t tc,
2759 		 uint8_t index,
2760 		 struct opr_cfg *cfg,
2761 		 struct opr_qry *qry,
2762 		 uint8_t flags,
2763 		 uint8_t opr_id)
2764 {
2765 	struct dpni_rsp_get_opr *rsp_params;
2766 	struct dpni_cmd_get_opr *cmd_params;
2767 	struct mc_command cmd = { 0 };
2768 	int err;
2769 
2770 	/* prepare command */
2771 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_OPR,
2772 					  cmd_flags,
2773 					  token);
2774 	cmd_params = (struct dpni_cmd_get_opr *)cmd.params;
2775 	cmd_params->index = index;
2776 	cmd_params->tc_id = tc;
2777 	cmd_params->flags = flags;
2778 	cmd_params->opr_id = opr_id;
2779 
2780 	/* send command to mc*/
2781 	err = mc_send_command(mc_io, &cmd);
2782 	if (err)
2783 		return err;
2784 
2785 	/* retrieve response parameters */
2786 	rsp_params = (struct dpni_rsp_get_opr *)cmd.params;
2787 	cfg->oloe = rsp_params->oloe;
2788 	cfg->oeane = rsp_params->oeane;
2789 	cfg->olws = rsp_params->olws;
2790 	cfg->oa = rsp_params->oa;
2791 	cfg->oprrws = rsp_params->oprrws;
2792 	qry->rip = dpni_get_field(rsp_params->flags, RIP);
2793 	qry->enable = dpni_get_field(rsp_params->flags, OPR_ENABLE);
2794 	qry->nesn = le16_to_cpu(rsp_params->nesn);
2795 	qry->ndsn = le16_to_cpu(rsp_params->ndsn);
2796 	qry->ea_tseq = le16_to_cpu(rsp_params->ea_tseq);
2797 	qry->tseq_nlis = dpni_get_field(rsp_params->tseq_nlis, TSEQ_NLIS);
2798 	qry->ea_hseq = le16_to_cpu(rsp_params->ea_hseq);
2799 	qry->hseq_nlis = dpni_get_field(rsp_params->hseq_nlis, HSEQ_NLIS);
2800 	qry->ea_hptr = le16_to_cpu(rsp_params->ea_hptr);
2801 	qry->ea_tptr = le16_to_cpu(rsp_params->ea_tptr);
2802 	qry->opr_vid = le16_to_cpu(rsp_params->opr_vid);
2803 	qry->opr_id = le16_to_cpu(rsp_params->opr_id);
2804 
2805 	return 0;
2806 }
2807 
2808 int dpni_load_sw_sequence(struct fsl_mc_io *mc_io,
2809 	      uint32_t cmd_flags,
2810 	      uint16_t token,
2811 		  struct dpni_load_ss_cfg *cfg)
2812 {
2813 	struct dpni_load_sw_sequence *cmd_params;
2814 	struct mc_command cmd = { 0 };
2815 
2816 	/* prepare command */
2817 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_LOAD_SW_SEQUENCE,
2818 					  cmd_flags,
2819 					  token);
2820 	cmd_params = (struct dpni_load_sw_sequence *)cmd.params;
2821 	cmd_params->dest = cfg->dest;
2822 	cmd_params->ss_offset = cpu_to_le16(cfg->ss_offset);
2823 	cmd_params->ss_size = cpu_to_le16(cfg->ss_size);
2824 	cmd_params->ss_iova = cpu_to_le64(cfg->ss_iova);
2825 
2826 	/* send command to mc*/
2827 	return mc_send_command(mc_io, &cmd);
2828 }
2829 
2830 int dpni_enable_sw_sequence(struct fsl_mc_io *mc_io,
2831 	      uint32_t cmd_flags,
2832 	      uint16_t token,
2833 		  struct dpni_enable_ss_cfg *cfg)
2834 {
2835 	struct dpni_enable_sw_sequence *cmd_params;
2836 	struct mc_command cmd = { 0 };
2837 
2838 	/* prepare command */
2839 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_ENABLE_SW_SEQUENCE,
2840 					  cmd_flags,
2841 					  token);
2842 	cmd_params = (struct dpni_enable_sw_sequence *)cmd.params;
2843 	cmd_params->dest = cfg->dest;
2844 	cmd_params->set_start = cfg->set_start;
2845 	cmd_params->hxs = cpu_to_le16(cfg->hxs);
2846 	cmd_params->ss_offset = cpu_to_le16(cfg->ss_offset);
2847 	cmd_params->param_offset = cfg->param_offset;
2848 	cmd_params->param_size = cfg->param_size;
2849 	cmd_params->param_iova = cpu_to_le64(cfg->param_iova);
2850 
2851 	/* send command to mc*/
2852 	return mc_send_command(mc_io, &cmd);
2853 }
2854 
2855 /**
2856  * dpni_get_sw_sequence_layout() - Get the soft sequence layout
2857  * @mc_io:	Pointer to MC portal's I/O object
2858  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
2859  * @token:	Token of DPNI object
2860  * @src:	Source of the layout (WRIOP Rx or Tx)
2861  * @ss_layout_iova:  I/O virtual address of 264 bytes DMA-able memory
2862  *
2863  * warning: After calling this function, call dpni_extract_sw_sequence_layout()
2864  *		to get the layout.
2865  *
2866  * Return:	'0' on Success; error code otherwise.
2867  */
2868 int dpni_get_sw_sequence_layout(struct fsl_mc_io *mc_io,
2869 	      uint32_t cmd_flags,
2870 	      uint16_t token,
2871 		  enum dpni_soft_sequence_dest src,
2872 		  uint64_t ss_layout_iova)
2873 {
2874 	struct dpni_get_sw_sequence_layout *cmd_params;
2875 	struct mc_command cmd = { 0 };
2876 
2877 	/* prepare command */
2878 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_SW_SEQUENCE_LAYOUT,
2879 					  cmd_flags,
2880 					  token);
2881 
2882 	cmd_params = (struct dpni_get_sw_sequence_layout *)cmd.params;
2883 	cmd_params->src = src;
2884 	cmd_params->layout_iova = cpu_to_le64(ss_layout_iova);
2885 
2886 	/* send command to mc*/
2887 	return mc_send_command(mc_io, &cmd);
2888 }
2889 
2890 /**
2891  * dpni_extract_sw_sequence_layout() - extract the software sequence layout
2892  * @layout:		software sequence layout
2893  * @sw_sequence_layout_buf:	Zeroed 264 bytes of memory before mapping it
2894  *				to DMA
2895  *
2896  * This function has to be called after dpni_get_sw_sequence_layout
2897  *
2898  */
2899 void dpni_extract_sw_sequence_layout(struct dpni_sw_sequence_layout *layout,
2900 			     const uint8_t *sw_sequence_layout_buf)
2901 {
2902 	const struct dpni_sw_sequence_layout_entry *ext_params;
2903 	int i;
2904 	uint16_t ss_size, ss_offset;
2905 
2906 	ext_params = (const struct dpni_sw_sequence_layout_entry *)
2907 						sw_sequence_layout_buf;
2908 
2909 	for (i = 0; i < DPNI_SW_SEQUENCE_LAYOUT_SIZE; i++) {
2910 		ss_offset = le16_to_cpu(ext_params[i].ss_offset);
2911 		ss_size = le16_to_cpu(ext_params[i].ss_size);
2912 
2913 		if (ss_offset == 0 && ss_size == 0) {
2914 			layout->num_ss = i;
2915 			return;
2916 		}
2917 
2918 		layout->ss[i].ss_offset = ss_offset;
2919 		layout->ss[i].ss_size = ss_size;
2920 		layout->ss[i].param_offset = ext_params[i].param_offset;
2921 		layout->ss[i].param_size = ext_params[i].param_size;
2922 	}
2923 }
2924 /**
2925  * dpni_set_rx_fs_dist() - Set Rx traffic class FS distribution
2926  * @mc_io:	Pointer to MC portal's I/O object
2927  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
2928  * @token:	Token of DPNI object
2929  * @cfg: Distribution configuration
2930  * If the FS is already enabled with a previous call the classification
2931  *		key will be changed but all the table rules are kept. If the
2932  *		existing rules do not match the key the results will not be
2933  *		predictable. It is the user responsibility to keep keyintegrity.
2934  * If cfg.enable is set to 1 the command will create a flow steering table
2935  *		and will classify packets according to this table. The packets
2936  *		that miss all the table rules will be classified according to
2937  *		settings made in dpni_set_rx_hash_dist()
2938  * If cfg.enable is set to 0 the command will clear flow steering table. The
2939  *		packets will be classified according to settings made in
2940  *		dpni_set_rx_hash_dist()
2941  */
2942 int dpni_set_rx_fs_dist(struct fsl_mc_io *mc_io, uint32_t cmd_flags,
2943 		uint16_t token, const struct dpni_rx_dist_cfg *cfg)
2944 {
2945 	struct dpni_cmd_set_rx_fs_dist *cmd_params;
2946 	struct mc_command cmd = { 0 };
2947 
2948 	/* prepare command */
2949 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_RX_FS_DIST,
2950 					  cmd_flags,
2951 					  token);
2952 	cmd_params = (struct dpni_cmd_set_rx_fs_dist *)cmd.params;
2953 	cmd_params->dist_size	= cpu_to_le16(cfg->dist_size);
2954 	dpni_set_field(cmd_params->enable, RX_FS_DIST_ENABLE, cfg->enable);
2955 	cmd_params->tc			= cfg->tc;
2956 	cmd_params->miss_flow_id = cpu_to_le16(cfg->fs_miss_flow_id);
2957 	cmd_params->key_cfg_iova = cpu_to_le64(cfg->key_cfg_iova);
2958 
2959 	/* send command to mc*/
2960 	return mc_send_command(mc_io, &cmd);
2961 }
2962 
2963 /**
2964  * dpni_set_rx_hash_dist() - Set Rx traffic class HASH distribution
2965  * @mc_io:	Pointer to MC portal's I/O object
2966  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
2967  * @token:	Token of DPNI object
2968  * @cfg: Distribution configuration
2969  * If cfg.enable is set to 1 the packets will be classified using a hash
2970  *	function based on the key received in cfg.key_cfg_iova parameter.
2971  * If cfg.enable is set to 0 the packets will be sent to the queue configured in
2972  *	dpni_set_rx_dist_default_queue() call
2973  */
2974 int dpni_set_rx_hash_dist(struct fsl_mc_io *mc_io, uint32_t cmd_flags,
2975 		uint16_t token, const struct dpni_rx_dist_cfg *cfg)
2976 {
2977 	struct dpni_cmd_set_rx_hash_dist *cmd_params;
2978 	struct mc_command cmd = { 0 };
2979 
2980 	/* prepare command */
2981 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_RX_HASH_DIST,
2982 					  cmd_flags,
2983 					  token);
2984 	cmd_params = (struct dpni_cmd_set_rx_hash_dist *)cmd.params;
2985 	cmd_params->dist_size	= cpu_to_le16(cfg->dist_size);
2986 	dpni_set_field(cmd_params->enable, RX_FS_DIST_ENABLE, cfg->enable);
2987 	cmd_params->tc_id		= cfg->tc;
2988 	cmd_params->key_cfg_iova = cpu_to_le64(cfg->key_cfg_iova);
2989 
2990 	/* send command to mc*/
2991 	return mc_send_command(mc_io, &cmd);
2992 }
2993 
2994 /**
2995  * dpni_add_custom_tpid() - Configures a distinct Ethertype value (or TPID
2996  *		value) to indicate VLAN tag in adition to the common TPID values
2997  *		0x81000 and 0x88A8
2998  * @mc_io:	Pointer to MC portal's I/O object
2999  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
3000  * @token:	Token of DPNI object
3001  * @tpid:	New value for TPID
3002  *
3003  * Only two custom values are accepted. If the function is called for the third
3004  * time it will return error.
3005  * To replace an existing value use dpni_remove_custom_tpid() to remove a
3006  * previous TPID and after that use again the function.
3007  *
3008  * Return:	'0' on Success; Error code otherwise.
3009  */
3010 int dpni_add_custom_tpid(struct fsl_mc_io *mc_io, uint32_t cmd_flags,
3011 		uint16_t token, uint16_t tpid)
3012 {
3013 	struct dpni_cmd_add_custom_tpid *cmd_params;
3014 	struct mc_command cmd = { 0 };
3015 
3016 	/* prepare command */
3017 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_ADD_CUSTOM_TPID,
3018 					  cmd_flags,
3019 					  token);
3020 	cmd_params = (struct dpni_cmd_add_custom_tpid *)cmd.params;
3021 	cmd_params->tpid = cpu_to_le16(tpid);
3022 
3023 	/* send command to mc*/
3024 	return mc_send_command(mc_io, &cmd);
3025 }
3026 
3027 /**
3028  * dpni_remove_custom_tpid() - Removes a distinct Ethertype value added
3029  * previously with dpni_add_custom_tpid()
3030  * @mc_io:	Pointer to MC portal's I/O object
3031  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
3032  * @token:	Token of DPNI object
3033  * @tpid:	New value for TPID
3034  *
3035  * Use this function when a TPID value added with dpni_add_custom_tpid() needs
3036  * to be replaced.
3037  *
3038  * Return:	'0' on Success; Error code otherwise.
3039  */
3040 int dpni_remove_custom_tpid(struct fsl_mc_io *mc_io, uint32_t cmd_flags,
3041 		uint16_t token, uint16_t tpid)
3042 {
3043 	struct dpni_cmd_remove_custom_tpid *cmd_params;
3044 	struct mc_command cmd = { 0 };
3045 
3046 	/* prepare command */
3047 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_REMOVE_CUSTOM_TPID,
3048 					  cmd_flags,
3049 					  token);
3050 	cmd_params = (struct dpni_cmd_remove_custom_tpid *)cmd.params;
3051 	cmd_params->tpid = cpu_to_le16(tpid);
3052 
3053 	/* send command to mc*/
3054 	return mc_send_command(mc_io, &cmd);
3055 }
3056 
3057 /**
3058  * dpni_get_custom_tpid() - Returns custom TPID (vlan tags) values configured to
3059  * detect 802.1q frames
3060  * @mc_io:	Pointer to MC portal's I/O object
3061  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
3062  * @token:	Token of DPNI object
3063  * @tpid:	TPID values. Only nonzero members of the structure are valid.
3064  *
3065  * Return:	'0' on Success; Error code otherwise.
3066  */
3067 int dpni_get_custom_tpid(struct fsl_mc_io *mc_io, uint32_t cmd_flags,
3068 		uint16_t token, struct dpni_custom_tpid_cfg *tpid)
3069 {
3070 	struct dpni_rsp_get_custom_tpid *rsp_params;
3071 	struct mc_command cmd = { 0 };
3072 	int err;
3073 
3074 	/* prepare command */
3075 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_CUSTOM_TPID,
3076 					  cmd_flags,
3077 					  token);
3078 
3079 	/* send command to mc*/
3080 	err = mc_send_command(mc_io, &cmd);
3081 	if (err)
3082 		return err;
3083 
3084 	/* read command response */
3085 	rsp_params = (struct dpni_rsp_get_custom_tpid *)cmd.params;
3086 	tpid->tpid1 = le16_to_cpu(rsp_params->tpid1);
3087 	tpid->tpid2 = le16_to_cpu(rsp_params->tpid2);
3088 
3089 	return err;
3090 }
3091 
3092 /**
3093  * dpni_set_port_cfg() - performs configurations at physical port connected on
3094  *		this dpni. The command have effect only if dpni is connected to
3095  *		another dpni object
3096  * @mc_io:	Pointer to MC portal's I/O object
3097  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
3098  * @token:	Token of DPNI object
3099  * @flags:	Valid fields from port_cfg structure
3100  * @port_cfg: Configuration data; one or more of DPNI_PORT_CFG_
3101  * The command can be called only when dpni is connected to a dpmac object. If
3102  * the dpni is unconnected or the endpoint is not a dpni it will return error.
3103  * If dpmac endpoint is disconnected the settings will be lost
3104  */
3105 int dpni_set_port_cfg(struct fsl_mc_io *mc_io, uint32_t cmd_flags,
3106 		uint16_t token, uint32_t flags, struct dpni_port_cfg *port_cfg)
3107 {
3108 	struct dpni_cmd_set_port_cfg *cmd_params;
3109 	struct mc_command cmd = { 0 };
3110 
3111 	/* prepare command */
3112 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_PORT_CFG,
3113 			cmd_flags, token);
3114 
3115 	cmd_params = (struct dpni_cmd_set_port_cfg *)cmd.params;
3116 	cmd_params->flags = cpu_to_le32(flags);
3117 	dpni_set_field(cmd_params->bit_params,	PORT_LOOPBACK_EN,
3118 			!!port_cfg->loopback_en);
3119 
3120 	/* send command to MC */
3121 	return mc_send_command(mc_io, &cmd);
3122 }
3123