get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 74431,
    "url": "http://patches.dpdk.org/api/patches/74431/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20200719101816.16406-6-ophirmu@mellanox.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": "<20200719101816.16406-6-ophirmu@mellanox.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20200719101816.16406-6-ophirmu@mellanox.com",
    "date": "2020-07-19T10:18:13",
    "name": "[v3,5/8] net/mlx5: eliminate dependency on Linux in shared header",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "253d1c433b206a1c80b53fae42eff2fa924fa089",
    "submitter": {
        "id": 793,
        "url": "http://patches.dpdk.org/api/people/793/?format=api",
        "name": "Ophir Munk",
        "email": "ophirmu@mellanox.com"
    },
    "delegate": {
        "id": 3268,
        "url": "http://patches.dpdk.org/api/users/3268/?format=api",
        "username": "rasland",
        "first_name": "Raslan",
        "last_name": "Darawsheh",
        "email": "rasland@nvidia.com"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/20200719101816.16406-6-ophirmu@mellanox.com/mbox/",
    "series": [
        {
            "id": 11146,
            "url": "http://patches.dpdk.org/api/series/11146/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=11146",
            "date": "2020-07-19T10:18:08",
            "name": "mlx5 PMD multi OS support - part #3",
            "version": 3,
            "mbox": "http://patches.dpdk.org/series/11146/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/74431/comments/",
    "check": "warning",
    "checks": "http://patches.dpdk.org/api/patches/74431/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 dpdk.org (dpdk.org [92.243.14.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id 5C569A0540;\n\tSun, 19 Jul 2020 12:19:20 +0200 (CEST)",
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 7496D1C0DB;\n\tSun, 19 Jul 2020 12:18:38 +0200 (CEST)",
            "from EUR05-AM6-obe.outbound.protection.outlook.com\n (mail-am6eur05on2087.outbound.protection.outlook.com [40.107.22.87])\n by dpdk.org (Postfix) with ESMTP id 067A61C0B2\n for <dev@dpdk.org>; Sun, 19 Jul 2020 12:18:30 +0200 (CEST)",
            "from AM0PR05MB4209.eurprd05.prod.outlook.com (2603:10a6:208:61::22)\n by AM0PR05MB6324.eurprd05.prod.outlook.com (2603:10a6:208:143::14)\n with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3195.25; Sun, 19 Jul\n 2020 10:18:30 +0000",
            "from AM0PR05MB4209.eurprd05.prod.outlook.com\n ([fe80::3949:70c3:126:3972]) by AM0PR05MB4209.eurprd05.prod.outlook.com\n ([fe80::3949:70c3:126:3972%7]) with mapi id 15.20.3195.024; Sun, 19 Jul 2020\n 10:18:30 +0000",
            "from mellanox.com (37.142.13.130) by\n AM0PR05CA0090.eurprd05.prod.outlook.com (2603:10a6:208:136::30) with\n Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3195.18 via Frontend\n Transport; Sun, 19 Jul 2020 10:18:29 +0000"
        ],
        "ARC-Seal": "i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none;\n b=BJHBbr8FlFu3+KCedUdXDStE4skfcJ2/GbGPYKmKL+hlrMe9QDX2sCKOnt8co/RpHvEFTUOz586YuJpoqM1s/zVvedo24fEzYxt5uT8RCEixxftkCL4N4q6ITWLQNGGKFNiiGg8JX+SGz8XPiUVK03Pkauovmw0AIFhg9X+paqNWClOQx43xN9ai+ma/fNybDwXjGEbURLNHQUfGROSIIOIagbmnq7S3qKYm6aqzm0A4RAsmvdUxbxGMMaGSlBfKovmy0Ltu8oFN+Qvt++mriPL7mxYCgTHYn9Z8ZAfbrzJ5QWTySKjPTreGz/ZtkzVGCzWjBT8J5eRypOfY7NeaCQ==",
        "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-SenderADCheck;\n bh=ypso8b9SvczGSyis4h4ycjc6kYUqGG3xDMgrwPn+TpY=;\n b=a6/VO7iSdJKxPwJL1VE4pTEElO10QcX9GhXTRkIOlPtFW/NE/V3Du8Fgv90+FuPe4MqSuOq4+y0/blliyAjbFc68l7AQzvFMW0DMmosrEB8c0GOisVsw7Y/hDlsPKUFsFowpUIXcUuFJrxuGo1d6QSf7hkXOPCtxUMurv59trhIhxamWrIQWHhkyViFRZKA3NJIjCoWpdUdMMB47TUqVkqEsDT0eJ1YKrSt/r2jtvCI6KLFjFdXDuzZR4c7DBiBsgcrJmWg82iVZBnisXC4iHOXMmFAB3+jE5vdkHwVw3emIm2jk5YxtwkmwcXuqEb3I/s7+HJvQmqZ2Kh2IYZtynQ==",
        "ARC-Authentication-Results": "i=1; mx.microsoft.com 1; spf=pass\n smtp.mailfrom=mellanox.com; dmarc=pass action=none header.from=mellanox.com;\n dkim=pass header.d=mellanox.com; arc=none",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=Mellanox.com;\n s=selector1;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n bh=ypso8b9SvczGSyis4h4ycjc6kYUqGG3xDMgrwPn+TpY=;\n b=YivLnOLlEYiPJFER70/08Alg8eSx5JGbkREtfbLMFlwB/sz32oWaH1FWCycLvHmVY+sAgQQRs8mrSFqz4veRmQt8aZCa/zLiiVmiD7wkmLOsHblPI+SI0IixmAYpZjjDWDLKVGFzUjHELZx+OM48VFo6DhNNWjYoH6mBA9WCXZg=",
        "Authentication-Results": "dpdk.org; dkim=none (message not signed)\n header.d=none;dpdk.org; dmarc=none action=none header.from=mellanox.com;",
        "From": "Ophir Munk <ophirmu@mellanox.com>",
        "To": "dev@dpdk.org",
        "Cc": "Raslan Darawsheh <rasland@mellanox.com>,\n Ophir Munk <ophirmu@mellanox.com>,\n Matan Azrad <matan@mellanox.com>",
        "Date": "Sun, 19 Jul 2020 10:18:13 +0000",
        "Message-Id": "<20200719101816.16406-6-ophirmu@mellanox.com>",
        "X-Mailer": [
            "git-send-email 2.8.4",
            "git-send-email 2.8.4"
        ],
        "In-Reply-To": "<20200719101816.16406-1-ophirmu@mellanox.com>",
        "References": "<20200719071112.8540-9-ophirmu@mellanox.com>\n <20200719101816.16406-1-ophirmu@mellanox.com>",
        "Content-Type": "text/plain",
        "X-ClientProxiedBy": "AM0PR05CA0090.eurprd05.prod.outlook.com\n (2603:10a6:208:136::30) To AM0PR05MB4209.eurprd05.prod.outlook.com\n (2603:10a6:208:61::22)",
        "MIME-Version": "1.0",
        "X-MS-Exchange-MessageSentRepresentingType": "1",
        "X-Originating-IP": "[37.142.13.130]",
        "X-MS-PublicTrafficType": "Email",
        "X-MS-Office365-Filtering-HT": "Tenant",
        "X-MS-Office365-Filtering-Correlation-Id": "06abba54-1f1b-4ce9-c594-08d82bcd153b",
        "X-MS-TrafficTypeDiagnostic": "AM0PR05MB6324:",
        "X-LD-Processed": "a652971c-7d2e-4d9b-a6a4-d149256f461b,ExtFwd",
        "X-MS-Exchange-Transport-Forked": "True",
        "X-Microsoft-Antispam-PRVS": "\n <AM0PR05MB6324453A300113DCABEA3844D17A0@AM0PR05MB6324.eurprd05.prod.outlook.com>",
        "X-MS-Oob-TLC-OOBClassifiers": "OLM:22;",
        "X-MS-Exchange-SenderADCheck": "1",
        "X-Microsoft-Antispam": "BCL:0;",
        "X-Microsoft-Antispam-Message-Info": "\n KEJGruBGVXrn39Ztn243Q2txc+lhKb8fRkd6TB+YEvTXn2G3uz0ai7RpTdtGL+TdTTKHEIvnBbyw2rCiq1uEU6KcL7/o24goUok/6Ul4Ym84QGpv1MZC6yStvFdiFqtFbUJFxo+Y66QShI7IVoTEsSb3D+v3k1F6kZDVRfVndKf7VlZ2tHOtI+MjoiNPpqRAfa1tufK/qc3DduhT2X4yd6sHs4NB+PHhf/5w9pxVmoqIDNvXFqjlJl8OLQUmrdwUEQ9bTQzRhhieePriQ2AN9tQEthNPU60usKr2xoPoB94KGBWvQ6slf+H4/ObK4UFne+5vCAt8r/s0pw2xpZIBnw==",
        "X-Forefront-Antispam-Report": "CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:;\n IPV:NLI; SFV:NSPM; H:AM0PR05MB4209.eurprd05.prod.outlook.com; PTR:; CAT:NONE;\n SFTY:;\n SFS:(4636009)(396003)(346002)(376002)(136003)(39860400002)(366004)(5660300002)(316002)(2906002)(36756003)(54906003)(186003)(2616005)(6666004)(16526019)(4326008)(83380400001)(956004)(30864003)(6916009)(26005)(478600001)(52116002)(7696005)(107886003)(66556008)(86362001)(66476007)(66946007)(1076003)(55016002)(8936002)(8676002)(8886007);\n DIR:OUT; SFP:1101;",
        "X-MS-Exchange-AntiSpam-MessageData": "\n MORI2RnP6KkGmxRWwmfm2udbLnvCu6zpw+ftQPZwqkFLy4yc1yvJ54EN7kvNLhbKM9w24H8HSMqnZejOHsU4UOGxDcOD/DxtuK/L1Vd18s9NowhE4g+kpuWAOWrlUOK4Gk1cfcm1bgElAeXGH1t6K1YYVrjHQUcUUX9u0nMA4S0SAhbMTxR43lK6wHR+7AF4uHworTQWdyPurfMNSI9QPXEPWuROWX4Hr4qPfeMCG4nMs214Yt/fMwrVETtcxdvI/eQIJTPegm744oOr2nrgpo6BWLd4zkrelaaMMdPlcDd/+OaEPgzAYbKkUNufCFQflTWdejGmgmviVoAVoT6myXQFQ13y33ICewsuZIEqhKH0CXKoOOsgzEczQzgmQRv+btVOqjIQHEVF9yerY1AXIUhF82h4bJZGpgBsEVMLc9SEwA2Evn0mnA0r61IW0K79CBoSW3nNvTbVKhc0elU8M2dHOIOcRg+m9fj++X64CKkyCpgsJUF8M7PbQYKpvLfX",
        "X-OriginatorOrg": "Mellanox.com",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "\n 06abba54-1f1b-4ce9-c594-08d82bcd153b",
        "X-MS-Exchange-CrossTenant-AuthSource": "AM0PR05MB4209.eurprd05.prod.outlook.com",
        "X-MS-Exchange-CrossTenant-AuthAs": "Internal",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "19 Jul 2020 10:18:29.9832 (UTC)",
        "X-MS-Exchange-CrossTenant-FromEntityHeader": "Hosted",
        "X-MS-Exchange-CrossTenant-Id": "a652971c-7d2e-4d9b-a6a4-d149256f461b",
        "X-MS-Exchange-CrossTenant-MailboxType": "HOSTED",
        "X-MS-Exchange-CrossTenant-UserPrincipalName": "\n iV/P+OnkAr0rMDJfY7OLAvCV0QPLJ8uD6m2AmlVag7nmVJegSvFOuqdMeuQ4O2dxw/0hSkWxuack6RumBl+P/w==",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "AM0PR05MB6324",
        "Subject": "[dpdk-dev] [PATCH v3 5/8] net/mlx5: eliminate dependency on Linux\n\tin shared header",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "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": "This commit eliminates Linux dependencies in shared file mlx5.h.\n\n1. All functions using 'struct ifreq' are moved to file\nlinux/mlx5_ethdev_os.c such that this struct can be removed from mlx5.h.\n2. Function mlx5_set_flags() that uses Linux flags (e.g. IFF_UP) is\nchanged to static and its prototype is removed from mlx5.h.\n3. Remove redundant member verbs_action from 'struct mlx5_priv'.\n\nSigned-off-by: Ophir Munk <ophirmu@mellanox.com>\nAcked-by: Matan Azrad <matan@mellanox.com>\n---\n drivers/net/mlx5/linux/mlx5_ethdev_os.c | 314 +++++++++++++++++++++++++++++++-\n drivers/net/mlx5/linux/mlx5_os.c        | 309 -------------------------------\n drivers/net/mlx5/mlx5.h                 |  15 +-\n 3 files changed, 318 insertions(+), 320 deletions(-)",
    "diff": "diff --git a/drivers/net/mlx5/linux/mlx5_ethdev_os.c b/drivers/net/mlx5/linux/mlx5_ethdev_os.c\nindex 6b8a151..e79d576 100644\n--- a/drivers/net/mlx5/linux/mlx5_ethdev_os.c\n+++ b/drivers/net/mlx5/linux/mlx5_ethdev_os.c\n@@ -178,7 +178,7 @@ mlx5_get_ifname(const struct rte_eth_dev *dev, char (*ifname)[IF_NAMESIZE])\n  * @return\n  *   0 on success, a negative errno value otherwise and rte_errno is set.\n  */\n-int\n+static int\n mlx5_ifreq(const struct rte_eth_dev *dev, int req, struct ifreq *ifr)\n {\n \tint sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);\n@@ -258,7 +258,7 @@ mlx5_set_mtu(struct rte_eth_dev *dev, uint16_t mtu)\n  * @return\n  *   0 on success, a negative errno value otherwise and rte_errno is set.\n  */\n-int\n+static int\n mlx5_set_flags(struct rte_eth_dev *dev, unsigned int keep, unsigned int flags)\n {\n \tstruct ifreq request;\n@@ -1187,3 +1187,313 @@ int mlx5_get_module_eeprom(struct rte_eth_dev *dev,\n \tmlx5_free(eeprom);\n \treturn ret;\n }\n+\n+/**\n+ * Read device counters table.\n+ *\n+ * @param dev\n+ *   Pointer to Ethernet device.\n+ * @param[out] stats\n+ *   Counters table output buffer.\n+ *\n+ * @return\n+ *   0 on success and stats is filled, negative errno value otherwise and\n+ *   rte_errno is set.\n+ */\n+int\n+mlx5_os_read_dev_counters(struct rte_eth_dev *dev, uint64_t *stats)\n+{\n+\tstruct mlx5_priv *priv = dev->data->dev_private;\n+\tstruct mlx5_xstats_ctrl *xstats_ctrl = &priv->xstats_ctrl;\n+\tunsigned int i;\n+\tstruct ifreq ifr;\n+\tunsigned int stats_sz = xstats_ctrl->stats_n * sizeof(uint64_t);\n+\tunsigned char et_stat_buf[sizeof(struct ethtool_stats) + stats_sz];\n+\tstruct ethtool_stats *et_stats = (struct ethtool_stats *)et_stat_buf;\n+\tint ret;\n+\n+\tet_stats->cmd = ETHTOOL_GSTATS;\n+\tet_stats->n_stats = xstats_ctrl->stats_n;\n+\tifr.ifr_data = (caddr_t)et_stats;\n+\tret = mlx5_ifreq(dev, SIOCETHTOOL, &ifr);\n+\tif (ret) {\n+\t\tDRV_LOG(WARNING,\n+\t\t\t\"port %u unable to read statistic values from device\",\n+\t\t\tdev->data->port_id);\n+\t\treturn ret;\n+\t}\n+\tfor (i = 0; i != xstats_ctrl->mlx5_stats_n; ++i) {\n+\t\tif (xstats_ctrl->info[i].dev) {\n+\t\t\tret = mlx5_os_read_dev_stat(priv,\n+\t\t\t\t\t    xstats_ctrl->info[i].ctr_name,\n+\t\t\t\t\t    &stats[i]);\n+\t\t\t/* return last xstats counter if fail to read. */\n+\t\t\tif (ret == 0)\n+\t\t\t\txstats_ctrl->xstats[i] = stats[i];\n+\t\t\telse\n+\t\t\t\tstats[i] = xstats_ctrl->xstats[i];\n+\t\t} else {\n+\t\t\tstats[i] = (uint64_t)\n+\t\t\t\tet_stats->data[xstats_ctrl->dev_table_idx[i]];\n+\t\t}\n+\t}\n+\treturn 0;\n+}\n+\n+/**\n+ * Query the number of statistics provided by ETHTOOL.\n+ *\n+ * @param dev\n+ *   Pointer to Ethernet device.\n+ *\n+ * @return\n+ *   Number of statistics on success, negative errno value otherwise and\n+ *   rte_errno is set.\n+ */\n+int\n+mlx5_os_get_stats_n(struct rte_eth_dev *dev)\n+{\n+\tstruct ethtool_drvinfo drvinfo;\n+\tstruct ifreq ifr;\n+\tint ret;\n+\n+\tdrvinfo.cmd = ETHTOOL_GDRVINFO;\n+\tifr.ifr_data = (caddr_t)&drvinfo;\n+\tret = mlx5_ifreq(dev, SIOCETHTOOL, &ifr);\n+\tif (ret) {\n+\t\tDRV_LOG(WARNING, \"port %u unable to query number of statistics\",\n+\t\t\tdev->data->port_id);\n+\t\treturn ret;\n+\t}\n+\treturn drvinfo.n_stats;\n+}\n+\n+static const struct mlx5_counter_ctrl mlx5_counters_init[] = {\n+\t{\n+\t\t.dpdk_name = \"rx_port_unicast_bytes\",\n+\t\t.ctr_name = \"rx_vport_unicast_bytes\",\n+\t},\n+\t{\n+\t\t.dpdk_name = \"rx_port_multicast_bytes\",\n+\t\t.ctr_name = \"rx_vport_multicast_bytes\",\n+\t},\n+\t{\n+\t\t.dpdk_name = \"rx_port_broadcast_bytes\",\n+\t\t.ctr_name = \"rx_vport_broadcast_bytes\",\n+\t},\n+\t{\n+\t\t.dpdk_name = \"rx_port_unicast_packets\",\n+\t\t.ctr_name = \"rx_vport_unicast_packets\",\n+\t},\n+\t{\n+\t\t.dpdk_name = \"rx_port_multicast_packets\",\n+\t\t.ctr_name = \"rx_vport_multicast_packets\",\n+\t},\n+\t{\n+\t\t.dpdk_name = \"rx_port_broadcast_packets\",\n+\t\t.ctr_name = \"rx_vport_broadcast_packets\",\n+\t},\n+\t{\n+\t\t.dpdk_name = \"tx_port_unicast_bytes\",\n+\t\t.ctr_name = \"tx_vport_unicast_bytes\",\n+\t},\n+\t{\n+\t\t.dpdk_name = \"tx_port_multicast_bytes\",\n+\t\t.ctr_name = \"tx_vport_multicast_bytes\",\n+\t},\n+\t{\n+\t\t.dpdk_name = \"tx_port_broadcast_bytes\",\n+\t\t.ctr_name = \"tx_vport_broadcast_bytes\",\n+\t},\n+\t{\n+\t\t.dpdk_name = \"tx_port_unicast_packets\",\n+\t\t.ctr_name = \"tx_vport_unicast_packets\",\n+\t},\n+\t{\n+\t\t.dpdk_name = \"tx_port_multicast_packets\",\n+\t\t.ctr_name = \"tx_vport_multicast_packets\",\n+\t},\n+\t{\n+\t\t.dpdk_name = \"tx_port_broadcast_packets\",\n+\t\t.ctr_name = \"tx_vport_broadcast_packets\",\n+\t},\n+\t{\n+\t\t.dpdk_name = \"rx_wqe_err\",\n+\t\t.ctr_name = \"rx_wqe_err\",\n+\t},\n+\t{\n+\t\t.dpdk_name = \"rx_crc_errors_phy\",\n+\t\t.ctr_name = \"rx_crc_errors_phy\",\n+\t},\n+\t{\n+\t\t.dpdk_name = \"rx_in_range_len_errors_phy\",\n+\t\t.ctr_name = \"rx_in_range_len_errors_phy\",\n+\t},\n+\t{\n+\t\t.dpdk_name = \"rx_symbol_err_phy\",\n+\t\t.ctr_name = \"rx_symbol_err_phy\",\n+\t},\n+\t{\n+\t\t.dpdk_name = \"tx_errors_phy\",\n+\t\t.ctr_name = \"tx_errors_phy\",\n+\t},\n+\t{\n+\t\t.dpdk_name = \"rx_out_of_buffer\",\n+\t\t.ctr_name = \"out_of_buffer\",\n+\t\t.dev = 1,\n+\t},\n+\t{\n+\t\t.dpdk_name = \"tx_packets_phy\",\n+\t\t.ctr_name = \"tx_packets_phy\",\n+\t},\n+\t{\n+\t\t.dpdk_name = \"rx_packets_phy\",\n+\t\t.ctr_name = \"rx_packets_phy\",\n+\t},\n+\t{\n+\t\t.dpdk_name = \"tx_discards_phy\",\n+\t\t.ctr_name = \"tx_discards_phy\",\n+\t},\n+\t{\n+\t\t.dpdk_name = \"rx_discards_phy\",\n+\t\t.ctr_name = \"rx_discards_phy\",\n+\t},\n+\t{\n+\t\t.dpdk_name = \"tx_bytes_phy\",\n+\t\t.ctr_name = \"tx_bytes_phy\",\n+\t},\n+\t{\n+\t\t.dpdk_name = \"rx_bytes_phy\",\n+\t\t.ctr_name = \"rx_bytes_phy\",\n+\t},\n+\t/* Representor only */\n+\t{\n+\t\t.dpdk_name = \"rx_packets\",\n+\t\t.ctr_name = \"vport_rx_packets\",\n+\t},\n+\t{\n+\t\t.dpdk_name = \"rx_bytes\",\n+\t\t.ctr_name = \"vport_rx_bytes\",\n+\t},\n+\t{\n+\t\t.dpdk_name = \"tx_packets\",\n+\t\t.ctr_name = \"vport_tx_packets\",\n+\t},\n+\t{\n+\t\t.dpdk_name = \"tx_bytes\",\n+\t\t.ctr_name = \"vport_tx_bytes\",\n+\t},\n+};\n+\n+static const unsigned int xstats_n = RTE_DIM(mlx5_counters_init);\n+\n+/**\n+ * Init the structures to read device counters.\n+ *\n+ * @param dev\n+ *   Pointer to Ethernet device.\n+ */\n+void\n+mlx5_os_stats_init(struct rte_eth_dev *dev)\n+{\n+\tstruct mlx5_priv *priv = dev->data->dev_private;\n+\tstruct mlx5_xstats_ctrl *xstats_ctrl = &priv->xstats_ctrl;\n+\tstruct mlx5_stats_ctrl *stats_ctrl = &priv->stats_ctrl;\n+\tunsigned int i;\n+\tunsigned int j;\n+\tstruct ifreq ifr;\n+\tstruct ethtool_gstrings *strings = NULL;\n+\tunsigned int dev_stats_n;\n+\tunsigned int str_sz;\n+\tint ret;\n+\n+\t/* So that it won't aggregate for each init. */\n+\txstats_ctrl->mlx5_stats_n = 0;\n+\tret = mlx5_os_get_stats_n(dev);\n+\tif (ret < 0) {\n+\t\tDRV_LOG(WARNING, \"port %u no extended statistics available\",\n+\t\t\tdev->data->port_id);\n+\t\treturn;\n+\t}\n+\tdev_stats_n = ret;\n+\t/* Allocate memory to grab stat names and values. */\n+\tstr_sz = dev_stats_n * ETH_GSTRING_LEN;\n+\tstrings = (struct ethtool_gstrings *)\n+\t\t  mlx5_malloc(0, str_sz + sizeof(struct ethtool_gstrings), 0,\n+\t\t\t      SOCKET_ID_ANY);\n+\tif (!strings) {\n+\t\tDRV_LOG(WARNING, \"port %u unable to allocate memory for xstats\",\n+\t\t     dev->data->port_id);\n+\t\treturn;\n+\t}\n+\tstrings->cmd = ETHTOOL_GSTRINGS;\n+\tstrings->string_set = ETH_SS_STATS;\n+\tstrings->len = dev_stats_n;\n+\tifr.ifr_data = (caddr_t)strings;\n+\tret = mlx5_ifreq(dev, SIOCETHTOOL, &ifr);\n+\tif (ret) {\n+\t\tDRV_LOG(WARNING, \"port %u unable to get statistic names\",\n+\t\t\tdev->data->port_id);\n+\t\tgoto free;\n+\t}\n+\tfor (i = 0; i != dev_stats_n; ++i) {\n+\t\tconst char *curr_string = (const char *)\n+\t\t\t&strings->data[i * ETH_GSTRING_LEN];\n+\n+\t\tfor (j = 0; j != xstats_n; ++j) {\n+\t\t\tif (!strcmp(mlx5_counters_init[j].ctr_name,\n+\t\t\t\t    curr_string)) {\n+\t\t\t\tunsigned int idx = xstats_ctrl->mlx5_stats_n++;\n+\n+\t\t\t\txstats_ctrl->dev_table_idx[idx] = i;\n+\t\t\t\txstats_ctrl->info[idx] = mlx5_counters_init[j];\n+\t\t\t\tbreak;\n+\t\t\t}\n+\t\t}\n+\t}\n+\t/* Add dev counters. */\n+\tfor (i = 0; i != xstats_n; ++i) {\n+\t\tif (mlx5_counters_init[i].dev) {\n+\t\t\tunsigned int idx = xstats_ctrl->mlx5_stats_n++;\n+\n+\t\t\txstats_ctrl->info[idx] = mlx5_counters_init[i];\n+\t\t\txstats_ctrl->hw_stats[idx] = 0;\n+\t\t}\n+\t}\n+\tMLX5_ASSERT(xstats_ctrl->mlx5_stats_n <= MLX5_MAX_XSTATS);\n+\txstats_ctrl->stats_n = dev_stats_n;\n+\t/* Copy to base at first time. */\n+\tret = mlx5_os_read_dev_counters(dev, xstats_ctrl->base);\n+\tif (ret)\n+\t\tDRV_LOG(ERR, \"port %u cannot read device counters: %s\",\n+\t\t\tdev->data->port_id, strerror(rte_errno));\n+\tmlx5_os_read_dev_stat(priv, \"out_of_buffer\", &stats_ctrl->imissed_base);\n+\tstats_ctrl->imissed = 0;\n+free:\n+\tmlx5_free(strings);\n+}\n+\n+/**\n+ * Get MAC address by querying netdevice.\n+ *\n+ * @param[in] dev\n+ *   Pointer to Ethernet device.\n+ * @param[out] mac\n+ *   MAC address output buffer.\n+ *\n+ * @return\n+ *   0 on success, a negative errno value otherwise and rte_errno is set.\n+ */\n+int\n+mlx5_get_mac(struct rte_eth_dev *dev, uint8_t (*mac)[RTE_ETHER_ADDR_LEN])\n+{\n+\tstruct ifreq request;\n+\tint ret;\n+\n+\tret = mlx5_ifreq(dev, SIOCGIFHWADDR, &request);\n+\tif (ret)\n+\t\treturn ret;\n+\tmemcpy(mac, request.ifr_hwaddr.sa_data, RTE_ETHER_ADDR_LEN);\n+\treturn 0;\n+}\n+\ndiff --git a/drivers/net/mlx5/linux/mlx5_os.c b/drivers/net/mlx5/linux/mlx5_os.c\nindex 1f82f0a..d3ae3ad 100644\n--- a/drivers/net/mlx5/linux/mlx5_os.c\n+++ b/drivers/net/mlx5/linux/mlx5_os.c\n@@ -68,30 +68,6 @@\n #endif\n \n /**\n- * Get MAC address by querying netdevice.\n- *\n- * @param[in] dev\n- *   Pointer to Ethernet device.\n- * @param[out] mac\n- *   MAC address output buffer.\n- *\n- * @return\n- *   0 on success, a negative errno value otherwise and rte_errno is set.\n- */\n-static int\n-mlx5_get_mac(struct rte_eth_dev *dev, uint8_t (*mac)[RTE_ETHER_ADDR_LEN])\n-{\n-\tstruct ifreq request;\n-\tint ret;\n-\n-\tret = mlx5_ifreq(dev, SIOCGIFHWADDR, &request);\n-\tif (ret)\n-\t\treturn ret;\n-\tmemcpy(mac, request.ifr_hwaddr.sa_data, RTE_ETHER_ADDR_LEN);\n-\treturn 0;\n-}\n-\n-/**\n  * Get mlx5 device attributes. The glue function query_device_ex() is called\n  * with out parameter of type 'struct ibv_device_attr_ex *'. Then fill in mlx5\n  * device attributes from the glue out parameter.\n@@ -2082,291 +2058,6 @@ mlx5_os_read_dev_stat(struct mlx5_priv *priv, const char *ctr_name,\n }\n \n /**\n- * Read device counters table.\n- *\n- * @param dev\n- *   Pointer to Ethernet device.\n- * @param[out] stats\n- *   Counters table output buffer.\n- *\n- * @return\n- *   0 on success and stats is filled, negative errno value otherwise and\n- *   rte_errno is set.\n- */\n-int\n-mlx5_os_read_dev_counters(struct rte_eth_dev *dev, uint64_t *stats)\n-{\n-\tstruct mlx5_priv *priv = dev->data->dev_private;\n-\tstruct mlx5_xstats_ctrl *xstats_ctrl = &priv->xstats_ctrl;\n-\tunsigned int i;\n-\tstruct ifreq ifr;\n-\tunsigned int stats_sz = xstats_ctrl->stats_n * sizeof(uint64_t);\n-\tunsigned char et_stat_buf[sizeof(struct ethtool_stats) + stats_sz];\n-\tstruct ethtool_stats *et_stats = (struct ethtool_stats *)et_stat_buf;\n-\tint ret;\n-\n-\tet_stats->cmd = ETHTOOL_GSTATS;\n-\tet_stats->n_stats = xstats_ctrl->stats_n;\n-\tifr.ifr_data = (caddr_t)et_stats;\n-\tret = mlx5_ifreq(dev, SIOCETHTOOL, &ifr);\n-\tif (ret) {\n-\t\tDRV_LOG(WARNING,\n-\t\t\t\"port %u unable to read statistic values from device\",\n-\t\t\tdev->data->port_id);\n-\t\treturn ret;\n-\t}\n-\tfor (i = 0; i != xstats_ctrl->mlx5_stats_n; ++i) {\n-\t\tif (xstats_ctrl->info[i].dev) {\n-\t\t\tret = mlx5_os_read_dev_stat(priv,\n-\t\t\t\t\t    xstats_ctrl->info[i].ctr_name,\n-\t\t\t\t\t    &stats[i]);\n-\t\t\t/* return last xstats counter if fail to read. */\n-\t\t\tif (ret == 0)\n-\t\t\t\txstats_ctrl->xstats[i] = stats[i];\n-\t\t\telse\n-\t\t\t\tstats[i] = xstats_ctrl->xstats[i];\n-\t\t} else {\n-\t\t\tstats[i] = (uint64_t)\n-\t\t\t\tet_stats->data[xstats_ctrl->dev_table_idx[i]];\n-\t\t}\n-\t}\n-\treturn 0;\n-}\n-\n-/**\n- * Query the number of statistics provided by ETHTOOL.\n- *\n- * @param dev\n- *   Pointer to Ethernet device.\n- *\n- * @return\n- *   Number of statistics on success, negative errno value otherwise and\n- *   rte_errno is set.\n- */\n-int\n-mlx5_os_get_stats_n(struct rte_eth_dev *dev)\n-{\n-\tstruct ethtool_drvinfo drvinfo;\n-\tstruct ifreq ifr;\n-\tint ret;\n-\n-\tdrvinfo.cmd = ETHTOOL_GDRVINFO;\n-\tifr.ifr_data = (caddr_t)&drvinfo;\n-\tret = mlx5_ifreq(dev, SIOCETHTOOL, &ifr);\n-\tif (ret) {\n-\t\tDRV_LOG(WARNING, \"port %u unable to query number of statistics\",\n-\t\t\tdev->data->port_id);\n-\t\treturn ret;\n-\t}\n-\treturn drvinfo.n_stats;\n-}\n-\n-static const struct mlx5_counter_ctrl mlx5_counters_init[] = {\n-\t{\n-\t\t.dpdk_name = \"rx_port_unicast_bytes\",\n-\t\t.ctr_name = \"rx_vport_unicast_bytes\",\n-\t},\n-\t{\n-\t\t.dpdk_name = \"rx_port_multicast_bytes\",\n-\t\t.ctr_name = \"rx_vport_multicast_bytes\",\n-\t},\n-\t{\n-\t\t.dpdk_name = \"rx_port_broadcast_bytes\",\n-\t\t.ctr_name = \"rx_vport_broadcast_bytes\",\n-\t},\n-\t{\n-\t\t.dpdk_name = \"rx_port_unicast_packets\",\n-\t\t.ctr_name = \"rx_vport_unicast_packets\",\n-\t},\n-\t{\n-\t\t.dpdk_name = \"rx_port_multicast_packets\",\n-\t\t.ctr_name = \"rx_vport_multicast_packets\",\n-\t},\n-\t{\n-\t\t.dpdk_name = \"rx_port_broadcast_packets\",\n-\t\t.ctr_name = \"rx_vport_broadcast_packets\",\n-\t},\n-\t{\n-\t\t.dpdk_name = \"tx_port_unicast_bytes\",\n-\t\t.ctr_name = \"tx_vport_unicast_bytes\",\n-\t},\n-\t{\n-\t\t.dpdk_name = \"tx_port_multicast_bytes\",\n-\t\t.ctr_name = \"tx_vport_multicast_bytes\",\n-\t},\n-\t{\n-\t\t.dpdk_name = \"tx_port_broadcast_bytes\",\n-\t\t.ctr_name = \"tx_vport_broadcast_bytes\",\n-\t},\n-\t{\n-\t\t.dpdk_name = \"tx_port_unicast_packets\",\n-\t\t.ctr_name = \"tx_vport_unicast_packets\",\n-\t},\n-\t{\n-\t\t.dpdk_name = \"tx_port_multicast_packets\",\n-\t\t.ctr_name = \"tx_vport_multicast_packets\",\n-\t},\n-\t{\n-\t\t.dpdk_name = \"tx_port_broadcast_packets\",\n-\t\t.ctr_name = \"tx_vport_broadcast_packets\",\n-\t},\n-\t{\n-\t\t.dpdk_name = \"rx_wqe_err\",\n-\t\t.ctr_name = \"rx_wqe_err\",\n-\t},\n-\t{\n-\t\t.dpdk_name = \"rx_crc_errors_phy\",\n-\t\t.ctr_name = \"rx_crc_errors_phy\",\n-\t},\n-\t{\n-\t\t.dpdk_name = \"rx_in_range_len_errors_phy\",\n-\t\t.ctr_name = \"rx_in_range_len_errors_phy\",\n-\t},\n-\t{\n-\t\t.dpdk_name = \"rx_symbol_err_phy\",\n-\t\t.ctr_name = \"rx_symbol_err_phy\",\n-\t},\n-\t{\n-\t\t.dpdk_name = \"tx_errors_phy\",\n-\t\t.ctr_name = \"tx_errors_phy\",\n-\t},\n-\t{\n-\t\t.dpdk_name = \"rx_out_of_buffer\",\n-\t\t.ctr_name = \"out_of_buffer\",\n-\t\t.dev = 1,\n-\t},\n-\t{\n-\t\t.dpdk_name = \"tx_packets_phy\",\n-\t\t.ctr_name = \"tx_packets_phy\",\n-\t},\n-\t{\n-\t\t.dpdk_name = \"rx_packets_phy\",\n-\t\t.ctr_name = \"rx_packets_phy\",\n-\t},\n-\t{\n-\t\t.dpdk_name = \"tx_discards_phy\",\n-\t\t.ctr_name = \"tx_discards_phy\",\n-\t},\n-\t{\n-\t\t.dpdk_name = \"rx_discards_phy\",\n-\t\t.ctr_name = \"rx_discards_phy\",\n-\t},\n-\t{\n-\t\t.dpdk_name = \"tx_bytes_phy\",\n-\t\t.ctr_name = \"tx_bytes_phy\",\n-\t},\n-\t{\n-\t\t.dpdk_name = \"rx_bytes_phy\",\n-\t\t.ctr_name = \"rx_bytes_phy\",\n-\t},\n-\t/* Representor only */\n-\t{\n-\t\t.dpdk_name = \"rx_packets\",\n-\t\t.ctr_name = \"vport_rx_packets\",\n-\t},\n-\t{\n-\t\t.dpdk_name = \"rx_bytes\",\n-\t\t.ctr_name = \"vport_rx_bytes\",\n-\t},\n-\t{\n-\t\t.dpdk_name = \"tx_packets\",\n-\t\t.ctr_name = \"vport_tx_packets\",\n-\t},\n-\t{\n-\t\t.dpdk_name = \"tx_bytes\",\n-\t\t.ctr_name = \"vport_tx_bytes\",\n-\t},\n-};\n-\n-static const unsigned int xstats_n = RTE_DIM(mlx5_counters_init);\n-\n-/**\n- * Init the structures to read device counters.\n- *\n- * @param dev\n- *   Pointer to Ethernet device.\n- */\n-void\n-mlx5_os_stats_init(struct rte_eth_dev *dev)\n-{\n-\tstruct mlx5_priv *priv = dev->data->dev_private;\n-\tstruct mlx5_xstats_ctrl *xstats_ctrl = &priv->xstats_ctrl;\n-\tstruct mlx5_stats_ctrl *stats_ctrl = &priv->stats_ctrl;\n-\tunsigned int i;\n-\tunsigned int j;\n-\tstruct ifreq ifr;\n-\tstruct ethtool_gstrings *strings = NULL;\n-\tunsigned int dev_stats_n;\n-\tunsigned int str_sz;\n-\tint ret;\n-\n-\t/* So that it won't aggregate for each init. */\n-\txstats_ctrl->mlx5_stats_n = 0;\n-\tret = mlx5_os_get_stats_n(dev);\n-\tif (ret < 0) {\n-\t\tDRV_LOG(WARNING, \"port %u no extended statistics available\",\n-\t\t\tdev->data->port_id);\n-\t\treturn;\n-\t}\n-\tdev_stats_n = ret;\n-\t/* Allocate memory to grab stat names and values. */\n-\tstr_sz = dev_stats_n * ETH_GSTRING_LEN;\n-\tstrings = (struct ethtool_gstrings *)\n-\t\t  mlx5_malloc(0, str_sz + sizeof(struct ethtool_gstrings), 0,\n-\t\t\t      SOCKET_ID_ANY);\n-\tif (!strings) {\n-\t\tDRV_LOG(WARNING, \"port %u unable to allocate memory for xstats\",\n-\t\t     dev->data->port_id);\n-\t\treturn;\n-\t}\n-\tstrings->cmd = ETHTOOL_GSTRINGS;\n-\tstrings->string_set = ETH_SS_STATS;\n-\tstrings->len = dev_stats_n;\n-\tifr.ifr_data = (caddr_t)strings;\n-\tret = mlx5_ifreq(dev, SIOCETHTOOL, &ifr);\n-\tif (ret) {\n-\t\tDRV_LOG(WARNING, \"port %u unable to get statistic names\",\n-\t\t\tdev->data->port_id);\n-\t\tgoto free;\n-\t}\n-\tfor (i = 0; i != dev_stats_n; ++i) {\n-\t\tconst char *curr_string = (const char *)\n-\t\t\t&strings->data[i * ETH_GSTRING_LEN];\n-\n-\t\tfor (j = 0; j != xstats_n; ++j) {\n-\t\t\tif (!strcmp(mlx5_counters_init[j].ctr_name,\n-\t\t\t\t    curr_string)) {\n-\t\t\t\tunsigned int idx = xstats_ctrl->mlx5_stats_n++;\n-\n-\t\t\t\txstats_ctrl->dev_table_idx[idx] = i;\n-\t\t\t\txstats_ctrl->info[idx] = mlx5_counters_init[j];\n-\t\t\t\tbreak;\n-\t\t\t}\n-\t\t}\n-\t}\n-\t/* Add dev counters. */\n-\tfor (i = 0; i != xstats_n; ++i) {\n-\t\tif (mlx5_counters_init[i].dev) {\n-\t\t\tunsigned int idx = xstats_ctrl->mlx5_stats_n++;\n-\n-\t\t\txstats_ctrl->info[idx] = mlx5_counters_init[i];\n-\t\t\txstats_ctrl->hw_stats[idx] = 0;\n-\t\t}\n-\t}\n-\tMLX5_ASSERT(xstats_ctrl->mlx5_stats_n <= MLX5_MAX_XSTATS);\n-\txstats_ctrl->stats_n = dev_stats_n;\n-\t/* Copy to base at first time. */\n-\tret = mlx5_os_read_dev_counters(dev, xstats_ctrl->base);\n-\tif (ret)\n-\t\tDRV_LOG(ERR, \"port %u cannot read device counters: %s\",\n-\t\t\tdev->data->port_id, strerror(rte_errno));\n-\tmlx5_os_read_dev_stat(priv, \"out_of_buffer\", &stats_ctrl->imissed_base);\n-\tstats_ctrl->imissed = 0;\n-free:\n-\tmlx5_free(strings);\n-}\n-\n-/**\n  * Set the reg_mr and dereg_mr call backs\n  *\n  * @param reg_mr_cb[out]\ndiff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h\nindex 24a668b..9fa7e47 100644\n--- a/drivers/net/mlx5/mlx5.h\n+++ b/drivers/net/mlx5/mlx5.h\n@@ -737,7 +737,6 @@ struct mlx5_priv {\n \tLIST_HEAD(ind_tables, mlx5_ind_table_obj) ind_tbls;\n \t/* Pointer to next element. */\n \trte_atomic32_t refcnt; /**< Reference counter. */\n-\tstruct ibv_flow_action *verbs_action;\n \t/**< Verbs modify header action object. */\n \tuint8_t ft_type; /**< Flow table type, Rx or Tx. */\n \tuint8_t max_lro_msg_size;\n@@ -820,10 +819,8 @@ int mlx5_hairpin_cap_get(struct rte_eth_dev *dev,\n \n int mlx5_get_ifname(const struct rte_eth_dev *dev, char (*ifname)[IF_NAMESIZE]);\n unsigned int mlx5_ifindex(const struct rte_eth_dev *dev);\n-int mlx5_ifreq(const struct rte_eth_dev *dev, int req, struct ifreq *ifr);\n+int mlx5_get_mac(struct rte_eth_dev *dev, uint8_t (*mac)[RTE_ETHER_ADDR_LEN]);\n int mlx5_get_mtu(struct rte_eth_dev *dev, uint16_t *mtu);\n-int mlx5_set_flags(struct rte_eth_dev *dev, unsigned int keep,\n-\t\t   unsigned int flags);\n int mlx5_set_mtu(struct rte_eth_dev *dev, uint16_t mtu);\n int mlx5_read_clock(struct rte_eth_dev *dev, uint64_t *clock);\n int mlx5_link_update(struct rte_eth_dev *dev, int wait_to_complete);\n@@ -857,6 +854,11 @@ int mlx5_get_module_info(struct rte_eth_dev *dev,\n int mlx5_get_module_eeprom(struct rte_eth_dev *dev,\n \t\t\t   struct rte_dev_eeprom_info *info);\n int mlx5_dev_configure_rss_reta(struct rte_eth_dev *dev);\n+int mlx5_os_read_dev_stat(struct mlx5_priv *priv,\n+\t\t\t  const char *ctr_name, uint64_t *stat);\n+int mlx5_os_read_dev_counters(struct rte_eth_dev *dev, uint64_t *stats);\n+int mlx5_os_get_stats_n(struct rte_eth_dev *dev);\n+void mlx5_os_stats_init(struct rte_eth_dev *dev);\n \n /* mlx5_mac.c */\n \n@@ -1017,11 +1019,6 @@ int mlx5_os_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,\n \t\t       struct rte_pci_device *pci_dev);\n void mlx5_os_dev_shared_handler_install(struct mlx5_dev_ctx_shared *sh);\n void mlx5_os_dev_shared_handler_uninstall(struct mlx5_dev_ctx_shared *sh);\n-int mlx5_os_read_dev_stat(struct mlx5_priv *priv,\n-\t\t\t  const char *ctr_name, uint64_t *stat);\n-int mlx5_os_read_dev_counters(struct rte_eth_dev *dev, uint64_t *stats);\n-int mlx5_os_get_stats_n(struct rte_eth_dev *dev);\n-void mlx5_os_stats_init(struct rte_eth_dev *dev);\n void mlx5_os_set_reg_mr_cb(mlx5_reg_mr_t *reg_mr_cb,\n \t\t\t   mlx5_dereg_mr_t *dereg_mr_cb);\n void mlx5_os_mac_addr_remove(struct rte_eth_dev *dev, uint32_t index);\n",
    "prefixes": [
        "v3",
        "5/8"
    ]
}