162306a36Sopenharmony_ci// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
262306a36Sopenharmony_ci/* Copyright 2013-2016 Freescale Semiconductor Inc.
362306a36Sopenharmony_ci * Copyright 2016 NXP
462306a36Sopenharmony_ci * Copyright 2020 NXP
562306a36Sopenharmony_ci */
662306a36Sopenharmony_ci#include <linux/kernel.h>
762306a36Sopenharmony_ci#include <linux/errno.h>
862306a36Sopenharmony_ci#include <linux/fsl/mc.h>
962306a36Sopenharmony_ci#include "dpni.h"
1062306a36Sopenharmony_ci#include "dpni-cmd.h"
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci/**
1362306a36Sopenharmony_ci * dpni_prepare_key_cfg() - function prepare extract parameters
1462306a36Sopenharmony_ci * @cfg: defining a full Key Generation profile (rule)
1562306a36Sopenharmony_ci * @key_cfg_buf: Zeroed 256 bytes of memory before mapping it to DMA
1662306a36Sopenharmony_ci *
1762306a36Sopenharmony_ci * This function has to be called before the following functions:
1862306a36Sopenharmony_ci *	- dpni_set_rx_tc_dist()
1962306a36Sopenharmony_ci *	- dpni_set_qos_table()
2062306a36Sopenharmony_ci *
2162306a36Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
2262306a36Sopenharmony_ci */
2362306a36Sopenharmony_ciint dpni_prepare_key_cfg(const struct dpkg_profile_cfg *cfg, u8 *key_cfg_buf)
2462306a36Sopenharmony_ci{
2562306a36Sopenharmony_ci	int i, j;
2662306a36Sopenharmony_ci	struct dpni_ext_set_rx_tc_dist *dpni_ext;
2762306a36Sopenharmony_ci	struct dpni_dist_extract *extr;
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci	if (cfg->num_extracts > DPKG_MAX_NUM_OF_EXTRACTS)
3062306a36Sopenharmony_ci		return -EINVAL;
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci	dpni_ext = (struct dpni_ext_set_rx_tc_dist *)key_cfg_buf;
3362306a36Sopenharmony_ci	dpni_ext->num_extracts = cfg->num_extracts;
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci	for (i = 0; i < cfg->num_extracts; i++) {
3662306a36Sopenharmony_ci		extr = &dpni_ext->extracts[i];
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci		switch (cfg->extracts[i].type) {
3962306a36Sopenharmony_ci		case DPKG_EXTRACT_FROM_HDR:
4062306a36Sopenharmony_ci			extr->prot = cfg->extracts[i].extract.from_hdr.prot;
4162306a36Sopenharmony_ci			dpni_set_field(extr->efh_type, EFH_TYPE,
4262306a36Sopenharmony_ci				       cfg->extracts[i].extract.from_hdr.type);
4362306a36Sopenharmony_ci			extr->size = cfg->extracts[i].extract.from_hdr.size;
4462306a36Sopenharmony_ci			extr->offset = cfg->extracts[i].extract.from_hdr.offset;
4562306a36Sopenharmony_ci			extr->field = cpu_to_le32(
4662306a36Sopenharmony_ci				cfg->extracts[i].extract.from_hdr.field);
4762306a36Sopenharmony_ci			extr->hdr_index =
4862306a36Sopenharmony_ci				cfg->extracts[i].extract.from_hdr.hdr_index;
4962306a36Sopenharmony_ci			break;
5062306a36Sopenharmony_ci		case DPKG_EXTRACT_FROM_DATA:
5162306a36Sopenharmony_ci			extr->size = cfg->extracts[i].extract.from_data.size;
5262306a36Sopenharmony_ci			extr->offset =
5362306a36Sopenharmony_ci				cfg->extracts[i].extract.from_data.offset;
5462306a36Sopenharmony_ci			break;
5562306a36Sopenharmony_ci		case DPKG_EXTRACT_FROM_PARSE:
5662306a36Sopenharmony_ci			extr->size = cfg->extracts[i].extract.from_parse.size;
5762306a36Sopenharmony_ci			extr->offset =
5862306a36Sopenharmony_ci				cfg->extracts[i].extract.from_parse.offset;
5962306a36Sopenharmony_ci			break;
6062306a36Sopenharmony_ci		default:
6162306a36Sopenharmony_ci			return -EINVAL;
6262306a36Sopenharmony_ci		}
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_ci		extr->num_of_byte_masks = cfg->extracts[i].num_of_byte_masks;
6562306a36Sopenharmony_ci		dpni_set_field(extr->extract_type, EXTRACT_TYPE,
6662306a36Sopenharmony_ci			       cfg->extracts[i].type);
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_ci		for (j = 0; j < DPKG_NUM_OF_MASKS; j++) {
6962306a36Sopenharmony_ci			extr->masks[j].mask = cfg->extracts[i].masks[j].mask;
7062306a36Sopenharmony_ci			extr->masks[j].offset =
7162306a36Sopenharmony_ci				cfg->extracts[i].masks[j].offset;
7262306a36Sopenharmony_ci		}
7362306a36Sopenharmony_ci	}
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_ci	return 0;
7662306a36Sopenharmony_ci}
7762306a36Sopenharmony_ci
7862306a36Sopenharmony_ci/**
7962306a36Sopenharmony_ci * dpni_open() - Open a control session for the specified object
8062306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
8162306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
8262306a36Sopenharmony_ci * @dpni_id:	DPNI unique ID
8362306a36Sopenharmony_ci * @token:	Returned token; use in subsequent API calls
8462306a36Sopenharmony_ci *
8562306a36Sopenharmony_ci * This function can be used to open a control session for an
8662306a36Sopenharmony_ci * already created object; an object may have been declared in
8762306a36Sopenharmony_ci * the DPL or by calling the dpni_create() function.
8862306a36Sopenharmony_ci * This function returns a unique authentication token,
8962306a36Sopenharmony_ci * associated with the specific object ID and the specific MC
9062306a36Sopenharmony_ci * portal; this token must be used in all subsequent commands for
9162306a36Sopenharmony_ci * this specific object.
9262306a36Sopenharmony_ci *
9362306a36Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
9462306a36Sopenharmony_ci */
9562306a36Sopenharmony_ciint dpni_open(struct fsl_mc_io *mc_io,
9662306a36Sopenharmony_ci	      u32 cmd_flags,
9762306a36Sopenharmony_ci	      int dpni_id,
9862306a36Sopenharmony_ci	      u16 *token)
9962306a36Sopenharmony_ci{
10062306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
10162306a36Sopenharmony_ci	struct dpni_cmd_open *cmd_params;
10262306a36Sopenharmony_ci
10362306a36Sopenharmony_ci	int err;
10462306a36Sopenharmony_ci
10562306a36Sopenharmony_ci	/* prepare command */
10662306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPNI_CMDID_OPEN,
10762306a36Sopenharmony_ci					  cmd_flags,
10862306a36Sopenharmony_ci					  0);
10962306a36Sopenharmony_ci	cmd_params = (struct dpni_cmd_open *)cmd.params;
11062306a36Sopenharmony_ci	cmd_params->dpni_id = cpu_to_le32(dpni_id);
11162306a36Sopenharmony_ci
11262306a36Sopenharmony_ci	/* send command to mc*/
11362306a36Sopenharmony_ci	err = mc_send_command(mc_io, &cmd);
11462306a36Sopenharmony_ci	if (err)
11562306a36Sopenharmony_ci		return err;
11662306a36Sopenharmony_ci
11762306a36Sopenharmony_ci	/* retrieve response parameters */
11862306a36Sopenharmony_ci	*token = mc_cmd_hdr_read_token(&cmd);
11962306a36Sopenharmony_ci
12062306a36Sopenharmony_ci	return 0;
12162306a36Sopenharmony_ci}
12262306a36Sopenharmony_ci
12362306a36Sopenharmony_ci/**
12462306a36Sopenharmony_ci * dpni_close() - Close the control session of the object
12562306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
12662306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
12762306a36Sopenharmony_ci * @token:	Token of DPNI object
12862306a36Sopenharmony_ci *
12962306a36Sopenharmony_ci * After this function is called, no further operations are
13062306a36Sopenharmony_ci * allowed on the object without opening a new control session.
13162306a36Sopenharmony_ci *
13262306a36Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
13362306a36Sopenharmony_ci */
13462306a36Sopenharmony_ciint dpni_close(struct fsl_mc_io *mc_io,
13562306a36Sopenharmony_ci	       u32 cmd_flags,
13662306a36Sopenharmony_ci	       u16 token)
13762306a36Sopenharmony_ci{
13862306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
13962306a36Sopenharmony_ci
14062306a36Sopenharmony_ci	/* prepare command */
14162306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPNI_CMDID_CLOSE,
14262306a36Sopenharmony_ci					  cmd_flags,
14362306a36Sopenharmony_ci					  token);
14462306a36Sopenharmony_ci
14562306a36Sopenharmony_ci	/* send command to mc*/
14662306a36Sopenharmony_ci	return mc_send_command(mc_io, &cmd);
14762306a36Sopenharmony_ci}
14862306a36Sopenharmony_ci
14962306a36Sopenharmony_ci/**
15062306a36Sopenharmony_ci * dpni_set_pools() - Set buffer pools configuration
15162306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
15262306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
15362306a36Sopenharmony_ci * @token:	Token of DPNI object
15462306a36Sopenharmony_ci * @cfg:	Buffer pools configuration
15562306a36Sopenharmony_ci *
15662306a36Sopenharmony_ci * mandatory for DPNI operation
15762306a36Sopenharmony_ci * warning:Allowed only when DPNI is disabled
15862306a36Sopenharmony_ci *
15962306a36Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
16062306a36Sopenharmony_ci */
16162306a36Sopenharmony_ciint dpni_set_pools(struct fsl_mc_io *mc_io,
16262306a36Sopenharmony_ci		   u32 cmd_flags,
16362306a36Sopenharmony_ci		   u16 token,
16462306a36Sopenharmony_ci		   const struct dpni_pools_cfg *cfg)
16562306a36Sopenharmony_ci{
16662306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
16762306a36Sopenharmony_ci	struct dpni_cmd_set_pools *cmd_params;
16862306a36Sopenharmony_ci	int i;
16962306a36Sopenharmony_ci
17062306a36Sopenharmony_ci	/* prepare command */
17162306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_POOLS,
17262306a36Sopenharmony_ci					  cmd_flags,
17362306a36Sopenharmony_ci					  token);
17462306a36Sopenharmony_ci	cmd_params = (struct dpni_cmd_set_pools *)cmd.params;
17562306a36Sopenharmony_ci	cmd_params->num_dpbp = cfg->num_dpbp;
17662306a36Sopenharmony_ci	cmd_params->pool_options = cfg->pool_options;
17762306a36Sopenharmony_ci	for (i = 0; i < DPNI_MAX_DPBP; i++) {
17862306a36Sopenharmony_ci		cmd_params->pool[i].dpbp_id =
17962306a36Sopenharmony_ci			cpu_to_le16(cfg->pools[i].dpbp_id);
18062306a36Sopenharmony_ci		cmd_params->pool[i].priority_mask =
18162306a36Sopenharmony_ci			cfg->pools[i].priority_mask;
18262306a36Sopenharmony_ci		cmd_params->buffer_size[i] =
18362306a36Sopenharmony_ci			cpu_to_le16(cfg->pools[i].buffer_size);
18462306a36Sopenharmony_ci		cmd_params->backup_pool_mask |=
18562306a36Sopenharmony_ci			DPNI_BACKUP_POOL(cfg->pools[i].backup_pool, i);
18662306a36Sopenharmony_ci	}
18762306a36Sopenharmony_ci
18862306a36Sopenharmony_ci	/* send command to mc*/
18962306a36Sopenharmony_ci	return mc_send_command(mc_io, &cmd);
19062306a36Sopenharmony_ci}
19162306a36Sopenharmony_ci
19262306a36Sopenharmony_ci/**
19362306a36Sopenharmony_ci * dpni_enable() - Enable the DPNI, allow sending and receiving frames.
19462306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
19562306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
19662306a36Sopenharmony_ci * @token:		Token of DPNI object
19762306a36Sopenharmony_ci *
19862306a36Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
19962306a36Sopenharmony_ci */
20062306a36Sopenharmony_ciint dpni_enable(struct fsl_mc_io *mc_io,
20162306a36Sopenharmony_ci		u32 cmd_flags,
20262306a36Sopenharmony_ci		u16 token)
20362306a36Sopenharmony_ci{
20462306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
20562306a36Sopenharmony_ci
20662306a36Sopenharmony_ci	/* prepare command */
20762306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPNI_CMDID_ENABLE,
20862306a36Sopenharmony_ci					  cmd_flags,
20962306a36Sopenharmony_ci					  token);
21062306a36Sopenharmony_ci
21162306a36Sopenharmony_ci	/* send command to mc*/
21262306a36Sopenharmony_ci	return mc_send_command(mc_io, &cmd);
21362306a36Sopenharmony_ci}
21462306a36Sopenharmony_ci
21562306a36Sopenharmony_ci/**
21662306a36Sopenharmony_ci * dpni_disable() - Disable the DPNI, stop sending and receiving frames.
21762306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
21862306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
21962306a36Sopenharmony_ci * @token:	Token of DPNI object
22062306a36Sopenharmony_ci *
22162306a36Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
22262306a36Sopenharmony_ci */
22362306a36Sopenharmony_ciint dpni_disable(struct fsl_mc_io *mc_io,
22462306a36Sopenharmony_ci		 u32 cmd_flags,
22562306a36Sopenharmony_ci		 u16 token)
22662306a36Sopenharmony_ci{
22762306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
22862306a36Sopenharmony_ci
22962306a36Sopenharmony_ci	/* prepare command */
23062306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPNI_CMDID_DISABLE,
23162306a36Sopenharmony_ci					  cmd_flags,
23262306a36Sopenharmony_ci					  token);
23362306a36Sopenharmony_ci
23462306a36Sopenharmony_ci	/* send command to mc*/
23562306a36Sopenharmony_ci	return mc_send_command(mc_io, &cmd);
23662306a36Sopenharmony_ci}
23762306a36Sopenharmony_ci
23862306a36Sopenharmony_ci/**
23962306a36Sopenharmony_ci * dpni_is_enabled() - Check if the DPNI is enabled.
24062306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
24162306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
24262306a36Sopenharmony_ci * @token:	Token of DPNI object
24362306a36Sopenharmony_ci * @en:		Returns '1' if object is enabled; '0' otherwise
24462306a36Sopenharmony_ci *
24562306a36Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
24662306a36Sopenharmony_ci */
24762306a36Sopenharmony_ciint dpni_is_enabled(struct fsl_mc_io *mc_io,
24862306a36Sopenharmony_ci		    u32 cmd_flags,
24962306a36Sopenharmony_ci		    u16 token,
25062306a36Sopenharmony_ci		    int *en)
25162306a36Sopenharmony_ci{
25262306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
25362306a36Sopenharmony_ci	struct dpni_rsp_is_enabled *rsp_params;
25462306a36Sopenharmony_ci	int err;
25562306a36Sopenharmony_ci
25662306a36Sopenharmony_ci	/* prepare command */
25762306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPNI_CMDID_IS_ENABLED,
25862306a36Sopenharmony_ci					  cmd_flags,
25962306a36Sopenharmony_ci					  token);
26062306a36Sopenharmony_ci
26162306a36Sopenharmony_ci	/* send command to mc*/
26262306a36Sopenharmony_ci	err = mc_send_command(mc_io, &cmd);
26362306a36Sopenharmony_ci	if (err)
26462306a36Sopenharmony_ci		return err;
26562306a36Sopenharmony_ci
26662306a36Sopenharmony_ci	/* retrieve response parameters */
26762306a36Sopenharmony_ci	rsp_params = (struct dpni_rsp_is_enabled *)cmd.params;
26862306a36Sopenharmony_ci	*en = dpni_get_field(rsp_params->enabled, ENABLE);
26962306a36Sopenharmony_ci
27062306a36Sopenharmony_ci	return 0;
27162306a36Sopenharmony_ci}
27262306a36Sopenharmony_ci
27362306a36Sopenharmony_ci/**
27462306a36Sopenharmony_ci * dpni_reset() - Reset the DPNI, returns the object to initial state.
27562306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
27662306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
27762306a36Sopenharmony_ci * @token:	Token of DPNI object
27862306a36Sopenharmony_ci *
27962306a36Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
28062306a36Sopenharmony_ci */
28162306a36Sopenharmony_ciint dpni_reset(struct fsl_mc_io *mc_io,
28262306a36Sopenharmony_ci	       u32 cmd_flags,
28362306a36Sopenharmony_ci	       u16 token)
28462306a36Sopenharmony_ci{
28562306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
28662306a36Sopenharmony_ci
28762306a36Sopenharmony_ci	/* prepare command */
28862306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPNI_CMDID_RESET,
28962306a36Sopenharmony_ci					  cmd_flags,
29062306a36Sopenharmony_ci					  token);
29162306a36Sopenharmony_ci
29262306a36Sopenharmony_ci	/* send command to mc*/
29362306a36Sopenharmony_ci	return mc_send_command(mc_io, &cmd);
29462306a36Sopenharmony_ci}
29562306a36Sopenharmony_ci
29662306a36Sopenharmony_ci/**
29762306a36Sopenharmony_ci * dpni_set_irq_enable() - Set overall interrupt state.
29862306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
29962306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
30062306a36Sopenharmony_ci * @token:	Token of DPNI object
30162306a36Sopenharmony_ci * @irq_index:	The interrupt index to configure
30262306a36Sopenharmony_ci * @en:		Interrupt state: - enable = 1, disable = 0
30362306a36Sopenharmony_ci *
30462306a36Sopenharmony_ci * Allows GPP software to control when interrupts are generated.
30562306a36Sopenharmony_ci * Each interrupt can have up to 32 causes.  The enable/disable control's the
30662306a36Sopenharmony_ci * overall interrupt state. if the interrupt is disabled no causes will cause
30762306a36Sopenharmony_ci * an interrupt.
30862306a36Sopenharmony_ci *
30962306a36Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
31062306a36Sopenharmony_ci */
31162306a36Sopenharmony_ciint dpni_set_irq_enable(struct fsl_mc_io *mc_io,
31262306a36Sopenharmony_ci			u32 cmd_flags,
31362306a36Sopenharmony_ci			u16 token,
31462306a36Sopenharmony_ci			u8 irq_index,
31562306a36Sopenharmony_ci			u8 en)
31662306a36Sopenharmony_ci{
31762306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
31862306a36Sopenharmony_ci	struct dpni_cmd_set_irq_enable *cmd_params;
31962306a36Sopenharmony_ci
32062306a36Sopenharmony_ci	/* prepare command */
32162306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_IRQ_ENABLE,
32262306a36Sopenharmony_ci					  cmd_flags,
32362306a36Sopenharmony_ci					  token);
32462306a36Sopenharmony_ci	cmd_params = (struct dpni_cmd_set_irq_enable *)cmd.params;
32562306a36Sopenharmony_ci	dpni_set_field(cmd_params->enable, ENABLE, en);
32662306a36Sopenharmony_ci	cmd_params->irq_index = irq_index;
32762306a36Sopenharmony_ci
32862306a36Sopenharmony_ci	/* send command to mc*/
32962306a36Sopenharmony_ci	return mc_send_command(mc_io, &cmd);
33062306a36Sopenharmony_ci}
33162306a36Sopenharmony_ci
33262306a36Sopenharmony_ci/**
33362306a36Sopenharmony_ci * dpni_get_irq_enable() - Get overall interrupt state
33462306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
33562306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
33662306a36Sopenharmony_ci * @token:	Token of DPNI object
33762306a36Sopenharmony_ci * @irq_index:	The interrupt index to configure
33862306a36Sopenharmony_ci * @en:		Returned interrupt state - enable = 1, disable = 0
33962306a36Sopenharmony_ci *
34062306a36Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
34162306a36Sopenharmony_ci */
34262306a36Sopenharmony_ciint dpni_get_irq_enable(struct fsl_mc_io *mc_io,
34362306a36Sopenharmony_ci			u32 cmd_flags,
34462306a36Sopenharmony_ci			u16 token,
34562306a36Sopenharmony_ci			u8 irq_index,
34662306a36Sopenharmony_ci			u8 *en)
34762306a36Sopenharmony_ci{
34862306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
34962306a36Sopenharmony_ci	struct dpni_cmd_get_irq_enable *cmd_params;
35062306a36Sopenharmony_ci	struct dpni_rsp_get_irq_enable *rsp_params;
35162306a36Sopenharmony_ci
35262306a36Sopenharmony_ci	int err;
35362306a36Sopenharmony_ci
35462306a36Sopenharmony_ci	/* prepare command */
35562306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_IRQ_ENABLE,
35662306a36Sopenharmony_ci					  cmd_flags,
35762306a36Sopenharmony_ci					  token);
35862306a36Sopenharmony_ci	cmd_params = (struct dpni_cmd_get_irq_enable *)cmd.params;
35962306a36Sopenharmony_ci	cmd_params->irq_index = irq_index;
36062306a36Sopenharmony_ci
36162306a36Sopenharmony_ci	/* send command to mc*/
36262306a36Sopenharmony_ci	err = mc_send_command(mc_io, &cmd);
36362306a36Sopenharmony_ci	if (err)
36462306a36Sopenharmony_ci		return err;
36562306a36Sopenharmony_ci
36662306a36Sopenharmony_ci	/* retrieve response parameters */
36762306a36Sopenharmony_ci	rsp_params = (struct dpni_rsp_get_irq_enable *)cmd.params;
36862306a36Sopenharmony_ci	*en = dpni_get_field(rsp_params->enabled, ENABLE);
36962306a36Sopenharmony_ci
37062306a36Sopenharmony_ci	return 0;
37162306a36Sopenharmony_ci}
37262306a36Sopenharmony_ci
37362306a36Sopenharmony_ci/**
37462306a36Sopenharmony_ci * dpni_set_irq_mask() - Set interrupt mask.
37562306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
37662306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
37762306a36Sopenharmony_ci * @token:	Token of DPNI object
37862306a36Sopenharmony_ci * @irq_index:	The interrupt index to configure
37962306a36Sopenharmony_ci * @mask:	event mask to trigger interrupt;
38062306a36Sopenharmony_ci *			each bit:
38162306a36Sopenharmony_ci *				0 = ignore event
38262306a36Sopenharmony_ci *				1 = consider event for asserting IRQ
38362306a36Sopenharmony_ci *
38462306a36Sopenharmony_ci * Every interrupt can have up to 32 causes and the interrupt model supports
38562306a36Sopenharmony_ci * masking/unmasking each cause independently
38662306a36Sopenharmony_ci *
38762306a36Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
38862306a36Sopenharmony_ci */
38962306a36Sopenharmony_ciint dpni_set_irq_mask(struct fsl_mc_io *mc_io,
39062306a36Sopenharmony_ci		      u32 cmd_flags,
39162306a36Sopenharmony_ci		      u16 token,
39262306a36Sopenharmony_ci		      u8 irq_index,
39362306a36Sopenharmony_ci		      u32 mask)
39462306a36Sopenharmony_ci{
39562306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
39662306a36Sopenharmony_ci	struct dpni_cmd_set_irq_mask *cmd_params;
39762306a36Sopenharmony_ci
39862306a36Sopenharmony_ci	/* prepare command */
39962306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_IRQ_MASK,
40062306a36Sopenharmony_ci					  cmd_flags,
40162306a36Sopenharmony_ci					  token);
40262306a36Sopenharmony_ci	cmd_params = (struct dpni_cmd_set_irq_mask *)cmd.params;
40362306a36Sopenharmony_ci	cmd_params->mask = cpu_to_le32(mask);
40462306a36Sopenharmony_ci	cmd_params->irq_index = irq_index;
40562306a36Sopenharmony_ci
40662306a36Sopenharmony_ci	/* send command to mc*/
40762306a36Sopenharmony_ci	return mc_send_command(mc_io, &cmd);
40862306a36Sopenharmony_ci}
40962306a36Sopenharmony_ci
41062306a36Sopenharmony_ci/**
41162306a36Sopenharmony_ci * dpni_get_irq_mask() - Get interrupt mask.
41262306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
41362306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
41462306a36Sopenharmony_ci * @token:	Token of DPNI object
41562306a36Sopenharmony_ci * @irq_index:	The interrupt index to configure
41662306a36Sopenharmony_ci * @mask:	Returned event mask to trigger interrupt
41762306a36Sopenharmony_ci *
41862306a36Sopenharmony_ci * Every interrupt can have up to 32 causes and the interrupt model supports
41962306a36Sopenharmony_ci * masking/unmasking each cause independently
42062306a36Sopenharmony_ci *
42162306a36Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
42262306a36Sopenharmony_ci */
42362306a36Sopenharmony_ciint dpni_get_irq_mask(struct fsl_mc_io *mc_io,
42462306a36Sopenharmony_ci		      u32 cmd_flags,
42562306a36Sopenharmony_ci		      u16 token,
42662306a36Sopenharmony_ci		      u8 irq_index,
42762306a36Sopenharmony_ci		      u32 *mask)
42862306a36Sopenharmony_ci{
42962306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
43062306a36Sopenharmony_ci	struct dpni_cmd_get_irq_mask *cmd_params;
43162306a36Sopenharmony_ci	struct dpni_rsp_get_irq_mask *rsp_params;
43262306a36Sopenharmony_ci	int err;
43362306a36Sopenharmony_ci
43462306a36Sopenharmony_ci	/* prepare command */
43562306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_IRQ_MASK,
43662306a36Sopenharmony_ci					  cmd_flags,
43762306a36Sopenharmony_ci					  token);
43862306a36Sopenharmony_ci	cmd_params = (struct dpni_cmd_get_irq_mask *)cmd.params;
43962306a36Sopenharmony_ci	cmd_params->irq_index = irq_index;
44062306a36Sopenharmony_ci
44162306a36Sopenharmony_ci	/* send command to mc*/
44262306a36Sopenharmony_ci	err = mc_send_command(mc_io, &cmd);
44362306a36Sopenharmony_ci	if (err)
44462306a36Sopenharmony_ci		return err;
44562306a36Sopenharmony_ci
44662306a36Sopenharmony_ci	/* retrieve response parameters */
44762306a36Sopenharmony_ci	rsp_params = (struct dpni_rsp_get_irq_mask *)cmd.params;
44862306a36Sopenharmony_ci	*mask = le32_to_cpu(rsp_params->mask);
44962306a36Sopenharmony_ci
45062306a36Sopenharmony_ci	return 0;
45162306a36Sopenharmony_ci}
45262306a36Sopenharmony_ci
45362306a36Sopenharmony_ci/**
45462306a36Sopenharmony_ci * dpni_get_irq_status() - Get the current status of any pending interrupts.
45562306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
45662306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
45762306a36Sopenharmony_ci * @token:	Token of DPNI object
45862306a36Sopenharmony_ci * @irq_index:	The interrupt index to configure
45962306a36Sopenharmony_ci * @status:	Returned interrupts status - one bit per cause:
46062306a36Sopenharmony_ci *			0 = no interrupt pending
46162306a36Sopenharmony_ci *			1 = interrupt pending
46262306a36Sopenharmony_ci *
46362306a36Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
46462306a36Sopenharmony_ci */
46562306a36Sopenharmony_ciint dpni_get_irq_status(struct fsl_mc_io *mc_io,
46662306a36Sopenharmony_ci			u32 cmd_flags,
46762306a36Sopenharmony_ci			u16 token,
46862306a36Sopenharmony_ci			u8 irq_index,
46962306a36Sopenharmony_ci			u32 *status)
47062306a36Sopenharmony_ci{
47162306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
47262306a36Sopenharmony_ci	struct dpni_cmd_get_irq_status *cmd_params;
47362306a36Sopenharmony_ci	struct dpni_rsp_get_irq_status *rsp_params;
47462306a36Sopenharmony_ci	int err;
47562306a36Sopenharmony_ci
47662306a36Sopenharmony_ci	/* prepare command */
47762306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_IRQ_STATUS,
47862306a36Sopenharmony_ci					  cmd_flags,
47962306a36Sopenharmony_ci					  token);
48062306a36Sopenharmony_ci	cmd_params = (struct dpni_cmd_get_irq_status *)cmd.params;
48162306a36Sopenharmony_ci	cmd_params->status = cpu_to_le32(*status);
48262306a36Sopenharmony_ci	cmd_params->irq_index = irq_index;
48362306a36Sopenharmony_ci
48462306a36Sopenharmony_ci	/* send command to mc*/
48562306a36Sopenharmony_ci	err = mc_send_command(mc_io, &cmd);
48662306a36Sopenharmony_ci	if (err)
48762306a36Sopenharmony_ci		return err;
48862306a36Sopenharmony_ci
48962306a36Sopenharmony_ci	/* retrieve response parameters */
49062306a36Sopenharmony_ci	rsp_params = (struct dpni_rsp_get_irq_status *)cmd.params;
49162306a36Sopenharmony_ci	*status = le32_to_cpu(rsp_params->status);
49262306a36Sopenharmony_ci
49362306a36Sopenharmony_ci	return 0;
49462306a36Sopenharmony_ci}
49562306a36Sopenharmony_ci
49662306a36Sopenharmony_ci/**
49762306a36Sopenharmony_ci * dpni_clear_irq_status() - Clear a pending interrupt's status
49862306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
49962306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
50062306a36Sopenharmony_ci * @token:	Token of DPNI object
50162306a36Sopenharmony_ci * @irq_index:	The interrupt index to configure
50262306a36Sopenharmony_ci * @status:	bits to clear (W1C) - one bit per cause:
50362306a36Sopenharmony_ci *			0 = don't change
50462306a36Sopenharmony_ci *			1 = clear status bit
50562306a36Sopenharmony_ci *
50662306a36Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
50762306a36Sopenharmony_ci */
50862306a36Sopenharmony_ciint dpni_clear_irq_status(struct fsl_mc_io *mc_io,
50962306a36Sopenharmony_ci			  u32 cmd_flags,
51062306a36Sopenharmony_ci			  u16 token,
51162306a36Sopenharmony_ci			  u8 irq_index,
51262306a36Sopenharmony_ci			  u32 status)
51362306a36Sopenharmony_ci{
51462306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
51562306a36Sopenharmony_ci	struct dpni_cmd_clear_irq_status *cmd_params;
51662306a36Sopenharmony_ci
51762306a36Sopenharmony_ci	/* prepare command */
51862306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPNI_CMDID_CLEAR_IRQ_STATUS,
51962306a36Sopenharmony_ci					  cmd_flags,
52062306a36Sopenharmony_ci					  token);
52162306a36Sopenharmony_ci	cmd_params = (struct dpni_cmd_clear_irq_status *)cmd.params;
52262306a36Sopenharmony_ci	cmd_params->irq_index = irq_index;
52362306a36Sopenharmony_ci	cmd_params->status = cpu_to_le32(status);
52462306a36Sopenharmony_ci
52562306a36Sopenharmony_ci	/* send command to mc*/
52662306a36Sopenharmony_ci	return mc_send_command(mc_io, &cmd);
52762306a36Sopenharmony_ci}
52862306a36Sopenharmony_ci
52962306a36Sopenharmony_ci/**
53062306a36Sopenharmony_ci * dpni_get_attributes() - Retrieve DPNI attributes.
53162306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
53262306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
53362306a36Sopenharmony_ci * @token:	Token of DPNI object
53462306a36Sopenharmony_ci * @attr:	Object's attributes
53562306a36Sopenharmony_ci *
53662306a36Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
53762306a36Sopenharmony_ci */
53862306a36Sopenharmony_ciint dpni_get_attributes(struct fsl_mc_io *mc_io,
53962306a36Sopenharmony_ci			u32 cmd_flags,
54062306a36Sopenharmony_ci			u16 token,
54162306a36Sopenharmony_ci			struct dpni_attr *attr)
54262306a36Sopenharmony_ci{
54362306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
54462306a36Sopenharmony_ci	struct dpni_rsp_get_attr *rsp_params;
54562306a36Sopenharmony_ci
54662306a36Sopenharmony_ci	int err;
54762306a36Sopenharmony_ci
54862306a36Sopenharmony_ci	/* prepare command */
54962306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_ATTR,
55062306a36Sopenharmony_ci					  cmd_flags,
55162306a36Sopenharmony_ci					  token);
55262306a36Sopenharmony_ci
55362306a36Sopenharmony_ci	/* send command to mc*/
55462306a36Sopenharmony_ci	err = mc_send_command(mc_io, &cmd);
55562306a36Sopenharmony_ci	if (err)
55662306a36Sopenharmony_ci		return err;
55762306a36Sopenharmony_ci
55862306a36Sopenharmony_ci	/* retrieve response parameters */
55962306a36Sopenharmony_ci	rsp_params = (struct dpni_rsp_get_attr *)cmd.params;
56062306a36Sopenharmony_ci	attr->options = le32_to_cpu(rsp_params->options);
56162306a36Sopenharmony_ci	attr->num_queues = rsp_params->num_queues;
56262306a36Sopenharmony_ci	attr->num_tcs = rsp_params->num_tcs;
56362306a36Sopenharmony_ci	attr->mac_filter_entries = rsp_params->mac_filter_entries;
56462306a36Sopenharmony_ci	attr->vlan_filter_entries = rsp_params->vlan_filter_entries;
56562306a36Sopenharmony_ci	attr->qos_entries = rsp_params->qos_entries;
56662306a36Sopenharmony_ci	attr->fs_entries = le16_to_cpu(rsp_params->fs_entries);
56762306a36Sopenharmony_ci	attr->qos_key_size = rsp_params->qos_key_size;
56862306a36Sopenharmony_ci	attr->fs_key_size = rsp_params->fs_key_size;
56962306a36Sopenharmony_ci	attr->wriop_version = le16_to_cpu(rsp_params->wriop_version);
57062306a36Sopenharmony_ci
57162306a36Sopenharmony_ci	return 0;
57262306a36Sopenharmony_ci}
57362306a36Sopenharmony_ci
57462306a36Sopenharmony_ci/**
57562306a36Sopenharmony_ci * dpni_set_errors_behavior() - Set errors behavior
57662306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
57762306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
57862306a36Sopenharmony_ci * @token:	Token of DPNI object
57962306a36Sopenharmony_ci * @cfg:	Errors configuration
58062306a36Sopenharmony_ci *
58162306a36Sopenharmony_ci * this function may be called numerous times with different
58262306a36Sopenharmony_ci * error masks
58362306a36Sopenharmony_ci *
58462306a36Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
58562306a36Sopenharmony_ci */
58662306a36Sopenharmony_ciint dpni_set_errors_behavior(struct fsl_mc_io *mc_io,
58762306a36Sopenharmony_ci			     u32 cmd_flags,
58862306a36Sopenharmony_ci			     u16 token,
58962306a36Sopenharmony_ci			     struct dpni_error_cfg *cfg)
59062306a36Sopenharmony_ci{
59162306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
59262306a36Sopenharmony_ci	struct dpni_cmd_set_errors_behavior *cmd_params;
59362306a36Sopenharmony_ci
59462306a36Sopenharmony_ci	/* prepare command */
59562306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_ERRORS_BEHAVIOR,
59662306a36Sopenharmony_ci					  cmd_flags,
59762306a36Sopenharmony_ci					  token);
59862306a36Sopenharmony_ci	cmd_params = (struct dpni_cmd_set_errors_behavior *)cmd.params;
59962306a36Sopenharmony_ci	cmd_params->errors = cpu_to_le32(cfg->errors);
60062306a36Sopenharmony_ci	dpni_set_field(cmd_params->flags, ERROR_ACTION, cfg->error_action);
60162306a36Sopenharmony_ci	dpni_set_field(cmd_params->flags, FRAME_ANN, cfg->set_frame_annotation);
60262306a36Sopenharmony_ci
60362306a36Sopenharmony_ci	/* send command to mc*/
60462306a36Sopenharmony_ci	return mc_send_command(mc_io, &cmd);
60562306a36Sopenharmony_ci}
60662306a36Sopenharmony_ci
60762306a36Sopenharmony_ci/**
60862306a36Sopenharmony_ci * dpni_get_buffer_layout() - Retrieve buffer layout attributes.
60962306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
61062306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
61162306a36Sopenharmony_ci * @token:	Token of DPNI object
61262306a36Sopenharmony_ci * @qtype:	Type of queue to retrieve configuration for
61362306a36Sopenharmony_ci * @layout:	Returns buffer layout attributes
61462306a36Sopenharmony_ci *
61562306a36Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
61662306a36Sopenharmony_ci */
61762306a36Sopenharmony_ciint dpni_get_buffer_layout(struct fsl_mc_io *mc_io,
61862306a36Sopenharmony_ci			   u32 cmd_flags,
61962306a36Sopenharmony_ci			   u16 token,
62062306a36Sopenharmony_ci			   enum dpni_queue_type qtype,
62162306a36Sopenharmony_ci			   struct dpni_buffer_layout *layout)
62262306a36Sopenharmony_ci{
62362306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
62462306a36Sopenharmony_ci	struct dpni_cmd_get_buffer_layout *cmd_params;
62562306a36Sopenharmony_ci	struct dpni_rsp_get_buffer_layout *rsp_params;
62662306a36Sopenharmony_ci	int err;
62762306a36Sopenharmony_ci
62862306a36Sopenharmony_ci	/* prepare command */
62962306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_BUFFER_LAYOUT,
63062306a36Sopenharmony_ci					  cmd_flags,
63162306a36Sopenharmony_ci					  token);
63262306a36Sopenharmony_ci	cmd_params = (struct dpni_cmd_get_buffer_layout *)cmd.params;
63362306a36Sopenharmony_ci	cmd_params->qtype = qtype;
63462306a36Sopenharmony_ci
63562306a36Sopenharmony_ci	/* send command to mc*/
63662306a36Sopenharmony_ci	err = mc_send_command(mc_io, &cmd);
63762306a36Sopenharmony_ci	if (err)
63862306a36Sopenharmony_ci		return err;
63962306a36Sopenharmony_ci
64062306a36Sopenharmony_ci	/* retrieve response parameters */
64162306a36Sopenharmony_ci	rsp_params = (struct dpni_rsp_get_buffer_layout *)cmd.params;
64262306a36Sopenharmony_ci	layout->pass_timestamp = dpni_get_field(rsp_params->flags, PASS_TS);
64362306a36Sopenharmony_ci	layout->pass_parser_result = dpni_get_field(rsp_params->flags, PASS_PR);
64462306a36Sopenharmony_ci	layout->pass_frame_status = dpni_get_field(rsp_params->flags, PASS_FS);
64562306a36Sopenharmony_ci	layout->private_data_size = le16_to_cpu(rsp_params->private_data_size);
64662306a36Sopenharmony_ci	layout->data_align = le16_to_cpu(rsp_params->data_align);
64762306a36Sopenharmony_ci	layout->data_head_room = le16_to_cpu(rsp_params->head_room);
64862306a36Sopenharmony_ci	layout->data_tail_room = le16_to_cpu(rsp_params->tail_room);
64962306a36Sopenharmony_ci
65062306a36Sopenharmony_ci	return 0;
65162306a36Sopenharmony_ci}
65262306a36Sopenharmony_ci
65362306a36Sopenharmony_ci/**
65462306a36Sopenharmony_ci * dpni_set_buffer_layout() - Set buffer layout configuration.
65562306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
65662306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
65762306a36Sopenharmony_ci * @token:	Token of DPNI object
65862306a36Sopenharmony_ci * @qtype:	Type of queue this configuration applies to
65962306a36Sopenharmony_ci * @layout:	Buffer layout configuration
66062306a36Sopenharmony_ci *
66162306a36Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
66262306a36Sopenharmony_ci *
66362306a36Sopenharmony_ci * @warning	Allowed only when DPNI is disabled
66462306a36Sopenharmony_ci */
66562306a36Sopenharmony_ciint dpni_set_buffer_layout(struct fsl_mc_io *mc_io,
66662306a36Sopenharmony_ci			   u32 cmd_flags,
66762306a36Sopenharmony_ci			   u16 token,
66862306a36Sopenharmony_ci			   enum dpni_queue_type qtype,
66962306a36Sopenharmony_ci			   const struct dpni_buffer_layout *layout)
67062306a36Sopenharmony_ci{
67162306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
67262306a36Sopenharmony_ci	struct dpni_cmd_set_buffer_layout *cmd_params;
67362306a36Sopenharmony_ci
67462306a36Sopenharmony_ci	/* prepare command */
67562306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_BUFFER_LAYOUT,
67662306a36Sopenharmony_ci					  cmd_flags,
67762306a36Sopenharmony_ci					  token);
67862306a36Sopenharmony_ci	cmd_params = (struct dpni_cmd_set_buffer_layout *)cmd.params;
67962306a36Sopenharmony_ci	cmd_params->qtype = qtype;
68062306a36Sopenharmony_ci	cmd_params->options = cpu_to_le16(layout->options);
68162306a36Sopenharmony_ci	dpni_set_field(cmd_params->flags, PASS_TS, layout->pass_timestamp);
68262306a36Sopenharmony_ci	dpni_set_field(cmd_params->flags, PASS_PR, layout->pass_parser_result);
68362306a36Sopenharmony_ci	dpni_set_field(cmd_params->flags, PASS_FS, layout->pass_frame_status);
68462306a36Sopenharmony_ci	cmd_params->private_data_size = cpu_to_le16(layout->private_data_size);
68562306a36Sopenharmony_ci	cmd_params->data_align = cpu_to_le16(layout->data_align);
68662306a36Sopenharmony_ci	cmd_params->head_room = cpu_to_le16(layout->data_head_room);
68762306a36Sopenharmony_ci	cmd_params->tail_room = cpu_to_le16(layout->data_tail_room);
68862306a36Sopenharmony_ci
68962306a36Sopenharmony_ci	/* send command to mc*/
69062306a36Sopenharmony_ci	return mc_send_command(mc_io, &cmd);
69162306a36Sopenharmony_ci}
69262306a36Sopenharmony_ci
69362306a36Sopenharmony_ci/**
69462306a36Sopenharmony_ci * dpni_set_offload() - Set DPNI offload configuration.
69562306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
69662306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
69762306a36Sopenharmony_ci * @token:	Token of DPNI object
69862306a36Sopenharmony_ci * @type:	Type of DPNI offload
69962306a36Sopenharmony_ci * @config:	Offload configuration.
70062306a36Sopenharmony_ci *		For checksum offloads, non-zero value enables the offload
70162306a36Sopenharmony_ci *
70262306a36Sopenharmony_ci * Return:     '0' on Success; Error code otherwise.
70362306a36Sopenharmony_ci *
70462306a36Sopenharmony_ci * @warning    Allowed only when DPNI is disabled
70562306a36Sopenharmony_ci */
70662306a36Sopenharmony_ci
70762306a36Sopenharmony_ciint dpni_set_offload(struct fsl_mc_io *mc_io,
70862306a36Sopenharmony_ci		     u32 cmd_flags,
70962306a36Sopenharmony_ci		     u16 token,
71062306a36Sopenharmony_ci		     enum dpni_offload type,
71162306a36Sopenharmony_ci		     u32 config)
71262306a36Sopenharmony_ci{
71362306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
71462306a36Sopenharmony_ci	struct dpni_cmd_set_offload *cmd_params;
71562306a36Sopenharmony_ci
71662306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_OFFLOAD,
71762306a36Sopenharmony_ci					  cmd_flags,
71862306a36Sopenharmony_ci					  token);
71962306a36Sopenharmony_ci	cmd_params = (struct dpni_cmd_set_offload *)cmd.params;
72062306a36Sopenharmony_ci	cmd_params->dpni_offload = type;
72162306a36Sopenharmony_ci	cmd_params->config = cpu_to_le32(config);
72262306a36Sopenharmony_ci
72362306a36Sopenharmony_ci	return mc_send_command(mc_io, &cmd);
72462306a36Sopenharmony_ci}
72562306a36Sopenharmony_ci
72662306a36Sopenharmony_ciint dpni_get_offload(struct fsl_mc_io *mc_io,
72762306a36Sopenharmony_ci		     u32 cmd_flags,
72862306a36Sopenharmony_ci		     u16 token,
72962306a36Sopenharmony_ci		     enum dpni_offload type,
73062306a36Sopenharmony_ci		     u32 *config)
73162306a36Sopenharmony_ci{
73262306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
73362306a36Sopenharmony_ci	struct dpni_cmd_get_offload *cmd_params;
73462306a36Sopenharmony_ci	struct dpni_rsp_get_offload *rsp_params;
73562306a36Sopenharmony_ci	int err;
73662306a36Sopenharmony_ci
73762306a36Sopenharmony_ci	/* prepare command */
73862306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_OFFLOAD,
73962306a36Sopenharmony_ci					  cmd_flags,
74062306a36Sopenharmony_ci					  token);
74162306a36Sopenharmony_ci	cmd_params = (struct dpni_cmd_get_offload *)cmd.params;
74262306a36Sopenharmony_ci	cmd_params->dpni_offload = type;
74362306a36Sopenharmony_ci
74462306a36Sopenharmony_ci	/* send command to mc*/
74562306a36Sopenharmony_ci	err = mc_send_command(mc_io, &cmd);
74662306a36Sopenharmony_ci	if (err)
74762306a36Sopenharmony_ci		return err;
74862306a36Sopenharmony_ci
74962306a36Sopenharmony_ci	/* retrieve response parameters */
75062306a36Sopenharmony_ci	rsp_params = (struct dpni_rsp_get_offload *)cmd.params;
75162306a36Sopenharmony_ci	*config = le32_to_cpu(rsp_params->config);
75262306a36Sopenharmony_ci
75362306a36Sopenharmony_ci	return 0;
75462306a36Sopenharmony_ci}
75562306a36Sopenharmony_ci
75662306a36Sopenharmony_ci/**
75762306a36Sopenharmony_ci * dpni_get_qdid() - Get the Queuing Destination ID (QDID) that should be used
75862306a36Sopenharmony_ci *			for enqueue operations
75962306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
76062306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
76162306a36Sopenharmony_ci * @token:	Token of DPNI object
76262306a36Sopenharmony_ci * @qtype:	Type of queue to receive QDID for
76362306a36Sopenharmony_ci * @qdid:	Returned virtual QDID value that should be used as an argument
76462306a36Sopenharmony_ci *			in all enqueue operations
76562306a36Sopenharmony_ci *
76662306a36Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
76762306a36Sopenharmony_ci */
76862306a36Sopenharmony_ciint dpni_get_qdid(struct fsl_mc_io *mc_io,
76962306a36Sopenharmony_ci		  u32 cmd_flags,
77062306a36Sopenharmony_ci		  u16 token,
77162306a36Sopenharmony_ci		  enum dpni_queue_type qtype,
77262306a36Sopenharmony_ci		  u16 *qdid)
77362306a36Sopenharmony_ci{
77462306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
77562306a36Sopenharmony_ci	struct dpni_cmd_get_qdid *cmd_params;
77662306a36Sopenharmony_ci	struct dpni_rsp_get_qdid *rsp_params;
77762306a36Sopenharmony_ci	int err;
77862306a36Sopenharmony_ci
77962306a36Sopenharmony_ci	/* prepare command */
78062306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_QDID,
78162306a36Sopenharmony_ci					  cmd_flags,
78262306a36Sopenharmony_ci					  token);
78362306a36Sopenharmony_ci	cmd_params = (struct dpni_cmd_get_qdid *)cmd.params;
78462306a36Sopenharmony_ci	cmd_params->qtype = qtype;
78562306a36Sopenharmony_ci
78662306a36Sopenharmony_ci	/* send command to mc*/
78762306a36Sopenharmony_ci	err = mc_send_command(mc_io, &cmd);
78862306a36Sopenharmony_ci	if (err)
78962306a36Sopenharmony_ci		return err;
79062306a36Sopenharmony_ci
79162306a36Sopenharmony_ci	/* retrieve response parameters */
79262306a36Sopenharmony_ci	rsp_params = (struct dpni_rsp_get_qdid *)cmd.params;
79362306a36Sopenharmony_ci	*qdid = le16_to_cpu(rsp_params->qdid);
79462306a36Sopenharmony_ci
79562306a36Sopenharmony_ci	return 0;
79662306a36Sopenharmony_ci}
79762306a36Sopenharmony_ci
79862306a36Sopenharmony_ci/**
79962306a36Sopenharmony_ci * dpni_get_tx_data_offset() - Get the Tx data offset (from start of buffer)
80062306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
80162306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
80262306a36Sopenharmony_ci * @token:	Token of DPNI object
80362306a36Sopenharmony_ci * @data_offset: Tx data offset (from start of buffer)
80462306a36Sopenharmony_ci *
80562306a36Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
80662306a36Sopenharmony_ci */
80762306a36Sopenharmony_ciint dpni_get_tx_data_offset(struct fsl_mc_io *mc_io,
80862306a36Sopenharmony_ci			    u32 cmd_flags,
80962306a36Sopenharmony_ci			    u16 token,
81062306a36Sopenharmony_ci			    u16 *data_offset)
81162306a36Sopenharmony_ci{
81262306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
81362306a36Sopenharmony_ci	struct dpni_rsp_get_tx_data_offset *rsp_params;
81462306a36Sopenharmony_ci	int err;
81562306a36Sopenharmony_ci
81662306a36Sopenharmony_ci	/* prepare command */
81762306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_TX_DATA_OFFSET,
81862306a36Sopenharmony_ci					  cmd_flags,
81962306a36Sopenharmony_ci					  token);
82062306a36Sopenharmony_ci
82162306a36Sopenharmony_ci	/* send command to mc*/
82262306a36Sopenharmony_ci	err = mc_send_command(mc_io, &cmd);
82362306a36Sopenharmony_ci	if (err)
82462306a36Sopenharmony_ci		return err;
82562306a36Sopenharmony_ci
82662306a36Sopenharmony_ci	/* retrieve response parameters */
82762306a36Sopenharmony_ci	rsp_params = (struct dpni_rsp_get_tx_data_offset *)cmd.params;
82862306a36Sopenharmony_ci	*data_offset = le16_to_cpu(rsp_params->data_offset);
82962306a36Sopenharmony_ci
83062306a36Sopenharmony_ci	return 0;
83162306a36Sopenharmony_ci}
83262306a36Sopenharmony_ci
83362306a36Sopenharmony_ci/**
83462306a36Sopenharmony_ci * dpni_set_link_cfg() - set the link configuration.
83562306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
83662306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
83762306a36Sopenharmony_ci * @token:	Token of DPNI object
83862306a36Sopenharmony_ci * @cfg:	Link configuration
83962306a36Sopenharmony_ci *
84062306a36Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
84162306a36Sopenharmony_ci */
84262306a36Sopenharmony_ciint dpni_set_link_cfg(struct fsl_mc_io *mc_io,
84362306a36Sopenharmony_ci		      u32 cmd_flags,
84462306a36Sopenharmony_ci		      u16 token,
84562306a36Sopenharmony_ci		      const struct dpni_link_cfg *cfg)
84662306a36Sopenharmony_ci{
84762306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
84862306a36Sopenharmony_ci	struct dpni_cmd_link_cfg *cmd_params;
84962306a36Sopenharmony_ci
85062306a36Sopenharmony_ci	/* prepare command */
85162306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_LINK_CFG,
85262306a36Sopenharmony_ci					  cmd_flags,
85362306a36Sopenharmony_ci					  token);
85462306a36Sopenharmony_ci	cmd_params = (struct dpni_cmd_link_cfg *)cmd.params;
85562306a36Sopenharmony_ci	cmd_params->rate = cpu_to_le32(cfg->rate);
85662306a36Sopenharmony_ci	cmd_params->options = cpu_to_le64(cfg->options);
85762306a36Sopenharmony_ci
85862306a36Sopenharmony_ci	/* send command to mc*/
85962306a36Sopenharmony_ci	return mc_send_command(mc_io, &cmd);
86062306a36Sopenharmony_ci}
86162306a36Sopenharmony_ci
86262306a36Sopenharmony_ci/**
86362306a36Sopenharmony_ci * dpni_get_link_cfg() - return the link configuration
86462306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
86562306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
86662306a36Sopenharmony_ci * @token:	Token of DPNI object
86762306a36Sopenharmony_ci * @cfg:	Link configuration from dpni object
86862306a36Sopenharmony_ci *
86962306a36Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
87062306a36Sopenharmony_ci */
87162306a36Sopenharmony_ciint dpni_get_link_cfg(struct fsl_mc_io *mc_io,
87262306a36Sopenharmony_ci		      u32 cmd_flags,
87362306a36Sopenharmony_ci		      u16 token,
87462306a36Sopenharmony_ci		      struct dpni_link_cfg *cfg)
87562306a36Sopenharmony_ci{
87662306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
87762306a36Sopenharmony_ci	struct dpni_cmd_link_cfg *rsp_params;
87862306a36Sopenharmony_ci	int err;
87962306a36Sopenharmony_ci
88062306a36Sopenharmony_ci	/* prepare command */
88162306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_LINK_CFG,
88262306a36Sopenharmony_ci					  cmd_flags,
88362306a36Sopenharmony_ci					  token);
88462306a36Sopenharmony_ci
88562306a36Sopenharmony_ci	/* send command to mc*/
88662306a36Sopenharmony_ci	err = mc_send_command(mc_io, &cmd);
88762306a36Sopenharmony_ci	if (err)
88862306a36Sopenharmony_ci		return err;
88962306a36Sopenharmony_ci
89062306a36Sopenharmony_ci	/* retrieve response parameters */
89162306a36Sopenharmony_ci	rsp_params = (struct dpni_cmd_link_cfg *)cmd.params;
89262306a36Sopenharmony_ci	cfg->rate = le32_to_cpu(rsp_params->rate);
89362306a36Sopenharmony_ci	cfg->options = le64_to_cpu(rsp_params->options);
89462306a36Sopenharmony_ci
89562306a36Sopenharmony_ci	return err;
89662306a36Sopenharmony_ci}
89762306a36Sopenharmony_ci
89862306a36Sopenharmony_ci/**
89962306a36Sopenharmony_ci * dpni_get_link_state() - Return the link state (either up or down)
90062306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
90162306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
90262306a36Sopenharmony_ci * @token:	Token of DPNI object
90362306a36Sopenharmony_ci * @state:	Returned link state;
90462306a36Sopenharmony_ci *
90562306a36Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
90662306a36Sopenharmony_ci */
90762306a36Sopenharmony_ciint dpni_get_link_state(struct fsl_mc_io *mc_io,
90862306a36Sopenharmony_ci			u32 cmd_flags,
90962306a36Sopenharmony_ci			u16 token,
91062306a36Sopenharmony_ci			struct dpni_link_state *state)
91162306a36Sopenharmony_ci{
91262306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
91362306a36Sopenharmony_ci	struct dpni_rsp_get_link_state *rsp_params;
91462306a36Sopenharmony_ci	int err;
91562306a36Sopenharmony_ci
91662306a36Sopenharmony_ci	/* prepare command */
91762306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_LINK_STATE,
91862306a36Sopenharmony_ci					  cmd_flags,
91962306a36Sopenharmony_ci					  token);
92062306a36Sopenharmony_ci
92162306a36Sopenharmony_ci	/* send command to mc*/
92262306a36Sopenharmony_ci	err = mc_send_command(mc_io, &cmd);
92362306a36Sopenharmony_ci	if (err)
92462306a36Sopenharmony_ci		return err;
92562306a36Sopenharmony_ci
92662306a36Sopenharmony_ci	/* retrieve response parameters */
92762306a36Sopenharmony_ci	rsp_params = (struct dpni_rsp_get_link_state *)cmd.params;
92862306a36Sopenharmony_ci	state->up = dpni_get_field(rsp_params->flags, LINK_STATE);
92962306a36Sopenharmony_ci	state->rate = le32_to_cpu(rsp_params->rate);
93062306a36Sopenharmony_ci	state->options = le64_to_cpu(rsp_params->options);
93162306a36Sopenharmony_ci
93262306a36Sopenharmony_ci	return 0;
93362306a36Sopenharmony_ci}
93462306a36Sopenharmony_ci
93562306a36Sopenharmony_ci/**
93662306a36Sopenharmony_ci * dpni_set_max_frame_length() - Set the maximum received frame length.
93762306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
93862306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
93962306a36Sopenharmony_ci * @token:	Token of DPNI object
94062306a36Sopenharmony_ci * @max_frame_length:	Maximum received frame length (in
94162306a36Sopenharmony_ci *				bytes); frame is discarded if its
94262306a36Sopenharmony_ci *				length exceeds this value
94362306a36Sopenharmony_ci *
94462306a36Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
94562306a36Sopenharmony_ci */
94662306a36Sopenharmony_ciint dpni_set_max_frame_length(struct fsl_mc_io *mc_io,
94762306a36Sopenharmony_ci			      u32 cmd_flags,
94862306a36Sopenharmony_ci			      u16 token,
94962306a36Sopenharmony_ci			      u16 max_frame_length)
95062306a36Sopenharmony_ci{
95162306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
95262306a36Sopenharmony_ci	struct dpni_cmd_set_max_frame_length *cmd_params;
95362306a36Sopenharmony_ci
95462306a36Sopenharmony_ci	/* prepare command */
95562306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_MAX_FRAME_LENGTH,
95662306a36Sopenharmony_ci					  cmd_flags,
95762306a36Sopenharmony_ci					  token);
95862306a36Sopenharmony_ci	cmd_params = (struct dpni_cmd_set_max_frame_length *)cmd.params;
95962306a36Sopenharmony_ci	cmd_params->max_frame_length = cpu_to_le16(max_frame_length);
96062306a36Sopenharmony_ci
96162306a36Sopenharmony_ci	/* send command to mc*/
96262306a36Sopenharmony_ci	return mc_send_command(mc_io, &cmd);
96362306a36Sopenharmony_ci}
96462306a36Sopenharmony_ci
96562306a36Sopenharmony_ci/**
96662306a36Sopenharmony_ci * dpni_get_max_frame_length() - Get the maximum received frame length.
96762306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
96862306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
96962306a36Sopenharmony_ci * @token:	Token of DPNI object
97062306a36Sopenharmony_ci * @max_frame_length:	Maximum received frame length (in
97162306a36Sopenharmony_ci *				bytes); frame is discarded if its
97262306a36Sopenharmony_ci *				length exceeds this value
97362306a36Sopenharmony_ci *
97462306a36Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
97562306a36Sopenharmony_ci */
97662306a36Sopenharmony_ciint dpni_get_max_frame_length(struct fsl_mc_io *mc_io,
97762306a36Sopenharmony_ci			      u32 cmd_flags,
97862306a36Sopenharmony_ci			      u16 token,
97962306a36Sopenharmony_ci			      u16 *max_frame_length)
98062306a36Sopenharmony_ci{
98162306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
98262306a36Sopenharmony_ci	struct dpni_rsp_get_max_frame_length *rsp_params;
98362306a36Sopenharmony_ci	int err;
98462306a36Sopenharmony_ci
98562306a36Sopenharmony_ci	/* prepare command */
98662306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_MAX_FRAME_LENGTH,
98762306a36Sopenharmony_ci					  cmd_flags,
98862306a36Sopenharmony_ci					  token);
98962306a36Sopenharmony_ci
99062306a36Sopenharmony_ci	/* send command to mc*/
99162306a36Sopenharmony_ci	err = mc_send_command(mc_io, &cmd);
99262306a36Sopenharmony_ci	if (err)
99362306a36Sopenharmony_ci		return err;
99462306a36Sopenharmony_ci
99562306a36Sopenharmony_ci	/* retrieve response parameters */
99662306a36Sopenharmony_ci	rsp_params = (struct dpni_rsp_get_max_frame_length *)cmd.params;
99762306a36Sopenharmony_ci	*max_frame_length = le16_to_cpu(rsp_params->max_frame_length);
99862306a36Sopenharmony_ci
99962306a36Sopenharmony_ci	return 0;
100062306a36Sopenharmony_ci}
100162306a36Sopenharmony_ci
100262306a36Sopenharmony_ci/**
100362306a36Sopenharmony_ci * dpni_set_multicast_promisc() - Enable/disable multicast promiscuous mode
100462306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
100562306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
100662306a36Sopenharmony_ci * @token:	Token of DPNI object
100762306a36Sopenharmony_ci * @en:		Set to '1' to enable; '0' to disable
100862306a36Sopenharmony_ci *
100962306a36Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
101062306a36Sopenharmony_ci */
101162306a36Sopenharmony_ciint dpni_set_multicast_promisc(struct fsl_mc_io *mc_io,
101262306a36Sopenharmony_ci			       u32 cmd_flags,
101362306a36Sopenharmony_ci			       u16 token,
101462306a36Sopenharmony_ci			       int en)
101562306a36Sopenharmony_ci{
101662306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
101762306a36Sopenharmony_ci	struct dpni_cmd_set_multicast_promisc *cmd_params;
101862306a36Sopenharmony_ci
101962306a36Sopenharmony_ci	/* prepare command */
102062306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_MCAST_PROMISC,
102162306a36Sopenharmony_ci					  cmd_flags,
102262306a36Sopenharmony_ci					  token);
102362306a36Sopenharmony_ci	cmd_params = (struct dpni_cmd_set_multicast_promisc *)cmd.params;
102462306a36Sopenharmony_ci	dpni_set_field(cmd_params->enable, ENABLE, en);
102562306a36Sopenharmony_ci
102662306a36Sopenharmony_ci	/* send command to mc*/
102762306a36Sopenharmony_ci	return mc_send_command(mc_io, &cmd);
102862306a36Sopenharmony_ci}
102962306a36Sopenharmony_ci
103062306a36Sopenharmony_ci/**
103162306a36Sopenharmony_ci * dpni_get_multicast_promisc() - Get multicast promiscuous mode
103262306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
103362306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
103462306a36Sopenharmony_ci * @token:	Token of DPNI object
103562306a36Sopenharmony_ci * @en:		Returns '1' if enabled; '0' otherwise
103662306a36Sopenharmony_ci *
103762306a36Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
103862306a36Sopenharmony_ci */
103962306a36Sopenharmony_ciint dpni_get_multicast_promisc(struct fsl_mc_io *mc_io,
104062306a36Sopenharmony_ci			       u32 cmd_flags,
104162306a36Sopenharmony_ci			       u16 token,
104262306a36Sopenharmony_ci			       int *en)
104362306a36Sopenharmony_ci{
104462306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
104562306a36Sopenharmony_ci	struct dpni_rsp_get_multicast_promisc *rsp_params;
104662306a36Sopenharmony_ci	int err;
104762306a36Sopenharmony_ci
104862306a36Sopenharmony_ci	/* prepare command */
104962306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_MCAST_PROMISC,
105062306a36Sopenharmony_ci					  cmd_flags,
105162306a36Sopenharmony_ci					  token);
105262306a36Sopenharmony_ci
105362306a36Sopenharmony_ci	/* send command to mc*/
105462306a36Sopenharmony_ci	err = mc_send_command(mc_io, &cmd);
105562306a36Sopenharmony_ci	if (err)
105662306a36Sopenharmony_ci		return err;
105762306a36Sopenharmony_ci
105862306a36Sopenharmony_ci	/* retrieve response parameters */
105962306a36Sopenharmony_ci	rsp_params = (struct dpni_rsp_get_multicast_promisc *)cmd.params;
106062306a36Sopenharmony_ci	*en = dpni_get_field(rsp_params->enabled, ENABLE);
106162306a36Sopenharmony_ci
106262306a36Sopenharmony_ci	return 0;
106362306a36Sopenharmony_ci}
106462306a36Sopenharmony_ci
106562306a36Sopenharmony_ci/**
106662306a36Sopenharmony_ci * dpni_set_unicast_promisc() - Enable/disable unicast promiscuous mode
106762306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
106862306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
106962306a36Sopenharmony_ci * @token:	Token of DPNI object
107062306a36Sopenharmony_ci * @en:		Set to '1' to enable; '0' to disable
107162306a36Sopenharmony_ci *
107262306a36Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
107362306a36Sopenharmony_ci */
107462306a36Sopenharmony_ciint dpni_set_unicast_promisc(struct fsl_mc_io *mc_io,
107562306a36Sopenharmony_ci			     u32 cmd_flags,
107662306a36Sopenharmony_ci			     u16 token,
107762306a36Sopenharmony_ci			     int en)
107862306a36Sopenharmony_ci{
107962306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
108062306a36Sopenharmony_ci	struct dpni_cmd_set_unicast_promisc *cmd_params;
108162306a36Sopenharmony_ci
108262306a36Sopenharmony_ci	/* prepare command */
108362306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_UNICAST_PROMISC,
108462306a36Sopenharmony_ci					  cmd_flags,
108562306a36Sopenharmony_ci					  token);
108662306a36Sopenharmony_ci	cmd_params = (struct dpni_cmd_set_unicast_promisc *)cmd.params;
108762306a36Sopenharmony_ci	dpni_set_field(cmd_params->enable, ENABLE, en);
108862306a36Sopenharmony_ci
108962306a36Sopenharmony_ci	/* send command to mc*/
109062306a36Sopenharmony_ci	return mc_send_command(mc_io, &cmd);
109162306a36Sopenharmony_ci}
109262306a36Sopenharmony_ci
109362306a36Sopenharmony_ci/**
109462306a36Sopenharmony_ci * dpni_get_unicast_promisc() - Get unicast promiscuous mode
109562306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
109662306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
109762306a36Sopenharmony_ci * @token:	Token of DPNI object
109862306a36Sopenharmony_ci * @en:		Returns '1' if enabled; '0' otherwise
109962306a36Sopenharmony_ci *
110062306a36Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
110162306a36Sopenharmony_ci */
110262306a36Sopenharmony_ciint dpni_get_unicast_promisc(struct fsl_mc_io *mc_io,
110362306a36Sopenharmony_ci			     u32 cmd_flags,
110462306a36Sopenharmony_ci			     u16 token,
110562306a36Sopenharmony_ci			     int *en)
110662306a36Sopenharmony_ci{
110762306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
110862306a36Sopenharmony_ci	struct dpni_rsp_get_unicast_promisc *rsp_params;
110962306a36Sopenharmony_ci	int err;
111062306a36Sopenharmony_ci
111162306a36Sopenharmony_ci	/* prepare command */
111262306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_UNICAST_PROMISC,
111362306a36Sopenharmony_ci					  cmd_flags,
111462306a36Sopenharmony_ci					  token);
111562306a36Sopenharmony_ci
111662306a36Sopenharmony_ci	/* send command to mc*/
111762306a36Sopenharmony_ci	err = mc_send_command(mc_io, &cmd);
111862306a36Sopenharmony_ci	if (err)
111962306a36Sopenharmony_ci		return err;
112062306a36Sopenharmony_ci
112162306a36Sopenharmony_ci	/* retrieve response parameters */
112262306a36Sopenharmony_ci	rsp_params = (struct dpni_rsp_get_unicast_promisc *)cmd.params;
112362306a36Sopenharmony_ci	*en = dpni_get_field(rsp_params->enabled, ENABLE);
112462306a36Sopenharmony_ci
112562306a36Sopenharmony_ci	return 0;
112662306a36Sopenharmony_ci}
112762306a36Sopenharmony_ci
112862306a36Sopenharmony_ci/**
112962306a36Sopenharmony_ci * dpni_set_primary_mac_addr() - Set the primary MAC address
113062306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
113162306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
113262306a36Sopenharmony_ci * @token:	Token of DPNI object
113362306a36Sopenharmony_ci * @mac_addr:	MAC address to set as primary address
113462306a36Sopenharmony_ci *
113562306a36Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
113662306a36Sopenharmony_ci */
113762306a36Sopenharmony_ciint dpni_set_primary_mac_addr(struct fsl_mc_io *mc_io,
113862306a36Sopenharmony_ci			      u32 cmd_flags,
113962306a36Sopenharmony_ci			      u16 token,
114062306a36Sopenharmony_ci			      const u8 mac_addr[6])
114162306a36Sopenharmony_ci{
114262306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
114362306a36Sopenharmony_ci	struct dpni_cmd_set_primary_mac_addr *cmd_params;
114462306a36Sopenharmony_ci	int i;
114562306a36Sopenharmony_ci
114662306a36Sopenharmony_ci	/* prepare command */
114762306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_PRIM_MAC,
114862306a36Sopenharmony_ci					  cmd_flags,
114962306a36Sopenharmony_ci					  token);
115062306a36Sopenharmony_ci	cmd_params = (struct dpni_cmd_set_primary_mac_addr *)cmd.params;
115162306a36Sopenharmony_ci	for (i = 0; i < 6; i++)
115262306a36Sopenharmony_ci		cmd_params->mac_addr[i] = mac_addr[5 - i];
115362306a36Sopenharmony_ci
115462306a36Sopenharmony_ci	/* send command to mc*/
115562306a36Sopenharmony_ci	return mc_send_command(mc_io, &cmd);
115662306a36Sopenharmony_ci}
115762306a36Sopenharmony_ci
115862306a36Sopenharmony_ci/**
115962306a36Sopenharmony_ci * dpni_get_primary_mac_addr() - Get the primary MAC address
116062306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
116162306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
116262306a36Sopenharmony_ci * @token:	Token of DPNI object
116362306a36Sopenharmony_ci * @mac_addr:	Returned MAC address
116462306a36Sopenharmony_ci *
116562306a36Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
116662306a36Sopenharmony_ci */
116762306a36Sopenharmony_ciint dpni_get_primary_mac_addr(struct fsl_mc_io *mc_io,
116862306a36Sopenharmony_ci			      u32 cmd_flags,
116962306a36Sopenharmony_ci			      u16 token,
117062306a36Sopenharmony_ci			      u8 mac_addr[6])
117162306a36Sopenharmony_ci{
117262306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
117362306a36Sopenharmony_ci	struct dpni_rsp_get_primary_mac_addr *rsp_params;
117462306a36Sopenharmony_ci	int i, err;
117562306a36Sopenharmony_ci
117662306a36Sopenharmony_ci	/* prepare command */
117762306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_PRIM_MAC,
117862306a36Sopenharmony_ci					  cmd_flags,
117962306a36Sopenharmony_ci					  token);
118062306a36Sopenharmony_ci
118162306a36Sopenharmony_ci	/* send command to mc*/
118262306a36Sopenharmony_ci	err = mc_send_command(mc_io, &cmd);
118362306a36Sopenharmony_ci	if (err)
118462306a36Sopenharmony_ci		return err;
118562306a36Sopenharmony_ci
118662306a36Sopenharmony_ci	/* retrieve response parameters */
118762306a36Sopenharmony_ci	rsp_params = (struct dpni_rsp_get_primary_mac_addr *)cmd.params;
118862306a36Sopenharmony_ci	for (i = 0; i < 6; i++)
118962306a36Sopenharmony_ci		mac_addr[5 - i] = rsp_params->mac_addr[i];
119062306a36Sopenharmony_ci
119162306a36Sopenharmony_ci	return 0;
119262306a36Sopenharmony_ci}
119362306a36Sopenharmony_ci
119462306a36Sopenharmony_ci/**
119562306a36Sopenharmony_ci * dpni_get_port_mac_addr() - Retrieve MAC address associated to the physical
119662306a36Sopenharmony_ci *			port the DPNI is attached to
119762306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
119862306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
119962306a36Sopenharmony_ci * @token:	Token of DPNI object
120062306a36Sopenharmony_ci * @mac_addr:	MAC address of the physical port, if any, otherwise 0
120162306a36Sopenharmony_ci *
120262306a36Sopenharmony_ci * The primary MAC address is not cleared by this operation.
120362306a36Sopenharmony_ci *
120462306a36Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
120562306a36Sopenharmony_ci */
120662306a36Sopenharmony_ciint dpni_get_port_mac_addr(struct fsl_mc_io *mc_io,
120762306a36Sopenharmony_ci			   u32 cmd_flags,
120862306a36Sopenharmony_ci			   u16 token,
120962306a36Sopenharmony_ci			   u8 mac_addr[6])
121062306a36Sopenharmony_ci{
121162306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
121262306a36Sopenharmony_ci	struct dpni_rsp_get_port_mac_addr *rsp_params;
121362306a36Sopenharmony_ci	int i, err;
121462306a36Sopenharmony_ci
121562306a36Sopenharmony_ci	/* prepare command */
121662306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_PORT_MAC_ADDR,
121762306a36Sopenharmony_ci					  cmd_flags,
121862306a36Sopenharmony_ci					  token);
121962306a36Sopenharmony_ci
122062306a36Sopenharmony_ci	/* send command to mc*/
122162306a36Sopenharmony_ci	err = mc_send_command(mc_io, &cmd);
122262306a36Sopenharmony_ci	if (err)
122362306a36Sopenharmony_ci		return err;
122462306a36Sopenharmony_ci
122562306a36Sopenharmony_ci	/* retrieve response parameters */
122662306a36Sopenharmony_ci	rsp_params = (struct dpni_rsp_get_port_mac_addr *)cmd.params;
122762306a36Sopenharmony_ci	for (i = 0; i < 6; i++)
122862306a36Sopenharmony_ci		mac_addr[5 - i] = rsp_params->mac_addr[i];
122962306a36Sopenharmony_ci
123062306a36Sopenharmony_ci	return 0;
123162306a36Sopenharmony_ci}
123262306a36Sopenharmony_ci
123362306a36Sopenharmony_ci/**
123462306a36Sopenharmony_ci * dpni_enable_vlan_filter() - Enable/disable VLAN filtering mode
123562306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
123662306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
123762306a36Sopenharmony_ci * @token:	Token of DPNI object
123862306a36Sopenharmony_ci * @en:		Set to '1' to enable; '0' to disable
123962306a36Sopenharmony_ci *
124062306a36Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
124162306a36Sopenharmony_ci */
124262306a36Sopenharmony_ciint dpni_enable_vlan_filter(struct fsl_mc_io *mc_io,
124362306a36Sopenharmony_ci			    u32 cmd_flags,
124462306a36Sopenharmony_ci			    u16 token,
124562306a36Sopenharmony_ci			    u32 en)
124662306a36Sopenharmony_ci{
124762306a36Sopenharmony_ci	struct dpni_cmd_enable_vlan_filter *cmd_params;
124862306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
124962306a36Sopenharmony_ci
125062306a36Sopenharmony_ci	/* prepare command */
125162306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPNI_CMDID_ENABLE_VLAN_FILTER,
125262306a36Sopenharmony_ci					  cmd_flags,
125362306a36Sopenharmony_ci					  token);
125462306a36Sopenharmony_ci	cmd_params = (struct dpni_cmd_enable_vlan_filter *)cmd.params;
125562306a36Sopenharmony_ci	dpni_set_field(cmd_params->en, ENABLE, en);
125662306a36Sopenharmony_ci
125762306a36Sopenharmony_ci	/* send command to mc*/
125862306a36Sopenharmony_ci	return mc_send_command(mc_io, &cmd);
125962306a36Sopenharmony_ci}
126062306a36Sopenharmony_ci
126162306a36Sopenharmony_ci/**
126262306a36Sopenharmony_ci * dpni_add_vlan_id() - Add VLAN ID filter
126362306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
126462306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
126562306a36Sopenharmony_ci * @token:	Token of DPNI object
126662306a36Sopenharmony_ci * @vlan_id:	VLAN ID to add
126762306a36Sopenharmony_ci * @flags:   0 - tc_id and flow_id will be ignored.
126862306a36Sopenharmony_ci * Pkt with this vlan_id will be passed to the next
126962306a36Sopenharmony_ci * classification stages
127062306a36Sopenharmony_ci * DPNI_VLAN_SET_QUEUE_ACTION
127162306a36Sopenharmony_ci * Pkt with this vlan_id will be forward directly to
127262306a36Sopenharmony_ci * queue defined by the tc_id and flow_id
127362306a36Sopenharmony_ci *
127462306a36Sopenharmony_ci * @tc_id: Traffic class selection (0-7)
127562306a36Sopenharmony_ci * @flow_id: Selects the specific queue out of the set allocated for the
127662306a36Sopenharmony_ci *           same as tc_id. Value must be in range 0 to NUM_QUEUES - 1
127762306a36Sopenharmony_ci *
127862306a36Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
127962306a36Sopenharmony_ci */
128062306a36Sopenharmony_ciint dpni_add_vlan_id(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
128162306a36Sopenharmony_ci		     u16 vlan_id, u8 flags, u8 tc_id, u8 flow_id)
128262306a36Sopenharmony_ci{
128362306a36Sopenharmony_ci	struct dpni_cmd_vlan_id *cmd_params;
128462306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
128562306a36Sopenharmony_ci
128662306a36Sopenharmony_ci	/* prepare command */
128762306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPNI_CMDID_ADD_VLAN_ID,
128862306a36Sopenharmony_ci					  cmd_flags,
128962306a36Sopenharmony_ci					  token);
129062306a36Sopenharmony_ci	cmd_params = (struct dpni_cmd_vlan_id *)cmd.params;
129162306a36Sopenharmony_ci	cmd_params->flags = flags;
129262306a36Sopenharmony_ci	cmd_params->tc_id = tc_id;
129362306a36Sopenharmony_ci	cmd_params->flow_id =  flow_id;
129462306a36Sopenharmony_ci	cmd_params->vlan_id = cpu_to_le16(vlan_id);
129562306a36Sopenharmony_ci
129662306a36Sopenharmony_ci	/* send command to mc*/
129762306a36Sopenharmony_ci	return mc_send_command(mc_io, &cmd);
129862306a36Sopenharmony_ci}
129962306a36Sopenharmony_ci
130062306a36Sopenharmony_ci/**
130162306a36Sopenharmony_ci * dpni_remove_vlan_id() - Remove VLAN ID filter
130262306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
130362306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
130462306a36Sopenharmony_ci * @token:	Token of DPNI object
130562306a36Sopenharmony_ci * @vlan_id:	VLAN ID to remove
130662306a36Sopenharmony_ci *
130762306a36Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
130862306a36Sopenharmony_ci */
130962306a36Sopenharmony_ciint dpni_remove_vlan_id(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
131062306a36Sopenharmony_ci			u16 vlan_id)
131162306a36Sopenharmony_ci{
131262306a36Sopenharmony_ci	struct dpni_cmd_vlan_id *cmd_params;
131362306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
131462306a36Sopenharmony_ci
131562306a36Sopenharmony_ci	/* prepare command */
131662306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPNI_CMDID_REMOVE_VLAN_ID,
131762306a36Sopenharmony_ci					  cmd_flags,
131862306a36Sopenharmony_ci					  token);
131962306a36Sopenharmony_ci	cmd_params = (struct dpni_cmd_vlan_id *)cmd.params;
132062306a36Sopenharmony_ci	cmd_params->vlan_id = cpu_to_le16(vlan_id);
132162306a36Sopenharmony_ci
132262306a36Sopenharmony_ci	/* send command to mc*/
132362306a36Sopenharmony_ci	return mc_send_command(mc_io, &cmd);
132462306a36Sopenharmony_ci}
132562306a36Sopenharmony_ci
132662306a36Sopenharmony_ci/**
132762306a36Sopenharmony_ci * dpni_add_mac_addr() - Add MAC address filter
132862306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
132962306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
133062306a36Sopenharmony_ci * @token:	Token of DPNI object
133162306a36Sopenharmony_ci * @mac_addr:	MAC address to add
133262306a36Sopenharmony_ci *
133362306a36Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
133462306a36Sopenharmony_ci */
133562306a36Sopenharmony_ciint dpni_add_mac_addr(struct fsl_mc_io *mc_io,
133662306a36Sopenharmony_ci		      u32 cmd_flags,
133762306a36Sopenharmony_ci		      u16 token,
133862306a36Sopenharmony_ci		      const u8 mac_addr[6])
133962306a36Sopenharmony_ci{
134062306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
134162306a36Sopenharmony_ci	struct dpni_cmd_add_mac_addr *cmd_params;
134262306a36Sopenharmony_ci	int i;
134362306a36Sopenharmony_ci
134462306a36Sopenharmony_ci	/* prepare command */
134562306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPNI_CMDID_ADD_MAC_ADDR,
134662306a36Sopenharmony_ci					  cmd_flags,
134762306a36Sopenharmony_ci					  token);
134862306a36Sopenharmony_ci	cmd_params = (struct dpni_cmd_add_mac_addr *)cmd.params;
134962306a36Sopenharmony_ci	for (i = 0; i < 6; i++)
135062306a36Sopenharmony_ci		cmd_params->mac_addr[i] = mac_addr[5 - i];
135162306a36Sopenharmony_ci
135262306a36Sopenharmony_ci	/* send command to mc*/
135362306a36Sopenharmony_ci	return mc_send_command(mc_io, &cmd);
135462306a36Sopenharmony_ci}
135562306a36Sopenharmony_ci
135662306a36Sopenharmony_ci/**
135762306a36Sopenharmony_ci * dpni_remove_mac_addr() - Remove MAC address filter
135862306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
135962306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
136062306a36Sopenharmony_ci * @token:	Token of DPNI object
136162306a36Sopenharmony_ci * @mac_addr:	MAC address to remove
136262306a36Sopenharmony_ci *
136362306a36Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
136462306a36Sopenharmony_ci */
136562306a36Sopenharmony_ciint dpni_remove_mac_addr(struct fsl_mc_io *mc_io,
136662306a36Sopenharmony_ci			 u32 cmd_flags,
136762306a36Sopenharmony_ci			 u16 token,
136862306a36Sopenharmony_ci			 const u8 mac_addr[6])
136962306a36Sopenharmony_ci{
137062306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
137162306a36Sopenharmony_ci	struct dpni_cmd_remove_mac_addr *cmd_params;
137262306a36Sopenharmony_ci	int i;
137362306a36Sopenharmony_ci
137462306a36Sopenharmony_ci	/* prepare command */
137562306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPNI_CMDID_REMOVE_MAC_ADDR,
137662306a36Sopenharmony_ci					  cmd_flags,
137762306a36Sopenharmony_ci					  token);
137862306a36Sopenharmony_ci	cmd_params = (struct dpni_cmd_remove_mac_addr *)cmd.params;
137962306a36Sopenharmony_ci	for (i = 0; i < 6; i++)
138062306a36Sopenharmony_ci		cmd_params->mac_addr[i] = mac_addr[5 - i];
138162306a36Sopenharmony_ci
138262306a36Sopenharmony_ci	/* send command to mc*/
138362306a36Sopenharmony_ci	return mc_send_command(mc_io, &cmd);
138462306a36Sopenharmony_ci}
138562306a36Sopenharmony_ci
138662306a36Sopenharmony_ci/**
138762306a36Sopenharmony_ci * dpni_clear_mac_filters() - Clear all unicast and/or multicast MAC filters
138862306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
138962306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
139062306a36Sopenharmony_ci * @token:	Token of DPNI object
139162306a36Sopenharmony_ci * @unicast:	Set to '1' to clear unicast addresses
139262306a36Sopenharmony_ci * @multicast:	Set to '1' to clear multicast addresses
139362306a36Sopenharmony_ci *
139462306a36Sopenharmony_ci * The primary MAC address is not cleared by this operation.
139562306a36Sopenharmony_ci *
139662306a36Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
139762306a36Sopenharmony_ci */
139862306a36Sopenharmony_ciint dpni_clear_mac_filters(struct fsl_mc_io *mc_io,
139962306a36Sopenharmony_ci			   u32 cmd_flags,
140062306a36Sopenharmony_ci			   u16 token,
140162306a36Sopenharmony_ci			   int unicast,
140262306a36Sopenharmony_ci			   int multicast)
140362306a36Sopenharmony_ci{
140462306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
140562306a36Sopenharmony_ci	struct dpni_cmd_clear_mac_filters *cmd_params;
140662306a36Sopenharmony_ci
140762306a36Sopenharmony_ci	/* prepare command */
140862306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPNI_CMDID_CLR_MAC_FILTERS,
140962306a36Sopenharmony_ci					  cmd_flags,
141062306a36Sopenharmony_ci					  token);
141162306a36Sopenharmony_ci	cmd_params = (struct dpni_cmd_clear_mac_filters *)cmd.params;
141262306a36Sopenharmony_ci	dpni_set_field(cmd_params->flags, UNICAST_FILTERS, unicast);
141362306a36Sopenharmony_ci	dpni_set_field(cmd_params->flags, MULTICAST_FILTERS, multicast);
141462306a36Sopenharmony_ci
141562306a36Sopenharmony_ci	/* send command to mc*/
141662306a36Sopenharmony_ci	return mc_send_command(mc_io, &cmd);
141762306a36Sopenharmony_ci}
141862306a36Sopenharmony_ci
141962306a36Sopenharmony_ci/**
142062306a36Sopenharmony_ci * dpni_set_rx_tc_dist() - Set Rx traffic class distribution configuration
142162306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
142262306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
142362306a36Sopenharmony_ci * @token:	Token of DPNI object
142462306a36Sopenharmony_ci * @tc_id:	Traffic class selection (0-7)
142562306a36Sopenharmony_ci * @cfg:	Traffic class distribution configuration
142662306a36Sopenharmony_ci *
142762306a36Sopenharmony_ci * warning: if 'dist_mode != DPNI_DIST_MODE_NONE', call dpni_prepare_key_cfg()
142862306a36Sopenharmony_ci *			first to prepare the key_cfg_iova parameter
142962306a36Sopenharmony_ci *
143062306a36Sopenharmony_ci * Return:	'0' on Success; error code otherwise.
143162306a36Sopenharmony_ci */
143262306a36Sopenharmony_ciint dpni_set_rx_tc_dist(struct fsl_mc_io *mc_io,
143362306a36Sopenharmony_ci			u32 cmd_flags,
143462306a36Sopenharmony_ci			u16 token,
143562306a36Sopenharmony_ci			u8 tc_id,
143662306a36Sopenharmony_ci			const struct dpni_rx_tc_dist_cfg *cfg)
143762306a36Sopenharmony_ci{
143862306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
143962306a36Sopenharmony_ci	struct dpni_cmd_set_rx_tc_dist *cmd_params;
144062306a36Sopenharmony_ci
144162306a36Sopenharmony_ci	/* prepare command */
144262306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_RX_TC_DIST,
144362306a36Sopenharmony_ci					  cmd_flags,
144462306a36Sopenharmony_ci					  token);
144562306a36Sopenharmony_ci	cmd_params = (struct dpni_cmd_set_rx_tc_dist *)cmd.params;
144662306a36Sopenharmony_ci	cmd_params->dist_size = cpu_to_le16(cfg->dist_size);
144762306a36Sopenharmony_ci	cmd_params->tc_id = tc_id;
144862306a36Sopenharmony_ci	dpni_set_field(cmd_params->flags, DIST_MODE, cfg->dist_mode);
144962306a36Sopenharmony_ci	dpni_set_field(cmd_params->flags, MISS_ACTION, cfg->fs_cfg.miss_action);
145062306a36Sopenharmony_ci	cmd_params->default_flow_id = cpu_to_le16(cfg->fs_cfg.default_flow_id);
145162306a36Sopenharmony_ci	cmd_params->key_cfg_iova = cpu_to_le64(cfg->key_cfg_iova);
145262306a36Sopenharmony_ci
145362306a36Sopenharmony_ci	/* send command to mc*/
145462306a36Sopenharmony_ci	return mc_send_command(mc_io, &cmd);
145562306a36Sopenharmony_ci}
145662306a36Sopenharmony_ci
145762306a36Sopenharmony_ci/**
145862306a36Sopenharmony_ci * dpni_set_congestion_notification() - Set traffic class congestion
145962306a36Sopenharmony_ci *					notification configuration
146062306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
146162306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
146262306a36Sopenharmony_ci * @token:	Token of DPNI object
146362306a36Sopenharmony_ci * @qtype:	Type of queue - Rx, Tx and Tx confirm types are supported
146462306a36Sopenharmony_ci * @tc_id:	Traffic class selection (0-7)
146562306a36Sopenharmony_ci * @cfg:	Congestion notification configuration
146662306a36Sopenharmony_ci *
146762306a36Sopenharmony_ci * Return:	'0' on Success; error code otherwise.
146862306a36Sopenharmony_ci */
146962306a36Sopenharmony_ciint dpni_set_congestion_notification(
147062306a36Sopenharmony_ci			struct fsl_mc_io *mc_io,
147162306a36Sopenharmony_ci			u32 cmd_flags,
147262306a36Sopenharmony_ci			u16 token,
147362306a36Sopenharmony_ci			enum dpni_queue_type qtype,
147462306a36Sopenharmony_ci			u8 tc_id,
147562306a36Sopenharmony_ci			const struct dpni_congestion_notification_cfg *cfg)
147662306a36Sopenharmony_ci{
147762306a36Sopenharmony_ci	struct dpni_cmd_set_congestion_notification *cmd_params;
147862306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
147962306a36Sopenharmony_ci
148062306a36Sopenharmony_ci	/* prepare command */
148162306a36Sopenharmony_ci	cmd.header =
148262306a36Sopenharmony_ci		mc_encode_cmd_header(DPNI_CMDID_SET_CONGESTION_NOTIFICATION,
148362306a36Sopenharmony_ci				     cmd_flags,
148462306a36Sopenharmony_ci				     token);
148562306a36Sopenharmony_ci	cmd_params = (struct dpni_cmd_set_congestion_notification *)cmd.params;
148662306a36Sopenharmony_ci	cmd_params->qtype = qtype;
148762306a36Sopenharmony_ci	cmd_params->tc = tc_id;
148862306a36Sopenharmony_ci	cmd_params->dest_id = cpu_to_le32(cfg->dest_cfg.dest_id);
148962306a36Sopenharmony_ci	cmd_params->notification_mode = cpu_to_le16(cfg->notification_mode);
149062306a36Sopenharmony_ci	cmd_params->dest_priority = cfg->dest_cfg.priority;
149162306a36Sopenharmony_ci	dpni_set_field(cmd_params->type_units, DEST_TYPE,
149262306a36Sopenharmony_ci		       cfg->dest_cfg.dest_type);
149362306a36Sopenharmony_ci	dpni_set_field(cmd_params->type_units, CONG_UNITS, cfg->units);
149462306a36Sopenharmony_ci	cmd_params->message_iova = cpu_to_le64(cfg->message_iova);
149562306a36Sopenharmony_ci	cmd_params->message_ctx = cpu_to_le64(cfg->message_ctx);
149662306a36Sopenharmony_ci	cmd_params->threshold_entry = cpu_to_le32(cfg->threshold_entry);
149762306a36Sopenharmony_ci	cmd_params->threshold_exit = cpu_to_le32(cfg->threshold_exit);
149862306a36Sopenharmony_ci
149962306a36Sopenharmony_ci	/* send command to mc*/
150062306a36Sopenharmony_ci	return mc_send_command(mc_io, &cmd);
150162306a36Sopenharmony_ci}
150262306a36Sopenharmony_ci
150362306a36Sopenharmony_ci/**
150462306a36Sopenharmony_ci * dpni_set_queue() - Set queue parameters
150562306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
150662306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
150762306a36Sopenharmony_ci * @token:	Token of DPNI object
150862306a36Sopenharmony_ci * @qtype:	Type of queue - all queue types are supported, although
150962306a36Sopenharmony_ci *		the command is ignored for Tx
151062306a36Sopenharmony_ci * @tc:		Traffic class, in range 0 to NUM_TCS - 1
151162306a36Sopenharmony_ci * @index:	Selects the specific queue out of the set allocated for the
151262306a36Sopenharmony_ci *		same TC. Value must be in range 0 to NUM_QUEUES - 1
151362306a36Sopenharmony_ci * @options:	A combination of DPNI_QUEUE_OPT_ values that control what
151462306a36Sopenharmony_ci *		configuration options are set on the queue
151562306a36Sopenharmony_ci * @queue:	Queue structure
151662306a36Sopenharmony_ci *
151762306a36Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
151862306a36Sopenharmony_ci */
151962306a36Sopenharmony_ciint dpni_set_queue(struct fsl_mc_io *mc_io,
152062306a36Sopenharmony_ci		   u32 cmd_flags,
152162306a36Sopenharmony_ci		   u16 token,
152262306a36Sopenharmony_ci		   enum dpni_queue_type qtype,
152362306a36Sopenharmony_ci		   u8 tc,
152462306a36Sopenharmony_ci		   u8 index,
152562306a36Sopenharmony_ci		   u8 options,
152662306a36Sopenharmony_ci		   const struct dpni_queue *queue)
152762306a36Sopenharmony_ci{
152862306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
152962306a36Sopenharmony_ci	struct dpni_cmd_set_queue *cmd_params;
153062306a36Sopenharmony_ci
153162306a36Sopenharmony_ci	/* prepare command */
153262306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_QUEUE,
153362306a36Sopenharmony_ci					  cmd_flags,
153462306a36Sopenharmony_ci					  token);
153562306a36Sopenharmony_ci	cmd_params = (struct dpni_cmd_set_queue *)cmd.params;
153662306a36Sopenharmony_ci	cmd_params->qtype = qtype;
153762306a36Sopenharmony_ci	cmd_params->tc = tc;
153862306a36Sopenharmony_ci	cmd_params->index = index;
153962306a36Sopenharmony_ci	cmd_params->options = options;
154062306a36Sopenharmony_ci	cmd_params->dest_id = cpu_to_le32(queue->destination.id);
154162306a36Sopenharmony_ci	cmd_params->dest_prio = queue->destination.priority;
154262306a36Sopenharmony_ci	dpni_set_field(cmd_params->flags, DEST_TYPE, queue->destination.type);
154362306a36Sopenharmony_ci	dpni_set_field(cmd_params->flags, STASH_CTRL, queue->flc.stash_control);
154462306a36Sopenharmony_ci	dpni_set_field(cmd_params->flags, HOLD_ACTIVE,
154562306a36Sopenharmony_ci		       queue->destination.hold_active);
154662306a36Sopenharmony_ci	cmd_params->flc = cpu_to_le64(queue->flc.value);
154762306a36Sopenharmony_ci	cmd_params->user_context = cpu_to_le64(queue->user_context);
154862306a36Sopenharmony_ci
154962306a36Sopenharmony_ci	/* send command to mc */
155062306a36Sopenharmony_ci	return mc_send_command(mc_io, &cmd);
155162306a36Sopenharmony_ci}
155262306a36Sopenharmony_ci
155362306a36Sopenharmony_ci/**
155462306a36Sopenharmony_ci * dpni_get_queue() - Get queue parameters
155562306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
155662306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
155762306a36Sopenharmony_ci * @token:	Token of DPNI object
155862306a36Sopenharmony_ci * @qtype:	Type of queue - all queue types are supported
155962306a36Sopenharmony_ci * @tc:		Traffic class, in range 0 to NUM_TCS - 1
156062306a36Sopenharmony_ci * @index:	Selects the specific queue out of the set allocated for the
156162306a36Sopenharmony_ci *		same TC. Value must be in range 0 to NUM_QUEUES - 1
156262306a36Sopenharmony_ci * @queue:	Queue configuration structure
156362306a36Sopenharmony_ci * @qid:	Queue identification
156462306a36Sopenharmony_ci *
156562306a36Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
156662306a36Sopenharmony_ci */
156762306a36Sopenharmony_ciint dpni_get_queue(struct fsl_mc_io *mc_io,
156862306a36Sopenharmony_ci		   u32 cmd_flags,
156962306a36Sopenharmony_ci		   u16 token,
157062306a36Sopenharmony_ci		   enum dpni_queue_type qtype,
157162306a36Sopenharmony_ci		   u8 tc,
157262306a36Sopenharmony_ci		   u8 index,
157362306a36Sopenharmony_ci		   struct dpni_queue *queue,
157462306a36Sopenharmony_ci		   struct dpni_queue_id *qid)
157562306a36Sopenharmony_ci{
157662306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
157762306a36Sopenharmony_ci	struct dpni_cmd_get_queue *cmd_params;
157862306a36Sopenharmony_ci	struct dpni_rsp_get_queue *rsp_params;
157962306a36Sopenharmony_ci	int err;
158062306a36Sopenharmony_ci
158162306a36Sopenharmony_ci	/* prepare command */
158262306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_QUEUE,
158362306a36Sopenharmony_ci					  cmd_flags,
158462306a36Sopenharmony_ci					  token);
158562306a36Sopenharmony_ci	cmd_params = (struct dpni_cmd_get_queue *)cmd.params;
158662306a36Sopenharmony_ci	cmd_params->qtype = qtype;
158762306a36Sopenharmony_ci	cmd_params->tc = tc;
158862306a36Sopenharmony_ci	cmd_params->index = index;
158962306a36Sopenharmony_ci
159062306a36Sopenharmony_ci	/* send command to mc */
159162306a36Sopenharmony_ci	err = mc_send_command(mc_io, &cmd);
159262306a36Sopenharmony_ci	if (err)
159362306a36Sopenharmony_ci		return err;
159462306a36Sopenharmony_ci
159562306a36Sopenharmony_ci	/* retrieve response parameters */
159662306a36Sopenharmony_ci	rsp_params = (struct dpni_rsp_get_queue *)cmd.params;
159762306a36Sopenharmony_ci	queue->destination.id = le32_to_cpu(rsp_params->dest_id);
159862306a36Sopenharmony_ci	queue->destination.priority = rsp_params->dest_prio;
159962306a36Sopenharmony_ci	queue->destination.type = dpni_get_field(rsp_params->flags,
160062306a36Sopenharmony_ci						 DEST_TYPE);
160162306a36Sopenharmony_ci	queue->flc.stash_control = dpni_get_field(rsp_params->flags,
160262306a36Sopenharmony_ci						  STASH_CTRL);
160362306a36Sopenharmony_ci	queue->destination.hold_active = dpni_get_field(rsp_params->flags,
160462306a36Sopenharmony_ci							HOLD_ACTIVE);
160562306a36Sopenharmony_ci	queue->flc.value = le64_to_cpu(rsp_params->flc);
160662306a36Sopenharmony_ci	queue->user_context = le64_to_cpu(rsp_params->user_context);
160762306a36Sopenharmony_ci	qid->fqid = le32_to_cpu(rsp_params->fqid);
160862306a36Sopenharmony_ci	qid->qdbin = le16_to_cpu(rsp_params->qdbin);
160962306a36Sopenharmony_ci
161062306a36Sopenharmony_ci	return 0;
161162306a36Sopenharmony_ci}
161262306a36Sopenharmony_ci
161362306a36Sopenharmony_ci/**
161462306a36Sopenharmony_ci * dpni_get_statistics() - Get DPNI statistics
161562306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
161662306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
161762306a36Sopenharmony_ci * @token:	Token of DPNI object
161862306a36Sopenharmony_ci * @page:	Selects the statistics page to retrieve, see
161962306a36Sopenharmony_ci *		DPNI_GET_STATISTICS output. Pages are numbered 0 to 6.
162062306a36Sopenharmony_ci * @stat:	Structure containing the statistics
162162306a36Sopenharmony_ci *
162262306a36Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
162362306a36Sopenharmony_ci */
162462306a36Sopenharmony_ciint dpni_get_statistics(struct fsl_mc_io *mc_io,
162562306a36Sopenharmony_ci			u32 cmd_flags,
162662306a36Sopenharmony_ci			u16 token,
162762306a36Sopenharmony_ci			u8 page,
162862306a36Sopenharmony_ci			union dpni_statistics *stat)
162962306a36Sopenharmony_ci{
163062306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
163162306a36Sopenharmony_ci	struct dpni_cmd_get_statistics *cmd_params;
163262306a36Sopenharmony_ci	struct dpni_rsp_get_statistics *rsp_params;
163362306a36Sopenharmony_ci	int i, err;
163462306a36Sopenharmony_ci
163562306a36Sopenharmony_ci	/* prepare command */
163662306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_STATISTICS,
163762306a36Sopenharmony_ci					  cmd_flags,
163862306a36Sopenharmony_ci					  token);
163962306a36Sopenharmony_ci	cmd_params = (struct dpni_cmd_get_statistics *)cmd.params;
164062306a36Sopenharmony_ci	cmd_params->page_number = page;
164162306a36Sopenharmony_ci
164262306a36Sopenharmony_ci	/* send command to mc */
164362306a36Sopenharmony_ci	err = mc_send_command(mc_io, &cmd);
164462306a36Sopenharmony_ci	if (err)
164562306a36Sopenharmony_ci		return err;
164662306a36Sopenharmony_ci
164762306a36Sopenharmony_ci	/* retrieve response parameters */
164862306a36Sopenharmony_ci	rsp_params = (struct dpni_rsp_get_statistics *)cmd.params;
164962306a36Sopenharmony_ci	for (i = 0; i < DPNI_STATISTICS_CNT; i++)
165062306a36Sopenharmony_ci		stat->raw.counter[i] = le64_to_cpu(rsp_params->counter[i]);
165162306a36Sopenharmony_ci
165262306a36Sopenharmony_ci	return 0;
165362306a36Sopenharmony_ci}
165462306a36Sopenharmony_ci
165562306a36Sopenharmony_ci/**
165662306a36Sopenharmony_ci * dpni_set_taildrop() - Set taildrop per queue or TC
165762306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
165862306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
165962306a36Sopenharmony_ci * @token:	Token of DPNI object
166062306a36Sopenharmony_ci * @cg_point:	Congestion point
166162306a36Sopenharmony_ci * @qtype:	Queue type on which the taildrop is configured.
166262306a36Sopenharmony_ci *		Only Rx queues are supported for now
166362306a36Sopenharmony_ci * @tc:		Traffic class to apply this taildrop to
166462306a36Sopenharmony_ci * @index:	Index of the queue if the DPNI supports multiple queues for
166562306a36Sopenharmony_ci *		traffic distribution. Ignored if CONGESTION_POINT is not 0.
166662306a36Sopenharmony_ci * @taildrop:	Taildrop structure
166762306a36Sopenharmony_ci *
166862306a36Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
166962306a36Sopenharmony_ci */
167062306a36Sopenharmony_ciint dpni_set_taildrop(struct fsl_mc_io *mc_io,
167162306a36Sopenharmony_ci		      u32 cmd_flags,
167262306a36Sopenharmony_ci		      u16 token,
167362306a36Sopenharmony_ci		      enum dpni_congestion_point cg_point,
167462306a36Sopenharmony_ci		      enum dpni_queue_type qtype,
167562306a36Sopenharmony_ci		      u8 tc,
167662306a36Sopenharmony_ci		      u8 index,
167762306a36Sopenharmony_ci		      struct dpni_taildrop *taildrop)
167862306a36Sopenharmony_ci{
167962306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
168062306a36Sopenharmony_ci	struct dpni_cmd_set_taildrop *cmd_params;
168162306a36Sopenharmony_ci
168262306a36Sopenharmony_ci	/* prepare command */
168362306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_TAILDROP,
168462306a36Sopenharmony_ci					  cmd_flags,
168562306a36Sopenharmony_ci					  token);
168662306a36Sopenharmony_ci	cmd_params = (struct dpni_cmd_set_taildrop *)cmd.params;
168762306a36Sopenharmony_ci	cmd_params->congestion_point = cg_point;
168862306a36Sopenharmony_ci	cmd_params->qtype = qtype;
168962306a36Sopenharmony_ci	cmd_params->tc = tc;
169062306a36Sopenharmony_ci	cmd_params->index = index;
169162306a36Sopenharmony_ci	dpni_set_field(cmd_params->enable, ENABLE, taildrop->enable);
169262306a36Sopenharmony_ci	cmd_params->units = taildrop->units;
169362306a36Sopenharmony_ci	cmd_params->threshold = cpu_to_le32(taildrop->threshold);
169462306a36Sopenharmony_ci
169562306a36Sopenharmony_ci	/* send command to mc */
169662306a36Sopenharmony_ci	return mc_send_command(mc_io, &cmd);
169762306a36Sopenharmony_ci}
169862306a36Sopenharmony_ci
169962306a36Sopenharmony_ci/**
170062306a36Sopenharmony_ci * dpni_get_taildrop() - Get taildrop information
170162306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
170262306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
170362306a36Sopenharmony_ci * @token:	Token of DPNI object
170462306a36Sopenharmony_ci * @cg_point:	Congestion point
170562306a36Sopenharmony_ci * @qtype:	Queue type on which the taildrop is configured.
170662306a36Sopenharmony_ci *		Only Rx queues are supported for now
170762306a36Sopenharmony_ci * @tc:		Traffic class to apply this taildrop to
170862306a36Sopenharmony_ci * @index:	Index of the queue if the DPNI supports multiple queues for
170962306a36Sopenharmony_ci *		traffic distribution. Ignored if CONGESTION_POINT is not 0.
171062306a36Sopenharmony_ci * @taildrop:	Taildrop structure
171162306a36Sopenharmony_ci *
171262306a36Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
171362306a36Sopenharmony_ci */
171462306a36Sopenharmony_ciint dpni_get_taildrop(struct fsl_mc_io *mc_io,
171562306a36Sopenharmony_ci		      u32 cmd_flags,
171662306a36Sopenharmony_ci		      u16 token,
171762306a36Sopenharmony_ci		      enum dpni_congestion_point cg_point,
171862306a36Sopenharmony_ci		      enum dpni_queue_type qtype,
171962306a36Sopenharmony_ci		      u8 tc,
172062306a36Sopenharmony_ci		      u8 index,
172162306a36Sopenharmony_ci		      struct dpni_taildrop *taildrop)
172262306a36Sopenharmony_ci{
172362306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
172462306a36Sopenharmony_ci	struct dpni_cmd_get_taildrop *cmd_params;
172562306a36Sopenharmony_ci	struct dpni_rsp_get_taildrop *rsp_params;
172662306a36Sopenharmony_ci	int err;
172762306a36Sopenharmony_ci
172862306a36Sopenharmony_ci	/* prepare command */
172962306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_TAILDROP,
173062306a36Sopenharmony_ci					  cmd_flags,
173162306a36Sopenharmony_ci					  token);
173262306a36Sopenharmony_ci	cmd_params = (struct dpni_cmd_get_taildrop *)cmd.params;
173362306a36Sopenharmony_ci	cmd_params->congestion_point = cg_point;
173462306a36Sopenharmony_ci	cmd_params->qtype = qtype;
173562306a36Sopenharmony_ci	cmd_params->tc = tc;
173662306a36Sopenharmony_ci	cmd_params->index = index;
173762306a36Sopenharmony_ci
173862306a36Sopenharmony_ci	/* send command to mc */
173962306a36Sopenharmony_ci	err = mc_send_command(mc_io, &cmd);
174062306a36Sopenharmony_ci	if (err)
174162306a36Sopenharmony_ci		return err;
174262306a36Sopenharmony_ci
174362306a36Sopenharmony_ci	/* retrieve response parameters */
174462306a36Sopenharmony_ci	rsp_params = (struct dpni_rsp_get_taildrop *)cmd.params;
174562306a36Sopenharmony_ci	taildrop->enable = dpni_get_field(rsp_params->enable, ENABLE);
174662306a36Sopenharmony_ci	taildrop->units = rsp_params->units;
174762306a36Sopenharmony_ci	taildrop->threshold = le32_to_cpu(rsp_params->threshold);
174862306a36Sopenharmony_ci
174962306a36Sopenharmony_ci	return 0;
175062306a36Sopenharmony_ci}
175162306a36Sopenharmony_ci
175262306a36Sopenharmony_ci/**
175362306a36Sopenharmony_ci * dpni_get_api_version() - Get Data Path Network Interface API version
175462306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
175562306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
175662306a36Sopenharmony_ci * @major_ver:	Major version of data path network interface API
175762306a36Sopenharmony_ci * @minor_ver:	Minor version of data path network interface API
175862306a36Sopenharmony_ci *
175962306a36Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
176062306a36Sopenharmony_ci */
176162306a36Sopenharmony_ciint dpni_get_api_version(struct fsl_mc_io *mc_io,
176262306a36Sopenharmony_ci			 u32 cmd_flags,
176362306a36Sopenharmony_ci			 u16 *major_ver,
176462306a36Sopenharmony_ci			 u16 *minor_ver)
176562306a36Sopenharmony_ci{
176662306a36Sopenharmony_ci	struct dpni_rsp_get_api_version *rsp_params;
176762306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
176862306a36Sopenharmony_ci	int err;
176962306a36Sopenharmony_ci
177062306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_API_VERSION,
177162306a36Sopenharmony_ci					  cmd_flags, 0);
177262306a36Sopenharmony_ci
177362306a36Sopenharmony_ci	err = mc_send_command(mc_io, &cmd);
177462306a36Sopenharmony_ci	if (err)
177562306a36Sopenharmony_ci		return err;
177662306a36Sopenharmony_ci
177762306a36Sopenharmony_ci	rsp_params = (struct dpni_rsp_get_api_version *)cmd.params;
177862306a36Sopenharmony_ci	*major_ver = le16_to_cpu(rsp_params->major);
177962306a36Sopenharmony_ci	*minor_ver = le16_to_cpu(rsp_params->minor);
178062306a36Sopenharmony_ci
178162306a36Sopenharmony_ci	return 0;
178262306a36Sopenharmony_ci}
178362306a36Sopenharmony_ci
178462306a36Sopenharmony_ci/**
178562306a36Sopenharmony_ci * dpni_set_rx_fs_dist() - Set Rx flow steering distribution
178662306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
178762306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
178862306a36Sopenharmony_ci * @token:	Token of DPNI object
178962306a36Sopenharmony_ci * @cfg: Distribution configuration
179062306a36Sopenharmony_ci *
179162306a36Sopenharmony_ci * If the FS is already enabled with a previous call the classification
179262306a36Sopenharmony_ci * key will be changed but all the table rules are kept. If the
179362306a36Sopenharmony_ci * existing rules do not match the key the results will not be
179462306a36Sopenharmony_ci * predictable. It is the user responsibility to keep key integrity.
179562306a36Sopenharmony_ci * If cfg.enable is set to 1 the command will create a flow steering table
179662306a36Sopenharmony_ci * and will classify packets according to this table. The packets that
179762306a36Sopenharmony_ci * miss all the table rules will be classified according to settings
179862306a36Sopenharmony_ci * made in dpni_set_rx_hash_dist()
179962306a36Sopenharmony_ci * If cfg.enable is set to 0 the command will clear flow steering table.
180062306a36Sopenharmony_ci * The packets will be classified according to settings made in
180162306a36Sopenharmony_ci * dpni_set_rx_hash_dist()
180262306a36Sopenharmony_ci *
180362306a36Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
180462306a36Sopenharmony_ci */
180562306a36Sopenharmony_ciint dpni_set_rx_fs_dist(struct fsl_mc_io *mc_io,
180662306a36Sopenharmony_ci			u32 cmd_flags,
180762306a36Sopenharmony_ci			u16 token,
180862306a36Sopenharmony_ci			const struct dpni_rx_dist_cfg *cfg)
180962306a36Sopenharmony_ci{
181062306a36Sopenharmony_ci	struct dpni_cmd_set_rx_fs_dist *cmd_params;
181162306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
181262306a36Sopenharmony_ci
181362306a36Sopenharmony_ci	/* prepare command */
181462306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_RX_FS_DIST,
181562306a36Sopenharmony_ci					  cmd_flags,
181662306a36Sopenharmony_ci					  token);
181762306a36Sopenharmony_ci	cmd_params = (struct dpni_cmd_set_rx_fs_dist *)cmd.params;
181862306a36Sopenharmony_ci	cmd_params->dist_size = cpu_to_le16(cfg->dist_size);
181962306a36Sopenharmony_ci	dpni_set_field(cmd_params->enable, RX_FS_DIST_ENABLE, cfg->enable);
182062306a36Sopenharmony_ci	cmd_params->tc = cfg->tc;
182162306a36Sopenharmony_ci	cmd_params->miss_flow_id = cpu_to_le16(cfg->fs_miss_flow_id);
182262306a36Sopenharmony_ci	cmd_params->key_cfg_iova = cpu_to_le64(cfg->key_cfg_iova);
182362306a36Sopenharmony_ci
182462306a36Sopenharmony_ci	/* send command to mc*/
182562306a36Sopenharmony_ci	return mc_send_command(mc_io, &cmd);
182662306a36Sopenharmony_ci}
182762306a36Sopenharmony_ci
182862306a36Sopenharmony_ci/**
182962306a36Sopenharmony_ci * dpni_set_rx_hash_dist() - Set Rx hash distribution
183062306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
183162306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
183262306a36Sopenharmony_ci * @token:	Token of DPNI object
183362306a36Sopenharmony_ci * @cfg: Distribution configuration
183462306a36Sopenharmony_ci * If cfg.enable is set to 1 the packets will be classified using a hash
183562306a36Sopenharmony_ci * function based on the key received in cfg.key_cfg_iova parameter.
183662306a36Sopenharmony_ci * If cfg.enable is set to 0 the packets will be sent to the default queue
183762306a36Sopenharmony_ci *
183862306a36Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
183962306a36Sopenharmony_ci */
184062306a36Sopenharmony_ciint dpni_set_rx_hash_dist(struct fsl_mc_io *mc_io,
184162306a36Sopenharmony_ci			  u32 cmd_flags,
184262306a36Sopenharmony_ci			  u16 token,
184362306a36Sopenharmony_ci			  const struct dpni_rx_dist_cfg *cfg)
184462306a36Sopenharmony_ci{
184562306a36Sopenharmony_ci	struct dpni_cmd_set_rx_hash_dist *cmd_params;
184662306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
184762306a36Sopenharmony_ci
184862306a36Sopenharmony_ci	/* prepare command */
184962306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_RX_HASH_DIST,
185062306a36Sopenharmony_ci					  cmd_flags,
185162306a36Sopenharmony_ci					  token);
185262306a36Sopenharmony_ci	cmd_params = (struct dpni_cmd_set_rx_hash_dist *)cmd.params;
185362306a36Sopenharmony_ci	cmd_params->dist_size = cpu_to_le16(cfg->dist_size);
185462306a36Sopenharmony_ci	dpni_set_field(cmd_params->enable, RX_HASH_DIST_ENABLE, cfg->enable);
185562306a36Sopenharmony_ci	cmd_params->tc = cfg->tc;
185662306a36Sopenharmony_ci	cmd_params->key_cfg_iova = cpu_to_le64(cfg->key_cfg_iova);
185762306a36Sopenharmony_ci
185862306a36Sopenharmony_ci	/* send command to mc*/
185962306a36Sopenharmony_ci	return mc_send_command(mc_io, &cmd);
186062306a36Sopenharmony_ci}
186162306a36Sopenharmony_ci
186262306a36Sopenharmony_ci/**
186362306a36Sopenharmony_ci * dpni_add_fs_entry() - Add Flow Steering entry for a specific traffic class
186462306a36Sopenharmony_ci *			(to select a flow ID)
186562306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
186662306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
186762306a36Sopenharmony_ci * @token:	Token of DPNI object
186862306a36Sopenharmony_ci * @tc_id:	Traffic class selection (0-7)
186962306a36Sopenharmony_ci * @index:	Location in the FS table where to insert the entry.
187062306a36Sopenharmony_ci *		Only relevant if MASKING is enabled for FS
187162306a36Sopenharmony_ci *		classification on this DPNI, it is ignored for exact match.
187262306a36Sopenharmony_ci * @cfg:	Flow steering rule to add
187362306a36Sopenharmony_ci * @action:	Action to be taken as result of a classification hit
187462306a36Sopenharmony_ci *
187562306a36Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
187662306a36Sopenharmony_ci */
187762306a36Sopenharmony_ciint dpni_add_fs_entry(struct fsl_mc_io *mc_io,
187862306a36Sopenharmony_ci		      u32 cmd_flags,
187962306a36Sopenharmony_ci		      u16 token,
188062306a36Sopenharmony_ci		      u8 tc_id,
188162306a36Sopenharmony_ci		      u16 index,
188262306a36Sopenharmony_ci		      const struct dpni_rule_cfg *cfg,
188362306a36Sopenharmony_ci		      const struct dpni_fs_action_cfg *action)
188462306a36Sopenharmony_ci{
188562306a36Sopenharmony_ci	struct dpni_cmd_add_fs_entry *cmd_params;
188662306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
188762306a36Sopenharmony_ci
188862306a36Sopenharmony_ci	/* prepare command */
188962306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPNI_CMDID_ADD_FS_ENT,
189062306a36Sopenharmony_ci					  cmd_flags,
189162306a36Sopenharmony_ci					  token);
189262306a36Sopenharmony_ci	cmd_params = (struct dpni_cmd_add_fs_entry *)cmd.params;
189362306a36Sopenharmony_ci	cmd_params->tc_id = tc_id;
189462306a36Sopenharmony_ci	cmd_params->key_size = cfg->key_size;
189562306a36Sopenharmony_ci	cmd_params->index = cpu_to_le16(index);
189662306a36Sopenharmony_ci	cmd_params->key_iova = cpu_to_le64(cfg->key_iova);
189762306a36Sopenharmony_ci	cmd_params->mask_iova = cpu_to_le64(cfg->mask_iova);
189862306a36Sopenharmony_ci	cmd_params->options = cpu_to_le16(action->options);
189962306a36Sopenharmony_ci	cmd_params->flow_id = cpu_to_le16(action->flow_id);
190062306a36Sopenharmony_ci	cmd_params->flc = cpu_to_le64(action->flc);
190162306a36Sopenharmony_ci
190262306a36Sopenharmony_ci	/* send command to mc*/
190362306a36Sopenharmony_ci	return mc_send_command(mc_io, &cmd);
190462306a36Sopenharmony_ci}
190562306a36Sopenharmony_ci
190662306a36Sopenharmony_ci/**
190762306a36Sopenharmony_ci * dpni_remove_fs_entry() - Remove Flow Steering entry from a specific
190862306a36Sopenharmony_ci *			    traffic class
190962306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
191062306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
191162306a36Sopenharmony_ci * @token:	Token of DPNI object
191262306a36Sopenharmony_ci * @tc_id:	Traffic class selection (0-7)
191362306a36Sopenharmony_ci * @cfg:	Flow steering rule to remove
191462306a36Sopenharmony_ci *
191562306a36Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
191662306a36Sopenharmony_ci */
191762306a36Sopenharmony_ciint dpni_remove_fs_entry(struct fsl_mc_io *mc_io,
191862306a36Sopenharmony_ci			 u32 cmd_flags,
191962306a36Sopenharmony_ci			 u16 token,
192062306a36Sopenharmony_ci			 u8 tc_id,
192162306a36Sopenharmony_ci			 const struct dpni_rule_cfg *cfg)
192262306a36Sopenharmony_ci{
192362306a36Sopenharmony_ci	struct dpni_cmd_remove_fs_entry *cmd_params;
192462306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
192562306a36Sopenharmony_ci
192662306a36Sopenharmony_ci	/* prepare command */
192762306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPNI_CMDID_REMOVE_FS_ENT,
192862306a36Sopenharmony_ci					  cmd_flags,
192962306a36Sopenharmony_ci					  token);
193062306a36Sopenharmony_ci	cmd_params = (struct dpni_cmd_remove_fs_entry *)cmd.params;
193162306a36Sopenharmony_ci	cmd_params->tc_id = tc_id;
193262306a36Sopenharmony_ci	cmd_params->key_size = cfg->key_size;
193362306a36Sopenharmony_ci	cmd_params->key_iova = cpu_to_le64(cfg->key_iova);
193462306a36Sopenharmony_ci	cmd_params->mask_iova = cpu_to_le64(cfg->mask_iova);
193562306a36Sopenharmony_ci
193662306a36Sopenharmony_ci	/* send command to mc*/
193762306a36Sopenharmony_ci	return mc_send_command(mc_io, &cmd);
193862306a36Sopenharmony_ci}
193962306a36Sopenharmony_ci
194062306a36Sopenharmony_ci/**
194162306a36Sopenharmony_ci * dpni_set_qos_table() - Set QoS mapping table
194262306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
194362306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
194462306a36Sopenharmony_ci * @token:	Token of DPNI object
194562306a36Sopenharmony_ci * @cfg:	QoS table configuration
194662306a36Sopenharmony_ci *
194762306a36Sopenharmony_ci * This function and all QoS-related functions require that
194862306a36Sopenharmony_ci *'max_tcs > 1' was set at DPNI creation.
194962306a36Sopenharmony_ci *
195062306a36Sopenharmony_ci * warning: Before calling this function, call dpkg_prepare_key_cfg() to
195162306a36Sopenharmony_ci *			prepare the key_cfg_iova parameter
195262306a36Sopenharmony_ci *
195362306a36Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
195462306a36Sopenharmony_ci */
195562306a36Sopenharmony_ciint dpni_set_qos_table(struct fsl_mc_io *mc_io,
195662306a36Sopenharmony_ci		       u32 cmd_flags,
195762306a36Sopenharmony_ci		       u16 token,
195862306a36Sopenharmony_ci		       const struct dpni_qos_tbl_cfg *cfg)
195962306a36Sopenharmony_ci{
196062306a36Sopenharmony_ci	struct dpni_cmd_set_qos_table *cmd_params;
196162306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
196262306a36Sopenharmony_ci
196362306a36Sopenharmony_ci	/* prepare command */
196462306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_QOS_TBL,
196562306a36Sopenharmony_ci					  cmd_flags,
196662306a36Sopenharmony_ci					  token);
196762306a36Sopenharmony_ci	cmd_params = (struct dpni_cmd_set_qos_table *)cmd.params;
196862306a36Sopenharmony_ci	cmd_params->default_tc = cfg->default_tc;
196962306a36Sopenharmony_ci	cmd_params->key_cfg_iova = cpu_to_le64(cfg->key_cfg_iova);
197062306a36Sopenharmony_ci	dpni_set_field(cmd_params->discard_on_miss, DISCARD_ON_MISS,
197162306a36Sopenharmony_ci		       cfg->discard_on_miss);
197262306a36Sopenharmony_ci
197362306a36Sopenharmony_ci	/* send command to mc*/
197462306a36Sopenharmony_ci	return mc_send_command(mc_io, &cmd);
197562306a36Sopenharmony_ci}
197662306a36Sopenharmony_ci
197762306a36Sopenharmony_ci/**
197862306a36Sopenharmony_ci * dpni_add_qos_entry() - Add QoS mapping entry (to select a traffic class)
197962306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
198062306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
198162306a36Sopenharmony_ci * @token:	Token of DPNI object
198262306a36Sopenharmony_ci * @cfg:	QoS rule to add
198362306a36Sopenharmony_ci * @tc_id:	Traffic class selection (0-7)
198462306a36Sopenharmony_ci * @index:	Location in the QoS table where to insert the entry.
198562306a36Sopenharmony_ci *		Only relevant if MASKING is enabled for QoS classification on
198662306a36Sopenharmony_ci *		this DPNI, it is ignored for exact match.
198762306a36Sopenharmony_ci *
198862306a36Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
198962306a36Sopenharmony_ci */
199062306a36Sopenharmony_ciint dpni_add_qos_entry(struct fsl_mc_io *mc_io,
199162306a36Sopenharmony_ci		       u32 cmd_flags,
199262306a36Sopenharmony_ci		       u16 token,
199362306a36Sopenharmony_ci		       const struct dpni_rule_cfg *cfg,
199462306a36Sopenharmony_ci		       u8 tc_id,
199562306a36Sopenharmony_ci		       u16 index)
199662306a36Sopenharmony_ci{
199762306a36Sopenharmony_ci	struct dpni_cmd_add_qos_entry *cmd_params;
199862306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
199962306a36Sopenharmony_ci
200062306a36Sopenharmony_ci	/* prepare command */
200162306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPNI_CMDID_ADD_QOS_ENT,
200262306a36Sopenharmony_ci					  cmd_flags,
200362306a36Sopenharmony_ci					  token);
200462306a36Sopenharmony_ci	cmd_params = (struct dpni_cmd_add_qos_entry *)cmd.params;
200562306a36Sopenharmony_ci	cmd_params->tc_id = tc_id;
200662306a36Sopenharmony_ci	cmd_params->key_size = cfg->key_size;
200762306a36Sopenharmony_ci	cmd_params->index = cpu_to_le16(index);
200862306a36Sopenharmony_ci	cmd_params->key_iova = cpu_to_le64(cfg->key_iova);
200962306a36Sopenharmony_ci	cmd_params->mask_iova = cpu_to_le64(cfg->mask_iova);
201062306a36Sopenharmony_ci
201162306a36Sopenharmony_ci	/* send command to mc*/
201262306a36Sopenharmony_ci	return mc_send_command(mc_io, &cmd);
201362306a36Sopenharmony_ci}
201462306a36Sopenharmony_ci
201562306a36Sopenharmony_ci/**
201662306a36Sopenharmony_ci * dpni_remove_qos_entry() - Remove QoS mapping entry
201762306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
201862306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
201962306a36Sopenharmony_ci * @token:	Token of DPNI object
202062306a36Sopenharmony_ci * @cfg:	QoS rule to remove
202162306a36Sopenharmony_ci *
202262306a36Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
202362306a36Sopenharmony_ci */
202462306a36Sopenharmony_ciint dpni_remove_qos_entry(struct fsl_mc_io *mc_io,
202562306a36Sopenharmony_ci			  u32 cmd_flags,
202662306a36Sopenharmony_ci			  u16 token,
202762306a36Sopenharmony_ci			  const struct dpni_rule_cfg *cfg)
202862306a36Sopenharmony_ci{
202962306a36Sopenharmony_ci	struct dpni_cmd_remove_qos_entry *cmd_params;
203062306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
203162306a36Sopenharmony_ci
203262306a36Sopenharmony_ci	/* prepare command */
203362306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPNI_CMDID_REMOVE_QOS_ENT,
203462306a36Sopenharmony_ci					  cmd_flags,
203562306a36Sopenharmony_ci					  token);
203662306a36Sopenharmony_ci	cmd_params = (struct dpni_cmd_remove_qos_entry *)cmd.params;
203762306a36Sopenharmony_ci	cmd_params->key_size = cfg->key_size;
203862306a36Sopenharmony_ci	cmd_params->key_iova = cpu_to_le64(cfg->key_iova);
203962306a36Sopenharmony_ci	cmd_params->mask_iova = cpu_to_le64(cfg->mask_iova);
204062306a36Sopenharmony_ci
204162306a36Sopenharmony_ci	/* send command to mc*/
204262306a36Sopenharmony_ci	return mc_send_command(mc_io, &cmd);
204362306a36Sopenharmony_ci}
204462306a36Sopenharmony_ci
204562306a36Sopenharmony_ci/**
204662306a36Sopenharmony_ci * dpni_clear_qos_table() - Clear all QoS mapping entries
204762306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
204862306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
204962306a36Sopenharmony_ci * @token:	Token of DPNI object
205062306a36Sopenharmony_ci *
205162306a36Sopenharmony_ci * Following this function call, all frames are directed to
205262306a36Sopenharmony_ci * the default traffic class (0)
205362306a36Sopenharmony_ci *
205462306a36Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
205562306a36Sopenharmony_ci */
205662306a36Sopenharmony_ciint dpni_clear_qos_table(struct fsl_mc_io *mc_io,
205762306a36Sopenharmony_ci			 u32 cmd_flags,
205862306a36Sopenharmony_ci			 u16 token)
205962306a36Sopenharmony_ci{
206062306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
206162306a36Sopenharmony_ci
206262306a36Sopenharmony_ci	/* prepare command */
206362306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPNI_CMDID_CLR_QOS_TBL,
206462306a36Sopenharmony_ci					  cmd_flags,
206562306a36Sopenharmony_ci					  token);
206662306a36Sopenharmony_ci
206762306a36Sopenharmony_ci	/* send command to mc*/
206862306a36Sopenharmony_ci	return mc_send_command(mc_io, &cmd);
206962306a36Sopenharmony_ci}
207062306a36Sopenharmony_ci
207162306a36Sopenharmony_ci/**
207262306a36Sopenharmony_ci * dpni_set_tx_shaping() - Set the transmit shaping
207362306a36Sopenharmony_ci * @mc_io:		Pointer to MC portal's I/O object
207462306a36Sopenharmony_ci * @cmd_flags:		Command flags; one or more of 'MC_CMD_FLAG_'
207562306a36Sopenharmony_ci * @token:		Token of DPNI object
207662306a36Sopenharmony_ci * @tx_cr_shaper:	TX committed rate shaping configuration
207762306a36Sopenharmony_ci * @tx_er_shaper:	TX excess rate shaping configuration
207862306a36Sopenharmony_ci * @coupled:		Committed and excess rate shapers are coupled
207962306a36Sopenharmony_ci *
208062306a36Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
208162306a36Sopenharmony_ci */
208262306a36Sopenharmony_ciint dpni_set_tx_shaping(struct fsl_mc_io *mc_io,
208362306a36Sopenharmony_ci			u32 cmd_flags,
208462306a36Sopenharmony_ci			u16 token,
208562306a36Sopenharmony_ci			const struct dpni_tx_shaping_cfg *tx_cr_shaper,
208662306a36Sopenharmony_ci			const struct dpni_tx_shaping_cfg *tx_er_shaper,
208762306a36Sopenharmony_ci			int coupled)
208862306a36Sopenharmony_ci{
208962306a36Sopenharmony_ci	struct dpni_cmd_set_tx_shaping *cmd_params;
209062306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
209162306a36Sopenharmony_ci
209262306a36Sopenharmony_ci	/* prepare command */
209362306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_TX_SHAPING,
209462306a36Sopenharmony_ci					  cmd_flags,
209562306a36Sopenharmony_ci					  token);
209662306a36Sopenharmony_ci	cmd_params = (struct dpni_cmd_set_tx_shaping *)cmd.params;
209762306a36Sopenharmony_ci	cmd_params->tx_cr_max_burst_size = cpu_to_le16(tx_cr_shaper->max_burst_size);
209862306a36Sopenharmony_ci	cmd_params->tx_er_max_burst_size = cpu_to_le16(tx_er_shaper->max_burst_size);
209962306a36Sopenharmony_ci	cmd_params->tx_cr_rate_limit = cpu_to_le32(tx_cr_shaper->rate_limit);
210062306a36Sopenharmony_ci	cmd_params->tx_er_rate_limit = cpu_to_le32(tx_er_shaper->rate_limit);
210162306a36Sopenharmony_ci	dpni_set_field(cmd_params->coupled, COUPLED, coupled);
210262306a36Sopenharmony_ci
210362306a36Sopenharmony_ci	/* send command to mc*/
210462306a36Sopenharmony_ci	return mc_send_command(mc_io, &cmd);
210562306a36Sopenharmony_ci}
210662306a36Sopenharmony_ci
210762306a36Sopenharmony_ci/**
210862306a36Sopenharmony_ci * dpni_get_single_step_cfg() - return current configuration for
210962306a36Sopenharmony_ci *                              single step PTP
211062306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
211162306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
211262306a36Sopenharmony_ci * @token:	Token of DPNI object
211362306a36Sopenharmony_ci * @ptp_cfg:	ptp single step configuration
211462306a36Sopenharmony_ci *
211562306a36Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
211662306a36Sopenharmony_ci *
211762306a36Sopenharmony_ci */
211862306a36Sopenharmony_ciint dpni_get_single_step_cfg(struct fsl_mc_io *mc_io,
211962306a36Sopenharmony_ci			     u32 cmd_flags,
212062306a36Sopenharmony_ci			     u16 token,
212162306a36Sopenharmony_ci			     struct dpni_single_step_cfg *ptp_cfg)
212262306a36Sopenharmony_ci{
212362306a36Sopenharmony_ci	struct dpni_rsp_single_step_cfg *rsp_params;
212462306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
212562306a36Sopenharmony_ci	int err;
212662306a36Sopenharmony_ci
212762306a36Sopenharmony_ci	/* prepare command */
212862306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_SINGLE_STEP_CFG,
212962306a36Sopenharmony_ci					  cmd_flags, token);
213062306a36Sopenharmony_ci	/* send command to mc*/
213162306a36Sopenharmony_ci	err =  mc_send_command(mc_io, &cmd);
213262306a36Sopenharmony_ci	if (err)
213362306a36Sopenharmony_ci		return err;
213462306a36Sopenharmony_ci
213562306a36Sopenharmony_ci	/* read command response */
213662306a36Sopenharmony_ci	rsp_params = (struct dpni_rsp_single_step_cfg *)cmd.params;
213762306a36Sopenharmony_ci	ptp_cfg->offset = le16_to_cpu(rsp_params->offset);
213862306a36Sopenharmony_ci	ptp_cfg->en = dpni_get_field(le16_to_cpu(rsp_params->flags),
213962306a36Sopenharmony_ci				     PTP_ENABLE) ? 1 : 0;
214062306a36Sopenharmony_ci	ptp_cfg->ch_update = dpni_get_field(le16_to_cpu(rsp_params->flags),
214162306a36Sopenharmony_ci					    PTP_CH_UPDATE) ? 1 : 0;
214262306a36Sopenharmony_ci	ptp_cfg->peer_delay = le32_to_cpu(rsp_params->peer_delay);
214362306a36Sopenharmony_ci	ptp_cfg->ptp_onestep_reg_base =
214462306a36Sopenharmony_ci				  le32_to_cpu(rsp_params->ptp_onestep_reg_base);
214562306a36Sopenharmony_ci
214662306a36Sopenharmony_ci	return err;
214762306a36Sopenharmony_ci}
214862306a36Sopenharmony_ci
214962306a36Sopenharmony_ci/**
215062306a36Sopenharmony_ci * dpni_set_single_step_cfg() - enable/disable and configure single step PTP
215162306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
215262306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
215362306a36Sopenharmony_ci * @token:	Token of DPNI object
215462306a36Sopenharmony_ci * @ptp_cfg:	ptp single step configuration
215562306a36Sopenharmony_ci *
215662306a36Sopenharmony_ci * Return:	'0' on Success; Error code otherwise.
215762306a36Sopenharmony_ci *
215862306a36Sopenharmony_ci * The function has effect only when dpni object is connected to a dpmac
215962306a36Sopenharmony_ci * object. If the dpni is not connected to a dpmac the configuration will
216062306a36Sopenharmony_ci * be stored inside and applied when connection is made.
216162306a36Sopenharmony_ci */
216262306a36Sopenharmony_ciint dpni_set_single_step_cfg(struct fsl_mc_io *mc_io,
216362306a36Sopenharmony_ci			     u32 cmd_flags,
216462306a36Sopenharmony_ci			     u16 token,
216562306a36Sopenharmony_ci			     struct dpni_single_step_cfg *ptp_cfg)
216662306a36Sopenharmony_ci{
216762306a36Sopenharmony_ci	struct dpni_cmd_single_step_cfg *cmd_params;
216862306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
216962306a36Sopenharmony_ci	u16 flags;
217062306a36Sopenharmony_ci
217162306a36Sopenharmony_ci	/* prepare command */
217262306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_SINGLE_STEP_CFG,
217362306a36Sopenharmony_ci					  cmd_flags, token);
217462306a36Sopenharmony_ci	cmd_params = (struct dpni_cmd_single_step_cfg *)cmd.params;
217562306a36Sopenharmony_ci	cmd_params->offset = cpu_to_le16(ptp_cfg->offset);
217662306a36Sopenharmony_ci	cmd_params->peer_delay = cpu_to_le32(ptp_cfg->peer_delay);
217762306a36Sopenharmony_ci
217862306a36Sopenharmony_ci	flags = le16_to_cpu(cmd_params->flags);
217962306a36Sopenharmony_ci	dpni_set_field(flags, PTP_ENABLE, !!ptp_cfg->en);
218062306a36Sopenharmony_ci	dpni_set_field(flags, PTP_CH_UPDATE, !!ptp_cfg->ch_update);
218162306a36Sopenharmony_ci	cmd_params->flags = cpu_to_le16(flags);
218262306a36Sopenharmony_ci
218362306a36Sopenharmony_ci	/* send command to mc*/
218462306a36Sopenharmony_ci	return mc_send_command(mc_io, &cmd);
218562306a36Sopenharmony_ci}
2186