get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 49301,
    "url": "http://patches.dpdk.org/api/patches/49301/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20181227062233.30781-14-hemant.agrawal@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": "<20181227062233.30781-14-hemant.agrawal@nxp.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20181227062233.30781-14-hemant.agrawal@nxp.com",
    "date": "2018-12-27T06:23:11",
    "name": "[13/20] net/dpaa2: add dpdmux mc flib",
    "commit_ref": null,
    "pull_url": null,
    "state": "changes-requested",
    "archived": true,
    "hash": "ba6eef95218c0f6d6e12ff3f6a545e13dfb75c20",
    "submitter": {
        "id": 477,
        "url": "http://patches.dpdk.org/api/people/477/?format=api",
        "name": "Hemant Agrawal",
        "email": "hemant.agrawal@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/20181227062233.30781-14-hemant.agrawal@nxp.com/mbox/",
    "series": [
        {
            "id": 2954,
            "url": "http://patches.dpdk.org/api/series/2954/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=2954",
            "date": "2018-12-27T06:22:50",
            "name": "NXP DPAA2 fixes and enhancements",
            "version": 1,
            "mbox": "http://patches.dpdk.org/series/2954/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/49301/comments/",
    "check": "warning",
    "checks": "http://patches.dpdk.org/api/patches/49301/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 07BA15B16;\n\tThu, 27 Dec 2018 07:23:24 +0100 (CET)",
            "from EUR01-VE1-obe.outbound.protection.outlook.com\n\t(mail-eopbgr140055.outbound.protection.outlook.com [40.107.14.55])\n\tby dpdk.org (Postfix) with ESMTP id 495E9568A\n\tfor <dev@dpdk.org>; Thu, 27 Dec 2018 07:23:13 +0100 (CET)",
            "from VI1PR0401MB2541.eurprd04.prod.outlook.com (10.168.65.19) by\n\tVI1PR0401MB2382.eurprd04.prod.outlook.com (10.169.134.11) with\n\tMicrosoft SMTP Server (version=TLS1_2,\n\tcipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id\n\t15.20.1471.20; Thu, 27 Dec 2018 06:23:11 +0000",
            "from VI1PR0401MB2541.eurprd04.prod.outlook.com\n\t([fe80::555e:164:f8f0:dbb4]) by\n\tVI1PR0401MB2541.eurprd04.prod.outlook.com\n\t([fe80::555e:164:f8f0:dbb4%2]) with mapi id 15.20.1471.019;\n\tThu, 27 Dec 2018 06:23:11 +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=iAnMeOsaECHHw8Y4dK6rA+00bLAsQ+ZDux6kPhjWK2UMkODEioTKSib9jrGb37pHQlOB+BNcRXphTpcPB2O6O/pfOLCKOrfm7m3EqCon6hnzAK65bdWlcNgNR4c8JtoxN+DrkoorAjHdlo68roQutDaB7h3VP8McSfbCpiUgWqY=",
        "From": "Hemant Agrawal <hemant.agrawal@nxp.com>",
        "To": "\"dev@dpdk.org\" <dev@dpdk.org>",
        "CC": "\"ferruh.yigit@intel.com\" <ferruh.yigit@intel.com>, Shreyansh Jain\n\t<shreyansh.jain@nxp.com>, Nipun Gupta <nipun.gupta@nxp.com>",
        "Thread-Topic": "[PATCH 13/20] net/dpaa2: add dpdmux mc flib",
        "Thread-Index": "AQHUnaykzVN3OaSFokCx76WbgBO0DQ==",
        "Date": "Thu, 27 Dec 2018 06:23:11 +0000",
        "Message-ID": "<20181227062233.30781-14-hemant.agrawal@nxp.com>",
        "References": "<20181227062233.30781-1-hemant.agrawal@nxp.com>",
        "In-Reply-To": "<20181227062233.30781-1-hemant.agrawal@nxp.com>",
        "Accept-Language": "en-US",
        "Content-Language": "en-US",
        "X-MS-Has-Attach": "",
        "X-MS-TNEF-Correlator": "",
        "x-originating-ip": "[14.143.30.134]",
        "x-mailer": "git-send-email 2.17.1",
        "x-clientproxiedby": "BM1PR01CA0120.INDPRD01.PROD.OUTLOOK.COM\n\t(2603:1096:b00:40::14) To VI1PR0401MB2541.eurprd04.prod.outlook.com\n\t(2603:10a6:800:56::19)",
        "authentication-results": "spf=none (sender IP is )\n\tsmtp.mailfrom=hemant.agrawal@nxp.com; ",
        "x-ms-exchange-messagesentrepresentingtype": "1",
        "x-ms-publictraffictype": "Email",
        "x-microsoft-exchange-diagnostics": "1; VI1PR0401MB2382;\n\t6:4drmB3szAeMitfqm4PiLjq4wXn4wdc9ImC5IxNMdgNZ8C6cXGWV//HFylE572GprXhNom2nEicY8YrsUiGssR2Igm/QB3rVdn/t80k13KPye51dkdHVVsWPiFlWX6XsfHYjoZ2khpA8M6WSbILpHbKC39LjepcsoL/3t7oMICFCJ09rAbcTt5RuqOA7pwZOgOInB1BQWxE5E+jlXWOSSHHMI4KbMUMrweHqJNLYkFKjNoip/Zgbs12+S7Sdo03StDTPOll7PgP//95M9s7EptoB3tuEH9y71RMq//LJ47iTdIUEgzsnok4KnNJ943lmtU2UzaXrMkJRAgBhFuVBhWxGrJTh6n6/9XKRdmo1r63jo6fr70p1BvcVPMAYG/PeHZPN25YefcAkZZbkV5ChMfnUFDC2gFh0q5xw87E9WAF51HlFk8nqdLMBDkba1ngddkBsCyiAsvMdY7+FWm8FmMQ==;\n\t5:X6POCoEUDtziS41M+fVupaOG+flcp04k6/1hc9ZLFvkyW5rrOT6qGLYp1InDJfpJAuK4xH35jge8UQb8lgBkKdCzu+DFD5vWW2Qu/wWse0GrGxr4liBAlG1qgfcYes4D8R06nhjmrHjsNQxTJmPKWlbzWxxjF+fbVhPJpDoVyRA=;\n\t7:GTiCCCPtgv48vWgWk8q1T2ZZ4wZyBorrcuESEfO/JIc8VclDYG70sKDffCM/t6ZgenLgWgnyuKnfO+dh3FsWvA40OIL1K1J4bkLSxJO1Il8Jax6ZKqhmXkBRiOzisedfU0nn/OzyMAdoNZByRRa5iA==",
        "x-ms-office365-filtering-correlation-id": "1bd3d02a-82f0-4992-de40-08d66bc3c64f",
        "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)(5600074)(711020)(4618075)(2017052603328)(7153060)(7193020);\n\tSRVR:VI1PR0401MB2382; ",
        "x-ms-traffictypediagnostic": "VI1PR0401MB2382:",
        "x-microsoft-antispam-prvs": "<VI1PR0401MB2382BA1624836B2E0204EEA089B60@VI1PR0401MB2382.eurprd04.prod.outlook.com>",
        "x-exchange-antispam-report-cfa-test": "BCL:0; PCL:0;\n\tRULEID:(8211001083)(3230021)(908002)(999002)(5005026)(6040522)(2401047)(8121501046)(10201501046)(3002001)(93006095)(93001095)(3231475)(944501520)(52105112)(6055026)(6041310)(20161123560045)(20161123562045)(20161123564045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(201708071742011)(7699051)(76991095);\n\tSRVR:VI1PR0401MB2382; BCL:0; PCL:0; RULEID:; SRVR:VI1PR0401MB2382; ",
        "x-forefront-prvs": "0899B47777",
        "x-forefront-antispam-report": "SFV:NSPM;\n\tSFS:(10009020)(136003)(396003)(366004)(376002)(39860400002)(346002)(199004)(189003)(5660300001)(1076003)(575784001)(26005)(76176011)(186003)(71200400001)(256004)(25786009)(105586002)(4326008)(6436002)(305945005)(11346002)(4744004)(106356001)(14444005)(446003)(44832011)(476003)(7736002)(55236004)(102836004)(78486014)(486006)(386003)(68736007)(52116002)(86362001)(6506007)(2616005)(71190400001)(66066001)(316002)(54906003)(6116002)(3846002)(2906002)(14454004)(36756003)(99286004)(50226002)(8936002)(1730700003)(81156014)(81166006)(8676002)(6512007)(53936002)(478600001)(97736004)(6486002)(6916009)(53946003)(5640700003)(2351001)(2501003)(559001)(569006);\n\tDIR:OUT; SFP:1101; SCL:1; SRVR:VI1PR0401MB2382;\n\tH:VI1PR0401MB2541.eurprd04.prod.outlook.com; FPR:; SPF:None; LANG:en; \n\tPTR:InfoNoRecords; A:1; MX: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": "xEovrVmBGP5EiYyehQDG6cAfk1WomwsTxKJZd1udYEV/7zj7Oc56VlVOy2wu/3eSkBhZU0g67tcaSvWZoElbxrqS/qiPXszB4i00BsCYVakncqxfDqfutUOeB3+4XlCqfRYbL1Zq7MtnEBQOXXvd0GdU9wqW+MZLXbZkYEOhNvHjxK6g9M8R82jJshgdoCfdTezpUXEgtDTIUq9FfUDI2QysdGeEaoG3QDYMRVTNyr1/fLJlQYW73DH69VCfizo8erJVmNbeCaz94qt2DpcS9MA8tLbVvTruEk9IFvUTo2NVwODEHOHgOgqJsJFFWVad",
        "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": "1bd3d02a-82f0-4992-de40-08d66bc3c64f",
        "X-MS-Exchange-CrossTenant-originalarrivaltime": "27 Dec 2018 06:23:11.3640\n\t(UTC)",
        "X-MS-Exchange-CrossTenant-fromentityheader": "Hosted",
        "X-MS-Exchange-CrossTenant-id": "686ea1d3-bc2b-4c6f-a92c-d99c5c301635",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "VI1PR0401MB2382",
        "Subject": "[dpdk-dev] [PATCH 13/20] 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": [
        "13/20"
    ]
}