get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 116092,
    "url": "http://patches.dpdk.org/api/patches/116092/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/1662626702-17254-10-git-send-email-chaoyong.he@corigine.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": "<1662626702-17254-10-git-send-email-chaoyong.he@corigine.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1662626702-17254-10-git-send-email-chaoyong.he@corigine.com",
    "date": "2022-09-08T08:44:59",
    "name": "[v8,09/12] net/nfp: add flower ctrl VNIC rxtx logic",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "a3cbb5cf387a0fee15554cf581fab4014d24af08",
    "submitter": {
        "id": 2554,
        "url": "http://patches.dpdk.org/api/people/2554/?format=api",
        "name": "Chaoyong He",
        "email": "chaoyong.he@corigine.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/1662626702-17254-10-git-send-email-chaoyong.he@corigine.com/mbox/",
    "series": [
        {
            "id": 24607,
            "url": "http://patches.dpdk.org/api/series/24607/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=24607",
            "date": "2022-09-08T08:44:50",
            "name": "preparation for the rte_flow offload of nfp PMD",
            "version": 8,
            "mbox": "http://patches.dpdk.org/series/24607/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/116092/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/116092/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@inbox.dpdk.org",
        "Delivered-To": "patchwork@inbox.dpdk.org",
        "Received": [
            "from mails.dpdk.org (mails.dpdk.org [217.70.189.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id 9943FA0548;\n\tThu,  8 Sep 2022 10:46:35 +0200 (CEST)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 4925A42B8E;\n\tThu,  8 Sep 2022 10:45:49 +0200 (CEST)",
            "from NAM12-BN8-obe.outbound.protection.outlook.com\n (mail-bn8nam12on2096.outbound.protection.outlook.com [40.107.237.96])\n by mails.dpdk.org (Postfix) with ESMTP id F1A2F42B80\n for <dev@dpdk.org>; Thu,  8 Sep 2022 10:45:47 +0200 (CEST)",
            "from SJ0PR13MB5545.namprd13.prod.outlook.com (2603:10b6:a03:424::5)\n by MW4PR13MB5940.namprd13.prod.outlook.com (2603:10b6:303:1b8::10)\n with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5588.3; Thu, 8 Sep\n 2022 08:45:46 +0000",
            "from SJ0PR13MB5545.namprd13.prod.outlook.com\n ([fe80::402d:6abc:83a8:2431]) by SJ0PR13MB5545.namprd13.prod.outlook.com\n ([fe80::402d:6abc:83a8:2431%6]) with mapi id 15.20.5612.009; Thu, 8 Sep 2022\n 08:45:46 +0000"
        ],
        "ARC-Seal": "i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none;\n b=gWM8ZH4dFXOjT1x0AJeSXEdS5MTia8x+rX9pVZC8IVOgxguFamQAD/7Nz074mqPnc4FybAMmBuq3sERPxQDLLBxFvKq4y3hcWosnWGpKn518RWQTPEshpR07PoGZ2xy1c1EGC7ikO2HlfALENGrxebCicapSoge3cIRBrD1eTMeWk13uJ3nx4plaAsT9z9YKinGUtZ+2USWvz2dvTTVdR3Pg5IS0QBNz80C5C4WbkHGLZm83aZmRoLq5KfGPAVYvKMTtEboJ6J7PuX4znXJKBfZ6X8IXZ8wefO2CUcQCuvL3FoO4WZezSyWdIv2HYwjeDohWToJiiOcA81Olzyl0bw==",
        "ARC-Message-Signature": "i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com;\n s=arcselector9901;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1;\n bh=ZmUiktQG+z6EwZPc/cB9NIin+u/IN55z4Gnc2yCFIV8=;\n b=K6fY2j2IMfHKHxWdiq/wx5JBrokG7ZD2pLErkyEQznM+rZCk/9pGBT0Svce14ZkfxrAY7lpyJL9vow6ctEeH+x+UEB7XZoHt9BuD+UxK1hGbgobZXe24MMRxymYqXi3ScdXvQF5v3uftakG1trITjYPIUjZgEdaq6jYzaplv2nudTVVQatBWj1UlUUXIkmz0l7zHIk7jFIN9St9+FXYOCqL9VC3cswDuI+Bocn3VUoB87jJ8KqbcMiM2omL3j4p0BLz9Qdw7CcQoAsSoARDMSaFZFH6SFDxj3hm50zbHGXWxN5mD4ICVu1facUJZ8oelLz+mZwPNwSTIwad+h0dLwQ==",
        "ARC-Authentication-Results": "i=1; mx.microsoft.com 1; spf=pass\n smtp.mailfrom=corigine.com; dmarc=pass action=none header.from=corigine.com;\n dkim=pass header.d=corigine.com; arc=none",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=corigine.onmicrosoft.com; s=selector2-corigine-onmicrosoft-com;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n bh=ZmUiktQG+z6EwZPc/cB9NIin+u/IN55z4Gnc2yCFIV8=;\n b=k4Ww5+Ir1H7GYT7xKWi2zRnh84fqp8SAltDVOSYeVdt0IwbMIQnycGHP5RMDaMNVsMoHaF3K0nuuXTlMWah98iuk01PluPsAxtyD2yHnAPUUZBqPOVY7U51vSTRJ1TQP9IGKNVJY4Q6UeWvJZz5jUkIZs49H9yrUdea3yny+ua8=",
        "Authentication-Results": "dkim=none (message not signed)\n header.d=none;dmarc=none action=none header.from=corigine.com;",
        "From": "Chaoyong He <chaoyong.he@corigine.com>",
        "To": "dev@dpdk.org",
        "Cc": "oss-drivers@corigine.com, niklas.soderlund@corigine.com,\n Chaoyong He <chaoyong.he@corigine.com>,\n Heinrich Kuhn <heinrich.kuhn@corigine.com>",
        "Subject": "[PATCH v8 09/12] net/nfp: add flower ctrl VNIC rxtx logic",
        "Date": "Thu,  8 Sep 2022 16:44:59 +0800",
        "Message-Id": "<1662626702-17254-10-git-send-email-chaoyong.he@corigine.com>",
        "X-Mailer": "git-send-email 1.8.3.1",
        "In-Reply-To": "<1662626702-17254-1-git-send-email-chaoyong.he@corigine.com>",
        "References": "<1662626702-17254-1-git-send-email-chaoyong.he@corigine.com>",
        "Content-Type": "text/plain; charset=UTF-8",
        "Content-Transfer-Encoding": "8bit",
        "X-ClientProxiedBy": "SI2PR01CA0023.apcprd01.prod.exchangelabs.com\n (2603:1096:4:192::17) To SJ0PR13MB5545.namprd13.prod.outlook.com\n (2603:10b6:a03:424::5)",
        "MIME-Version": "1.0",
        "X-MS-PublicTrafficType": "Email",
        "X-MS-TrafficTypeDiagnostic": "SJ0PR13MB5545:EE_|MW4PR13MB5940:EE_",
        "X-MS-Office365-Filtering-Correlation-Id": "2025df73-e0e0-4a25-365f-08da91768526",
        "X-MS-Exchange-SenderADCheck": "1",
        "X-MS-Exchange-AntiSpam-Relay": "0",
        "X-Microsoft-Antispam": "BCL:0;",
        "X-Microsoft-Antispam-Message-Info": "\n 4smCrHpHkxT+uJdaDbqVApM/WbAES2o6m0iDbQLyqMsXEm1KRmS3F7Qb3BeyXPn2nXggPY4paFQ4HAKtZHimEIwx8Y6EVMTpm6O8GMKtqKpsywn8fqIo6FFkIPV6gR2iwA8mR1D7UbJhG4dkztA++9AAdNG9WRSB1KbV2CKrc73rtYZAbdl4NcX6IC7OvxLLVC3xAUV0LxMvH5hMz1YJRykl1E3EHXfymZh/RNyQp8JeJhYMgeMcXpVK8TE68QPuc6SDNnFU6FXYaGhp13zMORmb9hl5FakUJmMDJR46b76aFAEHaItkF/Uc4+j0MT0+yNYe2mOzraZQQ8/yyOkchz1hU5PCpHXw2b4PVp/tVSSkZ4jaRkntZ/N9l+auA9y1KR50VsfDzeZemF+hcM+0MrfoyeRr0LyjMuV+G2Azd7etLd0qhRz9cpJPJxFDcIjTiQ/6etcm/JXst7IL6Eifypu4yxf6Ix6/m4qeED1pIsvliIHXun88UCc97BydujBMNU6LrJhkdwrLAL6GNwB02Oj0fu6e/LgT8wxDsM6pK1DQOEIPA+RCn9BXl7d5EQRqCnSZ7tXBfeHajAup+O/omxhYqiMJaSlKhv/IipG0xgN7ryP9HpADato4rnH7ysLt+CfUOBTLPedSzDS5HVxIhFH8SakE0A3VCQxMWCU1Suvtjev94rC0rkLaCf+NEjPtnV91ckDF7EgIq8SrlRctSNXDzZwI2AgylQ4UK/NV75FUngKX9u4dfMgzuLtIy7oLC1nl6nAiBNKQlofwXUCu0Q==",
        "X-Forefront-Antispam-Report": "CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:;\n IPV:NLI; SFV:NSPM; H:SJ0PR13MB5545.namprd13.prod.outlook.com; PTR:; CAT:NONE;\n SFS:(13230016)(4636009)(396003)(366004)(39840400004)(346002)(376002)(136003)(107886003)(44832011)(2616005)(30864003)(41300700001)(6916009)(38350700002)(83380400001)(26005)(6512007)(186003)(36756003)(38100700002)(4326008)(54906003)(2906002)(6506007)(316002)(66946007)(478600001)(86362001)(5660300002)(66476007)(52116002)(6486002)(6666004)(8936002)(8676002)(66556008);\n DIR:OUT; SFP:1102;",
        "X-MS-Exchange-AntiSpam-MessageData-ChunkCount": "1",
        "X-MS-Exchange-AntiSpam-MessageData-0": "=?utf-8?q?HKaN+/IDWIaXCANCnYUB8uQrkzNJ?=\n\t=?utf-8?q?okFfrRaQRsgmbrf6FAx0H9n0tKYKR/1YbvrPJi42mHSMXtqVBNzsF4ALkgzB3LBj6?=\n\t=?utf-8?q?ZqKc/hwx5RvQa1QDtEBUn4got/UckX2J4vK4/kPySWfp2bCTmAGMUY6hhTkdMyMur?=\n\t=?utf-8?q?M/i3xhejqjWHIN3At4YNsGLeUN+mZ1dNO8B4jFMFGuzTxVPN7gbb05fp2tpD6az8e?=\n\t=?utf-8?q?oz0zTrlZPN4ryB+jOmyy+S4PZq6IsW8NjXj0ACyWYMlMOT3oXYOPfbVcdScWonhgv?=\n\t=?utf-8?q?Oj+VWZsumBfvwJJWi/slHagY+CATKr4uF8A7+Lw+1KhziWtkI/BpHJbnwprowiexp?=\n\t=?utf-8?q?H7RbyC3iq0qqn0i6VM5f/ugUTDxCEUT7TFMy9wNV8Fq6HukKT5/7hLdbLEsFQhduA?=\n\t=?utf-8?q?C5U9RL+lcoG/D235z5bmO0NNKejppaxup78bEv0p2DzDrSurpvxsdFGFh7JDkijG8?=\n\t=?utf-8?q?VwfQM/leJE2RMfDAlR0RTzbqstvisuofWcqUBTovBNM/t/dn9GYzElAqL9rR7Ur7B?=\n\t=?utf-8?q?N+acKVHiDcKpecWvUe5rdyPA85a0/ihWomSn3z2KOTfQsQVQHJVRvKM+D9VdIDR0s?=\n\t=?utf-8?q?iyJoL8xJoAbnpwIJI3RSHOIPptIMCpEpaPoQck7qVMzf46ENHP+PVMxLYzo7daDVo?=\n\t=?utf-8?q?fE+pe3VOnc0uY27IdnfIhDsMQ6dD5jbYkarmKjduu2vOYMZN7Fyfyai7hAI6WgSBV?=\n\t=?utf-8?q?d3g48L6HRvY2qvLdtTL8TVaPe+K1G3DKVWPp2BFHfOzyDpKZyRXZmMonTsqzM3UUM?=\n\t=?utf-8?q?nMfhl2DwyfOfrKShrkHknGhj+eY2X1fCOen7DK3jAsnV/QglkQcrh5ktE3TBBm29K?=\n\t=?utf-8?q?UImzZkjbs/jeIAJJx6+Kdo6JFTpHRhAlh/tSZGjGPqQxTA8+sOPHsXAtOvH9n1+hs?=\n\t=?utf-8?q?CYqxHWH7N64h2y6Jt+cNIQH4+zZUXwkmH4NRUc+Ada83zlO/twm/bFHCR9ooXGrny?=\n\t=?utf-8?q?HnDQHCL/zYHJOI53KJjkoHOKJCCmDsbYuaYJ7lGQwVcEnZNgdPa4ZQH0iTQ4EdeLY?=\n\t=?utf-8?q?OtysAHeIuiwJLKDN/tua4oirzQR0fINBVGCoTQuNEICiaIVjkTqVBCzmTuudv6HZO?=\n\t=?utf-8?q?1K3YtAZfkrqe17NSnBYm9qaLtXkPw843jbBW4aEWDY7btQmzaboHuB1/csegf2ft1?=\n\t=?utf-8?q?Zby6LMYFLKIOKBopcBumCKOPxxB2VVmBNoLnWa1qQxZ9nSOPZSa7NHGBzWviQYTZM?=\n\t=?utf-8?q?zic+EX7dA0y6Vb7ziQwoJntTEY/eViXzCzs4PzBmpN/hGQSogs/OndFwO619l4LXC?=\n\t=?utf-8?q?cZU142aE9gN3AHpQAHiV0ZALWyWu+ov8TneHJZ7vZdsfINTY76MVqvrzK0Iy22jtF?=\n\t=?utf-8?q?5/ycvrgp1rwcoZgcNdGvwvZl+FrAaYV9P6bDLYtZqxizOBDIK78faSroxEBfEeqbf?=\n\t=?utf-8?q?GUwTRA/FXWzwhry9tATvPij/rQW9g1QnoWDPpsrHBXKB7GzQEwGrBBlj3HQx57oJd?=\n\t=?utf-8?q?2RtIXBlWaZkX+2/lo2C/7DN11Xl7ptlwBLYqWMtPzUX1fS+F2gEsPOSMHJ1KixKbM?=\n\t=?utf-8?q?QVsJ1o/laM7Pi+7sWqMiHpvkSH8bCPVE5g=3D=3D?=",
        "X-OriginatorOrg": "corigine.com",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "MW4PR13MB5940",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org"
    },
    "content": "Adds a Rx and Tx function for the ctrl VNIC. The logic is mostly\nidentical to the normal Rx and Tx functionality of the NFP PMD.\n\nMake use of the ctrl VNIC service logic to service the ctrl VNIC Rx\npath.\n\nSigned-off-by: Chaoyong He <chaoyong.he@corigine.com>\nSigned-off-by: Heinrich Kuhn <heinrich.kuhn@corigine.com>\nReviewed-by: Niklas Söderlund <niklas.soderlund@corigine.com>\n---\n doc/guides/rel_notes/release_22_11.rst   |   1 +\n drivers/net/nfp/flower/nfp_flower.c      |   3 +\n drivers/net/nfp/flower/nfp_flower.h      |  14 ++\n drivers/net/nfp/flower/nfp_flower_ctrl.c | 250 +++++++++++++++++++++++++++++++\n drivers/net/nfp/flower/nfp_flower_ctrl.h |  13 ++\n drivers/net/nfp/meson.build              |   1 +\n 6 files changed, 282 insertions(+)\n create mode 100644 drivers/net/nfp/flower/nfp_flower_ctrl.c\n create mode 100644 drivers/net/nfp/flower/nfp_flower_ctrl.h",
    "diff": "diff --git a/doc/guides/rel_notes/release_22_11.rst b/doc/guides/rel_notes/release_22_11.rst\nindex bb170e3..0fe928a 100644\n--- a/doc/guides/rel_notes/release_22_11.rst\n+++ b/doc/guides/rel_notes/release_22_11.rst\n@@ -58,6 +58,7 @@ New Features\n    * **Updated Netronome nfp driver.**\n      Added the support of flower firmware.\n      Added the flower service infrastructure.\n+     Added the control message interactive channels between PMD and firmware.\n \n Removed Items\n -------------\ndiff --git a/drivers/net/nfp/flower/nfp_flower.c b/drivers/net/nfp/flower/nfp_flower.c\nindex 4d07416..b873eba 100644\n--- a/drivers/net/nfp/flower/nfp_flower.c\n+++ b/drivers/net/nfp/flower/nfp_flower.c\n@@ -20,6 +20,7 @@\n #include \"../nfpcore/nfp_nsp.h\"\n #include \"nfp_flower.h\"\n #include \"nfp_flower_ovs_compat.h\"\n+#include \"nfp_flower_ctrl.h\"\n \n #define MAX_PKT_BURST 32\n #define MEMPOOL_CACHE_SIZE 512\n@@ -708,6 +709,8 @@\n \t\tgoto ctrl_vnic_cleanup;\n \t}\n \n+\tnfp_flower_ctrl_vnic_poll(app_fw_flower);\n+\n \treturn 0;\n \n ctrl_vnic_cleanup:\ndiff --git a/drivers/net/nfp/flower/nfp_flower.h b/drivers/net/nfp/flower/nfp_flower.h\nindex e18703e..e96d3b2 100644\n--- a/drivers/net/nfp/flower/nfp_flower.h\n+++ b/drivers/net/nfp/flower/nfp_flower.h\n@@ -6,6 +6,14 @@\n #ifndef _NFP_FLOWER_H_\n #define _NFP_FLOWER_H_\n \n+/*\n+ * Flower fallback and ctrl path always adds and removes\n+ * 8 bytes of prepended data. Tx descriptors must point\n+ * to the correct packet data offset after metadata has\n+ * been added\n+ */\n+#define FLOWER_PKT_DATA_OFFSET 8\n+\n /* The flower application's private structure */\n struct nfp_app_fw_flower {\n \t/* Pointer to a mempool for the PF vNIC */\n@@ -22,6 +30,12 @@ struct nfp_app_fw_flower {\n \n \t/* the eth table as reported by firmware */\n \tstruct nfp_eth_table *nfp_eth_table;\n+\n+\t/* Ctrl vNIC Rx counter */\n+\tuint64_t ctrl_vnic_rx_count;\n+\n+\t/* Ctrl vNIC Tx counter */\n+\tuint64_t ctrl_vnic_tx_count;\n };\n \n int nfp_init_app_fw_flower(struct nfp_pf_dev *pf_dev);\ndiff --git a/drivers/net/nfp/flower/nfp_flower_ctrl.c b/drivers/net/nfp/flower/nfp_flower_ctrl.c\nnew file mode 100644\nindex 0000000..0c04f75\n--- /dev/null\n+++ b/drivers/net/nfp/flower/nfp_flower_ctrl.c\n@@ -0,0 +1,250 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright (c) 2022 Corigine, Inc.\n+ * All rights reserved.\n+ */\n+\n+#include <rte_common.h>\n+#include <ethdev_pci.h>\n+\n+#include \"../nfp_common.h\"\n+#include \"../nfp_logs.h\"\n+#include \"../nfp_ctrl.h\"\n+#include \"../nfp_rxtx.h\"\n+#include \"nfp_flower.h\"\n+#include \"nfp_flower_ctrl.h\"\n+\n+#define MAX_PKT_BURST 32\n+\n+static uint16_t\n+nfp_flower_ctrl_vnic_recv(void *rx_queue,\n+\t\tstruct rte_mbuf **rx_pkts,\n+\t\tuint16_t nb_pkts)\n+{\n+\tuint64_t dma_addr;\n+\tuint16_t avail = 0;\n+\tstruct rte_mbuf *mb;\n+\tuint16_t nb_hold = 0;\n+\tstruct nfp_net_hw *hw;\n+\tstruct nfp_net_rxq *rxq;\n+\tstruct rte_mbuf *new_mb;\n+\tstruct nfp_net_rx_buff *rxb;\n+\tstruct nfp_net_rx_desc *rxds;\n+\n+\trxq = rx_queue;\n+\tif (unlikely(rxq == NULL)) {\n+\t\t/*\n+\t\t * DPDK just checks the queue is lower than max queues\n+\t\t * enabled. But the queue needs to be configured\n+\t\t */\n+\t\tPMD_RX_LOG(ERR, \"RX Bad queue\");\n+\t\treturn 0;\n+\t}\n+\n+\thw = rxq->hw;\n+\twhile (avail < nb_pkts) {\n+\t\trxb = &rxq->rxbufs[rxq->rd_p];\n+\t\tif (unlikely(rxb == NULL)) {\n+\t\t\tPMD_RX_LOG(ERR, \"rxb does not exist!\");\n+\t\t\tbreak;\n+\t\t}\n+\n+\t\trxds = &rxq->rxds[rxq->rd_p];\n+\t\tif ((rxds->rxd.meta_len_dd & PCIE_DESC_RX_DD) == 0)\n+\t\t\tbreak;\n+\n+\t\t/*\n+\t\t * Memory barrier to ensure that we won't do other\n+\t\t * reads before the DD bit.\n+\t\t */\n+\t\trte_rmb();\n+\n+\t\t/*\n+\t\t * We got a packet. Let's alloc a new mbuf for refilling the\n+\t\t * free descriptor ring as soon as possible\n+\t\t */\n+\t\tnew_mb = rte_pktmbuf_alloc(rxq->mem_pool);\n+\t\tif (unlikely(new_mb == NULL)) {\n+\t\t\tPMD_RX_LOG(ERR,\n+\t\t\t\t\"RX mbuf alloc failed port_id=%u queue_id=%u\",\n+\t\t\t\trxq->port_id, (unsigned int)rxq->qidx);\n+\t\t\tnfp_net_mbuf_alloc_failed(rxq);\n+\t\t\tbreak;\n+\t\t}\n+\n+\t\tnb_hold++;\n+\n+\t\t/*\n+\t\t * Grab the mbuf and refill the descriptor with the\n+\t\t * previously allocated mbuf\n+\t\t */\n+\t\tmb = rxb->mbuf;\n+\t\trxb->mbuf = new_mb;\n+\n+\t\t/* Size of this segment */\n+\t\tmb->data_len = rxds->rxd.data_len - NFP_DESC_META_LEN(rxds);\n+\t\t/* Size of the whole packet. We just support 1 segment */\n+\t\tmb->pkt_len = mb->data_len;\n+\n+\t\tif (unlikely((mb->data_len + hw->rx_offset) > rxq->mbuf_size)) {\n+\t\t\t/*\n+\t\t\t * This should not happen and the user has the\n+\t\t\t * responsibility of avoiding it. But we have\n+\t\t\t * to give some info about the error\n+\t\t\t */\n+\t\t\tRTE_LOG_DP(ERR, PMD,\n+\t\t\t\t\"mbuf overflow likely due to the RX offset.\\n\"\n+\t\t\t\t\"\\t\\tYour mbuf size should have extra space for\"\n+\t\t\t\t\" RX offset=%u bytes.\\n\"\n+\t\t\t\t\"\\t\\tCurrently you just have %u bytes available\"\n+\t\t\t\t\" but the received packet is %u bytes long\",\n+\t\t\t\thw->rx_offset,\n+\t\t\t\trxq->mbuf_size - hw->rx_offset,\n+\t\t\t\tmb->data_len);\n+\t\t\trte_pktmbuf_free(mb);\n+\t\t\tbreak;\n+\t\t}\n+\n+\t\t/* Filling the received mbuf with packet info */\n+\t\tif (hw->rx_offset)\n+\t\t\tmb->data_off = RTE_PKTMBUF_HEADROOM + hw->rx_offset;\n+\t\telse\n+\t\t\tmb->data_off = RTE_PKTMBUF_HEADROOM + NFP_DESC_META_LEN(rxds);\n+\n+\t\t/* No scatter mode supported */\n+\t\tmb->nb_segs = 1;\n+\t\tmb->next = NULL;\n+\t\tmb->port = rxq->port_id;\n+\n+\t\trx_pkts[avail++] = mb;\n+\n+\t\t/* Now resetting and updating the descriptor */\n+\t\trxds->vals[0] = 0;\n+\t\trxds->vals[1] = 0;\n+\t\tdma_addr = rte_cpu_to_le_64(RTE_MBUF_DMA_ADDR_DEFAULT(new_mb));\n+\t\trxds->fld.dd = 0;\n+\t\trxds->fld.dma_addr_hi = (dma_addr >> 32) & 0xff;\n+\t\trxds->fld.dma_addr_lo = dma_addr & 0xffffffff;\n+\n+\t\trxq->rd_p++;\n+\t\tif (unlikely(rxq->rd_p == rxq->rx_count)) /* wrapping?*/\n+\t\t\trxq->rd_p = 0;\n+\t}\n+\n+\tif (nb_hold == 0)\n+\t\treturn 0;\n+\n+\tnb_hold += rxq->nb_rx_hold;\n+\n+\t/*\n+\t * FL descriptors needs to be written before incrementing the\n+\t * FL queue WR pointer\n+\t */\n+\trte_wmb();\n+\tif (nb_hold >= rxq->rx_free_thresh) {\n+\t\tPMD_RX_LOG(DEBUG, \"port=%hu queue=%d nb_hold=%hu avail=%hu\",\n+\t\t\trxq->port_id, rxq->qidx, nb_hold, avail);\n+\t\tnfp_qcp_ptr_add(rxq->qcp_fl, NFP_QCP_WRITE_PTR, nb_hold);\n+\t\tnb_hold = 0;\n+\t}\n+\n+\trxq->nb_rx_hold = nb_hold;\n+\n+\treturn avail;\n+}\n+\n+uint16_t\n+nfp_flower_ctrl_vnic_xmit(struct nfp_app_fw_flower *app_fw_flower,\n+\t\tstruct rte_mbuf *mbuf)\n+{\n+\tuint16_t cnt = 0;\n+\tuint64_t dma_addr;\n+\tuint32_t free_descs;\n+\tstruct rte_mbuf **lmbuf;\n+\tstruct nfp_net_txq *txq;\n+\tstruct nfp_net_hw *ctrl_hw;\n+\tstruct rte_eth_dev *ctrl_dev;\n+\tstruct nfp_net_nfd3_tx_desc *txds;\n+\n+\tctrl_hw = app_fw_flower->ctrl_hw;\n+\tctrl_dev = ctrl_hw->eth_dev;\n+\n+\t/* Flower ctrl vNIC only has a single tx queue */\n+\ttxq = ctrl_dev->data->tx_queues[0];\n+\tif (unlikely(txq == NULL)) {\n+\t\t/*\n+\t\t * DPDK just checks the queue is lower than max queues\n+\t\t * enabled. But the queue needs to be configured\n+\t\t */\n+\t\tPMD_TX_LOG(ERR, \"ctrl dev TX Bad queue\");\n+\t\tgoto xmit_end;\n+\t}\n+\n+\ttxds = &txq->txds[txq->wr_p];\n+\ttxds->vals[0] = 0;\n+\ttxds->vals[1] = 0;\n+\ttxds->vals[2] = 0;\n+\ttxds->vals[3] = 0;\n+\n+\tif (nfp_net_nfd3_txq_full(txq))\n+\t\tnfp_net_tx_free_bufs(txq);\n+\n+\tfree_descs = nfp_net_nfd3_free_tx_desc(txq);\n+\tif (unlikely(free_descs == 0)) {\n+\t\tPMD_TX_LOG(ERR, \"ctrl dev no free descs\");\n+\t\tgoto xmit_end;\n+\t}\n+\n+\tlmbuf = &txq->txbufs[txq->wr_p].mbuf;\n+\tRTE_MBUF_PREFETCH_TO_FREE(*lmbuf);\n+\tif (*lmbuf)\n+\t\trte_pktmbuf_free_seg(*lmbuf);\n+\n+\t*lmbuf = mbuf;\n+\tdma_addr = rte_mbuf_data_iova(mbuf);\n+\n+\ttxds->data_len = mbuf->pkt_len;\n+\ttxds->dma_len = txds->data_len;\n+\ttxds->dma_addr_hi = (dma_addr >> 32) & 0xff;\n+\ttxds->dma_addr_lo = (dma_addr & 0xffffffff);\n+\ttxds->offset_eop = FLOWER_PKT_DATA_OFFSET | PCIE_DESC_TX_EOP;\n+\n+\ttxq->wr_p++;\n+\tif (unlikely(txq->wr_p == txq->tx_count)) /* wrapping?*/\n+\t\ttxq->wr_p = 0;\n+\n+\tcnt++;\n+\tapp_fw_flower->ctrl_vnic_tx_count++;\n+\n+xmit_end:\n+\trte_wmb();\n+\tnfp_qcp_ptr_add(txq->qcp_q, NFP_QCP_WRITE_PTR, 1);\n+\n+\treturn cnt;\n+}\n+\n+void\n+nfp_flower_ctrl_vnic_poll(struct nfp_app_fw_flower *app_fw_flower)\n+{\n+\tuint16_t i;\n+\tuint16_t count;\n+\tstruct nfp_net_rxq *rxq;\n+\tstruct nfp_net_hw *ctrl_hw;\n+\tstruct rte_eth_dev *ctrl_eth_dev;\n+\tstruct rte_mbuf *pkts_burst[MAX_PKT_BURST];\n+\n+\tctrl_hw = app_fw_flower->ctrl_hw;\n+\tctrl_eth_dev = ctrl_hw->eth_dev;\n+\n+\t/* ctrl vNIC only has a single Rx queue */\n+\trxq = ctrl_eth_dev->data->rx_queues[0];\n+\n+\twhile (true) {\n+\t\tcount = nfp_flower_ctrl_vnic_recv(rxq, pkts_burst, MAX_PKT_BURST);\n+\t\tif (count) {\n+\t\t\tapp_fw_flower->ctrl_vnic_rx_count += count;\n+\t\t\t/* Process cmsgs here, only free for now */\n+\t\t\tfor (i = 0; i < count; i++)\n+\t\t\t\trte_pktmbuf_free(pkts_burst[i]);\n+\t\t}\n+\t}\n+}\ndiff --git a/drivers/net/nfp/flower/nfp_flower_ctrl.h b/drivers/net/nfp/flower/nfp_flower_ctrl.h\nnew file mode 100644\nindex 0000000..1e38578\n--- /dev/null\n+++ b/drivers/net/nfp/flower/nfp_flower_ctrl.h\n@@ -0,0 +1,13 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright (c) 2022 Corigine, Inc.\n+ * All rights reserved.\n+ */\n+\n+#ifndef _NFP_FLOWER_CTRL_H_\n+#define _NFP_FLOWER_CTRL_H_\n+\n+void nfp_flower_ctrl_vnic_poll(struct nfp_app_fw_flower *app_fw_flower);\n+uint16_t nfp_flower_ctrl_vnic_xmit(struct nfp_app_fw_flower *app_fw_flower,\n+\t\tstruct rte_mbuf *mbuf);\n+\n+#endif /* _NFP_FLOWER_CTRL_H_ */\ndiff --git a/drivers/net/nfp/meson.build b/drivers/net/nfp/meson.build\nindex 7ae3115..8710213 100644\n--- a/drivers/net/nfp/meson.build\n+++ b/drivers/net/nfp/meson.build\n@@ -7,6 +7,7 @@ if not is_linux or not dpdk_conf.get('RTE_ARCH_64')\n endif\n sources = files(\n         'flower/nfp_flower.c',\n+        'flower/nfp_flower_ctrl.c',\n         'nfpcore/nfp_cpp_pcie_ops.c',\n         'nfpcore/nfp_nsp.c',\n         'nfpcore/nfp_cppcore.c',\n",
    "prefixes": [
        "v8",
        "09/12"
    ]
}