get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 815497,
    "url": "http://patchwork.ozlabs.org/api/patches/815497/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/netdev/patch/1505825158-8192-2-git-send-email-razvan.stefanescu@nxp.com/",
    "project": {
        "id": 7,
        "url": "http://patchwork.ozlabs.org/api/projects/7/?format=api",
        "name": "Linux network development",
        "link_name": "netdev",
        "list_id": "netdev.vger.kernel.org",
        "list_email": "netdev@vger.kernel.org",
        "web_url": null,
        "scm_url": null,
        "webscm_url": null,
        "list_archive_url": "",
        "list_archive_url_format": "",
        "commit_url_format": ""
    },
    "msgid": "<1505825158-8192-2-git-send-email-razvan.stefanescu@nxp.com>",
    "list_archive_url": null,
    "date": "2017-09-19T12:45:53",
    "name": "[RESEND,1/6] staging: fsl-dpaa2/ethsw: Add APIs for DPSW object",
    "commit_ref": null,
    "pull_url": null,
    "state": "not-applicable",
    "archived": true,
    "hash": "f336d73607f20453cc4c7fc80e5e29604b0e2937",
    "submitter": {
        "id": 72391,
        "url": "http://patchwork.ozlabs.org/api/people/72391/?format=api",
        "name": "Razvan Stefanescu",
        "email": "razvan.stefanescu@nxp.com"
    },
    "delegate": {
        "id": 34,
        "url": "http://patchwork.ozlabs.org/api/users/34/?format=api",
        "username": "davem",
        "first_name": "David",
        "last_name": "Miller",
        "email": "davem@davemloft.net"
    },
    "mbox": "http://patchwork.ozlabs.org/project/netdev/patch/1505825158-8192-2-git-send-email-razvan.stefanescu@nxp.com/mbox/",
    "series": [
        {
            "id": 3864,
            "url": "http://patchwork.ozlabs.org/api/series/3864/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/netdev/list/?series=3864",
            "date": "2017-09-19T12:45:58",
            "name": "staging: Introduce DPAA2 Ethernet Switch driver",
            "version": 1,
            "mbox": "http://patchwork.ozlabs.org/series/3864/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/815497/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/815497/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<netdev-owner@vger.kernel.org>",
        "X-Original-To": "patchwork-incoming@ozlabs.org",
        "Delivered-To": "patchwork-incoming@ozlabs.org",
        "Authentication-Results": [
            "ozlabs.org;\n\tspf=none (mailfrom) smtp.mailfrom=vger.kernel.org\n\t(client-ip=209.132.180.67; helo=vger.kernel.org;\n\tenvelope-from=netdev-owner@vger.kernel.org;\n\treceiver=<UNKNOWN>)",
            "spf=fail (sender IP is 192.88.168.50)\n\tsmtp.mailfrom=nxp.com; nxp.com; dkim=none (message not signed)\n\theader.d=none;nxp.com; dmarc=fail action=none header.from=nxp.com;"
        ],
        "Received": [
            "from vger.kernel.org (vger.kernel.org [209.132.180.67])\n\tby ozlabs.org (Postfix) with ESMTP id 3xxN2K08pTz9s82\n\tfor <patchwork-incoming@ozlabs.org>;\n\tTue, 19 Sep 2017 22:47:53 +1000 (AEST)",
            "(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n\tid S1751885AbdISMqO (ORCPT <rfc822;patchwork-incoming@ozlabs.org>);\n\tTue, 19 Sep 2017 08:46:14 -0400",
            "from mail-by2nam01on0066.outbound.protection.outlook.com\n\t([104.47.34.66]:11202\n\t\"EHLO NAM01-BY2-obe.outbound.protection.outlook.com\"\n\trhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP\n\tid S1751772AbdISMqH (ORCPT <rfc822;netdev@vger.kernel.org>);\n\tTue, 19 Sep 2017 08:46:07 -0400",
            "from BN3PR03CA0102.namprd03.prod.outlook.com (10.174.66.20) by\n\tDM5PR03MB2697.namprd03.prod.outlook.com (10.168.197.135) with\n\tMicrosoft SMTP Server (version=TLS1_2,\n\tcipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id\n\t15.20.77.7; Tue, 19 Sep 2017 12:46:05 +0000",
            "from BN1BFFO11OLC001.protection.gbl (2a01:111:f400:7c10::1:180) by\n\tBN3PR03CA0102.outlook.office365.com (2603:10b6:400:4::20) with\n\tMicrosoft SMTP Server (version=TLS1_2,\n\tcipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id\n\t15.20.56.9 via Frontend Transport; Tue, 19 Sep 2017 12:46:05 +0000",
            "from tx30smr01.am.freescale.net (192.88.168.50) by\n\tBN1BFFO11OLC001.mail.protection.outlook.com (10.58.145.12) with\n\tMicrosoft\n\tSMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id\n\t15.20.35.14 via Frontend Transport; Tue, 19 Sep 2017 12:46:05 +0000",
            "from fsr-ub1464-140.ea.freescale.net\n\t(fsr-ub1464-140.ea.freescale.net [10.171.73.107])\n\tby tx30smr01.am.freescale.net (8.14.3/8.14.0) with ESMTP id\n\tv8JCjwWf016741; Tue, 19 Sep 2017 05:46:02 -0700"
        ],
        "Received-SPF": "Fail (protection.outlook.com: domain of nxp.com does not\n\tdesignate 192.88.168.50 as permitted sender)\n\treceiver=protection.outlook.com; \n\tclient-ip=192.88.168.50; helo=tx30smr01.am.freescale.net;",
        "From": "Razvan Stefanescu <razvan.stefanescu@nxp.com>",
        "To": "<gregkh@linuxfoundation.org>",
        "CC": "<devel@driverdev.osuosl.org>, <linux-kernel@vger.kernel.org>,\n\t<netdev@vger.kernel.org>, <agraf@suse.de>, <arnd@arndb.de>,\n\t<alexandru.marginean@nxp.com>, <bogdan.purcareata@nxp.com>,\n\t<ruxandra.radulescu@nxp.com>, <laurentiu.tudor@nxp.com>,\n\t<stuyoder@gmail.com>",
        "Subject": "[RESEND PATCH 1/6] staging: fsl-dpaa2/ethsw: Add APIs for DPSW\n\tobject",
        "Date": "Tue, 19 Sep 2017 15:45:53 +0300",
        "Message-ID": "<1505825158-8192-2-git-send-email-razvan.stefanescu@nxp.com>",
        "X-Mailer": "git-send-email 1.9.1",
        "In-Reply-To": "<1505825158-8192-1-git-send-email-razvan.stefanescu@nxp.com>",
        "References": "<1505825158-8192-1-git-send-email-razvan.stefanescu@nxp.com>",
        "X-EOPAttributedMessage": "0",
        "X-Matching-Connectors": "131502987657988146;\n\t(91ab9b29-cfa4-454e-5278-08d120cd25b8); ()",
        "X-Forefront-Antispam-Report": "CIP:192.88.168.50; IPV:NLI; CTRY:US; EFV:NLI;\n\tSFV:NSPM;\n\tSFS:(10009020)(6009001)(7966004)(336005)(346002)(376002)(39860400002)(39380400002)(2980300002)(1110001)(1109001)(339900001)(189002)(45074003)(199003)(5003940100001)(2351001)(6666003)(33646002)(50226002)(6916009)(47776003)(2950100002)(8936002)(498600001)(7416002)(97736004)(16586007)(77096006)(50986999)(76176999)(36756003)(356003)(316002)(106466001)(305945005)(105606002)(54906002)(81156014)(81166006)(104016004)(8676002)(53946003)(53936002)(48376002)(50466002)(16200700003)(86362001)(8656003)(39060400002)(189998001)(2906002)(68736007)(5660300001)(4326008)(85426001)(2004002)(217873001)(569006);\n\tDIR:OUT; SFP:1101; SCL:1; SRVR:DM5PR03MB2697;\n\tH:tx30smr01.am.freescale.net; FPR:; SPF:Fail;\n\tPTR:InfoDomainNonexistent; MX:1; A:1; LANG:en; ",
        "X-Microsoft-Exchange-Diagnostics": [
            "1; BN1BFFO11OLC001;\n\t1:0SURHiVSo/HaBvRQZhY8KE05whrv14/inQPhyqpucKd87HIzBJcT4OnZgI9rHAwoH8mfZ7Dv59VmJkawEejB7Gk9cGe8B4GwbOK39BYOciRNvD6rh08RkZ4kXtLtb5/1",
            "1; DM5PR03MB2697;\n\t3:zCptQvL8wLYB2JLnHCzXNe0BqexALq2UdQlu1dZB4u1eBRFdwfWhTwP5gvUGS2YEP9uROQHGiPGN+fqxpMUTFEXv5b1jPCko6xez46Z/RqLy+OfdJN8Lo0Yym2c794RMfkOWXcYMoqmvkaVQiyKtTsYj3npvQjqLcpYl6YjmUYZPrN70HonrlW8xdTsTIf5+Jxq0Btfy0Gfx8DX9h6dxXcXiqSW67CCX1V+WMchT+dr5R9tdzHH/nWSYoJD8v2OCxKzPUHRXocMIU9y2sYOnETtewgyQuW4BeQswHAHHBxGDiAlJCTaZKB+xW4buRy0OIsqR4kx9VQBFGXIk9wZlPbVBwlfS8hCTZRilCODC9Wk=;\n\t25:6TtK/nyaBjXF8vJFTsDptNT2Qr7iXy3Xp30zlBMX7oALqT4QYyR5K3/tuwZHFt4vXbPM4qTfepim9XwYL4m503ip7uZG5b/p9Kq3WOxR9ssihFDsectdoyF+dj0sxytbAXrO28dL+aQ0sQb4tkrf60rvow1MgQ85KvfEp13DuNPGuHMHburWCDU46IQPN/slJFg8DlKQXW/MbTAIyxFMeSyNNuBT6VIZfQhs4YGSYuxJgkw5nhjSaJWVJbLIbsDIv+HgGoFiUi06kqM8ajBD7zBVRKUJlmK8DQzcBGHUYfII3YJ200+usPNY8BgE6fqR0FDmmqL4ldHeR0+c1/Z44w==",
            "1; DM5PR03MB2697;\n\t31:wz85a/xZ6IIeRUM4x70CzPNewq+RfjilKmyy6+uh1G8p6ZnaVFoHPC7kP53C+GzfM5jRzFjMQ5ufAc7KJgIbvJRWRkZg32pHBzlxYDyze833I/+7ND4hVpVIs3/6yZqHxrq8+kAFoEuYC8PkHe6/fGcEgTlv8jd+27HyWEBcYiRaspSLTMdltI+z+bjMvcHgkp2wGvT/NjKTUqTeWFlm5P6k6zq+hBNZCEIO+Ywtf58=;\n\t4:X5l6g2XerKcCIWnF1Bl7wutVCDTTjKeJz6ZRh7ro3gBKzv0ES/LlmGVAxd+PvU0iCWGehyLRcGdQ5SRLL5Q2VqaOwXt9+TmCPTgoIv2B45wDzBC4jZhse0vWBUSEQHi39350gdsd39D9Oip+mMt3IVgwAhAJNx8SV7lqrxAG3yBEX6sxqvuUqYK95PV7Yp0vzXufnoS8Z9ro/fW5VyuSWS/Bx8FKlWmYLnNqCkGwMN9z4i9FVUHCYfwGqOMTtqfCDVQIxQgShpsGo0U+EXd+MqV53H46HDYrvMMXP0GKTCIYlLXYDki4RJVv0lq3za7iq1H0KBD8PqR5ysUkBR/oFA==",
            "1; DM5PR03MB2697;\n\t23:DMrHlqXL5fVLpEUuHX7h04+hZ9I6c20/n/1pKSMikhLC34DZOuN/NpUIjBUTkRfacFyka+Rw5aVSbimt3h134z4Ne5+WeoytNfTgWdSHcp9J5wi+xuUp05AqI7l/ejnM898IBjxHqX1slDrj7174CAFtHXcupa3FIqUE+gt2jHEicDWSPazlHZV7Hit69ysXmKkzyR2l7uGgnU3aWVegsbgRB9R3u6XlNjwROILeiP548Gdff18hWz+y+8FgV8ZmAHGx9nNOZGJIp69BhOojNdO6OdzqeXJCvYKHiD5aIgz6MXoSueJIPizSW7oyYwLxC169bXWgejGAPOL+2mllEYVuDgK3HKnm4bTh0MTkC/ZbQf+uEJH19yiJ1LDGGUmrw7P40t/AI7IWwW1X0Kz/nKOyKl7sTHPJwdzTzpzzYrr7+FzB9QHIIdxoB7oOYaPb76TUJieTavGWIY6DxZR/O9hmlyJ8znEzQLRHZkc7Tk7VczH1NGWa96/N/1sXKFHwRQVgsQn6z2mEyggAxoCix5LTh7QxgPdhjAmYy9+5zSR8fu+6C1WBUFNnzOcGG32jynX94mWZzfG+JfGeQno7I5Z/HZPa1YHnUM+OeHJmBmFcX9zEknjcdCKm0P02KRAkcigOdliL46dXzWGc+0DPjh3R+7xcFDO1l6vpxzfKsxGnBRf9PS5lKd2iauEJtEt1RuKEur3TjX92hexULRDZnm7DxY8J2Uggtm/5BSiI0Kr3Ib6jWmUFDcJy9CIcfa7SpxgHlNWlp+cl6zeJ/QYSDuALCQKXRuYKiBE7gm4nW38uVWO7hIB4fhjPQz4nA2+iMywCPuv5hjpIzRoWVt7QSPmypio/pmQtWGZduS7jMfG8EiEhZ+FQla0nbS6wX4Yjs9SJEl7B10jvw5o8xG7dsApnY8ehaPh8hj1jVr/24t1hZnxtVVFhXl7vAib7qj1NJarb3HQTYoLYPeQDJaj0dFC66jTobvE7FA67F4v4yvyXy6UCByt0tvgfTqH9ZEMtzAPzxSEn5wN+BitEzO9XqzbZkstttpPC763aEWV1Tfm9H8FgueYVXcjwXp43nyvrfn9y3urJWzhCc4ddRTu+vVWfSFR37StxmjOkHHpIj6UNX8ondwm3etChEaDkm9ByHlmIm1JoOEFPO6w+3Ms0Ac4tmo+IDyhowZkrqfG3EeszqwaP14PzyZvp2MEt0WwDeT6QW0OL2AQ4n6ss9+WXH6mWQtrwxew9TLvQgB6WHktNjV2Ih5z4DSmhKJIJPTPCml5pDdROXPDQgm66+QUiSRZxy52l7vcWdfs4XPD0ocup3L6WBfx5E445RHT6topaYaC5Mfd0M9oU/L5s+nGITA==",
            "1; DM5PR03MB2697;\n\t6:FhRj2j9zi1JjdE1a1HDuPnobz6BC2ddJilwa1gNjbZuWTNaFPVflhGcORls/XoaRYvFhJyTY0c9GUaQkzO9KBgU8iymxRUCGVU2yhktndQk9ToxAxMWucmk/wFlvUqK8jnxdFXa6ENe4tolwYTKT2UGRRi7n2BVDel5E4jhkubqYPRItZ3QXAXLB453Oag8YAr5Jr0z57/SjPDLkJNTEkxBP07kCE1Z9TuEX7RAWP7bndirnKvysv0/dcwoW84URunWxxM4qZZF/m3Sm4hl3wUp9o9OyzHQyzflph1vNvQVxPxFIPHb7mUkJN16iZCI1sIIgvZbAKI3QBJI4CvnaxQ==;\n\t5:RxJYYe5x8NNmnNDUSbgxvBc7iOMhIzl/vP5PntPpI3BHIlxF8TBuSDuBkTeKQmteXdovmPuq10/my8cqV0HKDDk6SARo/6dPLpIYOUnoWk9mCU1q9PPhIn+0hJgiBQstTbEh/xasw/5Jj6JEoNxTng==;\n\t24:uJCAksTxvGp76o7DmHvn7CYo968Wa39lV1A/jbsOuG1nqLyepCC3DcgX4JzP8QWnJhhedvN88jQtIqmNRSWy4F8oU46ikVnA2iqf1bF+ALg=;\n\t7:GQStM1d+oJtJUFUAQbKnEJTiQoGxXFc7FoXgVyGAuFRskhG9NTjWfl1KIN3UlrjsumaU9bAyvDCwrTp4Pq++4TPwq7oLOTqStPEL2YxDuGBJNX7M092oC68Phsa7jtReYXEYbLU/266Yaxn+fHgXdhkqq8RDuQZoxTah0UIuqeRK/caePc2bZmpGSjTjjnMl2K37+gOUug3AT1DXDzvPwbYtpbnzXGBN/qGrvxd1ags="
        ],
        "MIME-Version": "1.0",
        "Content-Type": "text/plain",
        "X-MS-PublicTrafficType": "Email",
        "X-MS-Office365-Filtering-Correlation-Id": "937d6bdc-a930-4883-66d3-08d4ff5c64b6",
        "X-Microsoft-Antispam": "UriScan:; BCL:0; PCL:0;\n\tRULEID:(300000500095)(300135000095)(300000501095)(300135300095)(300000502095)(300135100095)(22001)(300000503095)(300135400095)(2017052603199)(201703131430075)(201703131517081)(300000504095)(300135200095)(300000505095)(300135600095)(300000506095)(300135500095);\n\tSRVR:DM5PR03MB2697; ",
        "X-MS-TrafficTypeDiagnostic": "DM5PR03MB2697:",
        "X-Exchange-Antispam-Report-Test": "UriScan:(185117386973197)(275809806118684); ",
        "X-Microsoft-Antispam-PRVS": "<DM5PR03MB2697B17FA7E4877387D63C2DE6600@DM5PR03MB2697.namprd03.prod.outlook.com>",
        "X-Exchange-Antispam-Report-CFA-Test": "BCL:0; PCL:0;\n\tRULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6095135)(2401047)(8121501046)(5005006)(10201501046)(3002001)(93006095)(93001095)(100000703101)(100105400095)(6055026)(6096035)(20161123561025)(20161123556025)(20161123559100)(20161123563025)(20161123565025)(201703131430075)(201703131433075)(201703131441075)(201703131448075)(201703161259150)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095);\n\tSRVR:DM5PR03MB2697; BCL:0; PCL:0;\n\tRULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(400006)(100000804101)(100110200095)(100000805101)(100110500095);\n\tSRVR:DM5PR03MB2697; ",
        "X-Forefront-PRVS": "04359FAD81",
        "SpamDiagnosticOutput": "1:99",
        "SpamDiagnosticMetadata": "NSPM",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "19 Sep 2017 12:46:05.5648\n\t(UTC)",
        "X-MS-Exchange-CrossTenant-Id": "5afe0b00-7697-4969-b663-5eab37d5f47e",
        "X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp": "TenantId=5afe0b00-7697-4969-b663-5eab37d5f47e;\n\tIp=[192.88.168.50]; Helo=[tx30smr01.am.freescale.net]",
        "X-MS-Exchange-CrossTenant-FromEntityHeader": "HybridOnPrem",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "DM5PR03MB2697",
        "Sender": "netdev-owner@vger.kernel.org",
        "Precedence": "bulk",
        "List-ID": "<netdev.vger.kernel.org>",
        "X-Mailing-List": "netdev@vger.kernel.org"
    },
    "content": "Add the command build/parse APIs for operating on DPSW objects through\nthe DPAA2 Management Complex.\n\nSigned-off-by: Razvan Stefanescu <razvan.stefanescu@nxp.com>\n---\n drivers/staging/fsl-dpaa2/Kconfig          |    8 +\n drivers/staging/fsl-dpaa2/Makefile         |    1 +\n drivers/staging/fsl-dpaa2/ethsw/Makefile   |    7 +\n drivers/staging/fsl-dpaa2/ethsw/dpsw-cmd.h |  358 +++++++++\n drivers/staging/fsl-dpaa2/ethsw/dpsw.c     | 1115 ++++++++++++++++++++++++++++\n drivers/staging/fsl-dpaa2/ethsw/dpsw.h     |  579 +++++++++++++++\n 6 files changed, 2068 insertions(+)\n create mode 100644 drivers/staging/fsl-dpaa2/ethsw/Makefile\n create mode 100644 drivers/staging/fsl-dpaa2/ethsw/dpsw-cmd.h\n create mode 100644 drivers/staging/fsl-dpaa2/ethsw/dpsw.c\n create mode 100644 drivers/staging/fsl-dpaa2/ethsw/dpsw.h",
    "diff": "diff --git a/drivers/staging/fsl-dpaa2/Kconfig b/drivers/staging/fsl-dpaa2/Kconfig\nindex dfff675..8a508ef 100644\n--- a/drivers/staging/fsl-dpaa2/Kconfig\n+++ b/drivers/staging/fsl-dpaa2/Kconfig\n@@ -16,3 +16,11 @@ config FSL_DPAA2_ETH\n \t---help---\n \t  Ethernet driver for Freescale DPAA2 SoCs, using the\n \t  Freescale MC bus driver\n+\n+config FSL_DPAA2_ETHSW\n+\ttristate \"Freescale DPAA2 Ethernet Switch\"\n+\tdepends on FSL_DPAA2\n+\tdepends on NET_SWITCHDEV\n+\t---help---\n+\tDriver for Freescale DPAA2 Ethernet Switch. Select\n+\tBRIDGE to have support for bridge tools.\ndiff --git a/drivers/staging/fsl-dpaa2/Makefile b/drivers/staging/fsl-dpaa2/Makefile\nindex 0836ba8..6cfd76b 100644\n--- a/drivers/staging/fsl-dpaa2/Makefile\n+++ b/drivers/staging/fsl-dpaa2/Makefile\n@@ -3,3 +3,4 @@\n #\n \n obj-$(CONFIG_FSL_DPAA2_ETH)\t+= ethernet/\n+obj-$(CONFIG_FSL_DPAA2_ETHSW)\t+= ethsw/\ndiff --git a/drivers/staging/fsl-dpaa2/ethsw/Makefile b/drivers/staging/fsl-dpaa2/ethsw/Makefile\nnew file mode 100644\nindex 0000000..db137f7\n--- /dev/null\n+++ b/drivers/staging/fsl-dpaa2/ethsw/Makefile\n@@ -0,0 +1,7 @@\n+#\n+# Makefile for the Freescale DPAA2 Ethernet Switch\n+#\n+\n+obj-$(CONFIG_FSL_DPAA2_ETHSW) += dpaa2-ethsw.o\n+\n+dpaa2-ethsw-objs := dpsw.o\ndiff --git a/drivers/staging/fsl-dpaa2/ethsw/dpsw-cmd.h b/drivers/staging/fsl-dpaa2/ethsw/dpsw-cmd.h\nnew file mode 100644\nindex 0000000..ddfd820\n--- /dev/null\n+++ b/drivers/staging/fsl-dpaa2/ethsw/dpsw-cmd.h\n@@ -0,0 +1,358 @@\n+/* Copyright 2013-2016 Freescale Semiconductor Inc.\n+ * Copyright 2017 NXP\n+ *\n+ * Redistribution and use in source and binary forms, with or without\n+ * modification, are permitted provided that the following conditions are met:\n+ *     * Redistributions of source code must retain the above copyright\n+ *\t notice, this list of conditions and the following disclaimer.\n+ *     * Redistributions in binary form must reproduce the above copyright\n+ *\t notice, this list of conditions and the following disclaimer in the\n+ *\t documentation and/or other materials provided with the distribution.\n+ *     * Neither the name of the above-listed copyright holders nor the\n+ *\t names of any contributors may be used to endorse or promote products\n+ *\t derived from this software without specific prior written permission.\n+ *\n+ *\n+ * ALTERNATIVELY, this software may be distributed under the terms of the\n+ * GNU General Public License (\"GPL\") as published by the Free Software\n+ * Foundation, either version 2 of that License or (at your option) any\n+ * later version.\n+ *\n+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE\n+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n+ * POSSIBILITY OF SUCH DAMAGE.\n+ */\n+#ifndef __FSL_DPSW_CMD_H\n+#define __FSL_DPSW_CMD_H\n+\n+/* DPSW Version */\n+#define DPSW_VER_MAJOR\t\t8\n+#define DPSW_VER_MINOR\t\t0\n+\n+#define DPSW_CMD_BASE_VERSION\t1\n+#define DPSW_CMD_ID_OFFSET\t4\n+\n+#define DPSW_CMD_ID(id)\t(((id) << DPSW_CMD_ID_OFFSET) | DPSW_CMD_BASE_VERSION)\n+\n+/* Command IDs */\n+#define DPSW_CMDID_CLOSE                    DPSW_CMD_ID(0x800)\n+#define DPSW_CMDID_OPEN                     DPSW_CMD_ID(0x802)\n+\n+#define DPSW_CMDID_GET_API_VERSION          DPSW_CMD_ID(0xa02)\n+\n+#define DPSW_CMDID_ENABLE                   DPSW_CMD_ID(0x002)\n+#define DPSW_CMDID_DISABLE                  DPSW_CMD_ID(0x003)\n+#define DPSW_CMDID_GET_ATTR                 DPSW_CMD_ID(0x004)\n+#define DPSW_CMDID_RESET                    DPSW_CMD_ID(0x005)\n+\n+#define DPSW_CMDID_SET_IRQ_ENABLE           DPSW_CMD_ID(0x012)\n+\n+#define DPSW_CMDID_SET_IRQ_MASK             DPSW_CMD_ID(0x014)\n+\n+#define DPSW_CMDID_GET_IRQ_STATUS           DPSW_CMD_ID(0x016)\n+#define DPSW_CMDID_CLEAR_IRQ_STATUS         DPSW_CMD_ID(0x017)\n+\n+#define DPSW_CMDID_IF_SET_TCI               DPSW_CMD_ID(0x030)\n+#define DPSW_CMDID_IF_SET_STP               DPSW_CMD_ID(0x031)\n+\n+#define DPSW_CMDID_IF_GET_COUNTER           DPSW_CMD_ID(0x034)\n+\n+#define DPSW_CMDID_IF_ENABLE                DPSW_CMD_ID(0x03D)\n+#define DPSW_CMDID_IF_DISABLE               DPSW_CMD_ID(0x03E)\n+\n+#define DPSW_CMDID_IF_SET_MAX_FRAME_LENGTH  DPSW_CMD_ID(0x044)\n+\n+#define DPSW_CMDID_IF_GET_LINK_STATE        DPSW_CMD_ID(0x046)\n+#define DPSW_CMDID_IF_SET_FLOODING          DPSW_CMD_ID(0x047)\n+#define DPSW_CMDID_IF_SET_BROADCAST         DPSW_CMD_ID(0x048)\n+\n+#define DPSW_CMDID_VLAN_ADD                 DPSW_CMD_ID(0x060)\n+#define DPSW_CMDID_VLAN_ADD_IF              DPSW_CMD_ID(0x061)\n+#define DPSW_CMDID_VLAN_ADD_IF_UNTAGGED     DPSW_CMD_ID(0x062)\n+\n+#define DPSW_CMDID_VLAN_REMOVE_IF           DPSW_CMD_ID(0x064)\n+#define DPSW_CMDID_VLAN_REMOVE_IF_UNTAGGED  DPSW_CMD_ID(0x065)\n+#define DPSW_CMDID_VLAN_REMOVE_IF_FLOODING  DPSW_CMD_ID(0x066)\n+#define DPSW_CMDID_VLAN_REMOVE              DPSW_CMD_ID(0x067)\n+\n+#define DPSW_CMDID_FDB_ADD_UNICAST          DPSW_CMD_ID(0x084)\n+#define DPSW_CMDID_FDB_REMOVE_UNICAST       DPSW_CMD_ID(0x085)\n+#define DPSW_CMDID_FDB_ADD_MULTICAST        DPSW_CMD_ID(0x086)\n+#define DPSW_CMDID_FDB_REMOVE_MULTICAST     DPSW_CMD_ID(0x087)\n+#define DPSW_CMDID_FDB_SET_LEARNING_MODE    DPSW_CMD_ID(0x088)\n+\n+/* Macros for accessing command fields smaller than 1byte */\n+#define DPSW_MASK(field)        \\\n+\tGENMASK(DPSW_##field##_SHIFT + DPSW_##field##_SIZE - 1, \\\n+\t\tDPSW_##field##_SHIFT)\n+#define dpsw_set_field(var, field, val) \\\n+\t((var) |= (((val) << DPSW_##field##_SHIFT) & DPSW_MASK(field)))\n+#define dpsw_get_field(var, field)      \\\n+\t(((var) & DPSW_MASK(field)) >> DPSW_##field##_SHIFT)\n+#define dpsw_get_bit(var, bit) \\\n+\t(((var)  >> (bit)) & GENMASK(0, 0))\n+\n+struct dpsw_cmd_open {\n+\t__le32 dpsw_id;\n+};\n+\n+#define DPSW_COMPONENT_TYPE_SHIFT\t0\n+#define DPSW_COMPONENT_TYPE_SIZE\t4\n+\n+struct dpsw_cmd_create {\n+\t/* cmd word 0 */\n+\t__le16 num_ifs;\n+\tu8 max_fdbs;\n+\tu8 max_meters_per_if;\n+\t/* from LSB: only the first 4 bits */\n+\tu8 component_type;\n+\tu8 pad[3];\n+\t/* cmd word 1 */\n+\t__le16 max_vlans;\n+\t__le16 max_fdb_entries;\n+\t__le16 fdb_aging_time;\n+\t__le16 max_fdb_mc_groups;\n+\t/* cmd word 2 */\n+\t__le64 options;\n+};\n+\n+struct dpsw_cmd_destroy {\n+\t__le32 dpsw_id;\n+};\n+\n+#define DPSW_ENABLE_SHIFT 0\n+#define DPSW_ENABLE_SIZE  1\n+\n+struct dpsw_rsp_is_enabled {\n+\t/* from LSB: enable:1 */\n+\tu8 enabled;\n+};\n+\n+struct dpsw_cmd_set_irq_enable {\n+\tu8 enable_state;\n+\tu8 pad[3];\n+\tu8 irq_index;\n+};\n+\n+struct dpsw_cmd_get_irq_enable {\n+\t__le32 pad;\n+\tu8 irq_index;\n+};\n+\n+struct dpsw_rsp_get_irq_enable {\n+\tu8 enable_state;\n+};\n+\n+struct dpsw_cmd_set_irq_mask {\n+\t__le32 mask;\n+\tu8 irq_index;\n+};\n+\n+struct dpsw_cmd_get_irq_mask {\n+\t__le32 pad;\n+\tu8 irq_index;\n+};\n+\n+struct dpsw_rsp_get_irq_mask {\n+\t__le32 mask;\n+};\n+\n+struct dpsw_cmd_get_irq_status {\n+\t__le32 status;\n+\tu8 irq_index;\n+};\n+\n+struct dpsw_rsp_get_irq_status {\n+\t__le32 status;\n+};\n+\n+struct dpsw_cmd_clear_irq_status {\n+\t__le32 status;\n+\tu8 irq_index;\n+};\n+\n+#define DPSW_COMPONENT_TYPE_SHIFT\t0\n+#define DPSW_COMPONENT_TYPE_SIZE\t4\n+\n+struct dpsw_rsp_get_attr {\n+\t/* cmd word 0 */\n+\t__le16 num_ifs;\n+\tu8 max_fdbs;\n+\tu8 num_fdbs;\n+\t__le16 max_vlans;\n+\t__le16 num_vlans;\n+\t/* cmd word 1 */\n+\t__le16 max_fdb_entries;\n+\t__le16 fdb_aging_time;\n+\t__le32 dpsw_id;\n+\t/* cmd word 2 */\n+\t__le16 mem_size;\n+\t__le16 max_fdb_mc_groups;\n+\tu8 max_meters_per_if;\n+\t/* from LSB only the first 4 bits */\n+\tu8 component_type;\n+\t__le16 pad;\n+\t/* cmd word 3 */\n+\t__le64 options;\n+};\n+\n+struct dpsw_cmd_if_set_flooding {\n+\t__le16 if_id;\n+\t/* from LSB: enable:1 */\n+\tu8 enable;\n+};\n+\n+struct dpsw_cmd_if_set_broadcast {\n+\t__le16 if_id;\n+\t/* from LSB: enable:1 */\n+\tu8 enable;\n+};\n+\n+#define DPSW_VLAN_ID_SHIFT\t0\n+#define DPSW_VLAN_ID_SIZE\t12\n+#define DPSW_DEI_SHIFT\t\t12\n+#define DPSW_DEI_SIZE\t\t1\n+#define DPSW_PCP_SHIFT\t\t13\n+#define DPSW_PCP_SIZE\t\t3\n+\n+struct dpsw_cmd_if_set_tci {\n+\t__le16 if_id;\n+\t/* from LSB: VLAN_ID:12 DEI:1 PCP:3 */\n+\t__le16 conf;\n+};\n+\n+#define DPSW_STATE_SHIFT\t0\n+#define DPSW_STATE_SIZE\t\t4\n+\n+struct dpsw_cmd_if_set_stp {\n+\t__le16 if_id;\n+\t__le16 vlan_id;\n+\t/* only the first LSB 4 bits */\n+\tu8 state;\n+};\n+\n+#define DPSW_COUNTER_TYPE_SHIFT\t\t0\n+#define DPSW_COUNTER_TYPE_SIZE\t\t5\n+\n+struct dpsw_cmd_if_get_counter {\n+\t__le16 if_id;\n+\t/* from LSB: type:5 */\n+\tu8 type;\n+};\n+\n+struct dpsw_rsp_if_get_counter {\n+\t__le64 pad;\n+\t__le64 counter;\n+};\n+\n+struct dpsw_cmd_if {\n+\t__le16 if_id;\n+};\n+\n+struct dpsw_cmd_if_set_max_frame_length {\n+\t__le16 if_id;\n+\t__le16 frame_length;\n+};\n+\n+struct dpsw_cmd_if_get_link_state {\n+\t__le16 if_id;\n+};\n+\n+#define DPSW_UP_SHIFT\t0\n+#define DPSW_UP_SIZE\t1\n+\n+struct dpsw_rsp_if_get_link_state {\n+\t/* cmd word 0 */\n+\t__le32 pad0;\n+\tu8 up;\n+\tu8 pad1[3];\n+\t/* cmd word 1 */\n+\t__le32 rate;\n+\t__le32 pad2;\n+\t/* cmd word 2 */\n+\t__le64 options;\n+};\n+\n+struct dpsw_vlan_add {\n+\t__le16 fdb_id;\n+\t__le16 vlan_id;\n+};\n+\n+struct dpsw_cmd_vlan_manage_if {\n+\t/* cmd word 0 */\n+\t__le16 pad0;\n+\t__le16 vlan_id;\n+\t__le32 pad1;\n+\t/* cmd word 1-4 */\n+\t__le64 if_id[4];\n+};\n+\n+struct dpsw_cmd_vlan_remove {\n+\t__le16 pad;\n+\t__le16 vlan_id;\n+};\n+\n+struct dpsw_cmd_fdb_add {\n+\t__le32 pad;\n+\t__le16 fdb_aging_time;\n+\t__le16 num_fdb_entries;\n+};\n+\n+struct dpsw_rsp_fdb_add {\n+\t__le16 fdb_id;\n+};\n+\n+struct dpsw_cmd_fdb_remove {\n+\t__le16 fdb_id;\n+};\n+\n+#define DPSW_ENTRY_TYPE_SHIFT\t0\n+#define DPSW_ENTRY_TYPE_SIZE\t4\n+\n+struct dpsw_cmd_fdb_unicast_op {\n+\t/* cmd word 0 */\n+\t__le16 fdb_id;\n+\tu8 mac_addr[6];\n+\t/* cmd word 1 */\n+\t__le16 if_egress;\n+\t/* only the first 4 bits from LSB */\n+\tu8 type;\n+};\n+\n+struct dpsw_cmd_fdb_multicast_op {\n+\t/* cmd word 0 */\n+\t__le16 fdb_id;\n+\t__le16 num_ifs;\n+\t/* only the first 4 bits from LSB */\n+\tu8 type;\n+\tu8 pad[3];\n+\t/* cmd word 1 */\n+\tu8 mac_addr[6];\n+\t__le16 pad2;\n+\t/* cmd word 2-5 */\n+\t__le64 if_id[4];\n+};\n+\n+#define DPSW_LEARNING_MODE_SHIFT\t0\n+#define DPSW_LEARNING_MODE_SIZE\t\t4\n+\n+struct dpsw_cmd_fdb_set_learning_mode {\n+\t__le16 fdb_id;\n+\t/* only the first 4 bits from LSB */\n+\tu8 mode;\n+};\n+\n+struct dpsw_rsp_get_api_version {\n+\t__le16 version_major;\n+\t__le16 version_minor;\n+};\n+\n+#endif /* __FSL_DPSW_CMD_H */\ndiff --git a/drivers/staging/fsl-dpaa2/ethsw/dpsw.c b/drivers/staging/fsl-dpaa2/ethsw/dpsw.c\nnew file mode 100644\nindex 0000000..f36b92b\n--- /dev/null\n+++ b/drivers/staging/fsl-dpaa2/ethsw/dpsw.c\n@@ -0,0 +1,1115 @@\n+/* Copyright 2013-2016 Freescale Semiconductor Inc.\n+ * Copyright 2017 NXP\n+ *\n+ * Redistribution and use in source and binary forms, with or without\n+ * modification, are permitted provided that the following conditions are met:\n+ *     * Redistributions of source code must retain the above copyright\n+ *\t notice, this list of conditions and the following disclaimer.\n+ *     * Redistributions in binary form must reproduce the above copyright\n+ *\t notice, this list of conditions and the following disclaimer in the\n+ *\t documentation and/or other materials provided with the distribution.\n+ *     * Neither the name of the above-listed copyright holders nor the\n+ *\t names of any contributors may be used to endorse or promote products\n+ *\t derived from this software without specific prior written permission.\n+ *\n+ *\n+ * ALTERNATIVELY, this software may be distributed under the terms of the\n+ * GNU General Public License (\"GPL\") as published by the Free Software\n+ * Foundation, either version 2 of that License or (at your option) any\n+ * later version.\n+ *\n+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE\n+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n+ * POSSIBILITY OF SUCH DAMAGE.\n+ */\n+#include \"../../fsl-mc/include/mc.h\"\n+#include \"dpsw.h\"\n+#include \"dpsw-cmd.h\"\n+\n+static void build_if_id_bitmap(__le64 *bmap,\n+\t\t\t       const u16 *id,\n+\t\t\t       const u16 num_ifs)\n+{\n+\tint i;\n+\n+\tfor (i = 0; (i < num_ifs) && (i < DPSW_MAX_IF); i++) {\n+\t\tif (id[i] < DPSW_MAX_IF)\n+\t\t\tbmap[id[i] / 64] |= BIT_MASK(id[i] % 64);\n+\t}\n+}\n+\n+/**\n+ * dpsw_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+ * @dpsw_id:\tDPSW unique ID\n+ * @token:\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 dpsw_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 dpsw_open(struct fsl_mc_io *mc_io,\n+\t      u32 cmd_flags,\n+\t      int dpsw_id,\n+\t      u16 *token)\n+{\n+\tstruct mc_command cmd = { 0 };\n+\tstruct dpsw_cmd_open *cmd_params;\n+\tint err;\n+\n+\t/* prepare command */\n+\tcmd.header = mc_encode_cmd_header(DPSW_CMDID_OPEN,\n+\t\t\t\t\t  cmd_flags,\n+\t\t\t\t\t  0);\n+\tcmd_params = (struct dpsw_cmd_open *)cmd.params;\n+\tcmd_params->dpsw_id = cpu_to_le32(dpsw_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+ * dpsw_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:\tToken of DPSW 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 dpsw_close(struct fsl_mc_io *mc_io,\n+\t       u32 cmd_flags,\n+\t       u16 token)\n+{\n+\tstruct mc_command cmd = { 0 };\n+\n+\t/* prepare command */\n+\tcmd.header = mc_encode_cmd_header(DPSW_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+ * dpsw_enable() - Enable DPSW 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 DPSW object\n+ *\n+ * Return:\tCompletion status. '0' on Success; Error code otherwise.\n+ */\n+int dpsw_enable(struct fsl_mc_io *mc_io,\n+\t\tu32 cmd_flags,\n+\t\tu16 token)\n+{\n+\tstruct mc_command cmd = { 0 };\n+\n+\t/* prepare command */\n+\tcmd.header = mc_encode_cmd_header(DPSW_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+ * dpsw_disable() - Disable DPSW 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 DPSW object\n+ *\n+ * Return:\tCompletion status. '0' on Success; Error code otherwise.\n+ */\n+int dpsw_disable(struct fsl_mc_io *mc_io,\n+\t\t u32 cmd_flags,\n+\t\t u16 token)\n+{\n+\tstruct mc_command cmd = { 0 };\n+\n+\t/* prepare command */\n+\tcmd.header = mc_encode_cmd_header(DPSW_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+ * dpsw_reset() - Reset the DPSW, 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 DPSW object\n+ *\n+ * Return:\t'0' on Success; Error code otherwise.\n+ */\n+int dpsw_reset(struct fsl_mc_io *mc_io,\n+\t       u32 cmd_flags,\n+\t       u16 token)\n+{\n+\tstruct mc_command cmd = { 0 };\n+\n+\t/* prepare command */\n+\tcmd.header = mc_encode_cmd_header(DPSW_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+ * dpsw_set_irq_enable() - Set overall interrupt 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 DPCI object\n+ * @irq_index:\tThe interrupt index to configure\n+ * @en:\t\tInterrupt state - enable = 1, disable = 0\n+ *\n+ * Allows GPP software to control when interrupts are generated.\n+ * Each interrupt can have up to 32 causes.  The enable/disable control's the\n+ * overall interrupt state. if the interrupt is disabled no causes will cause\n+ * an interrupt\n+ *\n+ * Return:\t'0' on Success; Error code otherwise.\n+ */\n+int dpsw_set_irq_enable(struct fsl_mc_io *mc_io,\n+\t\t\tu32 cmd_flags,\n+\t\t\tu16 token,\n+\t\t\tu8 irq_index,\n+\t\t\tu8 en)\n+{\n+\tstruct mc_command cmd = { 0 };\n+\tstruct dpsw_cmd_set_irq_enable *cmd_params;\n+\n+\t/* prepare command */\n+\tcmd.header = mc_encode_cmd_header(DPSW_CMDID_SET_IRQ_ENABLE,\n+\t\t\t\t\t  cmd_flags,\n+\t\t\t\t\t  token);\n+\tcmd_params = (struct dpsw_cmd_set_irq_enable *)cmd.params;\n+\tdpsw_set_field(cmd_params->enable_state, ENABLE, en);\n+\tcmd_params->irq_index = irq_index;\n+\n+\t/* send command to mc*/\n+\treturn mc_send_command(mc_io, &cmd);\n+}\n+\n+/**\n+ * dpsw_set_irq_mask() - Set interrupt mask.\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 DPCI object\n+ * @irq_index:\tThe interrupt index to configure\n+ * @mask:\tEvent mask to trigger interrupt;\n+ *\t\teach bit:\n+ *\t\t\t0 = ignore event\n+ *\t\t\t1 = consider event for asserting IRQ\n+ *\n+ * Every interrupt can have up to 32 causes and the interrupt model supports\n+ * masking/unmasking each cause independently\n+ *\n+ * Return:\t'0' on Success; Error code otherwise.\n+ */\n+int dpsw_set_irq_mask(struct fsl_mc_io *mc_io,\n+\t\t      u32 cmd_flags,\n+\t\t      u16 token,\n+\t\t      u8 irq_index,\n+\t\t      u32 mask)\n+{\n+\tstruct mc_command cmd = { 0 };\n+\tstruct dpsw_cmd_set_irq_mask *cmd_params;\n+\n+\t/* prepare command */\n+\tcmd.header = mc_encode_cmd_header(DPSW_CMDID_SET_IRQ_MASK,\n+\t\t\t\t\t  cmd_flags,\n+\t\t\t\t\t  token);\n+\tcmd_params = (struct dpsw_cmd_set_irq_mask *)cmd.params;\n+\tcmd_params->mask = cpu_to_le32(mask);\n+\tcmd_params->irq_index = irq_index;\n+\n+\t/* send command to mc*/\n+\treturn mc_send_command(mc_io, &cmd);\n+}\n+\n+/**\n+ * dpsw_get_irq_status() - Get the current status of any pending interrupts\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 DPSW object\n+ * @irq_index:\tThe interrupt index to configure\n+ * @status:\tReturned interrupts status - one bit per cause:\n+ *\t\t\t0 = no interrupt pending\n+ *\t\t\t1 = interrupt pending\n+ *\n+ * Return:\t'0' on Success; Error code otherwise.\n+ */\n+int dpsw_get_irq_status(struct fsl_mc_io *mc_io,\n+\t\t\tu32 cmd_flags,\n+\t\t\tu16 token,\n+\t\t\tu8 irq_index,\n+\t\t\tu32 *status)\n+{\n+\tstruct mc_command cmd = { 0 };\n+\tstruct dpsw_cmd_get_irq_status *cmd_params;\n+\tstruct dpsw_rsp_get_irq_status *rsp_params;\n+\tint err;\n+\n+\t/* prepare command */\n+\tcmd.header = mc_encode_cmd_header(DPSW_CMDID_GET_IRQ_STATUS,\n+\t\t\t\t\t  cmd_flags,\n+\t\t\t\t\t  token);\n+\tcmd_params = (struct dpsw_cmd_get_irq_status *)cmd.params;\n+\tcmd_params->status = cpu_to_le32(*status);\n+\tcmd_params->irq_index = irq_index;\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 dpsw_rsp_get_irq_status *)cmd.params;\n+\t*status = le32_to_cpu(rsp_params->status);\n+\n+\treturn 0;\n+}\n+\n+/**\n+ * dpsw_clear_irq_status() - Clear a pending interrupt's status\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 DPCI object\n+ * @irq_index:\tThe interrupt index to configure\n+ * @status:\tbits to clear (W1C) - one bit per cause:\n+ *\t\t\t0 = don't change\n+ *\t\t\t1 = clear status bit\n+ *\n+ * Return:\t'0' on Success; Error code otherwise.\n+ */\n+int dpsw_clear_irq_status(struct fsl_mc_io *mc_io,\n+\t\t\t  u32 cmd_flags,\n+\t\t\t  u16 token,\n+\t\t\t  u8 irq_index,\n+\t\t\t  u32 status)\n+{\n+\tstruct mc_command cmd = { 0 };\n+\tstruct dpsw_cmd_clear_irq_status *cmd_params;\n+\n+\t/* prepare command */\n+\tcmd.header = mc_encode_cmd_header(DPSW_CMDID_CLEAR_IRQ_STATUS,\n+\t\t\t\t\t  cmd_flags,\n+\t\t\t\t\t  token);\n+\tcmd_params = (struct dpsw_cmd_clear_irq_status *)cmd.params;\n+\tcmd_params->status = cpu_to_le32(status);\n+\tcmd_params->irq_index = irq_index;\n+\n+\t/* send command to mc*/\n+\treturn mc_send_command(mc_io, &cmd);\n+}\n+\n+/**\n+ * dpsw_get_attributes() - Retrieve DPSW 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 DPSW object\n+ * @attr:\tReturned DPSW attributes\n+ *\n+ * Return:\tCompletion status. '0' on Success; Error code otherwise.\n+ */\n+int dpsw_get_attributes(struct fsl_mc_io *mc_io,\n+\t\t\tu32 cmd_flags,\n+\t\t\tu16 token,\n+\t\t\tstruct dpsw_attr *attr)\n+{\n+\tstruct mc_command cmd = { 0 };\n+\tstruct dpsw_rsp_get_attr *rsp_params;\n+\tint err;\n+\n+\t/* prepare command */\n+\tcmd.header = mc_encode_cmd_header(DPSW_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 dpsw_rsp_get_attr *)cmd.params;\n+\tattr->num_ifs = le16_to_cpu(rsp_params->num_ifs);\n+\tattr->max_fdbs = rsp_params->max_fdbs;\n+\tattr->num_fdbs = rsp_params->num_fdbs;\n+\tattr->max_vlans = le16_to_cpu(rsp_params->max_vlans);\n+\tattr->num_vlans = le16_to_cpu(rsp_params->num_vlans);\n+\tattr->max_fdb_entries = le16_to_cpu(rsp_params->max_fdb_entries);\n+\tattr->fdb_aging_time = le16_to_cpu(rsp_params->fdb_aging_time);\n+\tattr->id = le32_to_cpu(rsp_params->dpsw_id);\n+\tattr->mem_size = le16_to_cpu(rsp_params->mem_size);\n+\tattr->max_fdb_mc_groups = le16_to_cpu(rsp_params->max_fdb_mc_groups);\n+\tattr->max_meters_per_if = rsp_params->max_meters_per_if;\n+\tattr->options = le64_to_cpu(rsp_params->options);\n+\tattr->component_type = dpsw_get_field(rsp_params->component_type,\n+\t\t\t\t\t      COMPONENT_TYPE);\n+\n+\treturn 0;\n+}\n+\n+/**\n+ * dpsw_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:\tToken of DPSW object\n+ * @if_id:\tInterface id\n+ * @state:\tLink state\t1 - linkup, 0 - link down or disconnected\n+ *\n+ * @Return\t'0' on Success; Error code otherwise.\n+ */\n+int dpsw_if_get_link_state(struct fsl_mc_io *mc_io,\n+\t\t\t   u32 cmd_flags,\n+\t\t\t   u16 token,\n+\t\t\t   u16 if_id,\n+\t\t\t   struct dpsw_link_state *state)\n+{\n+\tstruct mc_command cmd = { 0 };\n+\tstruct dpsw_cmd_if_get_link_state *cmd_params;\n+\tstruct dpsw_rsp_if_get_link_state *rsp_params;\n+\tint err;\n+\n+\t/* prepare command */\n+\tcmd.header = mc_encode_cmd_header(DPSW_CMDID_IF_GET_LINK_STATE,\n+\t\t\t\t\t  cmd_flags,\n+\t\t\t\t\t  token);\n+\tcmd_params = (struct dpsw_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 dpsw_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 = dpsw_get_field(rsp_params->up, UP);\n+\n+\treturn 0;\n+}\n+\n+/**\n+ * dpsw_if_set_flooding() - Enable Disable flooding for particular 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 DPSW object\n+ * @if_id:\tInterface Identifier\n+ * @en:\t\t1 - enable, 0 - disable\n+ *\n+ * Return:\tCompletion status. '0' on Success; Error code otherwise.\n+ */\n+int dpsw_if_set_flooding(struct fsl_mc_io *mc_io,\n+\t\t\t u32 cmd_flags,\n+\t\t\t u16 token,\n+\t\t\t u16 if_id,\n+\t\t\t int en)\n+{\n+\tstruct mc_command cmd = { 0 };\n+\tstruct dpsw_cmd_if_set_flooding *cmd_params;\n+\n+\t/* prepare command */\n+\tcmd.header = mc_encode_cmd_header(DPSW_CMDID_IF_SET_FLOODING,\n+\t\t\t\t\t  cmd_flags,\n+\t\t\t\t\t  token);\n+\tcmd_params = (struct dpsw_cmd_if_set_flooding *)cmd.params;\n+\tcmd_params->if_id = cpu_to_le16(if_id);\n+\tdpsw_set_field(cmd_params->enable, ENABLE, en);\n+\n+\t/* send command to mc*/\n+\treturn mc_send_command(mc_io, &cmd);\n+}\n+\n+/**\n+ * dpsw_if_set_broadcast() - Enable/disable broadcast for particular 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 DPSW object\n+ * @if_id:\tInterface Identifier\n+ * @en:\t\t1 - enable, 0 - disable\n+ *\n+ * Return:\tCompletion status. '0' on Success; Error code otherwise.\n+ */\n+int dpsw_if_set_broadcast(struct fsl_mc_io *mc_io,\n+\t\t\t  u32 cmd_flags,\n+\t\t\t  u16 token,\n+\t\t\t  u16 if_id,\n+\t\t\t  int en)\n+{\n+\tstruct mc_command cmd = { 0 };\n+\tstruct dpsw_cmd_if_set_broadcast *cmd_params;\n+\n+\t/* prepare command */\n+\tcmd.header = mc_encode_cmd_header(DPSW_CMDID_IF_SET_BROADCAST,\n+\t\t\t\t\t  cmd_flags,\n+\t\t\t\t\t  token);\n+\tcmd_params = (struct dpsw_cmd_if_set_broadcast *)cmd.params;\n+\tcmd_params->if_id = cpu_to_le16(if_id);\n+\tdpsw_set_field(cmd_params->enable, ENABLE, en);\n+\n+\t/* send command to mc*/\n+\treturn mc_send_command(mc_io, &cmd);\n+}\n+\n+/**\n+ * dpsw_if_set_tci() - Set default VLAN Tag Control Information (TCI)\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 DPSW object\n+ * @if_id:\tInterface Identifier\n+ * @cfg:\tTag Control Information Configuration\n+ *\n+ * Return:\tCompletion status. '0' on Success; Error code otherwise.\n+ */\n+int dpsw_if_set_tci(struct fsl_mc_io *mc_io,\n+\t\t    u32 cmd_flags,\n+\t\t    u16 token,\n+\t\t    u16 if_id,\n+\t\t    const struct dpsw_tci_cfg *cfg)\n+{\n+\tstruct mc_command cmd = { 0 };\n+\tstruct dpsw_cmd_if_set_tci *cmd_params;\n+\n+\t/* prepare command */\n+\tcmd.header = mc_encode_cmd_header(DPSW_CMDID_IF_SET_TCI,\n+\t\t\t\t\t  cmd_flags,\n+\t\t\t\t\t  token);\n+\tcmd_params = (struct dpsw_cmd_if_set_tci *)cmd.params;\n+\tcmd_params->if_id = cpu_to_le16(if_id);\n+\tdpsw_set_field(cmd_params->conf, VLAN_ID, cfg->vlan_id);\n+\tdpsw_set_field(cmd_params->conf, DEI, cfg->dei);\n+\tdpsw_set_field(cmd_params->conf, PCP, cfg->pcp);\n+\tcmd_params->conf = cpu_to_le16(cmd_params->conf);\n+\n+\t/* send command to mc*/\n+\treturn mc_send_command(mc_io, &cmd);\n+}\n+\n+/**\n+ * dpsw_if_set_stp() - Function sets Spanning Tree Protocol (STP) 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 DPSW object\n+ * @if_id:\tInterface Identifier\n+ * @cfg:\tSTP State configuration parameters\n+ *\n+ * The following STP states are supported -\n+ * blocking, listening, learning, forwarding and disabled.\n+ *\n+ * Return:\tCompletion status. '0' on Success; Error code otherwise.\n+ */\n+int dpsw_if_set_stp(struct fsl_mc_io *mc_io,\n+\t\t    u32 cmd_flags,\n+\t\t    u16 token,\n+\t\t    u16 if_id,\n+\t\t    const struct dpsw_stp_cfg *cfg)\n+{\n+\tstruct mc_command cmd = { 0 };\n+\tstruct dpsw_cmd_if_set_stp *cmd_params;\n+\n+\t/* prepare command */\n+\tcmd.header = mc_encode_cmd_header(DPSW_CMDID_IF_SET_STP,\n+\t\t\t\t\t  cmd_flags,\n+\t\t\t\t\t  token);\n+\tcmd_params = (struct dpsw_cmd_if_set_stp *)cmd.params;\n+\tcmd_params->if_id = cpu_to_le16(if_id);\n+\tcmd_params->vlan_id = cpu_to_le16(cfg->vlan_id);\n+\tdpsw_set_field(cmd_params->state, STATE, cfg->state);\n+\n+\t/* send command to mc*/\n+\treturn mc_send_command(mc_io, &cmd);\n+}\n+\n+/**\n+ * dpsw_if_get_counter() - Get specific counter of particular 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 DPSW object\n+ * @if_id:\tInterface Identifier\n+ * @type:\tCounter type\n+ * @counter:\treturn value\n+ *\n+ * Return:\tCompletion status. '0' on Success; Error code otherwise.\n+ */\n+int dpsw_if_get_counter(struct fsl_mc_io *mc_io,\n+\t\t\tu32 cmd_flags,\n+\t\t\tu16 token,\n+\t\t\tu16 if_id,\n+\t\t\tenum dpsw_counter type,\n+\t\t\tu64 *counter)\n+{\n+\tstruct mc_command cmd = { 0 };\n+\tstruct dpsw_cmd_if_get_counter *cmd_params;\n+\tstruct dpsw_rsp_if_get_counter *rsp_params;\n+\tint err;\n+\n+\t/* prepare command */\n+\tcmd.header = mc_encode_cmd_header(DPSW_CMDID_IF_GET_COUNTER,\n+\t\t\t\t\t  cmd_flags,\n+\t\t\t\t\t  token);\n+\tcmd_params = (struct dpsw_cmd_if_get_counter *)cmd.params;\n+\tcmd_params->if_id = cpu_to_le16(if_id);\n+\tdpsw_set_field(cmd_params->type, COUNTER_TYPE, 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 dpsw_rsp_if_get_counter *)cmd.params;\n+\t*counter = le64_to_cpu(rsp_params->counter);\n+\n+\treturn 0;\n+}\n+\n+/**\n+ * dpsw_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 DPSW object\n+ * @if_id:\tInterface Identifier\n+ *\n+ * Return:\tCompletion status. '0' on Success; Error code otherwise.\n+ */\n+int dpsw_if_enable(struct fsl_mc_io *mc_io,\n+\t\t   u32 cmd_flags,\n+\t\t   u16 token,\n+\t\t   u16 if_id)\n+{\n+\tstruct mc_command cmd = { 0 };\n+\tstruct dpsw_cmd_if *cmd_params;\n+\n+\t/* prepare command */\n+\tcmd.header = mc_encode_cmd_header(DPSW_CMDID_IF_ENABLE,\n+\t\t\t\t\t  cmd_flags,\n+\t\t\t\t\t  token);\n+\tcmd_params = (struct dpsw_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+ * dpsw_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 DPSW object\n+ * @if_id:\tInterface Identifier\n+ *\n+ * Return:\tCompletion status. '0' on Success; Error code otherwise.\n+ */\n+int dpsw_if_disable(struct fsl_mc_io *mc_io,\n+\t\t    u32 cmd_flags,\n+\t\t    u16 token,\n+\t\t    u16 if_id)\n+{\n+\tstruct mc_command cmd = { 0 };\n+\tstruct dpsw_cmd_if *cmd_params;\n+\n+\t/* prepare command */\n+\tcmd.header = mc_encode_cmd_header(DPSW_CMDID_IF_DISABLE,\n+\t\t\t\t\t  cmd_flags,\n+\t\t\t\t\t  token);\n+\tcmd_params = (struct dpsw_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+ * dpsw_if_set_max_frame_length() - Set Maximum Receive frame length.\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 Identifier\n+ * @frame_length:\tMaximum Frame Length\n+ *\n+ * Return:\tCompletion status. '0' on Success; Error code otherwise.\n+ */\n+int dpsw_if_set_max_frame_length(struct fsl_mc_io *mc_io,\n+\t\t\t\t u32 cmd_flags,\n+\t\t\t\t u16 token,\n+\t\t\t\t u16 if_id,\n+\t\t\t\t u16 frame_length)\n+{\n+\tstruct mc_command cmd = { 0 };\n+\tstruct dpsw_cmd_if_set_max_frame_length *cmd_params;\n+\n+\t/* prepare command */\n+\tcmd.header = mc_encode_cmd_header(DPSW_CMDID_IF_SET_MAX_FRAME_LENGTH,\n+\t\t\t\t\t  cmd_flags,\n+\t\t\t\t\t  token);\n+\tcmd_params = (struct dpsw_cmd_if_set_max_frame_length *)cmd.params;\n+\tcmd_params->if_id = cpu_to_le16(if_id);\n+\tcmd_params->frame_length = cpu_to_le16(frame_length);\n+\n+\t/* send command to mc*/\n+\treturn mc_send_command(mc_io, &cmd);\n+}\n+\n+/**\n+ * dpsw_vlan_add() - Adding new VLAN to DPSW.\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 DPSW object\n+ * @vlan_id:\tVLAN Identifier\n+ * @cfg:\tVLAN configuration\n+ *\n+ * Only VLAN ID and FDB ID are required parameters here.\n+ * 12 bit VLAN ID is defined in IEEE802.1Q.\n+ * Adding a duplicate VLAN ID is not allowed.\n+ * FDB ID can be shared across multiple VLANs. Shared learning\n+ * is obtained by calling dpsw_vlan_add for multiple VLAN IDs\n+ * with same fdb_id\n+ *\n+ * Return:\tCompletion status. '0' on Success; Error code otherwise.\n+ */\n+int dpsw_vlan_add(struct fsl_mc_io *mc_io,\n+\t\t  u32 cmd_flags,\n+\t\t  u16 token,\n+\t\t  u16 vlan_id,\n+\t\t  const struct dpsw_vlan_cfg *cfg)\n+{\n+\tstruct mc_command cmd = { 0 };\n+\tstruct dpsw_vlan_add *cmd_params;\n+\n+\t/* prepare command */\n+\tcmd.header = mc_encode_cmd_header(DPSW_CMDID_VLAN_ADD,\n+\t\t\t\t\t  cmd_flags,\n+\t\t\t\t\t  token);\n+\tcmd_params = (struct dpsw_vlan_add *)cmd.params;\n+\tcmd_params->fdb_id = cpu_to_le16(cfg->fdb_id);\n+\tcmd_params->vlan_id = cpu_to_le16(vlan_id);\n+\n+\t/* send command to mc*/\n+\treturn mc_send_command(mc_io, &cmd);\n+}\n+\n+/**\n+ * dpsw_vlan_add_if() - Adding a set of interfaces to an existing VLAN.\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 DPSW object\n+ * @vlan_id:\tVLAN Identifier\n+ * @cfg:\tSet of interfaces to add\n+ *\n+ * It adds only interfaces not belonging to this VLAN yet,\n+ * otherwise an error is generated and an entire command is\n+ * ignored. This function can be called numerous times always\n+ * providing required interfaces delta.\n+ *\n+ * Return:\tCompletion status. '0' on Success; Error code otherwise.\n+ */\n+int dpsw_vlan_add_if(struct fsl_mc_io *mc_io,\n+\t\t     u32 cmd_flags,\n+\t\t     u16 token,\n+\t\t     u16 vlan_id,\n+\t\t     const struct dpsw_vlan_if_cfg *cfg)\n+{\n+\tstruct mc_command cmd = { 0 };\n+\tstruct dpsw_cmd_vlan_manage_if *cmd_params;\n+\n+\t/* prepare command */\n+\tcmd.header = mc_encode_cmd_header(DPSW_CMDID_VLAN_ADD_IF,\n+\t\t\t\t\t  cmd_flags,\n+\t\t\t\t\t  token);\n+\tcmd_params = (struct dpsw_cmd_vlan_manage_if *)cmd.params;\n+\tcmd_params->vlan_id = cpu_to_le16(vlan_id);\n+\tbuild_if_id_bitmap(cmd_params->if_id, cfg->if_id, cfg->num_ifs);\n+\n+\t/* send command to mc*/\n+\treturn mc_send_command(mc_io, &cmd);\n+}\n+\n+/**\n+ * dpsw_vlan_add_if_untagged() - Defining a set of interfaces that should be\n+ *\t\t\t\ttransmitted as untagged.\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 DPSW object\n+ * @vlan_id:\tVLAN Identifier\n+ * @cfg:\tSet of interfaces that should be transmitted as untagged\n+ *\n+ * These interfaces should already belong to this VLAN.\n+ * By default all interfaces are transmitted as tagged.\n+ * Providing un-existing interface or untagged interface that is\n+ * configured untagged already generates an error and the entire\n+ * command is ignored.\n+ *\n+ * Return:\tCompletion status. '0' on Success; Error code otherwise.\n+ */\n+int dpsw_vlan_add_if_untagged(struct fsl_mc_io *mc_io,\n+\t\t\t      u32 cmd_flags,\n+\t\t\t      u16 token,\n+\t\t\t      u16 vlan_id,\n+\t\t\t      const struct dpsw_vlan_if_cfg *cfg)\n+{\n+\tstruct mc_command cmd = { 0 };\n+\tstruct dpsw_cmd_vlan_manage_if *cmd_params;\n+\n+\t/* prepare command */\n+\tcmd.header = mc_encode_cmd_header(DPSW_CMDID_VLAN_ADD_IF_UNTAGGED,\n+\t\t\t\t\t  cmd_flags,\n+\t\t\t\t\t  token);\n+\tcmd_params = (struct dpsw_cmd_vlan_manage_if *)cmd.params;\n+\tcmd_params->vlan_id = cpu_to_le16(vlan_id);\n+\tbuild_if_id_bitmap(cmd_params->if_id, cfg->if_id, cfg->num_ifs);\n+\n+\t/* send command to mc*/\n+\treturn mc_send_command(mc_io, &cmd);\n+}\n+\n+/**\n+ * dpsw_vlan_remove_if() - Remove interfaces from an existing VLAN.\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 DPSW object\n+ * @vlan_id:\tVLAN Identifier\n+ * @cfg:\tSet of interfaces that should be removed\n+ *\n+ * Interfaces must belong to this VLAN, otherwise an error\n+ * is returned and an the command is ignored\n+ *\n+ * Return:\tCompletion status. '0' on Success; Error code otherwise.\n+ */\n+int dpsw_vlan_remove_if(struct fsl_mc_io *mc_io,\n+\t\t\tu32 cmd_flags,\n+\t\t\tu16 token,\n+\t\t\tu16 vlan_id,\n+\t\t\tconst struct dpsw_vlan_if_cfg *cfg)\n+{\n+\tstruct mc_command cmd = { 0 };\n+\tstruct dpsw_cmd_vlan_manage_if *cmd_params;\n+\n+\t/* prepare command */\n+\tcmd.header = mc_encode_cmd_header(DPSW_CMDID_VLAN_REMOVE_IF,\n+\t\t\t\t\t  cmd_flags,\n+\t\t\t\t\t  token);\n+\tcmd_params = (struct dpsw_cmd_vlan_manage_if *)cmd.params;\n+\tcmd_params->vlan_id = cpu_to_le16(vlan_id);\n+\tbuild_if_id_bitmap(cmd_params->if_id, cfg->if_id, cfg->num_ifs);\n+\n+\t/* send command to mc*/\n+\treturn mc_send_command(mc_io, &cmd);\n+}\n+\n+/**\n+ * dpsw_vlan_remove_if_untagged() - Define a set of interfaces that should be\n+ *\t\tconverted from transmitted as untagged to transmit as tagged.\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 DPSW object\n+ * @vlan_id:\tVLAN Identifier\n+ * @cfg:\tSet of interfaces that should be removed\n+ *\n+ * Interfaces provided by API have to belong to this VLAN and\n+ * configured untagged, otherwise an error is returned and the\n+ * command is ignored\n+ *\n+ * Return:\tCompletion status. '0' on Success; Error code otherwise.\n+ */\n+int dpsw_vlan_remove_if_untagged(struct fsl_mc_io *mc_io,\n+\t\t\t\t u32 cmd_flags,\n+\t\t\t\t u16 token,\n+\t\t\t\t u16 vlan_id,\n+\t\t\t\t const struct dpsw_vlan_if_cfg *cfg)\n+{\n+\tstruct mc_command cmd = { 0 };\n+\tstruct dpsw_cmd_vlan_manage_if *cmd_params;\n+\n+\t/* prepare command */\n+\tcmd.header = mc_encode_cmd_header(DPSW_CMDID_VLAN_REMOVE_IF_UNTAGGED,\n+\t\t\t\t\t  cmd_flags,\n+\t\t\t\t\t  token);\n+\tcmd_params = (struct dpsw_cmd_vlan_manage_if *)cmd.params;\n+\tcmd_params->vlan_id = cpu_to_le16(vlan_id);\n+\tbuild_if_id_bitmap(cmd_params->if_id, cfg->if_id, cfg->num_ifs);\n+\n+\t/* send command to mc*/\n+\treturn mc_send_command(mc_io, &cmd);\n+}\n+\n+/**\n+ * dpsw_vlan_remove() - Remove an entire VLAN\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 DPSW object\n+ * @vlan_id:\tVLAN Identifier\n+ *\n+ * Return:\tCompletion status. '0' on Success; Error code otherwise.\n+ */\n+int dpsw_vlan_remove(struct fsl_mc_io *mc_io,\n+\t\t     u32 cmd_flags,\n+\t\t     u16 token,\n+\t\t     u16 vlan_id)\n+{\n+\tstruct mc_command cmd = { 0 };\n+\tstruct dpsw_cmd_vlan_remove *cmd_params;\n+\n+\t/* prepare command */\n+\tcmd.header = mc_encode_cmd_header(DPSW_CMDID_VLAN_REMOVE,\n+\t\t\t\t\t  cmd_flags,\n+\t\t\t\t\t  token);\n+\tcmd_params = (struct dpsw_cmd_vlan_remove *)cmd.params;\n+\tcmd_params->vlan_id = cpu_to_le16(vlan_id);\n+\n+\t/* send command to mc*/\n+\treturn mc_send_command(mc_io, &cmd);\n+}\n+\n+/**\n+ * dpsw_fdb_add_unicast() - Function adds an unicast entry into MAC lookup 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 DPSW object\n+ * @fdb_id:\tForwarding Database Identifier\n+ * @cfg:\tUnicast entry configuration\n+ *\n+ * Return:\tCompletion status. '0' on Success; Error code otherwise.\n+ */\n+int dpsw_fdb_add_unicast(struct fsl_mc_io *mc_io,\n+\t\t\t u32 cmd_flags,\n+\t\t\t u16 token,\n+\t\t\t u16 fdb_id,\n+\t\t\t const struct dpsw_fdb_unicast_cfg *cfg)\n+{\n+\tstruct mc_command cmd = { 0 };\n+\tstruct dpsw_cmd_fdb_unicast_op *cmd_params;\n+\tint i;\n+\n+\t/* prepare command */\n+\tcmd.header = mc_encode_cmd_header(DPSW_CMDID_FDB_ADD_UNICAST,\n+\t\t\t\t\t  cmd_flags,\n+\t\t\t\t\t  token);\n+\tcmd_params = (struct dpsw_cmd_fdb_unicast_op *)cmd.params;\n+\tcmd_params->fdb_id = cpu_to_le16(fdb_id);\n+\tcmd_params->if_egress = cpu_to_le16(cfg->if_egress);\n+\tfor (i = 0; i < 6; i++)\n+\t\tcmd_params->mac_addr[i] = cfg->mac_addr[5 - i];\n+\tdpsw_set_field(cmd_params->type, ENTRY_TYPE, cfg->type);\n+\n+\t/* send command to mc*/\n+\treturn mc_send_command(mc_io, &cmd);\n+}\n+\n+/**\n+ * dpsw_fdb_remove_unicast() - removes an entry from MAC lookup 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 DPSW object\n+ * @fdb_id:\tForwarding Database Identifier\n+ * @cfg:\tUnicast entry configuration\n+ *\n+ * Return:\tCompletion status. '0' on Success; Error code otherwise.\n+ */\n+int dpsw_fdb_remove_unicast(struct fsl_mc_io *mc_io,\n+\t\t\t    u32 cmd_flags,\n+\t\t\t    u16 token,\n+\t\t\t    u16 fdb_id,\n+\t\t\t    const struct dpsw_fdb_unicast_cfg *cfg)\n+{\n+\tstruct mc_command cmd = { 0 };\n+\tstruct dpsw_cmd_fdb_unicast_op *cmd_params;\n+\tint i;\n+\n+\t/* prepare command */\n+\tcmd.header = mc_encode_cmd_header(DPSW_CMDID_FDB_REMOVE_UNICAST,\n+\t\t\t\t\t  cmd_flags,\n+\t\t\t\t\t  token);\n+\tcmd_params = (struct dpsw_cmd_fdb_unicast_op *)cmd.params;\n+\tcmd_params->fdb_id = cpu_to_le16(fdb_id);\n+\tfor (i = 0; i < 6; i++)\n+\t\tcmd_params->mac_addr[i] = cfg->mac_addr[5 - i];\n+\tcmd_params->if_egress = cpu_to_le16(cfg->if_egress);\n+\tdpsw_set_field(cmd_params->type, ENTRY_TYPE, cfg->type);\n+\n+\t/* send command to mc*/\n+\treturn mc_send_command(mc_io, &cmd);\n+}\n+\n+/**\n+ * dpsw_fdb_add_multicast() - Add a set of egress interfaces to multi-cast group\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 DPSW object\n+ * @fdb_id:\tForwarding Database Identifier\n+ * @cfg:\tMulticast entry configuration\n+ *\n+ * If group doesn't exist, it will be created.\n+ * It adds only interfaces not belonging to this multicast group\n+ * yet, otherwise error will be generated and the command is\n+ * ignored.\n+ * This function may be called numerous times always providing\n+ * required interfaces delta.\n+ *\n+ * Return:\tCompletion status. '0' on Success; Error code otherwise.\n+ */\n+int dpsw_fdb_add_multicast(struct fsl_mc_io *mc_io,\n+\t\t\t   u32 cmd_flags,\n+\t\t\t   u16 token,\n+\t\t\t   u16 fdb_id,\n+\t\t\t   const struct dpsw_fdb_multicast_cfg *cfg)\n+{\n+\tstruct mc_command cmd = { 0 };\n+\tstruct dpsw_cmd_fdb_multicast_op *cmd_params;\n+\tint i;\n+\n+\t/* prepare command */\n+\tcmd.header = mc_encode_cmd_header(DPSW_CMDID_FDB_ADD_MULTICAST,\n+\t\t\t\t\t  cmd_flags,\n+\t\t\t\t\t  token);\n+\tcmd_params = (struct dpsw_cmd_fdb_multicast_op *)cmd.params;\n+\tcmd_params->fdb_id = cpu_to_le16(fdb_id);\n+\tcmd_params->num_ifs = cpu_to_le16(cfg->num_ifs);\n+\tdpsw_set_field(cmd_params->type, ENTRY_TYPE, cfg->type);\n+\tbuild_if_id_bitmap(cmd_params->if_id, cfg->if_id, cfg->num_ifs);\n+\tfor (i = 0; i < 6; i++)\n+\t\tcmd_params->mac_addr[i] = cfg->mac_addr[5 - i];\n+\n+\t/* send command to mc*/\n+\treturn mc_send_command(mc_io, &cmd);\n+}\n+\n+/**\n+ * dpsw_fdb_remove_multicast() - Removing interfaces from an existing multicast\n+ *\t\t\t\tgroup.\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 DPSW object\n+ * @fdb_id:\tForwarding Database Identifier\n+ * @cfg:\tMulticast entry configuration\n+ *\n+ * Interfaces provided by this API have to exist in the group,\n+ * otherwise an error will be returned and an entire command\n+ * ignored. If there is no interface left in the group,\n+ * an entire group is deleted\n+ *\n+ * Return:\tCompletion status. '0' on Success; Error code otherwise.\n+ */\n+int dpsw_fdb_remove_multicast(struct fsl_mc_io *mc_io,\n+\t\t\t      u32 cmd_flags,\n+\t\t\t      u16 token,\n+\t\t\t      u16 fdb_id,\n+\t\t\t      const struct dpsw_fdb_multicast_cfg *cfg)\n+{\n+\tstruct mc_command cmd = { 0 };\n+\tstruct dpsw_cmd_fdb_multicast_op *cmd_params;\n+\tint i;\n+\n+\t/* prepare command */\n+\tcmd.header = mc_encode_cmd_header(DPSW_CMDID_FDB_REMOVE_MULTICAST,\n+\t\t\t\t\t  cmd_flags,\n+\t\t\t\t\t  token);\n+\tcmd_params = (struct dpsw_cmd_fdb_multicast_op *)cmd.params;\n+\tcmd_params->fdb_id = cpu_to_le16(fdb_id);\n+\tcmd_params->num_ifs = cpu_to_le16(cfg->num_ifs);\n+\tdpsw_set_field(cmd_params->type, ENTRY_TYPE, cfg->type);\n+\tbuild_if_id_bitmap(cmd_params->if_id, cfg->if_id, cfg->num_ifs);\n+\tfor (i = 0; i < 6; i++)\n+\t\tcmd_params->mac_addr[i] = cfg->mac_addr[5 - i];\n+\n+\t/* send command to mc*/\n+\treturn mc_send_command(mc_io, &cmd);\n+}\n+\n+/**\n+ * dpsw_fdb_set_learning_mode() - Define FDB learning mode\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 DPSW object\n+ * @fdb_id:\tForwarding Database Identifier\n+ * @mode:\tLearning mode\n+ *\n+ * Return:\tCompletion status. '0' on Success; Error code otherwise.\n+ */\n+int dpsw_fdb_set_learning_mode(struct fsl_mc_io *mc_io,\n+\t\t\t       u32 cmd_flags,\n+\t\t\t       u16 token,\n+\t\t\t       u16 fdb_id,\n+\t\t\t       enum dpsw_fdb_learning_mode mode)\n+{\n+\tstruct mc_command cmd = { 0 };\n+\tstruct dpsw_cmd_fdb_set_learning_mode *cmd_params;\n+\n+\t/* prepare command */\n+\tcmd.header = mc_encode_cmd_header(DPSW_CMDID_FDB_SET_LEARNING_MODE,\n+\t\t\t\t\t  cmd_flags,\n+\t\t\t\t\t  token);\n+\tcmd_params = (struct dpsw_cmd_fdb_set_learning_mode *)cmd.params;\n+\tcmd_params->fdb_id = cpu_to_le16(fdb_id);\n+\tdpsw_set_field(cmd_params->mode, LEARNING_MODE, mode);\n+\n+\t/* send command to mc*/\n+\treturn mc_send_command(mc_io, &cmd);\n+}\n+\n+/**\n+ * dpsw_get_api_version() - Get Data Path Switch API version\n+ * @mc_io:\tPointer 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 switch API\n+ * @minor_ver:\tMinor version of data path switch API\n+ *\n+ * Return:  '0' on Success; Error code otherwise.\n+ */\n+int dpsw_get_api_version(struct fsl_mc_io *mc_io,\n+\t\t\t u32 cmd_flags,\n+\t\t\t u16 *major_ver,\n+\t\t\t u16 *minor_ver)\n+{\n+\tstruct mc_command cmd = { 0 };\n+\tstruct dpsw_rsp_get_api_version *rsp_params;\n+\tint err;\n+\n+\tcmd.header = mc_encode_cmd_header(DPSW_CMDID_GET_API_VERSION,\n+\t\t\t\t\t  cmd_flags,\n+\t\t\t\t\t  0);\n+\n+\terr = mc_send_command(mc_io, &cmd);\n+\tif (err)\n+\t\treturn err;\n+\n+\trsp_params = (struct dpsw_rsp_get_api_version *)cmd.params;\n+\t*major_ver = le16_to_cpu(rsp_params->version_major);\n+\t*minor_ver = le16_to_cpu(rsp_params->version_minor);\n+\n+\treturn 0;\n+}\ndiff --git a/drivers/staging/fsl-dpaa2/ethsw/dpsw.h b/drivers/staging/fsl-dpaa2/ethsw/dpsw.h\nnew file mode 100644\nindex 0000000..e9c2906\n--- /dev/null\n+++ b/drivers/staging/fsl-dpaa2/ethsw/dpsw.h\n@@ -0,0 +1,579 @@\n+/* Copyright 2013-2016 Freescale Semiconductor Inc.\n+ * Copyright 2017 NXP\n+ *\n+ * Redistribution and use in source and binary forms, with or without\n+ * modification, are permitted provided that the following conditions are met:\n+ *     * Redistributions of source code must retain the above copyright\n+ *\t notice, this list of conditions and the following disclaimer.\n+ *     * Redistributions in binary form must reproduce the above copyright\n+ *\t notice, this list of conditions and the following disclaimer in the\n+ *\t documentation and/or other materials provided with the distribution.\n+ *     * Neither the name of the above-listed copyright holders nor the\n+ *\t names of any contributors may be used to endorse or promote products\n+ *\t derived from this software without specific prior written permission.\n+ *\n+ *\n+ * ALTERNATIVELY, this software may be distributed under the terms of the\n+ * GNU General Public License (\"GPL\") as published by the Free Software\n+ * Foundation, either version 2 of that License or (at your option) any\n+ * later version.\n+ *\n+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE\n+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n+ * POSSIBILITY OF SUCH DAMAGE.\n+ */\n+#ifndef __FSL_DPSW_H\n+#define __FSL_DPSW_H\n+\n+/* Data Path L2-Switch API\n+ * Contains API for handling DPSW topology and functionality\n+ */\n+\n+struct fsl_mc_io;\n+\n+/**\n+ * DPSW general definitions\n+ */\n+\n+/**\n+ * Maximum number of traffic class priorities\n+ */\n+#define DPSW_MAX_PRIORITIES\t8\n+/**\n+ * Maximum number of interfaces\n+ */\n+#define DPSW_MAX_IF\t\t64\n+\n+int dpsw_open(struct fsl_mc_io *mc_io,\n+\t      u32 cmd_flags,\n+\t      int dpsw_id,\n+\t      u16 *token);\n+\n+int dpsw_close(struct fsl_mc_io *mc_io,\n+\t       u32 cmd_flags,\n+\t       u16 token);\n+\n+/**\n+ * DPSW options\n+ */\n+\n+/**\n+ * Disable flooding\n+ */\n+#define DPSW_OPT_FLOODING_DIS\t\t0x0000000000000001ULL\n+/**\n+ * Disable Multicast\n+ */\n+#define DPSW_OPT_MULTICAST_DIS\t\t0x0000000000000004ULL\n+/**\n+ * Support control interface\n+ */\n+#define DPSW_OPT_CTRL_IF_DIS\t\t0x0000000000000010ULL\n+/**\n+ * Disable flooding metering\n+ */\n+#define DPSW_OPT_FLOODING_METERING_DIS  0x0000000000000020ULL\n+/**\n+ * Enable metering\n+ */\n+#define DPSW_OPT_METERING_EN            0x0000000000000040ULL\n+\n+/**\n+ * enum dpsw_component_type - component type of a bridge\n+ * @DPSW_COMPONENT_TYPE_C_VLAN: A C-VLAN component of an\n+ *   enterprise VLAN bridge or of a Provider Bridge used\n+ *   to process C-tagged frames\n+ * @DPSW_COMPONENT_TYPE_S_VLAN: An S-VLAN component of a\n+ *   Provider Bridge\n+ *\n+ */\n+enum dpsw_component_type {\n+\tDPSW_COMPONENT_TYPE_C_VLAN = 0,\n+\tDPSW_COMPONENT_TYPE_S_VLAN\n+};\n+\n+/**\n+ * struct dpsw_cfg - DPSW configuration\n+ * @num_ifs: Number of external and internal interfaces\n+ * @adv: Advanced parameters; default is all zeros;\n+ *\t\t use this structure to change default settings\n+ */\n+struct dpsw_cfg {\n+\tu16 num_ifs;\n+\t/**\n+\t * struct adv - Advanced parameters\n+\t * @options: Enable/Disable DPSW features (bitmap)\n+\t * @max_vlans: Maximum Number of VLAN's; 0 - indicates default 16\n+\t * @max_meters_per_if: Number of meters per interface\n+\t * @max_fdbs: Maximum Number of FDB's; 0 - indicates default 16\n+\t * @max_fdb_entries: Number of FDB entries for default FDB table;\n+\t *\t\t\t0 - indicates default 1024 entries.\n+\t * @fdb_aging_time: Default FDB aging time for default FDB table;\n+\t *\t\t\t0 - indicates default 300 seconds\n+\t * @max_fdb_mc_groups: Number of multicast groups in each FDB table;\n+\t *\t\t\t0 - indicates default 32\n+\t * @component_type: Indicates the component type of this bridge\n+\t */\n+\tstruct {\n+\t\tu64 options;\n+\t\tu16 max_vlans;\n+\t\tu8 max_meters_per_if;\n+\t\tu8 max_fdbs;\n+\t\tu16 max_fdb_entries;\n+\t\tu16 fdb_aging_time;\n+\t\tu16 max_fdb_mc_groups;\n+\t\tenum dpsw_component_type component_type;\n+\t} adv;\n+};\n+\n+int dpsw_enable(struct fsl_mc_io *mc_io,\n+\t\tu32 cmd_flags,\n+\t\tu16 token);\n+\n+int dpsw_disable(struct fsl_mc_io *mc_io,\n+\t\t u32 cmd_flags,\n+\t\t u16 token);\n+\n+int dpsw_reset(struct fsl_mc_io *mc_io,\n+\t       u32 cmd_flags,\n+\t       u16 token);\n+\n+/**\n+ * DPSW IRQ Index and Events\n+ */\n+\n+#define DPSW_IRQ_INDEX_IF\t\t0x0000\n+#define DPSW_IRQ_INDEX_L2SW\t\t0x0001\n+\n+/**\n+ * IRQ event - Indicates that the link state changed\n+ */\n+#define DPSW_IRQ_EVENT_LINK_CHANGED\t0x0001\n+\n+/**\n+ * struct dpsw_irq_cfg - IRQ configuration\n+ * @addr:\tAddress that must be written to signal a message-based interrupt\n+ * @val:\tValue to write into irq_addr address\n+ * @irq_num: A user defined number associated with this IRQ\n+ */\n+struct dpsw_irq_cfg {\n+\t     u64 addr;\n+\t     u32 val;\n+\t     int irq_num;\n+};\n+\n+int dpsw_set_irq_enable(struct fsl_mc_io *mc_io,\n+\t\t\tu32 cmd_flags,\n+\t\t\tu16 token,\n+\t\t\tu8 irq_index,\n+\t\t\tu8 en);\n+\n+int dpsw_set_irq_mask(struct fsl_mc_io *mc_io,\n+\t\t      u32 cmd_flags,\n+\t\t      u16 token,\n+\t\t      u8 irq_index,\n+\t\t      u32 mask);\n+\n+int dpsw_get_irq_status(struct fsl_mc_io *mc_io,\n+\t\t\tu32 cmd_flags,\n+\t\t\tu16 token,\n+\t\t\tu8 irq_index,\n+\t\t\tu32 *status);\n+\n+int dpsw_clear_irq_status(struct fsl_mc_io *mc_io,\n+\t\t\t  u32 cmd_flags,\n+\t\t\t  u16 token,\n+\t\t\t  u8 irq_index,\n+\t\t\t  u32 status);\n+\n+/**\n+ * struct dpsw_attr - Structure representing DPSW attributes\n+ * @id: DPSW object ID\n+ * @options: Enable/Disable DPSW features\n+ * @max_vlans: Maximum Number of VLANs\n+ * @max_meters_per_if:  Number of meters per interface\n+ * @max_fdbs: Maximum Number of FDBs\n+ * @max_fdb_entries: Number of FDB entries for default FDB table;\n+ *\t\t\t0 - indicates default 1024 entries.\n+ * @fdb_aging_time: Default FDB aging time for default FDB table;\n+ *\t\t\t0 - indicates default 300 seconds\n+ * @max_fdb_mc_groups: Number of multicast groups in each FDB table;\n+ *\t\t\t0 - indicates default 32\n+ * @mem_size: DPSW frame storage memory size\n+ * @num_ifs: Number of interfaces\n+ * @num_vlans: Current number of VLANs\n+ * @num_fdbs: Current number of FDBs\n+ * @component_type: Component type of this bridge\n+ */\n+struct dpsw_attr {\n+\tint id;\n+\tu64 options;\n+\tu16 max_vlans;\n+\tu8 max_meters_per_if;\n+\tu8 max_fdbs;\n+\tu16 max_fdb_entries;\n+\tu16 fdb_aging_time;\n+\tu16 max_fdb_mc_groups;\n+\tu16 num_ifs;\n+\tu16 mem_size;\n+\tu16 num_vlans;\n+\tu8 num_fdbs;\n+\tenum dpsw_component_type component_type;\n+};\n+\n+int dpsw_get_attributes(struct fsl_mc_io *mc_io,\n+\t\t\tu32 cmd_flags,\n+\t\t\tu16 token,\n+\t\t\tstruct dpsw_attr *attr);\n+\n+/**\n+ * enum dpsw_action - Action selection for special/control frames\n+ * @DPSW_ACTION_DROP: Drop frame\n+ * @DPSW_ACTION_REDIRECT: Redirect frame to control port\n+ */\n+enum dpsw_action {\n+\tDPSW_ACTION_DROP = 0,\n+\tDPSW_ACTION_REDIRECT = 1\n+};\n+\n+/**\n+ * struct dpsw_link_state - Structure representing DPSW link state\n+ * @rate: Rate\n+ * @options: Mask of available options; use 'DPSW_LINK_OPT_<X>' values\n+ * @up: 0 - covers two cases: down and disconnected, 1 - up\n+ */\n+struct dpsw_link_state {\n+\tu32 rate;\n+\tu64 options;\n+\tu8 up;\n+};\n+\n+int dpsw_if_get_link_state(struct fsl_mc_io *mc_io,\n+\t\t\t   u32 cmd_flags,\n+\t\t\t   u16 token,\n+\t\t\t   u16 if_id,\n+\t\t\t   struct dpsw_link_state *state);\n+\n+int dpsw_if_set_flooding(struct fsl_mc_io *mc_io,\n+\t\t\t u32 cmd_flags,\n+\t\t\t u16 token,\n+\t\t\t u16 if_id,\n+\t\t\t int en);\n+\n+int dpsw_if_set_broadcast(struct fsl_mc_io *mc_io,\n+\t\t\t  u32 cmd_flags,\n+\t\t\t  u16 token,\n+\t\t\t  u16 if_id,\n+\t\t\t  int en);\n+\n+/**\n+ * struct dpsw_tci_cfg - Tag Control Information (TCI) configuration\n+ * @pcp: Priority Code Point (PCP): a 3-bit field which refers\n+ *\t\t to the IEEE 802.1p priority\n+ * @dei: Drop Eligible Indicator (DEI): a 1-bit field. May be used\n+ *\t\t separately or in conjunction with PCP to indicate frames\n+ *\t\t eligible to be dropped in the presence of congestion\n+ * @vlan_id: VLAN Identifier (VID): a 12-bit field specifying the VLAN\n+ *\t\t\tto which the frame belongs. The hexadecimal values\n+ *\t\t\tof 0x000 and 0xFFF are reserved;\n+ *\t\t\tall other values may be used as VLAN identifiers,\n+ *\t\t\tallowing up to 4,094 VLANs\n+ */\n+struct dpsw_tci_cfg {\n+\tu8 pcp;\n+\tu8 dei;\n+\tu16 vlan_id;\n+};\n+\n+int dpsw_if_set_tci(struct fsl_mc_io *mc_io,\n+\t\t    u32 cmd_flags,\n+\t\t    u16 token,\n+\t\t    u16 if_id,\n+\t\t    const struct dpsw_tci_cfg *cfg);\n+\n+/**\n+ * enum dpsw_stp_state - Spanning Tree Protocol (STP) states\n+ * @DPSW_STP_STATE_BLOCKING: Blocking state\n+ * @DPSW_STP_STATE_LISTENING: Listening state\n+ * @DPSW_STP_STATE_LEARNING: Learning state\n+ * @DPSW_STP_STATE_FORWARDING: Forwarding state\n+ *\n+ */\n+enum dpsw_stp_state {\n+\tDPSW_STP_STATE_DISABLED = 0,\n+\tDPSW_STP_STATE_LISTENING = 1,\n+\tDPSW_STP_STATE_LEARNING = 2,\n+\tDPSW_STP_STATE_FORWARDING = 3,\n+\tDPSW_STP_STATE_BLOCKING = 0\n+};\n+\n+/**\n+ * struct dpsw_stp_cfg - Spanning Tree Protocol (STP) Configuration\n+ * @vlan_id: VLAN ID STP state\n+ * @state: STP state\n+ */\n+struct dpsw_stp_cfg {\n+\tu16 vlan_id;\n+\tenum dpsw_stp_state state;\n+};\n+\n+int dpsw_if_set_stp(struct fsl_mc_io *mc_io,\n+\t\t    u32 cmd_flags,\n+\t\t    u16 token,\n+\t\t    u16 if_id,\n+\t\t    const struct dpsw_stp_cfg *cfg);\n+\n+/**\n+ * enum dpsw_accepted_frames - Types of frames to accept\n+ * @DPSW_ADMIT_ALL: The device accepts VLAN tagged, untagged and\n+ *\t\t\tpriority tagged frames\n+ * @DPSW_ADMIT_ONLY_VLAN_TAGGED: The device discards untagged frames or\n+ *\t\t\tPriority-Tagged frames received on this interface.\n+ *\n+ */\n+enum dpsw_accepted_frames {\n+\tDPSW_ADMIT_ALL = 1,\n+\tDPSW_ADMIT_ONLY_VLAN_TAGGED = 3\n+};\n+\n+/**\n+ * enum dpsw_counter  - Counters types\n+ * @DPSW_CNT_ING_FRAME: Counts ingress frames\n+ * @DPSW_CNT_ING_BYTE: Counts ingress bytes\n+ * @DPSW_CNT_ING_FLTR_FRAME: Counts filtered ingress frames\n+ * @DPSW_CNT_ING_FRAME_DISCARD: Counts discarded ingress frame\n+ * @DPSW_CNT_ING_MCAST_FRAME: Counts ingress multicast frames\n+ * @DPSW_CNT_ING_MCAST_BYTE: Counts ingress multicast bytes\n+ * @DPSW_CNT_ING_BCAST_FRAME: Counts ingress broadcast frames\n+ * @DPSW_CNT_ING_BCAST_BYTES: Counts ingress broadcast bytes\n+ * @DPSW_CNT_EGR_FRAME: Counts egress frames\n+ * @DPSW_CNT_EGR_BYTE: Counts eEgress bytes\n+ * @DPSW_CNT_EGR_FRAME_DISCARD: Counts discarded egress frames\n+ * @DPSW_CNT_EGR_STP_FRAME_DISCARD: Counts egress STP discarded frames\n+ */\n+enum dpsw_counter {\n+\tDPSW_CNT_ING_FRAME = 0x0,\n+\tDPSW_CNT_ING_BYTE = 0x1,\n+\tDPSW_CNT_ING_FLTR_FRAME = 0x2,\n+\tDPSW_CNT_ING_FRAME_DISCARD = 0x3,\n+\tDPSW_CNT_ING_MCAST_FRAME = 0x4,\n+\tDPSW_CNT_ING_MCAST_BYTE = 0x5,\n+\tDPSW_CNT_ING_BCAST_FRAME = 0x6,\n+\tDPSW_CNT_ING_BCAST_BYTES = 0x7,\n+\tDPSW_CNT_EGR_FRAME = 0x8,\n+\tDPSW_CNT_EGR_BYTE = 0x9,\n+\tDPSW_CNT_EGR_FRAME_DISCARD = 0xa,\n+\tDPSW_CNT_EGR_STP_FRAME_DISCARD = 0xb\n+};\n+\n+int dpsw_if_get_counter(struct fsl_mc_io *mc_io,\n+\t\t\tu32 cmd_flags,\n+\t\t\tu16 token,\n+\t\t\tu16 if_id,\n+\t\t\tenum dpsw_counter type,\n+\t\t\tu64 *counter);\n+\n+int dpsw_if_enable(struct fsl_mc_io *mc_io,\n+\t\t   u32 cmd_flags,\n+\t\t   u16 token,\n+\t\t   u16 if_id);\n+\n+int dpsw_if_disable(struct fsl_mc_io *mc_io,\n+\t\t    u32 cmd_flags,\n+\t\t    u16 token,\n+\t\t    u16 if_id);\n+\n+int dpsw_if_set_max_frame_length(struct fsl_mc_io *mc_io,\n+\t\t\t\t u32 cmd_flags,\n+\t\t\t\t u16 token,\n+\t\t\t\t u16 if_id,\n+\t\t\t\t u16 frame_length);\n+\n+/**\n+ * struct dpsw_vlan_cfg - VLAN Configuration\n+ * @fdb_id: Forwarding Data Base\n+ */\n+struct dpsw_vlan_cfg {\n+\tu16 fdb_id;\n+};\n+\n+int dpsw_vlan_add(struct fsl_mc_io *mc_io,\n+\t\t  u32 cmd_flags,\n+\t\t  u16 token,\n+\t\t  u16 vlan_id,\n+\t\t  const struct dpsw_vlan_cfg *cfg);\n+\n+/**\n+ * struct dpsw_vlan_if_cfg - Set of VLAN Interfaces\n+ * @num_ifs: The number of interfaces that are assigned to the egress\n+ *\t\tlist for this VLAN\n+ * @if_id: The set of interfaces that are\n+ *\t\tassigned to the egress list for this VLAN\n+ */\n+struct dpsw_vlan_if_cfg {\n+\tu16 num_ifs;\n+\tu16 if_id[DPSW_MAX_IF];\n+};\n+\n+int dpsw_vlan_add_if(struct fsl_mc_io *mc_io,\n+\t\t     u32 cmd_flags,\n+\t\t     u16 token,\n+\t\t     u16 vlan_id,\n+\t\t     const struct dpsw_vlan_if_cfg *cfg);\n+\n+int dpsw_vlan_add_if_untagged(struct fsl_mc_io *mc_io,\n+\t\t\t      u32 cmd_flags,\n+\t\t\t      u16 token,\n+\t\t\t      u16 vlan_id,\n+\t\t\t      const struct dpsw_vlan_if_cfg *cfg);\n+\n+int dpsw_vlan_remove_if(struct fsl_mc_io *mc_io,\n+\t\t\tu32 cmd_flags,\n+\t\t\tu16 token,\n+\t\t\tu16 vlan_id,\n+\t\t\tconst struct dpsw_vlan_if_cfg *cfg);\n+\n+int dpsw_vlan_remove_if_untagged(struct fsl_mc_io *mc_io,\n+\t\t\t\t u32 cmd_flags,\n+\t\t\t\t u16 token,\n+\t\t\t\t u16 vlan_id,\n+\t\t\t\t const struct dpsw_vlan_if_cfg *cfg);\n+\n+int dpsw_vlan_remove(struct fsl_mc_io *mc_io,\n+\t\t     u32 cmd_flags,\n+\t\t     u16 token,\n+\t\t     u16 vlan_id);\n+\n+/**\n+ * enum dpsw_fdb_entry_type - FDB Entry type - Static/Dynamic\n+ * @DPSW_FDB_ENTRY_STATIC: Static entry\n+ * @DPSW_FDB_ENTRY_DINAMIC: Dynamic entry\n+ */\n+enum dpsw_fdb_entry_type {\n+\tDPSW_FDB_ENTRY_STATIC = 0,\n+\tDPSW_FDB_ENTRY_DINAMIC = 1\n+};\n+\n+/**\n+ * struct dpsw_fdb_unicast_cfg - Unicast entry configuration\n+ * @type: Select static or dynamic entry\n+ * @mac_addr: MAC address\n+ * @if_egress: Egress interface ID\n+ */\n+struct dpsw_fdb_unicast_cfg {\n+\tenum dpsw_fdb_entry_type type;\n+\tu8 mac_addr[6];\n+\tu16 if_egress;\n+};\n+\n+int dpsw_fdb_add_unicast(struct fsl_mc_io *mc_io,\n+\t\t\t u32 cmd_flags,\n+\t\t\t u16 token,\n+\t\t\t u16 fdb_id,\n+\t\t\t const struct dpsw_fdb_unicast_cfg *cfg);\n+\n+int dpsw_fdb_remove_unicast(struct fsl_mc_io *mc_io,\n+\t\t\t    u32 cmd_flags,\n+\t\t\t    u16 token,\n+\t\t\t    u16 fdb_id,\n+\t\t\t    const struct dpsw_fdb_unicast_cfg *cfg);\n+\n+/**\n+ * struct dpsw_fdb_multicast_cfg - Multi-cast entry configuration\n+ * @type: Select static or dynamic entry\n+ * @mac_addr: MAC address\n+ * @num_ifs: Number of external and internal interfaces\n+ * @if_id: Egress interface IDs\n+ */\n+struct dpsw_fdb_multicast_cfg {\n+\tenum dpsw_fdb_entry_type type;\n+\tu8 mac_addr[6];\n+\tu16 num_ifs;\n+\tu16 if_id[DPSW_MAX_IF];\n+};\n+\n+int dpsw_fdb_add_multicast(struct fsl_mc_io *mc_io,\n+\t\t\t   u32 cmd_flags,\n+\t\t\t   u16 token,\n+\t\t\t   u16 fdb_id,\n+\t\t\t   const struct dpsw_fdb_multicast_cfg *cfg);\n+\n+int dpsw_fdb_remove_multicast(struct fsl_mc_io *mc_io,\n+\t\t\t      u32 cmd_flags,\n+\t\t\t      u16 token,\n+\t\t\t      u16 fdb_id,\n+\t\t\t      const struct dpsw_fdb_multicast_cfg *cfg);\n+\n+/**\n+ * enum dpsw_fdb_learning_mode - Auto-learning modes\n+ * @DPSW_FDB_LEARNING_MODE_DIS: Disable Auto-learning\n+ * @DPSW_FDB_LEARNING_MODE_HW: Enable HW auto-Learning\n+ * @DPSW_FDB_LEARNING_MODE_NON_SECURE: Enable None secure learning by CPU\n+ * @DPSW_FDB_LEARNING_MODE_SECURE: Enable secure learning by CPU\n+ *\n+ *\tNONE - SECURE LEARNING\n+ *\tSMAC found\tDMAC found\tCTLU Action\n+ *\tv\t\tv\tForward frame to\n+ *\t\t\t\t\t\t1.  DMAC destination\n+ *\t-\t\tv\tForward frame to\n+ *\t\t\t\t\t\t1.  DMAC destination\n+ *\t\t\t\t\t\t2.  Control interface\n+ *\tv\t\t-\tForward frame to\n+ *\t\t\t\t\t\t1.  Flooding list of interfaces\n+ *\t-\t\t-\tForward frame to\n+ *\t\t\t\t\t\t1.  Flooding list of interfaces\n+ *\t\t\t\t\t\t2.  Control interface\n+ *\tSECURE LEARING\n+ *\tSMAC found\tDMAC found\tCTLU Action\n+ *\tv\t\tv\t\tForward frame to\n+ *\t\t\t\t\t\t1.  DMAC destination\n+ *\t-\t\tv\t\tForward frame to\n+ *\t\t\t\t\t\t1.  Control interface\n+ *\tv\t\t-\t\tForward frame to\n+ *\t\t\t\t\t\t1.  Flooding list of interfaces\n+ *\t-\t\t-\t\tForward frame to\n+ *\t\t\t\t\t\t1.  Control interface\n+ */\n+enum dpsw_fdb_learning_mode {\n+\tDPSW_FDB_LEARNING_MODE_DIS = 0,\n+\tDPSW_FDB_LEARNING_MODE_HW = 1,\n+\tDPSW_FDB_LEARNING_MODE_NON_SECURE = 2,\n+\tDPSW_FDB_LEARNING_MODE_SECURE = 3\n+};\n+\n+int dpsw_fdb_set_learning_mode(struct fsl_mc_io *mc_io,\n+\t\t\t       u32 cmd_flags,\n+\t\t\t       u16 token,\n+\t\t\t       u16 fdb_id,\n+\t\t\t       enum dpsw_fdb_learning_mode mode);\n+\n+/**\n+ * struct dpsw_fdb_attr - FDB Attributes\n+ * @max_fdb_entries: Number of FDB entries\n+ * @fdb_aging_time: Aging time in seconds\n+ * @learning_mode: Learning mode\n+ * @num_fdb_mc_groups: Current number of multicast groups\n+ * @max_fdb_mc_groups: Maximum number of multicast groups\n+ */\n+struct dpsw_fdb_attr {\n+\tu16 max_fdb_entries;\n+\tu16 fdb_aging_time;\n+\tenum dpsw_fdb_learning_mode learning_mode;\n+\tu16 num_fdb_mc_groups;\n+\tu16 max_fdb_mc_groups;\n+};\n+\n+int dpsw_get_api_version(struct fsl_mc_io *mc_io,\n+\t\t\t u32 cmd_flags,\n+\t\t\t u16 *major_ver,\n+\t\t\t u16 *minor_ver);\n+\n+#endif /* __FSL_DPSW_H */\n",
    "prefixes": [
        "RESEND",
        "1/6"
    ]
}