get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 66699,
    "url": "https://patches.dpdk.org/api/patches/66699/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/1584351224-23500-7-git-send-email-hkalra@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": "<1584351224-23500-7-git-send-email-hkalra@marvell.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1584351224-23500-7-git-send-email-hkalra@marvell.com",
    "date": "2020-03-16T09:33:42",
    "name": "[6/8] net/octeontx: add set link up down support",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "3a614bfc836314f78b38f2ee412c27b8df23d6e1",
    "submitter": {
        "id": 1182,
        "url": "https://patches.dpdk.org/api/people/1182/?format=api",
        "name": "Harman Kalra",
        "email": "hkalra@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/1584351224-23500-7-git-send-email-hkalra@marvell.com/mbox/",
    "series": [
        {
            "id": 8923,
            "url": "https://patches.dpdk.org/api/series/8923/?format=api",
            "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=8923",
            "date": "2020-03-16T09:33:36",
            "name": "add new features to octeontx PMD",
            "version": 1,
            "mbox": "https://patches.dpdk.org/series/8923/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/66699/comments/",
    "check": "fail",
    "checks": "https://patches.dpdk.org/api/patches/66699/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 E0BE5A0559;\n\tMon, 16 Mar 2020 10:36:12 +0100 (CET)",
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 052CB1C0DA;\n\tMon, 16 Mar 2020 10:35:05 +0100 (CET)",
            "from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com\n [67.231.156.173]) by dpdk.org (Postfix) with ESMTP id 9EC2F1C0B8\n for <dev@dpdk.org>; Mon, 16 Mar 2020 10:34:57 +0100 (CET)",
            "from pps.filterd (m0045851.ppops.net [127.0.0.1])\n by mx0b-0016f401.pphosted.com (8.16.0.42/8.16.0.42) with SMTP id\n 02G9UQ2s015065; Mon, 16 Mar 2020 02:34:57 -0700",
            "from sc-exch01.marvell.com ([199.233.58.181])\n by mx0b-0016f401.pphosted.com with ESMTP id 2yrxsme52m-1\n (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT);\n Mon, 16 Mar 2020 02:34:56 -0700",
            "from DC5-EXCH02.marvell.com (10.69.176.39) by SC-EXCH01.marvell.com\n (10.93.176.81) with Microsoft SMTP Server (TLS) id 15.0.1497.2;\n Mon, 16 Mar 2020 02:34:54 -0700",
            "from SC-EXCH03.marvell.com (10.93.176.83) by DC5-EXCH02.marvell.com\n (10.69.176.39) with Microsoft SMTP Server (TLS) id 15.0.1497.2;\n Mon, 16 Mar 2020 02:34:53 -0700",
            "from NAM11-BN8-obe.outbound.protection.outlook.com (104.47.58.169)\n by SC-EXCH03.marvell.com (10.93.176.83) with Microsoft SMTP Server (TLS) id\n 15.0.1497.2 via Frontend Transport; Mon, 16 Mar 2020 02:34:53 -0700",
            "from MN2PR18MB2848.namprd18.prod.outlook.com (2603:10b6:208:38::19)\n by MN2PR18MB3117.namprd18.prod.outlook.com (2603:10b6:208:162::16)\n with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2814.14; Mon, 16 Mar\n 2020 09:34:50 +0000",
            "from MN2PR18MB2848.namprd18.prod.outlook.com\n ([fe80::f829:3e55:94f6:4efb]) by MN2PR18MB2848.namprd18.prod.outlook.com\n ([fe80::f829:3e55:94f6:4efb%5]) with mapi id 15.20.2814.021; Mon, 16 Mar 2020\n 09:34:50 +0000",
            "from hkarlara-OptiPlex-3046.marvell.com (115.113.156.2) by\n BMXPR01CA0006.INDPRD01.PROD.OUTLOOK.COM (2603:1096:b00:d::16) with Microsoft\n SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256) id\n 15.20.2814.13 via Frontend Transport; Mon, 16 Mar 2020 09:34:39 +0000"
        ],
        "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 : content-type :\n mime-version; s=pfpt0818; bh=Zbm0IdHsY6w1a8NrFFEVZkHSHR0rjxdZRlPAILFMZ0g=;\n b=WFeiON7G2Il4amPy1DaTrT5YTUCv3W7Ise2m5KI9P8/VQoMXiYq3UbB+zYGJcfkjm/GJ\n DFuscAWDEt2SgaIMIHHhuiBnpvSmCQ1epLS7923OGBdYd7IvUrKKbV9pM7bWbuErvBq2\n OHenyUd7ULwxcWgwyQS307+s1rJiDgQRuTdLkIPmshtsGrsB35YhJaRST5gdfLgQZfDl\n vYJ8xNPmnn4z6dflnRo667RDFT/Y8srHCDNdaQqpVhmEAulB9V7gkul17dxE+/dECq51\n YQ8FKwzUWIzQJ1FgzyGtKtoN2RvM/cPghhMukMBwB9p+ZBOge2ZWgRmlc2V6tLh9JXUR PQ==",
            "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=marvell.onmicrosoft.com; s=selector1-marvell-onmicrosoft-com;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n bh=Zbm0IdHsY6w1a8NrFFEVZkHSHR0rjxdZRlPAILFMZ0g=;\n b=cveStTxlPdl9iqItF8FvPZhflLyU6FEGybvrXRG72x1WhDI9szTfkyT2nnTZaPh7SNNis1TFvZZ11NaQBaUBSxEws2yYUyZZB6DLHoxdXm7rKOoywKlGgeONB7Amey9AdESmlDV39JIIZD3CZLWTUKwgpm1BoslJ4LJlFdWOYyE="
        ],
        "ARC-Seal": "i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none;\n b=OhiEEWqIjBbrszqoicgxMzHMhEO6tDVnpr34azaZsrVPhoexkQbcbVxyfF938C8kk5qTT+CnYuMHWXNyqRyTOJL/9t+TgdVBRDYh6k5aum5wNFILAk4pm2GtYbG2cuIjjaTR1yiNQNA+qEdrYuOa1kYUnY0pD5KCwsmwflQu/r6DCG+xKdyv9/XdVS+pbTgoDS0E5gurN0Xu8qhaF93Lbe/1HFmmzy//WXYA4ji+SkFTdgAPV10Fqnf5qFunv+XzjPXTMXbPJ8p2AuCzQmpczgOAQ9eUz8tP9dgL12jJ4R2HqZgi67S7Xg33S7VshyxaiKQpdDYsfqoyVJRQiwxpbQ==",
        "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=Zbm0IdHsY6w1a8NrFFEVZkHSHR0rjxdZRlPAILFMZ0g=;\n b=Ek6pppG7Shm8JCIzawmKFfKZC1gu59azx1lx6FgGb0/w/gvvvYoyfjVnr8kY77iqA6fGLYru72kS64Pt80Ictysr7dDYE+OPmWn9pjQxCuBEbnRLYycVLrW7jGhV5YPDvFJHi6pS4rF3e0yPJFMmL/zm2s0y8qVdY3vzsJW3n1a17ceG5s7Tvmh4ROhY+v9wh0PA8EPm7KUQxIi0fu0dYCFK/jj6CDpsoSyR7t/4xTJpyVE9z3C4wqdFDrsAhUzslmoA2AxZqjN/nlSeNlL4GWGOJZotjDY2M984EOZ8f81AsAu8hOcXjYA0caPUoiBdAct54gx6SiyHCSas/+XqFA==",
        "ARC-Authentication-Results": "i=1; mx.microsoft.com 1; spf=pass\n smtp.mailfrom=marvell.com; dmarc=pass action=none header.from=marvell.com;\n dkim=pass header.d=marvell.com; arc=none",
        "From": "Harman Kalra <hkalra@marvell.com>",
        "To": "<jerinj@marvell.com>, <john.mcnamara@intel.com>,\n <marko.kovacevic@intel.com>",
        "CC": "<dev@dpdk.org>, <vattunuru@marvell.com>, Harman Kalra <hkalra@marvell.com>",
        "Date": "Mon, 16 Mar 2020 15:03:42 +0530",
        "Message-ID": "<1584351224-23500-7-git-send-email-hkalra@marvell.com>",
        "X-Mailer": [
            "git-send-email 2.7.4",
            "git-send-email 2.7.4"
        ],
        "In-Reply-To": "<1584351224-23500-1-git-send-email-hkalra@marvell.com>",
        "References": "<1584351224-23500-1-git-send-email-hkalra@marvell.com>",
        "Content-Type": "text/plain",
        "X-ClientProxiedBy": "BMXPR01CA0006.INDPRD01.PROD.OUTLOOK.COM\n (2603:1096:b00:d::16) To MN2PR18MB2848.namprd18.prod.outlook.com\n (2603:10b6:208:38::19)",
        "MIME-Version": "1.0",
        "X-MS-Exchange-MessageSentRepresentingType": "1",
        "X-Originating-IP": "[115.113.156.2]",
        "X-MS-PublicTrafficType": "Email",
        "X-MS-Office365-Filtering-Correlation-Id": "0c3eb087-02b8-4b42-f0de-08d7c98d40b5",
        "X-MS-TrafficTypeDiagnostic": "MN2PR18MB3117:",
        "X-MS-Exchange-Transport-Forked": "True",
        "X-Microsoft-Antispam-PRVS": "\n <MN2PR18MB31178590969CDBCE7D2B7E20C5F90@MN2PR18MB3117.namprd18.prod.outlook.com>",
        "X-MS-Oob-TLC-OOBClassifiers": "OLM:102;",
        "X-Forefront-PRVS": "03449D5DD1",
        "X-Forefront-Antispam-Report": "SFV:NSPM;\n SFS:(10009020)(4636009)(366004)(136003)(376002)(39860400002)(346002)(396003)(199004)(52116002)(7696005)(478600001)(4326008)(8676002)(8936002)(107886003)(26005)(66556008)(30864003)(2906002)(86362001)(5660300002)(36756003)(55236004)(16526019)(2616005)(956004)(66946007)(6486002)(66476007)(81156014)(81166006)(6666004)(186003)(316002);\n DIR:OUT; SFP:1101; SCL:1; SRVR:MN2PR18MB3117;\n H:MN2PR18MB2848.namprd18.prod.outlook.com; FPR:; SPF:None; LANG:en;\n PTR:InfoNoRecords; A:1;",
        "Received-SPF": "None (protection.outlook.com: marvell.com does not designate\n permitted sender hosts)",
        "X-MS-Exchange-SenderADCheck": "1",
        "X-Microsoft-Antispam": "BCL:0;",
        "X-Microsoft-Antispam-Message-Info": "\n TcxGsHW40u5Ed69EK36NHUojVmG44dlim4KbczjHOUyJ/ViGIvN03NO9jccDFItsfZDT+oV443ekW3Lmyw0UjJAc+p7FuT8J/IoDeSaAe3b/QUHGpCouDiibx0pFyUGv6UzuKIxcEhQThSCqUb7HrGYYyFULb5cV4z/YHA6WGZPYbTLxgCmYsCg6Nc2fOV2O6rIRsonD8UBNsDd2CKY2hoapyf5/O/qSHFk99uNZuqLnwShWEjiD0OneLzkn5GWELfaG4v4hDqUlOiZe3U9IcMICjClcW0Co/GQa0kitci2B0DcBv6VpEEtsJBsfMFSFiz8uJesvQUKxlRpWjby97Du+9e53XWize+wUPtR9PDM9WMHMUeRr+e74gzXGctMKLWqp62fmW8BzVrJkgkcM1XqOmS6rj2kmue8ogVlhaFITB2IMwb1AgN6M3C5eIrnv",
        "X-MS-Exchange-AntiSpam-MessageData": "\n ZuUy7oUM6jIsumGCpJIpR1J2wZX2I0kramNSvyfnwHZ6cw80eXwhBVNlWh01l0OzFrgbKw5pWJrN642JESCainM2WeBy8sOh9GGaf0MAdCM6JRi5/MUMATOZmwAC9C6ZzDSp1ydE98368X41npl2FQ==",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "\n 0c3eb087-02b8-4b42-f0de-08d7c98d40b5",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "16 Mar 2020 09:34:41.1010 (UTC)",
        "X-MS-Exchange-CrossTenant-FromEntityHeader": "Hosted",
        "X-MS-Exchange-CrossTenant-Id": "70e1fb47-1155-421d-87fc-2e58f638b6e0",
        "X-MS-Exchange-CrossTenant-MailboxType": "HOSTED",
        "X-MS-Exchange-CrossTenant-UserPrincipalName": "\n oo8hdql7/SZB8qr69iMLsmGy3qicDB1PAgZjp8IBhRgeRV208mZp9HLe6o9748lDUYH6AjyiexH8x1Mq9tqwTg==",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "MN2PR18MB3117",
        "X-OriginatorOrg": "marvell.com",
        "X-Proofpoint-Virus-Version": "vendor=fsecure engine=2.50.10434:6.0.138, 18.0.572\n definitions=2020-03-16_02:2020-03-12,\n 2020-03-16 signatures=0",
        "Subject": "[dpdk-dev] [PATCH 6/8] net/octeontx: add set link up down support",
        "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": "Adding support for setting link up/down eth operation.\nIt is used to enable disable lmac.  Also implemented a\npoll function for getting the link status at regular\nintervals.\n\nSigned-off-by: Harman Kalra <hkalra@marvell.com>\n---\n doc/guides/nics/features/octeontx.ini      |   1 +\n drivers/net/octeontx/base/octeontx_bgx.c   |  12 ++\n drivers/net/octeontx/base/octeontx_bgx.h   |   3 +\n drivers/net/octeontx/octeontx_ethdev.c     | 152 ++++++++++++++++-----\n drivers/net/octeontx/octeontx_ethdev.h     |   7 +-\n drivers/net/octeontx/octeontx_ethdev_ops.c |  31 +++++\n 6 files changed, 169 insertions(+), 37 deletions(-)",
    "diff": "diff --git a/doc/guides/nics/features/octeontx.ini b/doc/guides/nics/features/octeontx.ini\nindex 53c541f4b..377bb4d30 100644\n--- a/doc/guides/nics/features/octeontx.ini\n+++ b/doc/guides/nics/features/octeontx.ini\n@@ -6,6 +6,7 @@\n [Features]\n Speed capabilities   = Y\n Link status          = Y\n+Link status event    = Y\n Lock-free Tx queue   = Y\n Queue start/stop     = P\n MTU update           = Y\ndiff --git a/drivers/net/octeontx/base/octeontx_bgx.c b/drivers/net/octeontx/base/octeontx_bgx.c\nindex cc2bbd104..d8611cb77 100644\n--- a/drivers/net/octeontx/base/octeontx_bgx.c\n+++ b/drivers/net/octeontx/base/octeontx_bgx.c\n@@ -207,6 +207,18 @@ octeontx_bgx_port_link_status(int port)\n \treturn link;\n }\n \n+int\n+octeontx_bgx_port_set_link_state(int port, bool enable)\n+{\n+\tstruct octeontx_mbox_hdr hdr;\n+\n+\thdr.coproc = OCTEONTX_BGX_COPROC;\n+\thdr.msg = MBOX_BGX_PORT_SET_LINK_STATE;\n+\thdr.vfid = port;\n+\n+\treturn octeontx_mbox_send(&hdr, &enable, sizeof(bool), NULL, 0);\n+}\n+\n int\n octeontx_bgx_port_promisc_set(int port, int en)\n {\ndiff --git a/drivers/net/octeontx/base/octeontx_bgx.h b/drivers/net/octeontx/base/octeontx_bgx.h\nindex e385de42d..6b7476510 100644\n--- a/drivers/net/octeontx/base/octeontx_bgx.h\n+++ b/drivers/net/octeontx/base/octeontx_bgx.h\n@@ -5,6 +5,7 @@\n #ifndef __OCTEONTX_BGX_H__\n #define __OCTEONTX_BGX_H__\n \n+#include <stdbool.h>\n #include <stddef.h>\n #include <stdint.h>\n \n@@ -31,6 +32,7 @@\n #define MBOX_BGX_PORT_ADD_MACADDR\t15\n #define MBOX_BGX_PORT_DEL_MACADDR\t16\n #define MBOX_BGX_PORT_GET_MACADDR_ENTRIES 17\n+#define MBOX_BGX_PORT_SET_LINK_STATE\t20\n \n /* BGX port configuration parameters: */\n typedef struct octeontx_mbox_bgx_port_conf {\n@@ -132,6 +134,7 @@ int octeontx_bgx_port_mac_add(int port, uint8_t *mac_addr, int index);\n int octeontx_bgx_port_mac_del(int port, uint32_t index);\n int octeontx_bgx_port_mac_entries_get(int port);\n int octeontx_bgx_port_mtu_set(int port, int mtu);\n+int octeontx_bgx_port_set_link_state(int port, bool en);\n \n #endif\t/* __OCTEONTX_BGX_H__ */\n \ndiff --git a/drivers/net/octeontx/octeontx_ethdev.c b/drivers/net/octeontx/octeontx_ethdev.c\nindex 5dd40bc04..08c621b4b 100644\n--- a/drivers/net/octeontx/octeontx_ethdev.c\n+++ b/drivers/net/octeontx/octeontx_ethdev.c\n@@ -11,6 +11,8 @@\n \n #include <rte_alarm.h>\n #include <rte_branch_prediction.h>\n+#include <rte_bus_vdev.h>\n+#include <rte_cycles.h>\n #include <rte_debug.h>\n #include <rte_devargs.h>\n #include <rte_dev.h>\n@@ -18,7 +20,6 @@\n #include <rte_malloc.h>\n #include <rte_mbuf_pool_ops.h>\n #include <rte_prefetch.h>\n-#include <rte_bus_vdev.h>\n \n #include \"octeontx_ethdev.h\"\n #include \"octeontx_rxtx.h\"\n@@ -153,11 +154,102 @@ octeontx_port_open(struct octeontx_nic *nic)\n \treturn res;\n }\n \n+static void\n+octeontx_link_status_print(struct rte_eth_dev *eth_dev,\n+\t\t\t   struct rte_eth_link *link)\n+{\n+\tif (link && link->link_status)\n+\t\tocteontx_log_info(\"Port %u: Link Up - speed %u Mbps - %s\",\n+\t\t\t  (eth_dev->data->port_id),\n+\t\t\t  link->link_speed,\n+\t\t\t  link->link_duplex == ETH_LINK_FULL_DUPLEX ?\n+\t\t\t  \"full-duplex\" : \"half-duplex\");\n+\telse\n+\t\tocteontx_log_info(\"Port %d: Link Down\",\n+\t\t\t\t  (int)(eth_dev->data->port_id));\n+}\n+\n+static void\n+octeontx_link_status_update(struct octeontx_nic *nic,\n+\t\t\t struct rte_eth_link *link)\n+{\n+\tmemset(link, 0, sizeof(*link));\n+\n+\tlink->link_status = nic->link_up ? ETH_LINK_UP : ETH_LINK_DOWN;\n+\n+\tswitch (nic->speed) {\n+\tcase OCTEONTX_LINK_SPEED_SGMII:\n+\t\tlink->link_speed = ETH_SPEED_NUM_1G;\n+\t\tbreak;\n+\n+\tcase OCTEONTX_LINK_SPEED_XAUI:\n+\t\tlink->link_speed = ETH_SPEED_NUM_10G;\n+\t\tbreak;\n+\n+\tcase OCTEONTX_LINK_SPEED_RXAUI:\n+\tcase OCTEONTX_LINK_SPEED_10G_R:\n+\t\tlink->link_speed = ETH_SPEED_NUM_10G;\n+\t\tbreak;\n+\tcase OCTEONTX_LINK_SPEED_QSGMII:\n+\t\tlink->link_speed = ETH_SPEED_NUM_5G;\n+\t\tbreak;\n+\tcase OCTEONTX_LINK_SPEED_40G_R:\n+\t\tlink->link_speed = ETH_SPEED_NUM_40G;\n+\t\tbreak;\n+\n+\tcase OCTEONTX_LINK_SPEED_RESERVE1:\n+\tcase OCTEONTX_LINK_SPEED_RESERVE2:\n+\tdefault:\n+\t\tlink->link_speed = ETH_SPEED_NUM_NONE;\n+\t\tocteontx_log_err(\"incorrect link speed %d\", nic->speed);\n+\t\tbreak;\n+\t}\n+\n+\tlink->link_duplex = ETH_LINK_FULL_DUPLEX;\n+\tlink->link_autoneg = ETH_LINK_AUTONEG;\n+}\n+\n+static void\n+octeontx_link_status_poll(void *arg)\n+{\n+\tstruct octeontx_nic *nic = arg;\n+\tstruct rte_eth_link link;\n+\tstruct rte_eth_dev *dev;\n+\tint res;\n+\n+\tPMD_INIT_FUNC_TRACE();\n+\n+\tdev = nic->dev;\n+\n+\tres = octeontx_bgx_port_link_status(nic->port_id);\n+\tif (res < 0) {\n+\t\tocteontx_log_err(\"Failed to get port %d link status\",\n+\t\t\t\tnic->port_id);\n+\t} else {\n+\t\tif (nic->link_up != (uint8_t)res) {\n+\t\t\tnic->link_up = (uint8_t)res;\n+\t\t\tocteontx_link_status_update(nic, &link);\n+\t\t\tocteontx_link_status_print(dev, &link);\n+\t\t\trte_eth_linkstatus_set(dev, &link);\n+\t\t\t_rte_eth_dev_callback_process(dev,\n+\t\t\t\t\t\t      RTE_ETH_EVENT_INTR_LSC,\n+\t\t\t\t\t\t      NULL);\n+\t\t}\n+\t}\n+\n+\tres = rte_eal_alarm_set(OCCTX_INTR_POLL_INTERVAL_MS * 1000,\n+\t\t\t\tocteontx_link_status_poll, nic);\n+\tif (res < 0)\n+\t\tocteontx_log_err(\"Failed to restart alarm for port %d, err: %d\",\n+\t\t\t\tnic->port_id, res);\n+}\n+\n static void\n octeontx_port_close(struct octeontx_nic *nic)\n {\n \tPMD_INIT_FUNC_TRACE();\n \n+\trte_eal_alarm_cancel(octeontx_link_status_poll, nic);\n \tocteontx_bgx_port_close(nic->port_id);\n \tocteontx_log_dbg(\"port closed %d\", nic->port_id);\n }\n@@ -411,6 +503,8 @@ octeontx_dev_close(struct rte_eth_dev *dev)\n \trte_free(dev->data->mac_addrs);\n \tdev->data->mac_addrs = NULL;\n \n+\tocteontx_port_close(nic);\n+\n \tdev->tx_pkt_burst = NULL;\n \tdev->rx_pkt_burst = NULL;\n }\n@@ -503,7 +597,7 @@ octeontx_dev_start(struct rte_eth_dev *dev)\n {\n \tstruct octeontx_nic *nic = octeontx_pmd_priv(dev);\n \tstruct octeontx_rxq *rxq;\n-\tint ret = 0, i;\n+\tint ret, i;\n \n \tPMD_INIT_FUNC_TRACE();\n \t/* Rechecking if any new offload set to update\n@@ -636,7 +730,10 @@ octeontx_port_link_status(struct octeontx_nic *nic)\n \t\treturn res;\n \t}\n \n-\tnic->link_up = (uint8_t)res;\n+\tif (nic->link_up != (uint8_t)res || nic->print_flag == -1) {\n+\t\tnic->link_up = (uint8_t)res;\n+\t\tnic->print_flag = 1;\n+\t}\n \tocteontx_log_dbg(\"port %d link status %d\", nic->port_id, nic->link_up);\n \n \treturn res;\n@@ -661,39 +758,12 @@ octeontx_dev_link_update(struct rte_eth_dev *dev,\n \t\treturn res;\n \t}\n \n-\tlink.link_status = nic->link_up;\n-\n-\tswitch (nic->speed) {\n-\tcase OCTEONTX_LINK_SPEED_SGMII:\n-\t\tlink.link_speed = ETH_SPEED_NUM_1G;\n-\t\tbreak;\n-\n-\tcase OCTEONTX_LINK_SPEED_XAUI:\n-\t\tlink.link_speed = ETH_SPEED_NUM_10G;\n-\t\tbreak;\n-\n-\tcase OCTEONTX_LINK_SPEED_RXAUI:\n-\tcase OCTEONTX_LINK_SPEED_10G_R:\n-\t\tlink.link_speed = ETH_SPEED_NUM_10G;\n-\t\tbreak;\n-\tcase OCTEONTX_LINK_SPEED_QSGMII:\n-\t\tlink.link_speed = ETH_SPEED_NUM_5G;\n-\t\tbreak;\n-\tcase OCTEONTX_LINK_SPEED_40G_R:\n-\t\tlink.link_speed = ETH_SPEED_NUM_40G;\n-\t\tbreak;\n-\n-\tcase OCTEONTX_LINK_SPEED_RESERVE1:\n-\tcase OCTEONTX_LINK_SPEED_RESERVE2:\n-\tdefault:\n-\t\tlink.link_speed = ETH_SPEED_NUM_NONE;\n-\t\tocteontx_log_err(\"incorrect link speed %d\", nic->speed);\n-\t\tbreak;\n+\tocteontx_link_status_update(nic, &link);\n+\tif (nic->print_flag) {\n+\t\tocteontx_link_status_print(nic->dev, &link);\n+\t\tnic->print_flag = 0;\n \t}\n \n-\tlink.link_duplex = ETH_LINK_FULL_DUPLEX;\n-\tlink.link_autoneg = ETH_LINK_AUTONEG;\n-\n \treturn rte_eth_linkstatus_set(dev, &link);\n }\n \n@@ -855,7 +925,7 @@ octeontx_vf_start_tx_queue(struct rte_eth_dev *dev, struct octeontx_nic *nic,\n \treturn res;\n }\n \n-static int\n+int\n octeontx_dev_tx_queue_start(struct rte_eth_dev *dev, uint16_t qidx)\n {\n \tstruct octeontx_nic *nic = octeontx_pmd_priv(dev);\n@@ -881,7 +951,7 @@ octeontx_vf_stop_tx_queue(struct rte_eth_dev *dev, struct octeontx_nic *nic,\n \treturn ret;\n }\n \n-static int\n+int\n octeontx_dev_tx_queue_stop(struct rte_eth_dev *dev, uint16_t qidx)\n {\n \tstruct octeontx_nic *nic = octeontx_pmd_priv(dev);\n@@ -1201,6 +1271,8 @@ static const struct eth_dev_ops octeontx_dev_ops = {\n \t.tx_queue_release\t = octeontx_dev_tx_queue_release,\n \t.rx_queue_setup\t\t = octeontx_dev_rx_queue_setup,\n \t.rx_queue_release\t = octeontx_dev_rx_queue_release,\n+\t.dev_set_link_up          = octeontx_dev_set_link_up,\n+\t.dev_set_link_down        = octeontx_dev_set_link_down,\n \t.dev_supported_ptypes_get = octeontx_dev_supported_ptypes_get,\n \t.mtu_set                 = octeontx_dev_mtu_set,\n \t.pool_ops_supported      = octeontx_pool_ops,\n@@ -1285,6 +1357,7 @@ octeontx_create(struct rte_vdev_device *dev, int port, uint8_t evdev,\n \n \tnic->ev_queues = 1;\n \tnic->ev_ports = 1;\n+\tnic->print_flag = -1;\n \n \tdata->dev_link.link_status = ETH_LINK_DOWN;\n \tdata->dev_started = 0;\n@@ -1321,6 +1394,13 @@ octeontx_create(struct rte_vdev_device *dev, int port, uint8_t evdev,\n \t\tgoto free_mac_addrs;\n \t}\n \n+\tres = rte_eal_alarm_set(OCCTX_INTR_POLL_INTERVAL_MS * 1000,\n+\t\t\t\tocteontx_link_status_poll, nic);\n+\tif (res) {\n+\t\tocteontx_log_err(\"Failed to start link polling alarm\");\n+\t\tgoto err;\n+\t}\n+\n \t/* Update port_id mac to eth_dev */\n \tmemcpy(data->mac_addrs, nic->mac_addr, RTE_ETHER_ADDR_LEN);\n \ndiff --git a/drivers/net/octeontx/octeontx_ethdev.h b/drivers/net/octeontx/octeontx_ethdev.h\nindex e7e0d40c7..186a044f7 100644\n--- a/drivers/net/octeontx/octeontx_ethdev.h\n+++ b/drivers/net/octeontx/octeontx_ethdev.h\n@@ -30,7 +30,7 @@\n #define OCTEONTX_MAX_LMAC_PER_BGX\t\t4\n \n #define OCCTX_RX_NB_SEG_MAX\t\t\t6\n-\n+#define OCCTX_INTR_POLL_INTERVAL_MS\t\t1000\n /* VLAN tag inserted by OCCTX_TX_VTAG_ACTION.\n  * In Tx space is always reserved for this in FRS.\n  */\n@@ -121,6 +121,7 @@ struct octeontx_nic {\n \tuint64_t tx_offloads;\n \tuint16_t tx_offload_flags;\n \tstruct octeontx_vlan_info vlan_info;\n+\tint print_flag;\n } __rte_cache_aligned;\n \n struct octeontx_txq {\n@@ -143,10 +144,14 @@ void\n octeontx_set_tx_function(struct rte_eth_dev *dev);\n \n /* VLAN */\n+int octeontx_dev_tx_queue_start(struct rte_eth_dev *dev, uint16_t qidx);\n+int octeontx_dev_tx_queue_stop(struct rte_eth_dev *dev, uint16_t qidx);\n int octeontx_dev_vlan_offload_init(struct rte_eth_dev *dev);\n int octeontx_dev_vlan_offload_fini(struct rte_eth_dev *eth_dev);\n int octeontx_dev_vlan_offload_set(struct rte_eth_dev *dev, int mask);\n int octeontx_dev_vlan_filter_set(struct rte_eth_dev *dev,\n \t\t\t\t uint16_t vlan_id, int on);\n+int octeontx_dev_set_link_up(struct rte_eth_dev *eth_dev);\n+int octeontx_dev_set_link_down(struct rte_eth_dev *eth_dev);\n \n #endif /* __OCTEONTX_ETHDEV_H__ */\ndiff --git a/drivers/net/octeontx/octeontx_ethdev_ops.c b/drivers/net/octeontx/octeontx_ethdev_ops.c\nindex 8c3065542..b5f0bfe8a 100644\n--- a/drivers/net/octeontx/octeontx_ethdev_ops.c\n+++ b/drivers/net/octeontx/octeontx_ethdev_ops.c\n@@ -182,3 +182,34 @@ octeontx_dev_vlan_offload_fini(struct rte_eth_dev *dev)\n \n \treturn rc;\n }\n+\n+int\n+octeontx_dev_set_link_up(struct rte_eth_dev *eth_dev)\n+{\n+\tstruct octeontx_nic *nic = octeontx_pmd_priv(eth_dev);\n+\tint rc, i;\n+\n+\trc = octeontx_bgx_port_set_link_state(nic->port_id, true);\n+\tif (rc)\n+\t\tgoto done;\n+\n+\t/* Start tx queues  */\n+\tfor (i = 0; i < eth_dev->data->nb_tx_queues; i++)\n+\t\tocteontx_dev_tx_queue_start(eth_dev, i);\n+\n+done:\n+\treturn rc;\n+}\n+\n+int\n+octeontx_dev_set_link_down(struct rte_eth_dev *eth_dev)\n+{\n+\tstruct octeontx_nic *nic = octeontx_pmd_priv(eth_dev);\n+\tint i;\n+\n+\t/* Stop tx queues  */\n+\tfor (i = 0; i < eth_dev->data->nb_tx_queues; i++)\n+\t\tocteontx_dev_tx_queue_stop(eth_dev, i);\n+\n+\treturn octeontx_bgx_port_set_link_state(nic->port_id, false);\n+}\n",
    "prefixes": [
        "6/8"
    ]
}