xref: /OK3568_Linux_fs/kernel/drivers/net/ethernet/freescale/dpaa2/dpni.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
2*4882a593Smuzhiyun /* Copyright 2013-2016 Freescale Semiconductor Inc.
3*4882a593Smuzhiyun  * Copyright 2016 NXP
4*4882a593Smuzhiyun  * Copyright 2020 NXP
5*4882a593Smuzhiyun  */
6*4882a593Smuzhiyun #include <linux/kernel.h>
7*4882a593Smuzhiyun #include <linux/errno.h>
8*4882a593Smuzhiyun #include <linux/fsl/mc.h>
9*4882a593Smuzhiyun #include "dpni.h"
10*4882a593Smuzhiyun #include "dpni-cmd.h"
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun /**
13*4882a593Smuzhiyun  * dpni_prepare_key_cfg() - function prepare extract parameters
14*4882a593Smuzhiyun  * @cfg: defining a full Key Generation profile (rule)
15*4882a593Smuzhiyun  * @key_cfg_buf: Zeroed 256 bytes of memory before mapping it to DMA
16*4882a593Smuzhiyun  *
17*4882a593Smuzhiyun  * This function has to be called before the following functions:
18*4882a593Smuzhiyun  *	- dpni_set_rx_tc_dist()
19*4882a593Smuzhiyun  *	- dpni_set_qos_table()
20*4882a593Smuzhiyun  */
dpni_prepare_key_cfg(const struct dpkg_profile_cfg * cfg,u8 * key_cfg_buf)21*4882a593Smuzhiyun int dpni_prepare_key_cfg(const struct dpkg_profile_cfg *cfg, u8 *key_cfg_buf)
22*4882a593Smuzhiyun {
23*4882a593Smuzhiyun 	int i, j;
24*4882a593Smuzhiyun 	struct dpni_ext_set_rx_tc_dist *dpni_ext;
25*4882a593Smuzhiyun 	struct dpni_dist_extract *extr;
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun 	if (cfg->num_extracts > DPKG_MAX_NUM_OF_EXTRACTS)
28*4882a593Smuzhiyun 		return -EINVAL;
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun 	dpni_ext = (struct dpni_ext_set_rx_tc_dist *)key_cfg_buf;
31*4882a593Smuzhiyun 	dpni_ext->num_extracts = cfg->num_extracts;
32*4882a593Smuzhiyun 
33*4882a593Smuzhiyun 	for (i = 0; i < cfg->num_extracts; i++) {
34*4882a593Smuzhiyun 		extr = &dpni_ext->extracts[i];
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun 		switch (cfg->extracts[i].type) {
37*4882a593Smuzhiyun 		case DPKG_EXTRACT_FROM_HDR:
38*4882a593Smuzhiyun 			extr->prot = cfg->extracts[i].extract.from_hdr.prot;
39*4882a593Smuzhiyun 			dpni_set_field(extr->efh_type, EFH_TYPE,
40*4882a593Smuzhiyun 				       cfg->extracts[i].extract.from_hdr.type);
41*4882a593Smuzhiyun 			extr->size = cfg->extracts[i].extract.from_hdr.size;
42*4882a593Smuzhiyun 			extr->offset = cfg->extracts[i].extract.from_hdr.offset;
43*4882a593Smuzhiyun 			extr->field = cpu_to_le32(
44*4882a593Smuzhiyun 				cfg->extracts[i].extract.from_hdr.field);
45*4882a593Smuzhiyun 			extr->hdr_index =
46*4882a593Smuzhiyun 				cfg->extracts[i].extract.from_hdr.hdr_index;
47*4882a593Smuzhiyun 			break;
48*4882a593Smuzhiyun 		case DPKG_EXTRACT_FROM_DATA:
49*4882a593Smuzhiyun 			extr->size = cfg->extracts[i].extract.from_data.size;
50*4882a593Smuzhiyun 			extr->offset =
51*4882a593Smuzhiyun 				cfg->extracts[i].extract.from_data.offset;
52*4882a593Smuzhiyun 			break;
53*4882a593Smuzhiyun 		case DPKG_EXTRACT_FROM_PARSE:
54*4882a593Smuzhiyun 			extr->size = cfg->extracts[i].extract.from_parse.size;
55*4882a593Smuzhiyun 			extr->offset =
56*4882a593Smuzhiyun 				cfg->extracts[i].extract.from_parse.offset;
57*4882a593Smuzhiyun 			break;
58*4882a593Smuzhiyun 		default:
59*4882a593Smuzhiyun 			return -EINVAL;
60*4882a593Smuzhiyun 		}
61*4882a593Smuzhiyun 
62*4882a593Smuzhiyun 		extr->num_of_byte_masks = cfg->extracts[i].num_of_byte_masks;
63*4882a593Smuzhiyun 		dpni_set_field(extr->extract_type, EXTRACT_TYPE,
64*4882a593Smuzhiyun 			       cfg->extracts[i].type);
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun 		for (j = 0; j < DPKG_NUM_OF_MASKS; j++) {
67*4882a593Smuzhiyun 			extr->masks[j].mask = cfg->extracts[i].masks[j].mask;
68*4882a593Smuzhiyun 			extr->masks[j].offset =
69*4882a593Smuzhiyun 				cfg->extracts[i].masks[j].offset;
70*4882a593Smuzhiyun 		}
71*4882a593Smuzhiyun 	}
72*4882a593Smuzhiyun 
73*4882a593Smuzhiyun 	return 0;
74*4882a593Smuzhiyun }
75*4882a593Smuzhiyun 
76*4882a593Smuzhiyun /**
77*4882a593Smuzhiyun  * dpni_open() - Open a control session for the specified object
78*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
79*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
80*4882a593Smuzhiyun  * @dpni_id:	DPNI unique ID
81*4882a593Smuzhiyun  * @token:	Returned token; use in subsequent API calls
82*4882a593Smuzhiyun  *
83*4882a593Smuzhiyun  * This function can be used to open a control session for an
84*4882a593Smuzhiyun  * already created object; an object may have been declared in
85*4882a593Smuzhiyun  * the DPL or by calling the dpni_create() function.
86*4882a593Smuzhiyun  * This function returns a unique authentication token,
87*4882a593Smuzhiyun  * associated with the specific object ID and the specific MC
88*4882a593Smuzhiyun  * portal; this token must be used in all subsequent commands for
89*4882a593Smuzhiyun  * this specific object.
90*4882a593Smuzhiyun  *
91*4882a593Smuzhiyun  * Return:	'0' on Success; Error code otherwise.
92*4882a593Smuzhiyun  */
dpni_open(struct fsl_mc_io * mc_io,u32 cmd_flags,int dpni_id,u16 * token)93*4882a593Smuzhiyun int dpni_open(struct fsl_mc_io *mc_io,
94*4882a593Smuzhiyun 	      u32 cmd_flags,
95*4882a593Smuzhiyun 	      int dpni_id,
96*4882a593Smuzhiyun 	      u16 *token)
97*4882a593Smuzhiyun {
98*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
99*4882a593Smuzhiyun 	struct dpni_cmd_open *cmd_params;
100*4882a593Smuzhiyun 
101*4882a593Smuzhiyun 	int err;
102*4882a593Smuzhiyun 
103*4882a593Smuzhiyun 	/* prepare command */
104*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_OPEN,
105*4882a593Smuzhiyun 					  cmd_flags,
106*4882a593Smuzhiyun 					  0);
107*4882a593Smuzhiyun 	cmd_params = (struct dpni_cmd_open *)cmd.params;
108*4882a593Smuzhiyun 	cmd_params->dpni_id = cpu_to_le32(dpni_id);
109*4882a593Smuzhiyun 
110*4882a593Smuzhiyun 	/* send command to mc*/
111*4882a593Smuzhiyun 	err = mc_send_command(mc_io, &cmd);
112*4882a593Smuzhiyun 	if (err)
113*4882a593Smuzhiyun 		return err;
114*4882a593Smuzhiyun 
115*4882a593Smuzhiyun 	/* retrieve response parameters */
116*4882a593Smuzhiyun 	*token = mc_cmd_hdr_read_token(&cmd);
117*4882a593Smuzhiyun 
118*4882a593Smuzhiyun 	return 0;
119*4882a593Smuzhiyun }
120*4882a593Smuzhiyun 
121*4882a593Smuzhiyun /**
122*4882a593Smuzhiyun  * dpni_close() - Close the control session of the object
123*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
124*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
125*4882a593Smuzhiyun  * @token:	Token of DPNI object
126*4882a593Smuzhiyun  *
127*4882a593Smuzhiyun  * After this function is called, no further operations are
128*4882a593Smuzhiyun  * allowed on the object without opening a new control session.
129*4882a593Smuzhiyun  *
130*4882a593Smuzhiyun  * Return:	'0' on Success; Error code otherwise.
131*4882a593Smuzhiyun  */
dpni_close(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token)132*4882a593Smuzhiyun int dpni_close(struct fsl_mc_io *mc_io,
133*4882a593Smuzhiyun 	       u32 cmd_flags,
134*4882a593Smuzhiyun 	       u16 token)
135*4882a593Smuzhiyun {
136*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
137*4882a593Smuzhiyun 
138*4882a593Smuzhiyun 	/* prepare command */
139*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_CLOSE,
140*4882a593Smuzhiyun 					  cmd_flags,
141*4882a593Smuzhiyun 					  token);
142*4882a593Smuzhiyun 
143*4882a593Smuzhiyun 	/* send command to mc*/
144*4882a593Smuzhiyun 	return mc_send_command(mc_io, &cmd);
145*4882a593Smuzhiyun }
146*4882a593Smuzhiyun 
147*4882a593Smuzhiyun /**
148*4882a593Smuzhiyun  * dpni_set_pools() - Set buffer pools configuration
149*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
150*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
151*4882a593Smuzhiyun  * @token:	Token of DPNI object
152*4882a593Smuzhiyun  * @cfg:	Buffer pools configuration
153*4882a593Smuzhiyun  *
154*4882a593Smuzhiyun  * mandatory for DPNI operation
155*4882a593Smuzhiyun  * warning:Allowed only when DPNI is disabled
156*4882a593Smuzhiyun  *
157*4882a593Smuzhiyun  * Return:	'0' on Success; Error code otherwise.
158*4882a593Smuzhiyun  */
dpni_set_pools(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,const struct dpni_pools_cfg * cfg)159*4882a593Smuzhiyun int dpni_set_pools(struct fsl_mc_io *mc_io,
160*4882a593Smuzhiyun 		   u32 cmd_flags,
161*4882a593Smuzhiyun 		   u16 token,
162*4882a593Smuzhiyun 		   const struct dpni_pools_cfg *cfg)
163*4882a593Smuzhiyun {
164*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
165*4882a593Smuzhiyun 	struct dpni_cmd_set_pools *cmd_params;
166*4882a593Smuzhiyun 	int i;
167*4882a593Smuzhiyun 
168*4882a593Smuzhiyun 	/* prepare command */
169*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_POOLS,
170*4882a593Smuzhiyun 					  cmd_flags,
171*4882a593Smuzhiyun 					  token);
172*4882a593Smuzhiyun 	cmd_params = (struct dpni_cmd_set_pools *)cmd.params;
173*4882a593Smuzhiyun 	cmd_params->num_dpbp = cfg->num_dpbp;
174*4882a593Smuzhiyun 	for (i = 0; i < DPNI_MAX_DPBP; i++) {
175*4882a593Smuzhiyun 		cmd_params->dpbp_id[i] = cpu_to_le32(cfg->pools[i].dpbp_id);
176*4882a593Smuzhiyun 		cmd_params->buffer_size[i] =
177*4882a593Smuzhiyun 			cpu_to_le16(cfg->pools[i].buffer_size);
178*4882a593Smuzhiyun 		cmd_params->backup_pool_mask |=
179*4882a593Smuzhiyun 			DPNI_BACKUP_POOL(cfg->pools[i].backup_pool, i);
180*4882a593Smuzhiyun 	}
181*4882a593Smuzhiyun 
182*4882a593Smuzhiyun 	/* send command to mc*/
183*4882a593Smuzhiyun 	return mc_send_command(mc_io, &cmd);
184*4882a593Smuzhiyun }
185*4882a593Smuzhiyun 
186*4882a593Smuzhiyun /**
187*4882a593Smuzhiyun  * dpni_enable() - Enable the DPNI, allow sending and receiving frames.
188*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
189*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
190*4882a593Smuzhiyun  * @token:		Token of DPNI object
191*4882a593Smuzhiyun  *
192*4882a593Smuzhiyun  * Return:	'0' on Success; Error code otherwise.
193*4882a593Smuzhiyun  */
dpni_enable(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token)194*4882a593Smuzhiyun int dpni_enable(struct fsl_mc_io *mc_io,
195*4882a593Smuzhiyun 		u32 cmd_flags,
196*4882a593Smuzhiyun 		u16 token)
197*4882a593Smuzhiyun {
198*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
199*4882a593Smuzhiyun 
200*4882a593Smuzhiyun 	/* prepare command */
201*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_ENABLE,
202*4882a593Smuzhiyun 					  cmd_flags,
203*4882a593Smuzhiyun 					  token);
204*4882a593Smuzhiyun 
205*4882a593Smuzhiyun 	/* send command to mc*/
206*4882a593Smuzhiyun 	return mc_send_command(mc_io, &cmd);
207*4882a593Smuzhiyun }
208*4882a593Smuzhiyun 
209*4882a593Smuzhiyun /**
210*4882a593Smuzhiyun  * dpni_disable() - Disable the DPNI, stop sending and receiving frames.
211*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
212*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
213*4882a593Smuzhiyun  * @token:	Token of DPNI object
214*4882a593Smuzhiyun  *
215*4882a593Smuzhiyun  * Return:	'0' on Success; Error code otherwise.
216*4882a593Smuzhiyun  */
dpni_disable(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token)217*4882a593Smuzhiyun int dpni_disable(struct fsl_mc_io *mc_io,
218*4882a593Smuzhiyun 		 u32 cmd_flags,
219*4882a593Smuzhiyun 		 u16 token)
220*4882a593Smuzhiyun {
221*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
222*4882a593Smuzhiyun 
223*4882a593Smuzhiyun 	/* prepare command */
224*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_DISABLE,
225*4882a593Smuzhiyun 					  cmd_flags,
226*4882a593Smuzhiyun 					  token);
227*4882a593Smuzhiyun 
228*4882a593Smuzhiyun 	/* send command to mc*/
229*4882a593Smuzhiyun 	return mc_send_command(mc_io, &cmd);
230*4882a593Smuzhiyun }
231*4882a593Smuzhiyun 
232*4882a593Smuzhiyun /**
233*4882a593Smuzhiyun  * dpni_is_enabled() - Check if the DPNI is enabled.
234*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
235*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
236*4882a593Smuzhiyun  * @token:	Token of DPNI object
237*4882a593Smuzhiyun  * @en:		Returns '1' if object is enabled; '0' otherwise
238*4882a593Smuzhiyun  *
239*4882a593Smuzhiyun  * Return:	'0' on Success; Error code otherwise.
240*4882a593Smuzhiyun  */
dpni_is_enabled(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,int * en)241*4882a593Smuzhiyun int dpni_is_enabled(struct fsl_mc_io *mc_io,
242*4882a593Smuzhiyun 		    u32 cmd_flags,
243*4882a593Smuzhiyun 		    u16 token,
244*4882a593Smuzhiyun 		    int *en)
245*4882a593Smuzhiyun {
246*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
247*4882a593Smuzhiyun 	struct dpni_rsp_is_enabled *rsp_params;
248*4882a593Smuzhiyun 	int err;
249*4882a593Smuzhiyun 
250*4882a593Smuzhiyun 	/* prepare command */
251*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_IS_ENABLED,
252*4882a593Smuzhiyun 					  cmd_flags,
253*4882a593Smuzhiyun 					  token);
254*4882a593Smuzhiyun 
255*4882a593Smuzhiyun 	/* send command to mc*/
256*4882a593Smuzhiyun 	err = mc_send_command(mc_io, &cmd);
257*4882a593Smuzhiyun 	if (err)
258*4882a593Smuzhiyun 		return err;
259*4882a593Smuzhiyun 
260*4882a593Smuzhiyun 	/* retrieve response parameters */
261*4882a593Smuzhiyun 	rsp_params = (struct dpni_rsp_is_enabled *)cmd.params;
262*4882a593Smuzhiyun 	*en = dpni_get_field(rsp_params->enabled, ENABLE);
263*4882a593Smuzhiyun 
264*4882a593Smuzhiyun 	return 0;
265*4882a593Smuzhiyun }
266*4882a593Smuzhiyun 
267*4882a593Smuzhiyun /**
268*4882a593Smuzhiyun  * dpni_reset() - Reset the DPNI, returns the object to initial state.
269*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
270*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
271*4882a593Smuzhiyun  * @token:	Token of DPNI object
272*4882a593Smuzhiyun  *
273*4882a593Smuzhiyun  * Return:	'0' on Success; Error code otherwise.
274*4882a593Smuzhiyun  */
dpni_reset(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token)275*4882a593Smuzhiyun int dpni_reset(struct fsl_mc_io *mc_io,
276*4882a593Smuzhiyun 	       u32 cmd_flags,
277*4882a593Smuzhiyun 	       u16 token)
278*4882a593Smuzhiyun {
279*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
280*4882a593Smuzhiyun 
281*4882a593Smuzhiyun 	/* prepare command */
282*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_RESET,
283*4882a593Smuzhiyun 					  cmd_flags,
284*4882a593Smuzhiyun 					  token);
285*4882a593Smuzhiyun 
286*4882a593Smuzhiyun 	/* send command to mc*/
287*4882a593Smuzhiyun 	return mc_send_command(mc_io, &cmd);
288*4882a593Smuzhiyun }
289*4882a593Smuzhiyun 
290*4882a593Smuzhiyun /**
291*4882a593Smuzhiyun  * dpni_set_irq_enable() - Set overall interrupt state.
292*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
293*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
294*4882a593Smuzhiyun  * @token:	Token of DPNI object
295*4882a593Smuzhiyun  * @irq_index:	The interrupt index to configure
296*4882a593Smuzhiyun  * @en:		Interrupt state: - enable = 1, disable = 0
297*4882a593Smuzhiyun  *
298*4882a593Smuzhiyun  * Allows GPP software to control when interrupts are generated.
299*4882a593Smuzhiyun  * Each interrupt can have up to 32 causes.  The enable/disable control's the
300*4882a593Smuzhiyun  * overall interrupt state. if the interrupt is disabled no causes will cause
301*4882a593Smuzhiyun  * an interrupt.
302*4882a593Smuzhiyun  *
303*4882a593Smuzhiyun  * Return:	'0' on Success; Error code otherwise.
304*4882a593Smuzhiyun  */
dpni_set_irq_enable(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,u8 irq_index,u8 en)305*4882a593Smuzhiyun int dpni_set_irq_enable(struct fsl_mc_io *mc_io,
306*4882a593Smuzhiyun 			u32 cmd_flags,
307*4882a593Smuzhiyun 			u16 token,
308*4882a593Smuzhiyun 			u8 irq_index,
309*4882a593Smuzhiyun 			u8 en)
310*4882a593Smuzhiyun {
311*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
312*4882a593Smuzhiyun 	struct dpni_cmd_set_irq_enable *cmd_params;
313*4882a593Smuzhiyun 
314*4882a593Smuzhiyun 	/* prepare command */
315*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_IRQ_ENABLE,
316*4882a593Smuzhiyun 					  cmd_flags,
317*4882a593Smuzhiyun 					  token);
318*4882a593Smuzhiyun 	cmd_params = (struct dpni_cmd_set_irq_enable *)cmd.params;
319*4882a593Smuzhiyun 	dpni_set_field(cmd_params->enable, ENABLE, en);
320*4882a593Smuzhiyun 	cmd_params->irq_index = irq_index;
321*4882a593Smuzhiyun 
322*4882a593Smuzhiyun 	/* send command to mc*/
323*4882a593Smuzhiyun 	return mc_send_command(mc_io, &cmd);
324*4882a593Smuzhiyun }
325*4882a593Smuzhiyun 
326*4882a593Smuzhiyun /**
327*4882a593Smuzhiyun  * dpni_get_irq_enable() - Get overall interrupt state
328*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
329*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
330*4882a593Smuzhiyun  * @token:	Token of DPNI object
331*4882a593Smuzhiyun  * @irq_index:	The interrupt index to configure
332*4882a593Smuzhiyun  * @en:		Returned interrupt state - enable = 1, disable = 0
333*4882a593Smuzhiyun  *
334*4882a593Smuzhiyun  * Return:	'0' on Success; Error code otherwise.
335*4882a593Smuzhiyun  */
dpni_get_irq_enable(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,u8 irq_index,u8 * en)336*4882a593Smuzhiyun int dpni_get_irq_enable(struct fsl_mc_io *mc_io,
337*4882a593Smuzhiyun 			u32 cmd_flags,
338*4882a593Smuzhiyun 			u16 token,
339*4882a593Smuzhiyun 			u8 irq_index,
340*4882a593Smuzhiyun 			u8 *en)
341*4882a593Smuzhiyun {
342*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
343*4882a593Smuzhiyun 	struct dpni_cmd_get_irq_enable *cmd_params;
344*4882a593Smuzhiyun 	struct dpni_rsp_get_irq_enable *rsp_params;
345*4882a593Smuzhiyun 
346*4882a593Smuzhiyun 	int err;
347*4882a593Smuzhiyun 
348*4882a593Smuzhiyun 	/* prepare command */
349*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_IRQ_ENABLE,
350*4882a593Smuzhiyun 					  cmd_flags,
351*4882a593Smuzhiyun 					  token);
352*4882a593Smuzhiyun 	cmd_params = (struct dpni_cmd_get_irq_enable *)cmd.params;
353*4882a593Smuzhiyun 	cmd_params->irq_index = irq_index;
354*4882a593Smuzhiyun 
355*4882a593Smuzhiyun 	/* send command to mc*/
356*4882a593Smuzhiyun 	err = mc_send_command(mc_io, &cmd);
357*4882a593Smuzhiyun 	if (err)
358*4882a593Smuzhiyun 		return err;
359*4882a593Smuzhiyun 
360*4882a593Smuzhiyun 	/* retrieve response parameters */
361*4882a593Smuzhiyun 	rsp_params = (struct dpni_rsp_get_irq_enable *)cmd.params;
362*4882a593Smuzhiyun 	*en = dpni_get_field(rsp_params->enabled, ENABLE);
363*4882a593Smuzhiyun 
364*4882a593Smuzhiyun 	return 0;
365*4882a593Smuzhiyun }
366*4882a593Smuzhiyun 
367*4882a593Smuzhiyun /**
368*4882a593Smuzhiyun  * dpni_set_irq_mask() - Set interrupt mask.
369*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
370*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
371*4882a593Smuzhiyun  * @token:	Token of DPNI object
372*4882a593Smuzhiyun  * @irq_index:	The interrupt index to configure
373*4882a593Smuzhiyun  * @mask:	event mask to trigger interrupt;
374*4882a593Smuzhiyun  *			each bit:
375*4882a593Smuzhiyun  *				0 = ignore event
376*4882a593Smuzhiyun  *				1 = consider event for asserting IRQ
377*4882a593Smuzhiyun  *
378*4882a593Smuzhiyun  * Every interrupt can have up to 32 causes and the interrupt model supports
379*4882a593Smuzhiyun  * masking/unmasking each cause independently
380*4882a593Smuzhiyun  *
381*4882a593Smuzhiyun  * Return:	'0' on Success; Error code otherwise.
382*4882a593Smuzhiyun  */
dpni_set_irq_mask(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,u8 irq_index,u32 mask)383*4882a593Smuzhiyun int dpni_set_irq_mask(struct fsl_mc_io *mc_io,
384*4882a593Smuzhiyun 		      u32 cmd_flags,
385*4882a593Smuzhiyun 		      u16 token,
386*4882a593Smuzhiyun 		      u8 irq_index,
387*4882a593Smuzhiyun 		      u32 mask)
388*4882a593Smuzhiyun {
389*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
390*4882a593Smuzhiyun 	struct dpni_cmd_set_irq_mask *cmd_params;
391*4882a593Smuzhiyun 
392*4882a593Smuzhiyun 	/* prepare command */
393*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_IRQ_MASK,
394*4882a593Smuzhiyun 					  cmd_flags,
395*4882a593Smuzhiyun 					  token);
396*4882a593Smuzhiyun 	cmd_params = (struct dpni_cmd_set_irq_mask *)cmd.params;
397*4882a593Smuzhiyun 	cmd_params->mask = cpu_to_le32(mask);
398*4882a593Smuzhiyun 	cmd_params->irq_index = irq_index;
399*4882a593Smuzhiyun 
400*4882a593Smuzhiyun 	/* send command to mc*/
401*4882a593Smuzhiyun 	return mc_send_command(mc_io, &cmd);
402*4882a593Smuzhiyun }
403*4882a593Smuzhiyun 
404*4882a593Smuzhiyun /**
405*4882a593Smuzhiyun  * dpni_get_irq_mask() - Get interrupt mask.
406*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
407*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
408*4882a593Smuzhiyun  * @token:	Token of DPNI object
409*4882a593Smuzhiyun  * @irq_index:	The interrupt index to configure
410*4882a593Smuzhiyun  * @mask:	Returned event mask to trigger interrupt
411*4882a593Smuzhiyun  *
412*4882a593Smuzhiyun  * Every interrupt can have up to 32 causes and the interrupt model supports
413*4882a593Smuzhiyun  * masking/unmasking each cause independently
414*4882a593Smuzhiyun  *
415*4882a593Smuzhiyun  * Return:	'0' on Success; Error code otherwise.
416*4882a593Smuzhiyun  */
dpni_get_irq_mask(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,u8 irq_index,u32 * mask)417*4882a593Smuzhiyun int dpni_get_irq_mask(struct fsl_mc_io *mc_io,
418*4882a593Smuzhiyun 		      u32 cmd_flags,
419*4882a593Smuzhiyun 		      u16 token,
420*4882a593Smuzhiyun 		      u8 irq_index,
421*4882a593Smuzhiyun 		      u32 *mask)
422*4882a593Smuzhiyun {
423*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
424*4882a593Smuzhiyun 	struct dpni_cmd_get_irq_mask *cmd_params;
425*4882a593Smuzhiyun 	struct dpni_rsp_get_irq_mask *rsp_params;
426*4882a593Smuzhiyun 	int err;
427*4882a593Smuzhiyun 
428*4882a593Smuzhiyun 	/* prepare command */
429*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_IRQ_MASK,
430*4882a593Smuzhiyun 					  cmd_flags,
431*4882a593Smuzhiyun 					  token);
432*4882a593Smuzhiyun 	cmd_params = (struct dpni_cmd_get_irq_mask *)cmd.params;
433*4882a593Smuzhiyun 	cmd_params->irq_index = irq_index;
434*4882a593Smuzhiyun 
435*4882a593Smuzhiyun 	/* send command to mc*/
436*4882a593Smuzhiyun 	err = mc_send_command(mc_io, &cmd);
437*4882a593Smuzhiyun 	if (err)
438*4882a593Smuzhiyun 		return err;
439*4882a593Smuzhiyun 
440*4882a593Smuzhiyun 	/* retrieve response parameters */
441*4882a593Smuzhiyun 	rsp_params = (struct dpni_rsp_get_irq_mask *)cmd.params;
442*4882a593Smuzhiyun 	*mask = le32_to_cpu(rsp_params->mask);
443*4882a593Smuzhiyun 
444*4882a593Smuzhiyun 	return 0;
445*4882a593Smuzhiyun }
446*4882a593Smuzhiyun 
447*4882a593Smuzhiyun /**
448*4882a593Smuzhiyun  * dpni_get_irq_status() - Get the current status of any pending interrupts.
449*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
450*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
451*4882a593Smuzhiyun  * @token:	Token of DPNI object
452*4882a593Smuzhiyun  * @irq_index:	The interrupt index to configure
453*4882a593Smuzhiyun  * @status:	Returned interrupts status - one bit per cause:
454*4882a593Smuzhiyun  *			0 = no interrupt pending
455*4882a593Smuzhiyun  *			1 = interrupt pending
456*4882a593Smuzhiyun  *
457*4882a593Smuzhiyun  * Return:	'0' on Success; Error code otherwise.
458*4882a593Smuzhiyun  */
dpni_get_irq_status(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,u8 irq_index,u32 * status)459*4882a593Smuzhiyun int dpni_get_irq_status(struct fsl_mc_io *mc_io,
460*4882a593Smuzhiyun 			u32 cmd_flags,
461*4882a593Smuzhiyun 			u16 token,
462*4882a593Smuzhiyun 			u8 irq_index,
463*4882a593Smuzhiyun 			u32 *status)
464*4882a593Smuzhiyun {
465*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
466*4882a593Smuzhiyun 	struct dpni_cmd_get_irq_status *cmd_params;
467*4882a593Smuzhiyun 	struct dpni_rsp_get_irq_status *rsp_params;
468*4882a593Smuzhiyun 	int err;
469*4882a593Smuzhiyun 
470*4882a593Smuzhiyun 	/* prepare command */
471*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_IRQ_STATUS,
472*4882a593Smuzhiyun 					  cmd_flags,
473*4882a593Smuzhiyun 					  token);
474*4882a593Smuzhiyun 	cmd_params = (struct dpni_cmd_get_irq_status *)cmd.params;
475*4882a593Smuzhiyun 	cmd_params->status = cpu_to_le32(*status);
476*4882a593Smuzhiyun 	cmd_params->irq_index = irq_index;
477*4882a593Smuzhiyun 
478*4882a593Smuzhiyun 	/* send command to mc*/
479*4882a593Smuzhiyun 	err = mc_send_command(mc_io, &cmd);
480*4882a593Smuzhiyun 	if (err)
481*4882a593Smuzhiyun 		return err;
482*4882a593Smuzhiyun 
483*4882a593Smuzhiyun 	/* retrieve response parameters */
484*4882a593Smuzhiyun 	rsp_params = (struct dpni_rsp_get_irq_status *)cmd.params;
485*4882a593Smuzhiyun 	*status = le32_to_cpu(rsp_params->status);
486*4882a593Smuzhiyun 
487*4882a593Smuzhiyun 	return 0;
488*4882a593Smuzhiyun }
489*4882a593Smuzhiyun 
490*4882a593Smuzhiyun /**
491*4882a593Smuzhiyun  * dpni_clear_irq_status() - Clear a pending interrupt's status
492*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
493*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
494*4882a593Smuzhiyun  * @token:	Token of DPNI object
495*4882a593Smuzhiyun  * @irq_index:	The interrupt index to configure
496*4882a593Smuzhiyun  * @status:	bits to clear (W1C) - one bit per cause:
497*4882a593Smuzhiyun  *			0 = don't change
498*4882a593Smuzhiyun  *			1 = clear status bit
499*4882a593Smuzhiyun  *
500*4882a593Smuzhiyun  * Return:	'0' on Success; Error code otherwise.
501*4882a593Smuzhiyun  */
dpni_clear_irq_status(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,u8 irq_index,u32 status)502*4882a593Smuzhiyun int dpni_clear_irq_status(struct fsl_mc_io *mc_io,
503*4882a593Smuzhiyun 			  u32 cmd_flags,
504*4882a593Smuzhiyun 			  u16 token,
505*4882a593Smuzhiyun 			  u8 irq_index,
506*4882a593Smuzhiyun 			  u32 status)
507*4882a593Smuzhiyun {
508*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
509*4882a593Smuzhiyun 	struct dpni_cmd_clear_irq_status *cmd_params;
510*4882a593Smuzhiyun 
511*4882a593Smuzhiyun 	/* prepare command */
512*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_CLEAR_IRQ_STATUS,
513*4882a593Smuzhiyun 					  cmd_flags,
514*4882a593Smuzhiyun 					  token);
515*4882a593Smuzhiyun 	cmd_params = (struct dpni_cmd_clear_irq_status *)cmd.params;
516*4882a593Smuzhiyun 	cmd_params->irq_index = irq_index;
517*4882a593Smuzhiyun 	cmd_params->status = cpu_to_le32(status);
518*4882a593Smuzhiyun 
519*4882a593Smuzhiyun 	/* send command to mc*/
520*4882a593Smuzhiyun 	return mc_send_command(mc_io, &cmd);
521*4882a593Smuzhiyun }
522*4882a593Smuzhiyun 
523*4882a593Smuzhiyun /**
524*4882a593Smuzhiyun  * dpni_get_attributes() - Retrieve DPNI attributes.
525*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
526*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
527*4882a593Smuzhiyun  * @token:	Token of DPNI object
528*4882a593Smuzhiyun  * @attr:	Object's attributes
529*4882a593Smuzhiyun  *
530*4882a593Smuzhiyun  * Return:	'0' on Success; Error code otherwise.
531*4882a593Smuzhiyun  */
dpni_get_attributes(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,struct dpni_attr * attr)532*4882a593Smuzhiyun int dpni_get_attributes(struct fsl_mc_io *mc_io,
533*4882a593Smuzhiyun 			u32 cmd_flags,
534*4882a593Smuzhiyun 			u16 token,
535*4882a593Smuzhiyun 			struct dpni_attr *attr)
536*4882a593Smuzhiyun {
537*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
538*4882a593Smuzhiyun 	struct dpni_rsp_get_attr *rsp_params;
539*4882a593Smuzhiyun 
540*4882a593Smuzhiyun 	int err;
541*4882a593Smuzhiyun 
542*4882a593Smuzhiyun 	/* prepare command */
543*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_ATTR,
544*4882a593Smuzhiyun 					  cmd_flags,
545*4882a593Smuzhiyun 					  token);
546*4882a593Smuzhiyun 
547*4882a593Smuzhiyun 	/* send command to mc*/
548*4882a593Smuzhiyun 	err = mc_send_command(mc_io, &cmd);
549*4882a593Smuzhiyun 	if (err)
550*4882a593Smuzhiyun 		return err;
551*4882a593Smuzhiyun 
552*4882a593Smuzhiyun 	/* retrieve response parameters */
553*4882a593Smuzhiyun 	rsp_params = (struct dpni_rsp_get_attr *)cmd.params;
554*4882a593Smuzhiyun 	attr->options = le32_to_cpu(rsp_params->options);
555*4882a593Smuzhiyun 	attr->num_queues = rsp_params->num_queues;
556*4882a593Smuzhiyun 	attr->num_tcs = rsp_params->num_tcs;
557*4882a593Smuzhiyun 	attr->mac_filter_entries = rsp_params->mac_filter_entries;
558*4882a593Smuzhiyun 	attr->vlan_filter_entries = rsp_params->vlan_filter_entries;
559*4882a593Smuzhiyun 	attr->qos_entries = rsp_params->qos_entries;
560*4882a593Smuzhiyun 	attr->fs_entries = le16_to_cpu(rsp_params->fs_entries);
561*4882a593Smuzhiyun 	attr->qos_key_size = rsp_params->qos_key_size;
562*4882a593Smuzhiyun 	attr->fs_key_size = rsp_params->fs_key_size;
563*4882a593Smuzhiyun 	attr->wriop_version = le16_to_cpu(rsp_params->wriop_version);
564*4882a593Smuzhiyun 
565*4882a593Smuzhiyun 	return 0;
566*4882a593Smuzhiyun }
567*4882a593Smuzhiyun 
568*4882a593Smuzhiyun /**
569*4882a593Smuzhiyun  * dpni_set_errors_behavior() - Set errors behavior
570*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
571*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
572*4882a593Smuzhiyun  * @token:	Token of DPNI object
573*4882a593Smuzhiyun  * @cfg:	Errors configuration
574*4882a593Smuzhiyun  *
575*4882a593Smuzhiyun  * this function may be called numerous times with different
576*4882a593Smuzhiyun  * error masks
577*4882a593Smuzhiyun  *
578*4882a593Smuzhiyun  * Return:	'0' on Success; Error code otherwise.
579*4882a593Smuzhiyun  */
dpni_set_errors_behavior(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,struct dpni_error_cfg * cfg)580*4882a593Smuzhiyun int dpni_set_errors_behavior(struct fsl_mc_io *mc_io,
581*4882a593Smuzhiyun 			     u32 cmd_flags,
582*4882a593Smuzhiyun 			     u16 token,
583*4882a593Smuzhiyun 			     struct dpni_error_cfg *cfg)
584*4882a593Smuzhiyun {
585*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
586*4882a593Smuzhiyun 	struct dpni_cmd_set_errors_behavior *cmd_params;
587*4882a593Smuzhiyun 
588*4882a593Smuzhiyun 	/* prepare command */
589*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_ERRORS_BEHAVIOR,
590*4882a593Smuzhiyun 					  cmd_flags,
591*4882a593Smuzhiyun 					  token);
592*4882a593Smuzhiyun 	cmd_params = (struct dpni_cmd_set_errors_behavior *)cmd.params;
593*4882a593Smuzhiyun 	cmd_params->errors = cpu_to_le32(cfg->errors);
594*4882a593Smuzhiyun 	dpni_set_field(cmd_params->flags, ERROR_ACTION, cfg->error_action);
595*4882a593Smuzhiyun 	dpni_set_field(cmd_params->flags, FRAME_ANN, cfg->set_frame_annotation);
596*4882a593Smuzhiyun 
597*4882a593Smuzhiyun 	/* send command to mc*/
598*4882a593Smuzhiyun 	return mc_send_command(mc_io, &cmd);
599*4882a593Smuzhiyun }
600*4882a593Smuzhiyun 
601*4882a593Smuzhiyun /**
602*4882a593Smuzhiyun  * dpni_get_buffer_layout() - Retrieve buffer layout attributes.
603*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
604*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
605*4882a593Smuzhiyun  * @token:	Token of DPNI object
606*4882a593Smuzhiyun  * @qtype:	Type of queue to retrieve configuration for
607*4882a593Smuzhiyun  * @layout:	Returns buffer layout attributes
608*4882a593Smuzhiyun  *
609*4882a593Smuzhiyun  * Return:	'0' on Success; Error code otherwise.
610*4882a593Smuzhiyun  */
dpni_get_buffer_layout(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,enum dpni_queue_type qtype,struct dpni_buffer_layout * layout)611*4882a593Smuzhiyun int dpni_get_buffer_layout(struct fsl_mc_io *mc_io,
612*4882a593Smuzhiyun 			   u32 cmd_flags,
613*4882a593Smuzhiyun 			   u16 token,
614*4882a593Smuzhiyun 			   enum dpni_queue_type qtype,
615*4882a593Smuzhiyun 			   struct dpni_buffer_layout *layout)
616*4882a593Smuzhiyun {
617*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
618*4882a593Smuzhiyun 	struct dpni_cmd_get_buffer_layout *cmd_params;
619*4882a593Smuzhiyun 	struct dpni_rsp_get_buffer_layout *rsp_params;
620*4882a593Smuzhiyun 	int err;
621*4882a593Smuzhiyun 
622*4882a593Smuzhiyun 	/* prepare command */
623*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_BUFFER_LAYOUT,
624*4882a593Smuzhiyun 					  cmd_flags,
625*4882a593Smuzhiyun 					  token);
626*4882a593Smuzhiyun 	cmd_params = (struct dpni_cmd_get_buffer_layout *)cmd.params;
627*4882a593Smuzhiyun 	cmd_params->qtype = qtype;
628*4882a593Smuzhiyun 
629*4882a593Smuzhiyun 	/* send command to mc*/
630*4882a593Smuzhiyun 	err = mc_send_command(mc_io, &cmd);
631*4882a593Smuzhiyun 	if (err)
632*4882a593Smuzhiyun 		return err;
633*4882a593Smuzhiyun 
634*4882a593Smuzhiyun 	/* retrieve response parameters */
635*4882a593Smuzhiyun 	rsp_params = (struct dpni_rsp_get_buffer_layout *)cmd.params;
636*4882a593Smuzhiyun 	layout->pass_timestamp = dpni_get_field(rsp_params->flags, PASS_TS);
637*4882a593Smuzhiyun 	layout->pass_parser_result = dpni_get_field(rsp_params->flags, PASS_PR);
638*4882a593Smuzhiyun 	layout->pass_frame_status = dpni_get_field(rsp_params->flags, PASS_FS);
639*4882a593Smuzhiyun 	layout->private_data_size = le16_to_cpu(rsp_params->private_data_size);
640*4882a593Smuzhiyun 	layout->data_align = le16_to_cpu(rsp_params->data_align);
641*4882a593Smuzhiyun 	layout->data_head_room = le16_to_cpu(rsp_params->head_room);
642*4882a593Smuzhiyun 	layout->data_tail_room = le16_to_cpu(rsp_params->tail_room);
643*4882a593Smuzhiyun 
644*4882a593Smuzhiyun 	return 0;
645*4882a593Smuzhiyun }
646*4882a593Smuzhiyun 
647*4882a593Smuzhiyun /**
648*4882a593Smuzhiyun  * dpni_set_buffer_layout() - Set buffer layout configuration.
649*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
650*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
651*4882a593Smuzhiyun  * @token:	Token of DPNI object
652*4882a593Smuzhiyun  * @qtype:	Type of queue this configuration applies to
653*4882a593Smuzhiyun  * @layout:	Buffer layout configuration
654*4882a593Smuzhiyun  *
655*4882a593Smuzhiyun  * Return:	'0' on Success; Error code otherwise.
656*4882a593Smuzhiyun  *
657*4882a593Smuzhiyun  * @warning	Allowed only when DPNI is disabled
658*4882a593Smuzhiyun  */
dpni_set_buffer_layout(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,enum dpni_queue_type qtype,const struct dpni_buffer_layout * layout)659*4882a593Smuzhiyun int dpni_set_buffer_layout(struct fsl_mc_io *mc_io,
660*4882a593Smuzhiyun 			   u32 cmd_flags,
661*4882a593Smuzhiyun 			   u16 token,
662*4882a593Smuzhiyun 			   enum dpni_queue_type qtype,
663*4882a593Smuzhiyun 			   const struct dpni_buffer_layout *layout)
664*4882a593Smuzhiyun {
665*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
666*4882a593Smuzhiyun 	struct dpni_cmd_set_buffer_layout *cmd_params;
667*4882a593Smuzhiyun 
668*4882a593Smuzhiyun 	/* prepare command */
669*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_BUFFER_LAYOUT,
670*4882a593Smuzhiyun 					  cmd_flags,
671*4882a593Smuzhiyun 					  token);
672*4882a593Smuzhiyun 	cmd_params = (struct dpni_cmd_set_buffer_layout *)cmd.params;
673*4882a593Smuzhiyun 	cmd_params->qtype = qtype;
674*4882a593Smuzhiyun 	cmd_params->options = cpu_to_le16(layout->options);
675*4882a593Smuzhiyun 	dpni_set_field(cmd_params->flags, PASS_TS, layout->pass_timestamp);
676*4882a593Smuzhiyun 	dpni_set_field(cmd_params->flags, PASS_PR, layout->pass_parser_result);
677*4882a593Smuzhiyun 	dpni_set_field(cmd_params->flags, PASS_FS, layout->pass_frame_status);
678*4882a593Smuzhiyun 	cmd_params->private_data_size = cpu_to_le16(layout->private_data_size);
679*4882a593Smuzhiyun 	cmd_params->data_align = cpu_to_le16(layout->data_align);
680*4882a593Smuzhiyun 	cmd_params->head_room = cpu_to_le16(layout->data_head_room);
681*4882a593Smuzhiyun 	cmd_params->tail_room = cpu_to_le16(layout->data_tail_room);
682*4882a593Smuzhiyun 
683*4882a593Smuzhiyun 	/* send command to mc*/
684*4882a593Smuzhiyun 	return mc_send_command(mc_io, &cmd);
685*4882a593Smuzhiyun }
686*4882a593Smuzhiyun 
687*4882a593Smuzhiyun /**
688*4882a593Smuzhiyun  * dpni_set_offload() - Set DPNI offload configuration.
689*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
690*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
691*4882a593Smuzhiyun  * @token:	Token of DPNI object
692*4882a593Smuzhiyun  * @type:	Type of DPNI offload
693*4882a593Smuzhiyun  * @config:	Offload configuration.
694*4882a593Smuzhiyun  *		For checksum offloads, non-zero value enables the offload
695*4882a593Smuzhiyun  *
696*4882a593Smuzhiyun  * Return:     '0' on Success; Error code otherwise.
697*4882a593Smuzhiyun  *
698*4882a593Smuzhiyun  * @warning    Allowed only when DPNI is disabled
699*4882a593Smuzhiyun  */
700*4882a593Smuzhiyun 
dpni_set_offload(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,enum dpni_offload type,u32 config)701*4882a593Smuzhiyun int dpni_set_offload(struct fsl_mc_io *mc_io,
702*4882a593Smuzhiyun 		     u32 cmd_flags,
703*4882a593Smuzhiyun 		     u16 token,
704*4882a593Smuzhiyun 		     enum dpni_offload type,
705*4882a593Smuzhiyun 		     u32 config)
706*4882a593Smuzhiyun {
707*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
708*4882a593Smuzhiyun 	struct dpni_cmd_set_offload *cmd_params;
709*4882a593Smuzhiyun 
710*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_OFFLOAD,
711*4882a593Smuzhiyun 					  cmd_flags,
712*4882a593Smuzhiyun 					  token);
713*4882a593Smuzhiyun 	cmd_params = (struct dpni_cmd_set_offload *)cmd.params;
714*4882a593Smuzhiyun 	cmd_params->dpni_offload = type;
715*4882a593Smuzhiyun 	cmd_params->config = cpu_to_le32(config);
716*4882a593Smuzhiyun 
717*4882a593Smuzhiyun 	return mc_send_command(mc_io, &cmd);
718*4882a593Smuzhiyun }
719*4882a593Smuzhiyun 
dpni_get_offload(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,enum dpni_offload type,u32 * config)720*4882a593Smuzhiyun int dpni_get_offload(struct fsl_mc_io *mc_io,
721*4882a593Smuzhiyun 		     u32 cmd_flags,
722*4882a593Smuzhiyun 		     u16 token,
723*4882a593Smuzhiyun 		     enum dpni_offload type,
724*4882a593Smuzhiyun 		     u32 *config)
725*4882a593Smuzhiyun {
726*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
727*4882a593Smuzhiyun 	struct dpni_cmd_get_offload *cmd_params;
728*4882a593Smuzhiyun 	struct dpni_rsp_get_offload *rsp_params;
729*4882a593Smuzhiyun 	int err;
730*4882a593Smuzhiyun 
731*4882a593Smuzhiyun 	/* prepare command */
732*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_OFFLOAD,
733*4882a593Smuzhiyun 					  cmd_flags,
734*4882a593Smuzhiyun 					  token);
735*4882a593Smuzhiyun 	cmd_params = (struct dpni_cmd_get_offload *)cmd.params;
736*4882a593Smuzhiyun 	cmd_params->dpni_offload = type;
737*4882a593Smuzhiyun 
738*4882a593Smuzhiyun 	/* send command to mc*/
739*4882a593Smuzhiyun 	err = mc_send_command(mc_io, &cmd);
740*4882a593Smuzhiyun 	if (err)
741*4882a593Smuzhiyun 		return err;
742*4882a593Smuzhiyun 
743*4882a593Smuzhiyun 	/* retrieve response parameters */
744*4882a593Smuzhiyun 	rsp_params = (struct dpni_rsp_get_offload *)cmd.params;
745*4882a593Smuzhiyun 	*config = le32_to_cpu(rsp_params->config);
746*4882a593Smuzhiyun 
747*4882a593Smuzhiyun 	return 0;
748*4882a593Smuzhiyun }
749*4882a593Smuzhiyun 
750*4882a593Smuzhiyun /**
751*4882a593Smuzhiyun  * dpni_get_qdid() - Get the Queuing Destination ID (QDID) that should be used
752*4882a593Smuzhiyun  *			for enqueue operations
753*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
754*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
755*4882a593Smuzhiyun  * @token:	Token of DPNI object
756*4882a593Smuzhiyun  * @qtype:	Type of queue to receive QDID for
757*4882a593Smuzhiyun  * @qdid:	Returned virtual QDID value that should be used as an argument
758*4882a593Smuzhiyun  *			in all enqueue operations
759*4882a593Smuzhiyun  *
760*4882a593Smuzhiyun  * Return:	'0' on Success; Error code otherwise.
761*4882a593Smuzhiyun  */
dpni_get_qdid(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,enum dpni_queue_type qtype,u16 * qdid)762*4882a593Smuzhiyun int dpni_get_qdid(struct fsl_mc_io *mc_io,
763*4882a593Smuzhiyun 		  u32 cmd_flags,
764*4882a593Smuzhiyun 		  u16 token,
765*4882a593Smuzhiyun 		  enum dpni_queue_type qtype,
766*4882a593Smuzhiyun 		  u16 *qdid)
767*4882a593Smuzhiyun {
768*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
769*4882a593Smuzhiyun 	struct dpni_cmd_get_qdid *cmd_params;
770*4882a593Smuzhiyun 	struct dpni_rsp_get_qdid *rsp_params;
771*4882a593Smuzhiyun 	int err;
772*4882a593Smuzhiyun 
773*4882a593Smuzhiyun 	/* prepare command */
774*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_QDID,
775*4882a593Smuzhiyun 					  cmd_flags,
776*4882a593Smuzhiyun 					  token);
777*4882a593Smuzhiyun 	cmd_params = (struct dpni_cmd_get_qdid *)cmd.params;
778*4882a593Smuzhiyun 	cmd_params->qtype = qtype;
779*4882a593Smuzhiyun 
780*4882a593Smuzhiyun 	/* send command to mc*/
781*4882a593Smuzhiyun 	err = mc_send_command(mc_io, &cmd);
782*4882a593Smuzhiyun 	if (err)
783*4882a593Smuzhiyun 		return err;
784*4882a593Smuzhiyun 
785*4882a593Smuzhiyun 	/* retrieve response parameters */
786*4882a593Smuzhiyun 	rsp_params = (struct dpni_rsp_get_qdid *)cmd.params;
787*4882a593Smuzhiyun 	*qdid = le16_to_cpu(rsp_params->qdid);
788*4882a593Smuzhiyun 
789*4882a593Smuzhiyun 	return 0;
790*4882a593Smuzhiyun }
791*4882a593Smuzhiyun 
792*4882a593Smuzhiyun /**
793*4882a593Smuzhiyun  * dpni_get_tx_data_offset() - Get the Tx data offset (from start of buffer)
794*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
795*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
796*4882a593Smuzhiyun  * @token:	Token of DPNI object
797*4882a593Smuzhiyun  * @data_offset: Tx data offset (from start of buffer)
798*4882a593Smuzhiyun  *
799*4882a593Smuzhiyun  * Return:	'0' on Success; Error code otherwise.
800*4882a593Smuzhiyun  */
dpni_get_tx_data_offset(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,u16 * data_offset)801*4882a593Smuzhiyun int dpni_get_tx_data_offset(struct fsl_mc_io *mc_io,
802*4882a593Smuzhiyun 			    u32 cmd_flags,
803*4882a593Smuzhiyun 			    u16 token,
804*4882a593Smuzhiyun 			    u16 *data_offset)
805*4882a593Smuzhiyun {
806*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
807*4882a593Smuzhiyun 	struct dpni_rsp_get_tx_data_offset *rsp_params;
808*4882a593Smuzhiyun 	int err;
809*4882a593Smuzhiyun 
810*4882a593Smuzhiyun 	/* prepare command */
811*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_TX_DATA_OFFSET,
812*4882a593Smuzhiyun 					  cmd_flags,
813*4882a593Smuzhiyun 					  token);
814*4882a593Smuzhiyun 
815*4882a593Smuzhiyun 	/* send command to mc*/
816*4882a593Smuzhiyun 	err = mc_send_command(mc_io, &cmd);
817*4882a593Smuzhiyun 	if (err)
818*4882a593Smuzhiyun 		return err;
819*4882a593Smuzhiyun 
820*4882a593Smuzhiyun 	/* retrieve response parameters */
821*4882a593Smuzhiyun 	rsp_params = (struct dpni_rsp_get_tx_data_offset *)cmd.params;
822*4882a593Smuzhiyun 	*data_offset = le16_to_cpu(rsp_params->data_offset);
823*4882a593Smuzhiyun 
824*4882a593Smuzhiyun 	return 0;
825*4882a593Smuzhiyun }
826*4882a593Smuzhiyun 
827*4882a593Smuzhiyun /**
828*4882a593Smuzhiyun  * dpni_set_link_cfg() - set the link configuration.
829*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
830*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
831*4882a593Smuzhiyun  * @token:	Token of DPNI object
832*4882a593Smuzhiyun  * @cfg:	Link configuration
833*4882a593Smuzhiyun  *
834*4882a593Smuzhiyun  * Return:	'0' on Success; Error code otherwise.
835*4882a593Smuzhiyun  */
dpni_set_link_cfg(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,const struct dpni_link_cfg * cfg)836*4882a593Smuzhiyun int dpni_set_link_cfg(struct fsl_mc_io *mc_io,
837*4882a593Smuzhiyun 		      u32 cmd_flags,
838*4882a593Smuzhiyun 		      u16 token,
839*4882a593Smuzhiyun 		      const struct dpni_link_cfg *cfg)
840*4882a593Smuzhiyun {
841*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
842*4882a593Smuzhiyun 	struct dpni_cmd_link_cfg *cmd_params;
843*4882a593Smuzhiyun 
844*4882a593Smuzhiyun 	/* prepare command */
845*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_LINK_CFG,
846*4882a593Smuzhiyun 					  cmd_flags,
847*4882a593Smuzhiyun 					  token);
848*4882a593Smuzhiyun 	cmd_params = (struct dpni_cmd_link_cfg *)cmd.params;
849*4882a593Smuzhiyun 	cmd_params->rate = cpu_to_le32(cfg->rate);
850*4882a593Smuzhiyun 	cmd_params->options = cpu_to_le64(cfg->options);
851*4882a593Smuzhiyun 
852*4882a593Smuzhiyun 	/* send command to mc*/
853*4882a593Smuzhiyun 	return mc_send_command(mc_io, &cmd);
854*4882a593Smuzhiyun }
855*4882a593Smuzhiyun 
856*4882a593Smuzhiyun /**
857*4882a593Smuzhiyun  * dpni_get_link_cfg() - return the link configuration
858*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
859*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
860*4882a593Smuzhiyun  * @token:	Token of DPNI object
861*4882a593Smuzhiyun  * @cfg:	Link configuration from dpni object
862*4882a593Smuzhiyun  *
863*4882a593Smuzhiyun  * Return:	'0' on Success; Error code otherwise.
864*4882a593Smuzhiyun  */
dpni_get_link_cfg(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,struct dpni_link_cfg * cfg)865*4882a593Smuzhiyun int dpni_get_link_cfg(struct fsl_mc_io *mc_io,
866*4882a593Smuzhiyun 		      u32 cmd_flags,
867*4882a593Smuzhiyun 		      u16 token,
868*4882a593Smuzhiyun 		      struct dpni_link_cfg *cfg)
869*4882a593Smuzhiyun {
870*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
871*4882a593Smuzhiyun 	struct dpni_cmd_link_cfg *rsp_params;
872*4882a593Smuzhiyun 	int err;
873*4882a593Smuzhiyun 
874*4882a593Smuzhiyun 	/* prepare command */
875*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_LINK_CFG,
876*4882a593Smuzhiyun 					  cmd_flags,
877*4882a593Smuzhiyun 					  token);
878*4882a593Smuzhiyun 
879*4882a593Smuzhiyun 	/* send command to mc*/
880*4882a593Smuzhiyun 	err = mc_send_command(mc_io, &cmd);
881*4882a593Smuzhiyun 	if (err)
882*4882a593Smuzhiyun 		return err;
883*4882a593Smuzhiyun 
884*4882a593Smuzhiyun 	/* retrieve response parameters */
885*4882a593Smuzhiyun 	rsp_params = (struct dpni_cmd_link_cfg *)cmd.params;
886*4882a593Smuzhiyun 	cfg->rate = le32_to_cpu(rsp_params->rate);
887*4882a593Smuzhiyun 	cfg->options = le64_to_cpu(rsp_params->options);
888*4882a593Smuzhiyun 
889*4882a593Smuzhiyun 	return err;
890*4882a593Smuzhiyun }
891*4882a593Smuzhiyun 
892*4882a593Smuzhiyun /**
893*4882a593Smuzhiyun  * dpni_get_link_state() - Return the link state (either up or down)
894*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
895*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
896*4882a593Smuzhiyun  * @token:	Token of DPNI object
897*4882a593Smuzhiyun  * @state:	Returned link state;
898*4882a593Smuzhiyun  *
899*4882a593Smuzhiyun  * Return:	'0' on Success; Error code otherwise.
900*4882a593Smuzhiyun  */
dpni_get_link_state(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,struct dpni_link_state * state)901*4882a593Smuzhiyun int dpni_get_link_state(struct fsl_mc_io *mc_io,
902*4882a593Smuzhiyun 			u32 cmd_flags,
903*4882a593Smuzhiyun 			u16 token,
904*4882a593Smuzhiyun 			struct dpni_link_state *state)
905*4882a593Smuzhiyun {
906*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
907*4882a593Smuzhiyun 	struct dpni_rsp_get_link_state *rsp_params;
908*4882a593Smuzhiyun 	int err;
909*4882a593Smuzhiyun 
910*4882a593Smuzhiyun 	/* prepare command */
911*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_LINK_STATE,
912*4882a593Smuzhiyun 					  cmd_flags,
913*4882a593Smuzhiyun 					  token);
914*4882a593Smuzhiyun 
915*4882a593Smuzhiyun 	/* send command to mc*/
916*4882a593Smuzhiyun 	err = mc_send_command(mc_io, &cmd);
917*4882a593Smuzhiyun 	if (err)
918*4882a593Smuzhiyun 		return err;
919*4882a593Smuzhiyun 
920*4882a593Smuzhiyun 	/* retrieve response parameters */
921*4882a593Smuzhiyun 	rsp_params = (struct dpni_rsp_get_link_state *)cmd.params;
922*4882a593Smuzhiyun 	state->up = dpni_get_field(rsp_params->flags, LINK_STATE);
923*4882a593Smuzhiyun 	state->rate = le32_to_cpu(rsp_params->rate);
924*4882a593Smuzhiyun 	state->options = le64_to_cpu(rsp_params->options);
925*4882a593Smuzhiyun 
926*4882a593Smuzhiyun 	return 0;
927*4882a593Smuzhiyun }
928*4882a593Smuzhiyun 
929*4882a593Smuzhiyun /**
930*4882a593Smuzhiyun  * dpni_set_max_frame_length() - Set the maximum received frame length.
931*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
932*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
933*4882a593Smuzhiyun  * @token:	Token of DPNI object
934*4882a593Smuzhiyun  * @max_frame_length:	Maximum received frame length (in
935*4882a593Smuzhiyun  *				bytes); frame is discarded if its
936*4882a593Smuzhiyun  *				length exceeds this value
937*4882a593Smuzhiyun  *
938*4882a593Smuzhiyun  * Return:	'0' on Success; Error code otherwise.
939*4882a593Smuzhiyun  */
dpni_set_max_frame_length(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,u16 max_frame_length)940*4882a593Smuzhiyun int dpni_set_max_frame_length(struct fsl_mc_io *mc_io,
941*4882a593Smuzhiyun 			      u32 cmd_flags,
942*4882a593Smuzhiyun 			      u16 token,
943*4882a593Smuzhiyun 			      u16 max_frame_length)
944*4882a593Smuzhiyun {
945*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
946*4882a593Smuzhiyun 	struct dpni_cmd_set_max_frame_length *cmd_params;
947*4882a593Smuzhiyun 
948*4882a593Smuzhiyun 	/* prepare command */
949*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_MAX_FRAME_LENGTH,
950*4882a593Smuzhiyun 					  cmd_flags,
951*4882a593Smuzhiyun 					  token);
952*4882a593Smuzhiyun 	cmd_params = (struct dpni_cmd_set_max_frame_length *)cmd.params;
953*4882a593Smuzhiyun 	cmd_params->max_frame_length = cpu_to_le16(max_frame_length);
954*4882a593Smuzhiyun 
955*4882a593Smuzhiyun 	/* send command to mc*/
956*4882a593Smuzhiyun 	return mc_send_command(mc_io, &cmd);
957*4882a593Smuzhiyun }
958*4882a593Smuzhiyun 
959*4882a593Smuzhiyun /**
960*4882a593Smuzhiyun  * dpni_get_max_frame_length() - Get the maximum received frame length.
961*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
962*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
963*4882a593Smuzhiyun  * @token:	Token of DPNI object
964*4882a593Smuzhiyun  * @max_frame_length:	Maximum received frame length (in
965*4882a593Smuzhiyun  *				bytes); frame is discarded if its
966*4882a593Smuzhiyun  *				length exceeds this value
967*4882a593Smuzhiyun  *
968*4882a593Smuzhiyun  * Return:	'0' on Success; Error code otherwise.
969*4882a593Smuzhiyun  */
dpni_get_max_frame_length(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,u16 * max_frame_length)970*4882a593Smuzhiyun int dpni_get_max_frame_length(struct fsl_mc_io *mc_io,
971*4882a593Smuzhiyun 			      u32 cmd_flags,
972*4882a593Smuzhiyun 			      u16 token,
973*4882a593Smuzhiyun 			      u16 *max_frame_length)
974*4882a593Smuzhiyun {
975*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
976*4882a593Smuzhiyun 	struct dpni_rsp_get_max_frame_length *rsp_params;
977*4882a593Smuzhiyun 	int err;
978*4882a593Smuzhiyun 
979*4882a593Smuzhiyun 	/* prepare command */
980*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_MAX_FRAME_LENGTH,
981*4882a593Smuzhiyun 					  cmd_flags,
982*4882a593Smuzhiyun 					  token);
983*4882a593Smuzhiyun 
984*4882a593Smuzhiyun 	/* send command to mc*/
985*4882a593Smuzhiyun 	err = mc_send_command(mc_io, &cmd);
986*4882a593Smuzhiyun 	if (err)
987*4882a593Smuzhiyun 		return err;
988*4882a593Smuzhiyun 
989*4882a593Smuzhiyun 	/* retrieve response parameters */
990*4882a593Smuzhiyun 	rsp_params = (struct dpni_rsp_get_max_frame_length *)cmd.params;
991*4882a593Smuzhiyun 	*max_frame_length = le16_to_cpu(rsp_params->max_frame_length);
992*4882a593Smuzhiyun 
993*4882a593Smuzhiyun 	return 0;
994*4882a593Smuzhiyun }
995*4882a593Smuzhiyun 
996*4882a593Smuzhiyun /**
997*4882a593Smuzhiyun  * dpni_set_multicast_promisc() - Enable/disable multicast promiscuous mode
998*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
999*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1000*4882a593Smuzhiyun  * @token:	Token of DPNI object
1001*4882a593Smuzhiyun  * @en:		Set to '1' to enable; '0' to disable
1002*4882a593Smuzhiyun  *
1003*4882a593Smuzhiyun  * Return:	'0' on Success; Error code otherwise.
1004*4882a593Smuzhiyun  */
dpni_set_multicast_promisc(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,int en)1005*4882a593Smuzhiyun int dpni_set_multicast_promisc(struct fsl_mc_io *mc_io,
1006*4882a593Smuzhiyun 			       u32 cmd_flags,
1007*4882a593Smuzhiyun 			       u16 token,
1008*4882a593Smuzhiyun 			       int en)
1009*4882a593Smuzhiyun {
1010*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
1011*4882a593Smuzhiyun 	struct dpni_cmd_set_multicast_promisc *cmd_params;
1012*4882a593Smuzhiyun 
1013*4882a593Smuzhiyun 	/* prepare command */
1014*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_MCAST_PROMISC,
1015*4882a593Smuzhiyun 					  cmd_flags,
1016*4882a593Smuzhiyun 					  token);
1017*4882a593Smuzhiyun 	cmd_params = (struct dpni_cmd_set_multicast_promisc *)cmd.params;
1018*4882a593Smuzhiyun 	dpni_set_field(cmd_params->enable, ENABLE, en);
1019*4882a593Smuzhiyun 
1020*4882a593Smuzhiyun 	/* send command to mc*/
1021*4882a593Smuzhiyun 	return mc_send_command(mc_io, &cmd);
1022*4882a593Smuzhiyun }
1023*4882a593Smuzhiyun 
1024*4882a593Smuzhiyun /**
1025*4882a593Smuzhiyun  * dpni_get_multicast_promisc() - Get multicast promiscuous mode
1026*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
1027*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1028*4882a593Smuzhiyun  * @token:	Token of DPNI object
1029*4882a593Smuzhiyun  * @en:		Returns '1' if enabled; '0' otherwise
1030*4882a593Smuzhiyun  *
1031*4882a593Smuzhiyun  * Return:	'0' on Success; Error code otherwise.
1032*4882a593Smuzhiyun  */
dpni_get_multicast_promisc(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,int * en)1033*4882a593Smuzhiyun int dpni_get_multicast_promisc(struct fsl_mc_io *mc_io,
1034*4882a593Smuzhiyun 			       u32 cmd_flags,
1035*4882a593Smuzhiyun 			       u16 token,
1036*4882a593Smuzhiyun 			       int *en)
1037*4882a593Smuzhiyun {
1038*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
1039*4882a593Smuzhiyun 	struct dpni_rsp_get_multicast_promisc *rsp_params;
1040*4882a593Smuzhiyun 	int err;
1041*4882a593Smuzhiyun 
1042*4882a593Smuzhiyun 	/* prepare command */
1043*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_MCAST_PROMISC,
1044*4882a593Smuzhiyun 					  cmd_flags,
1045*4882a593Smuzhiyun 					  token);
1046*4882a593Smuzhiyun 
1047*4882a593Smuzhiyun 	/* send command to mc*/
1048*4882a593Smuzhiyun 	err = mc_send_command(mc_io, &cmd);
1049*4882a593Smuzhiyun 	if (err)
1050*4882a593Smuzhiyun 		return err;
1051*4882a593Smuzhiyun 
1052*4882a593Smuzhiyun 	/* retrieve response parameters */
1053*4882a593Smuzhiyun 	rsp_params = (struct dpni_rsp_get_multicast_promisc *)cmd.params;
1054*4882a593Smuzhiyun 	*en = dpni_get_field(rsp_params->enabled, ENABLE);
1055*4882a593Smuzhiyun 
1056*4882a593Smuzhiyun 	return 0;
1057*4882a593Smuzhiyun }
1058*4882a593Smuzhiyun 
1059*4882a593Smuzhiyun /**
1060*4882a593Smuzhiyun  * dpni_set_unicast_promisc() - Enable/disable unicast promiscuous mode
1061*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
1062*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1063*4882a593Smuzhiyun  * @token:	Token of DPNI object
1064*4882a593Smuzhiyun  * @en:		Set to '1' to enable; '0' to disable
1065*4882a593Smuzhiyun  *
1066*4882a593Smuzhiyun  * Return:	'0' on Success; Error code otherwise.
1067*4882a593Smuzhiyun  */
dpni_set_unicast_promisc(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,int en)1068*4882a593Smuzhiyun int dpni_set_unicast_promisc(struct fsl_mc_io *mc_io,
1069*4882a593Smuzhiyun 			     u32 cmd_flags,
1070*4882a593Smuzhiyun 			     u16 token,
1071*4882a593Smuzhiyun 			     int en)
1072*4882a593Smuzhiyun {
1073*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
1074*4882a593Smuzhiyun 	struct dpni_cmd_set_unicast_promisc *cmd_params;
1075*4882a593Smuzhiyun 
1076*4882a593Smuzhiyun 	/* prepare command */
1077*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_UNICAST_PROMISC,
1078*4882a593Smuzhiyun 					  cmd_flags,
1079*4882a593Smuzhiyun 					  token);
1080*4882a593Smuzhiyun 	cmd_params = (struct dpni_cmd_set_unicast_promisc *)cmd.params;
1081*4882a593Smuzhiyun 	dpni_set_field(cmd_params->enable, ENABLE, en);
1082*4882a593Smuzhiyun 
1083*4882a593Smuzhiyun 	/* send command to mc*/
1084*4882a593Smuzhiyun 	return mc_send_command(mc_io, &cmd);
1085*4882a593Smuzhiyun }
1086*4882a593Smuzhiyun 
1087*4882a593Smuzhiyun /**
1088*4882a593Smuzhiyun  * dpni_get_unicast_promisc() - Get unicast promiscuous mode
1089*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
1090*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1091*4882a593Smuzhiyun  * @token:	Token of DPNI object
1092*4882a593Smuzhiyun  * @en:		Returns '1' if enabled; '0' otherwise
1093*4882a593Smuzhiyun  *
1094*4882a593Smuzhiyun  * Return:	'0' on Success; Error code otherwise.
1095*4882a593Smuzhiyun  */
dpni_get_unicast_promisc(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,int * en)1096*4882a593Smuzhiyun int dpni_get_unicast_promisc(struct fsl_mc_io *mc_io,
1097*4882a593Smuzhiyun 			     u32 cmd_flags,
1098*4882a593Smuzhiyun 			     u16 token,
1099*4882a593Smuzhiyun 			     int *en)
1100*4882a593Smuzhiyun {
1101*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
1102*4882a593Smuzhiyun 	struct dpni_rsp_get_unicast_promisc *rsp_params;
1103*4882a593Smuzhiyun 	int err;
1104*4882a593Smuzhiyun 
1105*4882a593Smuzhiyun 	/* prepare command */
1106*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_UNICAST_PROMISC,
1107*4882a593Smuzhiyun 					  cmd_flags,
1108*4882a593Smuzhiyun 					  token);
1109*4882a593Smuzhiyun 
1110*4882a593Smuzhiyun 	/* send command to mc*/
1111*4882a593Smuzhiyun 	err = mc_send_command(mc_io, &cmd);
1112*4882a593Smuzhiyun 	if (err)
1113*4882a593Smuzhiyun 		return err;
1114*4882a593Smuzhiyun 
1115*4882a593Smuzhiyun 	/* retrieve response parameters */
1116*4882a593Smuzhiyun 	rsp_params = (struct dpni_rsp_get_unicast_promisc *)cmd.params;
1117*4882a593Smuzhiyun 	*en = dpni_get_field(rsp_params->enabled, ENABLE);
1118*4882a593Smuzhiyun 
1119*4882a593Smuzhiyun 	return 0;
1120*4882a593Smuzhiyun }
1121*4882a593Smuzhiyun 
1122*4882a593Smuzhiyun /**
1123*4882a593Smuzhiyun  * dpni_set_primary_mac_addr() - Set the primary MAC address
1124*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
1125*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1126*4882a593Smuzhiyun  * @token:	Token of DPNI object
1127*4882a593Smuzhiyun  * @mac_addr:	MAC address to set as primary address
1128*4882a593Smuzhiyun  *
1129*4882a593Smuzhiyun  * Return:	'0' on Success; Error code otherwise.
1130*4882a593Smuzhiyun  */
dpni_set_primary_mac_addr(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,const u8 mac_addr[6])1131*4882a593Smuzhiyun int dpni_set_primary_mac_addr(struct fsl_mc_io *mc_io,
1132*4882a593Smuzhiyun 			      u32 cmd_flags,
1133*4882a593Smuzhiyun 			      u16 token,
1134*4882a593Smuzhiyun 			      const u8 mac_addr[6])
1135*4882a593Smuzhiyun {
1136*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
1137*4882a593Smuzhiyun 	struct dpni_cmd_set_primary_mac_addr *cmd_params;
1138*4882a593Smuzhiyun 	int i;
1139*4882a593Smuzhiyun 
1140*4882a593Smuzhiyun 	/* prepare command */
1141*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_PRIM_MAC,
1142*4882a593Smuzhiyun 					  cmd_flags,
1143*4882a593Smuzhiyun 					  token);
1144*4882a593Smuzhiyun 	cmd_params = (struct dpni_cmd_set_primary_mac_addr *)cmd.params;
1145*4882a593Smuzhiyun 	for (i = 0; i < 6; i++)
1146*4882a593Smuzhiyun 		cmd_params->mac_addr[i] = mac_addr[5 - i];
1147*4882a593Smuzhiyun 
1148*4882a593Smuzhiyun 	/* send command to mc*/
1149*4882a593Smuzhiyun 	return mc_send_command(mc_io, &cmd);
1150*4882a593Smuzhiyun }
1151*4882a593Smuzhiyun 
1152*4882a593Smuzhiyun /**
1153*4882a593Smuzhiyun  * dpni_get_primary_mac_addr() - Get the primary MAC address
1154*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
1155*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1156*4882a593Smuzhiyun  * @token:	Token of DPNI object
1157*4882a593Smuzhiyun  * @mac_addr:	Returned MAC address
1158*4882a593Smuzhiyun  *
1159*4882a593Smuzhiyun  * Return:	'0' on Success; Error code otherwise.
1160*4882a593Smuzhiyun  */
dpni_get_primary_mac_addr(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,u8 mac_addr[6])1161*4882a593Smuzhiyun int dpni_get_primary_mac_addr(struct fsl_mc_io *mc_io,
1162*4882a593Smuzhiyun 			      u32 cmd_flags,
1163*4882a593Smuzhiyun 			      u16 token,
1164*4882a593Smuzhiyun 			      u8 mac_addr[6])
1165*4882a593Smuzhiyun {
1166*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
1167*4882a593Smuzhiyun 	struct dpni_rsp_get_primary_mac_addr *rsp_params;
1168*4882a593Smuzhiyun 	int i, err;
1169*4882a593Smuzhiyun 
1170*4882a593Smuzhiyun 	/* prepare command */
1171*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_PRIM_MAC,
1172*4882a593Smuzhiyun 					  cmd_flags,
1173*4882a593Smuzhiyun 					  token);
1174*4882a593Smuzhiyun 
1175*4882a593Smuzhiyun 	/* send command to mc*/
1176*4882a593Smuzhiyun 	err = mc_send_command(mc_io, &cmd);
1177*4882a593Smuzhiyun 	if (err)
1178*4882a593Smuzhiyun 		return err;
1179*4882a593Smuzhiyun 
1180*4882a593Smuzhiyun 	/* retrieve response parameters */
1181*4882a593Smuzhiyun 	rsp_params = (struct dpni_rsp_get_primary_mac_addr *)cmd.params;
1182*4882a593Smuzhiyun 	for (i = 0; i < 6; i++)
1183*4882a593Smuzhiyun 		mac_addr[5 - i] = rsp_params->mac_addr[i];
1184*4882a593Smuzhiyun 
1185*4882a593Smuzhiyun 	return 0;
1186*4882a593Smuzhiyun }
1187*4882a593Smuzhiyun 
1188*4882a593Smuzhiyun /**
1189*4882a593Smuzhiyun  * dpni_get_port_mac_addr() - Retrieve MAC address associated to the physical
1190*4882a593Smuzhiyun  *			port the DPNI is attached to
1191*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
1192*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1193*4882a593Smuzhiyun  * @token:	Token of DPNI object
1194*4882a593Smuzhiyun  * @mac_addr:	MAC address of the physical port, if any, otherwise 0
1195*4882a593Smuzhiyun  *
1196*4882a593Smuzhiyun  * The primary MAC address is not cleared by this operation.
1197*4882a593Smuzhiyun  *
1198*4882a593Smuzhiyun  * Return:	'0' on Success; Error code otherwise.
1199*4882a593Smuzhiyun  */
dpni_get_port_mac_addr(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,u8 mac_addr[6])1200*4882a593Smuzhiyun int dpni_get_port_mac_addr(struct fsl_mc_io *mc_io,
1201*4882a593Smuzhiyun 			   u32 cmd_flags,
1202*4882a593Smuzhiyun 			   u16 token,
1203*4882a593Smuzhiyun 			   u8 mac_addr[6])
1204*4882a593Smuzhiyun {
1205*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
1206*4882a593Smuzhiyun 	struct dpni_rsp_get_port_mac_addr *rsp_params;
1207*4882a593Smuzhiyun 	int i, err;
1208*4882a593Smuzhiyun 
1209*4882a593Smuzhiyun 	/* prepare command */
1210*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_PORT_MAC_ADDR,
1211*4882a593Smuzhiyun 					  cmd_flags,
1212*4882a593Smuzhiyun 					  token);
1213*4882a593Smuzhiyun 
1214*4882a593Smuzhiyun 	/* send command to mc*/
1215*4882a593Smuzhiyun 	err = mc_send_command(mc_io, &cmd);
1216*4882a593Smuzhiyun 	if (err)
1217*4882a593Smuzhiyun 		return err;
1218*4882a593Smuzhiyun 
1219*4882a593Smuzhiyun 	/* retrieve response parameters */
1220*4882a593Smuzhiyun 	rsp_params = (struct dpni_rsp_get_port_mac_addr *)cmd.params;
1221*4882a593Smuzhiyun 	for (i = 0; i < 6; i++)
1222*4882a593Smuzhiyun 		mac_addr[5 - i] = rsp_params->mac_addr[i];
1223*4882a593Smuzhiyun 
1224*4882a593Smuzhiyun 	return 0;
1225*4882a593Smuzhiyun }
1226*4882a593Smuzhiyun 
1227*4882a593Smuzhiyun /**
1228*4882a593Smuzhiyun  * dpni_add_mac_addr() - Add MAC address filter
1229*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
1230*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1231*4882a593Smuzhiyun  * @token:	Token of DPNI object
1232*4882a593Smuzhiyun  * @mac_addr:	MAC address to add
1233*4882a593Smuzhiyun  *
1234*4882a593Smuzhiyun  * Return:	'0' on Success; Error code otherwise.
1235*4882a593Smuzhiyun  */
dpni_add_mac_addr(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,const u8 mac_addr[6])1236*4882a593Smuzhiyun int dpni_add_mac_addr(struct fsl_mc_io *mc_io,
1237*4882a593Smuzhiyun 		      u32 cmd_flags,
1238*4882a593Smuzhiyun 		      u16 token,
1239*4882a593Smuzhiyun 		      const u8 mac_addr[6])
1240*4882a593Smuzhiyun {
1241*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
1242*4882a593Smuzhiyun 	struct dpni_cmd_add_mac_addr *cmd_params;
1243*4882a593Smuzhiyun 	int i;
1244*4882a593Smuzhiyun 
1245*4882a593Smuzhiyun 	/* prepare command */
1246*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_ADD_MAC_ADDR,
1247*4882a593Smuzhiyun 					  cmd_flags,
1248*4882a593Smuzhiyun 					  token);
1249*4882a593Smuzhiyun 	cmd_params = (struct dpni_cmd_add_mac_addr *)cmd.params;
1250*4882a593Smuzhiyun 	for (i = 0; i < 6; i++)
1251*4882a593Smuzhiyun 		cmd_params->mac_addr[i] = mac_addr[5 - i];
1252*4882a593Smuzhiyun 
1253*4882a593Smuzhiyun 	/* send command to mc*/
1254*4882a593Smuzhiyun 	return mc_send_command(mc_io, &cmd);
1255*4882a593Smuzhiyun }
1256*4882a593Smuzhiyun 
1257*4882a593Smuzhiyun /**
1258*4882a593Smuzhiyun  * dpni_remove_mac_addr() - Remove MAC address filter
1259*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
1260*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1261*4882a593Smuzhiyun  * @token:	Token of DPNI object
1262*4882a593Smuzhiyun  * @mac_addr:	MAC address to remove
1263*4882a593Smuzhiyun  *
1264*4882a593Smuzhiyun  * Return:	'0' on Success; Error code otherwise.
1265*4882a593Smuzhiyun  */
dpni_remove_mac_addr(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,const u8 mac_addr[6])1266*4882a593Smuzhiyun int dpni_remove_mac_addr(struct fsl_mc_io *mc_io,
1267*4882a593Smuzhiyun 			 u32 cmd_flags,
1268*4882a593Smuzhiyun 			 u16 token,
1269*4882a593Smuzhiyun 			 const u8 mac_addr[6])
1270*4882a593Smuzhiyun {
1271*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
1272*4882a593Smuzhiyun 	struct dpni_cmd_remove_mac_addr *cmd_params;
1273*4882a593Smuzhiyun 	int i;
1274*4882a593Smuzhiyun 
1275*4882a593Smuzhiyun 	/* prepare command */
1276*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_REMOVE_MAC_ADDR,
1277*4882a593Smuzhiyun 					  cmd_flags,
1278*4882a593Smuzhiyun 					  token);
1279*4882a593Smuzhiyun 	cmd_params = (struct dpni_cmd_remove_mac_addr *)cmd.params;
1280*4882a593Smuzhiyun 	for (i = 0; i < 6; i++)
1281*4882a593Smuzhiyun 		cmd_params->mac_addr[i] = mac_addr[5 - i];
1282*4882a593Smuzhiyun 
1283*4882a593Smuzhiyun 	/* send command to mc*/
1284*4882a593Smuzhiyun 	return mc_send_command(mc_io, &cmd);
1285*4882a593Smuzhiyun }
1286*4882a593Smuzhiyun 
1287*4882a593Smuzhiyun /**
1288*4882a593Smuzhiyun  * dpni_clear_mac_filters() - Clear all unicast and/or multicast MAC filters
1289*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
1290*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1291*4882a593Smuzhiyun  * @token:	Token of DPNI object
1292*4882a593Smuzhiyun  * @unicast:	Set to '1' to clear unicast addresses
1293*4882a593Smuzhiyun  * @multicast:	Set to '1' to clear multicast addresses
1294*4882a593Smuzhiyun  *
1295*4882a593Smuzhiyun  * The primary MAC address is not cleared by this operation.
1296*4882a593Smuzhiyun  *
1297*4882a593Smuzhiyun  * Return:	'0' on Success; Error code otherwise.
1298*4882a593Smuzhiyun  */
dpni_clear_mac_filters(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,int unicast,int multicast)1299*4882a593Smuzhiyun int dpni_clear_mac_filters(struct fsl_mc_io *mc_io,
1300*4882a593Smuzhiyun 			   u32 cmd_flags,
1301*4882a593Smuzhiyun 			   u16 token,
1302*4882a593Smuzhiyun 			   int unicast,
1303*4882a593Smuzhiyun 			   int multicast)
1304*4882a593Smuzhiyun {
1305*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
1306*4882a593Smuzhiyun 	struct dpni_cmd_clear_mac_filters *cmd_params;
1307*4882a593Smuzhiyun 
1308*4882a593Smuzhiyun 	/* prepare command */
1309*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_CLR_MAC_FILTERS,
1310*4882a593Smuzhiyun 					  cmd_flags,
1311*4882a593Smuzhiyun 					  token);
1312*4882a593Smuzhiyun 	cmd_params = (struct dpni_cmd_clear_mac_filters *)cmd.params;
1313*4882a593Smuzhiyun 	dpni_set_field(cmd_params->flags, UNICAST_FILTERS, unicast);
1314*4882a593Smuzhiyun 	dpni_set_field(cmd_params->flags, MULTICAST_FILTERS, multicast);
1315*4882a593Smuzhiyun 
1316*4882a593Smuzhiyun 	/* send command to mc*/
1317*4882a593Smuzhiyun 	return mc_send_command(mc_io, &cmd);
1318*4882a593Smuzhiyun }
1319*4882a593Smuzhiyun 
1320*4882a593Smuzhiyun /**
1321*4882a593Smuzhiyun  * dpni_set_rx_tc_dist() - Set Rx traffic class distribution configuration
1322*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
1323*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1324*4882a593Smuzhiyun  * @token:	Token of DPNI object
1325*4882a593Smuzhiyun  * @tc_id:	Traffic class selection (0-7)
1326*4882a593Smuzhiyun  * @cfg:	Traffic class distribution configuration
1327*4882a593Smuzhiyun  *
1328*4882a593Smuzhiyun  * warning: if 'dist_mode != DPNI_DIST_MODE_NONE', call dpni_prepare_key_cfg()
1329*4882a593Smuzhiyun  *			first to prepare the key_cfg_iova parameter
1330*4882a593Smuzhiyun  *
1331*4882a593Smuzhiyun  * Return:	'0' on Success; error code otherwise.
1332*4882a593Smuzhiyun  */
dpni_set_rx_tc_dist(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,u8 tc_id,const struct dpni_rx_tc_dist_cfg * cfg)1333*4882a593Smuzhiyun int dpni_set_rx_tc_dist(struct fsl_mc_io *mc_io,
1334*4882a593Smuzhiyun 			u32 cmd_flags,
1335*4882a593Smuzhiyun 			u16 token,
1336*4882a593Smuzhiyun 			u8 tc_id,
1337*4882a593Smuzhiyun 			const struct dpni_rx_tc_dist_cfg *cfg)
1338*4882a593Smuzhiyun {
1339*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
1340*4882a593Smuzhiyun 	struct dpni_cmd_set_rx_tc_dist *cmd_params;
1341*4882a593Smuzhiyun 
1342*4882a593Smuzhiyun 	/* prepare command */
1343*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_RX_TC_DIST,
1344*4882a593Smuzhiyun 					  cmd_flags,
1345*4882a593Smuzhiyun 					  token);
1346*4882a593Smuzhiyun 	cmd_params = (struct dpni_cmd_set_rx_tc_dist *)cmd.params;
1347*4882a593Smuzhiyun 	cmd_params->dist_size = cpu_to_le16(cfg->dist_size);
1348*4882a593Smuzhiyun 	cmd_params->tc_id = tc_id;
1349*4882a593Smuzhiyun 	dpni_set_field(cmd_params->flags, DIST_MODE, cfg->dist_mode);
1350*4882a593Smuzhiyun 	dpni_set_field(cmd_params->flags, MISS_ACTION, cfg->fs_cfg.miss_action);
1351*4882a593Smuzhiyun 	cmd_params->default_flow_id = cpu_to_le16(cfg->fs_cfg.default_flow_id);
1352*4882a593Smuzhiyun 	cmd_params->key_cfg_iova = cpu_to_le64(cfg->key_cfg_iova);
1353*4882a593Smuzhiyun 
1354*4882a593Smuzhiyun 	/* send command to mc*/
1355*4882a593Smuzhiyun 	return mc_send_command(mc_io, &cmd);
1356*4882a593Smuzhiyun }
1357*4882a593Smuzhiyun 
1358*4882a593Smuzhiyun /**
1359*4882a593Smuzhiyun  * dpni_set_congestion_notification() - Set traffic class congestion
1360*4882a593Smuzhiyun  *					notification configuration
1361*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
1362*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1363*4882a593Smuzhiyun  * @token:	Token of DPNI object
1364*4882a593Smuzhiyun  * @qtype:	Type of queue - Rx, Tx and Tx confirm types are supported
1365*4882a593Smuzhiyun  * @tc_id:	Traffic class selection (0-7)
1366*4882a593Smuzhiyun  * @cfg:	Congestion notification configuration
1367*4882a593Smuzhiyun  *
1368*4882a593Smuzhiyun  * Return:	'0' on Success; error code otherwise.
1369*4882a593Smuzhiyun  */
dpni_set_congestion_notification(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,enum dpni_queue_type qtype,u8 tc_id,const struct dpni_congestion_notification_cfg * cfg)1370*4882a593Smuzhiyun int dpni_set_congestion_notification(
1371*4882a593Smuzhiyun 			struct fsl_mc_io *mc_io,
1372*4882a593Smuzhiyun 			u32 cmd_flags,
1373*4882a593Smuzhiyun 			u16 token,
1374*4882a593Smuzhiyun 			enum dpni_queue_type qtype,
1375*4882a593Smuzhiyun 			u8 tc_id,
1376*4882a593Smuzhiyun 			const struct dpni_congestion_notification_cfg *cfg)
1377*4882a593Smuzhiyun {
1378*4882a593Smuzhiyun 	struct dpni_cmd_set_congestion_notification *cmd_params;
1379*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
1380*4882a593Smuzhiyun 
1381*4882a593Smuzhiyun 	/* prepare command */
1382*4882a593Smuzhiyun 	cmd.header =
1383*4882a593Smuzhiyun 		mc_encode_cmd_header(DPNI_CMDID_SET_CONGESTION_NOTIFICATION,
1384*4882a593Smuzhiyun 				     cmd_flags,
1385*4882a593Smuzhiyun 				     token);
1386*4882a593Smuzhiyun 	cmd_params = (struct dpni_cmd_set_congestion_notification *)cmd.params;
1387*4882a593Smuzhiyun 	cmd_params->qtype = qtype;
1388*4882a593Smuzhiyun 	cmd_params->tc = tc_id;
1389*4882a593Smuzhiyun 	cmd_params->dest_id = cpu_to_le32(cfg->dest_cfg.dest_id);
1390*4882a593Smuzhiyun 	cmd_params->notification_mode = cpu_to_le16(cfg->notification_mode);
1391*4882a593Smuzhiyun 	cmd_params->dest_priority = cfg->dest_cfg.priority;
1392*4882a593Smuzhiyun 	dpni_set_field(cmd_params->type_units, DEST_TYPE,
1393*4882a593Smuzhiyun 		       cfg->dest_cfg.dest_type);
1394*4882a593Smuzhiyun 	dpni_set_field(cmd_params->type_units, CONG_UNITS, cfg->units);
1395*4882a593Smuzhiyun 	cmd_params->message_iova = cpu_to_le64(cfg->message_iova);
1396*4882a593Smuzhiyun 	cmd_params->message_ctx = cpu_to_le64(cfg->message_ctx);
1397*4882a593Smuzhiyun 	cmd_params->threshold_entry = cpu_to_le32(cfg->threshold_entry);
1398*4882a593Smuzhiyun 	cmd_params->threshold_exit = cpu_to_le32(cfg->threshold_exit);
1399*4882a593Smuzhiyun 
1400*4882a593Smuzhiyun 	/* send command to mc*/
1401*4882a593Smuzhiyun 	return mc_send_command(mc_io, &cmd);
1402*4882a593Smuzhiyun }
1403*4882a593Smuzhiyun 
1404*4882a593Smuzhiyun /**
1405*4882a593Smuzhiyun  * dpni_set_queue() - Set queue parameters
1406*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
1407*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1408*4882a593Smuzhiyun  * @token:	Token of DPNI object
1409*4882a593Smuzhiyun  * @qtype:	Type of queue - all queue types are supported, although
1410*4882a593Smuzhiyun  *		the command is ignored for Tx
1411*4882a593Smuzhiyun  * @tc:		Traffic class, in range 0 to NUM_TCS - 1
1412*4882a593Smuzhiyun  * @index:	Selects the specific queue out of the set allocated for the
1413*4882a593Smuzhiyun  *		same TC. Value must be in range 0 to NUM_QUEUES - 1
1414*4882a593Smuzhiyun  * @options:	A combination of DPNI_QUEUE_OPT_ values that control what
1415*4882a593Smuzhiyun  *		configuration options are set on the queue
1416*4882a593Smuzhiyun  * @queue:	Queue structure
1417*4882a593Smuzhiyun  *
1418*4882a593Smuzhiyun  * Return:	'0' on Success; Error code otherwise.
1419*4882a593Smuzhiyun  */
dpni_set_queue(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,enum dpni_queue_type qtype,u8 tc,u8 index,u8 options,const struct dpni_queue * queue)1420*4882a593Smuzhiyun int dpni_set_queue(struct fsl_mc_io *mc_io,
1421*4882a593Smuzhiyun 		   u32 cmd_flags,
1422*4882a593Smuzhiyun 		   u16 token,
1423*4882a593Smuzhiyun 		   enum dpni_queue_type qtype,
1424*4882a593Smuzhiyun 		   u8 tc,
1425*4882a593Smuzhiyun 		   u8 index,
1426*4882a593Smuzhiyun 		   u8 options,
1427*4882a593Smuzhiyun 		   const struct dpni_queue *queue)
1428*4882a593Smuzhiyun {
1429*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
1430*4882a593Smuzhiyun 	struct dpni_cmd_set_queue *cmd_params;
1431*4882a593Smuzhiyun 
1432*4882a593Smuzhiyun 	/* prepare command */
1433*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_QUEUE,
1434*4882a593Smuzhiyun 					  cmd_flags,
1435*4882a593Smuzhiyun 					  token);
1436*4882a593Smuzhiyun 	cmd_params = (struct dpni_cmd_set_queue *)cmd.params;
1437*4882a593Smuzhiyun 	cmd_params->qtype = qtype;
1438*4882a593Smuzhiyun 	cmd_params->tc = tc;
1439*4882a593Smuzhiyun 	cmd_params->index = index;
1440*4882a593Smuzhiyun 	cmd_params->options = options;
1441*4882a593Smuzhiyun 	cmd_params->dest_id = cpu_to_le32(queue->destination.id);
1442*4882a593Smuzhiyun 	cmd_params->dest_prio = queue->destination.priority;
1443*4882a593Smuzhiyun 	dpni_set_field(cmd_params->flags, DEST_TYPE, queue->destination.type);
1444*4882a593Smuzhiyun 	dpni_set_field(cmd_params->flags, STASH_CTRL, queue->flc.stash_control);
1445*4882a593Smuzhiyun 	dpni_set_field(cmd_params->flags, HOLD_ACTIVE,
1446*4882a593Smuzhiyun 		       queue->destination.hold_active);
1447*4882a593Smuzhiyun 	cmd_params->flc = cpu_to_le64(queue->flc.value);
1448*4882a593Smuzhiyun 	cmd_params->user_context = cpu_to_le64(queue->user_context);
1449*4882a593Smuzhiyun 
1450*4882a593Smuzhiyun 	/* send command to mc */
1451*4882a593Smuzhiyun 	return mc_send_command(mc_io, &cmd);
1452*4882a593Smuzhiyun }
1453*4882a593Smuzhiyun 
1454*4882a593Smuzhiyun /**
1455*4882a593Smuzhiyun  * dpni_get_queue() - Get queue parameters
1456*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
1457*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1458*4882a593Smuzhiyun  * @token:	Token of DPNI object
1459*4882a593Smuzhiyun  * @qtype:	Type of queue - all queue types are supported
1460*4882a593Smuzhiyun  * @tc:		Traffic class, in range 0 to NUM_TCS - 1
1461*4882a593Smuzhiyun  * @index:	Selects the specific queue out of the set allocated for the
1462*4882a593Smuzhiyun  *		same TC. Value must be in range 0 to NUM_QUEUES - 1
1463*4882a593Smuzhiyun  * @queue:	Queue configuration structure
1464*4882a593Smuzhiyun  * @qid:	Queue identification
1465*4882a593Smuzhiyun  *
1466*4882a593Smuzhiyun  * Return:	'0' on Success; Error code otherwise.
1467*4882a593Smuzhiyun  */
dpni_get_queue(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,enum dpni_queue_type qtype,u8 tc,u8 index,struct dpni_queue * queue,struct dpni_queue_id * qid)1468*4882a593Smuzhiyun int dpni_get_queue(struct fsl_mc_io *mc_io,
1469*4882a593Smuzhiyun 		   u32 cmd_flags,
1470*4882a593Smuzhiyun 		   u16 token,
1471*4882a593Smuzhiyun 		   enum dpni_queue_type qtype,
1472*4882a593Smuzhiyun 		   u8 tc,
1473*4882a593Smuzhiyun 		   u8 index,
1474*4882a593Smuzhiyun 		   struct dpni_queue *queue,
1475*4882a593Smuzhiyun 		   struct dpni_queue_id *qid)
1476*4882a593Smuzhiyun {
1477*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
1478*4882a593Smuzhiyun 	struct dpni_cmd_get_queue *cmd_params;
1479*4882a593Smuzhiyun 	struct dpni_rsp_get_queue *rsp_params;
1480*4882a593Smuzhiyun 	int err;
1481*4882a593Smuzhiyun 
1482*4882a593Smuzhiyun 	/* prepare command */
1483*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_QUEUE,
1484*4882a593Smuzhiyun 					  cmd_flags,
1485*4882a593Smuzhiyun 					  token);
1486*4882a593Smuzhiyun 	cmd_params = (struct dpni_cmd_get_queue *)cmd.params;
1487*4882a593Smuzhiyun 	cmd_params->qtype = qtype;
1488*4882a593Smuzhiyun 	cmd_params->tc = tc;
1489*4882a593Smuzhiyun 	cmd_params->index = index;
1490*4882a593Smuzhiyun 
1491*4882a593Smuzhiyun 	/* send command to mc */
1492*4882a593Smuzhiyun 	err = mc_send_command(mc_io, &cmd);
1493*4882a593Smuzhiyun 	if (err)
1494*4882a593Smuzhiyun 		return err;
1495*4882a593Smuzhiyun 
1496*4882a593Smuzhiyun 	/* retrieve response parameters */
1497*4882a593Smuzhiyun 	rsp_params = (struct dpni_rsp_get_queue *)cmd.params;
1498*4882a593Smuzhiyun 	queue->destination.id = le32_to_cpu(rsp_params->dest_id);
1499*4882a593Smuzhiyun 	queue->destination.priority = rsp_params->dest_prio;
1500*4882a593Smuzhiyun 	queue->destination.type = dpni_get_field(rsp_params->flags,
1501*4882a593Smuzhiyun 						 DEST_TYPE);
1502*4882a593Smuzhiyun 	queue->flc.stash_control = dpni_get_field(rsp_params->flags,
1503*4882a593Smuzhiyun 						  STASH_CTRL);
1504*4882a593Smuzhiyun 	queue->destination.hold_active = dpni_get_field(rsp_params->flags,
1505*4882a593Smuzhiyun 							HOLD_ACTIVE);
1506*4882a593Smuzhiyun 	queue->flc.value = le64_to_cpu(rsp_params->flc);
1507*4882a593Smuzhiyun 	queue->user_context = le64_to_cpu(rsp_params->user_context);
1508*4882a593Smuzhiyun 	qid->fqid = le32_to_cpu(rsp_params->fqid);
1509*4882a593Smuzhiyun 	qid->qdbin = le16_to_cpu(rsp_params->qdbin);
1510*4882a593Smuzhiyun 
1511*4882a593Smuzhiyun 	return 0;
1512*4882a593Smuzhiyun }
1513*4882a593Smuzhiyun 
1514*4882a593Smuzhiyun /**
1515*4882a593Smuzhiyun  * dpni_get_statistics() - Get DPNI statistics
1516*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
1517*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1518*4882a593Smuzhiyun  * @token:	Token of DPNI object
1519*4882a593Smuzhiyun  * @page:	Selects the statistics page to retrieve, see
1520*4882a593Smuzhiyun  *		DPNI_GET_STATISTICS output. Pages are numbered 0 to 6.
1521*4882a593Smuzhiyun  * @stat:	Structure containing the statistics
1522*4882a593Smuzhiyun  *
1523*4882a593Smuzhiyun  * Return:	'0' on Success; Error code otherwise.
1524*4882a593Smuzhiyun  */
dpni_get_statistics(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,u8 page,union dpni_statistics * stat)1525*4882a593Smuzhiyun int dpni_get_statistics(struct fsl_mc_io *mc_io,
1526*4882a593Smuzhiyun 			u32 cmd_flags,
1527*4882a593Smuzhiyun 			u16 token,
1528*4882a593Smuzhiyun 			u8 page,
1529*4882a593Smuzhiyun 			union dpni_statistics *stat)
1530*4882a593Smuzhiyun {
1531*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
1532*4882a593Smuzhiyun 	struct dpni_cmd_get_statistics *cmd_params;
1533*4882a593Smuzhiyun 	struct dpni_rsp_get_statistics *rsp_params;
1534*4882a593Smuzhiyun 	int i, err;
1535*4882a593Smuzhiyun 
1536*4882a593Smuzhiyun 	/* prepare command */
1537*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_STATISTICS,
1538*4882a593Smuzhiyun 					  cmd_flags,
1539*4882a593Smuzhiyun 					  token);
1540*4882a593Smuzhiyun 	cmd_params = (struct dpni_cmd_get_statistics *)cmd.params;
1541*4882a593Smuzhiyun 	cmd_params->page_number = page;
1542*4882a593Smuzhiyun 
1543*4882a593Smuzhiyun 	/* send command to mc */
1544*4882a593Smuzhiyun 	err = mc_send_command(mc_io, &cmd);
1545*4882a593Smuzhiyun 	if (err)
1546*4882a593Smuzhiyun 		return err;
1547*4882a593Smuzhiyun 
1548*4882a593Smuzhiyun 	/* retrieve response parameters */
1549*4882a593Smuzhiyun 	rsp_params = (struct dpni_rsp_get_statistics *)cmd.params;
1550*4882a593Smuzhiyun 	for (i = 0; i < DPNI_STATISTICS_CNT; i++)
1551*4882a593Smuzhiyun 		stat->raw.counter[i] = le64_to_cpu(rsp_params->counter[i]);
1552*4882a593Smuzhiyun 
1553*4882a593Smuzhiyun 	return 0;
1554*4882a593Smuzhiyun }
1555*4882a593Smuzhiyun 
1556*4882a593Smuzhiyun /**
1557*4882a593Smuzhiyun  * dpni_set_taildrop() - Set taildrop per queue or TC
1558*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
1559*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1560*4882a593Smuzhiyun  * @token:	Token of DPNI object
1561*4882a593Smuzhiyun  * @cg_point:	Congestion point
1562*4882a593Smuzhiyun  * @qtype:	Queue type on which the taildrop is configured.
1563*4882a593Smuzhiyun  *		Only Rx queues are supported for now
1564*4882a593Smuzhiyun  * @tc:		Traffic class to apply this taildrop to
1565*4882a593Smuzhiyun  * @index:	Index of the queue if the DPNI supports multiple queues for
1566*4882a593Smuzhiyun  *		traffic distribution. Ignored if CONGESTION_POINT is not 0.
1567*4882a593Smuzhiyun  * @taildrop:	Taildrop structure
1568*4882a593Smuzhiyun  *
1569*4882a593Smuzhiyun  * Return:	'0' on Success; Error code otherwise.
1570*4882a593Smuzhiyun  */
dpni_set_taildrop(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,enum dpni_congestion_point cg_point,enum dpni_queue_type qtype,u8 tc,u8 index,struct dpni_taildrop * taildrop)1571*4882a593Smuzhiyun int dpni_set_taildrop(struct fsl_mc_io *mc_io,
1572*4882a593Smuzhiyun 		      u32 cmd_flags,
1573*4882a593Smuzhiyun 		      u16 token,
1574*4882a593Smuzhiyun 		      enum dpni_congestion_point cg_point,
1575*4882a593Smuzhiyun 		      enum dpni_queue_type qtype,
1576*4882a593Smuzhiyun 		      u8 tc,
1577*4882a593Smuzhiyun 		      u8 index,
1578*4882a593Smuzhiyun 		      struct dpni_taildrop *taildrop)
1579*4882a593Smuzhiyun {
1580*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
1581*4882a593Smuzhiyun 	struct dpni_cmd_set_taildrop *cmd_params;
1582*4882a593Smuzhiyun 
1583*4882a593Smuzhiyun 	/* prepare command */
1584*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_TAILDROP,
1585*4882a593Smuzhiyun 					  cmd_flags,
1586*4882a593Smuzhiyun 					  token);
1587*4882a593Smuzhiyun 	cmd_params = (struct dpni_cmd_set_taildrop *)cmd.params;
1588*4882a593Smuzhiyun 	cmd_params->congestion_point = cg_point;
1589*4882a593Smuzhiyun 	cmd_params->qtype = qtype;
1590*4882a593Smuzhiyun 	cmd_params->tc = tc;
1591*4882a593Smuzhiyun 	cmd_params->index = index;
1592*4882a593Smuzhiyun 	dpni_set_field(cmd_params->enable, ENABLE, taildrop->enable);
1593*4882a593Smuzhiyun 	cmd_params->units = taildrop->units;
1594*4882a593Smuzhiyun 	cmd_params->threshold = cpu_to_le32(taildrop->threshold);
1595*4882a593Smuzhiyun 
1596*4882a593Smuzhiyun 	/* send command to mc */
1597*4882a593Smuzhiyun 	return mc_send_command(mc_io, &cmd);
1598*4882a593Smuzhiyun }
1599*4882a593Smuzhiyun 
1600*4882a593Smuzhiyun /**
1601*4882a593Smuzhiyun  * dpni_get_taildrop() - Get taildrop information
1602*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
1603*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1604*4882a593Smuzhiyun  * @token:	Token of DPNI object
1605*4882a593Smuzhiyun  * @cg_point:	Congestion point
1606*4882a593Smuzhiyun  * @qtype:	Queue type on which the taildrop is configured.
1607*4882a593Smuzhiyun  *		Only Rx queues are supported for now
1608*4882a593Smuzhiyun  * @tc:		Traffic class to apply this taildrop to
1609*4882a593Smuzhiyun  * @index:	Index of the queue if the DPNI supports multiple queues for
1610*4882a593Smuzhiyun  *		traffic distribution. Ignored if CONGESTION_POINT is not 0.
1611*4882a593Smuzhiyun  * @taildrop:	Taildrop structure
1612*4882a593Smuzhiyun  *
1613*4882a593Smuzhiyun  * Return:	'0' on Success; Error code otherwise.
1614*4882a593Smuzhiyun  */
dpni_get_taildrop(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,enum dpni_congestion_point cg_point,enum dpni_queue_type qtype,u8 tc,u8 index,struct dpni_taildrop * taildrop)1615*4882a593Smuzhiyun int dpni_get_taildrop(struct fsl_mc_io *mc_io,
1616*4882a593Smuzhiyun 		      u32 cmd_flags,
1617*4882a593Smuzhiyun 		      u16 token,
1618*4882a593Smuzhiyun 		      enum dpni_congestion_point cg_point,
1619*4882a593Smuzhiyun 		      enum dpni_queue_type qtype,
1620*4882a593Smuzhiyun 		      u8 tc,
1621*4882a593Smuzhiyun 		      u8 index,
1622*4882a593Smuzhiyun 		      struct dpni_taildrop *taildrop)
1623*4882a593Smuzhiyun {
1624*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
1625*4882a593Smuzhiyun 	struct dpni_cmd_get_taildrop *cmd_params;
1626*4882a593Smuzhiyun 	struct dpni_rsp_get_taildrop *rsp_params;
1627*4882a593Smuzhiyun 	int err;
1628*4882a593Smuzhiyun 
1629*4882a593Smuzhiyun 	/* prepare command */
1630*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_TAILDROP,
1631*4882a593Smuzhiyun 					  cmd_flags,
1632*4882a593Smuzhiyun 					  token);
1633*4882a593Smuzhiyun 	cmd_params = (struct dpni_cmd_get_taildrop *)cmd.params;
1634*4882a593Smuzhiyun 	cmd_params->congestion_point = cg_point;
1635*4882a593Smuzhiyun 	cmd_params->qtype = qtype;
1636*4882a593Smuzhiyun 	cmd_params->tc = tc;
1637*4882a593Smuzhiyun 	cmd_params->index = index;
1638*4882a593Smuzhiyun 
1639*4882a593Smuzhiyun 	/* send command to mc */
1640*4882a593Smuzhiyun 	err = mc_send_command(mc_io, &cmd);
1641*4882a593Smuzhiyun 	if (err)
1642*4882a593Smuzhiyun 		return err;
1643*4882a593Smuzhiyun 
1644*4882a593Smuzhiyun 	/* retrieve response parameters */
1645*4882a593Smuzhiyun 	rsp_params = (struct dpni_rsp_get_taildrop *)cmd.params;
1646*4882a593Smuzhiyun 	taildrop->enable = dpni_get_field(rsp_params->enable, ENABLE);
1647*4882a593Smuzhiyun 	taildrop->units = rsp_params->units;
1648*4882a593Smuzhiyun 	taildrop->threshold = le32_to_cpu(rsp_params->threshold);
1649*4882a593Smuzhiyun 
1650*4882a593Smuzhiyun 	return 0;
1651*4882a593Smuzhiyun }
1652*4882a593Smuzhiyun 
1653*4882a593Smuzhiyun /**
1654*4882a593Smuzhiyun  * dpni_get_api_version() - Get Data Path Network Interface API version
1655*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
1656*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1657*4882a593Smuzhiyun  * @major_ver:	Major version of data path network interface API
1658*4882a593Smuzhiyun  * @minor_ver:	Minor version of data path network interface API
1659*4882a593Smuzhiyun  *
1660*4882a593Smuzhiyun  * Return:	'0' on Success; Error code otherwise.
1661*4882a593Smuzhiyun  */
dpni_get_api_version(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 * major_ver,u16 * minor_ver)1662*4882a593Smuzhiyun int dpni_get_api_version(struct fsl_mc_io *mc_io,
1663*4882a593Smuzhiyun 			 u32 cmd_flags,
1664*4882a593Smuzhiyun 			 u16 *major_ver,
1665*4882a593Smuzhiyun 			 u16 *minor_ver)
1666*4882a593Smuzhiyun {
1667*4882a593Smuzhiyun 	struct dpni_rsp_get_api_version *rsp_params;
1668*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
1669*4882a593Smuzhiyun 	int err;
1670*4882a593Smuzhiyun 
1671*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_API_VERSION,
1672*4882a593Smuzhiyun 					  cmd_flags, 0);
1673*4882a593Smuzhiyun 
1674*4882a593Smuzhiyun 	err = mc_send_command(mc_io, &cmd);
1675*4882a593Smuzhiyun 	if (err)
1676*4882a593Smuzhiyun 		return err;
1677*4882a593Smuzhiyun 
1678*4882a593Smuzhiyun 	rsp_params = (struct dpni_rsp_get_api_version *)cmd.params;
1679*4882a593Smuzhiyun 	*major_ver = le16_to_cpu(rsp_params->major);
1680*4882a593Smuzhiyun 	*minor_ver = le16_to_cpu(rsp_params->minor);
1681*4882a593Smuzhiyun 
1682*4882a593Smuzhiyun 	return 0;
1683*4882a593Smuzhiyun }
1684*4882a593Smuzhiyun 
1685*4882a593Smuzhiyun /**
1686*4882a593Smuzhiyun  * dpni_set_rx_fs_dist() - Set Rx flow steering distribution
1687*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
1688*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1689*4882a593Smuzhiyun  * @token:	Token of DPNI object
1690*4882a593Smuzhiyun  * @cfg: Distribution configuration
1691*4882a593Smuzhiyun  *
1692*4882a593Smuzhiyun  * If the FS is already enabled with a previous call the classification
1693*4882a593Smuzhiyun  * key will be changed but all the table rules are kept. If the
1694*4882a593Smuzhiyun  * existing rules do not match the key the results will not be
1695*4882a593Smuzhiyun  * predictable. It is the user responsibility to keep key integrity.
1696*4882a593Smuzhiyun  * If cfg.enable is set to 1 the command will create a flow steering table
1697*4882a593Smuzhiyun  * and will classify packets according to this table. The packets that
1698*4882a593Smuzhiyun  * miss all the table rules will be classified according to settings
1699*4882a593Smuzhiyun  * made in dpni_set_rx_hash_dist()
1700*4882a593Smuzhiyun  * If cfg.enable is set to 0 the command will clear flow steering table.
1701*4882a593Smuzhiyun  * The packets will be classified according to settings made in
1702*4882a593Smuzhiyun  * dpni_set_rx_hash_dist()
1703*4882a593Smuzhiyun  */
dpni_set_rx_fs_dist(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,const struct dpni_rx_dist_cfg * cfg)1704*4882a593Smuzhiyun int dpni_set_rx_fs_dist(struct fsl_mc_io *mc_io,
1705*4882a593Smuzhiyun 			u32 cmd_flags,
1706*4882a593Smuzhiyun 			u16 token,
1707*4882a593Smuzhiyun 			const struct dpni_rx_dist_cfg *cfg)
1708*4882a593Smuzhiyun {
1709*4882a593Smuzhiyun 	struct dpni_cmd_set_rx_fs_dist *cmd_params;
1710*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
1711*4882a593Smuzhiyun 
1712*4882a593Smuzhiyun 	/* prepare command */
1713*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_RX_FS_DIST,
1714*4882a593Smuzhiyun 					  cmd_flags,
1715*4882a593Smuzhiyun 					  token);
1716*4882a593Smuzhiyun 	cmd_params = (struct dpni_cmd_set_rx_fs_dist *)cmd.params;
1717*4882a593Smuzhiyun 	cmd_params->dist_size = cpu_to_le16(cfg->dist_size);
1718*4882a593Smuzhiyun 	dpni_set_field(cmd_params->enable, RX_FS_DIST_ENABLE, cfg->enable);
1719*4882a593Smuzhiyun 	cmd_params->tc = cfg->tc;
1720*4882a593Smuzhiyun 	cmd_params->miss_flow_id = cpu_to_le16(cfg->fs_miss_flow_id);
1721*4882a593Smuzhiyun 	cmd_params->key_cfg_iova = cpu_to_le64(cfg->key_cfg_iova);
1722*4882a593Smuzhiyun 
1723*4882a593Smuzhiyun 	/* send command to mc*/
1724*4882a593Smuzhiyun 	return mc_send_command(mc_io, &cmd);
1725*4882a593Smuzhiyun }
1726*4882a593Smuzhiyun 
1727*4882a593Smuzhiyun /**
1728*4882a593Smuzhiyun  * dpni_set_rx_hash_dist() - Set Rx hash distribution
1729*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
1730*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1731*4882a593Smuzhiyun  * @token:	Token of DPNI object
1732*4882a593Smuzhiyun  * @cfg: Distribution configuration
1733*4882a593Smuzhiyun  * If cfg.enable is set to 1 the packets will be classified using a hash
1734*4882a593Smuzhiyun  * function based on the key received in cfg.key_cfg_iova parameter.
1735*4882a593Smuzhiyun  * If cfg.enable is set to 0 the packets will be sent to the default queue
1736*4882a593Smuzhiyun  */
dpni_set_rx_hash_dist(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,const struct dpni_rx_dist_cfg * cfg)1737*4882a593Smuzhiyun int dpni_set_rx_hash_dist(struct fsl_mc_io *mc_io,
1738*4882a593Smuzhiyun 			  u32 cmd_flags,
1739*4882a593Smuzhiyun 			  u16 token,
1740*4882a593Smuzhiyun 			  const struct dpni_rx_dist_cfg *cfg)
1741*4882a593Smuzhiyun {
1742*4882a593Smuzhiyun 	struct dpni_cmd_set_rx_hash_dist *cmd_params;
1743*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
1744*4882a593Smuzhiyun 
1745*4882a593Smuzhiyun 	/* prepare command */
1746*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_RX_HASH_DIST,
1747*4882a593Smuzhiyun 					  cmd_flags,
1748*4882a593Smuzhiyun 					  token);
1749*4882a593Smuzhiyun 	cmd_params = (struct dpni_cmd_set_rx_hash_dist *)cmd.params;
1750*4882a593Smuzhiyun 	cmd_params->dist_size = cpu_to_le16(cfg->dist_size);
1751*4882a593Smuzhiyun 	dpni_set_field(cmd_params->enable, RX_HASH_DIST_ENABLE, cfg->enable);
1752*4882a593Smuzhiyun 	cmd_params->tc = cfg->tc;
1753*4882a593Smuzhiyun 	cmd_params->key_cfg_iova = cpu_to_le64(cfg->key_cfg_iova);
1754*4882a593Smuzhiyun 
1755*4882a593Smuzhiyun 	/* send command to mc*/
1756*4882a593Smuzhiyun 	return mc_send_command(mc_io, &cmd);
1757*4882a593Smuzhiyun }
1758*4882a593Smuzhiyun 
1759*4882a593Smuzhiyun /**
1760*4882a593Smuzhiyun  * dpni_add_fs_entry() - Add Flow Steering entry for a specific traffic class
1761*4882a593Smuzhiyun  *			(to select a flow ID)
1762*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
1763*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1764*4882a593Smuzhiyun  * @token:	Token of DPNI object
1765*4882a593Smuzhiyun  * @tc_id:	Traffic class selection (0-7)
1766*4882a593Smuzhiyun  * @index:	Location in the FS table where to insert the entry.
1767*4882a593Smuzhiyun  *		Only relevant if MASKING is enabled for FS
1768*4882a593Smuzhiyun  *		classification on this DPNI, it is ignored for exact match.
1769*4882a593Smuzhiyun  * @cfg:	Flow steering rule to add
1770*4882a593Smuzhiyun  * @action:	Action to be taken as result of a classification hit
1771*4882a593Smuzhiyun  *
1772*4882a593Smuzhiyun  * Return:	'0' on Success; Error code otherwise.
1773*4882a593Smuzhiyun  */
dpni_add_fs_entry(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,u8 tc_id,u16 index,const struct dpni_rule_cfg * cfg,const struct dpni_fs_action_cfg * action)1774*4882a593Smuzhiyun int dpni_add_fs_entry(struct fsl_mc_io *mc_io,
1775*4882a593Smuzhiyun 		      u32 cmd_flags,
1776*4882a593Smuzhiyun 		      u16 token,
1777*4882a593Smuzhiyun 		      u8 tc_id,
1778*4882a593Smuzhiyun 		      u16 index,
1779*4882a593Smuzhiyun 		      const struct dpni_rule_cfg *cfg,
1780*4882a593Smuzhiyun 		      const struct dpni_fs_action_cfg *action)
1781*4882a593Smuzhiyun {
1782*4882a593Smuzhiyun 	struct dpni_cmd_add_fs_entry *cmd_params;
1783*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
1784*4882a593Smuzhiyun 
1785*4882a593Smuzhiyun 	/* prepare command */
1786*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_ADD_FS_ENT,
1787*4882a593Smuzhiyun 					  cmd_flags,
1788*4882a593Smuzhiyun 					  token);
1789*4882a593Smuzhiyun 	cmd_params = (struct dpni_cmd_add_fs_entry *)cmd.params;
1790*4882a593Smuzhiyun 	cmd_params->tc_id = tc_id;
1791*4882a593Smuzhiyun 	cmd_params->key_size = cfg->key_size;
1792*4882a593Smuzhiyun 	cmd_params->index = cpu_to_le16(index);
1793*4882a593Smuzhiyun 	cmd_params->key_iova = cpu_to_le64(cfg->key_iova);
1794*4882a593Smuzhiyun 	cmd_params->mask_iova = cpu_to_le64(cfg->mask_iova);
1795*4882a593Smuzhiyun 	cmd_params->options = cpu_to_le16(action->options);
1796*4882a593Smuzhiyun 	cmd_params->flow_id = cpu_to_le16(action->flow_id);
1797*4882a593Smuzhiyun 	cmd_params->flc = cpu_to_le64(action->flc);
1798*4882a593Smuzhiyun 
1799*4882a593Smuzhiyun 	/* send command to mc*/
1800*4882a593Smuzhiyun 	return mc_send_command(mc_io, &cmd);
1801*4882a593Smuzhiyun }
1802*4882a593Smuzhiyun 
1803*4882a593Smuzhiyun /**
1804*4882a593Smuzhiyun  * dpni_remove_fs_entry() - Remove Flow Steering entry from a specific
1805*4882a593Smuzhiyun  *			    traffic class
1806*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
1807*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1808*4882a593Smuzhiyun  * @token:	Token of DPNI object
1809*4882a593Smuzhiyun  * @tc_id:	Traffic class selection (0-7)
1810*4882a593Smuzhiyun  * @cfg:	Flow steering rule to remove
1811*4882a593Smuzhiyun  *
1812*4882a593Smuzhiyun  * Return:	'0' on Success; Error code otherwise.
1813*4882a593Smuzhiyun  */
dpni_remove_fs_entry(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,u8 tc_id,const struct dpni_rule_cfg * cfg)1814*4882a593Smuzhiyun int dpni_remove_fs_entry(struct fsl_mc_io *mc_io,
1815*4882a593Smuzhiyun 			 u32 cmd_flags,
1816*4882a593Smuzhiyun 			 u16 token,
1817*4882a593Smuzhiyun 			 u8 tc_id,
1818*4882a593Smuzhiyun 			 const struct dpni_rule_cfg *cfg)
1819*4882a593Smuzhiyun {
1820*4882a593Smuzhiyun 	struct dpni_cmd_remove_fs_entry *cmd_params;
1821*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
1822*4882a593Smuzhiyun 
1823*4882a593Smuzhiyun 	/* prepare command */
1824*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_REMOVE_FS_ENT,
1825*4882a593Smuzhiyun 					  cmd_flags,
1826*4882a593Smuzhiyun 					  token);
1827*4882a593Smuzhiyun 	cmd_params = (struct dpni_cmd_remove_fs_entry *)cmd.params;
1828*4882a593Smuzhiyun 	cmd_params->tc_id = tc_id;
1829*4882a593Smuzhiyun 	cmd_params->key_size = cfg->key_size;
1830*4882a593Smuzhiyun 	cmd_params->key_iova = cpu_to_le64(cfg->key_iova);
1831*4882a593Smuzhiyun 	cmd_params->mask_iova = cpu_to_le64(cfg->mask_iova);
1832*4882a593Smuzhiyun 
1833*4882a593Smuzhiyun 	/* send command to mc*/
1834*4882a593Smuzhiyun 	return mc_send_command(mc_io, &cmd);
1835*4882a593Smuzhiyun }
1836*4882a593Smuzhiyun 
1837*4882a593Smuzhiyun /**
1838*4882a593Smuzhiyun  * dpni_set_qos_table() - Set QoS mapping table
1839*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
1840*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1841*4882a593Smuzhiyun  * @token:	Token of DPNI object
1842*4882a593Smuzhiyun  * @cfg:	QoS table configuration
1843*4882a593Smuzhiyun  *
1844*4882a593Smuzhiyun  * This function and all QoS-related functions require that
1845*4882a593Smuzhiyun  *'max_tcs > 1' was set at DPNI creation.
1846*4882a593Smuzhiyun  *
1847*4882a593Smuzhiyun  * warning: Before calling this function, call dpkg_prepare_key_cfg() to
1848*4882a593Smuzhiyun  *			prepare the key_cfg_iova parameter
1849*4882a593Smuzhiyun  *
1850*4882a593Smuzhiyun  * Return:	'0' on Success; Error code otherwise.
1851*4882a593Smuzhiyun  */
dpni_set_qos_table(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,const struct dpni_qos_tbl_cfg * cfg)1852*4882a593Smuzhiyun int dpni_set_qos_table(struct fsl_mc_io *mc_io,
1853*4882a593Smuzhiyun 		       u32 cmd_flags,
1854*4882a593Smuzhiyun 		       u16 token,
1855*4882a593Smuzhiyun 		       const struct dpni_qos_tbl_cfg *cfg)
1856*4882a593Smuzhiyun {
1857*4882a593Smuzhiyun 	struct dpni_cmd_set_qos_table *cmd_params;
1858*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
1859*4882a593Smuzhiyun 
1860*4882a593Smuzhiyun 	/* prepare command */
1861*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_QOS_TBL,
1862*4882a593Smuzhiyun 					  cmd_flags,
1863*4882a593Smuzhiyun 					  token);
1864*4882a593Smuzhiyun 	cmd_params = (struct dpni_cmd_set_qos_table *)cmd.params;
1865*4882a593Smuzhiyun 	cmd_params->default_tc = cfg->default_tc;
1866*4882a593Smuzhiyun 	cmd_params->key_cfg_iova = cpu_to_le64(cfg->key_cfg_iova);
1867*4882a593Smuzhiyun 	dpni_set_field(cmd_params->discard_on_miss, DISCARD_ON_MISS,
1868*4882a593Smuzhiyun 		       cfg->discard_on_miss);
1869*4882a593Smuzhiyun 
1870*4882a593Smuzhiyun 	/* send command to mc*/
1871*4882a593Smuzhiyun 	return mc_send_command(mc_io, &cmd);
1872*4882a593Smuzhiyun }
1873*4882a593Smuzhiyun 
1874*4882a593Smuzhiyun /**
1875*4882a593Smuzhiyun  * dpni_add_qos_entry() - Add QoS mapping entry (to select a traffic class)
1876*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
1877*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1878*4882a593Smuzhiyun  * @token:	Token of DPNI object
1879*4882a593Smuzhiyun  * @cfg:	QoS rule to add
1880*4882a593Smuzhiyun  * @tc_id:	Traffic class selection (0-7)
1881*4882a593Smuzhiyun  * @index:	Location in the QoS table where to insert the entry.
1882*4882a593Smuzhiyun  *		Only relevant if MASKING is enabled for QoS classification on
1883*4882a593Smuzhiyun  *		this DPNI, it is ignored for exact match.
1884*4882a593Smuzhiyun  *
1885*4882a593Smuzhiyun  * Return:	'0' on Success; Error code otherwise.
1886*4882a593Smuzhiyun  */
dpni_add_qos_entry(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,const struct dpni_rule_cfg * cfg,u8 tc_id,u16 index)1887*4882a593Smuzhiyun int dpni_add_qos_entry(struct fsl_mc_io *mc_io,
1888*4882a593Smuzhiyun 		       u32 cmd_flags,
1889*4882a593Smuzhiyun 		       u16 token,
1890*4882a593Smuzhiyun 		       const struct dpni_rule_cfg *cfg,
1891*4882a593Smuzhiyun 		       u8 tc_id,
1892*4882a593Smuzhiyun 		       u16 index)
1893*4882a593Smuzhiyun {
1894*4882a593Smuzhiyun 	struct dpni_cmd_add_qos_entry *cmd_params;
1895*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
1896*4882a593Smuzhiyun 
1897*4882a593Smuzhiyun 	/* prepare command */
1898*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_ADD_QOS_ENT,
1899*4882a593Smuzhiyun 					  cmd_flags,
1900*4882a593Smuzhiyun 					  token);
1901*4882a593Smuzhiyun 	cmd_params = (struct dpni_cmd_add_qos_entry *)cmd.params;
1902*4882a593Smuzhiyun 	cmd_params->tc_id = tc_id;
1903*4882a593Smuzhiyun 	cmd_params->key_size = cfg->key_size;
1904*4882a593Smuzhiyun 	cmd_params->index = cpu_to_le16(index);
1905*4882a593Smuzhiyun 	cmd_params->key_iova = cpu_to_le64(cfg->key_iova);
1906*4882a593Smuzhiyun 	cmd_params->mask_iova = cpu_to_le64(cfg->mask_iova);
1907*4882a593Smuzhiyun 
1908*4882a593Smuzhiyun 	/* send command to mc*/
1909*4882a593Smuzhiyun 	return mc_send_command(mc_io, &cmd);
1910*4882a593Smuzhiyun }
1911*4882a593Smuzhiyun 
1912*4882a593Smuzhiyun /**
1913*4882a593Smuzhiyun  * dpni_remove_qos_entry() - Remove QoS mapping entry
1914*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
1915*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1916*4882a593Smuzhiyun  * @token:	Token of DPNI object
1917*4882a593Smuzhiyun  * @cfg:	QoS rule to remove
1918*4882a593Smuzhiyun  *
1919*4882a593Smuzhiyun  * Return:	'0' on Success; Error code otherwise.
1920*4882a593Smuzhiyun  */
dpni_remove_qos_entry(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,const struct dpni_rule_cfg * cfg)1921*4882a593Smuzhiyun int dpni_remove_qos_entry(struct fsl_mc_io *mc_io,
1922*4882a593Smuzhiyun 			  u32 cmd_flags,
1923*4882a593Smuzhiyun 			  u16 token,
1924*4882a593Smuzhiyun 			  const struct dpni_rule_cfg *cfg)
1925*4882a593Smuzhiyun {
1926*4882a593Smuzhiyun 	struct dpni_cmd_remove_qos_entry *cmd_params;
1927*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
1928*4882a593Smuzhiyun 
1929*4882a593Smuzhiyun 	/* prepare command */
1930*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_REMOVE_QOS_ENT,
1931*4882a593Smuzhiyun 					  cmd_flags,
1932*4882a593Smuzhiyun 					  token);
1933*4882a593Smuzhiyun 	cmd_params = (struct dpni_cmd_remove_qos_entry *)cmd.params;
1934*4882a593Smuzhiyun 	cmd_params->key_size = cfg->key_size;
1935*4882a593Smuzhiyun 	cmd_params->key_iova = cpu_to_le64(cfg->key_iova);
1936*4882a593Smuzhiyun 	cmd_params->mask_iova = cpu_to_le64(cfg->mask_iova);
1937*4882a593Smuzhiyun 
1938*4882a593Smuzhiyun 	/* send command to mc*/
1939*4882a593Smuzhiyun 	return mc_send_command(mc_io, &cmd);
1940*4882a593Smuzhiyun }
1941*4882a593Smuzhiyun 
1942*4882a593Smuzhiyun /**
1943*4882a593Smuzhiyun  * dpni_clear_qos_table() - Clear all QoS mapping entries
1944*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
1945*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1946*4882a593Smuzhiyun  * @token:	Token of DPNI object
1947*4882a593Smuzhiyun  *
1948*4882a593Smuzhiyun  * Following this function call, all frames are directed to
1949*4882a593Smuzhiyun  * the default traffic class (0)
1950*4882a593Smuzhiyun  *
1951*4882a593Smuzhiyun  * Return:	'0' on Success; Error code otherwise.
1952*4882a593Smuzhiyun  */
dpni_clear_qos_table(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token)1953*4882a593Smuzhiyun int dpni_clear_qos_table(struct fsl_mc_io *mc_io,
1954*4882a593Smuzhiyun 			 u32 cmd_flags,
1955*4882a593Smuzhiyun 			 u16 token)
1956*4882a593Smuzhiyun {
1957*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
1958*4882a593Smuzhiyun 
1959*4882a593Smuzhiyun 	/* prepare command */
1960*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_CLR_QOS_TBL,
1961*4882a593Smuzhiyun 					  cmd_flags,
1962*4882a593Smuzhiyun 					  token);
1963*4882a593Smuzhiyun 
1964*4882a593Smuzhiyun 	/* send command to mc*/
1965*4882a593Smuzhiyun 	return mc_send_command(mc_io, &cmd);
1966*4882a593Smuzhiyun }
1967*4882a593Smuzhiyun 
1968*4882a593Smuzhiyun /**
1969*4882a593Smuzhiyun  * dpni_set_tx_shaping() - Set the transmit shaping
1970*4882a593Smuzhiyun  * @mc_io:		Pointer to MC portal's I/O object
1971*4882a593Smuzhiyun  * @cmd_flags:		Command flags; one or more of 'MC_CMD_FLAG_'
1972*4882a593Smuzhiyun  * @token:		Token of DPNI object
1973*4882a593Smuzhiyun  * @tx_cr_shaper:	TX committed rate shaping configuration
1974*4882a593Smuzhiyun  * @tx_er_shaper:	TX excess rate shaping configuration
1975*4882a593Smuzhiyun  * @coupled:		Committed and excess rate shapers are coupled
1976*4882a593Smuzhiyun  *
1977*4882a593Smuzhiyun  * Return:	'0' on Success; Error code otherwise.
1978*4882a593Smuzhiyun  */
dpni_set_tx_shaping(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,const struct dpni_tx_shaping_cfg * tx_cr_shaper,const struct dpni_tx_shaping_cfg * tx_er_shaper,int coupled)1979*4882a593Smuzhiyun int dpni_set_tx_shaping(struct fsl_mc_io *mc_io,
1980*4882a593Smuzhiyun 			u32 cmd_flags,
1981*4882a593Smuzhiyun 			u16 token,
1982*4882a593Smuzhiyun 			const struct dpni_tx_shaping_cfg *tx_cr_shaper,
1983*4882a593Smuzhiyun 			const struct dpni_tx_shaping_cfg *tx_er_shaper,
1984*4882a593Smuzhiyun 			int coupled)
1985*4882a593Smuzhiyun {
1986*4882a593Smuzhiyun 	struct dpni_cmd_set_tx_shaping *cmd_params;
1987*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
1988*4882a593Smuzhiyun 
1989*4882a593Smuzhiyun 	/* prepare command */
1990*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_TX_SHAPING,
1991*4882a593Smuzhiyun 					  cmd_flags,
1992*4882a593Smuzhiyun 					  token);
1993*4882a593Smuzhiyun 	cmd_params = (struct dpni_cmd_set_tx_shaping *)cmd.params;
1994*4882a593Smuzhiyun 	cmd_params->tx_cr_max_burst_size = cpu_to_le16(tx_cr_shaper->max_burst_size);
1995*4882a593Smuzhiyun 	cmd_params->tx_er_max_burst_size = cpu_to_le16(tx_er_shaper->max_burst_size);
1996*4882a593Smuzhiyun 	cmd_params->tx_cr_rate_limit = cpu_to_le32(tx_cr_shaper->rate_limit);
1997*4882a593Smuzhiyun 	cmd_params->tx_er_rate_limit = cpu_to_le32(tx_er_shaper->rate_limit);
1998*4882a593Smuzhiyun 	dpni_set_field(cmd_params->coupled, COUPLED, coupled);
1999*4882a593Smuzhiyun 
2000*4882a593Smuzhiyun 	/* send command to mc*/
2001*4882a593Smuzhiyun 	return mc_send_command(mc_io, &cmd);
2002*4882a593Smuzhiyun }
2003*4882a593Smuzhiyun 
2004*4882a593Smuzhiyun /**
2005*4882a593Smuzhiyun  * dpni_get_single_step_cfg() - return current configuration for
2006*4882a593Smuzhiyun  *                              single step PTP
2007*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
2008*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
2009*4882a593Smuzhiyun  * @token:	Token of DPNI object
2010*4882a593Smuzhiyun  * @ptp_cfg:	ptp single step configuration
2011*4882a593Smuzhiyun  *
2012*4882a593Smuzhiyun  * Return:	'0' on Success; Error code otherwise.
2013*4882a593Smuzhiyun  *
2014*4882a593Smuzhiyun  */
dpni_get_single_step_cfg(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,struct dpni_single_step_cfg * ptp_cfg)2015*4882a593Smuzhiyun int dpni_get_single_step_cfg(struct fsl_mc_io *mc_io,
2016*4882a593Smuzhiyun 			     u32 cmd_flags,
2017*4882a593Smuzhiyun 			     u16 token,
2018*4882a593Smuzhiyun 			     struct dpni_single_step_cfg *ptp_cfg)
2019*4882a593Smuzhiyun {
2020*4882a593Smuzhiyun 	struct dpni_rsp_single_step_cfg *rsp_params;
2021*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
2022*4882a593Smuzhiyun 	int err;
2023*4882a593Smuzhiyun 
2024*4882a593Smuzhiyun 	/* prepare command */
2025*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_SINGLE_STEP_CFG,
2026*4882a593Smuzhiyun 					  cmd_flags, token);
2027*4882a593Smuzhiyun 	/* send command to mc*/
2028*4882a593Smuzhiyun 	err =  mc_send_command(mc_io, &cmd);
2029*4882a593Smuzhiyun 	if (err)
2030*4882a593Smuzhiyun 		return err;
2031*4882a593Smuzhiyun 
2032*4882a593Smuzhiyun 	/* read command response */
2033*4882a593Smuzhiyun 	rsp_params = (struct dpni_rsp_single_step_cfg *)cmd.params;
2034*4882a593Smuzhiyun 	ptp_cfg->offset = le16_to_cpu(rsp_params->offset);
2035*4882a593Smuzhiyun 	ptp_cfg->en = dpni_get_field(le16_to_cpu(rsp_params->flags),
2036*4882a593Smuzhiyun 				     PTP_ENABLE) ? 1 : 0;
2037*4882a593Smuzhiyun 	ptp_cfg->ch_update = dpni_get_field(le16_to_cpu(rsp_params->flags),
2038*4882a593Smuzhiyun 					    PTP_CH_UPDATE) ? 1 : 0;
2039*4882a593Smuzhiyun 	ptp_cfg->peer_delay = le32_to_cpu(rsp_params->peer_delay);
2040*4882a593Smuzhiyun 
2041*4882a593Smuzhiyun 	return err;
2042*4882a593Smuzhiyun }
2043*4882a593Smuzhiyun 
2044*4882a593Smuzhiyun /**
2045*4882a593Smuzhiyun  * dpni_set_single_step_cfg() - enable/disable and configure single step PTP
2046*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
2047*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
2048*4882a593Smuzhiyun  * @token:	Token of DPNI object
2049*4882a593Smuzhiyun  * @ptp_cfg:	ptp single step configuration
2050*4882a593Smuzhiyun  *
2051*4882a593Smuzhiyun  * Return:	'0' on Success; Error code otherwise.
2052*4882a593Smuzhiyun  *
2053*4882a593Smuzhiyun  * The function has effect only when dpni object is connected to a dpmac
2054*4882a593Smuzhiyun  * object. If the dpni is not connected to a dpmac the configuration will
2055*4882a593Smuzhiyun  * be stored inside and applied when connection is made.
2056*4882a593Smuzhiyun  */
dpni_set_single_step_cfg(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,struct dpni_single_step_cfg * ptp_cfg)2057*4882a593Smuzhiyun int dpni_set_single_step_cfg(struct fsl_mc_io *mc_io,
2058*4882a593Smuzhiyun 			     u32 cmd_flags,
2059*4882a593Smuzhiyun 			     u16 token,
2060*4882a593Smuzhiyun 			     struct dpni_single_step_cfg *ptp_cfg)
2061*4882a593Smuzhiyun {
2062*4882a593Smuzhiyun 	struct dpni_cmd_single_step_cfg *cmd_params;
2063*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
2064*4882a593Smuzhiyun 	u16 flags;
2065*4882a593Smuzhiyun 
2066*4882a593Smuzhiyun 	/* prepare command */
2067*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_SINGLE_STEP_CFG,
2068*4882a593Smuzhiyun 					  cmd_flags, token);
2069*4882a593Smuzhiyun 	cmd_params = (struct dpni_cmd_single_step_cfg *)cmd.params;
2070*4882a593Smuzhiyun 	cmd_params->offset = cpu_to_le16(ptp_cfg->offset);
2071*4882a593Smuzhiyun 	cmd_params->peer_delay = cpu_to_le32(ptp_cfg->peer_delay);
2072*4882a593Smuzhiyun 
2073*4882a593Smuzhiyun 	flags = le16_to_cpu(cmd_params->flags);
2074*4882a593Smuzhiyun 	dpni_set_field(flags, PTP_ENABLE, !!ptp_cfg->en);
2075*4882a593Smuzhiyun 	dpni_set_field(flags, PTP_CH_UPDATE, !!ptp_cfg->ch_update);
2076*4882a593Smuzhiyun 	cmd_params->flags = cpu_to_le16(flags);
2077*4882a593Smuzhiyun 
2078*4882a593Smuzhiyun 	/* send command to mc*/
2079*4882a593Smuzhiyun 	return mc_send_command(mc_io, &cmd);
2080*4882a593Smuzhiyun }
2081