get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 28784,
    "url": "http://patches.dpdk.org/api/patches/28784/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/1505559161-29222-15-git-send-email-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": "<1505559161-29222-15-git-send-email-hemant.agrawal@nxp.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1505559161-29222-15-git-send-email-hemant.agrawal@nxp.com",
    "date": "2017-09-16T10:52:28",
    "name": "[dpdk-dev,v3,14/27] net/dpaa2: add support for link status event",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "2c7d940c03e67b794377ea4e4fe194e52dde4a38",
    "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/1505559161-29222-15-git-send-email-hemant.agrawal@nxp.com/mbox/",
    "series": [],
    "comments": "http://patches.dpdk.org/api/patches/28784/comments/",
    "check": "fail",
    "checks": "http://patches.dpdk.org/api/patches/28784/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 822321B20F;\n\tSat, 16 Sep 2017 12:53:45 +0200 (CEST)",
            "from NAM03-DM3-obe.outbound.protection.outlook.com\n\t(mail-dm3nam03on0066.outbound.protection.outlook.com [104.47.41.66])\n\tby dpdk.org (Postfix) with ESMTP id EAEA41B1A6\n\tfor <dev@dpdk.org>; Sat, 16 Sep 2017 12:53:36 +0200 (CEST)",
            "from CY4PR03CA0023.namprd03.prod.outlook.com (10.168.162.33) by\n\tCY4PR03MB2694.namprd03.prod.outlook.com (10.173.43.137) with\n\tMicrosoft SMTP Server (version=TLS1_2,\n\tcipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id\n\t15.20.56.11; Sat, 16 Sep 2017 10:53:35 +0000",
            "from BL2FFO11FD029.protection.gbl (2a01:111:f400:7c09::129) by\n\tCY4PR03CA0023.outlook.office365.com (2603:10b6:903:33::33) with\n\tMicrosoft SMTP Server (version=TLS1_2,\n\tcipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.56.11 via\n\tFrontend Transport; Sat, 16 Sep 2017 10:53:35 +0000",
            "from tx30smr01.am.freescale.net (192.88.168.50) by\n\tBL2FFO11FD029.mail.protection.outlook.com (10.173.160.69) with\n\tMicrosoft SMTP Server (version=TLS1_0,\n\tcipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.20.13.11\n\tvia Frontend Transport; Sat, 16 Sep 2017 10:53:34 +0000",
            "from bf-netperf1.ap.freescale.net (bf-netperf1.ap.freescale.net\n\t[10.232.134.28])\n\tby tx30smr01.am.freescale.net (8.14.3/8.14.0) with ESMTP id\n\tv8GAr6v1028328; Sat, 16 Sep 2017 03:53:32 -0700"
        ],
        "Authentication-Results": "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-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": "Hemant Agrawal <hemant.agrawal@nxp.com>",
        "To": "<dev@dpdk.org>",
        "CC": "<ferruh.yigit@intel.com>, <shreyansh.jain@nxp.com>",
        "Date": "Sat, 16 Sep 2017 16:22:28 +0530",
        "Message-ID": "<1505559161-29222-15-git-send-email-hemant.agrawal@nxp.com>",
        "X-Mailer": "git-send-email 2.7.4",
        "In-Reply-To": "<1505559161-29222-1-git-send-email-hemant.agrawal@nxp.com>",
        "References": "<1504860327-18451-1-git-send-email-hemant.agrawal@nxp.com>\n\t<1505559161-29222-1-git-send-email-hemant.agrawal@nxp.com>",
        "X-EOPAttributedMessage": "0",
        "X-Matching-Connectors": "131500328148101475;\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)(336005)(376002)(346002)(39860400002)(39380400002)(2980300002)(1109001)(1110001)(339900001)(45074003)(199003)(189002)(85426001)(76176999)(316002)(50986999)(54906002)(6916009)(110136004)(97736004)(48376002)(105606002)(50466002)(53936002)(36756003)(4326008)(2351001)(104016004)(16586007)(106466001)(33646002)(47776003)(77096006)(2906002)(8656003)(6666003)(8676002)(5003940100001)(86362001)(81156014)(81166006)(305945005)(189998001)(5660300001)(356003)(8936002)(498600001)(68736007)(2950100002)(50226002);\n\tDIR:OUT; SFP:1101; SCL:1; SRVR:CY4PR03MB2694;\n\tH:tx30smr01.am.freescale.net; \n\tFPR:; SPF:Fail; PTR:InfoDomainNonexistent; A:1; MX:1; LANG:en; ",
        "X-Microsoft-Exchange-Diagnostics": [
            "1; BL2FFO11FD029;\n\t1:nvRsUVOBMz4s4oCZrTlgt5hLu5pK//qp/tl6XLrS0yZ0G4tmQCGC/VpT5LD9HClC4dviio0TCyJ67FAK1+9cxj76UJvLxUHT7DWKU/ZDpb8oJAk+9nkinapKbMj4rS3J",
            "1; CY4PR03MB2694;\n\t3:tccd8qqO/d+eT/qGYVl1szbmTQVimNXoS/ZMd9rVu/v2CKQkJQubo6nBh906W2//S5SpBgGqkHBE9SNdB3588BseBnxRjFw5h+3iQQqRBYlQPQMIIeEN9nZ6yK3cveA1/nzUOndSh6EpZyNp2K6/p+gteqQhOBhzoVawbo/vUgWglOn+h7JEEbDKleM0hMzDhr+Ay+gbGaXC/z9wqDuKfPa0/MMpPmYlzXl1ULHxdRz1iKLoAbwa3pxjptITh9bNUUlUqwSAG+0wfIk2KYmBGBCml+I9sn+EHpLe0el41tdtTeUiGzhfz13p1zXUJoM+gDonIEvXjuiqG0veT4OkaBl7+5Q0kY3zZ9OAqSA/hjI=;\n\t25:bXJGqFKn6d05+nE7Lq+NpNaRvUyrEzO80emkkvUANNskFRBqLdXLcBev5eWhDyl1/diAn6a7SL2xIW2jbmCiSK9vcEUm1QSgFK+JNrZQss1khvwUt7LOfar6eS95BVxTACMaUJwHHX5MDDCM8RUUjYOsPkTiOsymLvWJ1HY6QNVh53RxqCMa/qa4dqjrnq0xbQk+s/Osl875naiaEamfrlTLfSPpK8vKBEzAlMyFs5MLmS+ruGO46GLlJMLQKDFJsoq8ed1ih349L16ZumYGxICqliKTJaHaLF836Iq4Wfv2dLQOodG1kljebos0zmLIbQb7+2dLhpnmo4NsnveQ3Q==",
            "1; CY4PR03MB2694;\n\t31:5UZjdK/7nPxsIKHiJHD2EMQLjIzV48gulLox4iI2iP+Ax5MvUU9zY13u5P7flwLfwR3XqLcN9yGpcUStIw6ziVPkw3Nyk+Fk+VkS8fd0dUejcVmoCqb1leWgoA/YuxjDRXpuAiCNZstpLB0NHv15Q4S3elOItsZIKgd4tKE8jRyWGkOIGwgYoSLPJbVUkJ9oentWuxWoz3Qg0rRo/5nEUYJa55FASTU6Ij0SpOIv1O0=;\n\t4:89XiCUS1V4ph+2Vh4y4PbVKNcST2uFMoN4IMxB2E/IcZueLs1DQW5Zjq2+eh2FylR+t8yiNfRdqU8N3if1eXIuEKetUy4j3GQbkIZk3on0usvj4QKeIWYRiAylfseTia2KFcIOIzrZhBRvd/owqCRdCQDHlorTyIdkZId019GNN9Qn6IcBYFc1uu3pernqwMzh362zEQhVlp2kioyf9k7gk0hCedNCVu9Kzzo9f00rbnvmvwR5qYLazO1rzg0KImhuQSg3h5pHw3kmhnLXrnu5FFrWbZRdswkrOwCLhllw/VOluKnRKnDWZyZsM6EnmgchRsMHjVMGseHlQyeNQmdA==",
            "=?us-ascii?Q?1; CY4PR03MB2694;\n\t23:sFEb4L+ri7OuKq12Fo7VX7WNuinvdFmEC4ye0xGOC?=\n\tsCzMz4tjTZkkXamz75x+BCaFhGeTxMvDcr6WITJyVY8J3Dp7ChT2wGcyGuzKxVbzLgKmIg6VWsXGtncVTgdIabY7UZ2PFHB47mGCos6VsIaAHuV8/6doMmAR7DsSI1IjDmloRyQNZs0pKdXIP4qAtsPJzn1+KyTMvOm7RJiVAd3R5+qxCgWifYjXSiCH/b6aA39E9EwJtINGjDjEWnECe8tTaRn1UBd23YPG0EKquXWOVCynU7GUT8mAiidFR5aHP5luLzxH/EgQhqZctLc83T+07G97gJ/Gv6GL3zrblj2kxbQwVEmJfqPsethHOsEdS9qCWPEBOwzF7reF6VNlYmJS2ptUpP9EaFUgNdjCqgVU65ItPx/Q7y8EvioPbewEL6y8ot2NEblINEE3W3k7d6VmTmZN/8e6tX3xj9dOF7MHYScWGSUYGHL09zxCMcjrH2wyKwLNJdi6XmJLRMwecCTcQpvkSyh7BaX/hjH+jtnN/duQ5oQae/eCvKA2d2rn7xzXV4xsHcFQsy4rx2QOIqcwrIFbm9x0z38GRb2uBQBbq6yuHsLq3wLxIC5rVvG9vcuGPrrPswCFIFhnPqHeR17NmB9fC9WDJJFxMM7Dtlpu2Fo5THyuNksE0UUgNRXPUNa5cWNwDDtuyPEy9S0mhU/IthMCSI4r7sMVZW2Vh8+18jQYFYL8HpuBQ4hUSvgV5l8VLPdO6M47U8VhrP5PzGOIoOc4T/yuM/RVRVrjYUq3DqAKrwAQrdohNUWL9rh485seMf/NMlunqybFrKf6iCQ21zuag/B2ej8OyUS4hm53Xm1re5agXl6e4eMHS3ilyjcAH0d4wphrO8spTYkSdV65Uyb/sCC39KuUUbZ0+sYIDCMW5vN13/X7PTRFWdgdlLDk9orzrwRTon8nDdJes6+2TrsTW0LmXXzJlQEvSfcqA4RNoSGMQBJ7SEQSWHQ/0PiQqQ0z57ayOayJ6Irp9Y/k66IZZY+kOB9ptgD3r0/aReo+0ISqRKGJI9UVRINE90T4LK6iHOqJPLmTLUcm/3LQxn3gHLXpcEWpwOJr9JbH2PJ5+HfTqxGIX2BzQqN81PvoiP2jWjF5yoGR904zGtcRtieyil696R/aIIH57mRg6o8F0oD+AXU5zOFQGPWinaYKm7JEzxmyiGlMyR95R2W",
            "1; CY4PR03MB2694;\n\t6:QJG+Gu5jKwLtl+6dzFJb9q28CyZG/EqNK27Uaa5LADwpT0fLId0dlErSjbG7fsxWGAQ3cP2j+cpCWE79Tcsbfv4G3+aJrUenRGRqvymZssiHrosKWkPGwMkJp+c/w/SHx2soKgp0ZmxgKWVDqNwpfxnqDmkmMbtTW5jwcvn6li//zibX4/HImeKIpR9lHrTAKh+L8jwKXeq/c81+bKRbHXVxmcKSLyMauJB+XwH6lgwSb1kbKI91xF1pcszjIDsDwK5cI65M0kiaqBq+5JTahrmQDaGg7Jo0DFJ5w+LXzS7qlgiV721x314KtUJsw09kdf3C0XRHh/kJbvAOw9tTWA==;\n\t5:1+Ic5qHfjMLxteoFTwoyOeWVSuTJjN8wQaCiv5cInyVqKg0uI/S2gxn5P4xa64vq8AzK7LAGRpdubAH8k+jiRmQ3VB7hB/dlYmX8AEI/h834U0y9eBqbR+XuDLyXytOxIfOCzuxlcJDYKDbUK7TKWRIGUnFs/5FR8qy3AS837XM=;\n\t24:wTN0wiM05Q+XsGSfpMJBgUIA+s60/51x2sHGZsLt6JaqzN1pryRqWQxTEBQ7q4A0EjSHwgCQvoXdlPA3GRGTjoL/qS9x0ynLTQKkVaBPwEU=;\n\t7:pllb7Ax1fTo291ifDkEXaVF8QGpWgUjGpp86GBXKAxI0nutHrIWrzJI18QvQsVA/dbcU5xZVbtRDMnzTkouEekA0/TWeT+nqy2IT23JkZzUm6aqAf5VsBSesBEFXJG8oDgOIN5HVc0pwy11GoxUOfyk2GsSC6eQKDOmDsLPSWbkea2wlnr4pXJxW/9O6P+EjNRBYYv/Jnt3r8O3xga0YxZN7PVl9paAoeZ7daOoCBxI="
        ],
        "MIME-Version": "1.0",
        "Content-Type": "text/plain",
        "X-MS-PublicTrafficType": "Email",
        "X-MS-Office365-Filtering-Correlation-Id": "293ea56a-7c03-464f-fcfa-08d4fcf12d7e",
        "X-Microsoft-Antispam": "UriScan:; BCL:0; PCL:0;\n\tRULEID:(300000500095)(300135000095)(300000501095)(300135300095)(22001)(300000502095)(300135100095)(300000503095)(300135400095)(2017052603199)(201703131430075)(201703131517081)(300000504095)(300135200095)(300000505095)(300135600095)(300000506095)(300135500095);\n\tSRVR:CY4PR03MB2694; ",
        "X-MS-TrafficTypeDiagnostic": "CY4PR03MB2694:",
        "X-Exchange-Antispam-Report-Test": "UriScan:(185117386973197)(275809806118684); ",
        "X-Microsoft-Antispam-PRVS": "<CY4PR03MB2694DBFD8FAF5C4098A29D33896D0@CY4PR03MB2694.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)(3002001)(100000703101)(100105400095)(10201501046)(93006095)(93001095)(6055026)(6096035)(20161123563025)(201703131430075)(201703131433075)(201703131448075)(201703161259150)(201703151042153)(20161123556025)(20161123561025)(20161123559100)(20161123565025)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095);\n\tSRVR:CY4PR03MB2694; BCL:0; PCL:0;\n\tRULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(400006)(100000804101)(100110200095)(100000805101)(100110500095);\n\tSRVR:CY4PR03MB2694; ",
        "X-Forefront-PRVS": "0432A04947",
        "SpamDiagnosticOutput": "1:99",
        "SpamDiagnosticMetadata": "NSPM",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "16 Sep 2017 10:53:34.5137\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]; \n\tHelo=[tx30smr01.am.freescale.net]",
        "X-MS-Exchange-CrossTenant-FromEntityHeader": "HybridOnPrem",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "CY4PR03MB2694",
        "Subject": "[dpdk-dev] [PATCH v3 14/27] net/dpaa2: add support for link status\n\tevent",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<http://dpdk.org/ml/options/dev>,\n\t<mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://dpdk.org/ml/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<http://dpdk.org/ml/listinfo/dev>,\n\t<mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "Signed-off-by: Hemant Agrawal <hemant.agrawal@nxp.com>\n---\n doc/guides/nics/features/dpaa2.ini  |   1 +\n drivers/net/dpaa2/dpaa2_ethdev.c    | 123 +++++++++++++++++++\n drivers/net/dpaa2/mc/dpni.c         | 233 ++++++++++++++++++++++++++++++++++++\n drivers/net/dpaa2/mc/fsl_dpni.h     |  49 ++++++++\n drivers/net/dpaa2/mc/fsl_dpni_cmd.h |  50 ++++++++\n 5 files changed, 456 insertions(+)",
    "diff": "diff --git a/doc/guides/nics/features/dpaa2.ini b/doc/guides/nics/features/dpaa2.ini\nindex 146e087..ba4321c 100644\n--- a/doc/guides/nics/features/dpaa2.ini\n+++ b/doc/guides/nics/features/dpaa2.ini\n@@ -6,6 +6,7 @@\n [Features]\n Speed capabilities   = P\n Link status          = Y\n+Link status event    = Y\n Queue start/stop     = Y\n Jumbo frame          = Y\n MTU update           = Y\ndiff --git a/drivers/net/dpaa2/dpaa2_ethdev.c b/drivers/net/dpaa2/dpaa2_ethdev.c\nindex d7950a5..72c9e67 100644\n--- a/drivers/net/dpaa2/dpaa2_ethdev.c\n+++ b/drivers/net/dpaa2/dpaa2_ethdev.c\n@@ -54,6 +54,8 @@\n \n static struct rte_dpaa2_driver rte_dpaa2_pmd;\n static int dpaa2_dev_uninit(struct rte_eth_dev *eth_dev);\n+static int dpaa2_dev_link_update(struct rte_eth_dev *dev,\n+\t\t\t\t int wait_to_complete);\n static int dpaa2_dev_set_link_up(struct rte_eth_dev *dev);\n static int dpaa2_dev_set_link_down(struct rte_eth_dev *dev);\n static int dpaa2_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu);\n@@ -344,6 +346,10 @@ dpaa2_eth_dev_configure(struct rte_eth_dev *dev)\n \t\t\treturn ret;\n \t\t}\n \t}\n+\n+\t/* update the current status */\n+\tdpaa2_dev_link_update(dev, 0);\n+\n \treturn 0;\n }\n \n@@ -556,9 +562,87 @@ dpaa2_supported_ptypes_get(struct rte_eth_dev *dev)\n \treturn NULL;\n }\n \n+/**\n+ * Dpaa2 link Interrupt handler\n+ *\n+ * @param param\n+ *  The address of parameter (struct rte_eth_dev *) regsitered before.\n+ *\n+ * @return\n+ *  void\n+ */\n+static void\n+dpaa2_interrupt_handler(void *param)\n+{\n+\tstruct rte_eth_dev *dev = param;\n+\tstruct dpaa2_dev_priv *priv = dev->data->dev_private;\n+\tstruct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw;\n+\tint ret;\n+\tint irq_index = DPNI_IRQ_INDEX;\n+\tunsigned int status = 0, clear = 0;\n+\n+\tPMD_INIT_FUNC_TRACE();\n+\n+\tif (dpni == NULL) {\n+\t\tRTE_LOG(ERR, PMD, \"dpni is NULL\");\n+\t\treturn;\n+\t}\n+\n+\tret = dpni_get_irq_status(dpni, CMD_PRI_LOW, priv->token,\n+\t\t\t\t  irq_index, &status);\n+\tif (unlikely(ret)) {\n+\t\tRTE_LOG(ERR, PMD, \"Can't get irq status (err %d)\", ret);\n+\t\tclear = 0xffffffff;\n+\t\tgoto out;\n+\t}\n+\n+\tif (status & DPNI_IRQ_EVENT_LINK_CHANGED) {\n+\t\tclear = DPNI_IRQ_EVENT_LINK_CHANGED;\n+\t\tdpaa2_dev_link_update(dev, 0);\n+\t\t/* calling all the apps registered for link status event */\n+\t\t_rte_eth_dev_callback_process(dev, RTE_ETH_EVENT_INTR_LSC,\n+\t\t\t\t\t      NULL, NULL);\n+\t}\n+out:\n+\tret = dpni_clear_irq_status(dpni, CMD_PRI_LOW, priv->token,\n+\t\t\t\t    irq_index, clear);\n+\tif (unlikely(ret))\n+\t\tRTE_LOG(ERR, PMD, \"Can't clear irq status (err %d)\", ret);\n+}\n+\n+static int\n+dpaa2_eth_setup_irqs(struct rte_eth_dev *dev, int enable)\n+{\n+\tint err = 0;\n+\tstruct dpaa2_dev_priv *priv = dev->data->dev_private;\n+\tstruct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw;\n+\tint irq_index = DPNI_IRQ_INDEX;\n+\tunsigned int mask = DPNI_IRQ_EVENT_LINK_CHANGED;\n+\n+\tPMD_INIT_FUNC_TRACE();\n+\n+\terr = dpni_set_irq_mask(dpni, CMD_PRI_LOW, priv->token,\n+\t\t\t\tirq_index, mask);\n+\tif (err < 0) {\n+\t\tPMD_INIT_LOG(ERR, \"Error: dpni_set_irq_mask():%d (%s)\", err,\n+\t\t\t     strerror(-err));\n+\t\treturn err;\n+\t}\n+\n+\terr = dpni_set_irq_enable(dpni, CMD_PRI_LOW, priv->token,\n+\t\t\t\t  irq_index, enable);\n+\tif (err < 0)\n+\t\tPMD_INIT_LOG(ERR, \"Error: dpni_set_irq_enable():%d (%s)\", err,\n+\t\t\t     strerror(-err));\n+\n+\treturn err;\n+}\n+\n static int\n dpaa2_dev_start(struct rte_eth_dev *dev)\n {\n+\tstruct rte_device *rdev = dev->device;\n+\tstruct rte_dpaa2_device *dpaa2_dev;\n \tstruct rte_eth_dev_data *data = dev->data;\n \tstruct dpaa2_dev_priv *priv = data->dev_private;\n \tstruct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw;\n@@ -568,6 +652,10 @@ dpaa2_dev_start(struct rte_eth_dev *dev)\n \tstruct dpni_queue_id qid;\n \tstruct dpaa2_queue *dpaa2_q;\n \tint ret, i;\n+\tstruct rte_intr_handle *intr_handle;\n+\n+\tdpaa2_dev = container_of(rdev, struct rte_dpaa2_device, device);\n+\tintr_handle = &dpaa2_dev->intr_handle;\n \n \tPMD_INIT_FUNC_TRACE();\n \n@@ -647,6 +735,24 @@ dpaa2_dev_start(struct rte_eth_dev *dev)\n \tif (priv->max_vlan_filters)\n \t\tdpaa2_vlan_offload_set(dev, ETH_VLAN_FILTER_MASK);\n \n+\t/* if the interrupts were configured on this devices*/\n+\tif (intr_handle && (intr_handle->fd) &&\n+\t    (dev->data->dev_conf.intr_conf.lsc != 0)) {\n+\t\t/* Registering LSC interrupt handler */\n+\t\trte_intr_callback_register(intr_handle,\n+\t\t\t\t\t   dpaa2_interrupt_handler,\n+\t\t\t\t\t   (void *)dev);\n+\n+\t\t/* enable vfio intr/eventfd mapping\n+\t\t * Interrupt index 0 is required, so we can not use\n+\t\t * rte_intr_enable.\n+\t\t */\n+\t\trte_dpaa2_intr_enable(intr_handle, DPNI_IRQ_INDEX);\n+\n+\t\t/* enable dpni_irqs */\n+\t\tdpaa2_eth_setup_irqs(dev, 1);\n+\t}\n+\n \treturn 0;\n }\n \n@@ -661,9 +767,25 @@ dpaa2_dev_stop(struct rte_eth_dev *dev)\n \tstruct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw;\n \tint ret;\n \tstruct rte_eth_link link;\n+\tstruct rte_intr_handle *intr_handle = dev->intr_handle;\n \n \tPMD_INIT_FUNC_TRACE();\n \n+\t/* reset interrupt callback  */\n+\tif (intr_handle && (intr_handle->fd) &&\n+\t    (dev->data->dev_conf.intr_conf.lsc != 0)) {\n+\t\t/*disable dpni irqs */\n+\t\tdpaa2_eth_setup_irqs(dev, 0);\n+\n+\t\t/* disable vfio intr before callback unregister */\n+\t\trte_dpaa2_intr_disable(intr_handle, DPNI_IRQ_INDEX);\n+\n+\t\t/* Unregistering LSC interrupt handler */\n+\t\trte_intr_callback_unregister(intr_handle,\n+\t\t\t\t\t     dpaa2_interrupt_handler,\n+\t\t\t\t\t     (void *)dev);\n+\t}\n+\n \tdpaa2_dev_set_link_down(dev);\n \n \tret = dpni_disable(dpni, CMD_PRI_LOW, priv->token);\n@@ -1458,6 +1580,7 @@ dpaa2_dev_init(struct rte_eth_dev *eth_dev)\n \t}\n \n \teth_dev->dev_ops = &dpaa2_ethdev_ops;\n+\teth_dev->data->dev_flags |= RTE_ETH_DEV_INTR_LSC;\n \n \teth_dev->rx_pkt_burst = dpaa2_dev_prefetch_rx;\n \teth_dev->tx_pkt_burst = dpaa2_dev_tx;\ndiff --git a/drivers/net/dpaa2/mc/dpni.c b/drivers/net/dpaa2/mc/dpni.c\nindex f95e669..6f671fe 100644\n--- a/drivers/net/dpaa2/mc/dpni.c\n+++ b/drivers/net/dpaa2/mc/dpni.c\n@@ -351,6 +351,239 @@ int dpni_reset(struct fsl_mc_io *mc_io,\n }\n \n /**\n+ * dpni_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 DPNI 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 dpni_set_irq_enable(struct fsl_mc_io *mc_io,\n+\t\t\tuint32_t cmd_flags,\n+\t\t\tuint16_t token,\n+\t\t\tuint8_t irq_index,\n+\t\t\tuint8_t en)\n+{\n+\tstruct mc_command cmd = { 0 };\n+\tstruct dpni_cmd_set_irq_enable *cmd_params;\n+\n+\t/* prepare command */\n+\tcmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_IRQ_ENABLE,\n+\t\t\t\t\t  cmd_flags,\n+\t\t\t\t\t  token);\n+\tcmd_params = (struct dpni_cmd_set_irq_enable *)cmd.params;\n+\tdpni_set_field(cmd_params->enable, 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+ * dpni_get_irq_enable() - Get 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 DPNI object\n+ * @irq_index:\tThe interrupt index to configure\n+ * @en:\t\tReturned interrupt state - enable = 1, disable = 0\n+ *\n+ * Return:\t'0' on Success; Error code otherwise.\n+ */\n+int dpni_get_irq_enable(struct fsl_mc_io *mc_io,\n+\t\t\tuint32_t cmd_flags,\n+\t\t\tuint16_t token,\n+\t\t\tuint8_t irq_index,\n+\t\t\tuint8_t *en)\n+{\n+\tstruct mc_command cmd = { 0 };\n+\tstruct dpni_cmd_get_irq_enable *cmd_params;\n+\tstruct dpni_rsp_get_irq_enable *rsp_params;\n+\n+\tint err;\n+\n+\t/* prepare command */\n+\tcmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_IRQ_ENABLE,\n+\t\t\t\t\t  cmd_flags,\n+\t\t\t\t\t  token);\n+\tcmd_params = (struct dpni_cmd_get_irq_enable *)cmd.params;\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 dpni_rsp_get_irq_enable *)cmd.params;\n+\t*en = dpni_get_field(rsp_params->enabled, ENABLE);\n+\n+\treturn 0;\n+}\n+\n+/**\n+ * dpni_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 DPNI 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 dpni_set_irq_mask(struct fsl_mc_io *mc_io,\n+\t\t      uint32_t cmd_flags,\n+\t\t      uint16_t token,\n+\t\t      uint8_t irq_index,\n+\t\t      uint32_t mask)\n+{\n+\tstruct mc_command cmd = { 0 };\n+\tstruct dpni_cmd_set_irq_mask *cmd_params;\n+\n+\t/* prepare command */\n+\tcmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_IRQ_MASK,\n+\t\t\t\t\t  cmd_flags,\n+\t\t\t\t\t  token);\n+\tcmd_params = (struct dpni_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+ * dpni_get_irq_mask() - Get 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 DPNI object\n+ * @irq_index:\tThe interrupt index to configure\n+ * @mask:\tReturned event mask to trigger interrupt\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 dpni_get_irq_mask(struct fsl_mc_io *mc_io,\n+\t\t      uint32_t cmd_flags,\n+\t\t      uint16_t token,\n+\t\t      uint8_t irq_index,\n+\t\t      uint32_t *mask)\n+{\n+\tstruct mc_command cmd = { 0 };\n+\tstruct dpni_cmd_get_irq_mask *cmd_params;\n+\tstruct dpni_rsp_get_irq_mask *rsp_params;\n+\tint err;\n+\n+\t/* prepare command */\n+\tcmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_IRQ_MASK,\n+\t\t\t\t\t  cmd_flags,\n+\t\t\t\t\t  token);\n+\tcmd_params = (struct dpni_cmd_get_irq_mask *)cmd.params;\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 dpni_rsp_get_irq_mask *)cmd.params;\n+\t*mask = le32_to_cpu(rsp_params->mask);\n+\n+\treturn 0;\n+}\n+\n+/**\n+ * dpni_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 DPNI 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 dpni_get_irq_status(struct fsl_mc_io *mc_io,\n+\t\t\tuint32_t cmd_flags,\n+\t\t\tuint16_t token,\n+\t\t\tuint8_t irq_index,\n+\t\t\tuint32_t *status)\n+{\n+\tstruct mc_command cmd = { 0 };\n+\tstruct dpni_cmd_get_irq_status *cmd_params;\n+\tstruct dpni_rsp_get_irq_status *rsp_params;\n+\tint err;\n+\n+\t/* prepare command */\n+\tcmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_IRQ_STATUS,\n+\t\t\t\t\t  cmd_flags,\n+\t\t\t\t\t  token);\n+\tcmd_params = (struct dpni_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 dpni_rsp_get_irq_status *)cmd.params;\n+\t*status = le32_to_cpu(rsp_params->status);\n+\n+\treturn 0;\n+}\n+\n+/**\n+ * dpni_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 DPNI 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 dpni_clear_irq_status(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  uint8_t irq_index,\n+\t\t\t  uint32_t status)\n+{\n+\tstruct mc_command cmd = { 0 };\n+\tstruct dpni_cmd_clear_irq_status *cmd_params;\n+\n+\t/* prepare command */\n+\tcmd.header = mc_encode_cmd_header(DPNI_CMDID_CLEAR_IRQ_STATUS,\n+\t\t\t\t\t  cmd_flags,\n+\t\t\t\t\t  token);\n+\tcmd_params = (struct dpni_cmd_clear_irq_status *)cmd.params;\n+\tcmd_params->irq_index = irq_index;\n+\tcmd_params->status = cpu_to_le32(status);\n+\n+\t/* send command to mc*/\n+\treturn mc_send_command(mc_io, &cmd);\n+}\n+\n+/**\n  * dpni_get_attributes() - Retrieve DPNI attributes.\n  * @mc_io:\tPointer to MC portal's I/O object\n  * @cmd_flags:\tCommand flags; one or more of 'MC_CMD_FLAG_'\ndiff --git a/drivers/net/dpaa2/mc/fsl_dpni.h b/drivers/net/dpaa2/mc/fsl_dpni.h\nindex 092d3b3..5227ea1 100644\n--- a/drivers/net/dpaa2/mc/fsl_dpni.h\n+++ b/drivers/net/dpaa2/mc/fsl_dpni.h\n@@ -247,6 +247,55 @@ int dpni_reset(struct fsl_mc_io *mc_io,\n \t       uint16_t token);\n \n /**\n+ * DPNI IRQ Index and Events\n+ */\n+\n+/**\n+ * IRQ index\n+ */\n+#define DPNI_IRQ_INDEX\t\t\t\t0\n+/**\n+ * IRQ event - indicates a change in link state\n+ */\n+#define DPNI_IRQ_EVENT_LINK_CHANGED\t\t0x00000001\n+\n+int dpni_set_irq_enable(struct fsl_mc_io *mc_io,\n+\t\t\tuint32_t cmd_flags,\n+\t\t\tuint16_t token,\n+\t\t\tuint8_t irq_index,\n+\t\t\tuint8_t en);\n+\n+int dpni_get_irq_enable(struct fsl_mc_io *mc_io,\n+\t\t\tuint32_t cmd_flags,\n+\t\t\tuint16_t token,\n+\t\t\tuint8_t irq_index,\n+\t\t\tuint8_t *en);\n+\n+int dpni_set_irq_mask(struct fsl_mc_io *mc_io,\n+\t\t      uint32_t cmd_flags,\n+\t\t      uint16_t token,\n+\t\t      uint8_t irq_index,\n+\t\t      uint32_t mask);\n+\n+int dpni_get_irq_mask(struct fsl_mc_io *mc_io,\n+\t\t      uint32_t cmd_flags,\n+\t\t      uint16_t token,\n+\t\t      uint8_t irq_index,\n+\t\t      uint32_t *mask);\n+\n+int dpni_get_irq_status(struct fsl_mc_io *mc_io,\n+\t\t\tuint32_t cmd_flags,\n+\t\t\tuint16_t token,\n+\t\t\tuint8_t irq_index,\n+\t\t\tuint32_t *status);\n+\n+int dpni_clear_irq_status(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  uint8_t irq_index,\n+\t\t\t  uint32_t status);\n+\n+/**\n  * struct dpni_attr - Structure representing DPNI attributes\n  * @options: Any combination of the following options:\n  *\t\tDPNI_OPT_TX_FRM_RELEASE\ndiff --git a/drivers/net/dpaa2/mc/fsl_dpni_cmd.h b/drivers/net/dpaa2/mc/fsl_dpni_cmd.h\nindex 81226aa..1a48332 100644\n--- a/drivers/net/dpaa2/mc/fsl_dpni_cmd.h\n+++ b/drivers/net/dpaa2/mc/fsl_dpni_cmd.h\n@@ -64,6 +64,13 @@\n #define DPNI_CMDID_RESET\t\t\tDPNI_CMD(0x005)\n #define DPNI_CMDID_IS_ENABLED\t\t\tDPNI_CMD(0x006)\n \n+#define DPNI_CMDID_SET_IRQ_ENABLE\t\tDPNI_CMD(0x012)\n+#define DPNI_CMDID_GET_IRQ_ENABLE\t\tDPNI_CMD(0x013)\n+#define DPNI_CMDID_SET_IRQ_MASK\t\t\tDPNI_CMD(0x014)\n+#define DPNI_CMDID_GET_IRQ_MASK\t\t\tDPNI_CMD(0x015)\n+#define DPNI_CMDID_GET_IRQ_STATUS\t\tDPNI_CMD(0x016)\n+#define DPNI_CMDID_CLEAR_IRQ_STATUS\t\tDPNI_CMD(0x017)\n+\n #define DPNI_CMDID_SET_POOLS\t\t\tDPNI_CMD_V2(0x200)\n #define DPNI_CMDID_SET_ERRORS_BEHAVIOR\t\tDPNI_CMD(0x20B)\n \n@@ -169,6 +176,49 @@ struct dpni_rsp_is_enabled {\n \tuint8_t enabled;\n };\n \n+struct dpni_cmd_set_irq_enable {\n+\tuint8_t enable;\n+\tuint8_t pad[3];\n+\tuint8_t irq_index;\n+};\n+\n+struct dpni_cmd_get_irq_enable {\n+\tuint32_t pad;\n+\tuint8_t irq_index;\n+};\n+\n+struct dpni_rsp_get_irq_enable {\n+\tuint8_t enabled;\n+};\n+\n+struct dpni_cmd_set_irq_mask {\n+\tuint32_t mask;\n+\tuint8_t irq_index;\n+};\n+\n+struct dpni_cmd_get_irq_mask {\n+\tuint32_t pad;\n+\tuint8_t irq_index;\n+};\n+\n+struct dpni_rsp_get_irq_mask {\n+\tuint32_t mask;\n+};\n+\n+struct dpni_cmd_get_irq_status {\n+\tuint32_t status;\n+\tuint8_t irq_index;\n+};\n+\n+struct dpni_rsp_get_irq_status {\n+\tuint32_t status;\n+};\n+\n+struct dpni_cmd_clear_irq_status {\n+\tuint32_t status;\n+\tuint8_t irq_index;\n+};\n+\n struct dpni_rsp_get_attr {\n \t/* response word 0 */\n \tuint32_t options;\n",
    "prefixes": [
        "dpdk-dev",
        "v3",
        "14/27"
    ]
}