get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 94727,
    "url": "https://patches.dpdk.org/api/patches/94727/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/20210623044702.4240-32-ndabilpuram@marvell.com/",
    "project": {
        "id": 1,
        "url": "https://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": "<20210623044702.4240-32-ndabilpuram@marvell.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20210623044702.4240-32-ndabilpuram@marvell.com",
    "date": "2021-06-23T04:46:31",
    "name": "[v4,31/62] net/cnxk: add device start and stop operations",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "5e6bb036773ccad58105ad7c4fc08df459b89f12",
    "submitter": {
        "id": 1202,
        "url": "https://patches.dpdk.org/api/people/1202/?format=api",
        "name": "Nithin Dabilpuram",
        "email": "ndabilpuram@marvell.com"
    },
    "delegate": {
        "id": 310,
        "url": "https://patches.dpdk.org/api/users/310/?format=api",
        "username": "jerin",
        "first_name": "Jerin",
        "last_name": "Jacob",
        "email": "jerinj@marvell.com"
    },
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/20210623044702.4240-32-ndabilpuram@marvell.com/mbox/",
    "series": [
        {
            "id": 17449,
            "url": "https://patches.dpdk.org/api/series/17449/?format=api",
            "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=17449",
            "date": "2021-06-23T04:46:00",
            "name": "Marvell CNXK Ethdev Driver",
            "version": 4,
            "mbox": "https://patches.dpdk.org/series/17449/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/94727/comments/",
    "check": "success",
    "checks": "https://patches.dpdk.org/api/patches/94727/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 1C834A0C41;\n\tWed, 23 Jun 2021 06:51:00 +0200 (CEST)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id DBCE14118B;\n\tWed, 23 Jun 2021 06:49:04 +0200 (CEST)",
            "from mx0b-0016f401.pphosted.com (mx0a-0016f401.pphosted.com\n [67.231.148.174])\n by mails.dpdk.org (Postfix) with ESMTP id DB06B4114C\n for <dev@dpdk.org>; Wed, 23 Jun 2021 06:49:02 +0200 (CEST)",
            "from pps.filterd (m0045849.ppops.net [127.0.0.1])\n by mx0a-0016f401.pphosted.com (8.16.0.43/8.16.0.43) with SMTP id\n 15N4jY9b026990 for <dev@dpdk.org>; Tue, 22 Jun 2021 21:49:02 -0700",
            "from dc5-exch01.marvell.com ([199.233.59.181])\n by mx0a-0016f401.pphosted.com with ESMTP id 39bx5j80tk-1\n (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT)\n for <dev@dpdk.org>; Tue, 22 Jun 2021 21:49:01 -0700",
            "from DC5-EXCH01.marvell.com (10.69.176.38) by DC5-EXCH01.marvell.com\n (10.69.176.38) with Microsoft SMTP Server (TLS) id 15.0.1497.18;\n Tue, 22 Jun 2021 21:49:00 -0700",
            "from maili.marvell.com (10.69.176.80) by DC5-EXCH01.marvell.com\n (10.69.176.38) with Microsoft SMTP Server id 15.0.1497.18 via Frontend\n Transport; Tue, 22 Jun 2021 21:49:00 -0700",
            "from hyd1588t430.marvell.com (unknown [10.29.52.204])\n by maili.marvell.com (Postfix) with ESMTP id 80FDE5B6939;\n Tue, 22 Jun 2021 21:48:57 -0700 (PDT)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=marvell.com;\n h=from : to : cc :\n subject : date : message-id : in-reply-to : references : mime-version :\n content-type; s=pfpt0220; bh=ukWXV/C0guOu59dByvrV4UN/ou7jptU9LWTNPan7VtE=;\n b=fMeBAv3b53nLZ0lwoKSQvWyR7j4dyNBgjZj2BxuMRMLuoo0cFcmN2zzOnATI2tuNj2wA\n UHKyT8VzdJqdFlbXOSVp2g6IpcFBtkxOKyvwef7bzp7KE2eNpyHEqXjZjEKZFtq6ATT7\n s+GcQ9UA6SDu2XxxgVunpYrQhEtKgonacjzDZsh9POba4v3Rm+MrZ71uP8rzDvLKPWhz\n C4bFDcR2aWAVgCfNU/4AQTWKQjrHuf/od8PxHSprDpK3uJbfPRffhpmgwGAHga0HT7+y\n lmn6hkP3kE5FbVQHdEGrBPGCYNxuUmoryM4zdM98kOsi75RbUOU/tQQ+txJHCa8iMf6Y cg==",
        "From": "Nithin Dabilpuram <ndabilpuram@marvell.com>",
        "To": "<dev@dpdk.org>",
        "CC": "<jerinj@marvell.com>, <skori@marvell.com>, <skoteshwar@marvell.com>,\n <pbhagavatula@marvell.com>, <kirankumark@marvell.com>,\n <psatheesh@marvell.com>, <asekhar@marvell.com>, <hkalra@marvell.com>,\n \"Nithin Dabilpuram\" <ndabilpuram@marvell.com>",
        "Date": "Wed, 23 Jun 2021 10:16:31 +0530",
        "Message-ID": "<20210623044702.4240-32-ndabilpuram@marvell.com>",
        "X-Mailer": "git-send-email 2.8.4",
        "In-Reply-To": "<20210623044702.4240-1-ndabilpuram@marvell.com>",
        "References": "<20210306153404.10781-1-ndabilpuram@marvell.com>\n <20210623044702.4240-1-ndabilpuram@marvell.com>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain",
        "X-Proofpoint-ORIG-GUID": "esc_bNfWKkXkoRXYwLtG6G-8cNBiEX2m",
        "X-Proofpoint-GUID": "esc_bNfWKkXkoRXYwLtG6G-8cNBiEX2m",
        "X-Proofpoint-Virus-Version": "vendor=fsecure engine=2.50.10434:6.0.391, 18.0.790\n definitions=2021-06-23_01:2021-06-22,\n 2021-06-23 signatures=0",
        "Subject": "[dpdk-dev] [PATCH v4 31/62] net/cnxk: add device start and stop\n operations",
        "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",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "Add device start and stop operation callbacks for\nCN9K and CN10K. Device stop is common for both platforms\nwhile device start as some platform dependent portion where\nthe platform specific offload flags are recomputed and\nthe right Rx/Tx burst function is chosen.\n\nSigned-off-by: Nithin Dabilpuram <ndabilpuram@marvell.com>\n---\n doc/guides/nics/cnxk.rst        |  84 ++++++++++++++++++++++++++\n drivers/net/cnxk/cn10k_ethdev.c | 124 +++++++++++++++++++++++++++++++++++++++\n drivers/net/cnxk/cn9k_ethdev.c  | 127 ++++++++++++++++++++++++++++++++++++++++\n drivers/net/cnxk/cnxk_ethdev.c  |  90 ++++++++++++++++++++++++++++\n drivers/net/cnxk/cnxk_ethdev.h  |   2 +\n drivers/net/cnxk/cnxk_link.c    |  11 ++++\n 6 files changed, 438 insertions(+)",
    "diff": "diff --git a/doc/guides/nics/cnxk.rst b/doc/guides/nics/cnxk.rst\nindex 17da141..15911ee 100644\n--- a/doc/guides/nics/cnxk.rst\n+++ b/doc/guides/nics/cnxk.rst\n@@ -39,6 +39,58 @@ Driver compilation and testing\n Refer to the document :ref:`compiling and testing a PMD for a NIC <pmd_build_and_test>`\n for details.\n \n+#. Running testpmd:\n+\n+   Follow instructions available in the document\n+   :ref:`compiling and testing a PMD for a NIC <pmd_build_and_test>`\n+   to run testpmd.\n+\n+   Example output:\n+\n+   .. code-block:: console\n+\n+      ./<build_dir>/app/dpdk-testpmd -c 0xc -a 0002:02:00.0 -- --portmask=0x1 --nb-cores=1 --port-topology=loop --rxq=1 --txq=1\n+      EAL: Detected 4 lcore(s)\n+      EAL: Detected 1 NUMA nodes\n+      EAL: Multi-process socket /var/run/dpdk/rte/mp_socket\n+      EAL: Selected IOVA mode 'VA'\n+      EAL: No available hugepages reported in hugepages-16777216kB\n+      EAL: No available hugepages reported in hugepages-2048kB\n+      EAL: Probing VFIO support...\n+      EAL: VFIO support initialized\n+      EAL:   using IOMMU type 1 (Type 1)\n+      [ 2003.202721] vfio-pci 0002:02:00.0: vfio_cap_init: hiding cap 0x14@0x98\n+      EAL: Probe PCI driver: net_cn10k (177d:a063) device: 0002:02:00.0 (socket 0)\n+      PMD: RoC Model: cn10k\n+      EAL: No legacy callbacks, legacy socket not created\n+      testpmd: create a new mbuf pool <mb_pool_0>: n=155456, size=2176, socket=0\n+      testpmd: preferred mempool ops selected: cn10k_mempool_ops\n+      Configuring Port 0 (socket 0)\n+      PMD: Port 0: Link Up - speed 25000 Mbps - full-duplex\n+\n+      Port 0: link state change event\n+      Port 0: 96:D4:99:72:A5:BF\n+      Checking link statuses...\n+      Done\n+      No commandline core given, start packet forwarding\n+      io packet forwarding - ports=1 - cores=1 - streams=1 - NUMA support enabled, MP allocation mode: native\n+      Logical Core 3 (socket 0) forwards packets on 1 streams:\n+        RX P=0/Q=0 (socket 0) -> TX P=0/Q=0 (socket 0) peer=02:00:00:00:00:00\n+\n+        io packet forwarding packets/burst=32\n+        nb forwarding cores=1 - nb forwarding ports=1\n+        port 0: RX queue number: 1 Tx queue number: 1\n+          Rx offloads=0x0 Tx offloads=0x10000\n+          RX queue: 0\n+            RX desc=4096 - RX free threshold=0\n+            RX threshold registers: pthresh=0 hthresh=0  wthresh=0\n+            RX Offloads=0x0\n+          TX queue: 0\n+            TX desc=512 - TX free threshold=0\n+            TX threshold registers: pthresh=0 hthresh=0  wthresh=0\n+            TX offloads=0x0 - TX RS bit threshold=0\n+      Press enter to exit\n+\n Runtime Config Options\n ----------------------\n \n@@ -132,3 +184,35 @@ Runtime Config Options\n    Above devarg parameters are configurable per device, user needs to pass the\n    parameters to all the PCIe devices if application requires to configure on\n    all the ethdev ports.\n+\n+Limitations\n+-----------\n+\n+``mempool_cnxk`` external mempool handler dependency\n+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n+\n+The OCTEON CN9K/CN10K SoC family NIC has inbuilt HW assisted external mempool manager.\n+``net_cnxk`` pmd only works with ``mempool_cnxk`` mempool handler\n+as it is performance wise most effective way for packet allocation and Tx buffer\n+recycling on OCTEON TX2 SoC platform.\n+\n+CRC stripping\n+~~~~~~~~~~~~~\n+\n+The OCTEON CN9K/CN10K SoC family NICs strip the CRC for every packet being received by\n+the host interface irrespective of the offload configuration.\n+\n+Debugging Options\n+-----------------\n+\n+.. _table_cnxk_ethdev_debug_options:\n+\n+.. table:: cnxk ethdev debug options\n+\n+   +---+------------+-------------------------------------------------------+\n+   | # | Component  | EAL log command                                       |\n+   +===+============+=======================================================+\n+   | 1 | NIX        | --log-level='pmd\\.net.cnxk,8'                         |\n+   +---+------------+-------------------------------------------------------+\n+   | 2 | NPC        | --log-level='pmd\\.net.cnxk\\.flow,8'                   |\n+   +---+------------+-------------------------------------------------------+\ndiff --git a/drivers/net/cnxk/cn10k_ethdev.c b/drivers/net/cnxk/cn10k_ethdev.c\nindex d70ab00..5ff36bb 100644\n--- a/drivers/net/cnxk/cn10k_ethdev.c\n+++ b/drivers/net/cnxk/cn10k_ethdev.c\n@@ -5,6 +5,98 @@\n #include \"cn10k_rx.h\"\n #include \"cn10k_tx.h\"\n \n+static uint16_t\n+nix_rx_offload_flags(struct rte_eth_dev *eth_dev)\n+{\n+\tstruct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);\n+\tstruct rte_eth_dev_data *data = eth_dev->data;\n+\tstruct rte_eth_conf *conf = &data->dev_conf;\n+\tstruct rte_eth_rxmode *rxmode = &conf->rxmode;\n+\tuint16_t flags = 0;\n+\n+\tif (rxmode->mq_mode == ETH_MQ_RX_RSS &&\n+\t    (dev->rx_offloads & DEV_RX_OFFLOAD_RSS_HASH))\n+\t\tflags |= NIX_RX_OFFLOAD_RSS_F;\n+\n+\tif (dev->rx_offloads &\n+\t    (DEV_RX_OFFLOAD_TCP_CKSUM | DEV_RX_OFFLOAD_UDP_CKSUM))\n+\t\tflags |= NIX_RX_OFFLOAD_CHECKSUM_F;\n+\n+\tif (dev->rx_offloads &\n+\t    (DEV_RX_OFFLOAD_IPV4_CKSUM | DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM))\n+\t\tflags |= NIX_RX_OFFLOAD_CHECKSUM_F;\n+\n+\tif (dev->rx_offloads & DEV_RX_OFFLOAD_SCATTER)\n+\t\tflags |= NIX_RX_MULTI_SEG_F;\n+\n+\tif (!dev->ptype_disable)\n+\t\tflags |= NIX_RX_OFFLOAD_PTYPE_F;\n+\n+\treturn flags;\n+}\n+\n+static uint16_t\n+nix_tx_offload_flags(struct rte_eth_dev *eth_dev)\n+{\n+\tstruct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);\n+\tuint64_t conf = dev->tx_offloads;\n+\tuint16_t flags = 0;\n+\n+\t/* Fastpath is dependent on these enums */\n+\tRTE_BUILD_BUG_ON(PKT_TX_TCP_CKSUM != (1ULL << 52));\n+\tRTE_BUILD_BUG_ON(PKT_TX_SCTP_CKSUM != (2ULL << 52));\n+\tRTE_BUILD_BUG_ON(PKT_TX_UDP_CKSUM != (3ULL << 52));\n+\tRTE_BUILD_BUG_ON(PKT_TX_IP_CKSUM != (1ULL << 54));\n+\tRTE_BUILD_BUG_ON(PKT_TX_IPV4 != (1ULL << 55));\n+\tRTE_BUILD_BUG_ON(PKT_TX_OUTER_IP_CKSUM != (1ULL << 58));\n+\tRTE_BUILD_BUG_ON(PKT_TX_OUTER_IPV4 != (1ULL << 59));\n+\tRTE_BUILD_BUG_ON(PKT_TX_OUTER_IPV6 != (1ULL << 60));\n+\tRTE_BUILD_BUG_ON(PKT_TX_OUTER_UDP_CKSUM != (1ULL << 41));\n+\tRTE_BUILD_BUG_ON(RTE_MBUF_L2_LEN_BITS != 7);\n+\tRTE_BUILD_BUG_ON(RTE_MBUF_L3_LEN_BITS != 9);\n+\tRTE_BUILD_BUG_ON(RTE_MBUF_OUTL2_LEN_BITS != 7);\n+\tRTE_BUILD_BUG_ON(RTE_MBUF_OUTL3_LEN_BITS != 9);\n+\tRTE_BUILD_BUG_ON(offsetof(struct rte_mbuf, data_off) !=\n+\t\t\t offsetof(struct rte_mbuf, buf_iova) + 8);\n+\tRTE_BUILD_BUG_ON(offsetof(struct rte_mbuf, ol_flags) !=\n+\t\t\t offsetof(struct rte_mbuf, buf_iova) + 16);\n+\tRTE_BUILD_BUG_ON(offsetof(struct rte_mbuf, pkt_len) !=\n+\t\t\t offsetof(struct rte_mbuf, ol_flags) + 12);\n+\tRTE_BUILD_BUG_ON(offsetof(struct rte_mbuf, tx_offload) !=\n+\t\t\t offsetof(struct rte_mbuf, pool) + 2 * sizeof(void *));\n+\n+\tif (conf & DEV_TX_OFFLOAD_VLAN_INSERT ||\n+\t    conf & DEV_TX_OFFLOAD_QINQ_INSERT)\n+\t\tflags |= NIX_TX_OFFLOAD_VLAN_QINQ_F;\n+\n+\tif (conf & DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM ||\n+\t    conf & DEV_TX_OFFLOAD_OUTER_UDP_CKSUM)\n+\t\tflags |= NIX_TX_OFFLOAD_OL3_OL4_CSUM_F;\n+\n+\tif (conf & DEV_TX_OFFLOAD_IPV4_CKSUM ||\n+\t    conf & DEV_TX_OFFLOAD_TCP_CKSUM ||\n+\t    conf & DEV_TX_OFFLOAD_UDP_CKSUM || conf & DEV_TX_OFFLOAD_SCTP_CKSUM)\n+\t\tflags |= NIX_TX_OFFLOAD_L3_L4_CSUM_F;\n+\n+\tif (!(conf & DEV_TX_OFFLOAD_MBUF_FAST_FREE))\n+\t\tflags |= NIX_TX_OFFLOAD_MBUF_NOFF_F;\n+\n+\tif (conf & DEV_TX_OFFLOAD_MULTI_SEGS)\n+\t\tflags |= NIX_TX_MULTI_SEG_F;\n+\n+\t/* Enable Inner checksum for TSO */\n+\tif (conf & DEV_TX_OFFLOAD_TCP_TSO)\n+\t\tflags |= (NIX_TX_OFFLOAD_TSO_F | NIX_TX_OFFLOAD_L3_L4_CSUM_F);\n+\n+\t/* Enable Inner and Outer checksum for Tunnel TSO */\n+\tif (conf & (DEV_TX_OFFLOAD_VXLAN_TNL_TSO |\n+\t\t    DEV_TX_OFFLOAD_GENEVE_TNL_TSO | DEV_TX_OFFLOAD_GRE_TNL_TSO))\n+\t\tflags |= (NIX_TX_OFFLOAD_TSO_F | NIX_TX_OFFLOAD_OL3_OL4_CSUM_F |\n+\t\t\t  NIX_TX_OFFLOAD_L3_L4_CSUM_F);\n+\n+\treturn flags;\n+}\n+\n static int\n cn10k_nix_ptypes_set(struct rte_eth_dev *eth_dev, uint32_t ptype_mask)\n {\n@@ -18,6 +110,7 @@ cn10k_nix_ptypes_set(struct rte_eth_dev *eth_dev, uint32_t ptype_mask)\n \t\tdev->ptype_disable = 1;\n \t}\n \n+\tcn10k_eth_set_rx_function(eth_dev);\n \treturn 0;\n }\n \n@@ -163,6 +256,10 @@ cn10k_nix_configure(struct rte_eth_dev *eth_dev)\n \tif (rc)\n \t\treturn rc;\n \n+\t/* Update offload flags */\n+\tdev->rx_offload_flags = nix_rx_offload_flags(eth_dev);\n+\tdev->tx_offload_flags = nix_tx_offload_flags(eth_dev);\n+\n \tplt_nix_dbg(\"Configured port%d platform specific rx_offload_flags=%x\"\n \t\t    \" tx_offload_flags=0x%x\",\n \t\t    eth_dev->data->port_id, dev->rx_offload_flags,\n@@ -170,6 +267,28 @@ cn10k_nix_configure(struct rte_eth_dev *eth_dev)\n \treturn 0;\n }\n \n+static int\n+cn10k_nix_dev_start(struct rte_eth_dev *eth_dev)\n+{\n+\tstruct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);\n+\tint rc;\n+\n+\t/* Common eth dev start */\n+\trc = cnxk_nix_dev_start(eth_dev);\n+\tif (rc)\n+\t\treturn rc;\n+\n+\t/* Setting up the rx[tx]_offload_flags due to change\n+\t * in rx[tx]_offloads.\n+\t */\n+\tdev->rx_offload_flags |= nix_rx_offload_flags(eth_dev);\n+\tdev->tx_offload_flags |= nix_tx_offload_flags(eth_dev);\n+\n+\tcn10k_eth_set_tx_function(eth_dev);\n+\tcn10k_eth_set_rx_function(eth_dev);\n+\treturn 0;\n+}\n+\n /* Update platform specific eth dev ops */\n static void\n nix_eth_dev_ops_override(void)\n@@ -185,6 +304,7 @@ nix_eth_dev_ops_override(void)\n \tcnxk_eth_dev_ops.tx_queue_setup = cn10k_nix_tx_queue_setup;\n \tcnxk_eth_dev_ops.rx_queue_setup = cn10k_nix_rx_queue_setup;\n \tcnxk_eth_dev_ops.tx_queue_stop = cn10k_nix_tx_queue_stop;\n+\tcnxk_eth_dev_ops.dev_start = cn10k_nix_dev_start;\n \tcnxk_eth_dev_ops.dev_ptypes_set = cn10k_nix_ptypes_set;\n }\n \n@@ -222,6 +342,10 @@ cn10k_nix_probe(struct rte_pci_driver *pci_drv, struct rte_pci_device *pci_dev)\n \t\teth_dev = rte_eth_dev_allocated(pci_dev->device.name);\n \t\tif (!eth_dev)\n \t\t\treturn -ENOENT;\n+\n+\t\t/* Setup callbacks for secondary process */\n+\t\tcn10k_eth_set_tx_function(eth_dev);\n+\t\tcn10k_eth_set_rx_function(eth_dev);\n \t}\n \treturn 0;\n }\ndiff --git a/drivers/net/cnxk/cn9k_ethdev.c b/drivers/net/cnxk/cn9k_ethdev.c\nindex 806e95f..2157dca 100644\n--- a/drivers/net/cnxk/cn9k_ethdev.c\n+++ b/drivers/net/cnxk/cn9k_ethdev.c\n@@ -5,6 +5,98 @@\n #include \"cn9k_rx.h\"\n #include \"cn9k_tx.h\"\n \n+static uint16_t\n+nix_rx_offload_flags(struct rte_eth_dev *eth_dev)\n+{\n+\tstruct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);\n+\tstruct rte_eth_dev_data *data = eth_dev->data;\n+\tstruct rte_eth_conf *conf = &data->dev_conf;\n+\tstruct rte_eth_rxmode *rxmode = &conf->rxmode;\n+\tuint16_t flags = 0;\n+\n+\tif (rxmode->mq_mode == ETH_MQ_RX_RSS &&\n+\t    (dev->rx_offloads & DEV_RX_OFFLOAD_RSS_HASH))\n+\t\tflags |= NIX_RX_OFFLOAD_RSS_F;\n+\n+\tif (dev->rx_offloads &\n+\t    (DEV_RX_OFFLOAD_TCP_CKSUM | DEV_RX_OFFLOAD_UDP_CKSUM))\n+\t\tflags |= NIX_RX_OFFLOAD_CHECKSUM_F;\n+\n+\tif (dev->rx_offloads &\n+\t    (DEV_RX_OFFLOAD_IPV4_CKSUM | DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM))\n+\t\tflags |= NIX_RX_OFFLOAD_CHECKSUM_F;\n+\n+\tif (dev->rx_offloads & DEV_RX_OFFLOAD_SCATTER)\n+\t\tflags |= NIX_RX_MULTI_SEG_F;\n+\n+\tif (!dev->ptype_disable)\n+\t\tflags |= NIX_RX_OFFLOAD_PTYPE_F;\n+\n+\treturn flags;\n+}\n+\n+static uint16_t\n+nix_tx_offload_flags(struct rte_eth_dev *eth_dev)\n+{\n+\tstruct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);\n+\tuint64_t conf = dev->tx_offloads;\n+\tuint16_t flags = 0;\n+\n+\t/* Fastpath is dependent on these enums */\n+\tRTE_BUILD_BUG_ON(PKT_TX_TCP_CKSUM != (1ULL << 52));\n+\tRTE_BUILD_BUG_ON(PKT_TX_SCTP_CKSUM != (2ULL << 52));\n+\tRTE_BUILD_BUG_ON(PKT_TX_UDP_CKSUM != (3ULL << 52));\n+\tRTE_BUILD_BUG_ON(PKT_TX_IP_CKSUM != (1ULL << 54));\n+\tRTE_BUILD_BUG_ON(PKT_TX_IPV4 != (1ULL << 55));\n+\tRTE_BUILD_BUG_ON(PKT_TX_OUTER_IP_CKSUM != (1ULL << 58));\n+\tRTE_BUILD_BUG_ON(PKT_TX_OUTER_IPV4 != (1ULL << 59));\n+\tRTE_BUILD_BUG_ON(PKT_TX_OUTER_IPV6 != (1ULL << 60));\n+\tRTE_BUILD_BUG_ON(PKT_TX_OUTER_UDP_CKSUM != (1ULL << 41));\n+\tRTE_BUILD_BUG_ON(RTE_MBUF_L2_LEN_BITS != 7);\n+\tRTE_BUILD_BUG_ON(RTE_MBUF_L3_LEN_BITS != 9);\n+\tRTE_BUILD_BUG_ON(RTE_MBUF_OUTL2_LEN_BITS != 7);\n+\tRTE_BUILD_BUG_ON(RTE_MBUF_OUTL3_LEN_BITS != 9);\n+\tRTE_BUILD_BUG_ON(offsetof(struct rte_mbuf, data_off) !=\n+\t\t\t offsetof(struct rte_mbuf, buf_iova) + 8);\n+\tRTE_BUILD_BUG_ON(offsetof(struct rte_mbuf, ol_flags) !=\n+\t\t\t offsetof(struct rte_mbuf, buf_iova) + 16);\n+\tRTE_BUILD_BUG_ON(offsetof(struct rte_mbuf, pkt_len) !=\n+\t\t\t offsetof(struct rte_mbuf, ol_flags) + 12);\n+\tRTE_BUILD_BUG_ON(offsetof(struct rte_mbuf, tx_offload) !=\n+\t\t\t offsetof(struct rte_mbuf, pool) + 2 * sizeof(void *));\n+\n+\tif (conf & DEV_TX_OFFLOAD_VLAN_INSERT ||\n+\t    conf & DEV_TX_OFFLOAD_QINQ_INSERT)\n+\t\tflags |= NIX_TX_OFFLOAD_VLAN_QINQ_F;\n+\n+\tif (conf & DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM ||\n+\t    conf & DEV_TX_OFFLOAD_OUTER_UDP_CKSUM)\n+\t\tflags |= NIX_TX_OFFLOAD_OL3_OL4_CSUM_F;\n+\n+\tif (conf & DEV_TX_OFFLOAD_IPV4_CKSUM ||\n+\t    conf & DEV_TX_OFFLOAD_TCP_CKSUM ||\n+\t    conf & DEV_TX_OFFLOAD_UDP_CKSUM || conf & DEV_TX_OFFLOAD_SCTP_CKSUM)\n+\t\tflags |= NIX_TX_OFFLOAD_L3_L4_CSUM_F;\n+\n+\tif (!(conf & DEV_TX_OFFLOAD_MBUF_FAST_FREE))\n+\t\tflags |= NIX_TX_OFFLOAD_MBUF_NOFF_F;\n+\n+\tif (conf & DEV_TX_OFFLOAD_MULTI_SEGS)\n+\t\tflags |= NIX_TX_MULTI_SEG_F;\n+\n+\t/* Enable Inner checksum for TSO */\n+\tif (conf & DEV_TX_OFFLOAD_TCP_TSO)\n+\t\tflags |= (NIX_TX_OFFLOAD_TSO_F | NIX_TX_OFFLOAD_L3_L4_CSUM_F);\n+\n+\t/* Enable Inner and Outer checksum for Tunnel TSO */\n+\tif (conf & (DEV_TX_OFFLOAD_VXLAN_TNL_TSO |\n+\t\t    DEV_TX_OFFLOAD_GENEVE_TNL_TSO | DEV_TX_OFFLOAD_GRE_TNL_TSO))\n+\t\tflags |= (NIX_TX_OFFLOAD_TSO_F | NIX_TX_OFFLOAD_OL3_OL4_CSUM_F |\n+\t\t\t  NIX_TX_OFFLOAD_L3_L4_CSUM_F);\n+\n+\treturn flags;\n+}\n+\n static int\n cn9k_nix_ptypes_set(struct rte_eth_dev *eth_dev, uint32_t ptype_mask)\n {\n@@ -18,6 +110,7 @@ cn9k_nix_ptypes_set(struct rte_eth_dev *eth_dev, uint32_t ptype_mask)\n \t\tdev->ptype_disable = 1;\n \t}\n \n+\tcn9k_eth_set_rx_function(eth_dev);\n \treturn 0;\n }\n \n@@ -172,6 +265,10 @@ cn9k_nix_configure(struct rte_eth_dev *eth_dev)\n \tif (rc)\n \t\treturn rc;\n \n+\t/* Update offload flags */\n+\tdev->rx_offload_flags = nix_rx_offload_flags(eth_dev);\n+\tdev->tx_offload_flags = nix_tx_offload_flags(eth_dev);\n+\n \tplt_nix_dbg(\"Configured port%d platform specific rx_offload_flags=%x\"\n \t\t    \" tx_offload_flags=0x%x\",\n \t\t    eth_dev->data->port_id, dev->rx_offload_flags,\n@@ -179,6 +276,28 @@ cn9k_nix_configure(struct rte_eth_dev *eth_dev)\n \treturn 0;\n }\n \n+static int\n+cn9k_nix_dev_start(struct rte_eth_dev *eth_dev)\n+{\n+\tstruct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);\n+\tint rc;\n+\n+\t/* Common eth dev start */\n+\trc = cnxk_nix_dev_start(eth_dev);\n+\tif (rc)\n+\t\treturn rc;\n+\n+\t/* Setting up the rx[tx]_offload_flags due to change\n+\t * in rx[tx]_offloads.\n+\t */\n+\tdev->rx_offload_flags |= nix_rx_offload_flags(eth_dev);\n+\tdev->tx_offload_flags |= nix_tx_offload_flags(eth_dev);\n+\n+\tcn9k_eth_set_tx_function(eth_dev);\n+\tcn9k_eth_set_rx_function(eth_dev);\n+\treturn 0;\n+}\n+\n /* Update platform specific eth dev ops */\n static void\n nix_eth_dev_ops_override(void)\n@@ -194,6 +313,7 @@ nix_eth_dev_ops_override(void)\n \tcnxk_eth_dev_ops.tx_queue_setup = cn9k_nix_tx_queue_setup;\n \tcnxk_eth_dev_ops.rx_queue_setup = cn9k_nix_rx_queue_setup;\n \tcnxk_eth_dev_ops.tx_queue_stop = cn9k_nix_tx_queue_stop;\n+\tcnxk_eth_dev_ops.dev_start = cn9k_nix_dev_start;\n \tcnxk_eth_dev_ops.dev_ptypes_set = cn9k_nix_ptypes_set;\n }\n \n@@ -233,6 +353,13 @@ cn9k_nix_probe(struct rte_pci_driver *pci_drv, struct rte_pci_device *pci_dev)\n \tif (!eth_dev)\n \t\treturn -ENOENT;\n \n+\tif (rte_eal_process_type() != RTE_PROC_PRIMARY) {\n+\t\t/* Setup callbacks for secondary process */\n+\t\tcn9k_eth_set_tx_function(eth_dev);\n+\t\tcn9k_eth_set_rx_function(eth_dev);\n+\t\treturn 0;\n+\t}\n+\n \tdev = cnxk_eth_pmd_priv(eth_dev);\n \t/* Update capabilities already set for TSO.\n \t * TSO not supported for earlier chip revisions\ndiff --git a/drivers/net/cnxk/cnxk_ethdev.c b/drivers/net/cnxk/cnxk_ethdev.c\nindex 6c20098..d4587f0 100644\n--- a/drivers/net/cnxk/cnxk_ethdev.c\n+++ b/drivers/net/cnxk/cnxk_ethdev.c\n@@ -955,12 +955,102 @@ cnxk_nix_rx_queue_stop(struct rte_eth_dev *eth_dev, uint16_t qid)\n \treturn rc;\n }\n \n+static int\n+cnxk_nix_dev_stop(struct rte_eth_dev *eth_dev)\n+{\n+\tstruct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);\n+\tconst struct eth_dev_ops *dev_ops = eth_dev->dev_ops;\n+\tstruct rte_mbuf *rx_pkts[32];\n+\tint count, i, j, rc;\n+\tvoid *rxq;\n+\n+\t/* Disable switch hdr pkind */\n+\troc_nix_switch_hdr_set(&dev->nix, 0);\n+\n+\t/* Stop link change events */\n+\tif (!roc_nix_is_vf_or_sdp(&dev->nix))\n+\t\troc_nix_mac_link_event_start_stop(&dev->nix, false);\n+\n+\t/* Disable Rx via NPC */\n+\troc_nix_npc_rx_ena_dis(&dev->nix, false);\n+\n+\t/* Stop rx queues and free up pkts pending */\n+\tfor (i = 0; i < eth_dev->data->nb_rx_queues; i++) {\n+\t\trc = dev_ops->rx_queue_stop(eth_dev, i);\n+\t\tif (rc)\n+\t\t\tcontinue;\n+\n+\t\trxq = eth_dev->data->rx_queues[i];\n+\t\tcount = dev->rx_pkt_burst_no_offload(rxq, rx_pkts, 32);\n+\t\twhile (count) {\n+\t\t\tfor (j = 0; j < count; j++)\n+\t\t\t\trte_pktmbuf_free(rx_pkts[j]);\n+\t\t\tcount = dev->rx_pkt_burst_no_offload(rxq, rx_pkts, 32);\n+\t\t}\n+\t}\n+\n+\t/* Stop tx queues  */\n+\tfor (i = 0; i < eth_dev->data->nb_tx_queues; i++)\n+\t\tdev_ops->tx_queue_stop(eth_dev, i);\n+\n+\treturn 0;\n+}\n+\n+int\n+cnxk_nix_dev_start(struct rte_eth_dev *eth_dev)\n+{\n+\tstruct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);\n+\tint rc, i;\n+\n+\t/* Start rx queues */\n+\tfor (i = 0; i < eth_dev->data->nb_rx_queues; i++) {\n+\t\trc = cnxk_nix_rx_queue_start(eth_dev, i);\n+\t\tif (rc)\n+\t\t\treturn rc;\n+\t}\n+\n+\t/* Start tx queues  */\n+\tfor (i = 0; i < eth_dev->data->nb_tx_queues; i++) {\n+\t\trc = cnxk_nix_tx_queue_start(eth_dev, i);\n+\t\tif (rc)\n+\t\t\treturn rc;\n+\t}\n+\n+\t/* Enable Rx in NPC */\n+\trc = roc_nix_npc_rx_ena_dis(&dev->nix, true);\n+\tif (rc) {\n+\t\tplt_err(\"Failed to enable NPC rx %d\", rc);\n+\t\treturn rc;\n+\t}\n+\n+\tcnxk_nix_toggle_flag_link_cfg(dev, true);\n+\n+\t/* Start link change events */\n+\tif (!roc_nix_is_vf_or_sdp(&dev->nix)) {\n+\t\trc = roc_nix_mac_link_event_start_stop(&dev->nix, true);\n+\t\tif (rc) {\n+\t\t\tplt_err(\"Failed to start cgx link event %d\", rc);\n+\t\t\tgoto rx_disable;\n+\t\t}\n+\t}\n+\n+\tcnxk_nix_toggle_flag_link_cfg(dev, false);\n+\n+\treturn 0;\n+\n+rx_disable:\n+\troc_nix_npc_rx_ena_dis(&dev->nix, false);\n+\tcnxk_nix_toggle_flag_link_cfg(dev, false);\n+\treturn rc;\n+}\n+\n /* CNXK platform independent eth dev ops */\n struct eth_dev_ops cnxk_eth_dev_ops = {\n \t.dev_infos_get = cnxk_nix_info_get,\n \t.link_update = cnxk_nix_link_update,\n \t.tx_queue_release = cnxk_nix_tx_queue_release,\n \t.rx_queue_release = cnxk_nix_rx_queue_release,\n+\t.dev_stop = cnxk_nix_dev_stop,\n \t.tx_queue_start = cnxk_nix_tx_queue_start,\n \t.rx_queue_start = cnxk_nix_rx_queue_start,\n \t.rx_queue_stop = cnxk_nix_rx_queue_stop,\ndiff --git a/drivers/net/cnxk/cnxk_ethdev.h b/drivers/net/cnxk/cnxk_ethdev.h\nindex 276e569..50c75e1 100644\n--- a/drivers/net/cnxk/cnxk_ethdev.h\n+++ b/drivers/net/cnxk/cnxk_ethdev.h\n@@ -229,6 +229,7 @@ int cnxk_nix_rx_queue_setup(struct rte_eth_dev *eth_dev, uint16_t qid,\n \t\t\t    const struct rte_eth_rxconf *rx_conf,\n \t\t\t    struct rte_mempool *mp);\n int cnxk_nix_tx_queue_stop(struct rte_eth_dev *eth_dev, uint16_t qid);\n+int cnxk_nix_dev_start(struct rte_eth_dev *eth_dev);\n \n uint64_t cnxk_nix_rxq_mbuf_setup(struct cnxk_eth_dev *dev);\n \n@@ -237,6 +238,7 @@ uint32_t cnxk_rss_ethdev_to_nix(struct cnxk_eth_dev *dev, uint64_t ethdev_rss,\n \t\t\t\tuint8_t rss_level);\n \n /* Link */\n+void cnxk_nix_toggle_flag_link_cfg(struct cnxk_eth_dev *dev, bool set);\n void cnxk_eth_dev_link_status_cb(struct roc_nix *nix,\n \t\t\t\t struct roc_nix_link_info *link);\n int cnxk_nix_link_update(struct rte_eth_dev *eth_dev, int wait_to_complete);\ndiff --git a/drivers/net/cnxk/cnxk_link.c b/drivers/net/cnxk/cnxk_link.c\nindex b0273e7..caf35ee 100644\n--- a/drivers/net/cnxk/cnxk_link.c\n+++ b/drivers/net/cnxk/cnxk_link.c\n@@ -4,6 +4,17 @@\n \n #include \"cnxk_ethdev.h\"\n \n+void\n+cnxk_nix_toggle_flag_link_cfg(struct cnxk_eth_dev *dev, bool set)\n+{\n+\tif (set)\n+\t\tdev->flags |= CNXK_LINK_CFG_IN_PROGRESS_F;\n+\telse\n+\t\tdev->flags &= ~CNXK_LINK_CFG_IN_PROGRESS_F;\n+\n+\trte_wmb();\n+}\n+\n static inline int\n nix_wait_for_link_cfg(struct cnxk_eth_dev *dev)\n {\n",
    "prefixes": [
        "v4",
        "31/62"
    ]
}