get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 113594,
    "url": "http://patches.dpdk.org/api/patches/113594/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/1656642017-8992-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": "<1656642017-8992-13-git-send-email-chaoyong.he@corigine.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1656642017-8992-13-git-send-email-chaoyong.he@corigine.com",
    "date": "2022-07-01T02:20:17",
    "name": "[v4,12/12] net/nfp: add flower PF rxtx logic",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "45c5caab7414d4d4e485b9f6b514162c3fc13e0b",
    "submitter": {
        "id": 2554,
        "url": "http://patches.dpdk.org/api/people/2554/?format=api",
        "name": "Chaoyong He",
        "email": "chaoyong.he@corigine.com"
    },
    "delegate": {
        "id": 3961,
        "url": "http://patches.dpdk.org/api/users/3961/?format=api",
        "username": "arybchenko",
        "first_name": "Andrew",
        "last_name": "Rybchenko",
        "email": "andrew.rybchenko@oktetlabs.ru"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/1656642017-8992-13-git-send-email-chaoyong.he@corigine.com/mbox/",
    "series": [
        {
            "id": 23850,
            "url": "http://patches.dpdk.org/api/series/23850/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=23850",
            "date": "2022-07-01T02:20:05",
            "name": "preparation for the rte_flow offload of nfp PMD",
            "version": 4,
            "mbox": "http://patches.dpdk.org/series/23850/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/113594/comments/",
    "check": "warning",
    "checks": "http://patches.dpdk.org/api/patches/113594/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 4E4A5A0093;\n\tFri,  1 Jul 2022 04:22:31 +0200 (CEST)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 586CE42BA6;\n\tFri,  1 Jul 2022 04:21:30 +0200 (CEST)",
            "from NAM12-MW2-obe.outbound.protection.outlook.com\n (mail-mw2nam12on2126.outbound.protection.outlook.com [40.107.244.126])\n by mails.dpdk.org (Postfix) with ESMTP id BF0C0427EC\n for <dev@dpdk.org>; Fri,  1 Jul 2022 04:21:28 +0200 (CEST)",
            "from SJ0PR13MB5545.namprd13.prod.outlook.com (2603:10b6:a03:424::5)\n by CY4PR13MB1381.namprd13.prod.outlook.com (2603:10b6:903:a0::15)\n with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5395.14; Fri, 1 Jul\n 2022 02:21:27 +0000",
            "from SJ0PR13MB5545.namprd13.prod.outlook.com\n ([fe80::5d9e:9ce5:51d1:2021]) by SJ0PR13MB5545.namprd13.prod.outlook.com\n ([fe80::5d9e:9ce5:51d1:2021%9]) with mapi id 15.20.5395.014; Fri, 1 Jul 2022\n 02:21:27 +0000"
        ],
        "ARC-Seal": "i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none;\n b=Fi+dsE7rdRRirdrOKC2fXslHhfSzGju9WqL5dqMn0nP0PYOlbhq6MBpmbPzLaAHBP4fViHEib/AMBSkF748bI7GT/jWmm9RLelPwZbzjyUauOlt0692u/Rq28jAM/L/eQFPQRdbu7nr4NqdB1b5qges/5Qh7dkaH0z16H3niIt+vyCsng/iLY18QcMx90KoqrkN+G3kU1x7CWXMks9H9tphx4gnZgxbRSIDgVyvQOHeDm7CBTCvA/Q7AgATq8N2yZwaw9AELJXmwtXv+kYTUaKyENi2Lsa2lZ3C5l2l1OeD1JUfsfnZ5TFQ9UEjIdCqk8iWAqy0KhO4cf1ZwIQ+L3Q==",
        "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=6gsUZzSSZHDSx+O11EWx7Bo9aTSvUScc9oylwVdbGbc=;\n b=hFiUTc/pIrMJxiCEOm1Oq63LoLBzxvMcRDjfowK622dtxgE7l3U7kpstoOcHrEhJGBrA+7IKuUf7TAR/la4ekt49myPAd8JydXN612SH6CWW49ft0Qo/kWRuMi3cuRiBQu+k/AnkocDvloYkcGUPqrdlXmCEif25kCUSVkzfRcxxZ2yFpGwUPIkxIyUCgOA1wzSxGhp6NbjJoWXmJIl2EgGw1X9TyJRmWyucqmd2NLzYGqjiEx64paim6Wms3eHrPmv760ntDqDPfz/Ud8yIpEoAWEQSn4FLCGM5fS1eqlQovJd9vPX+aF2t544P8eRphdHXJJ3fUn0eoeaJy8z9SQ==",
        "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=6gsUZzSSZHDSx+O11EWx7Bo9aTSvUScc9oylwVdbGbc=;\n b=sTAjOR/hZCSLiPFPZzNXiNtxI81x6HUqvBu86cnIBEIpvnBdZNqpw1Eg8yI7OueQcMmJY7ziZwSZojeNfSmtkRI8ZWnLs2M8052xzSM9i78VtRxppV0tK0rOezcV+1z/LUJfIUUjMfrWWGMhjnUGQJsqDTLLDfTphHXWs7/YL2s=",
        "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": "niklas.soderlund@corigine.com,\n\tChaoyong He <chaoyong.he@corigine.com>",
        "Subject": "[PATCH v4 12/12] net/nfp: add flower PF rxtx logic",
        "Date": "Fri,  1 Jul 2022 10:20:17 +0800",
        "Message-Id": "<1656642017-8992-13-git-send-email-chaoyong.he@corigine.com>",
        "X-Mailer": "git-send-email 1.8.3.1",
        "In-Reply-To": "<1656642017-8992-1-git-send-email-chaoyong.he@corigine.com>",
        "References": "<1656642017-8992-1-git-send-email-chaoyong.he@corigine.com>",
        "Content-Type": "text/plain; charset=UTF-8",
        "Content-Transfer-Encoding": "8bit",
        "X-ClientProxiedBy": "SG2PR02CA0079.apcprd02.prod.outlook.com\n (2603:1096:4:90::19) To SJ0PR13MB5545.namprd13.prod.outlook.com\n (2603:10b6:a03:424::5)",
        "MIME-Version": "1.0",
        "X-MS-PublicTrafficType": "Email",
        "X-MS-Office365-Filtering-Correlation-Id": "59e44aa5-510d-4c73-2035-08da5b0866e1",
        "X-MS-TrafficTypeDiagnostic": "CY4PR13MB1381:EE_",
        "X-MS-Exchange-SenderADCheck": "1",
        "X-MS-Exchange-AntiSpam-Relay": "0",
        "X-Microsoft-Antispam": "BCL:0;",
        "X-Microsoft-Antispam-Message-Info": "\n ZbZFmTtsJSsCXXgZOqFaCm+glpr4OiqmbDDJWEJMLJ2xaUr2ZqfJq4aAkMYGUELBteBL5soAxm1eoZtBZeYguCmSfoJJENLiC0oIaZI7ku7e1bA5A/1kRCUV54tMu9/1DxFEh2UgfQ9njxw+SP0Vxr4KuLObMNPGU1bZ23hHcLw3zOySn0jqYddBK6/o8/XKN3mX96fPrOSnk0LaPd5zGzFPDbGEOyKIqFWA8RgcBLxWwmsTXCbWfWP91iE3GIhRNDzsCYe0KqFylLC/P3k73k6TzZfC6BU9GoXuI5Wg5kXRi0wsX8GZ5O283XYqBwc3sFXBT3c+4dMQk78vrHYm7hz49ulgn9D1XderzTjr/JEOzl/sd4dCqqayhcDivkpBdbWsslhgV9FPK+kJumkpb893wEH2oc+dWUTylfuDNGlzS7yaBfq+566vvpCexR7lTnJGU33wRvmtvkeG0TBEhi8sBuckVrKth1/tucXDwdMpLuY7ThiDIkjKheZvsX/WK2rRyEPTiAVj4J+ZH85+8TcHE9b8kaBydCCQDcCMpIiL5Ttmqgmy7bPEfEjiiUmxDtvHS/MXgKTincyIGz0dBz8xQiGmGwDglNpNEJYYnbmmMGjtnKC1za0K07xQduqmgdNtJ8MKt7ndkSXi271Z8Yh+eGvyVBXOlXaocdCrHNRbL3FoSZdvBQyWINzhQpUmzhFMt0l+mnrbNFiy045Utn9GgzdQni5+rh1Ur643HzrTcVDSyktztnznzQ091kyC+N4tjjMIrMwur5XY246/QmvlsxNJ4eZ/PzAwi3onzCQ53ygxkQ1TGtJaJNH7a4I4",
        "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)(376002)(346002)(136003)(39840400004)(396003)(366004)(2616005)(6486002)(8936002)(2906002)(478600001)(5660300002)(186003)(86362001)(107886003)(30864003)(41300700001)(44832011)(66574015)(83380400001)(6506007)(6666004)(8676002)(66476007)(66556008)(38100700002)(38350700002)(66946007)(316002)(36756003)(4326008)(6916009)(6512007)(26005)(52116002);\n DIR:OUT; SFP:1102;",
        "X-MS-Exchange-AntiSpam-MessageData-ChunkCount": "1",
        "X-MS-Exchange-AntiSpam-MessageData-0": "=?utf-8?q?HD7DICbrKHJGDBraodpEL57Xyt2d?=\n\t=?utf-8?q?Xho80q64oguR+lqhO+CiHLE4uNFB/ry5VUHl1v3BdJL8mIWjvC3WjT74rlxDq3YYi?=\n\t=?utf-8?q?a/ujHUiKJvLzK8Tkilokr7gN2E6x+1vZc09PmKC2Sj2b8AdmQO97uroZ6mU8oHNNn?=\n\t=?utf-8?q?G7kHWkW2p1oKY4ntdCcKO2xIwjhnUx6W3dDm0kJi87onWva5/l2xdkqGbzDCnvAy7?=\n\t=?utf-8?q?zIYBTFnE1QHLRORl9mDWRRa3BMa8nssBySHdH7WDeYVs7vWuto8xGxALcKeg+2uPb?=\n\t=?utf-8?q?Y3hHshZijkJC5tjOul0hUOdNuxdpynIgC1DadLCXIQKk5fS5H/B6YLC2cG/peZLTp?=\n\t=?utf-8?q?s5w6TaqPCaEXSivD/f0yu8XLrYxNFmvuty1g3a5hwpPTRvdfSGEkzMax77VqNWjE/?=\n\t=?utf-8?q?xW60tJMJZHBZTKpxtbfuyYJ8lt442rdlHRAhJda9XeN4za8nFSLCQVDr1IeyfMQJL?=\n\t=?utf-8?q?3I7V7InSVxux2/UZ3pHmYblqlScAnz+VOPirKHUa0gY43a8/6k8ljH93yPwCPjACr?=\n\t=?utf-8?q?gDXrNUVK451ANq2guswYXXUjpNHPo3EUn0TfQO+8bLkeqQn2Zs5QfWaUi9dlYIG9/?=\n\t=?utf-8?q?HC78F63Ktn2Hx5O6AZqKL+7BvfXPdG/FwwjP//iOQrkQMXpwDqHE5CTtg7nTJzBY+?=\n\t=?utf-8?q?9zVS4WLsNxTZ/tc4XXWqxWkafE3luto/28SXqCRc0CxCO01Ot/nHmBDsK7JfUCyNj?=\n\t=?utf-8?q?fr6VI1PzujhTRBauvm/+G2HMp0emYBI3UR3lEA6keq4fTT2pwv42qUWWRSfzmjdIO?=\n\t=?utf-8?q?eBq+YbKg+LA8BA6mCi+3GhH+ujHRR+TAD0/yK7igCmpXC5v8d1Ft/AxqkU3AWvdBF?=\n\t=?utf-8?q?TfzTK2kvpk2XVVqr6OgdApJlwaWNdcbHKdDV4x2cQq1LIcf2mX+ZfYt6/e5eXV9nk?=\n\t=?utf-8?q?KkWirozAO97Y8fyaoURprvcp4fWM7WVPjbS/mwuWRhEJ697pp/q0Q0NK7zw1N3qoK?=\n\t=?utf-8?q?KbAWunZ8zyye63bqPaEGfGCOsJ7TST2c6IbX7p+Fd+25HbKT+hKTemfM4DbT3rHdF?=\n\t=?utf-8?q?eidmeKm5QhxU2hw1lx2q2AxmFWe+ESURSc2UUlkEOy2FKfdDPwE5PHvCAubgojHDX?=\n\t=?utf-8?q?3ySC3XrUCADjd9wn0Kwo3MG4qprnR6U2UkaTJoqiSCMr6CZzuT8bQk4oqjeu4pzcH?=\n\t=?utf-8?q?NPxvIzO5m2C+qtZoj7/MhNiluMHRZRRneYim5pWjwC/xZm6rYNeIlEhu7KJUGuMoK?=\n\t=?utf-8?q?1N11g84Tqz4HvQMBisMthMIjEUx7n6jUF5F21sIappXk49QbT88rSecosYYDkHfSh?=\n\t=?utf-8?q?19JaicI4fO7XXa7cWYcBY5OHMOMtg1nuiFiyvCcwuJm4xPQFyK8EN8diMp0sqyVOC?=\n\t=?utf-8?q?ckoofwoJgbUg+qWIfMhWEzH0Fc42VT+YsL2eDUoKv7fQr/KbPrP4apt7IC05PrsCw?=\n\t=?utf-8?q?tnb/s1kGVX/Qj+nwXsTuflaz1lgDfKBS6x8rZ/1stf2v0uT/VmwzhKSzP0J4EO0ci?=\n\t=?utf-8?q?MTqGSdGEQb/rAFRRcjdWueTYZkfE+dmQN8wX2tEhjDZ7t106yKP23V1cw0ltiABnB?=\n\t=?utf-8?q?+QOTX5bv/FrEXEypu5yD7w+KFX6qaJ7vnQ=3D=3D?=",
        "X-OriginatorOrg": "corigine.com",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "\n 59e44aa5-510d-4c73-2035-08da5b0866e1",
        "X-MS-Exchange-CrossTenant-AuthSource": "SJ0PR13MB5545.namprd13.prod.outlook.com",
        "X-MS-Exchange-CrossTenant-AuthAs": "Internal",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "01 Jul 2022 02:21:27.1179 (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 /czVBUJxppfWhceVSc7h4aG56wYwst58jhIzHxgS9hJLehcqPTCsTBfwUskhLAmnn9k1aeLDw21pKCiaBHUGVwF7Sipzf99CXITR6qSQdYA=",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "CY4PR13MB1381",
        "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": "This commit implements the flower Rx logic. Fallback packets are\nmultiplexed to the correct representor port based on the prepended\nmetadata. The Rx poll is set to run on the existing service\ninfrastructure.\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 drivers/net/nfp/flower/nfp_flower.c | 430 ++++++++++++++++++++++++++++++++++++\n drivers/net/nfp/flower/nfp_flower.h |   1 +\n 2 files changed, 431 insertions(+)",
    "diff": "diff --git a/drivers/net/nfp/flower/nfp_flower.c b/drivers/net/nfp/flower/nfp_flower.c\nindex 7034d45..f321003 100644\n--- a/drivers/net/nfp/flower/nfp_flower.c\n+++ b/drivers/net/nfp/flower/nfp_flower.c\n@@ -23,6 +23,7 @@\n #include \"nfp_flower_ovs_compat.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 MEMPOOL_CACHE_SIZE 512\n@@ -218,6 +219,44 @@\n \t.link_update            = nfp_flower_pf_link_update,\n };\n \n+static void\n+nfp_flower_pf_vnic_poll(struct nfp_app_flower *app_flower)\n+{\n+\tuint16_t i;\n+\tuint16_t count;\n+\tuint16_t n_rxq;\n+\tuint16_t port_id;\n+\tstruct nfp_net_hw *pf_hw;\n+\tstruct rte_mbuf *pkts_burst[MAX_PKT_BURST];\n+\n+\tpf_hw = app_flower->pf_hw;\n+\n+\tn_rxq = pf_hw->eth_dev->data->nb_rx_queues;\n+\tport_id = pf_hw->eth_dev->data->port_id;\n+\n+\t/* Add ability to run Rx queues on multiple service cores? */\n+\tfor (i = 0; i < n_rxq; i++) {\n+\t\tcount = rte_eth_rx_burst(port_id, i, pkts_burst, MAX_PKT_BURST);\n+\n+\t\t/*\n+\t\t * Don't expect packets here but free them in case they have\n+\t\t * not been multiplexed to a representor\n+\t\t */\n+\t\tif (unlikely(count > 0))\n+\t\t\trte_pktmbuf_free_bulk(pkts_burst, count);\n+\t}\n+}\n+\n+static int\n+nfp_flower_pf_vnic_service(void *arg)\n+{\n+\tstruct nfp_app_flower *app_flower = arg;\n+\n+\tnfp_flower_pf_vnic_poll(app_flower);\n+\n+\treturn 0;\n+}\n+\n static int\n nfp_flower_ctrl_vnic_service(void *arg)\n {\n@@ -229,6 +268,10 @@\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@@ -265,6 +308,389 @@\n \treturn ret;\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_flower *app_flower;\n+\n+\t/* Obtain handle to app_flower here */\n+\tapp_flower = NFP_APP_PRIV_TO_APP_FLOWER(hw->pf_dev->app_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_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_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   rxds->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\treturn 0;\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 +\n+\t\t\t\t\tNFP_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 |\n+\t\t\t\t\tRTE_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)) /* wrapping?*/\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   rxq->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   rxq->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;\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+\n+\ti = 0;\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_TX_LOG(INFO, \"NFP_NET_CFG_CTRL_GATHER not set\");\n+\t\t\tPMD_TX_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+\t\t\tPMD_TX_LOG(DEBUG, \"Working with mbuf at dma address: %\"\n+\t\t\t\t\tPRIx64 \"\", dma_addr);\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 |\n+\t\t\t\t\t\tFLOWER_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 static void\n nfp_flower_pf_mp_init(__rte_unused struct rte_mempool *mp,\n \t\t__rte_unused void *opaque_arg,\n@@ -502,6 +928,8 @@\n \n \t/* Add Rx/Tx functions */\n \teth_dev->dev_ops = &nfp_flower_pf_dev_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\",\n@@ -1129,6 +1557,8 @@\n \n \teth_dev->process_private = cpp;\n \teth_dev->dev_ops = &nfp_flower_pf_dev_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 24fced3..4ac89d1 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": [
        "v4",
        "12/12"
    ]
}