get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 128245,
    "url": "http://patches.dpdk.org/api/patches/128245/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20230607015709.336420-11-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": "<20230607015709.336420-11-chaoyong.he@corigine.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20230607015709.336420-11-chaoyong.he@corigine.com",
    "date": "2023-06-07T01:57:09",
    "name": "[10/10] net/nfp: merge the recv function",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "4946bb2b293a1f28234eede655d72d6b5a9fafc0",
    "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/20230607015709.336420-11-chaoyong.he@corigine.com/mbox/",
    "series": [
        {
            "id": 28380,
            "url": "http://patches.dpdk.org/api/series/28380/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=28380",
            "date": "2023-06-07T01:56:59",
            "name": "support rte_flow for flower firmware with NFDk",
            "version": 1,
            "mbox": "http://patches.dpdk.org/series/28380/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/128245/comments/",
    "check": "fail",
    "checks": "http://patches.dpdk.org/api/patches/128245/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 6C4AB42C45;\n\tWed,  7 Jun 2023 03:59:03 +0200 (CEST)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 57E5342D75;\n\tWed,  7 Jun 2023 03:58:16 +0200 (CEST)",
            "from NAM11-CO1-obe.outbound.protection.outlook.com\n (mail-co1nam11on2096.outbound.protection.outlook.com [40.107.220.96])\n by mails.dpdk.org (Postfix) with ESMTP id B026E42D8A\n for <dev@dpdk.org>; Wed,  7 Jun 2023 03:58:14 +0200 (CEST)",
            "from SJ0PR13MB5545.namprd13.prod.outlook.com (2603:10b6:a03:424::5)\n by PH7PR13MB5453.namprd13.prod.outlook.com (2603:10b6:510:138::5)\n with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6455.33; Wed, 7 Jun\n 2023 01:58:12 +0000",
            "from SJ0PR13MB5545.namprd13.prod.outlook.com\n ([fe80::d2cb:a650:e1ce:2174]) by SJ0PR13MB5545.namprd13.prod.outlook.com\n ([fe80::d2cb:a650:e1ce:2174%3]) with mapi id 15.20.6455.030; Wed, 7 Jun 2023\n 01:58:12 +0000"
        ],
        "ARC-Seal": "i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none;\n b=fCdnli7QoxZs2TvaGn1vChdUhhsedtpbaVBfA0DtcbCDb0g7htFsibtrEnf27xMEoiQYcn+qbk0vCahrtgElwg5WCbJuituCteD20r1I5736EK3SQ3zriHqvip+RnMq5ouP7RNP+3zV3vyGU5WvKK7R7GUkd/J99Jgq1O07M7HLRpywtG+HSbkA5+6CJ7Xu8PcKcw6Ma2MB6jwMvakZ7F9KXQ1prqgjfleSlPNcUkWHfIZb9BrUqGlp9bsQsC6r7udsOIiR2lZRw36AqoMzJDGRlXkvgOXiOUckEGdGQ+5Avt3vpgKPN6WKDDiypw1AreH3w8mXGi/fY7eDZtbOdZg==",
        "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=hLcIRnHC3r36hSzoU+g3DlbkNfJ8JO6Q23S6ugHmwDc=;\n b=OKb+b40E/O7XEWp7+BhgjEybteIXVkFsgifFE3Fqpxtr21R/VviZbKgukwo4SZFonoLn3b861ZeETOH9Nh0nu+qpk0SJ17B2t7hYEh14lWjf88zq4u1nzcrZLoGd5XSCGqOrqDUvZ2yQuiu+TIuz6sXttm4VHZafzAg9WCVkYDzRAhQJtM3I6RTb7gqUKYC3cCtqdufg0IJy7E6sx4TLJy/fiaj+YQzAjdtqIzv/pOpgnOclDyb4PvV9++DoVxc5Z/RW8IsfJFz/oklF93JV+jAFKdI+sHLK6kg9iygotxlgzldVwH/NQeTerHvVBm1a2tT5Lf3KDURFmLTsIByKHQ==",
        "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=hLcIRnHC3r36hSzoU+g3DlbkNfJ8JO6Q23S6ugHmwDc=;\n b=nW5MFGElHHjWidMDIDUw5WgVknVPBArq/73RkNLg6jRS8ghK4LoWM3gE7JRp1kF4NssYZhK/QW53bM/110PCaQoCUDMdnSttroMlRQ62aiNgFunor8uu41T3em/MBOMeM8wZMkPj4SsLakKZMZEN/EUl/4YDY3r4lPmas4NzrEo=",
        "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 10/10] net/nfp: merge the recv function",
        "Date": "Wed,  7 Jun 2023 09:57:09 +0800",
        "Message-Id": "<20230607015709.336420-11-chaoyong.he@corigine.com>",
        "X-Mailer": "git-send-email 2.39.1",
        "In-Reply-To": "<20230607015709.336420-1-chaoyong.he@corigine.com>",
        "References": "<20230607015709.336420-1-chaoyong.he@corigine.com>",
        "Content-Type": "text/plain; charset=UTF-8",
        "Content-Transfer-Encoding": "8bit",
        "X-ClientProxiedBy": "SG2PR02CA0131.apcprd02.prod.outlook.com\n (2603:1096:4:188::6) 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_|PH7PR13MB5453:EE_",
        "X-MS-Office365-Filtering-Correlation-Id": "0d56ec8d-bf68-46d4-5aff-08db66faa675",
        "X-MS-Exchange-SenderADCheck": "1",
        "X-MS-Exchange-AntiSpam-Relay": "0",
        "X-Microsoft-Antispam": "BCL:0;",
        "X-Microsoft-Antispam-Message-Info": "\n ZUMbhhetKsNFe+ZM4Cl9QB0Av8wtjNURh051MrshukUTLUFKcnVgSA060WdkX44QXyjVJazou3pVrgISeZ0EDz2rJRJVwyte9cyRC/dvjiruzQOY9pNpfYJdCjNKxd1BzTcy1YTfZpnkJ1/dNszqfihELfVqc3D83o5FHHjzo73Y7fEhaNR1ZiBi5gc66OsajN4q1ZfE7t5ALYnnmnLuqN/uBuLOuj+kgrrpdgeZPo4XVyIlViX1pm93wt3g4XopjjmJJAHozE8KmGx+N3k7H3AkM2AetDMIniHFNUGmaGEw4USFxjw/kZoHM8IBmoOHIcK6PDDol1lD0GqT2T5qoxcuQe+J7cbkQV68eEQUjp87XDsV1PAQMYaoBHGVci8wpgL+z07ahPLhZ7M7xlRcW5X8ncv9hZW4U1ZV2f5hNEo+Sq5WFe5yvXJ45ZodAwZpYTbtJIL+J+lQk/85UEa7IW8/j4KNzxfbft+4LacT5M52AXMtO9HY0c0Gp4BnwjOVVCs5iyJ6vq6+ZFzCllCc/MAGUq/blpROMpbeQzjyqOxi42ymFQ6HtfWIeNV1dxc6HyWwQVzCR+rnVUOk3EqUEkaOAXt7gPJhxQI4E1AQxhdZS87yvoShzcp/sRTs/KeJ",
        "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:(13230028)(4636009)(346002)(396003)(376002)(136003)(366004)(39840400004)(451199021)(107886003)(1076003)(6506007)(26005)(6512007)(36756003)(66574015)(83380400001)(38350700002)(86362001)(38100700002)(186003)(2616005)(8676002)(4326008)(41300700001)(44832011)(30864003)(6916009)(478600001)(66946007)(66476007)(2906002)(316002)(8936002)(5660300002)(6486002)(52116002)(66556008)(6666004);\n DIR:OUT; SFP:1102;",
        "X-MS-Exchange-AntiSpam-MessageData-ChunkCount": "1",
        "X-MS-Exchange-AntiSpam-MessageData-0": "=?utf-8?q?r4ZafVULnxlNPwkq2DPQO3biendM?=\n\t=?utf-8?q?0s+EypujuK3rh/ZeH5CvwX9mH8+HIwOqJeGW8gAA9fxfswr2gsCKW4u1sEvYDYUgy?=\n\t=?utf-8?q?VTRsymb3tHChMIOrI3ANlDz3Dij5i2oiPDn0trGWskFpd2mA6lR/6lLhh6O9K+4so?=\n\t=?utf-8?q?pJLCOtAO7zbtvRbnlV8sF+s45B7ymkuBi1DRP56hPxN6qHxi6kYq0Os/rmNVtv9C9?=\n\t=?utf-8?q?u3YGARzzEJuByC+sWqlGVFUdJpRC+BQIwctKVW0YAoAz+ccEre6O1smIKASpS3gJX?=\n\t=?utf-8?q?bp0FTo1NPjXluMwYDKSxsr+ZGUE1uh2jjUwoHbYUnhTQ6aBytgIfyN8cf4ACFyc2C?=\n\t=?utf-8?q?prPr9fULQAegJ386VUiEEQNyUxJlSLC17Uxtgvr2KMBhg5i7UbyeuFU4MP4UdBNZ6?=\n\t=?utf-8?q?yxKpWCx/nRNwF5O00NftRl2NHCWA+fsG/37FXclSj500LRqrGWSsl1t2R+sZRT8g6?=\n\t=?utf-8?q?O0a45f6Kw0b8x8E5T31Vc78uBXXX4OEi5sF9n3ZCj4et2m8/eMax1WAmK0Vu7uV+c?=\n\t=?utf-8?q?K2Nhj53KUWAdnLwoKSgW6oU8GE70d4OV1glfvwZU370BjMx0EC+3x5QobhHRav1EB?=\n\t=?utf-8?q?Oc3v0GpWTwjMLnaQd+pQAh/l9pb6bzFv9TFIjBPKs+vUTE666Ga+7u6ZXZ9rFpVwf?=\n\t=?utf-8?q?3kELiFGzIFwa0djXI1Wzh+T4BuLskbI2kmKF1vquM8JZB8/HLUvW91AO63VL5Z7Dp?=\n\t=?utf-8?q?AuqTRHXoS63ZpG20Sn4zgdmt/5SUpVFGLkjN27Iclkh+RxsvqRYLVZP+qWgE1IgNe?=\n\t=?utf-8?q?xGDuIzRYAlH5ER5ZrHM3xO/PLa1JV1uLdshsmT1dDMW38PAyN9+edycj7KGR22o5+?=\n\t=?utf-8?q?LB/+qAXekvAX80d7hbQ8x/Ja9aGyDOTRpuiE9Nz1yXGdCuwdNrMaxxMk0WYIMzRmX?=\n\t=?utf-8?q?N0W9eDjaJMSUF0yv3jDbRfpGhVdfpkgx4EOD4/GQ8E+C5fXYdz33qBYInZcCpV2B8?=\n\t=?utf-8?q?+qwUAeE9h7JcEnlM3JXrF9L9BFQi2ou9/P+QKkzAlTd636j4P2ykzgsYw63oT5lHh?=\n\t=?utf-8?q?XIdr+1Z6+OV2AkYGH1zBIDN1cRwfWMU/uPgwwrzrazJxWVjKQYI9bXwp+R4+HRqad?=\n\t=?utf-8?q?ngGgQVJN9A8z61NLQz8Mcan9LuxvPLqXkIDl8RGB4U6/X4detFfDRu3BX30sET4i3?=\n\t=?utf-8?q?QluLilpoTcQdcutIU18Gn/pjIYsmPBvOUuH5jwCxQZfZMgaH4FuyJE03DDVoMyTRz?=\n\t=?utf-8?q?dPf6A1w1e1PWTprgftMaXgf8k2lYSUoHiB6pXrYpRMmY80s+6rzN62gy0lFXI86B6?=\n\t=?utf-8?q?EMtu/sZ2iFmNczzlwh2yNvRpjZtNvtALzSbgIClg8Gi44Bmu88r/v+IgCm4bFYbqp?=\n\t=?utf-8?q?10/gzPFDFGB/1VWwtWEPFt1CTMIbFP2jHkYVSD1FgNm08Wx4mtQSsAe998fvQVFn6?=\n\t=?utf-8?q?4x5qhoRuZQXIrdBb1KEXkE6LnTySHv4W76xS/NR8qrY2m3j6gidDDnFSjhYjf8HTr?=\n\t=?utf-8?q?B+37x4X0i/+krrczo5u/7MJS0VnJZkG9nnrO5vubn1VLkJ0HjA6ZemJXDuXCIyeOL?=\n\t=?utf-8?q?Fv7uef1xQaPkzwlPuqTZ3plBKxrCh6qoWQ=3D=3D?=",
        "X-OriginatorOrg": "corigine.com",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "\n 0d56ec8d-bf68-46d4-5aff-08db66faa675",
        "X-MS-Exchange-CrossTenant-AuthSource": "SJ0PR13MB5545.namprd13.prod.outlook.com",
        "X-MS-Exchange-CrossTenant-AuthAs": "Internal",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "07 Jun 2023 01:58:12.6698 (UTC)",
        "X-MS-Exchange-CrossTenant-FromEntityHeader": "Hosted",
        "X-MS-Exchange-CrossTenant-Id": "fe128f2c-073b-4c20-818e-7246a585940c",
        "X-MS-Exchange-CrossTenant-MailboxType": "HOSTED",
        "X-MS-Exchange-CrossTenant-UserPrincipalName": "\n owPDQJEGvQ4Td4r8iR57z6KSrb2BUDXPRKiype4oYPmrRqab8dmrCqZPJic3HwIWIMH9e7sflR10pAYgO1O/P7qbveqY8D29BFN7ncg4SHo=",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "PH7PR13MB5453",
        "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": "Refactor the logic of parse metadata to include all the supported\nmetadata type in one function.\n\nIf a packet received carried metadata type 'PORT_ID', then it should\nbe dispatched to the corresponding ring of the representor port,\nelse it should be put into the array of the caller function.\n\nThis will simplify the logic and eliminate duplicate code.\n\nSigned-off-by: Chaoyong He <chaoyong.he@corigine.com>\nReviewed-by: Niklas Söderlund <niklas.soderlund@corigine.com>\n---\n drivers/net/nfp/flower/nfp_flower.c           | 225 ++----------------\n drivers/net/nfp/flower/nfp_flower.h           |   5 +-\n drivers/net/nfp/flower/nfp_flower_cmsg.h      |   2 -\n .../net/nfp/flower/nfp_flower_representor.c   |   2 +-\n drivers/net/nfp/nfp_ctrl.h                    |   3 +\n drivers/net/nfp/nfp_rxtx.c                    |  36 ++-\n drivers/net/nfp/nfp_rxtx.h                    |   2 +\n 7 files changed, 49 insertions(+), 226 deletions(-)",
    "diff": "diff --git a/drivers/net/nfp/flower/nfp_flower.c b/drivers/net/nfp/flower/nfp_flower.c\nindex 5b452da6eb..8e1bc22747 100644\n--- a/drivers/net/nfp/flower/nfp_flower.c\n+++ b/drivers/net/nfp/flower/nfp_flower.c\n@@ -244,41 +244,6 @@ static const struct eth_dev_ops nfp_flower_pf_vnic_ops = {\n \t.dev_close              = nfp_flower_pf_close,\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 != 0) {\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@@ -303,186 +268,26 @@ nfp_flower_get_repr(struct nfp_net_hw *hw,\n \treturn NULL;\n }\n \n-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+bool\n+nfp_flower_pf_dispatch_pkts(struct nfp_net_hw *hw,\n+\t\tstruct rte_mbuf *mbuf,\n+\t\tuint32_t port_id)\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-\tuint16_t avail = 0;\n-\tuint16_t 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_dp_buf *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\tPMD_RX_LOG(ERR, \"RX Bad queue\");\n-\t\treturn 0;\n+\trepr = nfp_flower_get_repr(hw, port_id);\n+\tif (repr == NULL) {\n+\t\tPMD_RX_LOG(ERR, \"Can not get repr for port %u\", hw->idx);\n+\t\treturn false;\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\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(DEBUG,\n-\t\t\t\"RX mbuf alloc failed port_id=%hu queue_id=%hu\",\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\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\tPMD_RX_LOG(ERR,\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 != 0)\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.offload_info);\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 != NULL && repr->ring != NULL) {\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 != NULL) {\n-\t\t\tPMD_RX_LOG(ERR, \"No ring available for repr_port %s\", repr->name);\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) & 0xffff;\n-\t\trxds->fld.dma_addr_lo = dma_addr & 0xffffffff;\n-\t\tnb_hold++;\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=%hu queue_id=%hu, %hu 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=%hu queue=%hu nb_hold=%hu avail=%hu\",\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+\tif (repr->ring == NULL) {\n+\t\tPMD_RX_LOG(ERR, \"No ring available for repr_port %s\", repr->name);\n+\t\treturn false;\n \t}\n \n-\trxq->nb_rx_hold = nb_hold;\n-\n-\treturn avail;\n+\trte_ring_enqueue(repr->ring, (void *)mbuf);\n+\treturn true;\n }\n \n static uint16_t\n@@ -569,6 +374,8 @@ nfp_flower_init_vnic_common(struct nfp_net_hw *hw, const char *vnic_type)\n \t\treturn -EINVAL;\n \n \thw->cap = nn_cfg_readl(hw, NFP_NET_CFG_CAP);\n+\tnfp_net_init_metadata_format(hw);\n+\n \thw->max_mtu = nn_cfg_readl(hw, NFP_NET_CFG_MAX_MTU);\n \t/* Set the current MTU to the maximum supported */\n \thw->mtu = hw->max_mtu;\n@@ -1164,7 +971,7 @@ nfp_secondary_init_app_fw_flower(struct nfp_cpp *cpp)\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->rx_pkt_burst = nfp_net_recv_pkts;\n \teth_dev->tx_pkt_burst = nfp_flower_pf_xmit_pkts;\n \trte_eth_dev_probing_finish(eth_dev);\n \ndiff --git a/drivers/net/nfp/flower/nfp_flower.h b/drivers/net/nfp/flower/nfp_flower.h\nindex b85e5db3bf..34092cd4b4 100644\n--- a/drivers/net/nfp/flower/nfp_flower.h\n+++ b/drivers/net/nfp/flower/nfp_flower.h\n@@ -105,8 +105,9 @@ nfp_flower_support_decap_v2(const struct nfp_app_fw_flower *app_fw_flower)\n \n int nfp_init_app_fw_flower(struct nfp_pf_dev *pf_dev);\n int nfp_secondary_init_app_fw_flower(struct nfp_cpp *cpp);\n-uint16_t nfp_flower_pf_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,\n-\t\tuint16_t nb_pkts);\n+bool nfp_flower_pf_dispatch_pkts(struct nfp_net_hw *hw,\n+\t\tstruct rte_mbuf *mbuf,\n+\t\tuint32_t port_id);\n uint16_t nfp_flower_pf_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts,\n \t\tuint16_t nb_pkts);\n int nfp_flower_pf_start(struct rte_eth_dev *dev);\ndiff --git a/drivers/net/nfp/flower/nfp_flower_cmsg.h b/drivers/net/nfp/flower/nfp_flower_cmsg.h\nindex 96e080a8e9..47abf49d8a 100644\n--- a/drivers/net/nfp/flower/nfp_flower_cmsg.h\n+++ b/drivers/net/nfp/flower/nfp_flower_cmsg.h\n@@ -365,8 +365,6 @@ enum nfp_flower_cmsg_port_vnic_type {\n \n #define NFP_FLOWER_CMSG_HLEN            sizeof(struct nfp_flower_cmsg_hdr)\n #define NFP_FLOWER_CMSG_VER1            1\n-#define NFP_NET_META_PORTID             5\n-#define NFP_META_PORT_ID_CTRL           ~0U\n \n #define NFP_FLOWER_CMSG_PORT_TYPE(x)            (((x) >> 28) & 0xf)  /* [31,28] */\n #define NFP_FLOWER_CMSG_PORT_SYS_ID(x)          (((x) >> 24) & 0xf)  /* [24,27] */\ndiff --git a/drivers/net/nfp/flower/nfp_flower_representor.c b/drivers/net/nfp/flower/nfp_flower_representor.c\nindex eb318f66df..6b4ba5b9a2 100644\n--- a/drivers/net/nfp/flower/nfp_flower_representor.c\n+++ b/drivers/net/nfp/flower/nfp_flower_representor.c\n@@ -596,7 +596,7 @@ nfp_flower_pf_repr_init(struct rte_eth_dev *eth_dev,\n \tsnprintf(repr->name, sizeof(repr->name), \"%s\", init_repr_data->name);\n \n \teth_dev->dev_ops = &nfp_flower_pf_repr_dev_ops;\n-\teth_dev->rx_pkt_burst = nfp_flower_pf_recv_pkts;\n+\teth_dev->rx_pkt_burst = nfp_net_recv_pkts;\n \teth_dev->tx_pkt_burst = nfp_flower_pf_xmit_pkts;\n \teth_dev->data->dev_flags |= RTE_ETH_DEV_REPRESENTOR;\n \ndiff --git a/drivers/net/nfp/nfp_ctrl.h b/drivers/net/nfp/nfp_ctrl.h\nindex 47e77ea51d..7007548447 100644\n--- a/drivers/net/nfp/nfp_ctrl.h\n+++ b/drivers/net/nfp/nfp_ctrl.h\n@@ -34,6 +34,9 @@\n /* Prepend field types */\n #define NFP_NET_META_HASH               1 /* next field carries hash type */\n #define NFP_NET_META_VLAN               4\n+#define NFP_NET_META_PORTID             5\n+\n+#define NFP_META_PORT_ID_CTRL           ~0U\n \n /* Hash type pre-pended when a RSS hash was computed */\n #define NFP_NET_RSS_NONE                0\ndiff --git a/drivers/net/nfp/nfp_rxtx.c b/drivers/net/nfp/nfp_rxtx.c\nindex ce9a07309e..9867db4388 100644\n--- a/drivers/net/nfp/nfp_rxtx.c\n+++ b/drivers/net/nfp/nfp_rxtx.c\n@@ -16,6 +16,7 @@\n #include \"nfdk/nfp_nfdk.h\"\n #include \"nfpcore/nfp_mip.h\"\n #include \"nfpcore/nfp_rtsym.h\"\n+#include \"flower/nfp_flower.h\"\n \n static int\n nfp_net_rx_fill_freelist(struct nfp_net_rxq *rxq)\n@@ -124,6 +125,9 @@ nfp_net_parse_chained_meta(uint8_t *meta_base,\n \n \tfor (; meta_info != 0; meta_info >>= NFP_NET_META_FIELD_SIZE, meta_offset += 4) {\n \t\tswitch (meta_info & NFP_NET_META_FIELD_MASK) {\n+\t\tcase NFP_NET_META_PORTID:\n+\t\t\tmeta->port_id = rte_be_to_cpu_32(*(rte_be32_t *)meta_offset);\n+\t\t\tbreak;\n \t\tcase NFP_NET_META_HASH:\n \t\t\t/* Next field type is about the hash type */\n \t\t\tmeta_info >>= NFP_NET_META_FIELD_SIZE;\n@@ -270,11 +274,11 @@ static void\n nfp_net_parse_meta(struct nfp_net_rx_desc *rxds,\n \t\tstruct nfp_net_rxq *rxq,\n \t\tstruct nfp_net_hw *hw,\n-\t\tstruct rte_mbuf *mb)\n+\t\tstruct rte_mbuf *mb,\n+\t\tstruct nfp_meta_parsed *meta)\n {\n \tuint8_t *meta_base;\n \trte_be32_t meta_header;\n-\tstruct nfp_meta_parsed meta = {};\n \n \tif (unlikely(NFP_DESC_META_LEN(rxds) == 0))\n \t\treturn;\n@@ -285,18 +289,18 @@ nfp_net_parse_meta(struct nfp_net_rx_desc *rxds,\n \n \tswitch (hw->meta_format) {\n \tcase NFP_NET_METAFORMAT_CHAINED:\n-\t\tif (nfp_net_parse_chained_meta(meta_base, meta_header, &meta)) {\n-\t\t\tnfp_net_parse_meta_hash(&meta, rxq, mb);\n-\t\t\tnfp_net_parse_meta_vlan(&meta, rxds, rxq, mb);\n-\t\t\tnfp_net_parse_meta_qinq(&meta, rxq, mb);\n+\t\tif (nfp_net_parse_chained_meta(meta_base, meta_header, meta)) {\n+\t\t\tnfp_net_parse_meta_hash(meta, rxq, mb);\n+\t\t\tnfp_net_parse_meta_vlan(meta, rxds, rxq, mb);\n+\t\t\tnfp_net_parse_meta_qinq(meta, rxq, mb);\n \t\t} else {\n \t\t\tPMD_RX_LOG(DEBUG, \"RX chained metadata format is wrong!\");\n \t\t}\n \t\tbreak;\n \tcase NFP_NET_METAFORMAT_SINGLE:\n \t\tif ((rxds->rxd.flags & PCIE_DESC_RX_RSS) != 0) {\n-\t\t\tnfp_net_parse_single_meta(meta_base, meta_header, &meta);\n-\t\t\tnfp_net_parse_meta_hash(&meta, rxq, mb);\n+\t\t\tnfp_net_parse_single_meta(meta_base, meta_header, meta);\n+\t\t\tnfp_net_parse_meta_hash(meta, rxq, mb);\n \t\t}\n \t\tbreak;\n \tdefault:\n@@ -493,6 +497,7 @@ nfp_net_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)\n \tuint16_t nb_hold;\n \tuint64_t dma_addr;\n \tuint16_t avail;\n+\tuint16_t avail_multiplexed = 0;\n \n \trxq = rx_queue;\n \tif (unlikely(rxq == NULL)) {\n@@ -508,7 +513,7 @@ nfp_net_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)\n \n \tavail = 0;\n \tnb_hold = 0;\n-\twhile (avail < nb_pkts) {\n+\twhile (avail + avail_multiplexed < 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@@ -585,15 +590,22 @@ nfp_net_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)\n \t\tmb->next = NULL;\n \t\tmb->port = rxq->port_id;\n \n-\t\tnfp_net_parse_meta(rxds, rxq, hw, mb);\n+\t\tstruct nfp_meta_parsed meta = {};\n+\t\tnfp_net_parse_meta(rxds, rxq, hw, mb, &meta);\n \n \t\tnfp_net_parse_ptype(rxds, hw, mb);\n \n \t\t/* Checking the checksum flag */\n \t\tnfp_net_rx_cksum(rxq, rxds, mb);\n \n-\t\t/* Adding the mbuf to the mbuf array passed by the app */\n-\t\trx_pkts[avail++] = mb;\n+\t\tif (meta.port_id == 0) {\n+\t\t\trx_pkts[avail++] = mb;\n+\t\t} else if (nfp_flower_pf_dispatch_pkts(hw, mb, meta.port_id)) {\n+\t\t\tavail_multiplexed++;\n+\t\t} else {\n+\t\t\trte_pktmbuf_free(mb);\n+\t\t\tbreak;\n+\t\t}\n \n \t\t/* Now resetting and updating the descriptor */\n \t\trxds->vals[0] = 0;\ndiff --git a/drivers/net/nfp/nfp_rxtx.h b/drivers/net/nfp/nfp_rxtx.h\nindex cf713b0cd5..48e548b02d 100644\n--- a/drivers/net/nfp/nfp_rxtx.h\n+++ b/drivers/net/nfp/nfp_rxtx.h\n@@ -44,6 +44,7 @@ struct nfp_net_meta_raw {\n  * Parsed NFP packet metadata are recorded in this struct. The content is\n  * read-only after it have been recorded during parsing by nfp_net_parse_meta().\n  *\n+ * @port_id: Port id value\n  * @hash: RSS hash value\n  * @hash_type: RSS hash type\n  * @vlan_layer: The layers of VLAN info which are passed from nic.\n@@ -62,6 +63,7 @@ struct nfp_net_meta_raw {\n  * @vlan.tci: Vlan TCI including PCP + Priority + VID\n  */\n struct nfp_meta_parsed {\n+\tuint32_t port_id;\n \tuint32_t hash;\n \tuint8_t hash_type;\n \tuint8_t vlan_layer;\n",
    "prefixes": [
        "10/10"
    ]
}