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