staging: fsl-dpaa2/eth: Add APIs for DPNI objects
authorIoana Radulescu <ruxandra.radulescu@nxp.com>
Fri, 28 Apr 2017 09:50:28 +0000 (04:50 -0500)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 28 Apr 2017 12:25:17 +0000 (14:25 +0200)
Add the command build/parse APIs for operating on DPNI objects through
the DPAA2 Management Complex.

Signed-off-by: Ioana Radulescu <ruxandra.radulescu@nxp.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/Kconfig
drivers/staging/Makefile
drivers/staging/fsl-dpaa2/Kconfig [new file with mode: 0644]
drivers/staging/fsl-dpaa2/Makefile [new file with mode: 0644]
drivers/staging/fsl-dpaa2/ethernet/Makefile [new file with mode: 0644]
drivers/staging/fsl-dpaa2/ethernet/dpkg.h [new file with mode: 0644]
drivers/staging/fsl-dpaa2/ethernet/dpni-cmd.h [new file with mode: 0644]
drivers/staging/fsl-dpaa2/ethernet/dpni.c [new file with mode: 0644]
drivers/staging/fsl-dpaa2/ethernet/dpni.h [new file with mode: 0644]
drivers/staging/fsl-dpaa2/ethernet/net.h [new file with mode: 0644]

index 43838cc224e93913cf3e1656854dba3368aa2a6a..74ec7ca0cd3b777472589a13dd371294502e1907 100644 (file)
@@ -94,6 +94,8 @@ source "drivers/staging/fbtft/Kconfig"
 
 source "drivers/staging/fsl-mc/Kconfig"
 
+source "drivers/staging/fsl-dpaa2/Kconfig"
+
 source "drivers/staging/wilc1000/Kconfig"
 
 source "drivers/staging/most/Kconfig"
index 1bfbc07e6624a2eabac0aef31c9172c93575cd66..422fae4ea0f3d1e2e859f3edef977c7f21c89e8b 100644 (file)
@@ -36,6 +36,7 @@ obj-$(CONFIG_UNISYSSPAR)      += unisys/
 obj-$(CONFIG_COMMON_CLK_XLNX_CLKWZRD)  += clocking-wizard/
 obj-$(CONFIG_FB_TFT)           += fbtft/
 obj-$(CONFIG_FSL_MC_BUS)       += fsl-mc/
+obj-$(CONFIG_FSL_DPAA2)                += fsl-dpaa2/
 obj-$(CONFIG_WILC1000)         += wilc1000/
 obj-$(CONFIG_MOST)             += most/
 obj-$(CONFIG_KS7010)           += ks7010/
diff --git a/drivers/staging/fsl-dpaa2/Kconfig b/drivers/staging/fsl-dpaa2/Kconfig
new file mode 100644 (file)
index 0000000..2e325cb
--- /dev/null
@@ -0,0 +1,17 @@
+#
+# Freescale DataPath Acceleration Architecture Gen2 (DPAA2) drivers
+#
+
+config FSL_DPAA2
+       bool "Freescale DPAA2 devices"
+       depends on FSL_MC_BUS
+       ---help---
+         Build drivers for Freescale DataPath Acceleration
+         Architecture (DPAA2) family of SoCs.
+
+config FSL_DPAA2_ETH
+       tristate "Freescale DPAA2 Ethernet"
+       depends on FSL_DPAA2 && FSL_MC_DPIO
+       ---help---
+         Ethernet driver for Freescale DPAA2 SoCs, using the
+         Freescale MC bus driver
diff --git a/drivers/staging/fsl-dpaa2/Makefile b/drivers/staging/fsl-dpaa2/Makefile
new file mode 100644 (file)
index 0000000..0836ba8
--- /dev/null
@@ -0,0 +1,5 @@
+#
+# Freescale DataPath Acceleration Architecture Gen2 (DPAA2) drivers
+#
+
+obj-$(CONFIG_FSL_DPAA2_ETH)    += ethernet/
diff --git a/drivers/staging/fsl-dpaa2/ethernet/Makefile b/drivers/staging/fsl-dpaa2/ethernet/Makefile
new file mode 100644 (file)
index 0000000..83b6264
--- /dev/null
@@ -0,0 +1,7 @@
+#
+# Makefile for the Freescale DPAA2 Ethernet controller
+#
+
+obj-$(CONFIG_FSL_DPAA2_ETH) += fsl-dpaa2-eth.o
+
+fsl-dpaa2-eth-objs    := dpni.o
diff --git a/drivers/staging/fsl-dpaa2/ethernet/dpkg.h b/drivers/staging/fsl-dpaa2/ethernet/dpkg.h
new file mode 100644 (file)
index 0000000..02290a0
--- /dev/null
@@ -0,0 +1,176 @@
+/* Copyright 2013-2015 Freescale Semiconductor Inc.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of the above-listed copyright holders nor the
+ * names of any contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ *
+ * ALTERNATIVELY, this software may be distributed under the terms of the
+ * GNU General Public License ("GPL") as published by the Free Software
+ * Foundation, either version 2 of that License or (at your option) any
+ * later version.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+#ifndef __FSL_DPKG_H_
+#define __FSL_DPKG_H_
+
+#include <linux/types.h>
+#include "net.h"
+
+/* Data Path Key Generator API
+ * Contains initialization APIs and runtime APIs for the Key Generator
+ */
+
+/** Key Generator properties */
+
+/**
+ * Number of masks per key extraction
+ */
+#define DPKG_NUM_OF_MASKS              4
+/**
+ * Number of extractions per key profile
+ */
+#define DPKG_MAX_NUM_OF_EXTRACTS       10
+
+/**
+ * enum dpkg_extract_from_hdr_type - Selecting extraction by header types
+ * @DPKG_FROM_HDR: Extract selected bytes from header, by offset
+ * @DPKG_FROM_FIELD: Extract selected bytes from header, by offset from field
+ * @DPKG_FULL_FIELD: Extract a full field
+ */
+enum dpkg_extract_from_hdr_type {
+       DPKG_FROM_HDR = 0,
+       DPKG_FROM_FIELD = 1,
+       DPKG_FULL_FIELD = 2
+};
+
+/**
+ * enum dpkg_extract_type - Enumeration for selecting extraction type
+ * @DPKG_EXTRACT_FROM_HDR: Extract from the header
+ * @DPKG_EXTRACT_FROM_DATA: Extract from data not in specific header
+ * @DPKG_EXTRACT_FROM_PARSE: Extract from parser-result;
+ *     e.g. can be used to extract header existence;
+ *     please refer to 'Parse Result definition' section in the parser BG
+ */
+enum dpkg_extract_type {
+       DPKG_EXTRACT_FROM_HDR = 0,
+       DPKG_EXTRACT_FROM_DATA = 1,
+       DPKG_EXTRACT_FROM_PARSE = 3
+};
+
+/**
+ * struct dpkg_mask - A structure for defining a single extraction mask
+ * @mask: Byte mask for the extracted content
+ * @offset: Offset within the extracted content
+ */
+struct dpkg_mask {
+       u8 mask;
+       u8 offset;
+};
+
+/**
+ * struct dpkg_extract - A structure for defining a single extraction
+ * @type: Determines how the union below is interpreted:
+ *             DPKG_EXTRACT_FROM_HDR: selects 'from_hdr';
+ *             DPKG_EXTRACT_FROM_DATA: selects 'from_data';
+ *             DPKG_EXTRACT_FROM_PARSE: selects 'from_parse'
+ * @extract: Selects extraction method
+ * @num_of_byte_masks: Defines the number of valid entries in the array below;
+ *             This is also the number of bytes to be used as masks
+ * @masks: Masks parameters
+ */
+struct dpkg_extract {
+       enum dpkg_extract_type type;
+       /**
+        * union extract - Selects extraction method
+        * @from_hdr - Used when 'type = DPKG_EXTRACT_FROM_HDR'
+        * @from_data - Used when 'type = DPKG_EXTRACT_FROM_DATA'
+        * @from_parse - Used when 'type = DPKG_EXTRACT_FROM_PARSE'
+        */
+       union {
+               /**
+                * struct from_hdr - Used when 'type = DPKG_EXTRACT_FROM_HDR'
+                * @prot: Any of the supported headers
+                * @type: Defines the type of header extraction:
+                *      DPKG_FROM_HDR: use size & offset below;
+                *      DPKG_FROM_FIELD: use field, size and offset below;
+                *      DPKG_FULL_FIELD: use field below
+                * @field: One of the supported fields (NH_FLD_)
+                *
+                * @size: Size in bytes
+                * @offset: Byte offset
+                * @hdr_index: Clear for cases not listed below;
+                *      Used for protocols that may have more than a single
+                *      header, 0 indicates an outer header;
+                *      Supported protocols (possible values):
+                *      NET_PROT_VLAN (0, HDR_INDEX_LAST);
+                *      NET_PROT_MPLS (0, 1, HDR_INDEX_LAST);
+                *      NET_PROT_IP(0, HDR_INDEX_LAST);
+                *      NET_PROT_IPv4(0, HDR_INDEX_LAST);
+                *      NET_PROT_IPv6(0, HDR_INDEX_LAST);
+                */
+
+               struct {
+                       enum net_prot                   prot;
+                       enum dpkg_extract_from_hdr_type type;
+                       u32                     field;
+                       u8                      size;
+                       u8                      offset;
+                       u8                      hdr_index;
+               } from_hdr;
+               /**
+                * struct from_data - Used when 'type = DPKG_EXTRACT_FROM_DATA'
+                * @size: Size in bytes
+                * @offset: Byte offset
+                */
+               struct {
+                       u8 size;
+                       u8 offset;
+               } from_data;
+
+               /**
+                * struct from_parse - Used when
+                *                     'type = DPKG_EXTRACT_FROM_PARSE'
+                * @size: Size in bytes
+                * @offset: Byte offset
+                */
+               struct {
+                       u8 size;
+                       u8 offset;
+               } from_parse;
+       } extract;
+
+       u8              num_of_byte_masks;
+       struct dpkg_mask        masks[DPKG_NUM_OF_MASKS];
+};
+
+/**
+ * struct dpkg_profile_cfg - A structure for defining a full Key Generation
+ *                             profile (rule)
+ * @num_extracts: Defines the number of valid entries in the array below
+ * @extracts: Array of required extractions
+ */
+struct dpkg_profile_cfg {
+       u8 num_extracts;
+       struct dpkg_extract extracts[DPKG_MAX_NUM_OF_EXTRACTS];
+};
+
+#endif /* __FSL_DPKG_H_ */
diff --git a/drivers/staging/fsl-dpaa2/ethernet/dpni-cmd.h b/drivers/staging/fsl-dpaa2/ethernet/dpni-cmd.h
new file mode 100644 (file)
index 0000000..57df222
--- /dev/null
@@ -0,0 +1,541 @@
+/* Copyright 2013-2016 Freescale Semiconductor Inc.
+ * Copyright 2016 NXP
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of the above-listed copyright holders nor the
+ * names of any contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ *
+ * ALTERNATIVELY, this software may be distributed under the terms of the
+ * GNU General Public License ("GPL") as published by the Free Software
+ * Foundation, either version 2 of that License or (at your option) any
+ * later version.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+#ifndef _FSL_DPNI_CMD_H
+#define _FSL_DPNI_CMD_H
+
+#include "dpni.h"
+
+/* DPNI Version */
+#define DPNI_VER_MAJOR                         7
+#define DPNI_VER_MINOR                         0
+#define DPNI_CMD_BASE_VERSION                  1
+#define DPNI_CMD_ID_OFFSET                     4
+
+#define DPNI_CMD(id)   (((id) << DPNI_CMD_ID_OFFSET) | DPNI_CMD_BASE_VERSION)
+
+#define DPNI_CMDID_OPEN                                        DPNI_CMD(0x801)
+#define DPNI_CMDID_CLOSE                               DPNI_CMD(0x800)
+#define DPNI_CMDID_CREATE                              DPNI_CMD(0x901)
+#define DPNI_CMDID_DESTROY                             DPNI_CMD(0x900)
+#define DPNI_CMDID_GET_API_VERSION                     DPNI_CMD(0xa01)
+
+#define DPNI_CMDID_ENABLE                              DPNI_CMD(0x002)
+#define DPNI_CMDID_DISABLE                             DPNI_CMD(0x003)
+#define DPNI_CMDID_GET_ATTR                            DPNI_CMD(0x004)
+#define DPNI_CMDID_RESET                               DPNI_CMD(0x005)
+#define DPNI_CMDID_IS_ENABLED                          DPNI_CMD(0x006)
+
+#define DPNI_CMDID_SET_IRQ                             DPNI_CMD(0x010)
+#define DPNI_CMDID_GET_IRQ                             DPNI_CMD(0x011)
+#define DPNI_CMDID_SET_IRQ_ENABLE                      DPNI_CMD(0x012)
+#define DPNI_CMDID_GET_IRQ_ENABLE                      DPNI_CMD(0x013)
+#define DPNI_CMDID_SET_IRQ_MASK                                DPNI_CMD(0x014)
+#define DPNI_CMDID_GET_IRQ_MASK                                DPNI_CMD(0x015)
+#define DPNI_CMDID_GET_IRQ_STATUS                      DPNI_CMD(0x016)
+#define DPNI_CMDID_CLEAR_IRQ_STATUS                    DPNI_CMD(0x017)
+
+#define DPNI_CMDID_SET_POOLS                           DPNI_CMD(0x200)
+#define DPNI_CMDID_SET_ERRORS_BEHAVIOR                 DPNI_CMD(0x20B)
+
+#define DPNI_CMDID_GET_QDID                            DPNI_CMD(0x210)
+#define DPNI_CMDID_GET_TX_DATA_OFFSET                  DPNI_CMD(0x212)
+#define DPNI_CMDID_GET_LINK_STATE                      DPNI_CMD(0x215)
+#define DPNI_CMDID_SET_MAX_FRAME_LENGTH                        DPNI_CMD(0x216)
+#define DPNI_CMDID_GET_MAX_FRAME_LENGTH                        DPNI_CMD(0x217)
+#define DPNI_CMDID_SET_LINK_CFG                                DPNI_CMD(0x21A)
+#define DPNI_CMDID_SET_TX_SHAPING                      DPNI_CMD(0x21B)
+
+#define DPNI_CMDID_SET_MCAST_PROMISC                   DPNI_CMD(0x220)
+#define DPNI_CMDID_GET_MCAST_PROMISC                   DPNI_CMD(0x221)
+#define DPNI_CMDID_SET_UNICAST_PROMISC                 DPNI_CMD(0x222)
+#define DPNI_CMDID_GET_UNICAST_PROMISC                 DPNI_CMD(0x223)
+#define DPNI_CMDID_SET_PRIM_MAC                                DPNI_CMD(0x224)
+#define DPNI_CMDID_GET_PRIM_MAC                                DPNI_CMD(0x225)
+#define DPNI_CMDID_ADD_MAC_ADDR                                DPNI_CMD(0x226)
+#define DPNI_CMDID_REMOVE_MAC_ADDR                     DPNI_CMD(0x227)
+#define DPNI_CMDID_CLR_MAC_FILTERS                     DPNI_CMD(0x228)
+
+#define DPNI_CMDID_SET_RX_TC_DIST                      DPNI_CMD(0x235)
+
+#define DPNI_CMDID_ADD_FS_ENT                          DPNI_CMD(0x244)
+#define DPNI_CMDID_REMOVE_FS_ENT                       DPNI_CMD(0x245)
+#define DPNI_CMDID_CLR_FS_ENT                          DPNI_CMD(0x246)
+
+#define DPNI_CMDID_GET_STATISTICS                      DPNI_CMD(0x25D)
+#define DPNI_CMDID_GET_QUEUE                           DPNI_CMD(0x25F)
+#define DPNI_CMDID_SET_QUEUE                           DPNI_CMD(0x260)
+#define DPNI_CMDID_GET_TAILDROP                                DPNI_CMD(0x261)
+#define DPNI_CMDID_SET_TAILDROP                                DPNI_CMD(0x262)
+
+#define DPNI_CMDID_GET_PORT_MAC_ADDR                   DPNI_CMD(0x263)
+
+#define DPNI_CMDID_GET_BUFFER_LAYOUT                   DPNI_CMD(0x264)
+#define DPNI_CMDID_SET_BUFFER_LAYOUT                   DPNI_CMD(0x265)
+
+#define DPNI_CMDID_SET_TX_CONFIRMATION_MODE            DPNI_CMD(0x266)
+#define DPNI_CMDID_SET_CONGESTION_NOTIFICATION         DPNI_CMD(0x267)
+#define DPNI_CMDID_GET_CONGESTION_NOTIFICATION         DPNI_CMD(0x268)
+#define DPNI_CMDID_SET_EARLY_DROP                      DPNI_CMD(0x269)
+#define DPNI_CMDID_GET_EARLY_DROP                      DPNI_CMD(0x26A)
+#define DPNI_CMDID_GET_OFFLOAD                         DPNI_CMD(0x26B)
+#define DPNI_CMDID_SET_OFFLOAD                         DPNI_CMD(0x26C)
+
+/* Macros for accessing command fields smaller than 1byte */
+#define DPNI_MASK(field)       \
+       GENMASK(DPNI_##field##_SHIFT + DPNI_##field##_SIZE - 1, \
+               DPNI_##field##_SHIFT)
+
+#define dpni_set_field(var, field, val)        \
+       ((var) |= (((val) << DPNI_##field##_SHIFT) & DPNI_MASK(field)))
+#define dpni_get_field(var, field)     \
+       (((var) & DPNI_MASK(field)) >> DPNI_##field##_SHIFT)
+
+struct dpni_cmd_open {
+       __le32 dpni_id;
+};
+
+#define DPNI_BACKUP_POOL(val, order)   (((val) & 0x1) << (order))
+struct dpni_cmd_set_pools {
+       /* cmd word 0 */
+       u8 num_dpbp;
+       u8 backup_pool_mask;
+       __le16 pad;
+       /* cmd word 0..4 */
+       __le32 dpbp_id[DPNI_MAX_DPBP];
+       /* cmd word 4..6 */
+       __le16 buffer_size[DPNI_MAX_DPBP];
+};
+
+/* The enable indication is always the least significant bit */
+#define DPNI_ENABLE_SHIFT              0
+#define DPNI_ENABLE_SIZE               1
+
+struct dpni_rsp_is_enabled {
+       u8 enabled;
+};
+
+struct dpni_rsp_get_irq {
+       /* response word 0 */
+       __le32 irq_val;
+       __le32 pad;
+       /* response word 1 */
+       __le64 irq_addr;
+       /* response word 2 */
+       __le32 irq_num;
+       __le32 type;
+};
+
+struct dpni_cmd_set_irq_enable {
+       u8 enable;
+       u8 pad[3];
+       u8 irq_index;
+};
+
+struct dpni_cmd_get_irq_enable {
+       __le32 pad;
+       u8 irq_index;
+};
+
+struct dpni_rsp_get_irq_enable {
+       u8 enabled;
+};
+
+struct dpni_cmd_set_irq_mask {
+       __le32 mask;
+       u8 irq_index;
+};
+
+struct dpni_cmd_get_irq_mask {
+       __le32 pad;
+       u8 irq_index;
+};
+
+struct dpni_rsp_get_irq_mask {
+       __le32 mask;
+};
+
+struct dpni_cmd_get_irq_status {
+       __le32 status;
+       u8 irq_index;
+};
+
+struct dpni_rsp_get_irq_status {
+       __le32 status;
+};
+
+struct dpni_cmd_clear_irq_status {
+       __le32 status;
+       u8 irq_index;
+};
+
+struct dpni_rsp_get_attr {
+       /* response word 0 */
+       __le32 options;
+       u8 num_queues;
+       u8 num_tcs;
+       u8 mac_filter_entries;
+       u8 pad0;
+       /* response word 1 */
+       u8 vlan_filter_entries;
+       u8 pad1;
+       u8 qos_entries;
+       u8 pad2;
+       __le16 fs_entries;
+       __le16 pad3;
+       /* response word 2 */
+       u8 qos_key_size;
+       u8 fs_key_size;
+       __le16 wriop_version;
+};
+
+#define DPNI_ERROR_ACTION_SHIFT                0
+#define DPNI_ERROR_ACTION_SIZE         4
+#define DPNI_FRAME_ANN_SHIFT           4
+#define DPNI_FRAME_ANN_SIZE            1
+
+struct dpni_cmd_set_errors_behavior {
+       __le32 errors;
+       /* from least significant bit: error_action:4, set_frame_annotation:1 */
+       u8 flags;
+};
+
+/* There are 3 separate commands for configuring Rx, Tx and Tx confirmation
+ * buffer layouts, but they all share the same parameters.
+ * If one of the functions changes, below structure needs to be split.
+ */
+
+#define DPNI_PASS_TS_SHIFT             0
+#define DPNI_PASS_TS_SIZE              1
+#define DPNI_PASS_PR_SHIFT             1
+#define DPNI_PASS_PR_SIZE              1
+#define DPNI_PASS_FS_SHIFT             2
+#define DPNI_PASS_FS_SIZE              1
+
+struct dpni_cmd_get_buffer_layout {
+       u8 qtype;
+};
+
+struct dpni_rsp_get_buffer_layout {
+       /* response word 0 */
+       u8 pad0[6];
+       /* from LSB: pass_timestamp:1, parser_result:1, frame_status:1 */
+       u8 flags;
+       u8 pad1;
+       /* response word 1 */
+       __le16 private_data_size;
+       __le16 data_align;
+       __le16 head_room;
+       __le16 tail_room;
+};
+
+struct dpni_cmd_set_buffer_layout {
+       /* cmd word 0 */
+       u8 qtype;
+       u8 pad0[3];
+       __le16 options;
+       /* from LSB: pass_timestamp:1, parser_result:1, frame_status:1 */
+       u8 flags;
+       u8 pad1;
+       /* cmd word 1 */
+       __le16 private_data_size;
+       __le16 data_align;
+       __le16 head_room;
+       __le16 tail_room;
+};
+
+struct dpni_cmd_set_offload {
+       u8 pad[3];
+       u8 dpni_offload;
+       __le32 config;
+};
+
+struct dpni_cmd_get_offload {
+       u8 pad[3];
+       u8 dpni_offload;
+};
+
+struct dpni_rsp_get_offload {
+       __le32 pad;
+       __le32 config;
+};
+
+struct dpni_cmd_get_qdid {
+       u8 qtype;
+};
+
+struct dpni_rsp_get_qdid {
+       __le16 qdid;
+};
+
+struct dpni_rsp_get_tx_data_offset {
+       __le16 data_offset;
+};
+
+struct dpni_cmd_get_statistics {
+       u8 page_number;
+};
+
+struct dpni_rsp_get_statistics {
+       __le64 counter[DPNI_STATISTICS_CNT];
+};
+
+struct dpni_cmd_set_link_cfg {
+       /* cmd word 0 */
+       __le64 pad0;
+       /* cmd word 1 */
+       __le32 rate;
+       __le32 pad1;
+       /* cmd word 2 */
+       __le64 options;
+};
+
+#define DPNI_LINK_STATE_SHIFT          0
+#define DPNI_LINK_STATE_SIZE           1
+
+struct dpni_rsp_get_link_state {
+       /* response word 0 */
+       __le32 pad0;
+       /* from LSB: up:1 */
+       u8 flags;
+       u8 pad1[3];
+       /* response word 1 */
+       __le32 rate;
+       __le32 pad2;
+       /* response word 2 */
+       __le64 options;
+};
+
+struct dpni_cmd_set_max_frame_length {
+       __le16 max_frame_length;
+};
+
+struct dpni_rsp_get_max_frame_length {
+       __le16 max_frame_length;
+};
+
+struct dpni_cmd_set_multicast_promisc {
+       u8 enable;
+};
+
+struct dpni_rsp_get_multicast_promisc {
+       u8 enabled;
+};
+
+struct dpni_cmd_set_unicast_promisc {
+       u8 enable;
+};
+
+struct dpni_rsp_get_unicast_promisc {
+       u8 enabled;
+};
+
+struct dpni_cmd_set_primary_mac_addr {
+       __le16 pad;
+       u8 mac_addr[6];
+};
+
+struct dpni_rsp_get_primary_mac_addr {
+       __le16 pad;
+       u8 mac_addr[6];
+};
+
+struct dpni_rsp_get_port_mac_addr {
+       __le16 pad;
+       u8 mac_addr[6];
+};
+
+struct dpni_cmd_add_mac_addr {
+       __le16 pad;
+       u8 mac_addr[6];
+};
+
+struct dpni_cmd_remove_mac_addr {
+       __le16 pad;
+       u8 mac_addr[6];
+};
+
+#define DPNI_UNICAST_FILTERS_SHIFT     0
+#define DPNI_UNICAST_FILTERS_SIZE      1
+#define DPNI_MULTICAST_FILTERS_SHIFT   1
+#define DPNI_MULTICAST_FILTERS_SIZE    1
+
+struct dpni_cmd_clear_mac_filters {
+       /* from LSB: unicast:1, multicast:1 */
+       u8 flags;
+};
+
+#define DPNI_DIST_MODE_SHIFT           0
+#define DPNI_DIST_MODE_SIZE            4
+#define DPNI_MISS_ACTION_SHIFT         4
+#define DPNI_MISS_ACTION_SIZE          4
+
+struct dpni_cmd_set_rx_tc_dist {
+       /* cmd word 0 */
+       __le16 dist_size;
+       u8 tc_id;
+       /* from LSB: dist_mode:4, miss_action:4 */
+       u8 flags;
+       __le16 pad0;
+       __le16 default_flow_id;
+       /* cmd word 1..5 */
+       __le64 pad1[5];
+       /* cmd word 6 */
+       __le64 key_cfg_iova;
+};
+
+/* dpni_set_rx_tc_dist extension (structure of the DMA-able memory at
+ * key_cfg_iova)
+ */
+struct dpni_mask_cfg {
+       u8 mask;
+       u8 offset;
+};
+
+#define DPNI_EFH_TYPE_SHIFT            0
+#define DPNI_EFH_TYPE_SIZE             4
+#define DPNI_EXTRACT_TYPE_SHIFT                0
+#define DPNI_EXTRACT_TYPE_SIZE         4
+
+struct dpni_dist_extract {
+       /* word 0 */
+       u8 prot;
+       /* EFH type stored in the 4 least significant bits */
+       u8 efh_type;
+       u8 size;
+       u8 offset;
+       __le32 field;
+       /* word 1 */
+       u8 hdr_index;
+       u8 constant;
+       u8 num_of_repeats;
+       u8 num_of_byte_masks;
+       /* Extraction type is stored in the 4 LSBs */
+       u8 extract_type;
+       u8 pad[3];
+       /* word 2 */
+       struct dpni_mask_cfg masks[4];
+};
+
+struct dpni_ext_set_rx_tc_dist {
+       /* extension word 0 */
+       u8 num_extracts;
+       u8 pad[7];
+       /* words 1..25 */
+       struct dpni_dist_extract extracts[DPKG_MAX_NUM_OF_EXTRACTS];
+};
+
+struct dpni_cmd_get_queue {
+       u8 qtype;
+       u8 tc;
+       u8 index;
+};
+
+#define DPNI_DEST_TYPE_SHIFT           0
+#define DPNI_DEST_TYPE_SIZE            4
+#define DPNI_STASH_CTRL_SHIFT          6
+#define DPNI_STASH_CTRL_SIZE           1
+#define DPNI_HOLD_ACTIVE_SHIFT         7
+#define DPNI_HOLD_ACTIVE_SIZE          1
+
+struct dpni_rsp_get_queue {
+       /* response word 0 */
+       __le64 pad0;
+       /* response word 1 */
+       __le32 dest_id;
+       __le16 pad1;
+       u8 dest_prio;
+       /* From LSB: dest_type:4, pad:2, flc_stash_ctrl:1, hold_active:1 */
+       u8 flags;
+       /* response word 2 */
+       __le64 flc;
+       /* response word 3 */
+       __le64 user_context;
+       /* response word 4 */
+       __le32 fqid;
+       __le16 qdbin;
+};
+
+struct dpni_cmd_set_queue {
+       /* cmd word 0 */
+       u8 qtype;
+       u8 tc;
+       u8 index;
+       u8 options;
+       __le32 pad0;
+       /* cmd word 1 */
+       __le32 dest_id;
+       __le16 pad1;
+       u8 dest_prio;
+       u8 flags;
+       /* cmd word 2 */
+       __le64 flc;
+       /* cmd word 3 */
+       __le64 user_context;
+};
+
+struct dpni_cmd_set_taildrop {
+       /* cmd word 0 */
+       u8 congestion_point;
+       u8 qtype;
+       u8 tc;
+       u8 index;
+       __le32 pad0;
+       /* cmd word 1 */
+       /* Only least significant bit is relevant */
+       u8 enable;
+       u8 pad1;
+       u8 units;
+       u8 pad2;
+       __le32 threshold;
+};
+
+struct dpni_cmd_get_taildrop {
+       u8 congestion_point;
+       u8 qtype;
+       u8 tc;
+       u8 index;
+};
+
+struct dpni_rsp_get_taildrop {
+       /* cmd word 0 */
+       __le64 pad0;
+       /* cmd word 1 */
+       /* only least significant bit is relevant */
+       u8 enable;
+       u8 pad1;
+       u8 units;
+       u8 pad2;
+       __le32 threshold;
+};
+
+#endif /* _FSL_DPNI_CMD_H */
diff --git a/drivers/staging/fsl-dpaa2/ethernet/dpni.c b/drivers/staging/fsl-dpaa2/ethernet/dpni.c
new file mode 100644 (file)
index 0000000..cea46ed
--- /dev/null
@@ -0,0 +1,1595 @@
+/* Copyright 2013-2016 Freescale Semiconductor Inc.
+ * Copyright 2016 NXP
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of the above-listed copyright holders nor the
+ * names of any contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ *
+ * ALTERNATIVELY, this software may be distributed under the terms of the
+ * GNU General Public License ("GPL") as published by the Free Software
+ * Foundation, either version 2 of that License or (at your option) any
+ * later version.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+#include "../../fsl-mc/include/mc-sys.h"
+#include "../../fsl-mc/include/mc-cmd.h"
+#include "dpni.h"
+#include "dpni-cmd.h"
+
+/**
+ * dpni_prepare_key_cfg() - function prepare extract parameters
+ * @cfg: defining a full Key Generation profile (rule)
+ * @key_cfg_buf: Zeroed 256 bytes of memory before mapping it to DMA
+ *
+ * This function has to be called before the following functions:
+ *     - dpni_set_rx_tc_dist()
+ *     - dpni_set_qos_table()
+ */
+int dpni_prepare_key_cfg(const struct dpkg_profile_cfg *cfg, u8 *key_cfg_buf)
+{
+       int i, j;
+       struct dpni_ext_set_rx_tc_dist *dpni_ext;
+       struct dpni_dist_extract *extr;
+
+       if (cfg->num_extracts > DPKG_MAX_NUM_OF_EXTRACTS)
+               return -EINVAL;
+
+       dpni_ext = (struct dpni_ext_set_rx_tc_dist *)key_cfg_buf;
+       dpni_ext->num_extracts = cfg->num_extracts;
+
+       for (i = 0; i < cfg->num_extracts; i++) {
+               extr = &dpni_ext->extracts[i];
+
+               switch (cfg->extracts[i].type) {
+               case DPKG_EXTRACT_FROM_HDR:
+                       extr->prot = cfg->extracts[i].extract.from_hdr.prot;
+                       dpni_set_field(extr->efh_type, EFH_TYPE,
+                                      cfg->extracts[i].extract.from_hdr.type);
+                       extr->size = cfg->extracts[i].extract.from_hdr.size;
+                       extr->offset = cfg->extracts[i].extract.from_hdr.offset;
+                       extr->field = cpu_to_le32(
+                               cfg->extracts[i].extract.from_hdr.field);
+                       extr->hdr_index =
+                               cfg->extracts[i].extract.from_hdr.hdr_index;
+                       break;
+               case DPKG_EXTRACT_FROM_DATA:
+                       extr->size = cfg->extracts[i].extract.from_data.size;
+                       extr->offset =
+                               cfg->extracts[i].extract.from_data.offset;
+                       break;
+               case DPKG_EXTRACT_FROM_PARSE:
+                       extr->size = cfg->extracts[i].extract.from_parse.size;
+                       extr->offset =
+                               cfg->extracts[i].extract.from_parse.offset;
+                       break;
+               default:
+                       return -EINVAL;
+               }
+
+               extr->num_of_byte_masks = cfg->extracts[i].num_of_byte_masks;
+               dpni_set_field(extr->extract_type, EXTRACT_TYPE,
+                              cfg->extracts[i].type);
+
+               for (j = 0; j < DPKG_NUM_OF_MASKS; j++) {
+                       extr->masks[j].mask = cfg->extracts[i].masks[j].mask;
+                       extr->masks[j].offset =
+                               cfg->extracts[i].masks[j].offset;
+               }
+       }
+
+       return 0;
+}
+
+/**
+ * dpni_open() - Open a control session for the specified object
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @dpni_id:   DPNI unique ID
+ * @token:     Returned token; use in subsequent API calls
+ *
+ * This function can be used to open a control session for an
+ * already created object; an object may have been declared in
+ * the DPL or by calling the dpni_create() function.
+ * This function returns a unique authentication token,
+ * associated with the specific object ID and the specific MC
+ * portal; this token must be used in all subsequent commands for
+ * this specific object.
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpni_open(struct fsl_mc_io *mc_io,
+             u32 cmd_flags,
+             int dpni_id,
+             u16 *token)
+{
+       struct mc_command cmd = { 0 };
+       struct dpni_cmd_open *cmd_params;
+
+       int err;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_OPEN,
+                                         cmd_flags,
+                                         0);
+       cmd_params = (struct dpni_cmd_open *)cmd.params;
+       cmd_params->dpni_id = cpu_to_le32(dpni_id);
+
+       /* send command to mc*/
+       err = mc_send_command(mc_io, &cmd);
+       if (err)
+               return err;
+
+       /* retrieve response parameters */
+       *token = mc_cmd_hdr_read_token(&cmd);
+
+       return 0;
+}
+
+/**
+ * dpni_close() - Close the control session of the object
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token:     Token of DPNI object
+ *
+ * After this function is called, no further operations are
+ * allowed on the object without opening a new control session.
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpni_close(struct fsl_mc_io *mc_io,
+              u32 cmd_flags,
+              u16 token)
+{
+       struct mc_command cmd = { 0 };
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_CLOSE,
+                                         cmd_flags,
+                                         token);
+
+       /* send command to mc*/
+       return mc_send_command(mc_io, &cmd);
+}
+
+/**
+ * dpni_set_pools() - Set buffer pools configuration
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token:     Token of DPNI object
+ * @cfg:       Buffer pools configuration
+ *
+ * mandatory for DPNI operation
+ * warning:Allowed only when DPNI is disabled
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpni_set_pools(struct fsl_mc_io *mc_io,
+                  u32 cmd_flags,
+                  u16 token,
+                  const struct dpni_pools_cfg *cfg)
+{
+       struct mc_command cmd = { 0 };
+       struct dpni_cmd_set_pools *cmd_params;
+       int i;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_POOLS,
+                                         cmd_flags,
+                                         token);
+       cmd_params = (struct dpni_cmd_set_pools *)cmd.params;
+       cmd_params->num_dpbp = cfg->num_dpbp;
+       for (i = 0; i < DPNI_MAX_DPBP; i++) {
+               cmd_params->dpbp_id[i] = cpu_to_le32(cfg->pools[i].dpbp_id);
+               cmd_params->buffer_size[i] =
+                       cpu_to_le16(cfg->pools[i].buffer_size);
+               cmd_params->backup_pool_mask |=
+                       DPNI_BACKUP_POOL(cfg->pools[i].backup_pool, i);
+       }
+
+       /* send command to mc*/
+       return mc_send_command(mc_io, &cmd);
+}
+
+/**
+ * dpni_enable() - Enable the DPNI, allow sending and receiving frames.
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token:             Token of DPNI object
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpni_enable(struct fsl_mc_io *mc_io,
+               u32 cmd_flags,
+               u16 token)
+{
+       struct mc_command cmd = { 0 };
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_ENABLE,
+                                         cmd_flags,
+                                         token);
+
+       /* send command to mc*/
+       return mc_send_command(mc_io, &cmd);
+}
+
+/**
+ * dpni_disable() - Disable the DPNI, stop sending and receiving frames.
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token:     Token of DPNI object
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpni_disable(struct fsl_mc_io *mc_io,
+                u32 cmd_flags,
+                u16 token)
+{
+       struct mc_command cmd = { 0 };
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_DISABLE,
+                                         cmd_flags,
+                                         token);
+
+       /* send command to mc*/
+       return mc_send_command(mc_io, &cmd);
+}
+
+/**
+ * dpni_is_enabled() - Check if the DPNI is enabled.
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token:     Token of DPNI object
+ * @en:                Returns '1' if object is enabled; '0' otherwise
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpni_is_enabled(struct fsl_mc_io *mc_io,
+                   u32 cmd_flags,
+                   u16 token,
+                   int *en)
+{
+       struct mc_command cmd = { 0 };
+       struct dpni_rsp_is_enabled *rsp_params;
+       int err;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_IS_ENABLED,
+                                         cmd_flags,
+                                         token);
+
+       /* send command to mc*/
+       err = mc_send_command(mc_io, &cmd);
+       if (err)
+               return err;
+
+       /* retrieve response parameters */
+       rsp_params = (struct dpni_rsp_is_enabled *)cmd.params;
+       *en = dpni_get_field(rsp_params->enabled, ENABLE);
+
+       return 0;
+}
+
+/**
+ * dpni_reset() - Reset the DPNI, returns the object to initial state.
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token:     Token of DPNI object
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpni_reset(struct fsl_mc_io *mc_io,
+              u32 cmd_flags,
+              u16 token)
+{
+       struct mc_command cmd = { 0 };
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_RESET,
+                                         cmd_flags,
+                                         token);
+
+       /* send command to mc*/
+       return mc_send_command(mc_io, &cmd);
+}
+
+/**
+ * dpni_set_irq_enable() - Set overall interrupt state.
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token:     Token of DPNI object
+ * @irq_index: The interrupt index to configure
+ * @en:                Interrupt state: - enable = 1, disable = 0
+ *
+ * Allows GPP software to control when interrupts are generated.
+ * Each interrupt can have up to 32 causes.  The enable/disable control's the
+ * overall interrupt state. if the interrupt is disabled no causes will cause
+ * an interrupt.
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpni_set_irq_enable(struct fsl_mc_io *mc_io,
+                       u32 cmd_flags,
+                       u16 token,
+                       u8 irq_index,
+                       u8 en)
+{
+       struct mc_command cmd = { 0 };
+       struct dpni_cmd_set_irq_enable *cmd_params;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_IRQ_ENABLE,
+                                         cmd_flags,
+                                         token);
+       cmd_params = (struct dpni_cmd_set_irq_enable *)cmd.params;
+       dpni_set_field(cmd_params->enable, ENABLE, en);
+       cmd_params->irq_index = irq_index;
+
+       /* send command to mc*/
+       return mc_send_command(mc_io, &cmd);
+}
+
+/**
+ * dpni_get_irq_enable() - Get overall interrupt state
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token:     Token of DPNI object
+ * @irq_index: The interrupt index to configure
+ * @en:                Returned interrupt state - enable = 1, disable = 0
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpni_get_irq_enable(struct fsl_mc_io *mc_io,
+                       u32 cmd_flags,
+                       u16 token,
+                       u8 irq_index,
+                       u8 *en)
+{
+       struct mc_command cmd = { 0 };
+       struct dpni_cmd_get_irq_enable *cmd_params;
+       struct dpni_rsp_get_irq_enable *rsp_params;
+
+       int err;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_IRQ_ENABLE,
+                                         cmd_flags,
+                                         token);
+       cmd_params = (struct dpni_cmd_get_irq_enable *)cmd.params;
+       cmd_params->irq_index = irq_index;
+
+       /* send command to mc*/
+       err = mc_send_command(mc_io, &cmd);
+       if (err)
+               return err;
+
+       /* retrieve response parameters */
+       rsp_params = (struct dpni_rsp_get_irq_enable *)cmd.params;
+       *en = dpni_get_field(rsp_params->enabled, ENABLE);
+
+       return 0;
+}
+
+/**
+ * dpni_set_irq_mask() - Set interrupt mask.
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token:     Token of DPNI object
+ * @irq_index: The interrupt index to configure
+ * @mask:      event mask to trigger interrupt;
+ *                     each bit:
+ *                             0 = ignore event
+ *                             1 = consider event for asserting IRQ
+ *
+ * Every interrupt can have up to 32 causes and the interrupt model supports
+ * masking/unmasking each cause independently
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpni_set_irq_mask(struct fsl_mc_io *mc_io,
+                     u32 cmd_flags,
+                     u16 token,
+                     u8 irq_index,
+                     u32 mask)
+{
+       struct mc_command cmd = { 0 };
+       struct dpni_cmd_set_irq_mask *cmd_params;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_IRQ_MASK,
+                                         cmd_flags,
+                                         token);
+       cmd_params = (struct dpni_cmd_set_irq_mask *)cmd.params;
+       cmd_params->mask = cpu_to_le32(mask);
+       cmd_params->irq_index = irq_index;
+
+       /* send command to mc*/
+       return mc_send_command(mc_io, &cmd);
+}
+
+/**
+ * dpni_get_irq_mask() - Get interrupt mask.
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token:     Token of DPNI object
+ * @irq_index: The interrupt index to configure
+ * @mask:      Returned event mask to trigger interrupt
+ *
+ * Every interrupt can have up to 32 causes and the interrupt model supports
+ * masking/unmasking each cause independently
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpni_get_irq_mask(struct fsl_mc_io *mc_io,
+                     u32 cmd_flags,
+                     u16 token,
+                     u8 irq_index,
+                     u32 *mask)
+{
+       struct mc_command cmd = { 0 };
+       struct dpni_cmd_get_irq_mask *cmd_params;
+       struct dpni_rsp_get_irq_mask *rsp_params;
+       int err;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_IRQ_MASK,
+                                         cmd_flags,
+                                         token);
+       cmd_params = (struct dpni_cmd_get_irq_mask *)cmd.params;
+       cmd_params->irq_index = irq_index;
+
+       /* send command to mc*/
+       err = mc_send_command(mc_io, &cmd);
+       if (err)
+               return err;
+
+       /* retrieve response parameters */
+       rsp_params = (struct dpni_rsp_get_irq_mask *)cmd.params;
+       *mask = le32_to_cpu(rsp_params->mask);
+
+       return 0;
+}
+
+/**
+ * dpni_get_irq_status() - Get the current status of any pending interrupts.
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token:     Token of DPNI object
+ * @irq_index: The interrupt index to configure
+ * @status:    Returned interrupts status - one bit per cause:
+ *                     0 = no interrupt pending
+ *                     1 = interrupt pending
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpni_get_irq_status(struct fsl_mc_io *mc_io,
+                       u32 cmd_flags,
+                       u16 token,
+                       u8 irq_index,
+                       u32 *status)
+{
+       struct mc_command cmd = { 0 };
+       struct dpni_cmd_get_irq_status *cmd_params;
+       struct dpni_rsp_get_irq_status *rsp_params;
+       int err;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_IRQ_STATUS,
+                                         cmd_flags,
+                                         token);
+       cmd_params = (struct dpni_cmd_get_irq_status *)cmd.params;
+       cmd_params->status = cpu_to_le32(*status);
+       cmd_params->irq_index = irq_index;
+
+       /* send command to mc*/
+       err = mc_send_command(mc_io, &cmd);
+       if (err)
+               return err;
+
+       /* retrieve response parameters */
+       rsp_params = (struct dpni_rsp_get_irq_status *)cmd.params;
+       *status = le32_to_cpu(rsp_params->status);
+
+       return 0;
+}
+
+/**
+ * dpni_clear_irq_status() - Clear a pending interrupt's status
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token:     Token of DPNI object
+ * @irq_index: The interrupt index to configure
+ * @status:    bits to clear (W1C) - one bit per cause:
+ *                     0 = don't change
+ *                     1 = clear status bit
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpni_clear_irq_status(struct fsl_mc_io *mc_io,
+                         u32 cmd_flags,
+                         u16 token,
+                         u8 irq_index,
+                         u32 status)
+{
+       struct mc_command cmd = { 0 };
+       struct dpni_cmd_clear_irq_status *cmd_params;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_CLEAR_IRQ_STATUS,
+                                         cmd_flags,
+                                         token);
+       cmd_params = (struct dpni_cmd_clear_irq_status *)cmd.params;
+       cmd_params->irq_index = irq_index;
+       cmd_params->status = cpu_to_le32(status);
+
+       /* send command to mc*/
+       return mc_send_command(mc_io, &cmd);
+}
+
+/**
+ * dpni_get_attributes() - Retrieve DPNI attributes.
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token:     Token of DPNI object
+ * @attr:      Object's attributes
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpni_get_attributes(struct fsl_mc_io *mc_io,
+                       u32 cmd_flags,
+                       u16 token,
+                       struct dpni_attr *attr)
+{
+       struct mc_command cmd = { 0 };
+       struct dpni_rsp_get_attr *rsp_params;
+
+       int err;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_ATTR,
+                                         cmd_flags,
+                                         token);
+
+       /* send command to mc*/
+       err = mc_send_command(mc_io, &cmd);
+       if (err)
+               return err;
+
+       /* retrieve response parameters */
+       rsp_params = (struct dpni_rsp_get_attr *)cmd.params;
+       attr->options = le32_to_cpu(rsp_params->options);
+       attr->num_queues = rsp_params->num_queues;
+       attr->num_tcs = rsp_params->num_tcs;
+       attr->mac_filter_entries = rsp_params->mac_filter_entries;
+       attr->vlan_filter_entries = rsp_params->vlan_filter_entries;
+       attr->qos_entries = rsp_params->qos_entries;
+       attr->fs_entries = le16_to_cpu(rsp_params->fs_entries);
+       attr->qos_key_size = rsp_params->qos_key_size;
+       attr->fs_key_size = rsp_params->fs_key_size;
+       attr->wriop_version = le16_to_cpu(rsp_params->wriop_version);
+
+       return 0;
+}
+
+/**
+ * dpni_set_errors_behavior() - Set errors behavior
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token:     Token of DPNI object
+ * @cfg:       Errors configuration
+ *
+ * this function may be called numerous times with different
+ * error masks
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpni_set_errors_behavior(struct fsl_mc_io *mc_io,
+                            u32 cmd_flags,
+                            u16 token,
+                            struct dpni_error_cfg *cfg)
+{
+       struct mc_command cmd = { 0 };
+       struct dpni_cmd_set_errors_behavior *cmd_params;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_ERRORS_BEHAVIOR,
+                                         cmd_flags,
+                                         token);
+       cmd_params = (struct dpni_cmd_set_errors_behavior *)cmd.params;
+       cmd_params->errors = cpu_to_le32(cfg->errors);
+       dpni_set_field(cmd_params->flags, ERROR_ACTION, cfg->error_action);
+       dpni_set_field(cmd_params->flags, FRAME_ANN, cfg->set_frame_annotation);
+
+       /* send command to mc*/
+       return mc_send_command(mc_io, &cmd);
+}
+
+/**
+ * dpni_get_buffer_layout() - Retrieve buffer layout attributes.
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token:     Token of DPNI object
+ * @qtype:     Type of queue to retrieve configuration for
+ * @layout:    Returns buffer layout attributes
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int 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)
+{
+       struct mc_command cmd = { 0 };
+       struct dpni_cmd_get_buffer_layout *cmd_params;
+       struct dpni_rsp_get_buffer_layout *rsp_params;
+       int err;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_BUFFER_LAYOUT,
+                                         cmd_flags,
+                                         token);
+       cmd_params = (struct dpni_cmd_get_buffer_layout *)cmd.params;
+       cmd_params->qtype = qtype;
+
+       /* send command to mc*/
+       err = mc_send_command(mc_io, &cmd);
+       if (err)
+               return err;
+
+       /* retrieve response parameters */
+       rsp_params = (struct dpni_rsp_get_buffer_layout *)cmd.params;
+       layout->pass_timestamp = dpni_get_field(rsp_params->flags, PASS_TS);
+       layout->pass_parser_result = dpni_get_field(rsp_params->flags, PASS_PR);
+       layout->pass_frame_status = dpni_get_field(rsp_params->flags, PASS_FS);
+       layout->private_data_size = le16_to_cpu(rsp_params->private_data_size);
+       layout->data_align = le16_to_cpu(rsp_params->data_align);
+       layout->data_head_room = le16_to_cpu(rsp_params->head_room);
+       layout->data_tail_room = le16_to_cpu(rsp_params->tail_room);
+
+       return 0;
+}
+
+/**
+ * dpni_set_buffer_layout() - Set buffer layout configuration.
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token:     Token of DPNI object
+ * @qtype:     Type of queue this configuration applies to
+ * @layout:    Buffer layout configuration
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ *
+ * @warning    Allowed only when DPNI is disabled
+ */
+int 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)
+{
+       struct mc_command cmd = { 0 };
+       struct dpni_cmd_set_buffer_layout *cmd_params;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_BUFFER_LAYOUT,
+                                         cmd_flags,
+                                         token);
+       cmd_params = (struct dpni_cmd_set_buffer_layout *)cmd.params;
+       cmd_params->qtype = qtype;
+       cmd_params->options = cpu_to_le16(layout->options);
+       dpni_set_field(cmd_params->flags, PASS_TS, layout->pass_timestamp);
+       dpni_set_field(cmd_params->flags, PASS_PR, layout->pass_parser_result);
+       dpni_set_field(cmd_params->flags, PASS_FS, layout->pass_frame_status);
+       cmd_params->private_data_size = cpu_to_le16(layout->private_data_size);
+       cmd_params->data_align = cpu_to_le16(layout->data_align);
+       cmd_params->head_room = cpu_to_le16(layout->data_head_room);
+       cmd_params->tail_room = cpu_to_le16(layout->data_tail_room);
+
+       /* send command to mc*/
+       return mc_send_command(mc_io, &cmd);
+}
+
+/**
+ * dpni_set_offload() - Set DPNI offload configuration.
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token:     Token of DPNI object
+ * @type:      Type of DPNI offload
+ * @config:    Offload configuration.
+ *             For checksum offloads, non-zero value enables the offload
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ *
+ * @warning    Allowed only when DPNI is disabled
+ */
+
+int dpni_set_offload(struct fsl_mc_io *mc_io,
+                    u32 cmd_flags,
+                    u16 token,
+                    enum dpni_offload type,
+                    u32 config)
+{
+       struct mc_command cmd = { 0 };
+       struct dpni_cmd_set_offload *cmd_params;
+
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_OFFLOAD,
+                                         cmd_flags,
+                                         token);
+       cmd_params = (struct dpni_cmd_set_offload *)cmd.params;
+       cmd_params->dpni_offload = type;
+       cmd_params->config = cpu_to_le32(config);
+
+       return mc_send_command(mc_io, &cmd);
+}
+
+int dpni_get_offload(struct fsl_mc_io *mc_io,
+                    u32 cmd_flags,
+                    u16 token,
+                    enum dpni_offload type,
+                    u32 *config)
+{
+       struct mc_command cmd = { 0 };
+       struct dpni_cmd_get_offload *cmd_params;
+       struct dpni_rsp_get_offload *rsp_params;
+       int err;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_OFFLOAD,
+                                         cmd_flags,
+                                         token);
+       cmd_params = (struct dpni_cmd_get_offload *)cmd.params;
+       cmd_params->dpni_offload = type;
+
+       /* send command to mc*/
+       err = mc_send_command(mc_io, &cmd);
+       if (err)
+               return err;
+
+       /* retrieve response parameters */
+       rsp_params = (struct dpni_rsp_get_offload *)cmd.params;
+       *config = le32_to_cpu(rsp_params->config);
+
+       return 0;
+}
+
+/**
+ * dpni_get_qdid() - Get the Queuing Destination ID (QDID) that should be used
+ *                     for enqueue operations
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token:     Token of DPNI object
+ * @qtype:     Type of queue to receive QDID for
+ * @qdid:      Returned virtual QDID value that should be used as an argument
+ *                     in all enqueue operations
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpni_get_qdid(struct fsl_mc_io *mc_io,
+                 u32 cmd_flags,
+                 u16 token,
+                 enum dpni_queue_type qtype,
+                 u16 *qdid)
+{
+       struct mc_command cmd = { 0 };
+       struct dpni_cmd_get_qdid *cmd_params;
+       struct dpni_rsp_get_qdid *rsp_params;
+       int err;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_QDID,
+                                         cmd_flags,
+                                         token);
+       cmd_params = (struct dpni_cmd_get_qdid *)cmd.params;
+       cmd_params->qtype = qtype;
+
+       /* send command to mc*/
+       err = mc_send_command(mc_io, &cmd);
+       if (err)
+               return err;
+
+       /* retrieve response parameters */
+       rsp_params = (struct dpni_rsp_get_qdid *)cmd.params;
+       *qdid = le16_to_cpu(rsp_params->qdid);
+
+       return 0;
+}
+
+/**
+ * dpni_get_tx_data_offset() - Get the Tx data offset (from start of buffer)
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token:     Token of DPNI object
+ * @data_offset: Tx data offset (from start of buffer)
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpni_get_tx_data_offset(struct fsl_mc_io *mc_io,
+                           u32 cmd_flags,
+                           u16 token,
+                           u16 *data_offset)
+{
+       struct mc_command cmd = { 0 };
+       struct dpni_rsp_get_tx_data_offset *rsp_params;
+       int err;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_TX_DATA_OFFSET,
+                                         cmd_flags,
+                                         token);
+
+       /* send command to mc*/
+       err = mc_send_command(mc_io, &cmd);
+       if (err)
+               return err;
+
+       /* retrieve response parameters */
+       rsp_params = (struct dpni_rsp_get_tx_data_offset *)cmd.params;
+       *data_offset = le16_to_cpu(rsp_params->data_offset);
+
+       return 0;
+}
+
+/**
+ * dpni_set_link_cfg() - set the link configuration.
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token:     Token of DPNI object
+ * @cfg:       Link configuration
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpni_set_link_cfg(struct fsl_mc_io *mc_io,
+                     u32 cmd_flags,
+                     u16 token,
+                     const struct dpni_link_cfg *cfg)
+{
+       struct mc_command cmd = { 0 };
+       struct dpni_cmd_set_link_cfg *cmd_params;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_LINK_CFG,
+                                         cmd_flags,
+                                         token);
+       cmd_params = (struct dpni_cmd_set_link_cfg *)cmd.params;
+       cmd_params->rate = cpu_to_le32(cfg->rate);
+       cmd_params->options = cpu_to_le64(cfg->options);
+
+       /* send command to mc*/
+       return mc_send_command(mc_io, &cmd);
+}
+
+/**
+ * dpni_get_link_state() - Return the link state (either up or down)
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token:     Token of DPNI object
+ * @state:     Returned link state;
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpni_get_link_state(struct fsl_mc_io *mc_io,
+                       u32 cmd_flags,
+                       u16 token,
+                       struct dpni_link_state *state)
+{
+       struct mc_command cmd = { 0 };
+       struct dpni_rsp_get_link_state *rsp_params;
+       int err;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_LINK_STATE,
+                                         cmd_flags,
+                                         token);
+
+       /* send command to mc*/
+       err = mc_send_command(mc_io, &cmd);
+       if (err)
+               return err;
+
+       /* retrieve response parameters */
+       rsp_params = (struct dpni_rsp_get_link_state *)cmd.params;
+       state->up = dpni_get_field(rsp_params->flags, LINK_STATE);
+       state->rate = le32_to_cpu(rsp_params->rate);
+       state->options = le64_to_cpu(rsp_params->options);
+
+       return 0;
+}
+
+/**
+ * dpni_set_max_frame_length() - Set the maximum received frame length.
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token:     Token of DPNI object
+ * @max_frame_length:  Maximum received frame length (in
+ *                             bytes); frame is discarded if its
+ *                             length exceeds this value
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpni_set_max_frame_length(struct fsl_mc_io *mc_io,
+                             u32 cmd_flags,
+                             u16 token,
+                             u16 max_frame_length)
+{
+       struct mc_command cmd = { 0 };
+       struct dpni_cmd_set_max_frame_length *cmd_params;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_MAX_FRAME_LENGTH,
+                                         cmd_flags,
+                                         token);
+       cmd_params = (struct dpni_cmd_set_max_frame_length *)cmd.params;
+       cmd_params->max_frame_length = cpu_to_le16(max_frame_length);
+
+       /* send command to mc*/
+       return mc_send_command(mc_io, &cmd);
+}
+
+/**
+ * dpni_get_max_frame_length() - Get the maximum received frame length.
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token:     Token of DPNI object
+ * @max_frame_length:  Maximum received frame length (in
+ *                             bytes); frame is discarded if its
+ *                             length exceeds this value
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpni_get_max_frame_length(struct fsl_mc_io *mc_io,
+                             u32 cmd_flags,
+                             u16 token,
+                             u16 *max_frame_length)
+{
+       struct mc_command cmd = { 0 };
+       struct dpni_rsp_get_max_frame_length *rsp_params;
+       int err;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_MAX_FRAME_LENGTH,
+                                         cmd_flags,
+                                         token);
+
+       /* send command to mc*/
+       err = mc_send_command(mc_io, &cmd);
+       if (err)
+               return err;
+
+       /* retrieve response parameters */
+       rsp_params = (struct dpni_rsp_get_max_frame_length *)cmd.params;
+       *max_frame_length = le16_to_cpu(rsp_params->max_frame_length);
+
+       return 0;
+}
+
+/**
+ * dpni_set_multicast_promisc() - Enable/disable multicast promiscuous mode
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token:     Token of DPNI object
+ * @en:                Set to '1' to enable; '0' to disable
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpni_set_multicast_promisc(struct fsl_mc_io *mc_io,
+                              u32 cmd_flags,
+                              u16 token,
+                              int en)
+{
+       struct mc_command cmd = { 0 };
+       struct dpni_cmd_set_multicast_promisc *cmd_params;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_MCAST_PROMISC,
+                                         cmd_flags,
+                                         token);
+       cmd_params = (struct dpni_cmd_set_multicast_promisc *)cmd.params;
+       dpni_set_field(cmd_params->enable, ENABLE, en);
+
+       /* send command to mc*/
+       return mc_send_command(mc_io, &cmd);
+}
+
+/**
+ * dpni_get_multicast_promisc() - Get multicast promiscuous mode
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token:     Token of DPNI object
+ * @en:                Returns '1' if enabled; '0' otherwise
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpni_get_multicast_promisc(struct fsl_mc_io *mc_io,
+                              u32 cmd_flags,
+                              u16 token,
+                              int *en)
+{
+       struct mc_command cmd = { 0 };
+       struct dpni_rsp_get_multicast_promisc *rsp_params;
+       int err;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_MCAST_PROMISC,
+                                         cmd_flags,
+                                         token);
+
+       /* send command to mc*/
+       err = mc_send_command(mc_io, &cmd);
+       if (err)
+               return err;
+
+       /* retrieve response parameters */
+       rsp_params = (struct dpni_rsp_get_multicast_promisc *)cmd.params;
+       *en = dpni_get_field(rsp_params->enabled, ENABLE);
+
+       return 0;
+}
+
+/**
+ * dpni_set_unicast_promisc() - Enable/disable unicast promiscuous mode
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token:     Token of DPNI object
+ * @en:                Set to '1' to enable; '0' to disable
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpni_set_unicast_promisc(struct fsl_mc_io *mc_io,
+                            u32 cmd_flags,
+                            u16 token,
+                            int en)
+{
+       struct mc_command cmd = { 0 };
+       struct dpni_cmd_set_unicast_promisc *cmd_params;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_UNICAST_PROMISC,
+                                         cmd_flags,
+                                         token);
+       cmd_params = (struct dpni_cmd_set_unicast_promisc *)cmd.params;
+       dpni_set_field(cmd_params->enable, ENABLE, en);
+
+       /* send command to mc*/
+       return mc_send_command(mc_io, &cmd);
+}
+
+/**
+ * dpni_get_unicast_promisc() - Get unicast promiscuous mode
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token:     Token of DPNI object
+ * @en:                Returns '1' if enabled; '0' otherwise
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpni_get_unicast_promisc(struct fsl_mc_io *mc_io,
+                            u32 cmd_flags,
+                            u16 token,
+                            int *en)
+{
+       struct mc_command cmd = { 0 };
+       struct dpni_rsp_get_unicast_promisc *rsp_params;
+       int err;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_UNICAST_PROMISC,
+                                         cmd_flags,
+                                         token);
+
+       /* send command to mc*/
+       err = mc_send_command(mc_io, &cmd);
+       if (err)
+               return err;
+
+       /* retrieve response parameters */
+       rsp_params = (struct dpni_rsp_get_unicast_promisc *)cmd.params;
+       *en = dpni_get_field(rsp_params->enabled, ENABLE);
+
+       return 0;
+}
+
+/**
+ * dpni_set_primary_mac_addr() - Set the primary MAC address
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token:     Token of DPNI object
+ * @mac_addr:  MAC address to set as primary address
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpni_set_primary_mac_addr(struct fsl_mc_io *mc_io,
+                             u32 cmd_flags,
+                             u16 token,
+                             const u8 mac_addr[6])
+{
+       struct mc_command cmd = { 0 };
+       struct dpni_cmd_set_primary_mac_addr *cmd_params;
+       int i;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_PRIM_MAC,
+                                         cmd_flags,
+                                         token);
+       cmd_params = (struct dpni_cmd_set_primary_mac_addr *)cmd.params;
+       for (i = 0; i < 6; i++)
+               cmd_params->mac_addr[i] = mac_addr[5 - i];
+
+       /* send command to mc*/
+       return mc_send_command(mc_io, &cmd);
+}
+
+/**
+ * dpni_get_primary_mac_addr() - Get the primary MAC address
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token:     Token of DPNI object
+ * @mac_addr:  Returned MAC address
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpni_get_primary_mac_addr(struct fsl_mc_io *mc_io,
+                             u32 cmd_flags,
+                             u16 token,
+                             u8 mac_addr[6])
+{
+       struct mc_command cmd = { 0 };
+       struct dpni_rsp_get_primary_mac_addr *rsp_params;
+       int i, err;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_PRIM_MAC,
+                                         cmd_flags,
+                                         token);
+
+       /* send command to mc*/
+       err = mc_send_command(mc_io, &cmd);
+       if (err)
+               return err;
+
+       /* retrieve response parameters */
+       rsp_params = (struct dpni_rsp_get_primary_mac_addr *)cmd.params;
+       for (i = 0; i < 6; i++)
+               mac_addr[5 - i] = rsp_params->mac_addr[i];
+
+       return 0;
+}
+
+/**
+ * dpni_get_port_mac_addr() - Retrieve MAC address associated to the physical
+ *                     port the DPNI is attached to
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token:     Token of DPNI object
+ * @mac_addr:  MAC address of the physical port, if any, otherwise 0
+ *
+ * The primary MAC address is not cleared by this operation.
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpni_get_port_mac_addr(struct fsl_mc_io *mc_io,
+                          u32 cmd_flags,
+                          u16 token,
+                          u8 mac_addr[6])
+{
+       struct mc_command cmd = { 0 };
+       struct dpni_rsp_get_port_mac_addr *rsp_params;
+       int i, err;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_PORT_MAC_ADDR,
+                                         cmd_flags,
+                                         token);
+
+       /* send command to mc*/
+       err = mc_send_command(mc_io, &cmd);
+       if (err)
+               return err;
+
+       /* retrieve response parameters */
+       rsp_params = (struct dpni_rsp_get_port_mac_addr *)cmd.params;
+       for (i = 0; i < 6; i++)
+               mac_addr[5 - i] = rsp_params->mac_addr[i];
+
+       return 0;
+}
+
+/**
+ * dpni_add_mac_addr() - Add MAC address filter
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token:     Token of DPNI object
+ * @mac_addr:  MAC address to add
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpni_add_mac_addr(struct fsl_mc_io *mc_io,
+                     u32 cmd_flags,
+                     u16 token,
+                     const u8 mac_addr[6])
+{
+       struct mc_command cmd = { 0 };
+       struct dpni_cmd_add_mac_addr *cmd_params;
+       int i;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_ADD_MAC_ADDR,
+                                         cmd_flags,
+                                         token);
+       cmd_params = (struct dpni_cmd_add_mac_addr *)cmd.params;
+       for (i = 0; i < 6; i++)
+               cmd_params->mac_addr[i] = mac_addr[5 - i];
+
+       /* send command to mc*/
+       return mc_send_command(mc_io, &cmd);
+}
+
+/**
+ * dpni_remove_mac_addr() - Remove MAC address filter
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token:     Token of DPNI object
+ * @mac_addr:  MAC address to remove
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpni_remove_mac_addr(struct fsl_mc_io *mc_io,
+                        u32 cmd_flags,
+                        u16 token,
+                        const u8 mac_addr[6])
+{
+       struct mc_command cmd = { 0 };
+       struct dpni_cmd_remove_mac_addr *cmd_params;
+       int i;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_REMOVE_MAC_ADDR,
+                                         cmd_flags,
+                                         token);
+       cmd_params = (struct dpni_cmd_remove_mac_addr *)cmd.params;
+       for (i = 0; i < 6; i++)
+               cmd_params->mac_addr[i] = mac_addr[5 - i];
+
+       /* send command to mc*/
+       return mc_send_command(mc_io, &cmd);
+}
+
+/**
+ * dpni_clear_mac_filters() - Clear all unicast and/or multicast MAC filters
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token:     Token of DPNI object
+ * @unicast:   Set to '1' to clear unicast addresses
+ * @multicast: Set to '1' to clear multicast addresses
+ *
+ * The primary MAC address is not cleared by this operation.
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpni_clear_mac_filters(struct fsl_mc_io *mc_io,
+                          u32 cmd_flags,
+                          u16 token,
+                          int unicast,
+                          int multicast)
+{
+       struct mc_command cmd = { 0 };
+       struct dpni_cmd_clear_mac_filters *cmd_params;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_CLR_MAC_FILTERS,
+                                         cmd_flags,
+                                         token);
+       cmd_params = (struct dpni_cmd_clear_mac_filters *)cmd.params;
+       dpni_set_field(cmd_params->flags, UNICAST_FILTERS, unicast);
+       dpni_set_field(cmd_params->flags, MULTICAST_FILTERS, multicast);
+
+       /* send command to mc*/
+       return mc_send_command(mc_io, &cmd);
+}
+
+/**
+ * dpni_set_rx_tc_dist() - Set Rx traffic class distribution configuration
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token:     Token of DPNI object
+ * @tc_id:     Traffic class selection (0-7)
+ * @cfg:       Traffic class distribution configuration
+ *
+ * warning: if 'dist_mode != DPNI_DIST_MODE_NONE', call dpni_prepare_key_cfg()
+ *                     first to prepare the key_cfg_iova parameter
+ *
+ * Return:     '0' on Success; error code otherwise.
+ */
+int 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)
+{
+       struct mc_command cmd = { 0 };
+       struct dpni_cmd_set_rx_tc_dist *cmd_params;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_RX_TC_DIST,
+                                         cmd_flags,
+                                         token);
+       cmd_params = (struct dpni_cmd_set_rx_tc_dist *)cmd.params;
+       cmd_params->dist_size = cpu_to_le16(cfg->dist_size);
+       cmd_params->tc_id = tc_id;
+       dpni_set_field(cmd_params->flags, DIST_MODE, cfg->dist_mode);
+       dpni_set_field(cmd_params->flags, MISS_ACTION, cfg->fs_cfg.miss_action);
+       cmd_params->default_flow_id = cpu_to_le16(cfg->fs_cfg.default_flow_id);
+       cmd_params->key_cfg_iova = cpu_to_le64(cfg->key_cfg_iova);
+
+       /* send command to mc*/
+       return mc_send_command(mc_io, &cmd);
+}
+
+/**
+ * dpni_set_queue() - Set queue parameters
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token:     Token of DPNI object
+ * @qtype:     Type of queue - all queue types are supported, although
+ *             the command is ignored for Tx
+ * @tc:                Traffic class, in range 0 to NUM_TCS - 1
+ * @index:     Selects the specific queue out of the set allocated for the
+ *             same TC. Value must be in range 0 to NUM_QUEUES - 1
+ * @options:   A combination of DPNI_QUEUE_OPT_ values that control what
+ *             configuration options are set on the queue
+ * @queue:     Queue structure
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int 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)
+{
+       struct mc_command cmd = { 0 };
+       struct dpni_cmd_set_queue *cmd_params;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_QUEUE,
+                                         cmd_flags,
+                                         token);
+       cmd_params = (struct dpni_cmd_set_queue *)cmd.params;
+       cmd_params->qtype = qtype;
+       cmd_params->tc = tc;
+       cmd_params->index = index;
+       cmd_params->options = options;
+       cmd_params->dest_id = cpu_to_le32(queue->destination.id);
+       cmd_params->dest_prio = queue->destination.priority;
+       dpni_set_field(cmd_params->flags, DEST_TYPE, queue->destination.type);
+       dpni_set_field(cmd_params->flags, STASH_CTRL, queue->flc.stash_control);
+       dpni_set_field(cmd_params->flags, HOLD_ACTIVE,
+                      queue->destination.hold_active);
+       cmd_params->flc = cpu_to_le64(queue->flc.value);
+       cmd_params->user_context = cpu_to_le64(queue->user_context);
+
+       /* send command to mc */
+       return mc_send_command(mc_io, &cmd);
+}
+
+/**
+ * dpni_get_queue() - Get queue parameters
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token:     Token of DPNI object
+ * @qtype:     Type of queue - all queue types are supported
+ * @tc:                Traffic class, in range 0 to NUM_TCS - 1
+ * @index:     Selects the specific queue out of the set allocated for the
+ *             same TC. Value must be in range 0 to NUM_QUEUES - 1
+ * @queue:     Queue configuration structure
+ * @qid:       Queue identification
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int 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)
+{
+       struct mc_command cmd = { 0 };
+       struct dpni_cmd_get_queue *cmd_params;
+       struct dpni_rsp_get_queue *rsp_params;
+       int err;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_QUEUE,
+                                         cmd_flags,
+                                         token);
+       cmd_params = (struct dpni_cmd_get_queue *)cmd.params;
+       cmd_params->qtype = qtype;
+       cmd_params->tc = tc;
+       cmd_params->index = index;
+
+       /* send command to mc */
+       err = mc_send_command(mc_io, &cmd);
+       if (err)
+               return err;
+
+       /* retrieve response parameters */
+       rsp_params = (struct dpni_rsp_get_queue *)cmd.params;
+       queue->destination.id = le32_to_cpu(rsp_params->dest_id);
+       queue->destination.priority = rsp_params->dest_prio;
+       queue->destination.type = dpni_get_field(rsp_params->flags,
+                                                    DEST_TYPE);
+       queue->flc.stash_control = dpni_get_field(rsp_params->flags,
+                                                 STASH_CTRL);
+       queue->destination.hold_active = dpni_get_field(rsp_params->flags,
+                                                       HOLD_ACTIVE);
+       queue->flc.value = le64_to_cpu(rsp_params->flc);
+       queue->user_context = le64_to_cpu(rsp_params->user_context);
+       qid->fqid = le32_to_cpu(rsp_params->fqid);
+       qid->qdbin = le16_to_cpu(rsp_params->qdbin);
+
+       return 0;
+}
+
+/**
+ * dpni_get_statistics() - Get DPNI statistics
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token:     Token of DPNI object
+ * @page:      Selects the statistics page to retrieve, see
+ *             DPNI_GET_STATISTICS output. Pages are numbered 0 to 2.
+ * @stat:      Structure containing the statistics
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpni_get_statistics(struct fsl_mc_io *mc_io,
+                       u32 cmd_flags,
+                       u16 token,
+                       u8 page,
+                       union dpni_statistics *stat)
+{
+       struct mc_command cmd = { 0 };
+       struct dpni_cmd_get_statistics *cmd_params;
+       struct dpni_rsp_get_statistics *rsp_params;
+       int i, err;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_STATISTICS,
+                                         cmd_flags,
+                                         token);
+       cmd_params = (struct dpni_cmd_get_statistics *)cmd.params;
+       cmd_params->page_number = page;
+
+       /* send command to mc */
+       err = mc_send_command(mc_io, &cmd);
+       if (err)
+               return err;
+
+       /* retrieve response parameters */
+       rsp_params = (struct dpni_rsp_get_statistics *)cmd.params;
+       for (i = 0; i < DPNI_STATISTICS_CNT; i++)
+               stat->raw.counter[i] = le64_to_cpu(rsp_params->counter[i]);
+
+       return 0;
+}
+
+/**
+ * dpni_set_taildrop() - Set taildrop per queue or TC
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token:     Token of DPNI object
+ * @cg_point:  Congestion point
+ * @q_type:    Queue type on which the taildrop is configured.
+ *             Only Rx queues are supported for now
+ * @tc:                Traffic class to apply this taildrop to
+ * @q_index:   Index of the queue if the DPNI supports multiple queues for
+ *             traffic distribution. Ignored if CONGESTION_POINT is not 0.
+ * @taildrop:  Taildrop structure
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int 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)
+{
+       struct mc_command cmd = { 0 };
+       struct dpni_cmd_set_taildrop *cmd_params;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_TAILDROP,
+                                         cmd_flags,
+                                         token);
+       cmd_params = (struct dpni_cmd_set_taildrop *)cmd.params;
+       cmd_params->congestion_point = cg_point;
+       cmd_params->qtype = qtype;
+       cmd_params->tc = tc;
+       cmd_params->index = index;
+       dpni_set_field(cmd_params->enable, ENABLE, taildrop->enable);
+       cmd_params->units = taildrop->units;
+       cmd_params->threshold = cpu_to_le32(taildrop->threshold);
+
+       /* send command to mc */
+       return mc_send_command(mc_io, &cmd);
+}
+
+/**
+ * dpni_get_taildrop() - Get taildrop information
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token:     Token of DPNI object
+ * @cg_point:  Congestion point
+ * @q_type:    Queue type on which the taildrop is configured.
+ *             Only Rx queues are supported for now
+ * @tc:                Traffic class to apply this taildrop to
+ * @q_index:   Index of the queue if the DPNI supports multiple queues for
+ *             traffic distribution. Ignored if CONGESTION_POINT is not 0.
+ * @taildrop:  Taildrop structure
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int 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)
+{
+       struct mc_command cmd = { 0 };
+       struct dpni_cmd_get_taildrop *cmd_params;
+       struct dpni_rsp_get_taildrop *rsp_params;
+       int err;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_TAILDROP,
+                                         cmd_flags,
+                                         token);
+       cmd_params = (struct dpni_cmd_get_taildrop *)cmd.params;
+       cmd_params->congestion_point = cg_point;
+       cmd_params->qtype = qtype;
+       cmd_params->tc = tc;
+       cmd_params->index = index;
+
+       /* send command to mc */
+       err = mc_send_command(mc_io, &cmd);
+       if (err)
+               return err;
+
+       /* retrieve response parameters */
+       rsp_params = (struct dpni_rsp_get_taildrop *)cmd.params;
+       taildrop->enable = dpni_get_field(rsp_params->enable, ENABLE);
+       taildrop->units = rsp_params->units;
+       taildrop->threshold = le32_to_cpu(rsp_params->threshold);
+
+       return 0;
+}
diff --git a/drivers/staging/fsl-dpaa2/ethernet/dpni.h b/drivers/staging/fsl-dpaa2/ethernet/dpni.h
new file mode 100644 (file)
index 0000000..282e5e8
--- /dev/null
@@ -0,0 +1,832 @@
+/* Copyright 2013-2016 Freescale Semiconductor Inc.
+ * Copyright 2016 NXP
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of the above-listed copyright holders nor the
+ * names of any contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ *
+ * ALTERNATIVELY, this software may be distributed under the terms of the
+ * GNU General Public License ("GPL") as published by the Free Software
+ * Foundation, either version 2 of that License or (at your option) any
+ * later version.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+#ifndef __FSL_DPNI_H
+#define __FSL_DPNI_H
+
+#include "dpkg.h"
+
+struct fsl_mc_io;
+
+/**
+ * Data Path Network Interface API
+ * Contains initialization APIs and runtime control APIs for DPNI
+ */
+
+/** General DPNI macros */
+
+/**
+ * Maximum number of traffic classes
+ */
+#define DPNI_MAX_TC                            8
+/**
+ * Maximum number of buffer pools per DPNI
+ */
+#define DPNI_MAX_DPBP                          8
+
+/**
+ * All traffic classes considered; see dpni_set_queue()
+ */
+#define DPNI_ALL_TCS                           (u8)(-1)
+/**
+ * All flows within traffic class considered; see dpni_set_queue()
+ */
+#define DPNI_ALL_TC_FLOWS                      (u16)(-1)
+/**
+ * Generate new flow ID; see dpni_set_queue()
+ */
+#define DPNI_NEW_FLOW_ID                       (u16)(-1)
+
+/**
+ * Tx traffic is always released to a buffer pool on transmit, there are no
+ * resources allocated to have the frames confirmed back to the source after
+ * transmission.
+ */
+#define DPNI_OPT_TX_FRM_RELEASE                        0x000001
+/**
+ * Disables support for MAC address filtering for addresses other than primary
+ * MAC address. This affects both unicast and multicast. Promiscuous mode can
+ * still be enabled/disabled for both unicast and multicast. If promiscuous mode
+ * is disabled, only traffic matching the primary MAC address will be accepted.
+ */
+#define DPNI_OPT_NO_MAC_FILTER                 0x000002
+/**
+ * Allocate policers for this DPNI. They can be used to rate-limit traffic per
+ * traffic class (TC) basis.
+ */
+#define DPNI_OPT_HAS_POLICING                  0x000004
+/**
+ * Congestion can be managed in several ways, allowing the buffer pool to
+ * deplete on ingress, taildrop on each queue or use congestion groups for sets
+ * of queues. If set, it configures a single congestion groups across all TCs.
+ * If reset, a congestion group is allocated for each TC. Only relevant if the
+ * DPNI has multiple traffic classes.
+ */
+#define DPNI_OPT_SHARED_CONGESTION             0x000008
+/**
+ * Enables TCAM for Flow Steering and QoS look-ups. If not specified, all
+ * look-ups are exact match. Note that TCAM is not available on LS1088 and its
+ * variants. Setting this bit on these SoCs will trigger an error.
+ */
+#define DPNI_OPT_HAS_KEY_MASKING               0x000010
+/**
+ * Disables the flow steering table.
+ */
+#define DPNI_OPT_NO_FS                         0x000020
+
+int dpni_open(struct fsl_mc_io *mc_io,
+             u32               cmd_flags,
+             int               dpni_id,
+             u16               *token);
+
+int dpni_close(struct fsl_mc_io        *mc_io,
+              u32              cmd_flags,
+              u16              token);
+
+/**
+ * struct dpni_pools_cfg - Structure representing buffer pools configuration
+ * @num_dpbp: Number of DPBPs
+ * @pools: Array of buffer pools parameters; The number of valid entries
+ *     must match 'num_dpbp' value
+ */
+struct dpni_pools_cfg {
+       u8              num_dpbp;
+       /**
+        * struct pools - Buffer pools parameters
+        * @dpbp_id: DPBP object ID
+        * @buffer_size: Buffer size
+        * @backup_pool: Backup pool
+        */
+       struct {
+               int     dpbp_id;
+               u16     buffer_size;
+               int     backup_pool;
+       } pools[DPNI_MAX_DPBP];
+};
+
+int dpni_set_pools(struct fsl_mc_io            *mc_io,
+                  u32                          cmd_flags,
+                  u16                          token,
+                  const struct dpni_pools_cfg  *cfg);
+
+int dpni_enable(struct fsl_mc_io       *mc_io,
+               u32                     cmd_flags,
+               u16                     token);
+
+int dpni_disable(struct fsl_mc_io      *mc_io,
+                u32                    cmd_flags,
+                u16                    token);
+
+int dpni_is_enabled(struct fsl_mc_io   *mc_io,
+                   u32                 cmd_flags,
+                   u16                 token,
+                   int                 *en);
+
+int dpni_reset(struct fsl_mc_io        *mc_io,
+              u32              cmd_flags,
+              u16              token);
+
+/**
+ * DPNI IRQ Index and Events
+ */
+
+/**
+ * IRQ index
+ */
+#define DPNI_IRQ_INDEX                         0
+/**
+ * IRQ event - indicates a change in link state
+ */
+#define DPNI_IRQ_EVENT_LINK_CHANGED            0x00000001
+
+int dpni_set_irq_enable(struct fsl_mc_io       *mc_io,
+                       u32                     cmd_flags,
+                       u16                     token,
+                       u8                      irq_index,
+                       u8                      en);
+
+int dpni_get_irq_enable(struct fsl_mc_io       *mc_io,
+                       u32                     cmd_flags,
+                       u16                     token,
+                       u8                      irq_index,
+                       u8                      *en);
+
+int dpni_set_irq_mask(struct fsl_mc_io *mc_io,
+                     u32               cmd_flags,
+                     u16               token,
+                     u8                irq_index,
+                     u32               mask);
+
+int dpni_get_irq_mask(struct fsl_mc_io *mc_io,
+                     u32               cmd_flags,
+                     u16               token,
+                     u8                irq_index,
+                     u32               *mask);
+
+int dpni_get_irq_status(struct fsl_mc_io       *mc_io,
+                       u32                     cmd_flags,
+                       u16                     token,
+                       u8                      irq_index,
+                       u32                     *status);
+
+int dpni_clear_irq_status(struct fsl_mc_io     *mc_io,
+                         u32                   cmd_flags,
+                         u16                   token,
+                         u8                    irq_index,
+                         u32                   status);
+
+/**
+ * struct dpni_attr - Structure representing DPNI attributes
+ * @options: Any combination of the following options:
+ *             DPNI_OPT_TX_FRM_RELEASE
+ *             DPNI_OPT_NO_MAC_FILTER
+ *             DPNI_OPT_HAS_POLICING
+ *             DPNI_OPT_SHARED_CONGESTION
+ *             DPNI_OPT_HAS_KEY_MASKING
+ *             DPNI_OPT_NO_FS
+ * @num_queues: Number of Tx and Rx queues used for traffic distribution.
+ * @num_tcs: Number of traffic classes (TCs), reserved for the DPNI.
+ * @mac_filter_entries: Number of entries in the MAC address filtering table.
+ * @vlan_filter_entries: Number of entries in the VLAN address filtering table.
+ * @qos_entries: Number of entries in the QoS classification table.
+ * @fs_entries: Number of entries in the flow steering table.
+ * @qos_key_size: Size, in bytes, of the QoS look-up key. Defining a key larger
+ *             than this when adding QoS entries will result in an error.
+ * @fs_key_size: Size, in bytes, of the flow steering look-up key. Defining a
+ *             key larger than this when composing the hash + FS key will
+ *             result in an error.
+ * @wriop_version: Version of WRIOP HW block. The 3 version values are stored
+ *             on 6, 5, 5 bits respectively.
+ */
+struct dpni_attr {
+       u32 options;
+       u8 num_queues;
+       u8 num_tcs;
+       u8 mac_filter_entries;
+       u8 vlan_filter_entries;
+       u8 qos_entries;
+       u16 fs_entries;
+       u8 qos_key_size;
+       u8 fs_key_size;
+       u16 wriop_version;
+};
+
+int dpni_get_attributes(struct fsl_mc_io       *mc_io,
+                       u32                     cmd_flags,
+                       u16                     token,
+                       struct dpni_attr        *attr);
+
+/**
+ * DPNI errors
+ */
+
+/**
+ * Extract out of frame header error
+ */
+#define DPNI_ERROR_EOFHE       0x00020000
+/**
+ * Frame length error
+ */
+#define DPNI_ERROR_FLE         0x00002000
+/**
+ * Frame physical error
+ */
+#define DPNI_ERROR_FPE         0x00001000
+/**
+ * Parsing header error
+ */
+#define DPNI_ERROR_PHE         0x00000020
+/**
+ * Parser L3 checksum error
+ */
+#define DPNI_ERROR_L3CE                0x00000004
+/**
+ * Parser L3 checksum error
+ */
+#define DPNI_ERROR_L4CE                0x00000001
+
+/**
+ * enum dpni_error_action - Defines DPNI behavior for errors
+ * @DPNI_ERROR_ACTION_DISCARD: Discard the frame
+ * @DPNI_ERROR_ACTION_CONTINUE: Continue with the normal flow
+ * @DPNI_ERROR_ACTION_SEND_TO_ERROR_QUEUE: Send the frame to the error queue
+ */
+enum dpni_error_action {
+       DPNI_ERROR_ACTION_DISCARD = 0,
+       DPNI_ERROR_ACTION_CONTINUE = 1,
+       DPNI_ERROR_ACTION_SEND_TO_ERROR_QUEUE = 2
+};
+
+/**
+ * struct dpni_error_cfg - Structure representing DPNI errors treatment
+ * @errors: Errors mask; use 'DPNI_ERROR__<X>
+ * @error_action: The desired action for the errors mask
+ * @set_frame_annotation: Set to '1' to mark the errors in frame annotation
+ *             status (FAS); relevant only for the non-discard action
+ */
+struct dpni_error_cfg {
+       u32                     errors;
+       enum dpni_error_action  error_action;
+       int                     set_frame_annotation;
+};
+
+int dpni_set_errors_behavior(struct fsl_mc_io          *mc_io,
+                            u32                        cmd_flags,
+                            u16                        token,
+                            struct dpni_error_cfg      *cfg);
+
+/**
+ * DPNI buffer layout modification options
+ */
+
+/**
+ * Select to modify the time-stamp setting
+ */
+#define DPNI_BUF_LAYOUT_OPT_TIMESTAMP          0x00000001
+/**
+ * Select to modify the parser-result setting; not applicable for Tx
+ */
+#define DPNI_BUF_LAYOUT_OPT_PARSER_RESULT      0x00000002
+/**
+ * Select to modify the frame-status setting
+ */
+#define DPNI_BUF_LAYOUT_OPT_FRAME_STATUS       0x00000004
+/**
+ * Select to modify the private-data-size setting
+ */
+#define DPNI_BUF_LAYOUT_OPT_PRIVATE_DATA_SIZE  0x00000008
+/**
+ * Select to modify the data-alignment setting
+ */
+#define DPNI_BUF_LAYOUT_OPT_DATA_ALIGN         0x00000010
+/**
+ * Select to modify the data-head-room setting
+ */
+#define DPNI_BUF_LAYOUT_OPT_DATA_HEAD_ROOM     0x00000020
+/**
+ * Select to modify the data-tail-room setting
+ */
+#define DPNI_BUF_LAYOUT_OPT_DATA_TAIL_ROOM     0x00000040
+
+/**
+ * struct dpni_buffer_layout - Structure representing DPNI buffer layout
+ * @options: Flags representing the suggested modifications to the buffer
+ *             layout; Use any combination of 'DPNI_BUF_LAYOUT_OPT_<X>' flags
+ * @pass_timestamp: Pass timestamp value
+ * @pass_parser_result: Pass parser results
+ * @pass_frame_status: Pass frame status
+ * @private_data_size: Size kept for private data (in bytes)
+ * @data_align: Data alignment
+ * @data_head_room: Data head room
+ * @data_tail_room: Data tail room
+ */
+struct dpni_buffer_layout {
+       u32     options;
+       int     pass_timestamp;
+       int     pass_parser_result;
+       int     pass_frame_status;
+       u16     private_data_size;
+       u16     data_align;
+       u16     data_head_room;
+       u16     data_tail_room;
+};
+
+/**
+ * enum dpni_queue_type - Identifies a type of queue targeted by the command
+ * @DPNI_QUEUE_RX: Rx queue
+ * @DPNI_QUEUE_TX: Tx queue
+ * @DPNI_QUEUE_TX_CONFIRM: Tx confirmation queue
+ * @DPNI_QUEUE_RX_ERR: Rx error queue
+ */enum dpni_queue_type {
+       DPNI_QUEUE_RX,
+       DPNI_QUEUE_TX,
+       DPNI_QUEUE_TX_CONFIRM,
+       DPNI_QUEUE_RX_ERR,
+};
+
+int 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);
+
+int 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);
+
+/**
+ * enum dpni_offload - Identifies a type of offload targeted by the command
+ * @DPNI_OFF_RX_L3_CSUM: Rx L3 checksum validation
+ * @DPNI_OFF_RX_L4_CSUM: Rx L4 checksum validation
+ * @DPNI_OFF_TX_L3_CSUM: Tx L3 checksum generation
+ * @DPNI_OFF_TX_L4_CSUM: Tx L4 checksum generation
+ */
+enum dpni_offload {
+       DPNI_OFF_RX_L3_CSUM,
+       DPNI_OFF_RX_L4_CSUM,
+       DPNI_OFF_TX_L3_CSUM,
+       DPNI_OFF_TX_L4_CSUM,
+};
+
+int dpni_set_offload(struct fsl_mc_io  *mc_io,
+                    u32                cmd_flags,
+                    u16                token,
+                    enum dpni_offload  type,
+                    u32                config);
+
+int dpni_get_offload(struct fsl_mc_io  *mc_io,
+                    u32                cmd_flags,
+                    u16                token,
+                    enum dpni_offload  type,
+                    u32                *config);
+
+int dpni_get_qdid(struct fsl_mc_io     *mc_io,
+                 u32                   cmd_flags,
+                 u16                   token,
+                 enum dpni_queue_type  qtype,
+                 u16                   *qdid);
+
+int dpni_get_tx_data_offset(struct fsl_mc_io   *mc_io,
+                           u32                 cmd_flags,
+                           u16                 token,
+                           u16                 *data_offset);
+
+#define DPNI_STATISTICS_CNT            7
+
+union dpni_statistics {
+       /**
+        * struct page_0 - Page_0 statistics structure
+        * @ingress_all_frames: Ingress frame count
+        * @ingress_all_bytes: Ingress byte count
+        * @ingress_multicast_frames: Ingress multicast frame count
+        * @ingress_multicast_bytes: Ingress multicast byte count
+        * @ingress_broadcast_frames: Ingress broadcast frame count
+        * @ingress_broadcast_bytes: Ingress broadcast byte count
+        */
+       struct {
+               u64 ingress_all_frames;
+               u64 ingress_all_bytes;
+               u64 ingress_multicast_frames;
+               u64 ingress_multicast_bytes;
+               u64 ingress_broadcast_frames;
+               u64 ingress_broadcast_bytes;
+       } page_0;
+       /**
+        * struct page_1 - Page_1 statistics structure
+        * @egress_all_frames: Egress frame count
+        * @egress_all_bytes: Egress byte count
+        * @egress_multicast_frames: Egress multicast frame count
+        * @egress_multicast_bytes: Egress multicast byte count
+        * @egress_broadcast_frames: Egress broadcast frame count
+        * @egress_broadcast_bytes: Egress broadcast byte count
+        */
+       struct {
+               u64 egress_all_frames;
+               u64 egress_all_bytes;
+               u64 egress_multicast_frames;
+               u64 egress_multicast_bytes;
+               u64 egress_broadcast_frames;
+               u64 egress_broadcast_bytes;
+       } page_1;
+       /**
+        * struct page_2 - Page_2 statistics structure
+        * @ingress_filtered_frames: Ingress filtered frame count
+        * @ingress_discarded_frames: Ingress discarded frame count
+        * @ingress_nobuffer_discards: Ingress discarded frame count
+        *                              due to lack of buffers
+        * @egress_discarded_frames: Egress discarded frame count
+        * @egress_confirmed_frames: Egress confirmed frame count
+        */
+       struct {
+               u64 ingress_filtered_frames;
+               u64 ingress_discarded_frames;
+               u64 ingress_nobuffer_discards;
+               u64 egress_discarded_frames;
+               u64 egress_confirmed_frames;
+       } page_2;
+       /**
+        * struct raw - raw statistics structure
+        */
+       struct {
+               u64 counter[DPNI_STATISTICS_CNT];
+       } raw;
+};
+
+int dpni_get_statistics(struct fsl_mc_io       *mc_io,
+                       u32                     cmd_flags,
+                       u16                     token,
+                       u8                      page,
+                       union dpni_statistics   *stat);
+
+/**
+ * Enable auto-negotiation
+ */
+#define DPNI_LINK_OPT_AUTONEG          0x0000000000000001ULL
+/**
+ * Enable half-duplex mode
+ */
+#define DPNI_LINK_OPT_HALF_DUPLEX      0x0000000000000002ULL
+/**
+ * Enable pause frames
+ */
+#define DPNI_LINK_OPT_PAUSE            0x0000000000000004ULL
+/**
+ * Enable a-symmetric pause frames
+ */
+#define DPNI_LINK_OPT_ASYM_PAUSE       0x0000000000000008ULL
+
+/**
+ * struct - Structure representing DPNI link configuration
+ * @rate: Rate
+ * @options: Mask of available options; use 'DPNI_LINK_OPT_<X>' values
+ */
+struct dpni_link_cfg {
+       u32 rate;
+       u64 options;
+};
+
+int dpni_set_link_cfg(struct fsl_mc_io                 *mc_io,
+                     u32                               cmd_flags,
+                     u16                               token,
+                     const struct dpni_link_cfg        *cfg);
+
+/**
+ * struct dpni_link_state - Structure representing DPNI link state
+ * @rate: Rate
+ * @options: Mask of available options; use 'DPNI_LINK_OPT_<X>' values
+ * @up: Link state; '0' for down, '1' for up
+ */
+struct dpni_link_state {
+       u32     rate;
+       u64     options;
+       int     up;
+};
+
+int dpni_get_link_state(struct fsl_mc_io       *mc_io,
+                       u32                     cmd_flags,
+                       u16                     token,
+                       struct dpni_link_state  *state);
+
+int dpni_set_max_frame_length(struct fsl_mc_io *mc_io,
+                             u32               cmd_flags,
+                             u16               token,
+                             u16               max_frame_length);
+
+int dpni_get_max_frame_length(struct fsl_mc_io *mc_io,
+                             u32               cmd_flags,
+                             u16               token,
+                             u16               *max_frame_length);
+
+int dpni_set_multicast_promisc(struct fsl_mc_io *mc_io,
+                              u32              cmd_flags,
+                              u16              token,
+                              int              en);
+
+int dpni_get_multicast_promisc(struct fsl_mc_io *mc_io,
+                              u32              cmd_flags,
+                              u16              token,
+                              int              *en);
+
+int dpni_set_unicast_promisc(struct fsl_mc_io  *mc_io,
+                            u32                cmd_flags,
+                            u16                token,
+                            int                en);
+
+int dpni_get_unicast_promisc(struct fsl_mc_io  *mc_io,
+                            u32                cmd_flags,
+                            u16                token,
+                            int                *en);
+
+int dpni_set_primary_mac_addr(struct fsl_mc_io *mc_io,
+                             u32               cmd_flags,
+                             u16               token,
+                             const u8          mac_addr[6]);
+
+int dpni_get_primary_mac_addr(struct fsl_mc_io *mc_io,
+                             u32               cmd_flags,
+                             u16               token,
+                             u8                mac_addr[6]);
+
+int dpni_get_port_mac_addr(struct fsl_mc_io    *mc_io,
+                          u32                  cm_flags,
+                          u16                  token,
+                          u8                   mac_addr[6]);
+
+int dpni_add_mac_addr(struct fsl_mc_io *mc_io,
+                     u32               cmd_flags,
+                     u16               token,
+                     const u8          mac_addr[6]);
+
+int dpni_remove_mac_addr(struct fsl_mc_io      *mc_io,
+                        u32                    cmd_flags,
+                        u16                    token,
+                        const u8               mac_addr[6]);
+
+int dpni_clear_mac_filters(struct fsl_mc_io    *mc_io,
+                          u32                  cmd_flags,
+                          u16                  token,
+                          int                  unicast,
+                          int                  multicast);
+
+/**
+ * enum dpni_dist_mode - DPNI distribution mode
+ * @DPNI_DIST_MODE_NONE: No distribution
+ * @DPNI_DIST_MODE_HASH: Use hash distribution; only relevant if
+ *             the 'DPNI_OPT_DIST_HASH' option was set at DPNI creation
+ * @DPNI_DIST_MODE_FS:  Use explicit flow steering; only relevant if
+ *      the 'DPNI_OPT_DIST_FS' option was set at DPNI creation
+ */
+enum dpni_dist_mode {
+       DPNI_DIST_MODE_NONE = 0,
+       DPNI_DIST_MODE_HASH = 1,
+       DPNI_DIST_MODE_FS = 2
+};
+
+/**
+ * enum dpni_fs_miss_action -   DPNI Flow Steering miss action
+ * @DPNI_FS_MISS_DROP: In case of no-match, drop the frame
+ * @DPNI_FS_MISS_EXPLICIT_FLOWID: In case of no-match, use explicit flow-id
+ * @DPNI_FS_MISS_HASH: In case of no-match, distribute using hash
+ */
+enum dpni_fs_miss_action {
+       DPNI_FS_MISS_DROP = 0,
+       DPNI_FS_MISS_EXPLICIT_FLOWID = 1,
+       DPNI_FS_MISS_HASH = 2
+};
+
+/**
+ * struct dpni_fs_tbl_cfg - Flow Steering table configuration
+ * @miss_action: Miss action selection
+ * @default_flow_id: Used when 'miss_action = DPNI_FS_MISS_EXPLICIT_FLOWID'
+ */
+struct dpni_fs_tbl_cfg {
+       enum dpni_fs_miss_action        miss_action;
+       u16                             default_flow_id;
+};
+
+int dpni_prepare_key_cfg(const struct dpkg_profile_cfg *cfg,
+                        u8 *key_cfg_buf);
+
+/**
+ * struct dpni_rx_tc_dist_cfg - Rx traffic class distribution configuration
+ * @dist_size: Set the distribution size;
+ *     supported values: 1,2,3,4,6,7,8,12,14,16,24,28,32,48,56,64,96,
+ *     112,128,192,224,256,384,448,512,768,896,1024
+ * @dist_mode: Distribution mode
+ * @key_cfg_iova: I/O virtual address of 256 bytes DMA-able memory filled with
+ *             the extractions to be used for the distribution key by calling
+ *             dpni_prepare_key_cfg() relevant only when
+ *             'dist_mode != DPNI_DIST_MODE_NONE', otherwise it can be '0'
+ * @fs_cfg: Flow Steering table configuration; only relevant if
+ *             'dist_mode = DPNI_DIST_MODE_FS'
+ */
+struct dpni_rx_tc_dist_cfg {
+       u16                     dist_size;
+       enum dpni_dist_mode     dist_mode;
+       u64                     key_cfg_iova;
+       struct dpni_fs_tbl_cfg  fs_cfg;
+};
+
+int 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);
+
+/**
+ * enum dpni_dest - DPNI destination types
+ * @DPNI_DEST_NONE: Unassigned destination; The queue is set in parked mode and
+ *             does not generate FQDAN notifications; user is expected to
+ *             dequeue from the queue based on polling or other user-defined
+ *             method
+ * @DPNI_DEST_DPIO: The queue is set in schedule mode and generates FQDAN
+ *             notifications to the specified DPIO; user is expected to dequeue
+ *             from the queue only after notification is received
+ * @DPNI_DEST_DPCON: The queue is set in schedule mode and does not generate
+ *             FQDAN notifications, but is connected to the specified DPCON
+ *             object; user is expected to dequeue from the DPCON channel
+ */
+enum dpni_dest {
+       DPNI_DEST_NONE = 0,
+       DPNI_DEST_DPIO = 1,
+       DPNI_DEST_DPCON = 2
+};
+
+/**
+ * struct dpni_queue - Queue structure
+ * @user_context: User data, presented to the user along with any frames from
+ *             this queue. Not relevant for Tx queues.
+ */
+struct dpni_queue {
+/**
+ * struct destination - Destination structure
+ * @id: ID of the destination, only relevant if DEST_TYPE is > 0.
+ *             Identifies either a DPIO or a DPCON object. Not relevant for
+ *             Tx queues.
+ * @type: May be one of the following:
+ *     0 - No destination, queue can be manually queried, but will not
+ *             push traffic or notifications to a DPIO;
+ *     1 - The destination is a DPIO. When traffic becomes available in
+ *             the queue a FQDAN (FQ data available notification) will be
+ *             generated to selected DPIO;
+ *     2 - The destination is a DPCON. The queue is associated with a
+ *             DPCON object for the purpose of scheduling between multiple
+ *             queues. The DPCON may be independently configured to
+ *             generate notifications. Not relevant for Tx queues.
+ * @hold_active: Hold active, maintains a queue scheduled for longer
+ *             in a DPIO during dequeue to reduce spread of traffic.
+ *             Only relevant if queues are not affined to a single DPIO.
+ */
+       struct {
+               u16 id;
+               enum dpni_dest type;
+               char hold_active;
+               u8 priority;
+       } destination;
+       u64 user_context;
+       struct {
+               u64 value;
+               char stash_control;
+       } flc;
+};
+
+/**
+ * struct dpni_queue_id - Queue identification, used for enqueue commands
+ *                     or queue control
+ * @fqid: FQID used for enqueueing to and/or configuration of this specific FQ
+ * @qdbin: Queueing bin, used to enqueue using QDID, DQBIN, QPRI. Only relevant
+ *             for Tx queues.
+ */
+struct dpni_queue_id {
+       u32 fqid;
+       u16 qdbin;
+};
+
+/**
+ * Set User Context
+ */
+#define DPNI_QUEUE_OPT_USER_CTX                0x00000001
+#define DPNI_QUEUE_OPT_DEST            0x00000002
+#define DPNI_QUEUE_OPT_FLC             0x00000004
+#define DPNI_QUEUE_OPT_HOLD_ACTIVE     0x00000008
+
+int 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);
+
+int 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);
+
+/**
+ * enum dpni_congestion_unit - DPNI congestion units
+ * @DPNI_CONGESTION_UNIT_BYTES: bytes units
+ * @DPNI_CONGESTION_UNIT_FRAMES: frames units
+ */
+enum dpni_congestion_unit {
+       DPNI_CONGESTION_UNIT_BYTES = 0,
+       DPNI_CONGESTION_UNIT_FRAMES
+};
+
+/**
+ * enum dpni_congestion_point - Structure representing congestion point
+ * @DPNI_CP_QUEUE: Set taildrop per queue, identified by QUEUE_TYPE, TC and
+ *             QUEUE_INDEX
+ * @DPNI_CP_GROUP: Set taildrop per queue group. Depending on options used to
+ *             define the DPNI this can be either per TC (default) or per
+ *             interface (DPNI_OPT_SHARED_CONGESTION set at DPNI create).
+ *             QUEUE_INDEX is ignored if this type is used.
+ */
+enum dpni_congestion_point {
+       DPNI_CP_QUEUE,
+       DPNI_CP_GROUP,
+};
+
+/**
+ * struct dpni_taildrop - Structure representing the taildrop
+ * @enable:    Indicates whether the taildrop is active or not.
+ * @units:     Indicates the unit of THRESHOLD. Queue taildrop only supports
+ *             byte units, this field is ignored and assumed = 0 if
+ *             CONGESTION_POINT is 0.
+ * @threshold: Threshold value, in units identified by UNITS field. Value 0
+ *             cannot be used as a valid taildrop threshold, THRESHOLD must
+ *             be > 0 if the taildrop is enabled.
+ */
+struct dpni_taildrop {
+       char enable;
+       enum dpni_congestion_unit units;
+       u32 threshold;
+};
+
+int dpni_set_taildrop(struct fsl_mc_io *mc_io,
+                     u32 cmd_flags,
+                     u16 token,
+                     enum dpni_congestion_point cg_point,
+                     enum dpni_queue_type q_type,
+                     u8 tc,
+                     u8 q_index,
+                     struct dpni_taildrop *taildrop);
+
+int dpni_get_taildrop(struct fsl_mc_io *mc_io,
+                     u32 cmd_flags,
+                     u16 token,
+                     enum dpni_congestion_point cg_point,
+                     enum dpni_queue_type q_type,
+                     u8 tc,
+                     u8 q_index,
+                     struct dpni_taildrop *taildrop);
+
+/**
+ * struct dpni_rule_cfg - Rule configuration for table lookup
+ * @key_iova: I/O virtual address of the key (must be in DMA-able memory)
+ * @mask_iova: I/O virtual address of the mask (must be in DMA-able memory)
+ * @key_size: key and mask size (in bytes)
+ */
+struct dpni_rule_cfg {
+       u64     key_iova;
+       u64     mask_iova;
+       u8      key_size;
+};
+
+#endif /* __FSL_DPNI_H */
diff --git a/drivers/staging/fsl-dpaa2/ethernet/net.h b/drivers/staging/fsl-dpaa2/ethernet/net.h
new file mode 100644 (file)
index 0000000..5020dee
--- /dev/null
@@ -0,0 +1,480 @@
+/* Copyright 2013-2015 Freescale Semiconductor Inc.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of the above-listed copyright holders nor the
+ * names of any contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ *
+ * ALTERNATIVELY, this software may be distributed under the terms of the
+ * GNU General Public License ("GPL") as published by the Free Software
+ * Foundation, either version 2 of that License or (at your option) any
+ * later version.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+#ifndef __FSL_NET_H
+#define __FSL_NET_H
+
+#define LAST_HDR_INDEX 0xFFFFFFFF
+
+/*****************************************************************************/
+/*                Protocol fields                                            */
+/*****************************************************************************/
+
+/*************************  Ethernet fields  *********************************/
+#define NH_FLD_ETH_DA                         (1)
+#define NH_FLD_ETH_SA                         (NH_FLD_ETH_DA << 1)
+#define NH_FLD_ETH_LENGTH                     (NH_FLD_ETH_DA << 2)
+#define NH_FLD_ETH_TYPE                       (NH_FLD_ETH_DA << 3)
+#define NH_FLD_ETH_FINAL_CKSUM                (NH_FLD_ETH_DA << 4)
+#define NH_FLD_ETH_PADDING                    (NH_FLD_ETH_DA << 5)
+#define NH_FLD_ETH_ALL_FIELDS                 ((NH_FLD_ETH_DA << 6) - 1)
+
+#define NH_FLD_ETH_ADDR_SIZE                 6
+
+/***************************  VLAN fields  ***********************************/
+#define NH_FLD_VLAN_VPRI                      (1)
+#define NH_FLD_VLAN_CFI                       (NH_FLD_VLAN_VPRI << 1)
+#define NH_FLD_VLAN_VID                       (NH_FLD_VLAN_VPRI << 2)
+#define NH_FLD_VLAN_LENGTH                    (NH_FLD_VLAN_VPRI << 3)
+#define NH_FLD_VLAN_TYPE                      (NH_FLD_VLAN_VPRI << 4)
+#define NH_FLD_VLAN_ALL_FIELDS                ((NH_FLD_VLAN_VPRI << 5) - 1)
+
+#define NH_FLD_VLAN_TCI                       (NH_FLD_VLAN_VPRI | \
+                                              NH_FLD_VLAN_CFI | \
+                                              NH_FLD_VLAN_VID)
+
+/************************  IP (generic) fields  ******************************/
+#define NH_FLD_IP_VER                         (1)
+#define NH_FLD_IP_DSCP                        (NH_FLD_IP_VER << 2)
+#define NH_FLD_IP_ECN                         (NH_FLD_IP_VER << 3)
+#define NH_FLD_IP_PROTO                       (NH_FLD_IP_VER << 4)
+#define NH_FLD_IP_SRC                         (NH_FLD_IP_VER << 5)
+#define NH_FLD_IP_DST                         (NH_FLD_IP_VER << 6)
+#define NH_FLD_IP_TOS_TC                      (NH_FLD_IP_VER << 7)
+#define NH_FLD_IP_ID                          (NH_FLD_IP_VER << 8)
+#define NH_FLD_IP_ALL_FIELDS                  ((NH_FLD_IP_VER << 9) - 1)
+
+#define NH_FLD_IP_PROTO_SIZE                  1
+
+/*****************************  IPV4 fields  *********************************/
+#define NH_FLD_IPV4_VER                       (1)
+#define NH_FLD_IPV4_HDR_LEN                   (NH_FLD_IPV4_VER << 1)
+#define NH_FLD_IPV4_TOS                       (NH_FLD_IPV4_VER << 2)
+#define NH_FLD_IPV4_TOTAL_LEN                 (NH_FLD_IPV4_VER << 3)
+#define NH_FLD_IPV4_ID                        (NH_FLD_IPV4_VER << 4)
+#define NH_FLD_IPV4_FLAG_D                    (NH_FLD_IPV4_VER << 5)
+#define NH_FLD_IPV4_FLAG_M                    (NH_FLD_IPV4_VER << 6)
+#define NH_FLD_IPV4_OFFSET                    (NH_FLD_IPV4_VER << 7)
+#define NH_FLD_IPV4_TTL                       (NH_FLD_IPV4_VER << 8)
+#define NH_FLD_IPV4_PROTO                     (NH_FLD_IPV4_VER << 9)
+#define NH_FLD_IPV4_CKSUM                     (NH_FLD_IPV4_VER << 10)
+#define NH_FLD_IPV4_SRC_IP                    (NH_FLD_IPV4_VER << 11)
+#define NH_FLD_IPV4_DST_IP                    (NH_FLD_IPV4_VER << 12)
+#define NH_FLD_IPV4_OPTS                      (NH_FLD_IPV4_VER << 13)
+#define NH_FLD_IPV4_OPTS_COUNT                (NH_FLD_IPV4_VER << 14)
+#define NH_FLD_IPV4_ALL_FIELDS                ((NH_FLD_IPV4_VER << 15) - 1)
+
+#define NH_FLD_IPV4_ADDR_SIZE                 4
+#define NH_FLD_IPV4_PROTO_SIZE                1
+
+/*****************************  IPV6 fields  *********************************/
+#define NH_FLD_IPV6_VER                       (1)
+#define NH_FLD_IPV6_TC                        (NH_FLD_IPV6_VER << 1)
+#define NH_FLD_IPV6_SRC_IP                    (NH_FLD_IPV6_VER << 2)
+#define NH_FLD_IPV6_DST_IP                    (NH_FLD_IPV6_VER << 3)
+#define NH_FLD_IPV6_NEXT_HDR                  (NH_FLD_IPV6_VER << 4)
+#define NH_FLD_IPV6_FL                        (NH_FLD_IPV6_VER << 5)
+#define NH_FLD_IPV6_HOP_LIMIT                 (NH_FLD_IPV6_VER << 6)
+#define NH_FLD_IPV6_ID                       (NH_FLD_IPV6_VER << 7)
+#define NH_FLD_IPV6_ALL_FIELDS                ((NH_FLD_IPV6_VER << 8) - 1)
+
+#define NH_FLD_IPV6_ADDR_SIZE                 16
+#define NH_FLD_IPV6_NEXT_HDR_SIZE             1
+
+/*****************************  ICMP fields  *********************************/
+#define NH_FLD_ICMP_TYPE                      (1)
+#define NH_FLD_ICMP_CODE                      (NH_FLD_ICMP_TYPE << 1)
+#define NH_FLD_ICMP_CKSUM                     (NH_FLD_ICMP_TYPE << 2)
+#define NH_FLD_ICMP_ID                        (NH_FLD_ICMP_TYPE << 3)
+#define NH_FLD_ICMP_SQ_NUM                    (NH_FLD_ICMP_TYPE << 4)
+#define NH_FLD_ICMP_ALL_FIELDS                ((NH_FLD_ICMP_TYPE << 5) - 1)
+
+#define NH_FLD_ICMP_CODE_SIZE                 1
+#define NH_FLD_ICMP_TYPE_SIZE                 1
+
+/*****************************  IGMP fields  *********************************/
+#define NH_FLD_IGMP_VERSION                   (1)
+#define NH_FLD_IGMP_TYPE                      (NH_FLD_IGMP_VERSION << 1)
+#define NH_FLD_IGMP_CKSUM                     (NH_FLD_IGMP_VERSION << 2)
+#define NH_FLD_IGMP_DATA                      (NH_FLD_IGMP_VERSION << 3)
+#define NH_FLD_IGMP_ALL_FIELDS                ((NH_FLD_IGMP_VERSION << 4) - 1)
+
+/*****************************  TCP fields  **********************************/
+#define NH_FLD_TCP_PORT_SRC                   (1)
+#define NH_FLD_TCP_PORT_DST                   (NH_FLD_TCP_PORT_SRC << 1)
+#define NH_FLD_TCP_SEQ                        (NH_FLD_TCP_PORT_SRC << 2)
+#define NH_FLD_TCP_ACK                        (NH_FLD_TCP_PORT_SRC << 3)
+#define NH_FLD_TCP_OFFSET                     (NH_FLD_TCP_PORT_SRC << 4)
+#define NH_FLD_TCP_FLAGS                      (NH_FLD_TCP_PORT_SRC << 5)
+#define NH_FLD_TCP_WINDOW                     (NH_FLD_TCP_PORT_SRC << 6)
+#define NH_FLD_TCP_CKSUM                      (NH_FLD_TCP_PORT_SRC << 7)
+#define NH_FLD_TCP_URGPTR                     (NH_FLD_TCP_PORT_SRC << 8)
+#define NH_FLD_TCP_OPTS                       (NH_FLD_TCP_PORT_SRC << 9)
+#define NH_FLD_TCP_OPTS_COUNT                 (NH_FLD_TCP_PORT_SRC << 10)
+#define NH_FLD_TCP_ALL_FIELDS                 ((NH_FLD_TCP_PORT_SRC << 11) - 1)
+
+#define NH_FLD_TCP_PORT_SIZE                  2
+
+/*****************************  UDP fields  **********************************/
+#define NH_FLD_UDP_PORT_SRC                   (1)
+#define NH_FLD_UDP_PORT_DST                   (NH_FLD_UDP_PORT_SRC << 1)
+#define NH_FLD_UDP_LEN                        (NH_FLD_UDP_PORT_SRC << 2)
+#define NH_FLD_UDP_CKSUM                      (NH_FLD_UDP_PORT_SRC << 3)
+#define NH_FLD_UDP_ALL_FIELDS                 ((NH_FLD_UDP_PORT_SRC << 4) - 1)
+
+#define NH_FLD_UDP_PORT_SIZE                  2
+
+/***************************  UDP-lite fields  *******************************/
+#define NH_FLD_UDP_LITE_PORT_SRC              (1)
+#define NH_FLD_UDP_LITE_PORT_DST              (NH_FLD_UDP_LITE_PORT_SRC << 1)
+#define NH_FLD_UDP_LITE_ALL_FIELDS \
+       ((NH_FLD_UDP_LITE_PORT_SRC << 2) - 1)
+
+#define NH_FLD_UDP_LITE_PORT_SIZE             2
+
+/***************************  UDP-encap-ESP fields  **************************/
+#define NH_FLD_UDP_ENC_ESP_PORT_SRC         (1)
+#define NH_FLD_UDP_ENC_ESP_PORT_DST         (NH_FLD_UDP_ENC_ESP_PORT_SRC << 1)
+#define NH_FLD_UDP_ENC_ESP_LEN              (NH_FLD_UDP_ENC_ESP_PORT_SRC << 2)
+#define NH_FLD_UDP_ENC_ESP_CKSUM            (NH_FLD_UDP_ENC_ESP_PORT_SRC << 3)
+#define NH_FLD_UDP_ENC_ESP_SPI              (NH_FLD_UDP_ENC_ESP_PORT_SRC << 4)
+#define NH_FLD_UDP_ENC_ESP_SEQUENCE_NUM     (NH_FLD_UDP_ENC_ESP_PORT_SRC << 5)
+#define NH_FLD_UDP_ENC_ESP_ALL_FIELDS \
+       ((NH_FLD_UDP_ENC_ESP_PORT_SRC << 6) - 1)
+
+#define NH_FLD_UDP_ENC_ESP_PORT_SIZE        2
+#define NH_FLD_UDP_ENC_ESP_SPI_SIZE         4
+
+/*****************************  SCTP fields  *********************************/
+#define NH_FLD_SCTP_PORT_SRC                  (1)
+#define NH_FLD_SCTP_PORT_DST                  (NH_FLD_SCTP_PORT_SRC << 1)
+#define NH_FLD_SCTP_VER_TAG                   (NH_FLD_SCTP_PORT_SRC << 2)
+#define NH_FLD_SCTP_CKSUM                     (NH_FLD_SCTP_PORT_SRC << 3)
+#define NH_FLD_SCTP_ALL_FIELDS                ((NH_FLD_SCTP_PORT_SRC << 4) - 1)
+
+#define NH_FLD_SCTP_PORT_SIZE                 2
+
+/*****************************  DCCP fields  *********************************/
+#define NH_FLD_DCCP_PORT_SRC                  (1)
+#define NH_FLD_DCCP_PORT_DST                  (NH_FLD_DCCP_PORT_SRC << 1)
+#define NH_FLD_DCCP_ALL_FIELDS                ((NH_FLD_DCCP_PORT_SRC << 2) - 1)
+
+#define NH_FLD_DCCP_PORT_SIZE                 2
+
+/*****************************  IPHC fields  *********************************/
+#define NH_FLD_IPHC_CID                       (1)
+#define NH_FLD_IPHC_CID_TYPE                  (NH_FLD_IPHC_CID << 1)
+#define NH_FLD_IPHC_HCINDEX                   (NH_FLD_IPHC_CID << 2)
+#define NH_FLD_IPHC_GEN                       (NH_FLD_IPHC_CID << 3)
+#define NH_FLD_IPHC_D_BIT                     (NH_FLD_IPHC_CID << 4)
+#define NH_FLD_IPHC_ALL_FIELDS                ((NH_FLD_IPHC_CID << 5) - 1)
+
+/*****************************  SCTP fields  *********************************/
+#define NH_FLD_SCTP_CHUNK_DATA_TYPE           (1)
+#define NH_FLD_SCTP_CHUNK_DATA_FLAGS          (NH_FLD_SCTP_CHUNK_DATA_TYPE << 1)
+#define NH_FLD_SCTP_CHUNK_DATA_LENGTH         (NH_FLD_SCTP_CHUNK_DATA_TYPE << 2)
+#define NH_FLD_SCTP_CHUNK_DATA_TSN            (NH_FLD_SCTP_CHUNK_DATA_TYPE << 3)
+#define NH_FLD_SCTP_CHUNK_DATA_STREAM_ID      (NH_FLD_SCTP_CHUNK_DATA_TYPE << 4)
+#define NH_FLD_SCTP_CHUNK_DATA_STREAM_SQN     (NH_FLD_SCTP_CHUNK_DATA_TYPE << 5)
+#define NH_FLD_SCTP_CHUNK_DATA_PAYLOAD_PID    (NH_FLD_SCTP_CHUNK_DATA_TYPE << 6)
+#define NH_FLD_SCTP_CHUNK_DATA_UNORDERED      (NH_FLD_SCTP_CHUNK_DATA_TYPE << 7)
+#define NH_FLD_SCTP_CHUNK_DATA_BEGGINING      (NH_FLD_SCTP_CHUNK_DATA_TYPE << 8)
+#define NH_FLD_SCTP_CHUNK_DATA_END            (NH_FLD_SCTP_CHUNK_DATA_TYPE << 9)
+#define NH_FLD_SCTP_CHUNK_DATA_ALL_FIELDS \
+       ((NH_FLD_SCTP_CHUNK_DATA_TYPE << 10) - 1)
+
+/***************************  L2TPV2 fields  *********************************/
+#define NH_FLD_L2TPV2_TYPE_BIT                (1)
+#define NH_FLD_L2TPV2_LENGTH_BIT              (NH_FLD_L2TPV2_TYPE_BIT << 1)
+#define NH_FLD_L2TPV2_SEQUENCE_BIT            (NH_FLD_L2TPV2_TYPE_BIT << 2)
+#define NH_FLD_L2TPV2_OFFSET_BIT              (NH_FLD_L2TPV2_TYPE_BIT << 3)
+#define NH_FLD_L2TPV2_PRIORITY_BIT            (NH_FLD_L2TPV2_TYPE_BIT << 4)
+#define NH_FLD_L2TPV2_VERSION                 (NH_FLD_L2TPV2_TYPE_BIT << 5)
+#define NH_FLD_L2TPV2_LEN                     (NH_FLD_L2TPV2_TYPE_BIT << 6)
+#define NH_FLD_L2TPV2_TUNNEL_ID               (NH_FLD_L2TPV2_TYPE_BIT << 7)
+#define NH_FLD_L2TPV2_SESSION_ID              (NH_FLD_L2TPV2_TYPE_BIT << 8)
+#define NH_FLD_L2TPV2_NS                      (NH_FLD_L2TPV2_TYPE_BIT << 9)
+#define NH_FLD_L2TPV2_NR                      (NH_FLD_L2TPV2_TYPE_BIT << 10)
+#define NH_FLD_L2TPV2_OFFSET_SIZE             (NH_FLD_L2TPV2_TYPE_BIT << 11)
+#define NH_FLD_L2TPV2_FIRST_BYTE              (NH_FLD_L2TPV2_TYPE_BIT << 12)
+#define NH_FLD_L2TPV2_ALL_FIELDS \
+       ((NH_FLD_L2TPV2_TYPE_BIT << 13) - 1)
+
+/***************************  L2TPV3 fields  *********************************/
+#define NH_FLD_L2TPV3_CTRL_TYPE_BIT           (1)
+#define NH_FLD_L2TPV3_CTRL_LENGTH_BIT         (NH_FLD_L2TPV3_CTRL_TYPE_BIT << 1)
+#define NH_FLD_L2TPV3_CTRL_SEQUENCE_BIT       (NH_FLD_L2TPV3_CTRL_TYPE_BIT << 2)
+#define NH_FLD_L2TPV3_CTRL_VERSION            (NH_FLD_L2TPV3_CTRL_TYPE_BIT << 3)
+#define NH_FLD_L2TPV3_CTRL_LENGTH             (NH_FLD_L2TPV3_CTRL_TYPE_BIT << 4)
+#define NH_FLD_L2TPV3_CTRL_CONTROL            (NH_FLD_L2TPV3_CTRL_TYPE_BIT << 5)
+#define NH_FLD_L2TPV3_CTRL_SENT               (NH_FLD_L2TPV3_CTRL_TYPE_BIT << 6)
+#define NH_FLD_L2TPV3_CTRL_RECV               (NH_FLD_L2TPV3_CTRL_TYPE_BIT << 7)
+#define NH_FLD_L2TPV3_CTRL_FIRST_BYTE         (NH_FLD_L2TPV3_CTRL_TYPE_BIT << 8)
+#define NH_FLD_L2TPV3_CTRL_ALL_FIELDS \
+       ((NH_FLD_L2TPV3_CTRL_TYPE_BIT << 9) - 1)
+
+#define NH_FLD_L2TPV3_SESS_TYPE_BIT           (1)
+#define NH_FLD_L2TPV3_SESS_VERSION            (NH_FLD_L2TPV3_SESS_TYPE_BIT << 1)
+#define NH_FLD_L2TPV3_SESS_ID                 (NH_FLD_L2TPV3_SESS_TYPE_BIT << 2)
+#define NH_FLD_L2TPV3_SESS_COOKIE             (NH_FLD_L2TPV3_SESS_TYPE_BIT << 3)
+#define NH_FLD_L2TPV3_SESS_ALL_FIELDS \
+       ((NH_FLD_L2TPV3_SESS_TYPE_BIT << 4) - 1)
+
+/****************************  PPP fields  ***********************************/
+#define NH_FLD_PPP_PID                        (1)
+#define NH_FLD_PPP_COMPRESSED                 (NH_FLD_PPP_PID << 1)
+#define NH_FLD_PPP_ALL_FIELDS                 ((NH_FLD_PPP_PID << 2) - 1)
+
+/**************************  PPPoE fields  ***********************************/
+#define NH_FLD_PPPOE_VER                      (1)
+#define NH_FLD_PPPOE_TYPE                     (NH_FLD_PPPOE_VER << 1)
+#define NH_FLD_PPPOE_CODE                     (NH_FLD_PPPOE_VER << 2)
+#define NH_FLD_PPPOE_SID                      (NH_FLD_PPPOE_VER << 3)
+#define NH_FLD_PPPOE_LEN                      (NH_FLD_PPPOE_VER << 4)
+#define NH_FLD_PPPOE_SESSION                  (NH_FLD_PPPOE_VER << 5)
+#define NH_FLD_PPPOE_PID                      (NH_FLD_PPPOE_VER << 6)
+#define NH_FLD_PPPOE_ALL_FIELDS               ((NH_FLD_PPPOE_VER << 7) - 1)
+
+/*************************  PPP-Mux fields  **********************************/
+#define NH_FLD_PPPMUX_PID                     (1)
+#define NH_FLD_PPPMUX_CKSUM                   (NH_FLD_PPPMUX_PID << 1)
+#define NH_FLD_PPPMUX_COMPRESSED              (NH_FLD_PPPMUX_PID << 2)
+#define NH_FLD_PPPMUX_ALL_FIELDS              ((NH_FLD_PPPMUX_PID << 3) - 1)
+
+/***********************  PPP-Mux sub-frame fields  **************************/
+#define NH_FLD_PPPMUX_SUBFRM_PFF            (1)
+#define NH_FLD_PPPMUX_SUBFRM_LXT            (NH_FLD_PPPMUX_SUBFRM_PFF << 1)
+#define NH_FLD_PPPMUX_SUBFRM_LEN            (NH_FLD_PPPMUX_SUBFRM_PFF << 2)
+#define NH_FLD_PPPMUX_SUBFRM_PID            (NH_FLD_PPPMUX_SUBFRM_PFF << 3)
+#define NH_FLD_PPPMUX_SUBFRM_USE_PID        (NH_FLD_PPPMUX_SUBFRM_PFF << 4)
+#define NH_FLD_PPPMUX_SUBFRM_ALL_FIELDS \
+       ((NH_FLD_PPPMUX_SUBFRM_PFF << 5) - 1)
+
+/***************************  LLC fields  ************************************/
+#define NH_FLD_LLC_DSAP                       (1)
+#define NH_FLD_LLC_SSAP                       (NH_FLD_LLC_DSAP << 1)
+#define NH_FLD_LLC_CTRL                       (NH_FLD_LLC_DSAP << 2)
+#define NH_FLD_LLC_ALL_FIELDS                 ((NH_FLD_LLC_DSAP << 3) - 1)
+
+/***************************  NLPID fields  **********************************/
+#define NH_FLD_NLPID_NLPID                    (1)
+#define NH_FLD_NLPID_ALL_FIELDS               ((NH_FLD_NLPID_NLPID << 1) - 1)
+
+/***************************  SNAP fields  ***********************************/
+#define NH_FLD_SNAP_OUI                       (1)
+#define NH_FLD_SNAP_PID                       (NH_FLD_SNAP_OUI << 1)
+#define NH_FLD_SNAP_ALL_FIELDS                ((NH_FLD_SNAP_OUI << 2) - 1)
+
+/***************************  LLC SNAP fields  *******************************/
+#define NH_FLD_LLC_SNAP_TYPE                  (1)
+#define NH_FLD_LLC_SNAP_ALL_FIELDS            ((NH_FLD_LLC_SNAP_TYPE << 1) - 1)
+
+#define NH_FLD_ARP_HTYPE                      (1)
+#define NH_FLD_ARP_PTYPE                      (NH_FLD_ARP_HTYPE << 1)
+#define NH_FLD_ARP_HLEN                       (NH_FLD_ARP_HTYPE << 2)
+#define NH_FLD_ARP_PLEN                       (NH_FLD_ARP_HTYPE << 3)
+#define NH_FLD_ARP_OPER                       (NH_FLD_ARP_HTYPE << 4)
+#define NH_FLD_ARP_SHA                        (NH_FLD_ARP_HTYPE << 5)
+#define NH_FLD_ARP_SPA                        (NH_FLD_ARP_HTYPE << 6)
+#define NH_FLD_ARP_THA                        (NH_FLD_ARP_HTYPE << 7)
+#define NH_FLD_ARP_TPA                        (NH_FLD_ARP_HTYPE << 8)
+#define NH_FLD_ARP_ALL_FIELDS                 ((NH_FLD_ARP_HTYPE << 9) - 1)
+
+/***************************  RFC2684 fields  ********************************/
+#define NH_FLD_RFC2684_LLC                    (1)
+#define NH_FLD_RFC2684_NLPID                  (NH_FLD_RFC2684_LLC << 1)
+#define NH_FLD_RFC2684_OUI                    (NH_FLD_RFC2684_LLC << 2)
+#define NH_FLD_RFC2684_PID                    (NH_FLD_RFC2684_LLC << 3)
+#define NH_FLD_RFC2684_VPN_OUI                (NH_FLD_RFC2684_LLC << 4)
+#define NH_FLD_RFC2684_VPN_IDX                (NH_FLD_RFC2684_LLC << 5)
+#define NH_FLD_RFC2684_ALL_FIELDS             ((NH_FLD_RFC2684_LLC << 6) - 1)
+
+/***************************  User defined fields  ***************************/
+#define NH_FLD_USER_DEFINED_SRCPORT           (1)
+#define NH_FLD_USER_DEFINED_PCDID             (NH_FLD_USER_DEFINED_SRCPORT << 1)
+#define NH_FLD_USER_DEFINED_ALL_FIELDS \
+       ((NH_FLD_USER_DEFINED_SRCPORT << 2) - 1)
+
+/***************************  Payload fields  ********************************/
+#define NH_FLD_PAYLOAD_BUFFER                 (1)
+#define NH_FLD_PAYLOAD_SIZE                   (NH_FLD_PAYLOAD_BUFFER << 1)
+#define NH_FLD_MAX_FRM_SIZE                   (NH_FLD_PAYLOAD_BUFFER << 2)
+#define NH_FLD_MIN_FRM_SIZE                   (NH_FLD_PAYLOAD_BUFFER << 3)
+#define NH_FLD_PAYLOAD_TYPE                   (NH_FLD_PAYLOAD_BUFFER << 4)
+#define NH_FLD_FRAME_SIZE                     (NH_FLD_PAYLOAD_BUFFER << 5)
+#define NH_FLD_PAYLOAD_ALL_FIELDS             ((NH_FLD_PAYLOAD_BUFFER << 6) - 1)
+
+/***************************  GRE fields  ************************************/
+#define NH_FLD_GRE_TYPE                       (1)
+#define NH_FLD_GRE_ALL_FIELDS                 ((NH_FLD_GRE_TYPE << 1) - 1)
+
+/***************************  MINENCAP fields  *******************************/
+#define NH_FLD_MINENCAP_SRC_IP                (1)
+#define NH_FLD_MINENCAP_DST_IP                (NH_FLD_MINENCAP_SRC_IP << 1)
+#define NH_FLD_MINENCAP_TYPE                  (NH_FLD_MINENCAP_SRC_IP << 2)
+#define NH_FLD_MINENCAP_ALL_FIELDS \
+       ((NH_FLD_MINENCAP_SRC_IP << 3) - 1)
+
+/***************************  IPSEC AH fields  *******************************/
+#define NH_FLD_IPSEC_AH_SPI                   (1)
+#define NH_FLD_IPSEC_AH_NH                    (NH_FLD_IPSEC_AH_SPI << 1)
+#define NH_FLD_IPSEC_AH_ALL_FIELDS            ((NH_FLD_IPSEC_AH_SPI << 2) - 1)
+
+/***************************  IPSEC ESP fields  ******************************/
+#define NH_FLD_IPSEC_ESP_SPI                  (1)
+#define NH_FLD_IPSEC_ESP_SEQUENCE_NUM         (NH_FLD_IPSEC_ESP_SPI << 1)
+#define NH_FLD_IPSEC_ESP_ALL_FIELDS           ((NH_FLD_IPSEC_ESP_SPI << 2) - 1)
+
+#define NH_FLD_IPSEC_ESP_SPI_SIZE             4
+
+/***************************  MPLS fields  ***********************************/
+#define NH_FLD_MPLS_LABEL_STACK               (1)
+#define NH_FLD_MPLS_LABEL_STACK_ALL_FIELDS \
+       ((NH_FLD_MPLS_LABEL_STACK << 1) - 1)
+
+/***************************  MACSEC fields  *********************************/
+#define NH_FLD_MACSEC_SECTAG                  (1)
+#define NH_FLD_MACSEC_ALL_FIELDS              ((NH_FLD_MACSEC_SECTAG << 1) - 1)
+
+/***************************  GTP fields  ************************************/
+#define NH_FLD_GTP_TEID                       (1)
+
+/* Protocol options */
+
+/* Ethernet options */
+#define        NH_OPT_ETH_BROADCAST                    1
+#define        NH_OPT_ETH_MULTICAST                    2
+#define        NH_OPT_ETH_UNICAST                      3
+#define        NH_OPT_ETH_BPDU                         4
+
+#define NH_ETH_IS_MULTICAST_ADDR(addr) (addr[0] & 0x01)
+/* also applicable for broadcast */
+
+/* VLAN options */
+#define        NH_OPT_VLAN_CFI                         1
+
+/* IPV4 options */
+#define        NH_OPT_IPV4_UNICAST                     1
+#define        NH_OPT_IPV4_MULTICAST                   2
+#define        NH_OPT_IPV4_BROADCAST                   3
+#define        NH_OPT_IPV4_OPTION                      4
+#define        NH_OPT_IPV4_FRAG                        5
+#define        NH_OPT_IPV4_INITIAL_FRAG                6
+
+/* IPV6 options */
+#define        NH_OPT_IPV6_UNICAST                     1
+#define        NH_OPT_IPV6_MULTICAST                   2
+#define        NH_OPT_IPV6_OPTION                      3
+#define        NH_OPT_IPV6_FRAG                        4
+#define        NH_OPT_IPV6_INITIAL_FRAG                5
+
+/* General IP options (may be used for any version) */
+#define        NH_OPT_IP_FRAG                          1
+#define        NH_OPT_IP_INITIAL_FRAG                  2
+#define        NH_OPT_IP_OPTION                        3
+
+/* Minenc. options */
+#define        NH_OPT_MINENCAP_SRC_ADDR_PRESENT        1
+
+/* GRE. options */
+#define        NH_OPT_GRE_ROUTING_PRESENT              1
+
+/* TCP options */
+#define        NH_OPT_TCP_OPTIONS                      1
+#define        NH_OPT_TCP_CONTROL_HIGH_BITS            2
+#define        NH_OPT_TCP_CONTROL_LOW_BITS             3
+
+/* CAPWAP options */
+#define        NH_OPT_CAPWAP_DTLS                      1
+
+enum net_prot {
+       NET_PROT_NONE = 0,
+       NET_PROT_PAYLOAD,
+       NET_PROT_ETH,
+       NET_PROT_VLAN,
+       NET_PROT_IPV4,
+       NET_PROT_IPV6,
+       NET_PROT_IP,
+       NET_PROT_TCP,
+       NET_PROT_UDP,
+       NET_PROT_UDP_LITE,
+       NET_PROT_IPHC,
+       NET_PROT_SCTP,
+       NET_PROT_SCTP_CHUNK_DATA,
+       NET_PROT_PPPOE,
+       NET_PROT_PPP,
+       NET_PROT_PPPMUX,
+       NET_PROT_PPPMUX_SUBFRM,
+       NET_PROT_L2TPV2,
+       NET_PROT_L2TPV3_CTRL,
+       NET_PROT_L2TPV3_SESS,
+       NET_PROT_LLC,
+       NET_PROT_LLC_SNAP,
+       NET_PROT_NLPID,
+       NET_PROT_SNAP,
+       NET_PROT_MPLS,
+       NET_PROT_IPSEC_AH,
+       NET_PROT_IPSEC_ESP,
+       NET_PROT_UDP_ENC_ESP, /* RFC 3948 */
+       NET_PROT_MACSEC,
+       NET_PROT_GRE,
+       NET_PROT_MINENCAP,
+       NET_PROT_DCCP,
+       NET_PROT_ICMP,
+       NET_PROT_IGMP,
+       NET_PROT_ARP,
+       NET_PROT_CAPWAP_DATA,
+       NET_PROT_CAPWAP_CTRL,
+       NET_PROT_RFC2684,
+       NET_PROT_ICMPV6,
+       NET_PROT_FCOE,
+       NET_PROT_FIP,
+       NET_PROT_ISCSI,
+       NET_PROT_GTP,
+       NET_PROT_USER_DEFINED_L2,
+       NET_PROT_USER_DEFINED_L3,
+       NET_PROT_USER_DEFINED_L4,
+       NET_PROT_USER_DEFINED_L5,
+       NET_PROT_USER_DEFINED_SHIM1,
+       NET_PROT_USER_DEFINED_SHIM2,
+
+       NET_PROT_DUMMY_LAST
+};
+
+/*! IEEE8021.Q */
+#define NH_IEEE8021Q_ETYPE  0x8100
+#define NH_IEEE8021Q_HDR(etype, pcp, dei, vlan_id)     \
+           ((((u32)((etype) & 0xFFFF)) << 16) |        \
+           (((u32)((pcp) & 0x07)) << 13) |             \
+           (((u32)((dei) & 0x01)) << 12) |             \
+           (((u32)((vlan_id) & 0xFFF))))
+
+#endif /* __FSL_NET_H */