get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/49712/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 49712,
    "url": "http://patches.dpdk.org/api/patches/49712/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20190111122305.7133-14-shreyansh.jain@nxp.com/",
    "project": {
        "id": 1,
        "url": "http://patches.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<20190111122305.7133-14-shreyansh.jain@nxp.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20190111122305.7133-14-shreyansh.jain@nxp.com",
    "date": "2019-01-11T12:24:49",
    "name": "[v3,13/19] net/dpaa2: add dpdmux mc flib",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "ba6eef95218c0f6d6e12ff3f6a545e13dfb75c20",
    "submitter": {
        "id": 497,
        "url": "http://patches.dpdk.org/api/people/497/?format=api",
        "name": "Shreyansh Jain",
        "email": "shreyansh.jain@nxp.com"
    },
    "delegate": {
        "id": 319,
        "url": "http://patches.dpdk.org/api/users/319/?format=api",
        "username": "fyigit",
        "first_name": "Ferruh",
        "last_name": "Yigit",
        "email": "ferruh.yigit@amd.com"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/20190111122305.7133-14-shreyansh.jain@nxp.com/mbox/",
    "series": [
        {
            "id": 3123,
            "url": "http://patches.dpdk.org/api/series/3123/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=3123",
            "date": "2019-01-11T12:24:01",
            "name": "NXP DPAA2 fixes and enhancements",
            "version": 3,
            "mbox": "http://patches.dpdk.org/series/3123/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/49712/comments/",
    "check": "warning",
    "checks": "http://patches.dpdk.org/api/patches/49712/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@dpdk.org",
        "Delivered-To": "patchwork@dpdk.org",
        "Received": [
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id C6B301BC13;\n\tFri, 11 Jan 2019 13:24:52 +0100 (CET)",
            "from EUR03-VE1-obe.outbound.protection.outlook.com\n\t(mail-eopbgr50063.outbound.protection.outlook.com [40.107.5.63])\n\tby dpdk.org (Postfix) with ESMTP id C0F191BB7F\n\tfor <dev@dpdk.org>; Fri, 11 Jan 2019 13:24:51 +0100 (CET)",
            "from VI1PR04MB4688.eurprd04.prod.outlook.com (20.177.56.80) by\n\tVI1PR04MB5455.eurprd04.prod.outlook.com (20.178.121.149) with\n\tMicrosoft SMTP Server (version=TLS1_2,\n\tcipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id\n\t15.20.1516.14; Fri, 11 Jan 2019 12:24:49 +0000",
            "from VI1PR04MB4688.eurprd04.prod.outlook.com\n\t([fe80::b1eb:7e7e:7b90:7b4]) by\n\tVI1PR04MB4688.eurprd04.prod.outlook.com\n\t([fe80::b1eb:7e7e:7b90:7b4%4]) with mapi id 15.20.1516.016;\n\tFri, 11 Jan 2019 12:24:49 +0000"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector1;\n\th=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n\tbh=QfJpZRkQUD72uvz/MmhMXqJpPPfwYlzyRqdDuWD8/vE=;\n\tb=B1MCAa+uZbkzGDrPNt5i8tEc595Fc2kq4mE28IZ9JOodt1oyyb7/f8yvoLMYLqdwzGw9Yrc/jxlxNBgHAUIvBXro5gAVckFxedhivFS40oodJdtRVuNowpwfvYXskVDlXS7otHqBg8qpsxex90TIZoMx29hg+sPDCB3UNfSUkXw=",
        "From": "Shreyansh Jain <shreyansh.jain@nxp.com>",
        "To": "\"dev@dpdk.org\" <dev@dpdk.org>",
        "CC": "\"ferruh.yigit@intel.com\" <ferruh.yigit@intel.com>, Nipun Gupta\n\t<nipun.gupta@nxp.com>",
        "Thread-Topic": "[PATCH v3 13/19] net/dpaa2: add dpdmux mc flib",
        "Thread-Index": "AQHUqailKW52EYXAp0an8Nrb7LgHLQ==",
        "Date": "Fri, 11 Jan 2019 12:24:49 +0000",
        "Message-ID": "<20190111122305.7133-14-shreyansh.jain@nxp.com>",
        "References": "<20190111115712.6482-1-shreyansh.jain@nxp.com>\n\t<20190111122305.7133-1-shreyansh.jain@nxp.com>",
        "In-Reply-To": "<20190111122305.7133-1-shreyansh.jain@nxp.com>",
        "Accept-Language": "en-US",
        "Content-Language": "en-US",
        "X-MS-Has-Attach": "",
        "X-MS-TNEF-Correlator": "",
        "x-originating-ip": "[14.143.254.130]",
        "x-mailer": "git-send-email 2.17.1",
        "x-clientproxiedby": "TY2PR01CA0017.jpnprd01.prod.outlook.com\n\t(2603:1096:404:a::29) To VI1PR04MB4688.eurprd04.prod.outlook.com\n\t(2603:10a6:803:71::16)",
        "authentication-results": "spf=none (sender IP is )\n\tsmtp.mailfrom=shreyansh.jain@nxp.com; ",
        "x-ms-exchange-messagesentrepresentingtype": "1",
        "x-ms-publictraffictype": "Email",
        "x-microsoft-exchange-diagnostics": "1; VI1PR04MB5455;\n\t6:vfXvjOnQ9iF5WGBGfx7vZ5xKSqVnma4g6bhCkdHzqOTCM3uHQlNV4Qb6NPMjvD6OgIVY0mnmtJjicfgfQsy0LSJXQcX0Y+QnriR3nF75G2z4oMmctJhpZuB4Me+moCKLoPfNCoDM0sjHpfUZCOH4ixFrM5DPy3BruO3sBk5CX7h89N0zFPLwPCc1Q1159jdMcmJCxfhl2qBEV36JYbbL1MPVWslAB3xitMwoLgoq/9t8RaMb0ewK707tSVY8OYNa0e53TMVOSVY3u0q6fMqeqwzT/XPPkeiusMW+aH+w7h5f5TPKkGJSCWpjS8WGAo0erLpIz3bv9KNSCY+Lu6RFwMywVbAhF5hw6Esc0GbYU3wto76qoQs/IBD4nkMxCtpQFsK25Jgt9nxPY+C5JPQsZmr6gXok9jRdfor8zx4NQSKNtsnx8CPKva/kCcdckPIcoHYHjcl2A1W4naWb+qWEXw==;\n\t5:9FO8KkmZmQ9agJWnl2ckYFCe0j61ECpyJEopR3Vvu7wy1qLlZkRJ+MnLM5jBHW/17uKjSdhY70tLno2KMTcGrSSdWL7Yt0AZss/cX7sQ/gaJa+g8aA4znUN943aFHv4VqgMlJmXTuOlqT9cNTCF9iXsuzYaxj1HWqj7LJaGCr8+nT+4lhmPlwoM5vqYa8DV2UIw7KGxipWqZWuMtTVNoxw==;\n\t7:uCU57MCgeZEQCfVqaqbXHFcep85dJVyEvEdWl9r9Faqr096M77X2Vqu1MPPRLjYi47vrH4KPwi60crNinCVOET0XDJLB4IW0ud7cDruoHl3uJUlBrh7wyTBwSYbJW3SilyKpmchq2D5L6xuZ2e9tOA==",
        "x-ms-office365-filtering-correlation-id": "c7c4be3b-776f-4108-0b30-08d677bfc73f",
        "x-ms-office365-filtering-ht": "Tenant",
        "x-microsoft-antispam": "BCL:0; PCL:0;\n\tRULEID:(2390118)(7020095)(4652040)(8989299)(4534185)(7168020)(4627221)(201703031133081)(201702281549075)(8990200)(5600109)(711020)(4618075)(2017052603328)(7153060)(7193020);\n\tSRVR:VI1PR04MB5455; ",
        "x-ms-traffictypediagnostic": "VI1PR04MB5455:",
        "x-microsoft-antispam-prvs": "<VI1PR04MB5455F6CC45ED501DEC35A15C90850@VI1PR04MB5455.eurprd04.prod.outlook.com>",
        "x-forefront-prvs": "09144DB0F7",
        "x-forefront-antispam-report": "SFV:NSPM;\n\tSFS:(10009020)(136003)(366004)(376002)(39860400002)(396003)(346002)(189003)(199004)(66066001)(186003)(575784001)(86362001)(71200400001)(2351001)(71190400001)(55236004)(386003)(36756003)(6506007)(26005)(99286004)(105586002)(6116002)(14444005)(106356001)(102836004)(2906002)(54906003)(5660300001)(3846002)(256004)(8936002)(97736004)(78486014)(50226002)(2501003)(6486002)(305945005)(6436002)(14454004)(7736002)(8676002)(316002)(1730700003)(81166006)(81156014)(5640700003)(4326008)(53946003)(2616005)(446003)(6916009)(478600001)(1076003)(52116002)(6512007)(44832011)(486006)(76176011)(53936002)(11346002)(68736007)(30864003)(476003)(25786009)(569006);\n\tDIR:OUT; SFP:1101; SCL:1; SRVR:VI1PR04MB5455;\n\tH:VI1PR04MB4688.eurprd04.prod.outlook.com; FPR:; SPF:None; LANG:en;\n\tPTR:InfoNoRecords; MX:1; A:1; ",
        "received-spf": "None (protection.outlook.com: nxp.com does not designate\n\tpermitted sender hosts)",
        "x-ms-exchange-senderadcheck": "1",
        "x-microsoft-antispam-message-info": "YNjVuhtyHVQPjMpj/vPhhcYdFm/DhLhrKhtQfwU3B8hMpM5uQ7O9WT77vFPDDStmDUI5Yh2M2DBK0C/pHV89S5m9oOoY3Cw7fv/YCBG3VgVH8f+1nV5aG8PjKj5TYLHAeWzxlKDhb3BVF3OM6WB1kv5+8ZAwJ1HnyXKJMa5r+Ieh7Th2zdjXMi2MKkEzRGh9bXWp5NX8N/q5SBERc4WbWAL1ho9pAwC7Yrge/+0LHry7frjgm42zc3TTMRnT9JeL+cxGWv++bw/PcKaqZI7SYyDig7B7Q1qWcNFpcT7zn1yjhqIiYfndXXi7vY96voxwVzV9gi8jK7Ik3UZfsYQuU9H0T1jpq4CuEzACTsKeDZ/gXdBSYTYpIx6dF8t0jRmKunyoITW+wZ8Ix0et8izs6fAHmxShoM4G/ICoOBoShwM=",
        "spamdiagnosticoutput": "1:99",
        "spamdiagnosticmetadata": "NSPM",
        "Content-Type": "text/plain; charset=\"iso-8859-1\"",
        "Content-Transfer-Encoding": "quoted-printable",
        "MIME-Version": "1.0",
        "X-OriginatorOrg": "nxp.com",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "c7c4be3b-776f-4108-0b30-08d677bfc73f",
        "X-MS-Exchange-CrossTenant-originalarrivaltime": "11 Jan 2019 12:24:46.1204\n\t(UTC)",
        "X-MS-Exchange-CrossTenant-fromentityheader": "Hosted",
        "X-MS-Exchange-CrossTenant-id": "686ea1d3-bc2b-4c6f-a92c-d99c5c301635",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "VI1PR04MB5455",
        "Subject": "[dpdk-dev] [PATCH v3 13/19] net/dpaa2: add dpdmux mc flib",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n\t<mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n\t<mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "From: Nipun Gupta <nipun.gupta@nxp.com>\n\ndpdmux object is added as a part of net driver as it is used to\nde-multiplex packets to separate interfaces on basis of specific rules.\nThese rules can be configured from the software\n\nSigned-off-by: Nipun Gupta <nipun.gupta@nxp.com>\n---\n drivers/net/dpaa2/Makefile            |   1 +\n drivers/net/dpaa2/mc/dpdmux.c         | 929 ++++++++++++++++++++++++++\n drivers/net/dpaa2/mc/fsl_dpdmux.h     | 410 ++++++++++++\n drivers/net/dpaa2/mc/fsl_dpdmux_cmd.h | 221 ++++++\n drivers/net/dpaa2/meson.build         |   1 +\n 5 files changed, 1562 insertions(+)\n create mode 100644 drivers/net/dpaa2/mc/dpdmux.c\n create mode 100644 drivers/net/dpaa2/mc/fsl_dpdmux.h\n create mode 100644 drivers/net/dpaa2/mc/fsl_dpdmux_cmd.h",
    "diff": "diff --git a/drivers/net/dpaa2/Makefile b/drivers/net/dpaa2/Makefile\nindex 2b9c011d6..c58a39725 100644\n--- a/drivers/net/dpaa2/Makefile\n+++ b/drivers/net/dpaa2/Makefile\n@@ -35,6 +35,7 @@ SRCS-$(CONFIG_RTE_LIBRTE_DPAA2_PMD) += dpaa2_rxtx.c\n SRCS-$(CONFIG_RTE_LIBRTE_DPAA2_PMD) += dpaa2_ethdev.c\n SRCS-$(CONFIG_RTE_LIBRTE_DPAA2_PMD) += mc/dpni.c\n SRCS-$(CONFIG_RTE_LIBRTE_DPAA2_PMD) += mc/dpkg.c\n+SRCS-$(CONFIG_RTE_LIBRTE_DPAA2_PMD) += mc/dpdmux.c\n \n LDLIBS += -lrte_bus_fslmc\n LDLIBS += -lrte_mempool_dpaa2\ndiff --git a/drivers/net/dpaa2/mc/dpdmux.c b/drivers/net/dpaa2/mc/dpdmux.c\nnew file mode 100644\nindex 000000000..7962213b7\n--- /dev/null\n+++ b/drivers/net/dpaa2/mc/dpdmux.c\n@@ -0,0 +1,929 @@\n+/* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0)\n+ *\n+ * Copyright 2013-2016 Freescale Semiconductor Inc.\n+ * Copyright 2018 NXP\n+ *\n+ */\n+#include <fsl_mc_sys.h>\n+#include <fsl_mc_cmd.h>\n+#include <fsl_dpdmux.h>\n+#include <fsl_dpdmux_cmd.h>\n+\n+/** @addtogroup dpdmux\n+ * @{\n+ */\n+\n+/**\n+ * dpdmux_open() - Open a control session for the specified object\n+ * @mc_io:\tPointer to MC portal's I/O object\n+ * @cmd_flags:\tCommand flags; one or more of 'MC_CMD_FLAG_'\n+ * @dpdmux_id:\t\tDPDMUX unique ID\n+ * @token:\t\tReturned token; use in subsequent API calls\n+ *\n+ * This function can be used to open a control session for an\n+ * already created object; an object may have been declared in\n+ * the DPL or by calling the dpdmux_create() function.\n+ * This function returns a unique authentication token,\n+ * associated with the specific object ID and the specific MC\n+ * portal; this token must be used in all subsequent commands for\n+ * this specific object.\n+ *\n+ * Return:\t'0' on Success; Error code otherwise.\n+ */\n+int dpdmux_open(struct fsl_mc_io *mc_io,\n+\t\tuint32_t cmd_flags,\n+\t\tint dpdmux_id,\n+\t\tuint16_t *token)\n+{\n+\tstruct mc_command cmd = { 0 };\n+\tstruct dpdmux_cmd_open *cmd_params;\n+\tint err;\n+\n+\t/* prepare command */\n+\tcmd.header = mc_encode_cmd_header(DPDMUX_CMDID_OPEN,\n+\t\t\t\t\t  cmd_flags,\n+\t\t\t\t\t  0);\n+\tcmd_params = (struct dpdmux_cmd_open *)cmd.params;\n+\tcmd_params->dpdmux_id = cpu_to_le32(dpdmux_id);\n+\n+\t/* send command to mc*/\n+\terr = mc_send_command(mc_io, &cmd);\n+\tif (err)\n+\t\treturn err;\n+\n+\t/* retrieve response parameters */\n+\t*token = mc_cmd_hdr_read_token(&cmd);\n+\n+\treturn 0;\n+}\n+\n+/**\n+ * dpdmux_close() - Close the control session of the object\n+ * @mc_io:\tPointer to MC portal's I/O object\n+ * @cmd_flags:\tCommand flags; one or more of 'MC_CMD_FLAG_'\n+ * @token:\t\tToken of DPDMUX object\n+ *\n+ * After this function is called, no further operations are\n+ * allowed on the object without opening a new control session.\n+ *\n+ * Return:\t'0' on Success; Error code otherwise.\n+ */\n+int dpdmux_close(struct fsl_mc_io *mc_io,\n+\t\t uint32_t cmd_flags,\n+\t\t uint16_t token)\n+{\n+\tstruct mc_command cmd = { 0 };\n+\n+\t/* prepare command */\n+\tcmd.header = mc_encode_cmd_header(DPDMUX_CMDID_CLOSE,\n+\t\t\t\t\t  cmd_flags,\n+\t\t\t\t\t  token);\n+\n+\t/* send command to mc*/\n+\treturn mc_send_command(mc_io, &cmd);\n+}\n+\n+/**\n+ * dpdmux_create() - Create the DPDMUX object\n+ * @mc_io:\tPointer to MC portal's I/O object\n+ * @dprc_token:\tParent container token; '0' for default container\n+ * @cmd_flags:\tCommand flags; one or more of 'MC_CMD_FLAG_'\n+ * @cfg:\tConfiguration structure\n+ * @obj_id: returned object id\n+ *\n+ * Create the DPDMUX object, allocate required resources and\n+ * perform required initialization.\n+ *\n+ * The object can be created either by declaring it in the\n+ * DPL file, or by calling this function.\n+ *\n+ * The function accepts an authentication token of a parent\n+ * container that this object should be assigned to. The token\n+ * can be '0' so the object will be assigned to the default container.\n+ * The newly created object can be opened with the returned\n+ * object id and using the container's associated tokens and MC portals.\n+ *\n+ * Return:\t'0' on Success; Error code otherwise.\n+ */\n+int dpdmux_create(struct fsl_mc_io *mc_io,\n+\t\t  uint16_t dprc_token,\n+\t\t  uint32_t cmd_flags,\n+\t\t  const struct dpdmux_cfg\t*cfg,\n+\t\t  uint32_t *obj_id)\n+{\n+\tstruct mc_command cmd = { 0 };\n+\tstruct dpdmux_cmd_create *cmd_params;\n+\tint err;\n+\n+\t/* prepare command */\n+\tcmd.header = mc_encode_cmd_header(DPDMUX_CMDID_CREATE,\n+\t\t\t\t\t  cmd_flags,\n+\t\t\t\t\t  dprc_token);\n+\tcmd_params = (struct dpdmux_cmd_create *)cmd.params;\n+\tcmd_params->method = cfg->method;\n+\tcmd_params->manip = cfg->manip;\n+\tcmd_params->num_ifs = cpu_to_le16(cfg->num_ifs);\n+\tcmd_params->adv_max_dmat_entries =\n+\t\t\tcpu_to_le16(cfg->adv.max_dmat_entries);\n+\tcmd_params->adv_max_mc_groups = cpu_to_le16(cfg->adv.max_mc_groups);\n+\tcmd_params->adv_max_vlan_ids = cpu_to_le16(cfg->adv.max_vlan_ids);\n+\tcmd_params->options = cpu_to_le64(cfg->adv.options);\n+\n+\t/* send command to mc*/\n+\terr = mc_send_command(mc_io, &cmd);\n+\tif (err)\n+\t\treturn err;\n+\n+\t/* retrieve response parameters */\n+\t*obj_id = mc_cmd_read_object_id(&cmd);\n+\n+\treturn 0;\n+}\n+\n+/**\n+ * dpdmux_destroy() - Destroy the DPDMUX object and release all its resources.\n+ * @mc_io:\tPointer to MC portal's I/O object\n+ * @dprc_token: Parent container token; '0' for default container\n+ * @cmd_flags:\tCommand flags; one or more of 'MC_CMD_FLAG_'\n+ * @object_id:\tThe object id; it must be a valid id within the container that\n+ * created this object;\n+ *\n+ * The function accepts the authentication token of the parent container that\n+ * created the object (not the one that currently owns the object). The object\n+ * is searched within parent using the provided 'object_id'.\n+ * All tokens to the object must be closed before calling destroy.\n+ *\n+ * Return:\t'0' on Success; error code otherwise.\n+ */\n+int dpdmux_destroy(struct fsl_mc_io *mc_io,\n+\t\t   uint16_t dprc_token,\n+\t\t   uint32_t cmd_flags,\n+\t\t   uint32_t object_id)\n+{\n+\tstruct mc_command cmd = { 0 };\n+\tstruct dpdmux_cmd_destroy *cmd_params;\n+\n+\t/* prepare command */\n+\tcmd.header = mc_encode_cmd_header(DPDMUX_CMDID_DESTROY,\n+\t\t\t\t\t  cmd_flags,\n+\t\t\t\t\t  dprc_token);\n+\tcmd_params = (struct dpdmux_cmd_destroy *)cmd.params;\n+\tcmd_params->dpdmux_id = cpu_to_le32(object_id);\n+\n+\t/* send command to mc*/\n+\treturn mc_send_command(mc_io, &cmd);\n+}\n+\n+/**\n+ * dpdmux_enable() - Enable DPDMUX functionality\n+ * @mc_io:\tPointer to MC portal's I/O object\n+ * @cmd_flags:\tCommand flags; one or more of 'MC_CMD_FLAG_'\n+ * @token:\tToken of DPDMUX object\n+ *\n+ * Return:\t'0' on Success; Error code otherwise.\n+ */\n+int dpdmux_enable(struct fsl_mc_io *mc_io,\n+\t\t  uint32_t cmd_flags,\n+\t\t  uint16_t token)\n+{\n+\tstruct mc_command cmd = { 0 };\n+\n+\t/* prepare command */\n+\tcmd.header = mc_encode_cmd_header(DPDMUX_CMDID_ENABLE,\n+\t\t\t\t\t  cmd_flags,\n+\t\t\t\t\t  token);\n+\n+\t/* send command to mc*/\n+\treturn mc_send_command(mc_io, &cmd);\n+}\n+\n+/**\n+ * dpdmux_disable() - Disable DPDMUX functionality\n+ * @mc_io:\tPointer to MC portal's I/O object\n+ * @cmd_flags:\tCommand flags; one or more of 'MC_CMD_FLAG_'\n+ * @token:\tToken of DPDMUX object\n+ *\n+ * Return:\t'0' on Success; Error code otherwise.\n+ */\n+int dpdmux_disable(struct fsl_mc_io *mc_io,\n+\t\t   uint32_t cmd_flags,\n+\t\t   uint16_t token)\n+{\n+\tstruct mc_command cmd = { 0 };\n+\n+\t/* prepare command */\n+\tcmd.header = mc_encode_cmd_header(DPDMUX_CMDID_DISABLE,\n+\t\t\t\t\t  cmd_flags,\n+\t\t\t\t\t  token);\n+\n+\t/* send command to mc*/\n+\treturn mc_send_command(mc_io, &cmd);\n+}\n+\n+/**\n+ * dpdmux_is_enabled() - Check if the DPDMUX is enabled.\n+ * @mc_io:\tPointer to MC portal's I/O object\n+ * @cmd_flags:\tCommand flags; one or more of 'MC_CMD_FLAG_'\n+ * @token:\tToken of DPDMUX object\n+ * @en:\t\tReturns '1' if object is enabled; '0' otherwise\n+ *\n+ * Return:\t'0' on Success; Error code otherwise.\n+ */\n+int dpdmux_is_enabled(struct fsl_mc_io *mc_io,\n+\t\t      uint32_t cmd_flags,\n+\t\t      uint16_t token,\n+\t\t      int *en)\n+{\n+\tstruct mc_command cmd = { 0 };\n+\tstruct dpdmux_rsp_is_enabled *rsp_params;\n+\tint err;\n+\n+\t/* prepare command */\n+\tcmd.header = mc_encode_cmd_header(DPDMUX_CMDID_IS_ENABLED,\n+\t\t\t\t\t  cmd_flags,\n+\t\t\t\t\t  token);\n+\n+\t/* send command to mc*/\n+\terr = mc_send_command(mc_io, &cmd);\n+\tif (err)\n+\t\treturn err;\n+\n+\t/* retrieve response parameters */\n+\trsp_params = (struct dpdmux_rsp_is_enabled *)cmd.params;\n+\t*en = dpdmux_get_field(rsp_params->en, ENABLE);\n+\n+\treturn 0;\n+}\n+\n+/**\n+ * dpdmux_reset() - Reset the DPDMUX, returns the object to initial state.\n+ * @mc_io:\tPointer to MC portal's I/O object\n+ * @cmd_flags:\tCommand flags; one or more of 'MC_CMD_FLAG_'\n+ * @token:\tToken of DPDMUX object\n+ *\n+ * Return:\t'0' on Success; Error code otherwise.\n+ */\n+int dpdmux_reset(struct fsl_mc_io *mc_io,\n+\t\t uint32_t cmd_flags,\n+\t\t uint16_t token)\n+{\n+\tstruct mc_command cmd = { 0 };\n+\n+\t/* prepare command */\n+\tcmd.header = mc_encode_cmd_header(DPDMUX_CMDID_RESET,\n+\t\t\t\t\t  cmd_flags,\n+\t\t\t\t\t  token);\n+\n+\t/* send command to mc*/\n+\treturn mc_send_command(mc_io, &cmd);\n+}\n+\n+/**\n+ * dpdmux_get_attributes() - Retrieve DPDMUX attributes\n+ * @mc_io:\tPointer to MC portal's I/O object\n+ * @cmd_flags:\tCommand flags; one or more of 'MC_CMD_FLAG_'\n+ * @token:\tToken of DPDMUX object\n+ * @attr:\tReturned object's attributes\n+ *\n+ * Return:\t'0' on Success; Error code otherwise.\n+ */\n+int dpdmux_get_attributes(struct fsl_mc_io *mc_io,\n+\t\t\t  uint32_t cmd_flags,\n+\t\t\t  uint16_t token,\n+\t\t\t  struct dpdmux_attr *attr)\n+{\n+\tstruct mc_command cmd = { 0 };\n+\tstruct dpdmux_rsp_get_attr *rsp_params;\n+\tint err;\n+\n+\t/* prepare command */\n+\tcmd.header = mc_encode_cmd_header(DPDMUX_CMDID_GET_ATTR,\n+\t\t\t\t\t  cmd_flags,\n+\t\t\t\t\t  token);\n+\n+\t/* send command to mc*/\n+\terr = mc_send_command(mc_io, &cmd);\n+\tif (err)\n+\t\treturn err;\n+\n+\t/* retrieve response parameters */\n+\trsp_params = (struct dpdmux_rsp_get_attr *)cmd.params;\n+\tattr->id = le32_to_cpu(rsp_params->id);\n+\tattr->options = le64_to_cpu(rsp_params->options);\n+\tattr->method = rsp_params->method;\n+\tattr->manip = rsp_params->manip;\n+\tattr->num_ifs = le16_to_cpu(rsp_params->num_ifs);\n+\tattr->mem_size = le16_to_cpu(rsp_params->mem_size);\n+\n+\treturn 0;\n+}\n+\n+/**\n+ * dpdmux_if_enable() - Enable Interface\n+ * @mc_io:\tPointer to MC portal's I/O object\n+ * @cmd_flags:\tCommand flags; one or more of 'MC_CMD_FLAG_'\n+ * @token:\tToken of DPDMUX object\n+ * @if_id:\tInterface Identifier\n+ *\n+ * Return:\tCompletion status. '0' on Success; Error code otherwise.\n+ */\n+int dpdmux_if_enable(struct fsl_mc_io *mc_io,\n+\t\t     uint32_t cmd_flags,\n+\t\t     uint16_t token,\n+\t\t     uint16_t if_id)\n+{\n+\tstruct dpdmux_cmd_if *cmd_params;\n+\tstruct mc_command cmd = { 0 };\n+\n+\t/* prepare command */\n+\tcmd.header = mc_encode_cmd_header(DPDMUX_CMDID_IF_ENABLE,\n+\t\t\t\t\t  cmd_flags,\n+\t\t\t\t\t  token);\n+\tcmd_params = (struct dpdmux_cmd_if *)cmd.params;\n+\tcmd_params->if_id = cpu_to_le16(if_id);\n+\n+\t/* send command to mc*/\n+\treturn mc_send_command(mc_io, &cmd);\n+}\n+\n+/**\n+ * dpdmux_if_disable() - Disable Interface\n+ * @mc_io:\tPointer to MC portal's I/O object\n+ * @cmd_flags:\tCommand flags; one or more of 'MC_CMD_FLAG_'\n+ * @token:\tToken of DPDMUX object\n+ * @if_id:\tInterface Identifier\n+ *\n+ * Return:\tCompletion status. '0' on Success; Error code otherwise.\n+ */\n+int dpdmux_if_disable(struct fsl_mc_io *mc_io,\n+\t\t      uint32_t cmd_flags,\n+\t\t      uint16_t token,\n+\t\t      uint16_t if_id)\n+{\n+\tstruct dpdmux_cmd_if *cmd_params;\n+\tstruct mc_command cmd = { 0 };\n+\n+\t/* prepare command */\n+\tcmd.header = mc_encode_cmd_header(DPDMUX_CMDID_IF_DISABLE,\n+\t\t\t\t\t  cmd_flags,\n+\t\t\t\t\t  token);\n+\tcmd_params = (struct dpdmux_cmd_if *)cmd.params;\n+\tcmd_params->if_id = cpu_to_le16(if_id);\n+\n+\t/* send command to mc*/\n+\treturn mc_send_command(mc_io, &cmd);\n+}\n+\n+/**\n+ * dpdmux_set_max_frame_length() - Set the maximum frame length in DPDMUX\n+ * @mc_io:\tPointer to MC portal's I/O object\n+ * @cmd_flags:\tCommand flags; one or more of 'MC_CMD_FLAG_'\n+ * @token:\t\tToken of DPDMUX object\n+ * @max_frame_length:\tThe required maximum frame length\n+ *\n+ * Update the maximum frame length on all DMUX interfaces.\n+ * In case of VEPA, the maximum frame length on all dmux interfaces\n+ * will be updated with the minimum value of the mfls of the connected\n+ * dpnis and the actual value of dmux mfl.\n+ *\n+ * Return:\t'0' on Success; Error code otherwise.\n+ */\n+int dpdmux_set_max_frame_length(struct fsl_mc_io *mc_io,\n+\t\t\t\tuint32_t cmd_flags,\n+\t\t\t\tuint16_t token,\n+\t\t\t\tuint16_t max_frame_length)\n+{\n+\tstruct mc_command cmd = { 0 };\n+\tstruct dpdmux_cmd_set_max_frame_length *cmd_params;\n+\n+\t/* prepare command */\n+\tcmd.header = mc_encode_cmd_header(DPDMUX_CMDID_SET_MAX_FRAME_LENGTH,\n+\t\t\t\t\t  cmd_flags,\n+\t\t\t\t\t  token);\n+\tcmd_params = (struct dpdmux_cmd_set_max_frame_length *)cmd.params;\n+\tcmd_params->max_frame_length = cpu_to_le16(max_frame_length);\n+\n+\t/* send command to mc*/\n+\treturn mc_send_command(mc_io, &cmd);\n+}\n+\n+/**\n+ * dpdmux_ul_reset_counters() - Function resets the uplink counter\n+ * @mc_io:\tPointer to MC portal's I/O object\n+ * @cmd_flags:\tCommand flags; one or more of 'MC_CMD_FLAG_'\n+ * @token:\tToken of DPDMUX object\n+ *\n+ * Return:\t'0' on Success; Error code otherwise.\n+ */\n+int dpdmux_ul_reset_counters(struct fsl_mc_io *mc_io,\n+\t\t\t     uint32_t cmd_flags,\n+\t\t\t     uint16_t token)\n+{\n+\tstruct mc_command cmd = { 0 };\n+\n+\t/* prepare command */\n+\tcmd.header = mc_encode_cmd_header(DPDMUX_CMDID_UL_RESET_COUNTERS,\n+\t\t\t\t\t  cmd_flags,\n+\t\t\t\t\t  token);\n+\n+\t/* send command to mc*/\n+\treturn mc_send_command(mc_io, &cmd);\n+}\n+\n+/**\n+ * dpdmux_if_set_accepted_frames() - Set the accepted frame types\n+ * @mc_io:\tPointer to MC portal's I/O object\n+ * @cmd_flags:\tCommand flags; one or more of 'MC_CMD_FLAG_'\n+ * @token:\tToken of DPDMUX object\n+ * @if_id:\tInterface ID (0 for uplink, or 1-num_ifs);\n+ * @cfg:\tFrame types configuration\n+ *\n+ * if 'DPDMUX_ADMIT_ONLY_VLAN_TAGGED' is set - untagged frames or\n+ * priority-tagged frames are discarded.\n+ * if 'DPDMUX_ADMIT_ONLY_UNTAGGED' is set - untagged frames or\n+ * priority-tagged frames are accepted.\n+ * if 'DPDMUX_ADMIT_ALL' is set (default mode) - all VLAN tagged,\n+ * untagged and priority-tagged frame are accepted;\n+ *\n+ * Return:\t'0' on Success; Error code otherwise.\n+ */\n+int dpdmux_if_set_accepted_frames(struct fsl_mc_io *mc_io,\n+\t\t\t\t  uint32_t cmd_flags,\n+\t\t\t\t  uint16_t token,\n+\t\t\t\t  uint16_t if_id,\n+\t\t\t\t  const struct dpdmux_accepted_frames *cfg)\n+{\n+\tstruct mc_command cmd = { 0 };\n+\tstruct dpdmux_cmd_if_set_accepted_frames *cmd_params;\n+\n+\t/* prepare command */\n+\tcmd.header = mc_encode_cmd_header(DPDMUX_CMDID_IF_SET_ACCEPTED_FRAMES,\n+\t\t\t\t\t  cmd_flags,\n+\t\t\t\t\t  token);\n+\tcmd_params = (struct dpdmux_cmd_if_set_accepted_frames *)cmd.params;\n+\tcmd_params->if_id = cpu_to_le16(if_id);\n+\tdpdmux_set_field(cmd_params->frames_options,\n+\t\t\t ACCEPTED_FRAMES_TYPE,\n+\t\t\t cfg->type);\n+\tdpdmux_set_field(cmd_params->frames_options,\n+\t\t\t UNACCEPTED_FRAMES_ACTION,\n+\t\t\t cfg->unaccept_act);\n+\n+\t/* send command to mc*/\n+\treturn mc_send_command(mc_io, &cmd);\n+}\n+\n+/**\n+ * dpdmux_if_get_attributes() - Obtain DPDMUX interface attributes\n+ * @mc_io:\tPointer to MC portal's I/O object\n+ * @cmd_flags:\tCommand flags; one or more of 'MC_CMD_FLAG_'\n+ * @token:\tToken of DPDMUX object\n+ * @if_id:\tInterface ID (0 for uplink, or 1-num_ifs);\n+ * @attr:\tInterface attributes\n+ *\n+ * Return:\t'0' on Success; Error code otherwise.\n+ */\n+int dpdmux_if_get_attributes(struct fsl_mc_io *mc_io,\n+\t\t\t     uint32_t cmd_flags,\n+\t\t\t     uint16_t token,\n+\t\t\t     uint16_t if_id,\n+\t\t\t     struct dpdmux_if_attr *attr)\n+{\n+\tstruct mc_command cmd = { 0 };\n+\tstruct dpdmux_cmd_if *cmd_params;\n+\tstruct dpdmux_rsp_if_get_attr *rsp_params;\n+\tint err;\n+\n+\t/* prepare command */\n+\tcmd.header = mc_encode_cmd_header(DPDMUX_CMDID_IF_GET_ATTR,\n+\t\t\t\t\t  cmd_flags,\n+\t\t\t\t\t  token);\n+\tcmd_params = (struct dpdmux_cmd_if *)cmd.params;\n+\tcmd_params->if_id = cpu_to_le16(if_id);\n+\n+\t/* send command to mc*/\n+\terr = mc_send_command(mc_io, &cmd);\n+\tif (err)\n+\t\treturn err;\n+\n+\t/* retrieve response parameters */\n+\trsp_params = (struct dpdmux_rsp_if_get_attr *)cmd.params;\n+\tattr->rate = le32_to_cpu(rsp_params->rate);\n+\tattr->enabled = dpdmux_get_field(rsp_params->enabled, ENABLE);\n+\tattr->is_default = dpdmux_get_field(rsp_params->enabled, IS_DEFAULT);\n+\tattr->accept_frame_type = dpdmux_get_field(\n+\t\t\t\t  rsp_params->accepted_frames_type,\n+\t\t\t\t  ACCEPTED_FRAMES_TYPE);\n+\n+\treturn 0;\n+}\n+\n+/**\n+ * dpdmux_if_remove_l2_rule() - Remove L2 rule from DPDMUX table\n+ * @mc_io:\tPointer to MC portal's I/O object\n+ * @cmd_flags:\tCommand flags; one or more of 'MC_CMD_FLAG_'\n+ * @token:\tToken of DPDMUX object\n+ * @if_id:\tDestination interface ID\n+ * @rule:\tL2 rule\n+ *\n+ * Function removes a L2 rule from DPDMUX table\n+ * or adds an interface to an existing multicast address\n+ *\n+ * Return:\t'0' on Success; Error code otherwise.\n+ */\n+int dpdmux_if_remove_l2_rule(struct fsl_mc_io *mc_io,\n+\t\t\t     uint32_t cmd_flags,\n+\t\t\t     uint16_t token,\n+\t\t\t     uint16_t if_id,\n+\t\t\t     const struct dpdmux_l2_rule *rule)\n+{\n+\tstruct mc_command cmd = { 0 };\n+\tstruct dpdmux_cmd_if_l2_rule *cmd_params;\n+\n+\t/* prepare command */\n+\tcmd.header = mc_encode_cmd_header(DPDMUX_CMDID_IF_REMOVE_L2_RULE,\n+\t\t\t\t\t  cmd_flags,\n+\t\t\t\t\t  token);\n+\tcmd_params = (struct dpdmux_cmd_if_l2_rule *)cmd.params;\n+\tcmd_params->if_id = cpu_to_le16(if_id);\n+\tcmd_params->vlan_id = cpu_to_le16(rule->vlan_id);\n+\tcmd_params->mac_addr5 = rule->mac_addr[5];\n+\tcmd_params->mac_addr4 = rule->mac_addr[4];\n+\tcmd_params->mac_addr3 = rule->mac_addr[3];\n+\tcmd_params->mac_addr2 = rule->mac_addr[2];\n+\tcmd_params->mac_addr1 = rule->mac_addr[1];\n+\tcmd_params->mac_addr0 = rule->mac_addr[0];\n+\n+\t/* send command to mc*/\n+\treturn mc_send_command(mc_io, &cmd);\n+}\n+\n+/**\n+ * dpdmux_if_add_l2_rule() - Add L2 rule into DPDMUX table\n+ * @mc_io:\tPointer to MC portal's I/O object\n+ * @cmd_flags:\tCommand flags; one or more of 'MC_CMD_FLAG_'\n+ * @token:\tToken of DPDMUX object\n+ * @if_id:\tDestination interface ID\n+ * @rule:\tL2 rule\n+ *\n+ * Function adds a L2 rule into DPDMUX table\n+ * or adds an interface to an existing multicast address\n+ *\n+ * Return:\t'0' on Success; Error code otherwise.\n+ */\n+int dpdmux_if_add_l2_rule(struct fsl_mc_io *mc_io,\n+\t\t\t  uint32_t cmd_flags,\n+\t\t\t  uint16_t token,\n+\t\t\t  uint16_t if_id,\n+\t\t\t  const struct dpdmux_l2_rule *rule)\n+{\n+\tstruct mc_command cmd = { 0 };\n+\tstruct dpdmux_cmd_if_l2_rule *cmd_params;\n+\n+\t/* prepare command */\n+\tcmd.header = mc_encode_cmd_header(DPDMUX_CMDID_IF_ADD_L2_RULE,\n+\t\t\t\t\t  cmd_flags,\n+\t\t\t\t\t  token);\n+\tcmd_params = (struct dpdmux_cmd_if_l2_rule *)cmd.params;\n+\tcmd_params->if_id = cpu_to_le16(if_id);\n+\tcmd_params->vlan_id = cpu_to_le16(rule->vlan_id);\n+\tcmd_params->mac_addr5 = rule->mac_addr[5];\n+\tcmd_params->mac_addr4 = rule->mac_addr[4];\n+\tcmd_params->mac_addr3 = rule->mac_addr[3];\n+\tcmd_params->mac_addr2 = rule->mac_addr[2];\n+\tcmd_params->mac_addr1 = rule->mac_addr[1];\n+\tcmd_params->mac_addr0 = rule->mac_addr[0];\n+\n+\t/* send command to mc*/\n+\treturn mc_send_command(mc_io, &cmd);\n+}\n+\n+/**\n+ * dpdmux_if_get_counter() - Functions obtains specific counter of an interface\n+ * @mc_io: Pointer to MC portal's I/O object\n+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'\n+ * @token: Token of DPDMUX object\n+ * @if_id:  Interface Id\n+ * @counter_type: counter type\n+ * @counter: Returned specific counter information\n+ *\n+ * Return:\t'0' on Success; Error code otherwise.\n+ */\n+int dpdmux_if_get_counter(struct fsl_mc_io *mc_io,\n+\t\t\t  uint32_t cmd_flags,\n+\t\t\t  uint16_t token,\n+\t\t\t  uint16_t if_id,\n+\t\t\t  enum dpdmux_counter_type counter_type,\n+\t\t\t  uint64_t *counter)\n+{\n+\tstruct mc_command cmd = { 0 };\n+\tstruct dpdmux_cmd_if_get_counter *cmd_params;\n+\tstruct dpdmux_rsp_if_get_counter *rsp_params;\n+\tint err;\n+\n+\t/* prepare command */\n+\tcmd.header = mc_encode_cmd_header(DPDMUX_CMDID_IF_GET_COUNTER,\n+\t\t\t\t\t  cmd_flags,\n+\t\t\t\t\t  token);\n+\tcmd_params = (struct dpdmux_cmd_if_get_counter *)cmd.params;\n+\tcmd_params->if_id = cpu_to_le16(if_id);\n+\tcmd_params->counter_type = counter_type;\n+\n+\t/* send command to mc*/\n+\terr = mc_send_command(mc_io, &cmd);\n+\tif (err)\n+\t\treturn err;\n+\n+\t/* retrieve response parameters */\n+\trsp_params = (struct dpdmux_rsp_if_get_counter *)cmd.params;\n+\t*counter = le64_to_cpu(rsp_params->counter);\n+\n+\treturn 0;\n+}\n+\n+/**\n+ * dpdmux_if_set_link_cfg() - set the link configuration.\n+ * @mc_io:\tPointer to MC portal's I/O object\n+ * @cmd_flags:\tCommand flags; one or more of 'MC_CMD_FLAG_'\n+ * @token: Token of DPSW object\n+ * @if_id: interface id\n+ * @cfg: Link configuration\n+ *\n+ * Return:\t'0' on Success; Error code otherwise.\n+ */\n+int dpdmux_if_set_link_cfg(struct fsl_mc_io *mc_io,\n+\t\t\t   uint32_t cmd_flags,\n+\t\t\t   uint16_t token,\n+\t\t\t   uint16_t if_id,\n+\t\t\t   struct dpdmux_link_cfg *cfg)\n+{\n+\tstruct mc_command cmd = { 0 };\n+\tstruct dpdmux_cmd_if_set_link_cfg *cmd_params;\n+\n+\t/* prepare command */\n+\tcmd.header = mc_encode_cmd_header(DPDMUX_CMDID_IF_SET_LINK_CFG,\n+\t\t\t\t\t  cmd_flags,\n+\t\t\t\t\t  token);\n+\tcmd_params = (struct dpdmux_cmd_if_set_link_cfg *)cmd.params;\n+\tcmd_params->if_id = cpu_to_le16(if_id);\n+\tcmd_params->rate = cpu_to_le32(cfg->rate);\n+\tcmd_params->options = cpu_to_le64(cfg->options);\n+\tcmd_params->advertising = cpu_to_le64(cfg->advertising);\n+\n+\t/* send command to mc*/\n+\treturn mc_send_command(mc_io, &cmd);\n+}\n+\n+/**\n+ * dpdmux_if_get_link_state - Return the link state\n+ * @mc_io:\tPointer to MC portal's I/O object\n+ * @cmd_flags:\tCommand flags; one or more of 'MC_CMD_FLAG_'\n+ * @token: Token of DPSW object\n+ * @if_id: interface id\n+ * @state: link state\n+ *\n+ * @returns\t'0' on Success; Error code otherwise.\n+ */\n+int dpdmux_if_get_link_state(struct fsl_mc_io *mc_io,\n+\t\t\t     uint32_t cmd_flags,\n+\t\t\t     uint16_t token,\n+\t\t\t     uint16_t if_id,\n+\t\t\t     struct dpdmux_link_state *state)\n+{\n+\tstruct mc_command cmd = { 0 };\n+\tstruct dpdmux_cmd_if_get_link_state *cmd_params;\n+\tstruct dpdmux_rsp_if_get_link_state *rsp_params;\n+\tint err;\n+\n+\t/* prepare command */\n+\tcmd.header = mc_encode_cmd_header(DPDMUX_CMDID_IF_GET_LINK_STATE,\n+\t\t\t\t\t  cmd_flags,\n+\t\t\t\t\t  token);\n+\tcmd_params = (struct dpdmux_cmd_if_get_link_state *)cmd.params;\n+\tcmd_params->if_id = cpu_to_le16(if_id);\n+\n+\t/* send command to mc*/\n+\terr = mc_send_command(mc_io, &cmd);\n+\tif (err)\n+\t\treturn err;\n+\n+\t/* retrieve response parameters */\n+\trsp_params = (struct dpdmux_rsp_if_get_link_state *)cmd.params;\n+\tstate->rate = le32_to_cpu(rsp_params->rate);\n+\tstate->options = le64_to_cpu(rsp_params->options);\n+\tstate->up = dpdmux_get_field(rsp_params->up, UP);\n+\tstate->state_valid = dpdmux_get_field(rsp_params->up, STATE_VALID);\n+\tstate->supported = le64_to_cpu(rsp_params->supported);\n+\tstate->advertising = le64_to_cpu(rsp_params->advertising);\n+\n+\treturn 0;\n+}\n+\n+/**\n+ * dpdmux_if_set_default - Set default interface\n+ * @mc_io:\tPointer to MC portal's I/O object\n+ * @cmd_flags:\tCommand flags; one or more of 'MC_CMD_FLAG_'\n+ * @token: Token of DPSW object\n+ * @if_id: interface id\n+ *\n+ * @returns\t'0' on Success; Error code otherwise.\n+ */\n+int dpdmux_if_set_default(struct fsl_mc_io *mc_io,\n+\t\tuint32_t cmd_flags,\n+\t\tuint16_t token,\n+\t\tuint16_t if_id)\n+{\n+\tstruct dpdmux_cmd_if *cmd_params;\n+\tstruct mc_command cmd = { 0 };\n+\n+\t/* prepare command */\n+\tcmd.header = mc_encode_cmd_header(DPDMUX_CMDID_IF_SET_DEFAULT,\n+\t\t\t\t\t  cmd_flags,\n+\t\t\t\t\t  token);\n+\tcmd_params = (struct dpdmux_cmd_if *)cmd.params;\n+\tcmd_params->if_id = cpu_to_le16(if_id);\n+\n+\t/* send command to mc*/\n+\treturn mc_send_command(mc_io, &cmd);\n+}\n+\n+/**\n+ * dpdmux_if_get_default - Get default interface\n+ * @mc_io:\tPointer to MC portal's I/O object\n+ * @cmd_flags:\tCommand flags; one or more of 'MC_CMD_FLAG_'\n+ * @token: Token of DPSW object\n+ * @if_id: interface id\n+ *\n+ * @returns\t'0' on Success; Error code otherwise.\n+ */\n+int dpdmux_if_get_default(struct fsl_mc_io *mc_io,\n+\t\tuint32_t cmd_flags,\n+\t\tuint16_t token,\n+\t\tuint16_t *if_id)\n+{\n+\tstruct dpdmux_cmd_if *rsp_params;\n+\tstruct mc_command cmd = { 0 };\n+\tint err;\n+\n+\t/* prepare command */\n+\tcmd.header = mc_encode_cmd_header(DPDMUX_CMDID_IF_GET_DEFAULT,\n+\t\t\t\t\t  cmd_flags,\n+\t\t\t\t\t  token);\n+\n+\t/* send command to mc*/\n+\terr = mc_send_command(mc_io, &cmd);\n+\tif (err)\n+\t\treturn err;\n+\n+\t/* retrieve response parameters */\n+\trsp_params = (struct dpdmux_cmd_if *)cmd.params;\n+\t*if_id = le16_to_cpu(rsp_params->if_id);\n+\n+\treturn 0;\n+}\n+\n+/**\n+ * dpdmux_set_custom_key - Set a custom classification key.\n+ *\n+ * This API is only available for DPDMUX instance created with\n+ * DPDMUX_METHOD_CUSTOM.  This API must be called before populating the\n+ * classification table using dpdmux_add_custom_cls_entry.\n+ *\n+ * Calls to dpdmux_set_custom_key remove all existing classification entries\n+ * that may have been added previously using dpdmux_add_custom_cls_entry.\n+ *\n+ * @mc_io:\t\tPointer to MC portal's I/O object\n+ * @cmd_flags:\t\tCommand flags; one or more of 'MC_CMD_FLAG_'\n+ * @token:\t\tToken of DPSW object\n+ * @if_id:\t\tInterface id\n+ * @key_cfg_iova:\tDMA address of a configuration structure set up using\n+ *\t\t\tdpkg_prepare_key_cfg. Maximum key size is 24 bytes\n+ *\n+ * @returns\t'0' on Success; Error code otherwise.\n+ */\n+int dpdmux_set_custom_key(struct fsl_mc_io *mc_io,\n+\t\t\tuint32_t cmd_flags,\n+\t\t\tuint16_t token,\n+\t\t\tuint64_t key_cfg_iova)\n+{\n+\tstruct dpdmux_set_custom_key *cmd_params;\n+\tstruct mc_command cmd = { 0 };\n+\n+\t/* prepare command */\n+\tcmd.header = mc_encode_cmd_header(DPDMUX_CMDID_SET_CUSTOM_KEY,\n+\t\t\t\t\t  cmd_flags,\n+\t\t\t\t\t  token);\n+\tcmd_params = (struct dpdmux_set_custom_key *)cmd.params;\n+\tcmd_params->key_cfg_iova = cpu_to_le64(key_cfg_iova);\n+\n+\t/* send command to mc*/\n+\treturn mc_send_command(mc_io, &cmd);\n+}\n+\n+/**\n+ * dpdmux_add_custom_cls_entry - Adds a custom classification entry.\n+ *\n+ * This API is only available for DPDMUX instances created with\n+ * DPDMUX_METHOD_CUSTOM.  Before calling this function a classification key\n+ * composition rule must be set up using dpdmux_set_custom_key.\n+ *\n+ * @mc_io:\tPointer to MC portal's I/O object\n+ * @cmd_flags:\tCommand flags; one or more of 'MC_CMD_FLAG_'\n+ * @token: Token of DPSW object\n+ * @rule: Classification rule to insert.  Rules cannot be duplicated, if a\n+ *\tmatching rule already exists, the action will be replaced.\n+ * @action: Action to perform for matching traffic.\n+ *\n+ * @returns\t'0' on Success; Error code otherwise.\n+ */\n+int dpdmux_add_custom_cls_entry(struct fsl_mc_io *mc_io,\n+\t\tuint32_t cmd_flags,\n+\t\tuint16_t token,\n+\t\tstruct dpdmux_rule_cfg *rule,\n+\t\tstruct dpdmux_cls_action *action)\n+{\n+\tstruct dpdmux_cmd_add_custom_cls_entry *cmd_params;\n+\tstruct mc_command cmd = { 0 };\n+\n+\t/* prepare command */\n+\tcmd.header = mc_encode_cmd_header(DPDMUX_CMDID_ADD_CUSTOM_CLS_ENTRY,\n+\t\t\t\t\t  cmd_flags,\n+\t\t\t\t\t  token);\n+\n+\tcmd_params = (struct dpdmux_cmd_add_custom_cls_entry *)cmd.params;\n+\tcmd_params->key_size = rule->key_size;\n+\tcmd_params->dest_if = cpu_to_le16(action->dest_if);\n+\tcmd_params->key_iova = cpu_to_le64(rule->key_iova);\n+\tcmd_params->mask_iova = cpu_to_le64(rule->mask_iova);\n+\n+\t/* send command to mc*/\n+\treturn mc_send_command(mc_io, &cmd);\n+}\n+\n+/**\n+ * dpdmux_remove_custom_cls_entry - Removes a custom classification entry.\n+ *\n+ * This API is only available for DPDMUX instances created with\n+ * DPDMUX_METHOD_CUSTOM.  The API can be used to remove classification\n+ * entries previously inserted using dpdmux_add_custom_cls_entry.\n+ *\n+ * @mc_io:\tPointer to MC portal's I/O object\n+ * @cmd_flags:\tCommand flags; one or more of 'MC_CMD_FLAG_'\n+ * @token: Token of DPSW object\n+ * @rule: Classification rule to remove\n+ *\n+ * @returns\t'0' on Success; Error code otherwise.\n+ */\n+int dpdmux_remove_custom_cls_entry(struct fsl_mc_io *mc_io,\n+\t\tuint32_t cmd_flags,\n+\t\tuint16_t token,\n+\t\tstruct dpdmux_rule_cfg *rule)\n+{\n+\tstruct dpdmux_cmd_remove_custom_cls_entry *cmd_params;\n+\tstruct mc_command cmd = { 0 };\n+\n+\t/* prepare command */\n+\tcmd.header = mc_encode_cmd_header(DPDMUX_CMDID_REMOVE_CUSTOM_CLS_ENTRY,\n+\t\t\t\t\t  cmd_flags,\n+\t\t\t\t\t  token);\n+\tcmd_params = (struct dpdmux_cmd_remove_custom_cls_entry *)cmd.params;\n+\tcmd_params->key_size = rule->key_size;\n+\tcmd_params->key_iova = cpu_to_le64(rule->key_iova);\n+\tcmd_params->mask_iova = cpu_to_le64(rule->mask_iova);\n+\n+\t/* send command to mc*/\n+\treturn mc_send_command(mc_io, &cmd);\n+}\n+\n+/**\n+ * dpdmux_get_api_version() - Get Data Path Demux API version\n+ * @mc_io:  Pointer to MC portal's I/O object\n+ * @cmd_flags:\tCommand flags; one or more of 'MC_CMD_FLAG_'\n+ * @major_ver:\tMajor version of data path demux API\n+ * @minor_ver:\tMinor version of data path demux API\n+ *\n+ * Return:  '0' on Success; Error code otherwise.\n+ */\n+int dpdmux_get_api_version(struct fsl_mc_io *mc_io,\n+\t\t\t   uint32_t cmd_flags,\n+\t\t\t   uint16_t *major_ver,\n+\t\t\t   uint16_t *minor_ver)\n+{\n+\tstruct mc_command cmd = { 0 };\n+\tstruct dpdmux_rsp_get_api_version *rsp_params;\n+\tint err;\n+\n+\tcmd.header = mc_encode_cmd_header(DPDMUX_CMDID_GET_API_VERSION,\n+\t\t\t\t\tcmd_flags,\n+\t\t\t\t\t0);\n+\n+\terr = mc_send_command(mc_io, &cmd);\n+\tif (err)\n+\t\treturn err;\n+\n+\trsp_params = (struct dpdmux_rsp_get_api_version *)cmd.params;\n+\t*major_ver = le16_to_cpu(rsp_params->major);\n+\t*minor_ver = le16_to_cpu(rsp_params->minor);\n+\n+\treturn 0;\n+}\ndiff --git a/drivers/net/dpaa2/mc/fsl_dpdmux.h b/drivers/net/dpaa2/mc/fsl_dpdmux.h\nnew file mode 100644\nindex 000000000..c69cb7aab\n--- /dev/null\n+++ b/drivers/net/dpaa2/mc/fsl_dpdmux.h\n@@ -0,0 +1,410 @@\n+/* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0)\n+ *\n+ * Copyright 2013-2016 Freescale Semiconductor Inc.\n+ * Copyright 2018 NXP\n+ *\n+ */\n+#ifndef __FSL_DPDMUX_H\n+#define __FSL_DPDMUX_H\n+\n+#include <fsl_net.h>\n+\n+struct fsl_mc_io;\n+\n+/** @addtogroup dpdmux Data Path Demux API\n+ * Contains API for handling DPDMUX topology and functionality\n+ * @{\n+ */\n+\n+int dpdmux_open(struct fsl_mc_io *mc_io,\n+\t\tuint32_t  cmd_flags,\n+\t\tint  dpdmux_id,\n+\t\tuint16_t  *token);\n+\n+int dpdmux_close(struct fsl_mc_io *mc_io,\n+\t\t uint32_t cmd_flags,\n+\t\t uint16_t token);\n+\n+/**\n+ * DPDMUX general options\n+ */\n+\n+/**\n+ * Enable bridging between internal interfaces\n+ */\n+#define DPDMUX_OPT_BRIDGE_EN\t0x0000000000000002ULL\n+\n+/**\n+ * Mask support for classification\n+ */\n+#define DPDMUX_OPT_CLS_MASK_SUPPORT\t\t0x0000000000000020ULL\n+\n+#define DPDMUX_IRQ_INDEX_IF\t0x0000\n+#define DPDMUX_IRQ_INDEX\t0x0001\n+\n+/**\n+ * IRQ event - Indicates that the link state changed\n+ */\n+#define DPDMUX_IRQ_EVENT_LINK_CHANGED\t0x0001\n+\n+/**\n+ * enum dpdmux_manip - DPDMUX manipulation operations\n+ * @DPDMUX_MANIP_NONE:\tNo manipulation on frames\n+ * @DPDMUX_MANIP_ADD_REMOVE_S_VLAN: Add S-VLAN on egress, remove it on ingress\n+ */\n+enum dpdmux_manip {\n+\tDPDMUX_MANIP_NONE = 0x0,\n+\tDPDMUX_MANIP_ADD_REMOVE_S_VLAN = 0x1\n+};\n+\n+/**\n+ * enum dpdmux_method - DPDMUX method options\n+ * @DPDMUX_METHOD_NONE: no DPDMUX method\n+ * @DPDMUX_METHOD_C_VLAN_MAC: DPDMUX based on C-VLAN and MAC address\n+ * @DPDMUX_METHOD_MAC: DPDMUX based on MAC address\n+ * @DPDMUX_METHOD_C_VLAN: DPDMUX based on C-VLAN\n+ * @DPDMUX_METHOD_S_VLAN: DPDMUX based on S-VLAN\n+ */\n+enum dpdmux_method {\n+\tDPDMUX_METHOD_NONE = 0x0,\n+\tDPDMUX_METHOD_C_VLAN_MAC = 0x1,\n+\tDPDMUX_METHOD_MAC = 0x2,\n+\tDPDMUX_METHOD_C_VLAN = 0x3,\n+\tDPDMUX_METHOD_S_VLAN = 0x4,\n+\tDPDMUX_METHOD_CUSTOM = 0x5,\n+};\n+\n+/**\n+ * struct dpdmux_cfg - DPDMUX configuration parameters\n+ * @method: Defines the operation method for the DPDMUX address table\n+ * @manip: Required manipulation operation\n+ * @num_ifs: Number of interfaces (excluding the uplink interface)\n+ * @adv: Advanced parameters; default is all zeros;\n+ *\tuse this structure to change default settings\n+ * @adv.options: DPDMUX options - combination of 'DPDMUX_OPT_<X>' flags.\n+ * @adv.max_dmat_entries: Maximum entries in DPDMUX address table\n+ *\t0 - indicates default: 64 entries per interface.\n+ * @adv.max_mc_groups: Number of multicast groups in DPDMUX table\n+ *\t0 - indicates default: 32 multicast groups.\n+ * @adv.max_vlan_ids: Maximum vlan ids allowed in the system -\n+ *\trelevant only case of working in mac+vlan method.\n+ *\t0 - indicates default 16 vlan ids.\n+ */\n+struct dpdmux_cfg {\n+\tenum dpdmux_method method;\n+\tenum dpdmux_manip manip;\n+\tuint16_t num_ifs;\n+\tstruct {\n+\t\tuint64_t options;\n+\t\tuint16_t max_dmat_entries;\n+\t\tuint16_t max_mc_groups;\n+\t\tuint16_t max_vlan_ids;\n+\t} adv;\n+};\n+\n+int dpdmux_create(struct fsl_mc_io *mc_io,\n+\t\t  uint16_t dprc_token,\n+\t\t  uint32_t cmd_flags,\n+\t\t  const struct dpdmux_cfg *cfg,\n+\t\t  uint32_t *obj_id);\n+\n+int dpdmux_destroy(struct fsl_mc_io *mc_io,\n+\t\t   uint16_t dprc_token,\n+\t\t   uint32_t cmd_flags,\n+\t\t   uint32_t object_id);\n+\n+int dpdmux_enable(struct fsl_mc_io *mc_io,\n+\t\t  uint32_t cmd_flags,\n+\t\t  uint16_t token);\n+\n+int dpdmux_disable(struct fsl_mc_io *mc_io,\n+\t\t   uint32_t cmd_flags,\n+\t\t   uint16_t token);\n+\n+int dpdmux_is_enabled(struct fsl_mc_io *mc_io,\n+\t\t      uint32_t cmd_flags,\n+\t\t      uint16_t token,\n+\t\t      int *en);\n+\n+int dpdmux_reset(struct fsl_mc_io *mc_io,\n+\t\t uint32_t cmd_flags,\n+\t\t uint16_t token);\n+\n+/**\n+ * struct dpdmux_attr - Structure representing DPDMUX attributes\n+ * @id: DPDMUX object ID\n+ * @options: Configuration options (bitmap)\n+ * @method: DPDMUX address table method\n+ * @manip: DPDMUX manipulation type\n+ * @num_ifs: Number of interfaces (excluding the uplink interface)\n+ * @mem_size: DPDMUX frame storage memory size\n+ */\n+struct dpdmux_attr {\n+\tint id;\n+\tuint64_t options;\n+\tenum dpdmux_method method;\n+\tenum dpdmux_manip manip;\n+\tuint16_t num_ifs;\n+\tuint16_t mem_size;\n+};\n+\n+int dpdmux_get_attributes(struct fsl_mc_io *mc_io,\n+\t\t\t  uint32_t cmd_flags,\n+\t\t\t  uint16_t token,\n+\t\t\t  struct dpdmux_attr *attr);\n+\n+int dpdmux_set_max_frame_length(struct fsl_mc_io *mc_io,\n+\t\t\t\tuint32_t cmd_flags,\n+\t\t\t\tuint16_t token,\n+\t\t\t\tuint16_t max_frame_length);\n+\n+/**\n+ * enum dpdmux_counter_type - Counter types\n+ * @DPDMUX_CNT_ING_FRAME: Counts ingress frames\n+ * @DPDMUX_CNT_ING_BYTE: Counts ingress bytes\n+ * @DPDMUX_CNT_ING_FLTR_FRAME: Counts filtered ingress frames\n+ * @DPDMUX_CNT_ING_FRAME_DISCARD: Counts discarded ingress frames\n+ * @DPDMUX_CNT_ING_MCAST_FRAME: Counts ingress multicast frames\n+ * @DPDMUX_CNT_ING_MCAST_BYTE: Counts ingress multicast bytes\n+ * @DPDMUX_CNT_ING_BCAST_FRAME: Counts ingress broadcast frames\n+ * @DPDMUX_CNT_ING_BCAST_BYTES: Counts ingress broadcast bytes\n+ * @DPDMUX_CNT_EGR_FRAME: Counts egress frames\n+ * @DPDMUX_CNT_EGR_BYTE: Counts egress bytes\n+ * @DPDMUX_CNT_EGR_FRAME_DISCARD: Counts discarded egress frames\n+ */\n+enum dpdmux_counter_type {\n+\tDPDMUX_CNT_ING_FRAME = 0x0,\n+\tDPDMUX_CNT_ING_BYTE = 0x1,\n+\tDPDMUX_CNT_ING_FLTR_FRAME = 0x2,\n+\tDPDMUX_CNT_ING_FRAME_DISCARD = 0x3,\n+\tDPDMUX_CNT_ING_MCAST_FRAME = 0x4,\n+\tDPDMUX_CNT_ING_MCAST_BYTE = 0x5,\n+\tDPDMUX_CNT_ING_BCAST_FRAME = 0x6,\n+\tDPDMUX_CNT_ING_BCAST_BYTES = 0x7,\n+\tDPDMUX_CNT_EGR_FRAME = 0x8,\n+\tDPDMUX_CNT_EGR_BYTE = 0x9,\n+\tDPDMUX_CNT_EGR_FRAME_DISCARD = 0xa\n+};\n+\n+/**\n+ * enum dpdmux_accepted_frames_type - DPDMUX frame types\n+ * @DPDMUX_ADMIT_ALL: The device accepts VLAN tagged, untagged and\n+ *\t\t\tpriority-tagged frames\n+ * @DPDMUX_ADMIT_ONLY_VLAN_TAGGED: The device discards untagged frames or\n+ *\t\t\t\tpriority-tagged frames that are received on this\n+ *\t\t\t\tinterface\n+ * @DPDMUX_ADMIT_ONLY_UNTAGGED: Untagged frames or priority-tagged frames\n+ *\t\t\t\treceived on this interface are accepted\n+ */\n+enum dpdmux_accepted_frames_type {\n+\tDPDMUX_ADMIT_ALL = 0,\n+\tDPDMUX_ADMIT_ONLY_VLAN_TAGGED = 1,\n+\tDPDMUX_ADMIT_ONLY_UNTAGGED = 2\n+};\n+\n+/**\n+ * enum dpdmux_action - DPDMUX action for un-accepted frames\n+ * @DPDMUX_ACTION_DROP: Drop un-accepted frames\n+ * @DPDMUX_ACTION_REDIRECT_TO_CTRL: Redirect un-accepted frames to the\n+ *\t\t\t\t\tcontrol interface\n+ */\n+enum dpdmux_action {\n+\tDPDMUX_ACTION_DROP = 0,\n+\tDPDMUX_ACTION_REDIRECT_TO_CTRL = 1\n+};\n+\n+/**\n+ * struct dpdmux_accepted_frames - Frame types configuration\n+ * @type: Defines ingress accepted frames\n+ * @unaccept_act: Defines action on frames not accepted\n+ */\n+struct dpdmux_accepted_frames {\n+\tenum dpdmux_accepted_frames_type type;\n+\tenum dpdmux_action unaccept_act;\n+};\n+\n+int dpdmux_if_set_accepted_frames(struct fsl_mc_io *mc_io,\n+\t\t\t\t  uint32_t cmd_flags,\n+\t\t\t\t  uint16_t token,\n+\t\t\t\t  uint16_t if_id,\n+\t\t\t\t  const struct dpdmux_accepted_frames *cfg);\n+\n+/**\n+ * struct dpdmux_if_attr - Structure representing frame types configuration\n+ * @rate: Configured interface rate (in bits per second)\n+ * @enabled: Indicates if interface is enabled\n+ * @accept_frame_type: Indicates type of accepted frames for the interface\n+ */\n+struct dpdmux_if_attr {\n+\tuint32_t rate;\n+\tint enabled;\n+\tint is_default;\n+\tenum dpdmux_accepted_frames_type accept_frame_type;\n+};\n+\n+int dpdmux_if_get_attributes(struct fsl_mc_io *mc_io,\n+\t\t\t     uint32_t cmd_flags,\n+\t\t\t     uint16_t token,\n+\t\t\t     uint16_t if_id,\n+\t\t\t     struct dpdmux_if_attr *attr);\n+\n+int dpdmux_if_enable(struct fsl_mc_io *mc_io,\n+\t\t     uint32_t cmd_flags,\n+\t\t     uint16_t token,\n+\t\t     uint16_t if_id);\n+\n+int dpdmux_if_disable(struct fsl_mc_io *mc_io,\n+\t\t      uint32_t cmd_flags,\n+\t\t      uint16_t token,\n+\t\t      uint16_t if_id);\n+\n+/**\n+ * struct dpdmux_l2_rule - Structure representing L2 rule\n+ * @mac_addr: MAC address\n+ * @vlan_id: VLAN ID\n+ */\n+struct dpdmux_l2_rule {\n+\tuint8_t mac_addr[6];\n+\tuint16_t vlan_id;\n+};\n+\n+int dpdmux_if_remove_l2_rule(struct fsl_mc_io *mc_io,\n+\t\t\t     uint32_t cmd_flags,\n+\t\t\t     uint16_t token,\n+\t\t\t     uint16_t if_id,\n+\t\t\t     const struct dpdmux_l2_rule *rule);\n+\n+int dpdmux_if_add_l2_rule(struct fsl_mc_io *mc_io,\n+\t\t\t  uint32_t cmd_flags,\n+\t\t\t  uint16_t token,\n+\t\t\t  uint16_t if_id,\n+\t\t\t  const struct dpdmux_l2_rule *rule);\n+\n+int dpdmux_if_get_counter(struct fsl_mc_io *mc_io,\n+\t\t\t  uint32_t cmd_flags,\n+\t\t\t  uint16_t token,\n+\t\t\t  uint16_t if_id,\n+\t\t\t  enum dpdmux_counter_type counter_type,\n+\t\t\t  uint64_t *counter);\n+\n+int dpdmux_ul_reset_counters(struct fsl_mc_io *mc_io,\n+\t\t\t     uint32_t cmd_flags,\n+\t\t\t     uint16_t token);\n+\n+/**\n+ * Enable auto-negotiation\n+ */\n+#define DPDMUX_LINK_OPT_AUTONEG\t\t0x0000000000000001ULL\n+/**\n+ * Enable half-duplex mode\n+ */\n+#define DPDMUX_LINK_OPT_HALF_DUPLEX\t0x0000000000000002ULL\n+/**\n+ * Enable pause frames\n+ */\n+#define DPDMUX_LINK_OPT_PAUSE\t\t0x0000000000000004ULL\n+/**\n+ * Enable a-symmetric pause frames\n+ */\n+#define DPDMUX_LINK_OPT_ASYM_PAUSE\t0x0000000000000008ULL\n+\n+/**\n+ * struct dpdmux_link_cfg - Structure representing DPDMUX link configuration\n+ * @rate: Rate\n+ * @options: Mask of available options; use 'DPDMUX_LINK_OPT_<X>' values\n+ */\n+struct dpdmux_link_cfg {\n+\tuint32_t rate;\n+\tuint64_t options;\n+\tuint64_t advertising;\n+};\n+\n+int dpdmux_if_set_link_cfg(struct fsl_mc_io *mc_io,\n+\t\t\t   uint32_t cmd_flags,\n+\t\t\t   uint16_t token,\n+\t\t\t   uint16_t if_id,\n+\t\t\t   struct dpdmux_link_cfg *cfg);\n+/**\n+ * struct dpdmux_link_state - Structure representing DPDMUX link state\n+ * @rate: Rate\n+ * @options: Mask of available options; use 'DPDMUX_LINK_OPT_<X>' values\n+ * @up: 0 - down, 1 - up\n+ * @state_valid: Ignore/Update the state of the link\n+ * @supported: Speeds capability of the phy (bitmap)\n+ * @advertising: Speeds that are advertised for autoneg (bitmap)\n+ */\n+struct dpdmux_link_state {\n+\tuint32_t rate;\n+\tuint64_t options;\n+\tint      up;\n+\tint      state_valid;\n+\tuint64_t supported;\n+\tuint64_t advertising;\n+};\n+\n+int dpdmux_if_get_link_state(struct fsl_mc_io *mc_io,\n+\t\t\t     uint32_t cmd_flags,\n+\t\t\t     uint16_t token,\n+\t\t\t     uint16_t if_id,\n+\t\t\t     struct dpdmux_link_state *state);\n+\n+int dpdmux_if_set_default(struct fsl_mc_io *mc_io,\n+\t\tuint32_t cmd_flags,\n+\t\tuint16_t token,\n+\t\tuint16_t if_id);\n+\n+int dpdmux_if_get_default(struct fsl_mc_io *mc_io,\n+\t\tuint32_t cmd_flags,\n+\t\tuint16_t token,\n+\t\tuint16_t *if_id);\n+\n+int dpdmux_set_custom_key(struct fsl_mc_io *mc_io,\n+\t\t\tuint32_t cmd_flags,\n+\t\t\tuint16_t token,\n+\t\t\tuint64_t key_cfg_iova);\n+\n+/**\n+ * struct dpdmux_rule_cfg - Custom classification rule.\n+ *\n+ * @key_iova: DMA address of buffer storing the look-up value\n+ * @mask_iova: DMA address of the mask used for TCAM classification\n+ * @key_size: size, in bytes, of the look-up value. This must match the size\n+ *\tof the look-up key defined using dpdmux_set_custom_key, otherwise the\n+ *\tentry will never be hit\n+ */\n+struct dpdmux_rule_cfg {\n+\tuint64_t key_iova;\n+\tuint64_t mask_iova;\n+\tuint8_t key_size;\n+};\n+\n+/**\n+ * struct dpdmux_cls_action - Action to execute for frames matching the\n+ *\tclassification entry\n+ *\n+ * @dest_if: Interface to forward the frames to. Port numbering is similar to\n+ *\tthe one used to connect interfaces:\n+ *\t- 0 is the uplink port,\n+ *\t- all others are downlink ports.\n+ */\n+struct dpdmux_cls_action {\n+\tuint16_t dest_if;\n+};\n+\n+int dpdmux_add_custom_cls_entry(struct fsl_mc_io *mc_io,\n+\t\tuint32_t cmd_flags,\n+\t\tuint16_t token,\n+\t\tstruct dpdmux_rule_cfg *rule,\n+\t\tstruct dpdmux_cls_action *action);\n+\n+int dpdmux_remove_custom_cls_entry(struct fsl_mc_io *mc_io,\n+\t\tuint32_t cmd_flags,\n+\t\tuint16_t token,\n+\t\tstruct dpdmux_rule_cfg *rule);\n+\n+int dpdmux_get_api_version(struct fsl_mc_io *mc_io,\n+\t\t\t   uint32_t cmd_flags,\n+\t\t\t   uint16_t *major_ver,\n+\t\t\t   uint16_t *minor_ver);\n+\n+#endif /* __FSL_DPDMUX_H */\ndiff --git a/drivers/net/dpaa2/mc/fsl_dpdmux_cmd.h b/drivers/net/dpaa2/mc/fsl_dpdmux_cmd.h\nnew file mode 100644\nindex 000000000..a36349feb\n--- /dev/null\n+++ b/drivers/net/dpaa2/mc/fsl_dpdmux_cmd.h\n@@ -0,0 +1,221 @@\n+/* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0)\n+ *\n+ * Copyright 2013-2016 Freescale Semiconductor Inc.\n+ * Copyright 2018 NXP\n+ *\n+ */\n+#ifndef _FSL_DPDMUX_CMD_H\n+#define _FSL_DPDMUX_CMD_H\n+\n+/* DPDMUX Version */\n+#define DPDMUX_VER_MAJOR\t\t6\n+#define DPDMUX_VER_MINOR\t\t3\n+\n+#define DPDMUX_CMD_BASE_VERSION\t\t1\n+#define DPDMUX_CMD_VERSION_2\t\t2\n+#define DPDMUX_CMD_ID_OFFSET\t\t4\n+\n+#define DPDMUX_CMD(id)\t(((id) << DPDMUX_CMD_ID_OFFSET) |\\\n+\t\t\t\tDPDMUX_CMD_BASE_VERSION)\n+#define DPDMUX_CMD_V2(id) (((id) << DPDMUX_CMD_ID_OFFSET) | \\\n+\t\t\t\tDPDMUX_CMD_VERSION_2)\n+\n+/* Command IDs */\n+#define DPDMUX_CMDID_CLOSE\t\t\tDPDMUX_CMD(0x800)\n+#define DPDMUX_CMDID_OPEN\t\t\tDPDMUX_CMD(0x806)\n+#define DPDMUX_CMDID_CREATE\t\t\tDPDMUX_CMD(0x906)\n+#define DPDMUX_CMDID_DESTROY\t\t\tDPDMUX_CMD(0x986)\n+#define DPDMUX_CMDID_GET_API_VERSION\t\tDPDMUX_CMD(0xa06)\n+\n+#define DPDMUX_CMDID_ENABLE\t\t\tDPDMUX_CMD(0x002)\n+#define DPDMUX_CMDID_DISABLE\t\t\tDPDMUX_CMD(0x003)\n+#define DPDMUX_CMDID_GET_ATTR\t\t\tDPDMUX_CMD(0x004)\n+#define DPDMUX_CMDID_RESET\t\t\tDPDMUX_CMD(0x005)\n+#define DPDMUX_CMDID_IS_ENABLED\t\t\tDPDMUX_CMD(0x006)\n+\n+#define DPDMUX_CMDID_SET_MAX_FRAME_LENGTH\tDPDMUX_CMD(0x0a1)\n+\n+#define DPDMUX_CMDID_UL_RESET_COUNTERS\t\tDPDMUX_CMD(0x0a3)\n+\n+#define DPDMUX_CMDID_IF_SET_ACCEPTED_FRAMES\tDPDMUX_CMD(0x0a7)\n+#define DPDMUX_CMDID_IF_GET_ATTR\t\tDPDMUX_CMD(0x0a8)\n+#define DPDMUX_CMDID_IF_ENABLE\t\t\tDPDMUX_CMD(0x0a9)\n+#define DPDMUX_CMDID_IF_DISABLE\t\t\tDPDMUX_CMD(0x0aa)\n+\n+#define DPDMUX_CMDID_IF_ADD_L2_RULE\t\tDPDMUX_CMD(0x0b0)\n+#define DPDMUX_CMDID_IF_REMOVE_L2_RULE\t\tDPDMUX_CMD(0x0b1)\n+#define DPDMUX_CMDID_IF_GET_COUNTER\t\tDPDMUX_CMD(0x0b2)\n+#define DPDMUX_CMDID_IF_SET_LINK_CFG\t\tDPDMUX_CMD_V2(0x0b3)\n+#define DPDMUX_CMDID_IF_GET_LINK_STATE\t\tDPDMUX_CMD_V2(0x0b4)\n+\n+#define DPDMUX_CMDID_SET_CUSTOM_KEY\t\tDPDMUX_CMD(0x0b5)\n+#define DPDMUX_CMDID_ADD_CUSTOM_CLS_ENTRY\tDPDMUX_CMD(0x0b6)\n+#define DPDMUX_CMDID_REMOVE_CUSTOM_CLS_ENTRY\tDPDMUX_CMD(0x0b7)\n+\n+#define DPDMUX_CMDID_IF_SET_DEFAULT\t\tDPDMUX_CMD(0x0b8)\n+#define DPDMUX_CMDID_IF_GET_DEFAULT\t\tDPDMUX_CMD(0x0b9)\n+\n+#define DPDMUX_MASK(field)        \\\n+\tGENMASK(DPDMUX_##field##_SHIFT + DPDMUX_##field##_SIZE - 1, \\\n+\t\tDPDMUX_##field##_SHIFT)\n+#define dpdmux_set_field(var, field, val) \\\n+\t((var) |= (((val) << DPDMUX_##field##_SHIFT) & DPDMUX_MASK(field)))\n+#define dpdmux_get_field(var, field)      \\\n+\t(((var) & DPDMUX_MASK(field)) >> DPDMUX_##field##_SHIFT)\n+\n+#pragma pack(push, 1)\n+struct dpdmux_cmd_open {\n+\tuint32_t dpdmux_id;\n+};\n+\n+struct dpdmux_cmd_create {\n+\tuint8_t method;\n+\tuint8_t manip;\n+\tuint16_t num_ifs;\n+\tuint32_t pad;\n+\n+\tuint16_t adv_max_dmat_entries;\n+\tuint16_t adv_max_mc_groups;\n+\tuint16_t adv_max_vlan_ids;\n+\tuint16_t pad1;\n+\n+\tuint64_t options;\n+};\n+\n+struct dpdmux_cmd_destroy {\n+\tuint32_t dpdmux_id;\n+};\n+\n+#define DPDMUX_ENABLE_SHIFT\t0\n+#define DPDMUX_ENABLE_SIZE\t1\n+#define DPDMUX_IS_DEFAULT_SHIFT\t\t1\n+#define DPDMUX_IS_DEFAULT_SIZE\t\t1\n+\n+struct dpdmux_rsp_is_enabled {\n+\tuint8_t en;\n+};\n+\n+struct dpdmux_rsp_get_attr {\n+\tuint8_t method;\n+\tuint8_t manip;\n+\tuint16_t num_ifs;\n+\tuint16_t mem_size;\n+\tuint16_t pad;\n+\n+\tuint64_t pad1;\n+\n+\tuint32_t id;\n+\tuint32_t pad2;\n+\n+\tuint64_t options;\n+};\n+\n+struct dpdmux_cmd_set_max_frame_length {\n+\tuint16_t max_frame_length;\n+};\n+\n+#define DPDMUX_ACCEPTED_FRAMES_TYPE_SHIFT\t0\n+#define DPDMUX_ACCEPTED_FRAMES_TYPE_SIZE\t4\n+#define DPDMUX_UNACCEPTED_FRAMES_ACTION_SHIFT\t4\n+#define DPDMUX_UNACCEPTED_FRAMES_ACTION_SIZE\t4\n+\n+struct dpdmux_cmd_if_set_accepted_frames {\n+\tuint16_t if_id;\n+\tuint8_t frames_options;\n+};\n+\n+struct dpdmux_cmd_if {\n+\tuint16_t if_id;\n+};\n+\n+struct dpdmux_rsp_if_get_attr {\n+\tuint8_t pad[3];\n+\tuint8_t enabled;\n+\tuint8_t pad1[3];\n+\tuint8_t accepted_frames_type;\n+\tuint32_t rate;\n+};\n+\n+struct dpdmux_cmd_if_l2_rule {\n+\tuint16_t if_id;\n+\tuint8_t mac_addr5;\n+\tuint8_t mac_addr4;\n+\tuint8_t mac_addr3;\n+\tuint8_t mac_addr2;\n+\tuint8_t mac_addr1;\n+\tuint8_t mac_addr0;\n+\n+\tuint32_t pad;\n+\tuint16_t vlan_id;\n+};\n+\n+struct dpdmux_cmd_if_get_counter {\n+\tuint16_t if_id;\n+\tuint8_t counter_type;\n+};\n+\n+struct dpdmux_rsp_if_get_counter {\n+\tuint64_t pad;\n+\tuint64_t counter;\n+};\n+\n+struct dpdmux_cmd_if_set_link_cfg {\n+\tuint16_t if_id;\n+\tuint16_t pad[3];\n+\n+\tuint32_t rate;\n+\tuint32_t pad1;\n+\n+\tuint64_t options;\n+\tuint64_t advertising;\n+};\n+\n+struct dpdmux_cmd_if_get_link_state {\n+\tuint16_t if_id;\n+};\n+\n+#define DPDMUX_UP_SHIFT\t\t\t\t0\n+#define DPDMUX_UP_SIZE\t\t\t\t1\n+#define DPDMUX_STATE_VALID_SHIFT\t1\n+#define DPDMUX_STATE_VALID_SIZE\t\t1\n+struct dpdmux_rsp_if_get_link_state {\n+\tuint32_t pad;\n+\tuint8_t up;\n+\tuint8_t pad1[3];\n+\n+\tuint32_t rate;\n+\tuint32_t pad2;\n+\n+\tuint64_t options;\n+\tuint64_t supported;\n+\tuint64_t advertising;\n+};\n+\n+struct dpdmux_rsp_get_api_version {\n+\tuint16_t major;\n+\tuint16_t minor;\n+};\n+\n+struct dpdmux_set_custom_key {\n+\tuint64_t pad[6];\n+\tuint64_t key_cfg_iova;\n+};\n+\n+struct dpdmux_cmd_add_custom_cls_entry {\n+\tuint8_t pad[3];\n+\tuint8_t key_size;\n+\tuint16_t pad1;\n+\tuint16_t dest_if;\n+\tuint64_t key_iova;\n+\tuint64_t mask_iova;\n+};\n+\n+struct dpdmux_cmd_remove_custom_cls_entry {\n+\tuint8_t pad[3];\n+\tuint8_t key_size;\n+\tuint32_t pad1;\n+\tuint64_t key_iova;\n+\tuint64_t mask_iova;\n+};\n+#pragma pack(pop)\n+#endif /* _FSL_DPDMUX_CMD_H */\ndiff --git a/drivers/net/dpaa2/meson.build b/drivers/net/dpaa2/meson.build\nindex 07aada87c..c7c2df417 100644\n--- a/drivers/net/dpaa2/meson.build\n+++ b/drivers/net/dpaa2/meson.build\n@@ -12,6 +12,7 @@ sources = files('base/dpaa2_hw_dpni.c',\n \t\t'dpaa2_ethdev.c',\n \t\t'dpaa2_rxtx.c',\n \t\t'mc/dpkg.c',\n+\t\t'mc/dpdmux.c',\n \t\t'mc/dpni.c')\n \n includes += include_directories('base', 'mc')\n",
    "prefixes": [
        "v3",
        "13/19"
    ]
}