get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 74421,
    "url": "http://patches.dpdk.org/api/patches/74421/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20200719071112.8540-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": "<20200719071112.8540-6-ophirmu@mellanox.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20200719071112.8540-6-ophirmu@mellanox.com",
    "date": "2020-07-19T07:11:09",
    "name": "[v2,5/8] net/mlx5: eliminate dependency on Linux in shared header",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "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/20200719071112.8540-6-ophirmu@mellanox.com/mbox/",
    "series": [
        {
            "id": 11144,
            "url": "http://patches.dpdk.org/api/series/11144/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=11144",
            "date": "2020-07-19T07:11:04",
            "name": "mlx5 PMD multi OS support - part #3",
            "version": 2,
            "mbox": "http://patches.dpdk.org/series/11144/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/74421/comments/",
    "check": "warning",
    "checks": "http://patches.dpdk.org/api/patches/74421/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 4918EA052A;\n\tSun, 19 Jul 2020 09:12:22 +0200 (CEST)",
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 996311C06C;\n\tSun, 19 Jul 2020 09:11:42 +0200 (CEST)",
            "from EUR04-DB3-obe.outbound.protection.outlook.com\n (mail-eopbgr60067.outbound.protection.outlook.com [40.107.6.67])\n by dpdk.org (Postfix) with ESMTP id DCDC11C02E\n for <dev@dpdk.org>; Sun, 19 Jul 2020 09:11:31 +0200 (CEST)",
            "from AM0PR05MB4209.eurprd05.prod.outlook.com (2603:10a6:208:61::22)\n by AM0PR05MB4738.eurprd05.prod.outlook.com (2603:10a6:208:b7::18)\n with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3174.21; Sun, 19 Jul\n 2020 07:11: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 07:11:30 +0000",
            "from mellanox.com (37.142.13.130) by\n AM0PR04CA0024.eurprd04.prod.outlook.com (2603:10a6:208:122::37) with\n Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3195.17 via Frontend\n Transport; Sun, 19 Jul 2020 07:11:30 +0000"
        ],
        "ARC-Seal": "i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none;\n b=ZuleNH3ZLf6nTHT+JNhJm9JVIW3QYU3/1GAcwFuWygVT5oTzA+2y7naC0/rjbP1lbcEk1gIAZHK7pnn+JGWY/M+AivfiGywCTSlIMQIyM3KeHllmOJqopIb84v2J1aXvpuo0j7zpyIcPfg3kDgnt/z467iXSQDNYgQV31wZjGhX3hewODoYNqYcEMJOsVAVKALaywfNs4veAIOUdJwbDZEILUy1s5Hlmuz7DE3O9XaZtyxpr4ncPDRxtkGF1261yBnqb1h1r9o4KMjI/9bCXOTKfTYwWhWw/bj5qwOH523YeUWumzHwMxVljEROpv5LaX2zFnRg2SN3l2aJUjYNu0A==",
        "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=iX2fjPLsId+aWlBjoaSinoVNftdFVgIb1cAp24oeFp0=;\n b=CBbh7Fd8yhTlxw5Gk8KFyHB1QbbrG/ERBWW05/WxhB6cwvitx1wj+DEUvT1EOav9pHySRBYnKm8q078bN6SVPCxd/g/WGFobjkv2EzFZT3t4Lsfgz2+5jrgc80JU0G0Qf2PbaMBx8mhZzPQpr0lBoGZ7pVpYHhurx9F9LPrN7R0rrHIc0bEL1Qh2XTNBTVPlNSY4hBYQzah6GUpDxoisDJpEElvdzE0z0FD4Awv8n7zVxCgwIgBm9pWRe8Ok91d/CpbjCLIXYemDZ9/M8RPaAGlRXT81W5DFw9+zrHYmRFr8mVh8fs59LMe7tzfSEcRH3/w7IVXSTM7QV5jnbR9mgA==",
        "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=iX2fjPLsId+aWlBjoaSinoVNftdFVgIb1cAp24oeFp0=;\n b=tFUKosG9/lqyeQIU0fmRfXhTKYhOfo5J0VqBPn5KemgtViptgM4uyL8JHVCxjxSy7DJSxHc22WikuGHHE3DPQgf+LeTNbQLZX4xDZkNsRBBHk8J/LnE/tsQVhzuhRInG6cP+J8TmXnjn/8Iyr05wNrmWLULWY/b0y6pT8neFBco=",
        "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 07:11:09 +0000",
        "Message-Id": "<20200719071112.8540-6-ophirmu@mellanox.com>",
        "X-Mailer": [
            "git-send-email 2.8.4",
            "git-send-email 2.8.4"
        ],
        "In-Reply-To": "<20200719071112.8540-1-ophirmu@mellanox.com>",
        "References": "<20200714142102.30606-9-ophirmu@mellanox.com>\n <20200719071112.8540-1-ophirmu@mellanox.com>",
        "Content-Type": "text/plain",
        "X-ClientProxiedBy": "AM0PR04CA0024.eurprd04.prod.outlook.com\n (2603:10a6:208:122::37) 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": "be44f658-6c96-4378-716a-08d82bb2f603",
        "X-MS-TrafficTypeDiagnostic": "AM0PR05MB4738:",
        "X-LD-Processed": "a652971c-7d2e-4d9b-a6a4-d149256f461b,ExtFwd",
        "X-MS-Exchange-Transport-Forked": "True",
        "X-Microsoft-Antispam-PRVS": "\n <AM0PR05MB4738D7654E9590EE5E904A5DD17A0@AM0PR05MB4738.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 Y3TcpH9+SQ0/kl982W2Pu2YJSsVCUIjRlfYjnp+4+tmXT6PqDg2gglwIHSmRnTFnpWGAmN/aOwNUJnwvo64188B2d2GIZ9HqfXqaU40I8KseUd2Dwm3xPE6+qDpQ4JqOmMMA1p2uddalmRhouB9SXO/p+Jo46r2pTTrU1nN47TMcZY7JoFtDJ1RDD+GUyztgaBzcRGjdVxp69xMlkb7kci6xG2aJI+WTI37u/HoLHtAzSVUpbJ006K5vXUx4z21Lg7KUITEec7QFcWvo9N/33r09XlCJrNUQkMCxrzD+AjcUnxNLB5F7eVARJHg4xXgf34QmpkXc4p0FXzYOf15jpw==",
        "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)(376002)(39850400004)(346002)(136003)(366004)(52116002)(107886003)(5660300002)(2906002)(316002)(36756003)(8886007)(6666004)(7696005)(6916009)(55016002)(8676002)(478600001)(2616005)(4326008)(66556008)(66476007)(186003)(26005)(66946007)(54906003)(83380400001)(1076003)(30864003)(86362001)(16526019)(956004)(8936002);\n DIR:OUT; SFP:1101;",
        "X-MS-Exchange-AntiSpam-MessageData": "\n I+8GucKd+Z4qC2Bn9ekbx4pEFVZfoPvpYhFAo/oK7I1NewNvhiYcpJGdS/Aa7kFzkk+kU/3WotrHFnmf5ffKp2wZkPJki65ShjOZnsBFNN+fomQIlxck4Vy2IJNt5d9qdPImiolQCZ6nB1sFnd3Uy3huyrkl5PPpeF5OPCuaSFwkC1xMT0chMcMY4yqlgf7nIiniIe9tqlUUS42Tg30GjDu2iSe7DmfVAlIw/hruflNAM3xNJiUFQBxub/Ad1/AZniwyqfO7xqDilyYTA1egqyTgNqczxLpc3oljm5xuWuIijwB6XABg/yEclGOaDtFWGqx/UluQnVJ/4esT46xtbKSlKcOwrxYZBEAFCN2OJGGb4lZXfyOOPf7i8jN5f164p95vzg0ksuObEj/o0ZFPTId7xx+J/cxhibALWc6duvD4WfB6w+LH6CE2uzmSD7FGM+fzNhlmQzKE1DunjYJrbYkd2qGqzCx1ibvZOeOJ7EgCx+bkUi6cI7LnRk1orkou",
        "X-OriginatorOrg": "Mellanox.com",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "\n be44f658-6c96-4378-716a-08d82bb2f603",
        "X-MS-Exchange-CrossTenant-AuthSource": "AM0PR05MB4209.eurprd05.prod.outlook.com",
        "X-MS-Exchange-CrossTenant-AuthAs": "Internal",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "19 Jul 2020 07:11:30.6397 (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 J46NcnS9h0l4Mx0a6hJlDmniZMEKO7kDqLFqb4kqoeecX0YOxXbayOm9/XHIrXyaNzfhUwQVzS4Y3eLXLfMLwQ==",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "AM0PR05MB4738",
        "Subject": "[dpdk-dev] [PATCH v2 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 14fffe3..4e21018 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@@ -2074,291 +2050,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 afc0e83..00ee2e3 100644\n--- a/drivers/net/mlx5/mlx5.h\n+++ b/drivers/net/mlx5/mlx5.h\n@@ -736,7 +736,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@@ -819,10 +818,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@@ -856,6 +853,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@@ -1016,11 +1018,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": [
        "v2",
        "5/8"
    ]
}