get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 116347,
    "url": "http://patches.dpdk.org/api/patches/116347/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/1663238669-12244-13-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": "<1663238669-12244-13-git-send-email-chaoyong.he@corigine.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1663238669-12244-13-git-send-email-chaoyong.he@corigine.com",
    "date": "2022-09-15T10:44:29",
    "name": "[v9,12/12] net/nfp: add flower PF rxtx logic",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "995b0fb6430b2ca9923fa2613da81ed9252b3775",
    "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/1663238669-12244-13-git-send-email-chaoyong.he@corigine.com/mbox/",
    "series": [
        {
            "id": 24678,
            "url": "http://patches.dpdk.org/api/series/24678/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=24678",
            "date": "2022-09-15T10:44:17",
            "name": "preparation for the rte_flow offload of nfp PMD",
            "version": 9,
            "mbox": "http://patches.dpdk.org/series/24678/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/116347/comments/",
    "check": "fail",
    "checks": "http://patches.dpdk.org/api/patches/116347/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 B6178A00C5;\n\tThu, 15 Sep 2022 12:46:15 +0200 (CEST)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 5B0B442BA0;\n\tThu, 15 Sep 2022 12:45:14 +0200 (CEST)",
            "from NAM04-MW2-obe.outbound.protection.outlook.com\n (mail-mw2nam04on2133.outbound.protection.outlook.com [40.107.101.133])\n by mails.dpdk.org (Postfix) with ESMTP id 6EEF142B92\n for <dev@dpdk.org>; Thu, 15 Sep 2022 12:45:11 +0200 (CEST)",
            "from SJ0PR13MB5545.namprd13.prod.outlook.com (2603:10b6:a03:424::5)\n by SA0PR13MB4158.namprd13.prod.outlook.com (2603:10b6:806:9b::9) with\n Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5654.5; Thu, 15 Sep\n 2022 10:45:09 +0000",
            "from SJ0PR13MB5545.namprd13.prod.outlook.com\n ([fe80::819:38c:6513:bf15]) by SJ0PR13MB5545.namprd13.prod.outlook.com\n ([fe80::819:38c:6513:bf15%4]) with mapi id 15.20.5632.012; Thu, 15 Sep 2022\n 10:45:09 +0000"
        ],
        "ARC-Seal": "i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none;\n b=of+ZtbE4hqtNNtKeQSv4ka5H7sjOWKXaQq4HrH/bBxoHl/fhWw7l8ptwpL8puYlCNx5lVQcW6H0a2D93Rv+fqVgCNPqwwfdiGzOo/fkGmEYTC/Ld7Vhr1RXZis/FYMxJy0DkS5tVsy4LoJ9brWNQsbxDn5QO2Q0wf8Qok1vrXMKu1Wgm+9rhWQ8skjpOE9sypkQASs/7ZZ/Zks7A6w39J1RnWDVDlhsiaWglrzNbHbeix2gIzzXRlqau7iaira70vQuU1ytZcyheG+j94VRus3RqGeFFPvwbX2TOhOAIVzE+JoKkVIZ/TltoA+gOGGIMC/eq+NGaiQeYMyGIo0aVsA==",
        "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=hAw7SUi3Fb2DwcrwHu4uss7AKv4sHOb343DKdqeDwLw=;\n b=NMuGjdWfS4s2epp9ew6i0SrXkwyhyAEdiU2qZOlapMe7TRIvQBK6G5Vn1pW/GUqJPvCmEWqeKRM5gjwJj0zDHBL4MxPzox45aJkPPxwIQIqeK0Q4lorrDrFp0rd+VqBSKbdoGysOCCJXDo/D15PbLOxglvbjMl936JbNHOcn4RNCm+9HXtHwufA5KppJZwH2DaZ22uVq8UQRT7h+W479rH0P9IX4LImdFv8yRZArkSZr+iNGwrLHxg+4pVkhLXS4yKDnI7b7MtLcwiYfpIJuijij9Re9P2uxqeNV0pT4A1Xg/5ufqrnkBsTYB/ieNH6TOxE0UWesS2YZCQ7WPCzGGQ==",
        "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=hAw7SUi3Fb2DwcrwHu4uss7AKv4sHOb343DKdqeDwLw=;\n b=h3e62tR2PgYyYMYYD7DONpQpjWtJfE9pan1LyhAtZocgdmHymWRbecPwIQtJceXmqMSzfJ9HDteruBl89Ykw2Vvfc02H+zoT/G33d4IWBSaS0x2OKivbYPpivyFSkVHd2JCaOKkPBH8s1C82F+iLLu1u0UYouHldz/KKAgMxPYA=",
        "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>",
        "Subject": "[PATCH v9 12/12] net/nfp: add flower PF rxtx logic",
        "Date": "Thu, 15 Sep 2022 18:44:29 +0800",
        "Message-Id": "<1663238669-12244-13-git-send-email-chaoyong.he@corigine.com>",
        "X-Mailer": "git-send-email 1.8.3.1",
        "In-Reply-To": "<1663238669-12244-1-git-send-email-chaoyong.he@corigine.com>",
        "References": "<1663238669-12244-1-git-send-email-chaoyong.he@corigine.com>",
        "Content-Type": "text/plain; charset=UTF-8",
        "Content-Transfer-Encoding": "8bit",
        "X-ClientProxiedBy": "BYAPR11CA0071.namprd11.prod.outlook.com\n (2603:10b6:a03:80::48) 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_|SA0PR13MB4158:EE_",
        "X-MS-Office365-Filtering-Correlation-Id": "4bf64141-0335-43ba-1c71-08da97075c51",
        "X-MS-Exchange-SenderADCheck": "1",
        "X-MS-Exchange-AntiSpam-Relay": "0",
        "X-Microsoft-Antispam": "BCL:0;",
        "X-Microsoft-Antispam-Message-Info": "\n VWlfGZ1TxlN6eELDhGKyealRFaEvtu2uCrctgMFB9jUvfZwta7kyvGlbXqaked3MktRbGxOp3LXiWizfCAK8xM8KSuRty83I1Pn+BMztEhfVopdNhyRO/X/F1TlhEUdhdimJSyicp9HbazKOof7yv448msu/cNteynApcLjAywM9yTQ0pvcB59ZfduFXVaCfMtyhRSJ3adMj38TOoMhqwtH7uxKNtdtPKq/QT4nwMJdQEuwYDRJwN/157xWqg6aXvp9qpm/2klhTE0l+kpJZyqYQqYy+uZSuUUUI8z07sC1QffxqF59h9InQqQnLmNdXQ+eec5TxF1AJcYwMtGg0dNVbpk/B4ADUzmqsPnnA9f/tmhizsaTaP6WTOlubjezO9NqQQdaRZPF2kxNwlaqaPRX1FJsEYR7R3dGVhWftZRWMKDwvtjSvgQE8QDEasCioShgvx3nrsXG2R5nnWQn7V0p6Akc1BB0vYaACBM1/dsHmTi7rT6X51VaPp1eN2sqri7s79ZPb6ATvooHfAqvz/KN40UiVv/lDP/7ryInDXL1M+ZJS4AFXwvkHpe6QNy6y45tS+LC/V+lNHvJ3XZcYUClFpiD2JTzXppNgdjVcac6R4H47VsnLYP27Lr3GBafD/hmTugfcnI3Yafq/PAMrETNqLbC5GEv00GGQT8Gib+VUAV/JUdropYoqCaAvUVNatV8CKXcOSoJ0cMYJsrTBJtHz1OdIq8roznTD6XnC+31mxu+1QYENNpeIytqyZrIbl35ESbEgNWyzBfbUcElfLw==",
        "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:(13230022)(4636009)(396003)(346002)(366004)(376002)(39840400004)(136003)(451199015)(2616005)(66574015)(38350700002)(38100700002)(186003)(86362001)(83380400001)(107886003)(8676002)(66946007)(66476007)(4326008)(66556008)(44832011)(8936002)(41300700001)(2906002)(5660300002)(6506007)(478600001)(6666004)(316002)(30864003)(6512007)(26005)(6486002)(52116002)(6916009)(36756003);\n DIR:OUT; SFP:1102;",
        "X-MS-Exchange-AntiSpam-MessageData-ChunkCount": "1",
        "X-MS-Exchange-AntiSpam-MessageData-0": "=?utf-8?q?5pprV17kSViGwEFoAOalpM/XOmVs?=\n\t=?utf-8?q?Hyn6pOaePBeE3F3fxCTC+yFtbrHXPQKM2zSvV7LSnBRt1jIgRUB/t/YTR3tZotXJl?=\n\t=?utf-8?q?Z+s04Qn61VWweBuqsqbZBfjVgSOa/z2V1qbIEMbUF48yz8y7iilVdiY+JW/9e6Qpd?=\n\t=?utf-8?q?fbDrczOD2QuhP3HqunEMwls7aHH1aAyyKkzS1+BoVyw5ll/JmQFHIcm/IGwdDyNP1?=\n\t=?utf-8?q?G5xUHxBSgwEb/vNm/b5bBVDt8fBe+mYP+W6g1A+J6JQSRRELzMMj231J1BHumaPFO?=\n\t=?utf-8?q?Qh5mngIgCH/+sP6O5bG46RecAKH5qhtYrpUfbEgXsqhOsyZRrnh3AO3yi0IJ9McTi?=\n\t=?utf-8?q?Ecws85n1/Jwd12kXK946UKVyPNAvr73hsRML0Efzy0rDr0ZTaDnnvPhfBz+W5Ewmi?=\n\t=?utf-8?q?GOAAnfgrLKqtp//fniENzbJHpBSEOgmHO/sQ9ypC7smE8F/sR11N4IbtNlpQVYBDC?=\n\t=?utf-8?q?56efBhQpfpFkGtP37Mqj93OUup4siprkDweo/cGuL/9jlsWQf+2vTL0QP3IfOIH99?=\n\t=?utf-8?q?aCTmrvZYoNPLAcqgWejli27BK9SkyM0QHtW02GapyxBsdC4qAE4tLaU00oz1rPy9Q?=\n\t=?utf-8?q?8C/u4yfNON1tYnYgW5Pift/m2P2GrCr8zmZi76lsukf+OD7VjV3Ggv57hAHzlkAnk?=\n\t=?utf-8?q?T2zwtZqdDaK7sB3P6OkKeLOtYPfcnnSs1KDJt2Uzr/IN39xkywudM6NN0A9A/Rot+?=\n\t=?utf-8?q?wnfl+XPfccZtX/w2pMwFvX3AmspZJ7ZX8YRFXvLljunQbWiimX0hY3oDdkgUD+P28?=\n\t=?utf-8?q?MRIKp1ch4jg4Lcc5p7gOXzxSgHojrgCduKqW5W5+tQHFsnk07rgyKeb6Ko/2FEnWY?=\n\t=?utf-8?q?3Twa+v2qwO8SG8SHaDwndDIF6/g+gx8saV/qapSueGe5wcdcQyXzeCDoFyN0tjoY/?=\n\t=?utf-8?q?aJxd7QHpb7NIdQzBVLt5QgT0bjVPVfQGxn3zxxQeYw5oljsrQMDZwLego1Tf4477a?=\n\t=?utf-8?q?azw7LNe1J1zgozPj7BrbhyA4jslH8cZ3oLdJbSLpzjtttPGOHMyK7L0W3hGnIjZhw?=\n\t=?utf-8?q?u31AA0ZScb8NNmNqM6B2XOOsE0VyZ2ESNHRae71v1wcaGN/i2jBcePaZfYc5bDp1l?=\n\t=?utf-8?q?ecqKiZZ31vG+SsNhdvL9ah7v9CdkzOV2Lbp8HYXTi65c5PFUrgsfm+WynmiYCpnmg?=\n\t=?utf-8?q?oa5K83dVAhS4ZTClS1A99KXno95GeyMrKiSMGSvvJrIgwoht1AYUvicdaKZYgKcUT?=\n\t=?utf-8?q?haqizDcMIJGtEcQ6AqKm9lt4PAVRu50aL3U1zDNpR80HIF89kf5tKKA6DAX+nPOLs?=\n\t=?utf-8?q?L2y9/8zwHVMZxi6pQBSkyFnWKr0s/fPRcz6QpIG1qTONo7JvWWEXWRlboz1Q1/KUA?=\n\t=?utf-8?q?P0WC98l+7C3JeoP+0Y58S1fmwP6yi+c9mehBhENovO+xUX95Sfv/V1CZ+rk3Nlgj+?=\n\t=?utf-8?q?STDYSccRC15q6bdiQ5WQ7wiF82S/i6ORXV76rKTemRUId/nudAdhZQU0hmWWPwjM6?=\n\t=?utf-8?q?1J2didCEmjM20DJ3R4dMAqoPbvcq5w8hCBEbQyjHY0PGZOcm6UQ03t1qQ3MODCXIy?=\n\t=?utf-8?q?J2DcUnnO1vhdRL5xBbqndbOxGr0PBatXBQ=3D=3D?=",
        "X-OriginatorOrg": "corigine.com",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "SA0PR13MB4158",
        "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": "Implements the flower Rx logic. Fallback packets are multiplexed to the\ncorrect representor port based on the prepended metadata. The Rx poll\nis set to run on the existing service infrastructure.\n\nFor Tx the existing NFP Tx logic is duplicated to keep the Tx two paths\ndistinct. Flower fallback also adds 8 bytes of metadata to the start of\nthe packet that has to be adjusted for in the Tx descriptor.\n\nSigned-off-by: Chaoyong He <chaoyong.he@corigine.com>\nReviewed-by: Niklas Söderlund <niklas.soderlund@corigine.com>\n---\n doc/guides/nics/nfp.rst             |  13 ++\n drivers/net/nfp/flower/nfp_flower.c | 425 ++++++++++++++++++++++++++++++++++++\n drivers/net/nfp/flower/nfp_flower.h |   1 +\n 3 files changed, 439 insertions(+)",
    "diff": "diff --git a/doc/guides/nics/nfp.rst b/doc/guides/nics/nfp.rst\nindex c62b1fb..b74067c 100644\n--- a/doc/guides/nics/nfp.rst\n+++ b/doc/guides/nics/nfp.rst\n@@ -200,3 +200,16 @@ The flower firmware application support representor port for VF and physical\n port. There will always exist a representor port for each physical port,\n and the number of the representor port for VF is specified by the user through\n parameter.\n+\n+In the Rx direction, the flower firmware application will prepend the input\n+port information into metadata for each packet which can't offloaded. The PF\n+vNIC service will keep polling packets from the firmware, and multiplex them\n+to the corresponding representor port.\n+\n+In the Tx direction, the representor port will prepend the output port\n+information into metadata for each packet, and then send it to firmware through\n+PF vNIC.\n+\n+The ctrl vNIC service handling various control message, like the creation and\n+configuration of representor port, the pattern and action of flow rules, the\n+statistics of flow rules, and so on.\ndiff --git a/drivers/net/nfp/flower/nfp_flower.c b/drivers/net/nfp/flower/nfp_flower.c\nindex c52785c..d2bda15 100644\n--- a/drivers/net/nfp/flower/nfp_flower.c\n+++ b/drivers/net/nfp/flower/nfp_flower.c\n@@ -22,6 +22,7 @@\n #include \"nfp_flower.h\"\n #include \"nfp_flower_ctrl.h\"\n #include \"nfp_flower_representor.h\"\n+#include \"nfp_flower_cmsg.h\"\n \n #define MAX_PKT_BURST 32\n #define MBUF_PRIV_SIZE 128\n@@ -214,6 +215,383 @@\n \t.dev_configure          = nfp_net_configure,\n };\n \n+static inline void\n+nfp_flower_parse_metadata(struct nfp_net_rxq *rxq,\n+\t\tstruct nfp_net_rx_desc *rxd,\n+\t\tstruct rte_mbuf *mbuf,\n+\t\tuint32_t *portid)\n+{\n+\tuint32_t meta_info;\n+\tuint8_t *meta_offset;\n+\tstruct nfp_net_hw *hw;\n+\n+\thw = rxq->hw;\n+\tif (!((hw->ctrl & NFP_NET_CFG_CTRL_RSS) ||\n+\t\t\t(hw->ctrl & NFP_NET_CFG_CTRL_RSS2)))\n+\t\treturn;\n+\n+\tmeta_offset = rte_pktmbuf_mtod(mbuf, uint8_t *);\n+\tmeta_offset -= NFP_DESC_META_LEN(rxd);\n+\tmeta_info = rte_be_to_cpu_32(*(uint32_t *)meta_offset);\n+\tmeta_offset += 4;\n+\n+\twhile (meta_info) {\n+\t\tswitch (meta_info & NFP_NET_META_FIELD_MASK) {\n+\t\t/* Expect flower firmware to only send packets with META_PORTID */\n+\t\tcase NFP_NET_META_PORTID:\n+\t\t\t*portid = rte_be_to_cpu_32(*(uint32_t *)meta_offset);\n+\t\t\tmeta_offset += 4;\n+\t\t\tmeta_info >>= NFP_NET_META_FIELD_SIZE;\n+\t\t\tbreak;\n+\t\tdefault:\n+\t\t\t/* Unsupported metadata can be a performance issue */\n+\t\t\treturn;\n+\t\t}\n+\t}\n+}\n+\n+static inline struct nfp_flower_representor *\n+nfp_flower_get_repr(struct nfp_net_hw *hw,\n+\t\tuint32_t port_id)\n+{\n+\tuint8_t port;\n+\tstruct nfp_app_fw_flower *app_fw_flower;\n+\n+\t/* Obtain handle to app_fw_flower here */\n+\tapp_fw_flower = NFP_PRIV_TO_APP_FW_FLOWER(hw->pf_dev->app_fw_priv);\n+\n+\tswitch (NFP_FLOWER_CMSG_PORT_TYPE(port_id)) {\n+\tcase NFP_FLOWER_CMSG_PORT_TYPE_PHYS_PORT:\n+\t\tport =  NFP_FLOWER_CMSG_PORT_PHYS_PORT_NUM(port_id);\n+\t\treturn app_fw_flower->phy_reprs[port];\n+\tcase NFP_FLOWER_CMSG_PORT_TYPE_PCIE_PORT:\n+\t\tport = NFP_FLOWER_CMSG_PORT_VNIC(port_id);\n+\t\treturn app_fw_flower->vf_reprs[port];\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn NULL;\n+}\n+\n+static uint16_t\n+nfp_flower_pf_recv_pkts(void *rx_queue,\n+\t\tstruct rte_mbuf **rx_pkts,\n+\t\tuint16_t nb_pkts)\n+{\n+\t/*\n+\t * We need different counters for packets given to the caller\n+\t * and packets sent to representors\n+\t */\n+\tint avail = 0;\n+\tint avail_multiplexed = 0;\n+\tuint64_t dma_addr;\n+\tuint32_t meta_portid;\n+\tuint16_t nb_hold = 0;\n+\tstruct rte_mbuf *mb;\n+\tstruct nfp_net_hw *hw;\n+\tstruct rte_mbuf *new_mb;\n+\tstruct nfp_net_rxq *rxq;\n+\tstruct nfp_net_rx_buff *rxb;\n+\tstruct nfp_net_rx_desc *rxds;\n+\tstruct nfp_flower_representor *repr;\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\tRTE_LOG_DP(ERR, PMD, \"RX Bad queue\\n\");\n+\t\treturn 0;\n+\t}\n+\n+\thw = rxq->hw;\n+\n+\t/*\n+\t * This is tunable as we could allow to receive more packets than\n+\t * requested if most are multiplexed.\n+\t */\n+\twhile (avail + avail_multiplexed < nb_pkts) {\n+\t\trxb = &rxq->rxbufs[rxq->rd_p];\n+\t\tif (unlikely(rxb == NULL)) {\n+\t\t\tRTE_LOG_DP(ERR, PMD, \"rxb does not exist!\\n\");\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\tRTE_LOG_DP(DEBUG, PMD,\n+\t\t\t\"RX mbuf alloc failed port_id=%u queue_id=%d\\n\",\n+\t\t\t\trxq->port_id, 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\tPMD_RX_LOG(DEBUG, \"Packet len: %u, mbuf_size: %u\",\n+\t\t\t\trxds->rxd.data_len, rxq->mbuf_size);\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 = rxds->rxd.data_len - NFP_DESC_META_LEN(rxds);\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+\n+\t\tmb->port = rxq->port_id;\n+\t\tmeta_portid = 0;\n+\n+\t\t/* Checking the RSS flag */\n+\t\tnfp_flower_parse_metadata(rxq, rxds, mb, &meta_portid);\n+\t\tPMD_RX_LOG(DEBUG, \"Received from port %u type %u\",\n+\t\t\t\tNFP_FLOWER_CMSG_PORT_VNIC(meta_portid),\n+\t\t\t\tNFP_FLOWER_CMSG_PORT_VNIC_TYPE(meta_portid));\n+\n+\t\t/* Checking the checksum flag */\n+\t\tnfp_net_rx_cksum(rxq, rxds, mb);\n+\n+\t\tif ((rxds->rxd.flags & PCIE_DESC_RX_VLAN) &&\n+\t\t\t\t(hw->ctrl & NFP_NET_CFG_CTRL_RXVLAN)) {\n+\t\t\tmb->vlan_tci = rte_cpu_to_le_32(rxds->rxd.vlan);\n+\t\t\tmb->ol_flags |= RTE_MBUF_F_RX_VLAN | RTE_MBUF_F_RX_VLAN_STRIPPED;\n+\t\t}\n+\n+\t\trepr = nfp_flower_get_repr(hw, meta_portid);\n+\t\tif (repr && repr->ring) {\n+\t\t\tPMD_RX_LOG(DEBUG, \"Using representor %s\", repr->name);\n+\t\t\trte_ring_enqueue(repr->ring, (void *)mb);\n+\t\t\tavail_multiplexed++;\n+\t\t} else if (repr) {\n+\t\t\tPMD_RX_LOG(ERR, \"[%u] No ring available for repr_port %s\\n\",\n+\t\t\t\t\thw->idx, repr->name);\n+\t\t\tPMD_RX_LOG(DEBUG, \"Adding the mbuf to the mbuf array passed by the app\");\n+\t\t\trx_pkts[avail++] = mb;\n+\t\t} else {\n+\t\t\tPMD_RX_LOG(DEBUG, \"Adding the mbuf to the mbuf array passed by the app\");\n+\t\t\trx_pkts[avail++] = mb;\n+\t\t}\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))\n+\t\t\trxq->rd_p = 0;\n+\t}\n+\n+\tif (nb_hold == 0)\n+\t\treturn nb_hold;\n+\n+\tPMD_RX_LOG(DEBUG, \"RX port_id=%u queue_id=%d, %d packets received\",\n+\t\t\trxq->port_id, rxq->qidx, nb_hold);\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=%u queue=%d nb_hold=%u avail=%d\",\n+\t\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+static uint16_t\n+nfp_flower_pf_xmit_pkts(void *tx_queue,\n+\t\tstruct rte_mbuf **tx_pkts,\n+\t\tuint16_t nb_pkts)\n+{\n+\tint i = 0;\n+\tint pkt_size;\n+\tint dma_size;\n+\tuint64_t dma_addr;\n+\tuint16_t free_descs;\n+\tuint16_t issued_descs;\n+\tstruct rte_mbuf *pkt;\n+\tstruct nfp_net_hw *hw;\n+\tstruct rte_mbuf **lmbuf;\n+\tstruct nfp_net_txq *txq;\n+\tstruct nfp_net_nfd3_tx_desc txd;\n+\tstruct nfp_net_nfd3_tx_desc *txds;\n+\n+\ttxq = tx_queue;\n+\thw = txq->hw;\n+\ttxds = &txq->txds[txq->wr_p];\n+\n+\tPMD_TX_LOG(DEBUG, \"working for queue %d at pos %u and %u packets\",\n+\t\t\ttxq->qidx, txq->wr_p, nb_pkts);\n+\n+\tif ((nfp_net_nfd3_free_tx_desc(txq) < nb_pkts) || (nfp_net_nfd3_txq_full(txq)))\n+\t\tnfp_net_tx_free_bufs(txq);\n+\n+\tfree_descs = (uint16_t)nfp_net_nfd3_free_tx_desc(txq);\n+\tif (unlikely(free_descs == 0))\n+\t\treturn 0;\n+\n+\tpkt = *tx_pkts;\n+\tissued_descs = 0;\n+\n+\t/* Sending packets */\n+\twhile ((i < nb_pkts) && free_descs) {\n+\t\t/* Grabbing the mbuf linked to the current descriptor */\n+\t\tlmbuf = &txq->txbufs[txq->wr_p].mbuf;\n+\t\t/* Warming the cache for releasing the mbuf later on */\n+\t\tRTE_MBUF_PREFETCH_TO_FREE(*lmbuf);\n+\n+\t\tpkt = *(tx_pkts + i);\n+\n+\t\tif (unlikely(pkt->nb_segs > 1 &&\n+\t\t\t\t!(hw->cap & NFP_NET_CFG_CTRL_GATHER))) {\n+\t\t\tPMD_INIT_LOG(INFO, \"NFP_NET_CFG_CTRL_GATHER not set\");\n+\t\t\tPMD_INIT_LOG(INFO, \"Multisegment packet unsupported\");\n+\t\t\tgoto xmit_end;\n+\t\t}\n+\n+\t\t/* Checking if we have enough descriptors */\n+\t\tif (unlikely(pkt->nb_segs > free_descs))\n+\t\t\tgoto xmit_end;\n+\n+\t\t/*\n+\t\t * Checksum and VLAN flags just in the first descriptor for a\n+\t\t * multisegment packet, but TSO info needs to be in all of them.\n+\t\t */\n+\t\ttxd.data_len = pkt->pkt_len;\n+\t\tnfp_net_nfd3_tx_tso(txq, &txd, pkt);\n+\t\tnfp_net_nfd3_tx_cksum(txq, &txd, pkt);\n+\n+\t\tif ((pkt->ol_flags & RTE_MBUF_F_TX_VLAN) &&\n+\t\t\t\t(hw->cap & NFP_NET_CFG_CTRL_TXVLAN)) {\n+\t\t\ttxd.flags |= PCIE_DESC_TX_VLAN;\n+\t\t\ttxd.vlan = pkt->vlan_tci;\n+\t\t}\n+\n+\t\t/*\n+\t\t * mbuf data_len is the data in one segment and pkt_len data\n+\t\t * in the whole packet. When the packet is just one segment,\n+\t\t * then data_len = pkt_len\n+\t\t */\n+\t\tpkt_size = pkt->pkt_len;\n+\n+\t\twhile (pkt) {\n+\t\t\t/* Copying TSO, VLAN and cksum info */\n+\t\t\t*txds = txd;\n+\n+\t\t\t/* Releasing mbuf used by this descriptor previously*/\n+\t\t\tif (*lmbuf)\n+\t\t\t\trte_pktmbuf_free_seg(*lmbuf);\n+\n+\t\t\t/*\n+\t\t\t * Linking mbuf with descriptor for being released\n+\t\t\t * next time descriptor is used\n+\t\t\t */\n+\t\t\t*lmbuf = pkt;\n+\n+\t\t\tdma_size = pkt->data_len;\n+\t\t\tdma_addr = rte_mbuf_data_iova(pkt);\n+\n+\t\t\t/* Filling descriptors fields */\n+\t\t\ttxds->dma_len = dma_size;\n+\t\t\ttxds->data_len = txd.data_len;\n+\t\t\ttxds->dma_addr_hi = (dma_addr >> 32) & 0xff;\n+\t\t\ttxds->dma_addr_lo = (dma_addr & 0xffffffff);\n+\t\t\tASSERT(free_descs > 0);\n+\t\t\tfree_descs--;\n+\n+\t\t\ttxq->wr_p++;\n+\t\t\tif (unlikely(txq->wr_p == txq->tx_count)) /* wrapping?*/\n+\t\t\t\ttxq->wr_p = 0;\n+\n+\t\t\tpkt_size -= dma_size;\n+\n+\t\t\t/*\n+\t\t\t * Making the EOP, packets with just one segment\n+\t\t\t * the priority\n+\t\t\t */\n+\t\t\tif (likely(!pkt_size))\n+\t\t\t\ttxds->offset_eop = PCIE_DESC_TX_EOP | FLOWER_PKT_DATA_OFFSET;\n+\t\t\telse\n+\t\t\t\ttxds->offset_eop = 0;\n+\n+\t\t\tpkt = pkt->next;\n+\t\t\t/* Referencing next free TX descriptor */\n+\t\t\ttxds = &txq->txds[txq->wr_p];\n+\t\t\tlmbuf = &txq->txbufs[txq->wr_p].mbuf;\n+\t\t\tissued_descs++;\n+\t\t}\n+\t\ti++;\n+\t}\n+\n+xmit_end:\n+\t/* Increment write pointers. Force memory write before we let HW know */\n+\trte_wmb();\n+\tnfp_qcp_ptr_add(txq->qcp_q, NFP_QCP_WRITE_PTR, issued_descs);\n+\n+\treturn i;\n+}\n+\n struct dp_packet {\n \tstruct rte_mbuf mbuf;\n \tuint32_t source;\n@@ -382,6 +760,8 @@ struct dp_packet {\n \n \t/* Add Rx/Tx functions */\n \teth_dev->dev_ops = &nfp_flower_pf_vnic_ops;\n+\teth_dev->rx_pkt_burst = nfp_flower_pf_recv_pkts;\n+\teth_dev->tx_pkt_burst = nfp_flower_pf_xmit_pkts;\n \n \t/* PF vNIC gets a random MAC */\n \teth_dev->data->mac_addrs = rte_zmalloc(\"mac_addr\", RTE_ETHER_ADDR_LEN, 0);\n@@ -504,6 +884,45 @@ struct dp_packet {\n \treturn 0;\n }\n \n+static void\n+nfp_flower_pf_vnic_poll(struct nfp_app_fw_flower *app_fw_flower)\n+{\n+\tuint16_t i;\n+\tvoid *rx_queue;\n+\tuint16_t count;\n+\tuint16_t n_rxq;\n+\tstruct rte_eth_dev *dev;\n+\tstruct rte_mbuf *pkts_burst[MAX_PKT_BURST];\n+\n+\tdev = app_fw_flower->pf_hw->eth_dev;\n+\tn_rxq = dev->data->nb_rx_queues;\n+\n+\twhile (true) {\n+\t\t/* Add ability to run Rx queues on multiple service cores? */\n+\t\tfor (i = 0; i < n_rxq; i++) {\n+\t\t\trx_queue = dev->data->rx_queues[i];\n+\t\t\tcount = nfp_flower_pf_recv_pkts(rx_queue, pkts_burst, MAX_PKT_BURST);\n+\n+\t\t\t/*\n+\t\t\t * Don't expect packets here but free them in case they have\n+\t\t\t * not been multiplexed to a representor\n+\t\t\t */\n+\t\t\tif (unlikely(count > 0))\n+\t\t\t\trte_pktmbuf_free_bulk(pkts_burst, count);\n+\t\t}\n+\t}\n+}\n+\n+static int\n+nfp_flower_pf_vnic_service(void *arg)\n+{\n+\tstruct nfp_app_fw_flower *app_fw_flower = arg;\n+\n+\tnfp_flower_pf_vnic_poll(app_fw_flower);\n+\n+\treturn 0;\n+}\n+\n static int\n nfp_flower_init_ctrl_vnic(struct nfp_net_hw *hw)\n {\n@@ -694,6 +1113,10 @@ struct dp_packet {\n }\n \n static struct rte_service_spec flower_services[NFP_FLOWER_SERVICE_MAX] = {\n+\t[NFP_FLOWER_SERVICE_PF] = {\n+\t\t.name         = \"flower_pf_vnic_service\",\n+\t\t.callback     = nfp_flower_pf_vnic_service,\n+\t},\n \t[NFP_FLOWER_SERVICE_CTRL] = {\n \t\t.name         = \"flower_ctrl_vnic_service\",\n \t\t.callback     = nfp_flower_ctrl_vnic_service,\n@@ -879,6 +1302,8 @@ struct dp_packet {\n \n \teth_dev->process_private = cpp;\n \teth_dev->dev_ops = &nfp_flower_pf_vnic_ops;\n+\teth_dev->rx_pkt_burst = nfp_flower_pf_recv_pkts;\n+\teth_dev->tx_pkt_burst = nfp_flower_pf_xmit_pkts;\n \trte_eth_dev_probing_finish(eth_dev);\n \n \treturn 0;\ndiff --git a/drivers/net/nfp/flower/nfp_flower.h b/drivers/net/nfp/flower/nfp_flower.h\nindex c7d673f..01c3f7f 100644\n--- a/drivers/net/nfp/flower/nfp_flower.h\n+++ b/drivers/net/nfp/flower/nfp_flower.h\n@@ -7,6 +7,7 @@\n #define _NFP_FLOWER_H_\n \n enum nfp_flower_service {\n+\tNFP_FLOWER_SERVICE_PF,\n \tNFP_FLOWER_SERVICE_CTRL,\n \tNFP_FLOWER_SERVICE_MAX,\n };\n",
    "prefixes": [
        "v9",
        "12/12"
    ]
}