xref: /dpdk/drivers/net/dpaa2/mc/dpni.c (revision 5ecb687a5698d2d8ec1f3b3b5a7a16bceca3e29c)
1 /* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0)
2  *
3  * Copyright 2013-2016 Freescale Semiconductor Inc.
4  * Copyright 2016 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 
130 	/* send command to mc*/
131 	err = mc_send_command(mc_io, &cmd);
132 	if (err)
133 		return err;
134 
135 	/* retrieve response parameters */
136 	*obj_id = mc_cmd_read_object_id(&cmd);
137 
138 	return 0;
139 }
140 
141 /**
142  * dpni_destroy() - Destroy the DPNI object and release all its resources.
143  * @mc_io:	Pointer to MC portal's I/O object
144  * @dprc_token: Parent container token; '0' for default container
145  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
146  * @object_id:	The object id; it must be a valid id within the container that
147  * created this object;
148  *
149  * The function accepts the authentication token of the parent container that
150  * created the object (not the one that currently owns the object). The object
151  * is searched within parent using the provided 'object_id'.
152  * All tokens to the object must be closed before calling destroy.
153  *
154  * Return:	'0' on Success; error code otherwise.
155  */
156 int dpni_destroy(struct fsl_mc_io *mc_io,
157 		 uint16_t dprc_token,
158 		 uint32_t cmd_flags,
159 		 uint32_t object_id)
160 {
161 	struct dpni_cmd_destroy *cmd_params;
162 	struct mc_command cmd = { 0 };
163 
164 	/* prepare command */
165 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_DESTROY,
166 					  cmd_flags,
167 					  dprc_token);
168 	/* set object id to destroy */
169 	cmd_params = (struct dpni_cmd_destroy *)cmd.params;
170 	cmd_params->dpsw_id = cpu_to_le32(object_id);
171 
172 	/* send command to mc*/
173 	return mc_send_command(mc_io, &cmd);
174 }
175 
176 /**
177  * dpni_set_pools() - Set buffer pools configuration
178  * @mc_io:	Pointer to MC portal's I/O object
179  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
180  * @token:	Token of DPNI object
181  * @cfg:	Buffer pools configuration
182  *
183  * mandatory for DPNI operation
184  * warning:Allowed only when DPNI is disabled
185  *
186  * Return:	'0' on Success; Error code otherwise.
187  */
188 int dpni_set_pools(struct fsl_mc_io *mc_io,
189 		   uint32_t cmd_flags,
190 		   uint16_t token,
191 		   const struct dpni_pools_cfg *cfg)
192 {
193 	struct mc_command cmd = { 0 };
194 	struct dpni_cmd_set_pools *cmd_params;
195 	int i;
196 
197 	/* prepare command */
198 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_POOLS,
199 					  cmd_flags,
200 					  token);
201 	cmd_params = (struct dpni_cmd_set_pools *)cmd.params;
202 	cmd_params->num_dpbp = cfg->num_dpbp;
203 	for (i = 0; i < cmd_params->num_dpbp; i++) {
204 		cmd_params->pool[i].dpbp_id =
205 			cpu_to_le16(cfg->pools[i].dpbp_id);
206 		cmd_params->pool[i].priority_mask =
207 			cfg->pools[i].priority_mask;
208 		cmd_params->buffer_size[i] =
209 			cpu_to_le16(cfg->pools[i].buffer_size);
210 		cmd_params->backup_pool_mask |=
211 			DPNI_BACKUP_POOL(cfg->pools[i].backup_pool, i);
212 	}
213 
214 	/* send command to mc*/
215 	return mc_send_command(mc_io, &cmd);
216 }
217 
218 /**
219  * dpni_enable() - Enable the DPNI, allow sending and receiving frames.
220  * @mc_io:	Pointer to MC portal's I/O object
221  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
222  * @token:	Token of DPNI object
223  *
224  * Return:	'0' on Success; Error code otherwise.
225  */
226 int dpni_enable(struct fsl_mc_io *mc_io,
227 		uint32_t cmd_flags,
228 		uint16_t token)
229 {
230 	struct mc_command cmd = { 0 };
231 
232 	/* prepare command */
233 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_ENABLE,
234 					  cmd_flags,
235 					  token);
236 
237 	/* send command to mc*/
238 	return mc_send_command(mc_io, &cmd);
239 }
240 
241 /**
242  * dpni_disable() - Disable the DPNI, stop sending and receiving frames.
243  * @mc_io:	Pointer to MC portal's I/O object
244  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
245  * @token:	Token of DPNI object
246  *
247  * Return:	'0' on Success; Error code otherwise.
248  */
249 int dpni_disable(struct fsl_mc_io *mc_io,
250 		 uint32_t cmd_flags,
251 		 uint16_t token)
252 {
253 	struct mc_command cmd = { 0 };
254 
255 	/* prepare command */
256 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_DISABLE,
257 					  cmd_flags,
258 					  token);
259 
260 	/* send command to mc*/
261 	return mc_send_command(mc_io, &cmd);
262 }
263 
264 /**
265  * dpni_is_enabled() - Check if the DPNI is enabled.
266  * @mc_io:	Pointer to MC portal's I/O object
267  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
268  * @token:	Token of DPNI object
269  * @en:		Returns '1' if object is enabled; '0' otherwise
270  *
271  * Return:	'0' on Success; Error code otherwise.
272  */
273 int dpni_is_enabled(struct fsl_mc_io *mc_io,
274 		    uint32_t cmd_flags,
275 		    uint16_t token,
276 		    int *en)
277 {
278 	struct mc_command cmd = { 0 };
279 	struct dpni_rsp_is_enabled *rsp_params;
280 	int err;
281 
282 	/* prepare command */
283 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_IS_ENABLED,
284 					  cmd_flags,
285 					  token);
286 
287 	/* send command to mc*/
288 	err = mc_send_command(mc_io, &cmd);
289 	if (err)
290 		return err;
291 
292 	/* retrieve response parameters */
293 	rsp_params = (struct dpni_rsp_is_enabled *)cmd.params;
294 	*en = dpni_get_field(rsp_params->enabled, ENABLE);
295 
296 	return 0;
297 }
298 
299 /**
300  * dpni_reset() - Reset the DPNI, returns the object to initial state.
301  * @mc_io:	Pointer to MC portal's I/O object
302  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
303  * @token:	Token of DPNI object
304  *
305  * Return:	'0' on Success; Error code otherwise.
306  */
307 int dpni_reset(struct fsl_mc_io *mc_io,
308 	       uint32_t cmd_flags,
309 	       uint16_t token)
310 {
311 	struct mc_command cmd = { 0 };
312 
313 	/* prepare command */
314 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_RESET,
315 					  cmd_flags,
316 					  token);
317 
318 	/* send command to mc*/
319 	return mc_send_command(mc_io, &cmd);
320 }
321 
322 /**
323  * dpni_set_irq_enable() - Set overall interrupt state.
324  * @mc_io:	Pointer to MC portal's I/O object
325  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
326  * @token:	Token of DPNI object
327  * @irq_index:	The interrupt index to configure
328  * @en:		Interrupt state: - enable = 1, disable = 0
329  *
330  * Allows GPP software to control when interrupts are generated.
331  * Each interrupt can have up to 32 causes.  The enable/disable control's the
332  * overall interrupt state. if the interrupt is disabled no causes will cause
333  * an interrupt.
334  *
335  * Return:	'0' on Success; Error code otherwise.
336  */
337 int dpni_set_irq_enable(struct fsl_mc_io *mc_io,
338 			uint32_t cmd_flags,
339 			uint16_t token,
340 			uint8_t irq_index,
341 			uint8_t en)
342 {
343 	struct mc_command cmd = { 0 };
344 	struct dpni_cmd_set_irq_enable *cmd_params;
345 
346 	/* prepare command */
347 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_IRQ_ENABLE,
348 					  cmd_flags,
349 					  token);
350 	cmd_params = (struct dpni_cmd_set_irq_enable *)cmd.params;
351 	dpni_set_field(cmd_params->enable, ENABLE, en);
352 	cmd_params->irq_index = irq_index;
353 
354 	/* send command to mc*/
355 	return mc_send_command(mc_io, &cmd);
356 }
357 
358 /**
359  * dpni_get_irq_enable() - Get overall interrupt state
360  * @mc_io:	Pointer to MC portal's I/O object
361  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
362  * @token:	Token of DPNI object
363  * @irq_index:	The interrupt index to configure
364  * @en:		Returned interrupt state - enable = 1, disable = 0
365  *
366  * Return:	'0' on Success; Error code otherwise.
367  */
368 int dpni_get_irq_enable(struct fsl_mc_io *mc_io,
369 			uint32_t cmd_flags,
370 			uint16_t token,
371 			uint8_t irq_index,
372 			uint8_t *en)
373 {
374 	struct mc_command cmd = { 0 };
375 	struct dpni_cmd_get_irq_enable *cmd_params;
376 	struct dpni_rsp_get_irq_enable *rsp_params;
377 
378 	int err;
379 
380 	/* prepare command */
381 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_IRQ_ENABLE,
382 					  cmd_flags,
383 					  token);
384 	cmd_params = (struct dpni_cmd_get_irq_enable *)cmd.params;
385 	cmd_params->irq_index = irq_index;
386 
387 	/* send command to mc*/
388 	err = mc_send_command(mc_io, &cmd);
389 	if (err)
390 		return err;
391 
392 	/* retrieve response parameters */
393 	rsp_params = (struct dpni_rsp_get_irq_enable *)cmd.params;
394 	*en = dpni_get_field(rsp_params->enabled, ENABLE);
395 
396 	return 0;
397 }
398 
399 /**
400  * dpni_set_irq_mask() - Set interrupt mask.
401  * @mc_io:	Pointer to MC portal's I/O object
402  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
403  * @token:	Token of DPNI object
404  * @irq_index:	The interrupt index to configure
405  * @mask:	Event mask to trigger interrupt;
406  *		each bit:
407  *			0 = ignore event
408  *			1 = consider event for asserting IRQ
409  *
410  * Every interrupt can have up to 32 causes and the interrupt model supports
411  * masking/unmasking each cause independently
412  *
413  * Return:	'0' on Success; Error code otherwise.
414  */
415 int dpni_set_irq_mask(struct fsl_mc_io *mc_io,
416 		      uint32_t cmd_flags,
417 		      uint16_t token,
418 		      uint8_t irq_index,
419 		      uint32_t mask)
420 {
421 	struct mc_command cmd = { 0 };
422 	struct dpni_cmd_set_irq_mask *cmd_params;
423 
424 	/* prepare command */
425 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_IRQ_MASK,
426 					  cmd_flags,
427 					  token);
428 	cmd_params = (struct dpni_cmd_set_irq_mask *)cmd.params;
429 	cmd_params->mask = cpu_to_le32(mask);
430 	cmd_params->irq_index = irq_index;
431 
432 	/* send command to mc*/
433 	return mc_send_command(mc_io, &cmd);
434 }
435 
436 /**
437  * dpni_get_irq_mask() - Get interrupt mask.
438  * @mc_io:	Pointer to MC portal's I/O object
439  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
440  * @token:	Token of DPNI object
441  * @irq_index:	The interrupt index to configure
442  * @mask:	Returned event mask to trigger interrupt
443  *
444  * Every interrupt can have up to 32 causes and the interrupt model supports
445  * masking/unmasking each cause independently
446  *
447  * Return:	'0' on Success; Error code otherwise.
448  */
449 int dpni_get_irq_mask(struct fsl_mc_io *mc_io,
450 		      uint32_t cmd_flags,
451 		      uint16_t token,
452 		      uint8_t irq_index,
453 		      uint32_t *mask)
454 {
455 	struct mc_command cmd = { 0 };
456 	struct dpni_cmd_get_irq_mask *cmd_params;
457 	struct dpni_rsp_get_irq_mask *rsp_params;
458 	int err;
459 
460 	/* prepare command */
461 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_IRQ_MASK,
462 					  cmd_flags,
463 					  token);
464 	cmd_params = (struct dpni_cmd_get_irq_mask *)cmd.params;
465 	cmd_params->irq_index = irq_index;
466 
467 	/* send command to mc*/
468 	err = mc_send_command(mc_io, &cmd);
469 	if (err)
470 		return err;
471 
472 	/* retrieve response parameters */
473 	rsp_params = (struct dpni_rsp_get_irq_mask *)cmd.params;
474 	*mask = le32_to_cpu(rsp_params->mask);
475 
476 	return 0;
477 }
478 
479 /**
480  * dpni_get_irq_status() - Get the current status of any pending interrupts.
481  * @mc_io:	Pointer to MC portal's I/O object
482  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
483  * @token:	Token of DPNI object
484  * @irq_index:	The interrupt index to configure
485  * @status:	Returned interrupts status - one bit per cause:
486  *			0 = no interrupt pending
487  *			1 = interrupt pending
488  *
489  * Return:	'0' on Success; Error code otherwise.
490  */
491 int dpni_get_irq_status(struct fsl_mc_io *mc_io,
492 			uint32_t cmd_flags,
493 			uint16_t token,
494 			uint8_t irq_index,
495 			uint32_t *status)
496 {
497 	struct mc_command cmd = { 0 };
498 	struct dpni_cmd_get_irq_status *cmd_params;
499 	struct dpni_rsp_get_irq_status *rsp_params;
500 	int err;
501 
502 	/* prepare command */
503 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_IRQ_STATUS,
504 					  cmd_flags,
505 					  token);
506 	cmd_params = (struct dpni_cmd_get_irq_status *)cmd.params;
507 	cmd_params->status = cpu_to_le32(*status);
508 	cmd_params->irq_index = irq_index;
509 
510 	/* send command to mc*/
511 	err = mc_send_command(mc_io, &cmd);
512 	if (err)
513 		return err;
514 
515 	/* retrieve response parameters */
516 	rsp_params = (struct dpni_rsp_get_irq_status *)cmd.params;
517 	*status = le32_to_cpu(rsp_params->status);
518 
519 	return 0;
520 }
521 
522 /**
523  * dpni_clear_irq_status() - Clear a pending interrupt's status
524  * @mc_io:	Pointer to MC portal's I/O object
525  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
526  * @token:	Token of DPNI object
527  * @irq_index:	The interrupt index to configure
528  * @status:	bits to clear (W1C) - one bit per cause:
529  *			0 = don't change
530  *			1 = clear status bit
531  *
532  * Return:	'0' on Success; Error code otherwise.
533  */
534 int dpni_clear_irq_status(struct fsl_mc_io *mc_io,
535 			  uint32_t cmd_flags,
536 			  uint16_t token,
537 			  uint8_t irq_index,
538 			  uint32_t status)
539 {
540 	struct mc_command cmd = { 0 };
541 	struct dpni_cmd_clear_irq_status *cmd_params;
542 
543 	/* prepare command */
544 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_CLEAR_IRQ_STATUS,
545 					  cmd_flags,
546 					  token);
547 	cmd_params = (struct dpni_cmd_clear_irq_status *)cmd.params;
548 	cmd_params->irq_index = irq_index;
549 	cmd_params->status = cpu_to_le32(status);
550 
551 	/* send command to mc*/
552 	return mc_send_command(mc_io, &cmd);
553 }
554 
555 /**
556  * dpni_get_attributes() - Retrieve DPNI attributes.
557  * @mc_io:	Pointer to MC portal's I/O object
558  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
559  * @token:	Token of DPNI object
560  * @attr:	Object's attributes
561  *
562  * Return:	'0' on Success; Error code otherwise.
563  */
564 int dpni_get_attributes(struct fsl_mc_io *mc_io,
565 			uint32_t cmd_flags,
566 			uint16_t token,
567 			struct dpni_attr *attr)
568 {
569 	struct mc_command cmd = { 0 };
570 	struct dpni_rsp_get_attr *rsp_params;
571 
572 	int err;
573 
574 	/* prepare command */
575 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_ATTR,
576 					  cmd_flags,
577 					  token);
578 
579 	/* send command to mc*/
580 	err = mc_send_command(mc_io, &cmd);
581 	if (err)
582 		return err;
583 
584 	/* retrieve response parameters */
585 	rsp_params = (struct dpni_rsp_get_attr *)cmd.params;
586 	attr->options = le32_to_cpu(rsp_params->options);
587 	attr->num_queues = rsp_params->num_queues;
588 	attr->num_rx_tcs = rsp_params->num_rx_tcs;
589 	attr->num_tx_tcs = rsp_params->num_tx_tcs;
590 	attr->mac_filter_entries = rsp_params->mac_filter_entries;
591 	attr->vlan_filter_entries = rsp_params->vlan_filter_entries;
592 	attr->qos_entries = rsp_params->qos_entries;
593 	attr->fs_entries = le16_to_cpu(rsp_params->fs_entries);
594 	attr->qos_key_size = rsp_params->qos_key_size;
595 	attr->fs_key_size = rsp_params->fs_key_size;
596 	attr->wriop_version = le16_to_cpu(rsp_params->wriop_version);
597 	attr->num_cgs = rsp_params->num_cgs;
598 
599 	return 0;
600 }
601 
602 /**
603  * dpni_set_errors_behavior() - Set errors behavior
604  * @mc_io:	Pointer to MC portal's I/O object
605  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
606  * @token:	Token of DPNI object
607  * @cfg:	Errors configuration
608  *
609  * This function may be called numerous times with different
610  * error masks
611  *
612  * Return:	'0' on Success; Error code otherwise.
613  */
614 int dpni_set_errors_behavior(struct fsl_mc_io *mc_io,
615 			     uint32_t cmd_flags,
616 			     uint16_t token,
617 			     struct dpni_error_cfg *cfg)
618 {
619 	struct mc_command cmd = { 0 };
620 	struct dpni_cmd_set_errors_behavior *cmd_params;
621 
622 	/* prepare command */
623 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_ERRORS_BEHAVIOR,
624 					  cmd_flags,
625 					  token);
626 	cmd_params = (struct dpni_cmd_set_errors_behavior *)cmd.params;
627 	cmd_params->errors = cpu_to_le32(cfg->errors);
628 	dpni_set_field(cmd_params->flags, ERROR_ACTION, cfg->error_action);
629 	dpni_set_field(cmd_params->flags, FRAME_ANN, cfg->set_frame_annotation);
630 
631 	/* send command to mc*/
632 	return mc_send_command(mc_io, &cmd);
633 }
634 
635 /**
636  * dpni_get_buffer_layout() - Retrieve buffer layout attributes.
637  * @mc_io:	Pointer to MC portal's I/O object
638  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
639  * @token:	Token of DPNI object
640  * @qtype:	Type of queue to retrieve configuration for
641  * @layout:	Returns buffer layout attributes
642  *
643  * Return:	'0' on Success; Error code otherwise.
644  */
645 int dpni_get_buffer_layout(struct fsl_mc_io *mc_io,
646 			   uint32_t cmd_flags,
647 			   uint16_t token,
648 			   enum dpni_queue_type qtype,
649 			   struct dpni_buffer_layout *layout)
650 {
651 	struct mc_command cmd = { 0 };
652 	struct dpni_cmd_get_buffer_layout *cmd_params;
653 	struct dpni_rsp_get_buffer_layout *rsp_params;
654 	int err;
655 
656 	/* prepare command */
657 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_BUFFER_LAYOUT,
658 					  cmd_flags,
659 					  token);
660 	cmd_params = (struct dpni_cmd_get_buffer_layout *)cmd.params;
661 	cmd_params->qtype = qtype;
662 
663 	/* send command to mc*/
664 	err = mc_send_command(mc_io, &cmd);
665 	if (err)
666 		return err;
667 
668 	/* retrieve response parameters */
669 	rsp_params = (struct dpni_rsp_get_buffer_layout *)cmd.params;
670 	layout->pass_timestamp =
671 				(int)dpni_get_field(rsp_params->flags, PASS_TS);
672 	layout->pass_parser_result =
673 				(int)dpni_get_field(rsp_params->flags, PASS_PR);
674 	layout->pass_frame_status =
675 				(int)dpni_get_field(rsp_params->flags, PASS_FS);
676 	layout->pass_sw_opaque =
677 			(int)dpni_get_field(rsp_params->flags, PASS_SWO);
678 	layout->private_data_size = le16_to_cpu(rsp_params->private_data_size);
679 	layout->data_align = le16_to_cpu(rsp_params->data_align);
680 	layout->data_head_room = le16_to_cpu(rsp_params->head_room);
681 	layout->data_tail_room = le16_to_cpu(rsp_params->tail_room);
682 
683 	return 0;
684 }
685 
686 /**
687  * dpni_set_buffer_layout() - Set buffer layout configuration.
688  * @mc_io:	Pointer to MC portal's I/O object
689  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
690  * @token:	Token of DPNI object
691  * @qtype:	Type of queue this configuration applies to
692  * @layout:	Buffer layout configuration
693  *
694  * Return:	'0' on Success; Error code otherwise.
695  *
696  * @warning	Allowed only when DPNI is disabled
697  */
698 int dpni_set_buffer_layout(struct fsl_mc_io *mc_io,
699 			   uint32_t cmd_flags,
700 			   uint16_t token,
701 			   enum dpni_queue_type qtype,
702 			   const struct dpni_buffer_layout *layout)
703 {
704 	struct mc_command cmd = { 0 };
705 	struct dpni_cmd_set_buffer_layout *cmd_params;
706 
707 	/* prepare command */
708 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_BUFFER_LAYOUT,
709 					  cmd_flags,
710 					  token);
711 	cmd_params = (struct dpni_cmd_set_buffer_layout *)cmd.params;
712 	cmd_params->qtype = qtype;
713 	cmd_params->options = cpu_to_le16((uint16_t)layout->options);
714 	dpni_set_field(cmd_params->flags, PASS_TS, layout->pass_timestamp);
715 	dpni_set_field(cmd_params->flags, PASS_PR, layout->pass_parser_result);
716 	dpni_set_field(cmd_params->flags, PASS_FS, layout->pass_frame_status);
717 	dpni_set_field(cmd_params->flags, PASS_SWO, layout->pass_sw_opaque);
718 	cmd_params->private_data_size = cpu_to_le16(layout->private_data_size);
719 	cmd_params->data_align = cpu_to_le16(layout->data_align);
720 	cmd_params->head_room = cpu_to_le16(layout->data_head_room);
721 	cmd_params->tail_room = cpu_to_le16(layout->data_tail_room);
722 
723 	/* send command to mc*/
724 	return mc_send_command(mc_io, &cmd);
725 }
726 
727 /**
728  * dpni_set_offload() - Set DPNI offload configuration.
729  * @mc_io:	Pointer to MC portal's I/O object
730  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
731  * @token:	Token of DPNI object
732  * @type:	Type of DPNI offload
733  * @config:	Offload configuration.
734  *		For checksum offloads, non-zero value enables the offload
735  *
736  * Return:     '0' on Success; Error code otherwise.
737  *
738  * @warning    Allowed only when DPNI is disabled
739  */
740 
741 int dpni_set_offload(struct fsl_mc_io *mc_io,
742 		     uint32_t cmd_flags,
743 		     uint16_t token,
744 		     enum dpni_offload type,
745 		     uint32_t config)
746 {
747 	struct mc_command cmd = { 0 };
748 	struct dpni_cmd_set_offload *cmd_params;
749 
750 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_OFFLOAD,
751 					  cmd_flags,
752 					  token);
753 	cmd_params = (struct dpni_cmd_set_offload *)cmd.params;
754 	cmd_params->dpni_offload = type;
755 	cmd_params->config = cpu_to_le32(config);
756 
757 	return mc_send_command(mc_io, &cmd);
758 }
759 
760 /**
761  * dpni_get_offload() - Get DPNI offload configuration.
762  * @mc_io:	Pointer to MC portal's I/O object
763  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
764  * @token:	Token of DPNI object
765  * @type:	Type of DPNI offload
766  * @config:	Offload configuration.
767  *			For checksum offloads, a value of 1 indicates that the
768  *			offload is enabled.
769  *
770  * Return:	'0' on Success; Error code otherwise.
771  *
772  * @warning	Allowed only when DPNI is disabled
773  */
774 int dpni_get_offload(struct fsl_mc_io *mc_io,
775 		     uint32_t cmd_flags,
776 		     uint16_t token,
777 		     enum dpni_offload type,
778 		     uint32_t *config)
779 {
780 	struct mc_command cmd = { 0 };
781 	struct dpni_cmd_get_offload *cmd_params;
782 	struct dpni_rsp_get_offload *rsp_params;
783 	int err;
784 
785 	/* prepare command */
786 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_OFFLOAD,
787 					  cmd_flags,
788 					  token);
789 	cmd_params = (struct dpni_cmd_get_offload *)cmd.params;
790 	cmd_params->dpni_offload = type;
791 
792 	/* send command to mc*/
793 	err = mc_send_command(mc_io, &cmd);
794 	if (err)
795 		return err;
796 
797 	/* retrieve response parameters */
798 	rsp_params = (struct dpni_rsp_get_offload *)cmd.params;
799 	*config = le32_to_cpu(rsp_params->config);
800 
801 	return 0;
802 }
803 
804 /**
805  * dpni_get_qdid() - Get the Queuing Destination ID (QDID) that should be used
806  *			for enqueue operations
807  * @mc_io:	Pointer to MC portal's I/O object
808  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
809  * @token:	Token of DPNI object
810  * @qtype:	Type of queue to receive QDID for
811  * @qdid:	Returned virtual QDID value that should be used as an argument
812  *			in all enqueue operations
813  *
814  * Return:	'0' on Success; Error code otherwise.
815  */
816 int dpni_get_qdid(struct fsl_mc_io *mc_io,
817 		  uint32_t cmd_flags,
818 		  uint16_t token,
819 		  enum dpni_queue_type qtype,
820 		  uint16_t *qdid)
821 {
822 	struct mc_command cmd = { 0 };
823 	struct dpni_cmd_get_qdid *cmd_params;
824 	struct dpni_rsp_get_qdid *rsp_params;
825 	int err;
826 
827 	/* prepare command */
828 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_QDID,
829 					  cmd_flags,
830 					  token);
831 	cmd_params = (struct dpni_cmd_get_qdid *)cmd.params;
832 	cmd_params->qtype = qtype;
833 
834 	/* send command to mc*/
835 	err = mc_send_command(mc_io, &cmd);
836 	if (err)
837 		return err;
838 
839 	/* retrieve response parameters */
840 	rsp_params = (struct dpni_rsp_get_qdid *)cmd.params;
841 	*qdid = le16_to_cpu(rsp_params->qdid);
842 
843 	return 0;
844 }
845 
846 /**
847  * dpni_get_tx_data_offset() - Get the Tx data offset (from start of buffer)
848  * @mc_io:	Pointer to MC portal's I/O object
849  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
850  * @token:	Token of DPNI object
851  * @data_offset: Tx data offset (from start of buffer)
852  *
853  * Return:	'0' on Success; Error code otherwise.
854  */
855 int dpni_get_tx_data_offset(struct fsl_mc_io *mc_io,
856 			    uint32_t cmd_flags,
857 			    uint16_t token,
858 			    uint16_t *data_offset)
859 {
860 	struct mc_command cmd = { 0 };
861 	struct dpni_rsp_get_tx_data_offset *rsp_params;
862 	int err;
863 
864 	/* prepare command */
865 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_TX_DATA_OFFSET,
866 					  cmd_flags,
867 					  token);
868 
869 	/* send command to mc*/
870 	err = mc_send_command(mc_io, &cmd);
871 	if (err)
872 		return err;
873 
874 	/* retrieve response parameters */
875 	rsp_params = (struct dpni_rsp_get_tx_data_offset *)cmd.params;
876 	*data_offset = le16_to_cpu(rsp_params->data_offset);
877 
878 	return 0;
879 }
880 
881 /**
882  * dpni_set_link_cfg() - set the link configuration.
883  * @mc_io:	Pointer to MC portal's I/O object
884  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
885  * @token:	Token of DPNI object
886  * @cfg:	Link configuration
887  *
888  * Return:	'0' on Success; Error code otherwise.
889  */
890 int dpni_set_link_cfg(struct fsl_mc_io *mc_io,
891 		      uint32_t cmd_flags,
892 		      uint16_t token,
893 		      const struct dpni_link_cfg *cfg)
894 {
895 	struct mc_command cmd = { 0 };
896 	struct dpni_cmd_set_link_cfg *cmd_params;
897 
898 	/* prepare command */
899 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_LINK_CFG,
900 					  cmd_flags,
901 					  token);
902 	cmd_params = (struct dpni_cmd_set_link_cfg *)cmd.params;
903 	cmd_params->rate = cpu_to_le32(cfg->rate);
904 	cmd_params->options = cpu_to_le64(cfg->options);
905 	cmd_params->advertising = cpu_to_le64(cfg->advertising);
906 
907 	/* send command to mc*/
908 	return mc_send_command(mc_io, &cmd);
909 }
910 
911 /**
912  * dpni_get_link_state() - Return the link state (either up or down)
913  * @mc_io:	Pointer to MC portal's I/O object
914  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
915  * @token:	Token of DPNI object
916  * @state:	Returned link state;
917  *
918  * Return:	'0' on Success; Error code otherwise.
919  */
920 int dpni_get_link_state(struct fsl_mc_io *mc_io,
921 			uint32_t cmd_flags,
922 			uint16_t token,
923 			struct dpni_link_state *state)
924 {
925 	struct mc_command cmd = { 0 };
926 	struct dpni_rsp_get_link_state *rsp_params;
927 	int err;
928 
929 	/* prepare command */
930 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_LINK_STATE,
931 					  cmd_flags,
932 					  token);
933 
934 	/* send command to mc*/
935 	err = mc_send_command(mc_io, &cmd);
936 	if (err)
937 		return err;
938 
939 	/* retrieve response parameters */
940 	rsp_params = (struct dpni_rsp_get_link_state *)cmd.params;
941 	state->up = dpni_get_field(rsp_params->flags, LINK_STATE);
942 	state->state_valid = dpni_get_field(rsp_params->flags, STATE_VALID);
943 	state->rate = le32_to_cpu(rsp_params->rate);
944 	state->options = le64_to_cpu(rsp_params->options);
945 	state->supported = le64_to_cpu(rsp_params->supported);
946 	state->advertising = le64_to_cpu(rsp_params->advertising);
947 
948 	return 0;
949 }
950 
951 /**
952  * dpni_set_max_frame_length() - Set the maximum received frame length.
953  * @mc_io:		Pointer to MC portal's I/O object
954  * @cmd_flags:		Command flags; one or more of 'MC_CMD_FLAG_'
955  * @token:		Token of DPNI object
956  * @max_frame_length:	Maximum received frame length (in bytes);
957  *			frame is discarded if its length exceeds this value
958  *
959  * Return:	'0' on Success; Error code otherwise.
960  */
961 int dpni_set_max_frame_length(struct fsl_mc_io *mc_io,
962 			      uint32_t cmd_flags,
963 			      uint16_t token,
964 			      uint16_t max_frame_length)
965 {
966 	struct mc_command cmd = { 0 };
967 	struct dpni_cmd_set_max_frame_length *cmd_params;
968 
969 	/* prepare command */
970 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_MAX_FRAME_LENGTH,
971 					  cmd_flags,
972 					  token);
973 	cmd_params = (struct dpni_cmd_set_max_frame_length *)cmd.params;
974 	cmd_params->max_frame_length = cpu_to_le16(max_frame_length);
975 
976 	/* send command to mc*/
977 	return mc_send_command(mc_io, &cmd);
978 }
979 
980 /**
981  * dpni_get_max_frame_length() - Get the maximum received frame length.
982  * @mc_io:		Pointer to MC portal's I/O object
983  * @cmd_flags:		Command flags; one or more of 'MC_CMD_FLAG_'
984  * @token:		Token of DPNI object
985  * @max_frame_length:	Maximum received frame length (in bytes);
986  *			frame is discarded if its length exceeds this value
987  *
988  * Return:	'0' on Success; Error code otherwise.
989  */
990 int dpni_get_max_frame_length(struct fsl_mc_io *mc_io,
991 			      uint32_t cmd_flags,
992 			      uint16_t token,
993 			      uint16_t *max_frame_length)
994 {
995 	struct mc_command cmd = { 0 };
996 	struct dpni_rsp_get_max_frame_length *rsp_params;
997 	int err;
998 
999 	/* prepare command */
1000 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_MAX_FRAME_LENGTH,
1001 					  cmd_flags,
1002 					  token);
1003 
1004 	/* send command to mc*/
1005 	err = mc_send_command(mc_io, &cmd);
1006 	if (err)
1007 		return err;
1008 
1009 	/* retrieve response parameters */
1010 	rsp_params = (struct dpni_rsp_get_max_frame_length *)cmd.params;
1011 	*max_frame_length = le16_to_cpu(rsp_params->max_frame_length);
1012 
1013 	return 0;
1014 }
1015 
1016 /**
1017  * dpni_set_multicast_promisc() - Enable/disable multicast promiscuous mode
1018  * @mc_io:	Pointer to MC portal's I/O object
1019  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1020  * @token:	Token of DPNI object
1021  * @en:		Set to '1' to enable; '0' to disable
1022  *
1023  * Return:	'0' on Success; Error code otherwise.
1024  */
1025 int dpni_set_multicast_promisc(struct fsl_mc_io *mc_io,
1026 			       uint32_t cmd_flags,
1027 			       uint16_t token,
1028 			       int en)
1029 {
1030 	struct mc_command cmd = { 0 };
1031 	struct dpni_cmd_set_multicast_promisc *cmd_params;
1032 
1033 	/* prepare command */
1034 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_MCAST_PROMISC,
1035 					  cmd_flags,
1036 					  token);
1037 	cmd_params = (struct dpni_cmd_set_multicast_promisc *)cmd.params;
1038 	dpni_set_field(cmd_params->enable, ENABLE, en);
1039 
1040 	/* send command to mc*/
1041 	return mc_send_command(mc_io, &cmd);
1042 }
1043 
1044 /**
1045  * dpni_get_multicast_promisc() - Get multicast promiscuous mode
1046  * @mc_io:	Pointer to MC portal's I/O object
1047  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1048  * @token:	Token of DPNI object
1049  * @en:		Returns '1' if enabled; '0' otherwise
1050  *
1051  * Return:	'0' on Success; Error code otherwise.
1052  */
1053 int dpni_get_multicast_promisc(struct fsl_mc_io *mc_io,
1054 			       uint32_t cmd_flags,
1055 			       uint16_t token,
1056 			       int *en)
1057 {
1058 	struct mc_command cmd = { 0 };
1059 	struct dpni_rsp_get_multicast_promisc *rsp_params;
1060 	int err;
1061 
1062 	/* prepare command */
1063 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_MCAST_PROMISC,
1064 					  cmd_flags,
1065 					  token);
1066 
1067 	/* send command to mc*/
1068 	err = mc_send_command(mc_io, &cmd);
1069 	if (err)
1070 		return err;
1071 
1072 	/* retrieve response parameters */
1073 	rsp_params = (struct dpni_rsp_get_multicast_promisc *)cmd.params;
1074 	*en = dpni_get_field(rsp_params->enabled, ENABLE);
1075 
1076 	return 0;
1077 }
1078 
1079 /**
1080  * dpni_set_unicast_promisc() - Enable/disable unicast promiscuous mode
1081  * @mc_io:	Pointer to MC portal's I/O object
1082  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1083  * @token:	Token of DPNI object
1084  * @en:		Set to '1' to enable; '0' to disable
1085  *
1086  * Return:	'0' on Success; Error code otherwise.
1087  */
1088 int dpni_set_unicast_promisc(struct fsl_mc_io *mc_io,
1089 			     uint32_t cmd_flags,
1090 			     uint16_t token,
1091 			     int en)
1092 {
1093 	struct mc_command cmd = { 0 };
1094 	struct dpni_cmd_set_unicast_promisc *cmd_params;
1095 
1096 	/* prepare command */
1097 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_UNICAST_PROMISC,
1098 					  cmd_flags,
1099 					  token);
1100 	cmd_params = (struct dpni_cmd_set_unicast_promisc *)cmd.params;
1101 	dpni_set_field(cmd_params->enable, ENABLE, en);
1102 
1103 	/* send command to mc*/
1104 	return mc_send_command(mc_io, &cmd);
1105 }
1106 
1107 /**
1108  * dpni_get_unicast_promisc() - Get unicast promiscuous mode
1109  * @mc_io:	Pointer to MC portal's I/O object
1110  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1111  * @token:	Token of DPNI object
1112  * @en:		Returns '1' if enabled; '0' otherwise
1113  *
1114  * Return:	'0' on Success; Error code otherwise.
1115  */
1116 int dpni_get_unicast_promisc(struct fsl_mc_io *mc_io,
1117 			     uint32_t cmd_flags,
1118 			     uint16_t token,
1119 			     int *en)
1120 {
1121 	struct mc_command cmd = { 0 };
1122 	struct dpni_rsp_get_unicast_promisc *rsp_params;
1123 	int err;
1124 
1125 	/* prepare command */
1126 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_UNICAST_PROMISC,
1127 					  cmd_flags,
1128 					  token);
1129 
1130 	/* send command to mc*/
1131 	err = mc_send_command(mc_io, &cmd);
1132 	if (err)
1133 		return err;
1134 
1135 	/* retrieve response parameters */
1136 	rsp_params = (struct dpni_rsp_get_unicast_promisc *)cmd.params;
1137 	*en = dpni_get_field(rsp_params->enabled, ENABLE);
1138 
1139 	return 0;
1140 }
1141 
1142 /**
1143  * dpni_set_primary_mac_addr() - Set the primary MAC address
1144  * @mc_io:	Pointer to MC portal's I/O object
1145  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1146  * @token:	Token of DPNI object
1147  * @mac_addr:	MAC address to set as primary address
1148  *
1149  * Return:	'0' on Success; Error code otherwise.
1150  */
1151 int dpni_set_primary_mac_addr(struct fsl_mc_io *mc_io,
1152 			      uint32_t cmd_flags,
1153 			      uint16_t token,
1154 			      const uint8_t mac_addr[6])
1155 {
1156 	struct mc_command cmd = { 0 };
1157 	struct dpni_cmd_set_primary_mac_addr *cmd_params;
1158 	int i;
1159 
1160 	/* prepare command */
1161 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_PRIM_MAC,
1162 					  cmd_flags,
1163 					  token);
1164 	cmd_params = (struct dpni_cmd_set_primary_mac_addr *)cmd.params;
1165 	for (i = 0; i < 6; i++)
1166 		cmd_params->mac_addr[i] = mac_addr[5 - i];
1167 
1168 	/* send command to mc*/
1169 	return mc_send_command(mc_io, &cmd);
1170 }
1171 
1172 /**
1173  * dpni_get_primary_mac_addr() - Get the primary MAC address
1174  * @mc_io:	Pointer to MC portal's I/O object
1175  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1176  * @token:	Token of DPNI object
1177  * @mac_addr:	Returned MAC address
1178  *
1179  * Return:	'0' on Success; Error code otherwise.
1180  */
1181 int dpni_get_primary_mac_addr(struct fsl_mc_io *mc_io,
1182 			      uint32_t cmd_flags,
1183 			      uint16_t token,
1184 			      uint8_t mac_addr[6])
1185 {
1186 	struct mc_command cmd = { 0 };
1187 	struct dpni_rsp_get_primary_mac_addr *rsp_params;
1188 	int i, err;
1189 
1190 	/* prepare command */
1191 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_PRIM_MAC,
1192 					  cmd_flags,
1193 					  token);
1194 
1195 	/* send command to mc*/
1196 	err = mc_send_command(mc_io, &cmd);
1197 	if (err)
1198 		return err;
1199 
1200 	/* retrieve response parameters */
1201 	rsp_params = (struct dpni_rsp_get_primary_mac_addr *)cmd.params;
1202 	for (i = 0; i < 6; i++)
1203 		mac_addr[5 - i] = rsp_params->mac_addr[i];
1204 
1205 	return 0;
1206 }
1207 
1208 /**
1209  * dpni_add_mac_addr() - Add MAC address filter
1210  * @mc_io:	Pointer to MC portal's I/O object
1211  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1212  * @token:	Token of DPNI object
1213  * @mac_addr:	MAC address to add
1214  *
1215  * Return:	'0' on Success; Error code otherwise.
1216  */
1217 int dpni_add_mac_addr(struct fsl_mc_io *mc_io,
1218 		      uint32_t cmd_flags,
1219 		      uint16_t token,
1220 		      const uint8_t mac_addr[6])
1221 {
1222 	struct mc_command cmd = { 0 };
1223 	struct dpni_cmd_add_mac_addr *cmd_params;
1224 	int i;
1225 
1226 	/* prepare command */
1227 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_ADD_MAC_ADDR,
1228 					  cmd_flags,
1229 					  token);
1230 	cmd_params = (struct dpni_cmd_add_mac_addr *)cmd.params;
1231 	for (i = 0; i < 6; i++)
1232 		cmd_params->mac_addr[i] = mac_addr[5 - i];
1233 
1234 	/* send command to mc*/
1235 	return mc_send_command(mc_io, &cmd);
1236 }
1237 
1238 /**
1239  * dpni_remove_mac_addr() - Remove MAC address filter
1240  * @mc_io:	Pointer to MC portal's I/O object
1241  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1242  * @token:	Token of DPNI object
1243  * @mac_addr:	MAC address to remove
1244  *
1245  * Return:	'0' on Success; Error code otherwise.
1246  */
1247 int dpni_remove_mac_addr(struct fsl_mc_io *mc_io,
1248 			 uint32_t cmd_flags,
1249 			 uint16_t token,
1250 			 const uint8_t mac_addr[6])
1251 {
1252 	struct mc_command cmd = { 0 };
1253 	struct dpni_cmd_remove_mac_addr *cmd_params;
1254 	int i;
1255 
1256 	/* prepare command */
1257 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_REMOVE_MAC_ADDR,
1258 					  cmd_flags,
1259 					  token);
1260 	cmd_params = (struct dpni_cmd_remove_mac_addr *)cmd.params;
1261 	for (i = 0; i < 6; i++)
1262 		cmd_params->mac_addr[i] = mac_addr[5 - i];
1263 
1264 	/* send command to mc*/
1265 	return mc_send_command(mc_io, &cmd);
1266 }
1267 
1268 /**
1269  * dpni_clear_mac_filters() - Clear all unicast and/or multicast MAC filters
1270  * @mc_io:	Pointer to MC portal's I/O object
1271  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1272  * @token:	Token of DPNI object
1273  * @unicast:	Set to '1' to clear unicast addresses
1274  * @multicast:	Set to '1' to clear multicast addresses
1275  *
1276  * The primary MAC address is not cleared by this operation.
1277  *
1278  * Return:	'0' on Success; Error code otherwise.
1279  */
1280 int dpni_clear_mac_filters(struct fsl_mc_io *mc_io,
1281 			   uint32_t cmd_flags,
1282 			   uint16_t token,
1283 			   int unicast,
1284 			   int multicast)
1285 {
1286 	struct mc_command cmd = { 0 };
1287 	struct dpni_cmd_clear_mac_filters *cmd_params;
1288 
1289 	/* prepare command */
1290 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_CLR_MAC_FILTERS,
1291 					  cmd_flags,
1292 					  token);
1293 	cmd_params = (struct dpni_cmd_clear_mac_filters *)cmd.params;
1294 	dpni_set_field(cmd_params->flags, UNICAST_FILTERS, unicast);
1295 	dpni_set_field(cmd_params->flags, MULTICAST_FILTERS, multicast);
1296 
1297 	/* send command to mc*/
1298 	return mc_send_command(mc_io, &cmd);
1299 }
1300 
1301 /**
1302  * dpni_get_port_mac_addr() - Retrieve MAC address associated to the physical
1303  *			port the DPNI is attached to
1304  * @mc_io:	Pointer to MC portal's I/O object
1305  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1306  * @token:	Token of DPNI object
1307  * @mac_addr:	MAC address of the physical port, if any, otherwise 0
1308  *
1309  * The primary MAC address is not cleared by this operation.
1310  *
1311  * Return:	'0' on Success; Error code otherwise.
1312  */
1313 int dpni_get_port_mac_addr(struct fsl_mc_io *mc_io,
1314 			   uint32_t cmd_flags,
1315 			   uint16_t token,
1316 			   uint8_t mac_addr[6])
1317 {
1318 	struct mc_command cmd = { 0 };
1319 	struct dpni_rsp_get_port_mac_addr *rsp_params;
1320 	int i, err;
1321 
1322 	/* prepare command */
1323 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_PORT_MAC_ADDR,
1324 					  cmd_flags,
1325 					  token);
1326 
1327 	/* send command to mc*/
1328 	err = mc_send_command(mc_io, &cmd);
1329 	if (err)
1330 		return err;
1331 
1332 	/* retrieve response parameters */
1333 	rsp_params = (struct dpni_rsp_get_port_mac_addr *)cmd.params;
1334 	for (i = 0; i < 6; i++)
1335 		mac_addr[5 - i] = rsp_params->mac_addr[i];
1336 
1337 	return 0;
1338 }
1339 
1340 /**
1341  * dpni_enable_vlan_filter() - Enable/disable VLAN filtering mode
1342  * @mc_io:	Pointer to MC portal's I/O object
1343  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1344  * @token:	Token of DPNI object
1345  * @en:		Set to '1' to enable; '0' to disable
1346  *
1347  * Return:	'0' on Success; Error code otherwise.
1348  */
1349 int dpni_enable_vlan_filter(struct fsl_mc_io *mc_io,
1350 			    uint32_t cmd_flags,
1351 			    uint16_t token,
1352 			    int en)
1353 {
1354 	struct dpni_cmd_enable_vlan_filter *cmd_params;
1355 	struct mc_command cmd = { 0 };
1356 
1357 	/* prepare command */
1358 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_ENABLE_VLAN_FILTER,
1359 					  cmd_flags,
1360 					  token);
1361 	cmd_params = (struct dpni_cmd_enable_vlan_filter *)cmd.params;
1362 	dpni_set_field(cmd_params->en, ENABLE, en);
1363 
1364 	/* send command to mc*/
1365 	return mc_send_command(mc_io, &cmd);
1366 }
1367 
1368 /**
1369  * dpni_add_vlan_id() - Add VLAN ID filter
1370  * @mc_io:	Pointer to MC portal's I/O object
1371  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1372  * @token:	Token of DPNI object
1373  * @vlan_id:	VLAN ID to add
1374  *
1375  * Return:	'0' on Success; Error code otherwise.
1376  */
1377 int dpni_add_vlan_id(struct fsl_mc_io *mc_io,
1378 		     uint32_t cmd_flags,
1379 		     uint16_t token,
1380 		     uint16_t vlan_id)
1381 {
1382 	struct dpni_cmd_vlan_id *cmd_params;
1383 	struct mc_command cmd = { 0 };
1384 
1385 	/* prepare command */
1386 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_ADD_VLAN_ID,
1387 					  cmd_flags,
1388 					  token);
1389 	cmd_params = (struct dpni_cmd_vlan_id *)cmd.params;
1390 	cmd_params->vlan_id = cpu_to_le16(vlan_id);
1391 
1392 	/* send command to mc*/
1393 	return mc_send_command(mc_io, &cmd);
1394 }
1395 
1396 /**
1397  * dpni_remove_vlan_id() - Remove VLAN ID filter
1398  * @mc_io:	Pointer to MC portal's I/O object
1399  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1400  * @token:	Token of DPNI object
1401  * @vlan_id:	VLAN ID to remove
1402  *
1403  * Return:	'0' on Success; Error code otherwise.
1404  */
1405 int dpni_remove_vlan_id(struct fsl_mc_io *mc_io,
1406 			uint32_t cmd_flags,
1407 			uint16_t token,
1408 			uint16_t vlan_id)
1409 {
1410 	struct dpni_cmd_vlan_id *cmd_params;
1411 	struct mc_command cmd = { 0 };
1412 
1413 	/* prepare command */
1414 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_REMOVE_VLAN_ID,
1415 					  cmd_flags,
1416 					  token);
1417 	cmd_params = (struct dpni_cmd_vlan_id *)cmd.params;
1418 	cmd_params->vlan_id = cpu_to_le16(vlan_id);
1419 
1420 	/* send command to mc*/
1421 	return mc_send_command(mc_io, &cmd);
1422 }
1423 
1424 /**
1425  * dpni_clear_vlan_filters() - Clear all VLAN filters
1426  * @mc_io:	Pointer to MC portal's I/O object
1427  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1428  * @token:	Token of DPNI object
1429  *
1430  * Return:	'0' on Success; Error code otherwise.
1431  */
1432 int dpni_clear_vlan_filters(struct fsl_mc_io *mc_io,
1433 			    uint32_t cmd_flags,
1434 			    uint16_t token)
1435 {
1436 	struct mc_command cmd = { 0 };
1437 
1438 	/* prepare command */
1439 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_CLR_VLAN_FILTERS,
1440 					  cmd_flags,
1441 					  token);
1442 
1443 	/* send command to mc*/
1444 	return mc_send_command(mc_io, &cmd);
1445 }
1446 
1447 /**
1448  * dpni_set_rx_tc_dist() - Set Rx traffic class distribution configuration
1449  * @mc_io:	Pointer to MC portal's I/O object
1450  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1451  * @token:	Token of DPNI object
1452  * @tc_id:	Traffic class selection (0-7)
1453  * @cfg:	Traffic class distribution configuration
1454  *
1455  * warning: if 'dist_mode != DPNI_DIST_MODE_NONE', call dpkg_prepare_key_cfg()
1456  *			first to prepare the key_cfg_iova parameter
1457  *
1458  * Return:	'0' on Success; error code otherwise.
1459  */
1460 int dpni_set_rx_tc_dist(struct fsl_mc_io *mc_io,
1461 			uint32_t cmd_flags,
1462 			uint16_t token,
1463 			uint8_t tc_id,
1464 			const struct dpni_rx_tc_dist_cfg *cfg)
1465 {
1466 	struct mc_command cmd = { 0 };
1467 	struct dpni_cmd_set_rx_tc_dist *cmd_params;
1468 
1469 	/* prepare command */
1470 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_RX_TC_DIST,
1471 					  cmd_flags,
1472 					  token);
1473 	cmd_params = (struct dpni_cmd_set_rx_tc_dist *)cmd.params;
1474 	cmd_params->dist_size = cpu_to_le16(cfg->dist_size);
1475 	cmd_params->tc_id = tc_id;
1476 	cmd_params->default_flow_id = cpu_to_le16(cfg->fs_cfg.default_flow_id);
1477 	cmd_params->key_cfg_iova = cpu_to_le64(cfg->key_cfg_iova);
1478 	dpni_set_field(cmd_params->flags,
1479 		       DIST_MODE,
1480 		       cfg->dist_mode);
1481 	dpni_set_field(cmd_params->flags,
1482 		       MISS_ACTION,
1483 		       cfg->fs_cfg.miss_action);
1484 	dpni_set_field(cmd_params->keep_hash_key,
1485 		       KEEP_HASH_KEY,
1486 		       cfg->fs_cfg.keep_hash_key);
1487 	dpni_set_field(cmd_params->keep_hash_key,
1488 		       KEEP_ENTRIES,
1489 		       cfg->fs_cfg.keep_entries);
1490 
1491 	/* send command to mc*/
1492 	return mc_send_command(mc_io, &cmd);
1493 }
1494 
1495 /**
1496  * dpni_set_tx_confirmation_mode() - Tx confirmation mode
1497  * @mc_io:	Pointer to MC portal's I/O object
1498  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1499  * @token:	Token of DPNI object
1500  * @mode:	Tx confirmation mode
1501  *
1502  * This function is useful only when 'DPNI_OPT_TX_CONF_DISABLED' is not
1503  * selected at DPNI creation.
1504  * Calling this function with 'mode' set to DPNI_CONF_DISABLE disables all
1505  * transmit confirmation (including the private confirmation queues), regardless
1506  * of previous settings; Note that in this case, Tx error frames are still
1507  * enqueued to the general transmit errors queue.
1508  * Calling this function with 'mode' set to DPNI_CONF_SINGLE switches all
1509  * Tx confirmations to a shared Tx conf queue. 'index' field in dpni_get_queue
1510  * command will be ignored.
1511  *
1512  * Return:	'0' on Success; Error code otherwise.
1513  */
1514 int dpni_set_tx_confirmation_mode(struct fsl_mc_io *mc_io,
1515 				  uint32_t cmd_flags,
1516 				  uint16_t token,
1517 				  enum dpni_confirmation_mode mode)
1518 {
1519 	struct dpni_tx_confirmation_mode *cmd_params;
1520 	struct mc_command cmd = { 0 };
1521 
1522 	/* prepare command */
1523 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_TX_CONFIRMATION_MODE,
1524 					  cmd_flags,
1525 					  token);
1526 	cmd_params = (struct dpni_tx_confirmation_mode *)cmd.params;
1527 	cmd_params->confirmation_mode = mode;
1528 
1529 	/* send command to mc*/
1530 	return mc_send_command(mc_io, &cmd);
1531 }
1532 
1533 /**
1534  * dpni_set_qos_table() - Set QoS mapping table
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  * @cfg:	QoS table configuration
1539  *
1540  * This function and all QoS-related functions require that
1541  *'max_tcs > 1' was set at DPNI creation.
1542  *
1543  * warning: Before calling this function, call dpkg_prepare_key_cfg() to
1544  *			prepare the key_cfg_iova parameter
1545  *
1546  * Return:	'0' on Success; Error code otherwise.
1547  */
1548 int dpni_set_qos_table(struct fsl_mc_io *mc_io,
1549 		       uint32_t cmd_flags,
1550 		       uint16_t token,
1551 		       const struct dpni_qos_tbl_cfg *cfg)
1552 {
1553 	struct dpni_cmd_set_qos_table *cmd_params;
1554 	struct mc_command cmd = { 0 };
1555 
1556 	/* prepare command */
1557 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_QOS_TBL,
1558 					  cmd_flags,
1559 					  token);
1560 	cmd_params = (struct dpni_cmd_set_qos_table *)cmd.params;
1561 	cmd_params->default_tc = cfg->default_tc;
1562 	cmd_params->key_cfg_iova = cpu_to_le64(cfg->key_cfg_iova);
1563 	dpni_set_field(cmd_params->discard_on_miss,
1564 		       ENABLE,
1565 		       cfg->discard_on_miss);
1566 	dpni_set_field(cmd_params->discard_on_miss,
1567 					KEEP_QOS_ENTRIES,
1568 			       cfg->keep_entries);
1569 
1570 	/* send command to mc*/
1571 	return mc_send_command(mc_io, &cmd);
1572 }
1573 
1574 /**
1575  * dpni_add_qos_entry() - Add QoS mapping entry (to select a traffic class)
1576  * @mc_io:	Pointer to MC portal's I/O object
1577  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1578  * @token:	Token of DPNI object
1579  * @cfg:	QoS rule to add
1580  * @tc_id:	Traffic class selection (0-7)
1581  * @index:	Location in the QoS table where to insert the entry.
1582  *		Only relevant if MASKING is enabled for QoS classification on
1583  *		this DPNI, it is ignored for exact match.
1584  *
1585  * Return:	'0' on Success; Error code otherwise.
1586  */
1587 int dpni_add_qos_entry(struct fsl_mc_io *mc_io,
1588 		       uint32_t cmd_flags,
1589 		       uint16_t token,
1590 		       const struct dpni_rule_cfg *cfg,
1591 		       uint8_t tc_id,
1592 		       uint16_t index)
1593 {
1594 	struct dpni_cmd_add_qos_entry *cmd_params;
1595 	struct mc_command cmd = { 0 };
1596 
1597 	/* prepare command */
1598 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_ADD_QOS_ENT,
1599 					  cmd_flags,
1600 					  token);
1601 	cmd_params = (struct dpni_cmd_add_qos_entry *)cmd.params;
1602 	cmd_params->tc_id = tc_id;
1603 	cmd_params->key_size = cfg->key_size;
1604 	cmd_params->index = cpu_to_le16(index);
1605 	cmd_params->key_iova = cpu_to_le64(cfg->key_iova);
1606 	cmd_params->mask_iova = cpu_to_le64(cfg->mask_iova);
1607 
1608 	/* send command to mc*/
1609 	return mc_send_command(mc_io, &cmd);
1610 }
1611 
1612 /**
1613  * dpni_remove_qos_entry() - Remove QoS mapping entry
1614  * @mc_io:	Pointer to MC portal's I/O object
1615  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1616  * @token:	Token of DPNI object
1617  * @cfg:	QoS rule to remove
1618  *
1619  * Return:	'0' on Success; Error code otherwise.
1620  */
1621 int dpni_remove_qos_entry(struct fsl_mc_io *mc_io,
1622 			  uint32_t cmd_flags,
1623 			  uint16_t token,
1624 			  const struct dpni_rule_cfg *cfg)
1625 {
1626 	struct dpni_cmd_remove_qos_entry *cmd_params;
1627 	struct mc_command cmd = { 0 };
1628 
1629 	/* prepare command */
1630 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_REMOVE_QOS_ENT,
1631 					  cmd_flags,
1632 					  token);
1633 	cmd_params = (struct dpni_cmd_remove_qos_entry *)cmd.params;
1634 	cmd_params->key_size = cfg->key_size;
1635 	cmd_params->key_iova = cpu_to_le64(cfg->key_iova);
1636 	cmd_params->mask_iova = cpu_to_le64(cfg->mask_iova);
1637 
1638 	/* send command to mc*/
1639 	return mc_send_command(mc_io, &cmd);
1640 }
1641 
1642 /**
1643  * dpni_clear_qos_table() - Clear all QoS mapping entries
1644  * @mc_io:	Pointer to MC portal's I/O object
1645  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1646  * @token:	Token of DPNI object
1647  *
1648  * Following this function call, all frames are directed to
1649  * the default traffic class (0)
1650  *
1651  * Return:	'0' on Success; Error code otherwise.
1652  */
1653 int dpni_clear_qos_table(struct fsl_mc_io *mc_io,
1654 			 uint32_t cmd_flags,
1655 			 uint16_t token)
1656 {
1657 	struct mc_command cmd = { 0 };
1658 
1659 	/* prepare command */
1660 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_CLR_QOS_TBL,
1661 					  cmd_flags,
1662 					  token);
1663 
1664 	/* send command to mc*/
1665 	return mc_send_command(mc_io, &cmd);
1666 }
1667 
1668 /**
1669  * dpni_add_fs_entry() - Add Flow Steering entry for a specific traffic class
1670  *			(to select a flow ID)
1671  * @mc_io:	Pointer to MC portal's I/O object
1672  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1673  * @token:	Token of DPNI object
1674  * @tc_id:	Traffic class selection (0-7)
1675  * @index:	Location in the QoS table where to insert the entry.
1676  *		Only relevant if MASKING is enabled for QoS classification
1677  *		on this DPNI, it is ignored for exact match.
1678  * @cfg:	Flow steering rule to add
1679  * @action:	Action to be taken as result of a classification hit
1680  *
1681  * Return:	'0' on Success; Error code otherwise.
1682  */
1683 int dpni_add_fs_entry(struct fsl_mc_io *mc_io,
1684 		      uint32_t cmd_flags,
1685 		      uint16_t token,
1686 		      uint8_t tc_id,
1687 		      uint16_t index,
1688 		      const struct dpni_rule_cfg *cfg,
1689 		      const struct dpni_fs_action_cfg *action)
1690 {
1691 	struct dpni_cmd_add_fs_entry *cmd_params;
1692 	struct mc_command cmd = { 0 };
1693 
1694 	/* prepare command */
1695 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_ADD_FS_ENT,
1696 					  cmd_flags,
1697 					  token);
1698 	cmd_params = (struct dpni_cmd_add_fs_entry *)cmd.params;
1699 	cmd_params->tc_id = tc_id;
1700 	cmd_params->key_size = cfg->key_size;
1701 	cmd_params->index = cpu_to_le16(index);
1702 	cmd_params->key_iova = cpu_to_le64(cfg->key_iova);
1703 	cmd_params->mask_iova = cpu_to_le64(cfg->mask_iova);
1704 	cmd_params->options = cpu_to_le16(action->options);
1705 	cmd_params->flow_id = cpu_to_le16(action->flow_id);
1706 	cmd_params->flc = cpu_to_le64(action->flc);
1707 
1708 	/* send command to mc*/
1709 	return mc_send_command(mc_io, &cmd);
1710 }
1711 
1712 /**
1713  * dpni_remove_fs_entry() - Remove Flow Steering entry from a specific
1714  *			traffic class
1715  * @mc_io:	Pointer to MC portal's I/O object
1716  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1717  * @token:	Token of DPNI object
1718  * @tc_id:	Traffic class selection (0-7)
1719  * @cfg:	Flow steering rule to remove
1720  *
1721  * Return:	'0' on Success; Error code otherwise.
1722  */
1723 int dpni_remove_fs_entry(struct fsl_mc_io *mc_io,
1724 			 uint32_t cmd_flags,
1725 			 uint16_t token,
1726 			 uint8_t tc_id,
1727 			 const struct dpni_rule_cfg *cfg)
1728 {
1729 	struct dpni_cmd_remove_fs_entry *cmd_params;
1730 	struct mc_command cmd = { 0 };
1731 
1732 	/* prepare command */
1733 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_REMOVE_FS_ENT,
1734 					  cmd_flags,
1735 					  token);
1736 	cmd_params = (struct dpni_cmd_remove_fs_entry *)cmd.params;
1737 	cmd_params->tc_id = tc_id;
1738 	cmd_params->key_size = cfg->key_size;
1739 	cmd_params->key_iova = cpu_to_le64(cfg->key_iova);
1740 	cmd_params->mask_iova = cpu_to_le64(cfg->mask_iova);
1741 
1742 	/* send command to mc*/
1743 	return mc_send_command(mc_io, &cmd);
1744 }
1745 
1746 /**
1747  * dpni_clear_fs_entries() - Clear all Flow Steering entries of a specific
1748  *			traffic class
1749  * @mc_io:	Pointer to MC portal's I/O object
1750  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1751  * @token:	Token of DPNI object
1752  * @tc_id:	Traffic class selection (0-7)
1753  *
1754  * Return:	'0' on Success; Error code otherwise.
1755  */
1756 int dpni_clear_fs_entries(struct fsl_mc_io *mc_io,
1757 			  uint32_t cmd_flags,
1758 			  uint16_t token,
1759 			  uint8_t tc_id)
1760 {
1761 	struct dpni_cmd_clear_fs_entries *cmd_params;
1762 	struct mc_command cmd = { 0 };
1763 
1764 	/* prepare command */
1765 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_CLR_FS_ENT,
1766 					  cmd_flags,
1767 					  token);
1768 	cmd_params = (struct dpni_cmd_clear_fs_entries *)cmd.params;
1769 	cmd_params->tc_id = tc_id;
1770 
1771 	/* send command to mc*/
1772 	return mc_send_command(mc_io, &cmd);
1773 }
1774 
1775 /**
1776  * dpni_set_congestion_notification() - Set traffic class congestion
1777  *	notification configuration
1778  * @mc_io:	Pointer to MC portal's I/O object
1779  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1780  * @token:	Token of DPNI object
1781  * @qtype:	Type of queue - Rx, Tx and Tx confirm types are supported
1782  * @tc_id:	Traffic class selection (0-7)
1783  * @cfg:	congestion notification configuration
1784  *
1785  * Return:	'0' on Success; error code otherwise.
1786  */
1787 int dpni_set_congestion_notification(struct fsl_mc_io *mc_io,
1788 				     uint32_t cmd_flags,
1789 				     uint16_t token,
1790 				     enum dpni_queue_type qtype,
1791 				     uint8_t tc_id,
1792 			const struct dpni_congestion_notification_cfg *cfg)
1793 {
1794 	struct dpni_cmd_set_congestion_notification *cmd_params;
1795 	struct mc_command cmd = { 0 };
1796 
1797 	/* prepare command */
1798 	cmd.header = mc_encode_cmd_header(
1799 					DPNI_CMDID_SET_CONGESTION_NOTIFICATION,
1800 					cmd_flags,
1801 					token);
1802 	cmd_params = (struct dpni_cmd_set_congestion_notification *)cmd.params;
1803 	cmd_params->qtype = qtype;
1804 	cmd_params->tc = tc_id;
1805 	cmd_params->congestion_point = cfg->cg_point;
1806 	cmd_params->cgid = (uint8_t)cfg->cgid;
1807 	cmd_params->dest_id = cpu_to_le32(cfg->dest_cfg.dest_id);
1808 	cmd_params->notification_mode = cpu_to_le16(cfg->notification_mode);
1809 	cmd_params->dest_priority = cfg->dest_cfg.priority;
1810 	cmd_params->message_iova = cpu_to_le64(cfg->message_iova);
1811 	cmd_params->message_ctx = cpu_to_le64(cfg->message_ctx);
1812 	cmd_params->threshold_entry = cpu_to_le32(cfg->threshold_entry);
1813 	cmd_params->threshold_exit = cpu_to_le32(cfg->threshold_exit);
1814 	dpni_set_field(cmd_params->type_units,
1815 		       DEST_TYPE,
1816 		       cfg->dest_cfg.dest_type);
1817 	dpni_set_field(cmd_params->type_units,
1818 		       CONG_UNITS,
1819 		       cfg->units);
1820 
1821 	/* send command to mc*/
1822 	return mc_send_command(mc_io, &cmd);
1823 }
1824 
1825 /**
1826  * dpni_get_congestion_notification() - Get traffic class congestion
1827  *	notification configuration
1828  * @mc_io:	Pointer to MC portal's I/O object
1829  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1830  * @token:	Token of DPNI object
1831  * @qtype:	Type of queue - Rx, Tx and Tx confirm types are supported
1832  * @tc_id:	Traffic class selection (0-7)
1833  * @cfg:	congestion notification configuration
1834  *
1835  * Return:	'0' on Success; error code otherwise.
1836  */
1837 int dpni_get_congestion_notification(struct fsl_mc_io *mc_io,
1838 				     uint32_t cmd_flags,
1839 				     uint16_t token,
1840 				     enum dpni_queue_type qtype,
1841 				     uint8_t tc_id,
1842 				struct dpni_congestion_notification_cfg *cfg)
1843 {
1844 	struct dpni_rsp_get_congestion_notification *rsp_params;
1845 	struct dpni_cmd_get_congestion_notification *cmd_params;
1846 	struct mc_command cmd = { 0 };
1847 	int err;
1848 
1849 	/* prepare command */
1850 	cmd.header = mc_encode_cmd_header(
1851 					DPNI_CMDID_GET_CONGESTION_NOTIFICATION,
1852 					cmd_flags,
1853 					token);
1854 	cmd_params = (struct dpni_cmd_get_congestion_notification *)cmd.params;
1855 	cmd_params->qtype = qtype;
1856 	cmd_params->tc = tc_id;
1857 	cmd_params->congestion_point = cfg->cg_point;
1858 	cmd_params->cgid = cfg->cgid;
1859 
1860 	/* send command to mc*/
1861 	err = mc_send_command(mc_io, &cmd);
1862 	if (err)
1863 		return err;
1864 
1865 	rsp_params = (struct dpni_rsp_get_congestion_notification *)cmd.params;
1866 	cfg->units = dpni_get_field(rsp_params->type_units, CONG_UNITS);
1867 	cfg->threshold_entry = le32_to_cpu(rsp_params->threshold_entry);
1868 	cfg->threshold_exit = le32_to_cpu(rsp_params->threshold_exit);
1869 	cfg->message_ctx = le64_to_cpu(rsp_params->message_ctx);
1870 	cfg->message_iova = le64_to_cpu(rsp_params->message_iova);
1871 	cfg->notification_mode = le16_to_cpu(rsp_params->notification_mode);
1872 	cfg->dest_cfg.dest_id = le32_to_cpu(rsp_params->dest_id);
1873 	cfg->dest_cfg.priority = rsp_params->dest_priority;
1874 	cfg->dest_cfg.dest_type = dpni_get_field(rsp_params->type_units,
1875 						 DEST_TYPE);
1876 
1877 	return 0;
1878 }
1879 
1880 /**
1881  * dpni_get_api_version() - Get Data Path Network Interface API version
1882  * @mc_io:  Pointer to MC portal's I/O object
1883  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1884  * @major_ver:	Major version of data path network interface API
1885  * @minor_ver:	Minor version of data path network interface API
1886  *
1887  * Return:  '0' on Success; Error code otherwise.
1888  */
1889 int dpni_get_api_version(struct fsl_mc_io *mc_io,
1890 			 uint32_t cmd_flags,
1891 			 uint16_t *major_ver,
1892 			 uint16_t *minor_ver)
1893 {
1894 	struct dpni_rsp_get_api_version *rsp_params;
1895 	struct mc_command cmd = { 0 };
1896 	int err;
1897 
1898 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_API_VERSION,
1899 					cmd_flags,
1900 					0);
1901 
1902 	err = mc_send_command(mc_io, &cmd);
1903 	if (err)
1904 		return err;
1905 
1906 	rsp_params = (struct dpni_rsp_get_api_version *)cmd.params;
1907 	*major_ver = le16_to_cpu(rsp_params->major);
1908 	*minor_ver = le16_to_cpu(rsp_params->minor);
1909 
1910 	return 0;
1911 }
1912 
1913 /**
1914  * dpni_set_queue() - Set queue parameters
1915  * @mc_io:	Pointer to MC portal's I/O object
1916  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1917  * @token:	Token of DPNI object
1918  * @qtype:	Type of queue - all queue types are supported, although
1919  *		the command is ignored for Tx
1920  * @tc:		Traffic class, in range 0 to NUM_TCS - 1
1921  * @index:	Selects the specific queue out of the set allocated for the
1922  *		same TC. Value must be in range 0 to NUM_QUEUES - 1
1923  * @options:	A combination of DPNI_QUEUE_OPT_ values that control what
1924  *		configuration options are set on the queue
1925  * @queue:	Queue structure
1926  *
1927  * Return:	'0' on Success; Error code otherwise.
1928  */
1929 int dpni_set_queue(struct fsl_mc_io *mc_io,
1930 		   uint32_t cmd_flags,
1931 		   uint16_t token,
1932 		   enum dpni_queue_type qtype,
1933 		   uint8_t tc,
1934 		   uint8_t index,
1935 		   uint8_t options,
1936 		   const struct dpni_queue *queue)
1937 {
1938 	struct mc_command cmd = { 0 };
1939 	struct dpni_cmd_set_queue *cmd_params;
1940 
1941 	/* prepare command */
1942 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_QUEUE,
1943 					  cmd_flags,
1944 					  token);
1945 	cmd_params = (struct dpni_cmd_set_queue *)cmd.params;
1946 	cmd_params->qtype = qtype;
1947 	cmd_params->tc = tc;
1948 	cmd_params->index = index;
1949 	cmd_params->options = options;
1950 	cmd_params->dest_id = cpu_to_le32(queue->destination.id);
1951 	cmd_params->dest_prio = queue->destination.priority;
1952 	dpni_set_field(cmd_params->flags, DEST_TYPE, queue->destination.type);
1953 	dpni_set_field(cmd_params->flags, STASH_CTRL, queue->flc.stash_control);
1954 	dpni_set_field(cmd_params->flags, HOLD_ACTIVE,
1955 		       queue->destination.hold_active);
1956 	cmd_params->flc = cpu_to_le64(queue->flc.value);
1957 	cmd_params->user_context = cpu_to_le64(queue->user_context);
1958 	cmd_params->cgid = queue->cgid;
1959 
1960 	/* send command to mc */
1961 	return mc_send_command(mc_io, &cmd);
1962 }
1963 
1964 /**
1965  * dpni_get_queue() - Get queue parameters
1966  * @mc_io:	Pointer to MC portal's I/O object
1967  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1968  * @token:	Token of DPNI object
1969  * @qtype:	Type of queue - all queue types are supported
1970  * @tc:		Traffic class, in range 0 to NUM_TCS - 1
1971  * @index:	Selects the specific queue out of the set allocated for the
1972  *		same TC. Value must be in range 0 to NUM_QUEUES - 1
1973  * @queue:	Queue configuration structure
1974  * @qid:	Queue identification
1975  *
1976  * Return:	'0' on Success; Error code otherwise.
1977  */
1978 int dpni_get_queue(struct fsl_mc_io *mc_io,
1979 		   uint32_t cmd_flags,
1980 		   uint16_t token,
1981 		   enum dpni_queue_type qtype,
1982 		   uint8_t tc,
1983 		   uint8_t index,
1984 		   struct dpni_queue *queue,
1985 		   struct dpni_queue_id *qid)
1986 {
1987 	struct mc_command cmd = { 0 };
1988 	struct dpni_cmd_get_queue *cmd_params;
1989 	struct dpni_rsp_get_queue *rsp_params;
1990 	int err;
1991 
1992 	/* prepare command */
1993 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_QUEUE,
1994 					  cmd_flags,
1995 					  token);
1996 	cmd_params = (struct dpni_cmd_get_queue *)cmd.params;
1997 	cmd_params->qtype = qtype;
1998 	cmd_params->tc = tc;
1999 	cmd_params->index = index;
2000 
2001 	/* send command to mc */
2002 	err = mc_send_command(mc_io, &cmd);
2003 	if (err)
2004 		return err;
2005 
2006 	/* retrieve response parameters */
2007 	rsp_params = (struct dpni_rsp_get_queue *)cmd.params;
2008 	queue->destination.id = le32_to_cpu(rsp_params->dest_id);
2009 	queue->destination.priority = rsp_params->dest_prio;
2010 	queue->destination.type = dpni_get_field(rsp_params->flags,
2011 						     DEST_TYPE);
2012 	queue->flc.stash_control = dpni_get_field(rsp_params->flags,
2013 						  STASH_CTRL);
2014 	queue->destination.hold_active = dpni_get_field(rsp_params->flags,
2015 							HOLD_ACTIVE);
2016 	queue->flc.value = le64_to_cpu(rsp_params->flc);
2017 	queue->user_context = le64_to_cpu(rsp_params->user_context);
2018 	qid->fqid = le32_to_cpu(rsp_params->fqid);
2019 	qid->qdbin = le16_to_cpu(rsp_params->qdbin);
2020 	if (dpni_get_field(rsp_params->flags, CGID_VALID))
2021 		queue->cgid = rsp_params->cgid;
2022 	else
2023 		queue->cgid = -1;
2024 
2025 	return 0;
2026 }
2027 
2028 /**
2029  * dpni_get_statistics() - Get DPNI statistics
2030  * @mc_io:	Pointer to MC portal's I/O object
2031  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
2032  * @token:	Token of DPNI object
2033  * @page:	Selects the statistics page to retrieve, see
2034  *		DPNI_GET_STATISTICS output. Pages are numbered 0 to 3.
2035  * @param:	Custom parameter for some pages used to select
2036  *		a certain statistic source, for example the TC.
2037  * @stat:	Structure containing the statistics
2038  *
2039  * Return:	'0' on Success; Error code otherwise.
2040  */
2041 int dpni_get_statistics(struct fsl_mc_io *mc_io,
2042 			uint32_t cmd_flags,
2043 			uint16_t token,
2044 			uint8_t page,
2045 			uint16_t param,
2046 			union dpni_statistics *stat)
2047 {
2048 	struct mc_command cmd = { 0 };
2049 	struct dpni_cmd_get_statistics *cmd_params;
2050 	struct dpni_rsp_get_statistics *rsp_params;
2051 	int i, err;
2052 
2053 	/* prepare command */
2054 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_STATISTICS,
2055 					  cmd_flags,
2056 					  token);
2057 	cmd_params = (struct dpni_cmd_get_statistics *)cmd.params;
2058 	cmd_params->page_number = page;
2059 	cmd_params->param = param;
2060 
2061 	/* send command to mc */
2062 	err = mc_send_command(mc_io, &cmd);
2063 	if (err)
2064 		return err;
2065 
2066 	/* retrieve response parameters */
2067 	rsp_params = (struct dpni_rsp_get_statistics *)cmd.params;
2068 	for (i = 0; i < DPNI_STATISTICS_CNT; i++)
2069 		stat->raw.counter[i] = le64_to_cpu(rsp_params->counter[i]);
2070 
2071 	return 0;
2072 }
2073 
2074 /**
2075  * dpni_reset_statistics() - Clears DPNI statistics
2076  * @mc_io:		Pointer to MC portal's I/O object
2077  * @cmd_flags:		Command flags; one or more of 'MC_CMD_FLAG_'
2078  * @token:		Token of DPNI object
2079  *
2080  * Return:  '0' on Success; Error code otherwise.
2081  */
2082 int dpni_reset_statistics(struct fsl_mc_io *mc_io,
2083 			  uint32_t cmd_flags,
2084 		     uint16_t token)
2085 {
2086 	struct mc_command cmd = { 0 };
2087 
2088 	/* prepare command */
2089 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_RESET_STATISTICS,
2090 					  cmd_flags,
2091 					  token);
2092 
2093 	/* send command to mc*/
2094 	return mc_send_command(mc_io, &cmd);
2095 }
2096 
2097 /**
2098  * dpni_set_taildrop() - Set taildrop per queue or TC
2099  *
2100  * Setting a per-TC taildrop (cg_point = DPNI_CP_GROUP) will reset any current
2101  * congestion notification or early drop (WRED) configuration previously applied
2102  * to the same TC.
2103  *
2104  * @mc_io:	Pointer to MC portal's I/O object
2105  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
2106  * @token:	Token of DPNI object
2107  * @cg_point:	Congestion point, DPNI_CP_QUEUE is only supported in
2108  *		combination with DPNI_QUEUE_RX.
2109  * @q_type:	Queue type, can be DPNI_QUEUE_RX or DPNI_QUEUE_TX.
2110  * @tc:		Traffic class to apply this taildrop to
2111  * @q_index:	Index of the queue if the DPNI supports multiple queues for
2112  *		traffic distribution.
2113  *		Ignored if CONGESTION_POINT is not DPNI_CP_QUEUE.
2114  * @taildrop:	Taildrop structure
2115  *
2116  * Return:	'0' on Success; Error code otherwise.
2117  */
2118 int dpni_set_taildrop(struct fsl_mc_io *mc_io,
2119 		      uint32_t cmd_flags,
2120 		      uint16_t token,
2121 		      enum dpni_congestion_point cg_point,
2122 		      enum dpni_queue_type qtype,
2123 		      uint8_t tc,
2124 		      uint8_t index,
2125 		      struct dpni_taildrop *taildrop)
2126 {
2127 	struct mc_command cmd = { 0 };
2128 	struct dpni_cmd_set_taildrop *cmd_params;
2129 
2130 	/* prepare command */
2131 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_TAILDROP,
2132 					  cmd_flags,
2133 					  token);
2134 	cmd_params = (struct dpni_cmd_set_taildrop *)cmd.params;
2135 	cmd_params->congestion_point = cg_point;
2136 	cmd_params->qtype = qtype;
2137 	cmd_params->tc = tc;
2138 	cmd_params->index = index;
2139 	cmd_params->units = taildrop->units;
2140 	cmd_params->threshold = cpu_to_le32(taildrop->threshold);
2141 	dpni_set_field(cmd_params->enable_oal_lo, ENABLE, taildrop->enable);
2142 	dpni_set_field(cmd_params->enable_oal_lo, OAL_LO, taildrop->oal);
2143 	dpni_set_field(cmd_params->oal_hi,
2144 		       OAL_HI,
2145 		       taildrop->oal >> DPNI_OAL_LO_SIZE);
2146 
2147 	/* send command to mc */
2148 	return mc_send_command(mc_io, &cmd);
2149 }
2150 
2151 /**
2152  * dpni_get_taildrop() - Get taildrop information
2153  * @mc_io:	Pointer to MC portal's I/O object
2154  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
2155  * @token:	Token of DPNI object
2156  * @cg_point:	Congestion point
2157  * @q_type:	Queue type on which the taildrop is configured.
2158  *		Only Rx queues are supported for now
2159  * @tc:		Traffic class to apply this taildrop to
2160  * @q_index:	Index of the queue if the DPNI supports multiple queues for
2161  *		traffic distribution. Ignored if CONGESTION_POINT is not 0.
2162  * @taildrop:	Taildrop structure
2163  *
2164  * Return:	'0' on Success; Error code otherwise.
2165  */
2166 int dpni_get_taildrop(struct fsl_mc_io *mc_io,
2167 		      uint32_t cmd_flags,
2168 		      uint16_t token,
2169 		      enum dpni_congestion_point cg_point,
2170 		      enum dpni_queue_type qtype,
2171 		      uint8_t tc,
2172 		      uint8_t index,
2173 		      struct dpni_taildrop *taildrop)
2174 {
2175 	struct mc_command cmd = { 0 };
2176 	struct dpni_cmd_get_taildrop *cmd_params;
2177 	struct dpni_rsp_get_taildrop *rsp_params;
2178 	uint8_t oal_lo, oal_hi;
2179 	int err;
2180 
2181 	/* prepare command */
2182 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_TAILDROP,
2183 					  cmd_flags,
2184 					  token);
2185 	cmd_params = (struct dpni_cmd_get_taildrop *)cmd.params;
2186 	cmd_params->congestion_point = cg_point;
2187 	cmd_params->qtype = qtype;
2188 	cmd_params->tc = tc;
2189 	cmd_params->index = index;
2190 
2191 	/* send command to mc */
2192 	err = mc_send_command(mc_io, &cmd);
2193 	if (err)
2194 		return err;
2195 
2196 	/* retrieve response parameters */
2197 	rsp_params = (struct dpni_rsp_get_taildrop *)cmd.params;
2198 	taildrop->enable = dpni_get_field(rsp_params->enable_oal_lo, ENABLE);
2199 	taildrop->units = rsp_params->units;
2200 	taildrop->threshold = le32_to_cpu(rsp_params->threshold);
2201 	oal_lo = dpni_get_field(rsp_params->enable_oal_lo, OAL_LO);
2202 	oal_hi = dpni_get_field(rsp_params->oal_hi, OAL_HI);
2203 	taildrop->oal = oal_hi << DPNI_OAL_LO_SIZE | oal_lo;
2204 
2205 	/* Fill the first 4 bits, 'oal' is a 2's complement value of 12 bits */
2206 	if (taildrop->oal >= 0x0800)
2207 		taildrop->oal |= 0xF000;
2208 
2209 	return 0;
2210 }
2211 
2212 /**
2213  * dpni_set_opr() - Set Order Restoration configuration.
2214  * @mc_io:	Pointer to MC portal's I/O object
2215  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
2216  * @token:	Token of DPNI object
2217  * @tc:		Traffic class, in range 0 to NUM_TCS - 1
2218  * @index:	Selects the specific queue out of the set allocated
2219  *			for the same TC. Value must be in range 0 to
2220  *			NUM_QUEUES - 1
2221  * @options:	Configuration mode options
2222  *			can be OPR_OPT_CREATE or OPR_OPT_RETIRE
2223  * @cfg:	Configuration options for the OPR
2224  *
2225  * Return:	'0' on Success; Error code otherwise.
2226  */
2227 int dpni_set_opr(struct fsl_mc_io *mc_io,
2228 		 uint32_t cmd_flags,
2229 		 uint16_t token,
2230 		 uint8_t tc,
2231 		 uint8_t index,
2232 		 uint8_t options,
2233 		 struct opr_cfg *cfg)
2234 {
2235 	struct dpni_cmd_set_opr *cmd_params;
2236 	struct mc_command cmd = { 0 };
2237 
2238 	/* prepare command */
2239 	cmd.header = mc_encode_cmd_header(
2240 			DPNI_CMDID_SET_OPR,
2241 			cmd_flags,
2242 			token);
2243 	cmd_params = (struct dpni_cmd_set_opr *)cmd.params;
2244 	cmd_params->tc_id = tc;
2245 	cmd_params->index = index;
2246 	cmd_params->options = options;
2247 	cmd_params->oloe = cfg->oloe;
2248 	cmd_params->oeane = cfg->oeane;
2249 	cmd_params->olws = cfg->olws;
2250 	cmd_params->oa = cfg->oa;
2251 	cmd_params->oprrws = cfg->oprrws;
2252 
2253 	/* send command to mc*/
2254 	return mc_send_command(mc_io, &cmd);
2255 }
2256 
2257 /**
2258  * dpni_get_opr() - Retrieve Order Restoration config and query.
2259  * @mc_io:	Pointer to MC portal's I/O object
2260  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
2261  * @token:	Token of DPNI object
2262  * @tc:		Traffic class, in range 0 to NUM_TCS - 1
2263  * @index:	Selects the specific queue out of the set allocated
2264  *			for the same TC. Value must be in range 0 to
2265  *			NUM_QUEUES - 1
2266  * @cfg:	Returned OPR configuration
2267  * @qry:	Returned OPR query
2268  *
2269  * Return:	'0' on Success; Error code otherwise.
2270  */
2271 int dpni_get_opr(struct fsl_mc_io *mc_io,
2272 		 uint32_t cmd_flags,
2273 		 uint16_t token,
2274 		 uint8_t tc,
2275 		 uint8_t index,
2276 		 struct opr_cfg *cfg,
2277 		 struct opr_qry *qry)
2278 {
2279 	struct dpni_rsp_get_opr *rsp_params;
2280 	struct dpni_cmd_get_opr *cmd_params;
2281 	struct mc_command cmd = { 0 };
2282 	int err;
2283 
2284 	/* prepare command */
2285 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_OPR,
2286 					  cmd_flags,
2287 					  token);
2288 	cmd_params = (struct dpni_cmd_get_opr *)cmd.params;
2289 	cmd_params->index = index;
2290 	cmd_params->tc_id = tc;
2291 
2292 	/* send command to mc*/
2293 	err = mc_send_command(mc_io, &cmd);
2294 	if (err)
2295 		return err;
2296 
2297 	/* retrieve response parameters */
2298 	rsp_params = (struct dpni_rsp_get_opr *)cmd.params;
2299 	cfg->oloe = rsp_params->oloe;
2300 	cfg->oeane = rsp_params->oeane;
2301 	cfg->olws = rsp_params->olws;
2302 	cfg->oa = rsp_params->oa;
2303 	cfg->oprrws = rsp_params->oprrws;
2304 	qry->rip = dpni_get_field(rsp_params->flags, RIP);
2305 	qry->enable = dpni_get_field(rsp_params->flags, OPR_ENABLE);
2306 	qry->nesn = le16_to_cpu(rsp_params->nesn);
2307 	qry->ndsn = le16_to_cpu(rsp_params->ndsn);
2308 	qry->ea_tseq = le16_to_cpu(rsp_params->ea_tseq);
2309 	qry->tseq_nlis = dpni_get_field(rsp_params->tseq_nlis, TSEQ_NLIS);
2310 	qry->ea_hseq = le16_to_cpu(rsp_params->ea_hseq);
2311 	qry->hseq_nlis = dpni_get_field(rsp_params->hseq_nlis, HSEQ_NLIS);
2312 	qry->ea_hptr = le16_to_cpu(rsp_params->ea_hptr);
2313 	qry->ea_tptr = le16_to_cpu(rsp_params->ea_tptr);
2314 	qry->opr_vid = le16_to_cpu(rsp_params->opr_vid);
2315 	qry->opr_id = le16_to_cpu(rsp_params->opr_id);
2316 
2317 	return 0;
2318 }
2319 
2320 /**
2321  * dpni_set_rx_fs_dist() - Set Rx traffic class FS distribution
2322  * @mc_io:	Pointer to MC portal's I/O object
2323  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
2324  * @token:	Token of DPNI object
2325  * @cfg: Distribution configuration
2326  * If the FS is already enabled with a previous call the classification
2327  *		key will be changed but all the table rules are kept. If the
2328  *		existing rules do not match the key the results will not be
2329  *		predictable. It is the user responsibility to keep key integrity
2330  * If cfg.enable is set to 1 the command will create a flow steering table
2331  *		and will classify packets according to this table. The packets
2332  *		that miss all the table rules will be classified according to
2333  *		settings made in dpni_set_rx_hash_dist()
2334  * If cfg.enable is set to 0 the command will clear flow steering table. The
2335  *		packets will be classified according to settings made in
2336  *		dpni_set_rx_hash_dist()
2337  */
2338 int dpni_set_rx_fs_dist(struct fsl_mc_io *mc_io, uint32_t cmd_flags,
2339 		uint16_t token, const struct dpni_rx_dist_cfg *cfg)
2340 {
2341 	struct dpni_cmd_set_rx_fs_dist *cmd_params;
2342 	struct mc_command cmd = { 0 };
2343 
2344 	/* prepare command */
2345 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_RX_FS_DIST,
2346 					  cmd_flags,
2347 					  token);
2348 	cmd_params = (struct dpni_cmd_set_rx_fs_dist *)cmd.params;
2349 	cmd_params->dist_size	= cpu_to_le16(cfg->dist_size);
2350 	dpni_set_field(cmd_params->enable, RX_FS_DIST_ENABLE, cfg->enable);
2351 	cmd_params->tc = cfg->tc;
2352 	cmd_params->miss_flow_id = cpu_to_le16(cfg->fs_miss_flow_id);
2353 	cmd_params->key_cfg_iova = cpu_to_le64(cfg->key_cfg_iova);
2354 
2355 	/* send command to mc*/
2356 	return mc_send_command(mc_io, &cmd);
2357 }
2358 
2359 /**
2360  * dpni_set_rx_hash_dist() - Set Rx traffic class HASH distribution
2361  * @mc_io:	Pointer to MC portal's I/O object
2362  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
2363  * @token:	Token of DPNI object
2364  * @cfg: Distribution configuration
2365  * If cfg.enable is set to 1 the packets will be classified using a hash
2366  *		function based on the key received in cfg.key_cfg_iova parameter
2367  * If cfg.enable is set to 0 the packets will be sent to the queue configured in
2368  *		dpni_set_rx_dist_default_queue() call
2369  */
2370 int dpni_set_rx_hash_dist(struct fsl_mc_io *mc_io, uint32_t cmd_flags,
2371 		uint16_t token, const struct dpni_rx_dist_cfg *cfg)
2372 {
2373 	struct dpni_cmd_set_rx_hash_dist *cmd_params;
2374 	struct mc_command cmd = { 0 };
2375 
2376 	/* prepare command */
2377 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_RX_HASH_DIST,
2378 					  cmd_flags,
2379 					  token);
2380 	cmd_params = (struct dpni_cmd_set_rx_hash_dist *)cmd.params;
2381 	cmd_params->dist_size	= cpu_to_le16(cfg->dist_size);
2382 	dpni_set_field(cmd_params->enable, RX_FS_DIST_ENABLE, cfg->enable);
2383 	cmd_params->tc_id		= cfg->tc;
2384 	cmd_params->key_cfg_iova = cpu_to_le64(cfg->key_cfg_iova);
2385 
2386 	/* send command to mc*/
2387 	return mc_send_command(mc_io, &cmd);
2388 }
2389 
2390 /**
2391  * dpni_add_custom_tpid() - Configures a distinct Ethertype value
2392  *		(or TPID value) to indicate VLAN tag in addition to the common
2393  *		TPID values 0x8100 and 0x88A8
2394  * @mc_io:	Pointer to MC portal's I/O object
2395  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
2396  * @token:	Token of DPNI object
2397  * @tpid:	New value for TPID
2398  *
2399  * Only two custom values are accepted. If the function is called for the third
2400  * time it will return error.
2401  * To replace an existing value use dpni_remove_custom_tpid() to remove
2402  * a previous TPID and after that use again the function.
2403  *
2404  * Return:	'0' on Success; Error code otherwise.
2405  */
2406 int dpni_add_custom_tpid(struct fsl_mc_io *mc_io, uint32_t cmd_flags,
2407 		uint16_t token, uint16_t tpid)
2408 {
2409 	struct dpni_cmd_add_custom_tpid *cmd_params;
2410 	struct mc_command cmd = { 0 };
2411 
2412 	/* prepare command */
2413 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_ADD_CUSTOM_TPID,
2414 					  cmd_flags,
2415 					  token);
2416 	cmd_params = (struct dpni_cmd_add_custom_tpid *)cmd.params;
2417 	cmd_params->tpid = cpu_to_le16(tpid);
2418 
2419 	/* send command to mc*/
2420 	return mc_send_command(mc_io, &cmd);
2421 }
2422 
2423 /**
2424  * dpni_remove_custom_tpid() - Removes a distinct Ethertype value added
2425  *		previously with dpni_add_custom_tpid()
2426  * @mc_io:	Pointer to MC portal's I/O object
2427  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
2428  * @token:	Token of DPNI object
2429  * @tpid:	New value for TPID
2430  *
2431  * Use this function when a TPID value added with dpni_add_custom_tpid() needs
2432  * to be replaced.
2433  *
2434  * Return:	'0' on Success; Error code otherwise.
2435  */
2436 int dpni_remove_custom_tpid(struct fsl_mc_io *mc_io, uint32_t cmd_flags,
2437 		uint16_t token, uint16_t tpid)
2438 {
2439 	struct dpni_cmd_remove_custom_tpid *cmd_params;
2440 	struct mc_command cmd = { 0 };
2441 
2442 	/* prepare command */
2443 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_REMOVE_CUSTOM_TPID,
2444 					  cmd_flags,
2445 					  token);
2446 	cmd_params = (struct dpni_cmd_remove_custom_tpid *)cmd.params;
2447 	cmd_params->tpid = cpu_to_le16(tpid);
2448 
2449 	/* send command to mc*/
2450 	return mc_send_command(mc_io, &cmd);
2451 }
2452 
2453 /**
2454  * dpni_get_custom_tpid() - Returns custom TPID (vlan tags) values configured
2455  *				to detect 802.1q frames
2456  * @mc_io:	Pointer to MC portal's I/O object
2457  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
2458  * @token:	Token of DPNI object
2459  * @tpid:	TPID values. Only nonzero members of the structure are valid.
2460  *
2461  * Return:	'0' on Success; Error code otherwise.
2462  */
2463 int dpni_get_custom_tpid(struct fsl_mc_io *mc_io, uint32_t cmd_flags,
2464 		uint16_t token, struct dpni_custom_tpid_cfg *tpid)
2465 {
2466 	struct dpni_rsp_get_custom_tpid *rsp_params;
2467 	struct mc_command cmd = { 0 };
2468 	int err;
2469 
2470 	/* prepare command */
2471 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_CUSTOM_TPID,
2472 					  cmd_flags,
2473 					  token);
2474 
2475 	/* send command to mc*/
2476 	err = mc_send_command(mc_io, &cmd);
2477 	if (err)
2478 		return err;
2479 
2480 	/* read command response */
2481 	rsp_params = (struct dpni_rsp_get_custom_tpid *)cmd.params;
2482 	tpid->tpid1 = le16_to_cpu(rsp_params->tpid1);
2483 	tpid->tpid2 = le16_to_cpu(rsp_params->tpid2);
2484 
2485 	return err;
2486 }
2487