get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 104957,
    "url": "http://patchwork.dpdk.org/api/patches/104957/?format=api",
    "web_url": "http://patchwork.dpdk.org/project/dpdk/patch/20211206221922.644187-6-stephend@silicom-usa.com/",
    "project": {
        "id": 1,
        "url": "http://patchwork.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": "<20211206221922.644187-6-stephend@silicom-usa.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20211206221922.644187-6-stephend@silicom-usa.com",
    "date": "2021-12-06T22:19:19",
    "name": "[v2,5/7] net/ixgbe: Fix SFP detection and linking on hotplug",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "8d68a50807ff9afc788d9f63dc61977768710422",
    "submitter": {
        "id": 2437,
        "url": "http://patchwork.dpdk.org/api/people/2437/?format=api",
        "name": "Stephen Douthit",
        "email": "stephend@silicom-usa.com"
    },
    "delegate": {
        "id": 1540,
        "url": "http://patchwork.dpdk.org/api/users/1540/?format=api",
        "username": "qzhan15",
        "first_name": "Qi",
        "last_name": "Zhang",
        "email": "qi.z.zhang@intel.com"
    },
    "mbox": "http://patchwork.dpdk.org/project/dpdk/patch/20211206221922.644187-6-stephend@silicom-usa.com/mbox/",
    "series": [
        {
            "id": 20881,
            "url": "http://patchwork.dpdk.org/api/series/20881/?format=api",
            "web_url": "http://patchwork.dpdk.org/project/dpdk/list/?series=20881",
            "date": "2021-12-06T22:19:14",
            "name": "ixgbe SFP handling fixes",
            "version": 2,
            "mbox": "http://patchwork.dpdk.org/series/20881/mbox/"
        }
    ],
    "comments": "http://patchwork.dpdk.org/api/patches/104957/comments/",
    "check": "success",
    "checks": "http://patchwork.dpdk.org/api/patches/104957/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 23F08A034F;\n\tMon,  6 Dec 2021 23:20:26 +0100 (CET)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 0783741160;\n\tMon,  6 Dec 2021 23:19:59 +0100 (CET)",
            "from EUR05-DB8-obe.outbound.protection.outlook.com\n (mail-db8eur05on2095.outbound.protection.outlook.com [40.107.20.95])\n by mails.dpdk.org (Postfix) with ESMTP id 8C69341C28;\n Mon,  6 Dec 2021 23:19:56 +0100 (CET)",
            "from AM0PR04MB4083.eurprd04.prod.outlook.com (2603:10a6:208:64::29)\n by AM0PR04MB6596.eurprd04.prod.outlook.com (2603:10a6:208:173::13)\n with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4755.21; Mon, 6 Dec\n 2021 22:19:54 +0000",
            "from AM0PR04MB4083.eurprd04.prod.outlook.com\n ([fe80::f4db:d40d:a746:7bfc]) by AM0PR04MB4083.eurprd04.prod.outlook.com\n ([fe80::f4db:d40d:a746:7bfc%7]) with mapi id 15.20.4755.022; Mon, 6 Dec 2021\n 22:19:54 +0000",
            "from lappy.adi.eng (173.14.114.227) by\n MN2PR20CA0031.namprd20.prod.outlook.com (2603:10b6:208:e8::44) with Microsoft\n SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id\n 15.20.4755.19 via Frontend Transport; Mon, 6 Dec 2021 22:19:53 +0000"
        ],
        "ARC-Seal": "i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none;\n b=MreNAtorynvQgadqRbKh60uUVPvsKy6e05kMvnSdGqJCiewClI/a6Qbb0tZ4uc8qMhGw5e+c4lTL5CrNxfPDxLw2OKDNkoexBcJdZCVoer1cVQhYCIuAZ4LmIUfe/DhDaTRQRHNdq6QfADH3kHyUEbC0Feq66CpU1dUp0TMpfiigWUnf6daHWAjNVlsCcmBH2RPRaA7bc2Q7eLTFollEhIGpkDjDP6TI3tM+P8T8qkrwYlWmP/AynY/+3KkMcmB+wasV48DKYEzazcGlb/VpABLjzivfOlcSRqsJ372Vwuw1sNiSkMx61K7x4rQdo4WIrnpeED8AM0DcScGriofrVw==",
        "ARC-Message-Signature": "i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com;\n s=arcselector9901;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1;\n bh=yDLnaiPd1AO/zah1PCvZ7/XHjAd7oFjZKAxvUJWFYyQ=;\n b=RHRMTRt3Jm/MeGClzZ7iY944dl+pgv/hrOMQWpLLGTjpDViT6zTf4TGrYqvUbtcwRFDFkpBngLY+TzeCQ0S/oOoZF2LVtaEKov9EdT/9uZb4W0XqVxxYVArcsjskrXW4lAlgN6BNDaPl3jGccB9bezJEKNEvd26SgxoOF3+yUqEe0R+AcTHpKZ+hjSgAeXVvmPoGCuzqRDt4nM8zn4jgja6ofBRtsDqS412EoiA3ajKeaFIPKEHrkWIJLuMxxWgd3fntRybeV8GkhnFUHNtJtmBOSOOqf4KzA+IWfFQxiFlcCE19uezvIflmy00ldmDb2HSg+fvxCNw87nrwr6Mrag==",
        "ARC-Authentication-Results": "i=1; mx.microsoft.com 1; spf=pass\n smtp.mailfrom=silicom-usa.com; dmarc=pass action=none\n header.from=silicom-usa.com; dkim=pass header.d=silicom-usa.com; arc=none",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=SILICOMLTD.onmicrosoft.com; s=selector2-SILICOMLTD-onmicrosoft-com;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n bh=yDLnaiPd1AO/zah1PCvZ7/XHjAd7oFjZKAxvUJWFYyQ=;\n b=bbYh4crpRVlRbo8eZ146OQRakHSzCCLNmjJPQehF1IUf/6gWEHxkpPCHc8ka5NKlLqKCBdilq+gNYd+sulCJ5YXh4jQixPPqM1RFSjJFUR2fIuJFnk4g5hTGOHO5GbzUa3EHs+5xcORsQjfUfy9Tge9bZNiR2A0UDVJNhPT7L+I=",
        "Authentication-Results": "dkim=none (message not signed)\n header.d=none;dmarc=none action=none header.from=silicom-usa.com;",
        "From": "Stephen Douthit <stephend@silicom-usa.com>",
        "To": "Haiyue Wang <haiyue.wang@intel.com>",
        "Cc": "dev@dpdk.org, wenw@silicom-usa.com,\n Stephen Douthit <stephend@silicom-usa.com>, stable@dpdk.org",
        "Subject": "[PATCH v2 5/7] net/ixgbe: Fix SFP detection and linking on hotplug",
        "Date": "Mon,  6 Dec 2021 17:19:19 -0500",
        "Message-Id": "<20211206221922.644187-6-stephend@silicom-usa.com>",
        "X-Mailer": "git-send-email 2.31.1",
        "In-Reply-To": "<20211206221922.644187-1-stephend@silicom-usa.com>",
        "References": "<20211206221922.644187-1-stephend@silicom-usa.com>",
        "Content-Transfer-Encoding": "8bit",
        "Content-Type": "text/plain",
        "X-ClientProxiedBy": "MN2PR20CA0031.namprd20.prod.outlook.com\n (2603:10b6:208:e8::44) To AM0PR04MB4083.eurprd04.prod.outlook.com\n (2603:10a6:208:64::29)",
        "MIME-Version": "1.0",
        "X-MS-PublicTrafficType": "Email",
        "X-MS-Office365-Filtering-Correlation-Id": "ab3c626a-5bd8-49af-f7ca-08d9b906872d",
        "X-MS-TrafficTypeDiagnostic": "AM0PR04MB6596:EE_",
        "X-Microsoft-Antispam-PRVS": "\n <AM0PR04MB65963EF0F592345A14D874F9946D9@AM0PR04MB6596.eurprd04.prod.outlook.com>",
        "X-MS-Oob-TLC-OOBClassifiers": "OLM:10000;",
        "X-MS-Exchange-SenderADCheck": "1",
        "X-MS-Exchange-AntiSpam-Relay": "0",
        "X-Microsoft-Antispam": "BCL:0;",
        "X-Microsoft-Antispam-Message-Info": "\n KEXXLt1akYw9b+JETVGXDsRfexLOeR/kOx9hmsgsKnkh9Hhhi9FERSA6r41n9TJTvtBGtvB160a0nwwGk/BrYtzCRqEn0yfnWGZ7EDcZTnuyr9sSYue/hN+QQqvhvBCqMSz2Acay4j//6JIcpMhzfJb6qyTn6QNU4s3tUttbMtfFzsjWJsIBF+7fkZ1DayokYPZQ5XyI2I27uOsoMSubaLVmynsi+5Guq4MLpQlCGUzIsZ2OI0HgXQwWjt2VpMbfZN234gvF+SjQFKU7r/v/d2aSO0zPV7RSaTJPHdsfIO4irDMlVV7DWhCN+B8ggPFxsmRMycgLjc/Dom6APe1b2wBxuIm3yUhPZXeGw1IeeqTNnMHlpd3EjmEqLeEA0Wg1G6oTW30bIjC409IbxrfTW+PiN8IQrLPHOsqykVsDHaqu8odQbz/dB7UmlGNzhtFVp81DJpJqh5+eZdzY00rhBZpHWMuPMhKdalMSi/SPcpp1REoLxC/Mc96Fh3UFl+F8qRc60gLKEVDeQAKXB+TCl13lRf+PtfVkAagedyb0SY7M9P87J4vTlWxYdVSj3vI29zF1BOzeMsuaaWMsKK+PGCqHOOfcpVmTI6nBPr81pN99Ql0c+okbXkk8uh33H/rwQNko6Q5KlkeuoqP/FqDw146ccRqzRxl9VkVyKN/M8pnVH7+YrOJizsz1+u7pogA7lupkWgV1Eg+J0WanVWZg8A==",
        "X-Forefront-Antispam-Report": "CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:;\n IPV:NLI; SFV:NSPM; H:AM0PR04MB4083.eurprd04.prod.outlook.com; PTR:; CAT:NONE;\n SFS:(4636009)(366004)(8676002)(4326008)(66946007)(6506007)(8936002)(6666004)(2616005)(52116002)(66476007)(66556008)(86362001)(956004)(6486002)(30864003)(6512007)(2906002)(316002)(83380400001)(1076003)(36756003)(38100700002)(38350700002)(26005)(5660300002)(186003)(508600001)(6916009);\n DIR:OUT; SFP:1102;",
        "X-MS-Exchange-AntiSpam-MessageData-ChunkCount": "1",
        "X-MS-Exchange-AntiSpam-MessageData-0": "\n 0VBbbv/e2lJyA3adV1uH+/m5iI5o0zMus/7POS84WePJk1/P2bxxph+htu6UU6bmk1arznQBJMR4EZFR0q986ILMjmBsXyoY3ogNTc0QMmGfL88ReSRNajb3M6fuCk39Eic7uM/AqiyzrBg5KB46XgBatfpNtFnDZEnuwJXV2O6EwL+6VnyXHkJVX9egBZUjN5fBd0bqxDqbv1xEzBEfZ6WWqgEWjZOTLINLCLoDdThQq0nGpTOGY+gU7ccuyX1/+uY3+vKEc8b0kV8TgNgkpwpTcUGAEd870jtZ4aTl9TbHjj8Pp5xyC7HMJMc9Y2uHFQnnbdaCI+6NcrCMMIdLCmUSPUpQ2ewChkW9YJpvZzYYjOm09ENotjKFLzesJzJrYAaFON5JxsoMlCLZ403ZzlNiSV2+ZCkx8Na/q6thbW2uMrIFOhXM43q3mNMdrPR7cFf3xaUMgNxBjEQjeepSTrph/DcMDoMGDTkqjJaRZE4I5s87rDiqCb+Pr5L7l8mM+g/i3LcQQQNLv7bpBmXYr3hsKZR5SyaDHFCMcTq9IAUmjheqiNXnB8umr7wb22/GOdvqGvIR7hUlxOlGV05H3FBhRuKEAmn5e7kBWbLULLflhBmPHxJQaSETe5vz/qWUca5oYtGRl0WTtEDNyYUmWBmFjaID9JYfuWK4zjS5l2jQpyldvF9Eadr/yJhb5iN3kyJNAvvYOMaceZLHj7LIojK4K7XocvBw2McXmkIe0731KAVOxntTbYl8mPA9yG3y8S9ecn3PWns5Guh8Awtt40pEskl3Vd6+p3y2o1cY/XUmZX59d6UAqiNTDt8EotFcur/RD5yvK8etUlPra+Vtx0pOMvS2AxmTxrpzK/Uw/ozB7yjl4i+canr3MoT4bywf8X383PNj9HmQL6HCOFRQYVfYaMB85TnbQI3bnM7a4ejo00fYfQhzcXzpiuB0rlkZxgFzDvl6K2aJXZhYDH5PYjxp75oR7pKWDfqZGXdQM9aX6gxHC8xDgIwlEDNQO4DPVPVnoshBq/V6CpiN2AUrYJPp765c+WXa5Kl1XQSJFDQIeXhn/kKpYq8vaiqcd/0pzwwJEib4z5GgP/1W1/ucdukzQh1Qxt/jFBw5thWy+/lD5cQVe9lIfipsLNekcPjZz5Gn3/hWNKhfeY7wi6bpgTpd/kwwfU4WjzX1jmv0q8m4TtBEhX6WNm8/n0C+rdxWWyjjmfKXzNcF5YyBJVe/jtVPAidpDNRZeWAFotwlLytDpqEA70mYYxCs54IjG5gvtvDZ+IwmZtNSredUrWM7bNG83rQviy7MfRFWzPNzGbzyE5lRHEHNDuy7u/iy69YWaLd6Jiksx3WGdHJZ3CtSQa2PJv2XLpjWT7LEm08eLo2z8igg/syW8Upn5v2qQNIWESwT2VYy/zmC0kxB1VEjuUZS9czA8vIbFzzDeoXKQbxiNY9O6QbfqYH/hlwJCQGcsk+Y5VxPNkS2149I/Oi1uj55/RhSqSP51m4VoFZ2QLfMiDQmhzXgTqqFAgBxdV29aEMw0dEOLjTrgwLHVSX/4tcb+pJrI39XyD8HNV0geBb09OSqY+HBrpgACWzaV/0RvJ5gVPhQ4QJAZ9BcgMjBJS8LTpDP3Sy9TlvP2t5y2N+0eJLKVEGPWcuyGe3+3QmUz8X+2QHbIcLRsU7gHmGoaA==",
        "X-OriginatorOrg": "silicom-usa.com",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "\n ab3c626a-5bd8-49af-f7ca-08d9b906872d",
        "X-MS-Exchange-CrossTenant-AuthSource": "AM0PR04MB4083.eurprd04.prod.outlook.com",
        "X-MS-Exchange-CrossTenant-AuthAs": "Internal",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "06 Dec 2021 22:19:54.0034 (UTC)",
        "X-MS-Exchange-CrossTenant-FromEntityHeader": "Hosted",
        "X-MS-Exchange-CrossTenant-Id": "c9e326d8-ce47-4930-8612-cc99d3c87ad1",
        "X-MS-Exchange-CrossTenant-MailboxType": "HOSTED",
        "X-MS-Exchange-CrossTenant-UserPrincipalName": "\n M3vfzMv2y747mwY0R82qricw41fxBDO5r3wg0ynBBo78U5tjMCTDFja4hrh3TI9uVeeRaCIhA1EOwSMtoCF50CL7/4/2dDnsllEj48irRV8=",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "AM0PR04MB6596",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org"
    },
    "content": "Currently the ixgbe driver does not ID any SFP except for the first one\nplugged in. This can lead to no-link, or incorrect speed conditions.\n\nFor example:\n\n* If link is initially established with a 1G SFP, and later a 1G/10G\nmultispeed part is later installed, then the MAC link setup functions are\nnever called to change from 1000BASE-X to 10GBASE-R mode, and the link\nstays running at the slower rate.\n\n* If link is initially established with a 1G SFP, and later a 10G only\nmodule is later installed, no link is established, since we are still\ntrasnsmitting in 1000BASE-X mode to a 10GBASE-R only partner.\n\nRefactor the SFP ID/setup, and link setup code, to more closely match the\nflow of the mainline kernel driver which does not have these issues.  In\nthat driver a service task runs periodically to handle these operations\nbased on bit flags that have been set (usually via interrupt or userspace\nrequest), and then get cleared once the requested subtask has been\ncompleted.\n\nFixes: af75078fece (\"first public release\")\nCc: stable@dpdk.org\n\nSigned-off-by: Stephen Douthit <stephend@silicom-usa.com>\n---\n drivers/net/ixgbe/base/ixgbe_type.h |   2 +\n drivers/net/ixgbe/ixgbe_ethdev.c    | 349 +++++++++++++++++-----------\n drivers/net/ixgbe/ixgbe_ethdev.h    |  18 +-\n 3 files changed, 224 insertions(+), 145 deletions(-)",
    "diff": "diff --git a/drivers/net/ixgbe/base/ixgbe_type.h b/drivers/net/ixgbe/base/ixgbe_type.h\nindex b7eec45635..c23257aa4c 100644\n--- a/drivers/net/ixgbe/base/ixgbe_type.h\n+++ b/drivers/net/ixgbe/base/ixgbe_type.h\n@@ -45,6 +45,8 @@\n \n #include \"ixgbe_osdep.h\"\n \n+#define BIT(a) (1UL << (a))\n+\n /* Override this by setting IOMEM in your ixgbe_osdep.h header */\n \n /* Vendor ID */\ndiff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c\nindex 34b7cb2d4e..94d5a8f419 100644\n--- a/drivers/net/ixgbe/ixgbe_ethdev.c\n+++ b/drivers/net/ixgbe/ixgbe_ethdev.c\n@@ -229,9 +229,6 @@ static int ixgbe_dev_interrupt_get_status(struct rte_eth_dev *dev);\n static int ixgbe_dev_interrupt_action(struct rte_eth_dev *dev);\n static void ixgbe_dev_interrupt_handler(void *param);\n static void ixgbe_dev_interrupt_delayed_handler(void *param);\n-static void *ixgbe_dev_setup_link_thread_handler(void *param);\n-static int ixgbe_dev_wait_setup_link_complete(struct rte_eth_dev *dev,\n-\t\t\t\t\t      uint32_t timeout_ms);\n \n static int ixgbe_add_rar(struct rte_eth_dev *dev,\n \t\t\tstruct rte_ether_addr *mac_addr,\n@@ -1032,6 +1029,163 @@ ixgbe_swfw_lock_reset(struct ixgbe_hw *hw)\n \tixgbe_release_swfw_semaphore(hw, mask);\n }\n \n+static s32\n+ixgbe_sfp_id_and_setup(struct rte_eth_dev *dev)\n+{\n+\tstruct ixgbe_hw *hw =\n+\t\tIXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);\n+\tenum ixgbe_sfp_cage_status sfp_cage_status;\n+\ts32 err;\n+\n+\t/* Can't ID or setup SFP if it's not plugged in */\n+\tsfp_cage_status = ixgbe_check_sfp_cage(hw);\n+\tif (sfp_cage_status == IXGBE_SFP_CAGE_EMPTY ||\n+\t    sfp_cage_status == IXGBE_SFP_CAGE_NOCAGE)\n+\t\treturn IXGBE_ERR_SFP_NOT_PRESENT;\n+\n+\t/* Something's in the cage, ID it */\n+\thw->phy.ops.identify_sfp(hw);\n+\n+\t/* Unknown module type, give up */\n+\tif (hw->phy.sfp_type == ixgbe_sfp_type_unknown) {\n+\t\tPMD_DRV_LOG(ERR, \"unknown SFP type, giving up\");\n+\t\treturn IXGBE_ERR_SFP_NOT_SUPPORTED;\n+\t}\n+\n+\t/* This should be a redundant check, since we looked at the\n+\t * PRSNT# signal from the cage above, but just in case this is\n+\t * an SFP that's slow to respond to I2C pokes correctly, try it\n+\t * again later\n+\t */\n+\tif (hw->phy.sfp_type == ixgbe_sfp_type_not_present) {\n+\t\tPMD_DRV_LOG(ERR, \"IDed SFP as absent but cage PRSNT# active!?\");\n+\t\treturn IXGBE_ERR_SFP_NOT_PRESENT;\n+\t}\n+\n+\t/* SFP is present and identified, try to set it up */\n+\terr = hw->mac.ops.setup_sfp(hw);\n+\tif (err)\n+\t\tPMD_DRV_LOG(ERR, \"setup_sfp() failed %d\", err);\n+\n+\treturn err;\n+}\n+\n+static void\n+ixgbe_sfp_service(struct rte_eth_dev *dev)\n+{\n+\tstruct ixgbe_hw *hw =\n+\t\tIXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);\n+\tstruct ixgbe_interrupt *intr =\n+\t\tIXGBE_DEV_PRIVATE_TO_INTR(dev->data->dev_private);\n+\tenum ixgbe_sfp_cage_status sfp_cage_status;\n+\ts32 err;\n+\n+\t/* No setup requested?  Nothing to do */\n+\tif (!(intr->flags & IXGBE_FLAG_NEED_SFP_SETUP))\n+\t\treturn;\n+\n+\tsfp_cage_status = ixgbe_check_sfp_cage(hw);\n+\tif (sfp_cage_status == IXGBE_SFP_CAGE_EMPTY ||\n+\t    sfp_cage_status == IXGBE_SFP_CAGE_NOCAGE)\n+\t\treturn;\n+\n+\terr = ixgbe_sfp_id_and_setup(dev);\n+\tif (err) {\n+\t\tPMD_DRV_LOG(DEBUG, \"failed to ID & setup SFP %d\", err);\n+\t\treturn;\n+\t}\n+\n+\t/* Setup is done, clear the flag, but make sure link config runs for new SFP */\n+\tintr->flags &= ~IXGBE_FLAG_NEED_SFP_SETUP;\n+\tintr->flags |= IXGBE_FLAG_NEED_LINK_CONFIG;\n+\n+\t/*\n+\t * Since this is a new SFP, clear the old advertised speed mask so we don't\n+\t * end up using an old slower rate\n+\t */\n+\thw->phy.autoneg_advertised = 0;\n+}\n+\n+static void\n+ixgbe_link_service(struct rte_eth_dev *dev)\n+{\n+\tstruct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);\n+\tstruct ixgbe_interrupt *intr =\n+\t\tIXGBE_DEV_PRIVATE_TO_INTR(dev->data->dev_private);\n+\tbool link_up, autoneg = false;\n+\tu32 speed;\n+\ts32 err;\n+\n+\t/* Skip if we still need to setup an SFP, or if no link config requested\n+\t */\n+\tif ((intr->flags & IXGBE_FLAG_NEED_SFP_SETUP) ||\n+\t    !(intr->flags & IXGBE_FLAG_NEED_LINK_CONFIG))\n+\t\treturn;\n+\n+\tspeed = hw->phy.autoneg_advertised;\n+\tif (!speed)\n+\t\tixgbe_get_link_capabilities(hw, &speed, &autoneg);\n+\n+\terr = ixgbe_setup_link(hw, speed, true);\n+\tif (err) {\n+\t\tPMD_DRV_LOG(ERR, \"ixgbe_setup_link failed %d\", err);\n+\t\treturn;\n+\t}\n+\n+\t/* Update internal link status, waiting for link */\n+\terr = ixgbe_check_link(hw, &speed, &link_up, 1);\n+\tif (!err && link_up)\n+\t\tintr->flags &= ~IXGBE_FLAG_NEED_LINK_CONFIG;\n+\n+\tif (!ixgbe_dev_link_update(dev, 0)) {\n+\t\tixgbe_dev_link_status_print(dev);\n+\t\trte_eth_dev_callback_process(dev, RTE_ETH_EVENT_INTR_LSC, NULL);\n+\t}\n+}\n+\n+/*\n+ * Service task thread to handle periodic tasks\n+ */\n+static void *\n+ixgbe_dev_service_thread_handler(void *param)\n+{\n+\tstruct rte_eth_dev *dev = (struct rte_eth_dev *)param;\n+\tstruct ixgbe_hw *hw =\n+\t\tIXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);\n+\tuint64_t start, ticks, service_ms;\n+\tuint32_t speed;\n+\ts32 err;\n+\tbool link_up;\n+\n+\twhile (1) {\n+\t\tixgbe_sfp_service(dev);\n+\t\tixgbe_link_service(dev);\n+\n+\t\t/* Run the service thread handler more frequently when link is\n+\t\t * down to reduce link up latency (every 200ms vs 1s)\n+\t\t *\n+\t\t * Use a number of smaller sleeps to decrease exit latency when\n+\t\t * ixgbe_dev_stop() wants this thread to join\n+\t\t */\n+\t\terr = ixgbe_check_link(hw, &speed, &link_up, 0);\n+\t\tif (err == IXGBE_SUCCESS && link_up)\n+\t\t\tservice_ms = 2000;\n+\t\telse\n+\t\t\tservice_ms = 100;\n+\n+\t\t/* Call nanosleep in a loop with several smaller sleeps to\n+\t\t * provide periodic thread cancellation points\n+\t\t */\n+\t\tstart = rte_get_timer_cycles();\n+\t\tticks = (uint64_t)service_ms * rte_get_timer_hz() / 1E3;\n+\t\twhile ((rte_get_timer_cycles() - start) < ticks)\n+\t\t\tmsec_delay(100);\n+\t}\n+\n+\t/* Never return */\n+\treturn NULL;\n+}\n+\n /*\n  * This function is based on code in ixgbe_attach() in base/ixgbe.c.\n  * It returns 0 on success.\n@@ -1039,7 +1193,6 @@ ixgbe_swfw_lock_reset(struct ixgbe_hw *hw)\n static int\n eth_ixgbe_dev_init(struct rte_eth_dev *eth_dev, void *init_params __rte_unused)\n {\n-\tstruct ixgbe_adapter *ad = eth_dev->data->dev_private;\n \tstruct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev);\n \tstruct rte_intr_handle *intr_handle = pci_dev->intr_handle;\n \tstruct ixgbe_hw *hw =\n@@ -1094,7 +1247,6 @@ eth_ixgbe_dev_init(struct rte_eth_dev *eth_dev, void *init_params __rte_unused)\n \t\treturn 0;\n \t}\n \n-\trte_atomic32_clear(&ad->link_thread_running);\n \trte_eth_copy_pci_info(eth_dev, pci_dev);\n \teth_dev->data->dev_flags |= RTE_ETH_DEV_AUTOFILL_QUEUE_XSTATS;\n \n@@ -1537,7 +1689,6 @@ eth_ixgbevf_dev_init(struct rte_eth_dev *eth_dev)\n {\n \tint diag;\n \tuint32_t tc, tcs;\n-\tstruct ixgbe_adapter *ad = eth_dev->data->dev_private;\n \tstruct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev);\n \tstruct rte_intr_handle *intr_handle = pci_dev->intr_handle;\n \tstruct ixgbe_hw *hw =\n@@ -1580,7 +1731,6 @@ eth_ixgbevf_dev_init(struct rte_eth_dev *eth_dev)\n \t\treturn 0;\n \t}\n \n-\trte_atomic32_clear(&ad->link_thread_running);\n \tixgbevf_parse_devargs(eth_dev->data->dev_private,\n \t\t\t      pci_dev->device.devargs);\n \n@@ -2382,6 +2532,8 @@ ixgbe_dev_configure(struct rte_eth_dev *dev)\n \tstruct ixgbe_interrupt *intr =\n \t\tIXGBE_DEV_PRIVATE_TO_INTR(dev->data->dev_private);\n \tstruct ixgbe_adapter *adapter = dev->data->dev_private;\n+\tstruct ixgbe_hw *hw =\n+\t\tIXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);\n \tint ret;\n \n \tPMD_INIT_FUNC_TRACE();\n@@ -2400,6 +2552,10 @@ ixgbe_dev_configure(struct rte_eth_dev *dev)\n \t/* set flag to update link status after init */\n \tintr->flags |= IXGBE_FLAG_NEED_LINK_UPDATE;\n \n+\t/* set flag to setup SFP after init */\n+\tif (ixgbe_is_sfp(hw))\n+\t\tintr->flags |= IXGBE_FLAG_NEED_SFP_SETUP;\n+\n \t/*\n \t * Initialize to TRUE. If any of Rx queues doesn't meet the bulk\n \t * allocation or vector Rx preconditions we will reset it.\n@@ -2419,13 +2575,24 @@ ixgbe_dev_phy_intr_setup(struct rte_eth_dev *dev)\n \t\tIXGBE_DEV_PRIVATE_TO_INTR(dev->data->dev_private);\n \tuint32_t gpie;\n \n-\t/* only set up it on X550EM_X */\n+\t/* only set up it on X550EM_X (external PHY interrupt)\n+\t * or on x550em_a_* for SFP_PRSNT# de-assertion (SFP removal event)\n+\t */\n \tif (hw->mac.type == ixgbe_mac_X550EM_x) {\n \t\tgpie = IXGBE_READ_REG(hw, IXGBE_GPIE);\n \t\tgpie |= IXGBE_SDP0_GPIEN_X550EM_x;\n \t\tIXGBE_WRITE_REG(hw, IXGBE_GPIE, gpie);\n \t\tif (hw->phy.type == ixgbe_phy_x550em_ext_t)\n \t\t\tintr->mask |= IXGBE_EICR_GPI_SDP0_X550EM_x;\n+\t} else if (hw->mac.type == ixgbe_mac_X550EM_a) {\n+\t\tgpie = IXGBE_READ_REG(hw, IXGBE_GPIE);\n+\t\tgpie |= IXGBE_SDP0_GPIEN_X550EM_a;\n+\t\tIXGBE_WRITE_REG(hw, IXGBE_GPIE, gpie);\n+\t\tintr->mask |= IXGBE_EICR_GPI_SDP0_X550EM_a;\n+\t} else {\n+\t\tPMD_DRV_LOG(DEBUG,\n+\t\t\t    \"No PHY/SFP interrupt for MAC %d, PHY %d\\n\",\n+\t\t\t    hw->mac.type, hw->phy.type);\n \t}\n }\n \n@@ -2548,8 +2715,11 @@ ixgbe_flow_ctrl_enable(struct rte_eth_dev *dev, struct ixgbe_hw *hw)\n static int\n ixgbe_dev_start(struct rte_eth_dev *dev)\n {\n+\tstruct ixgbe_adapter *ad = dev->data->dev_private;\n \tstruct ixgbe_hw *hw =\n \t\tIXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);\n+\tstruct ixgbe_interrupt *intr =\n+\t\tIXGBE_DEV_PRIVATE_TO_INTR(dev->data->dev_private);\n \tstruct ixgbe_vf_info *vfinfo =\n \t\t*IXGBE_DEV_PRIVATE_TO_P_VFDATA(dev->data->dev_private);\n \tstruct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev);\n@@ -2570,9 +2740,6 @@ ixgbe_dev_start(struct rte_eth_dev *dev)\n \n \tPMD_INIT_FUNC_TRACE();\n \n-\t/* Stop the link setup handler before resetting the HW. */\n-\tixgbe_dev_wait_setup_link_complete(dev, 0);\n-\n \t/* disable uio/vfio intr/eventfd mapping */\n \trte_intr_disable(intr_handle);\n \n@@ -2688,12 +2855,6 @@ ixgbe_dev_start(struct rte_eth_dev *dev)\n \t\t}\n \t}\n \n-\tif (ixgbe_is_sfp(hw) && hw->phy.multispeed_fiber) {\n-\t\terr = hw->mac.ops.setup_sfp(hw);\n-\t\tif (err)\n-\t\t\tgoto error;\n-\t}\n-\n \tif (hw->mac.ops.get_media_type(hw) == ixgbe_media_type_copper) {\n \t\t/* Turn on the copper */\n \t\tixgbe_set_phy_power(hw, true);\n@@ -2805,6 +2966,20 @@ ixgbe_dev_start(struct rte_eth_dev *dev)\n \tixgbe_l2_tunnel_conf(dev);\n \tixgbe_filter_restore(dev);\n \n+\t/* Spawn service thread */\n+\tif (ixgbe_is_sfp(hw)) {\n+\t\tintr->flags |= IXGBE_FLAG_NEED_SFP_SETUP;\n+\t\terr = rte_ctrl_thread_create(&ad->service_thread_tid,\n+\t\t\t\t\t     \"ixgbe-service-thread\",\n+\t\t\t\t\t     NULL,\n+\t\t\t\t\t     ixgbe_dev_service_thread_handler,\n+\t\t\t\t\t     dev);\n+\t\tif (err) {\n+\t\t\tPMD_DRV_LOG(ERR, \"service_thread err\");\n+\t\t\tgoto error;\n+\t\t}\n+\t}\n+\n \tif (tm_conf->root && !tm_conf->committed)\n \t\tPMD_DRV_LOG(WARNING,\n \t\t\t    \"please call hierarchy_commit() \"\n@@ -2815,12 +2990,6 @@ ixgbe_dev_start(struct rte_eth_dev *dev)\n \tif (err)\n \t\tgoto error;\n \n-\t/*\n-\t * Update link status right before return, because it may\n-\t * start link configuration process in a separate thread.\n-\t */\n-\tixgbe_dev_link_update(dev, 0);\n-\n \t/* setup the macsec setting register */\n \tif (macsec_setting->offload_en)\n \t\tixgbe_dev_macsec_register_enable(dev, macsec_setting);\n@@ -2850,13 +3019,21 @@ ixgbe_dev_stop(struct rte_eth_dev *dev)\n \tint vf;\n \tstruct ixgbe_tm_conf *tm_conf =\n \t\tIXGBE_DEV_PRIVATE_TO_TM_CONF(dev->data->dev_private);\n+\tvoid *res;\n+\ts32 err;\n \n \tif (hw->adapter_stopped)\n \t\treturn 0;\n \n \tPMD_INIT_FUNC_TRACE();\n \n-\tixgbe_dev_wait_setup_link_complete(dev, 0);\n+\t/* Cancel the service thread, and wait for it to join */\n+\terr = pthread_cancel(adapter->service_thread_tid);\n+\tif (err)\n+\t\tPMD_DRV_LOG(ERR, \"failed to cancel service thread %d\", err);\n+\terr = pthread_join(adapter->service_thread_tid, &res);\n+\tif (err)\n+\t\tPMD_DRV_LOG(ERR, \"failed to join service thread %d\", err);\n \n \t/* disable interrupts */\n \tixgbe_disable_intr(hw);\n@@ -2935,7 +3112,6 @@ ixgbe_dev_set_link_up(struct rte_eth_dev *dev)\n \t} else {\n \t\t/* Turn on the laser */\n \t\tixgbe_enable_tx_laser(hw);\n-\t\tixgbe_dev_link_update(dev, 0);\n \t}\n \n \treturn 0;\n@@ -2966,7 +3142,6 @@ ixgbe_dev_set_link_down(struct rte_eth_dev *dev)\n \t} else {\n \t\t/* Turn off the laser */\n \t\tixgbe_disable_tx_laser(hw);\n-\t\tixgbe_dev_link_update(dev, 0);\n \t}\n \n \treturn 0;\n@@ -4118,57 +4293,6 @@ ixgbevf_check_link(struct ixgbe_hw *hw, ixgbe_link_speed *speed,\n \treturn ret_val;\n }\n \n-/*\n- * If @timeout_ms was 0, it means that it will not return until link complete.\n- * It returns 1 on complete, return 0 on timeout.\n- */\n-static int\n-ixgbe_dev_wait_setup_link_complete(struct rte_eth_dev *dev, uint32_t timeout_ms)\n-{\n-#define WARNING_TIMEOUT    9000 /* 9s  in total */\n-\tstruct ixgbe_adapter *ad = dev->data->dev_private;\n-\tuint32_t timeout = timeout_ms ? timeout_ms : WARNING_TIMEOUT;\n-\n-\twhile (rte_atomic32_read(&ad->link_thread_running)) {\n-\t\tmsec_delay(1);\n-\t\ttimeout--;\n-\n-\t\tif (timeout_ms) {\n-\t\t\tif (!timeout)\n-\t\t\t\treturn 0;\n-\t\t} else if (!timeout) {\n-\t\t\t/* It will not return until link complete */\n-\t\t\ttimeout = WARNING_TIMEOUT;\n-\t\t\tPMD_DRV_LOG(ERR, \"IXGBE link thread not complete too long time!\");\n-\t\t}\n-\t}\n-\n-\treturn 1;\n-}\n-\n-static void *\n-ixgbe_dev_setup_link_thread_handler(void *param)\n-{\n-\tstruct rte_eth_dev *dev = (struct rte_eth_dev *)param;\n-\tstruct ixgbe_adapter *ad = dev->data->dev_private;\n-\tstruct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);\n-\tstruct ixgbe_interrupt *intr =\n-\t\tIXGBE_DEV_PRIVATE_TO_INTR(dev->data->dev_private);\n-\tu32 speed;\n-\tbool autoneg = false;\n-\n-\tpthread_detach(pthread_self());\n-\tspeed = hw->phy.autoneg_advertised;\n-\tif (!speed)\n-\t\tixgbe_get_link_capabilities(hw, &speed, &autoneg);\n-\n-\tixgbe_setup_link(hw, speed, true);\n-\n-\tintr->flags &= ~IXGBE_FLAG_NEED_LINK_CONFIG;\n-\trte_atomic32_clear(&ad->link_thread_running);\n-\treturn NULL;\n-}\n-\n /*\n  * In freebsd environment, nic_uio drivers do not support interrupts,\n  * rte_intr_callback_register() will fail to register interrupts.\n@@ -4208,11 +4332,8 @@ ixgbe_dev_link_update_share(struct rte_eth_dev *dev,\n \t\t\t    int wait_to_complete, int vf)\n {\n \tstruct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);\n-\tstruct ixgbe_adapter *ad = dev->data->dev_private;\n \tstruct rte_eth_link link;\n \tixgbe_link_speed link_speed = IXGBE_LINK_SPEED_UNKNOWN;\n-\tstruct ixgbe_interrupt *intr =\n-\t\tIXGBE_DEV_PRIVATE_TO_INTR(dev->data->dev_private);\n \tbool link_up;\n \tint diag;\n \tint wait = 1;\n@@ -4226,9 +4347,6 @@ ixgbe_dev_link_update_share(struct rte_eth_dev *dev,\n \n \thw->mac.get_link_status = true;\n \n-\tif (intr->flags & IXGBE_FLAG_NEED_LINK_CONFIG)\n-\t\treturn rte_eth_linkstatus_set(dev, &link);\n-\n \t/* check if it needs to wait to complete, if lsc interrupt is enabled */\n \tif (wait_to_complete == 0 || dev->data->dev_conf.intr_conf.lsc != 0)\n \t\twait = 0;\n@@ -4243,38 +4361,12 @@ ixgbe_dev_link_update_share(struct rte_eth_dev *dev,\n \telse\n \t\tdiag = ixgbe_check_link(hw, &link_speed, &link_up, wait);\n \n-\tif (diag != 0) {\n+\tif (diag != 0 || !link_up) {\n \t\tlink.link_speed = RTE_ETH_SPEED_NUM_100M;\n \t\tlink.link_duplex = RTE_ETH_LINK_FULL_DUPLEX;\n \t\treturn rte_eth_linkstatus_set(dev, &link);\n \t}\n \n-\tif (link_up == 0) {\n-\t\tif (ixgbe_get_media_type(hw) == ixgbe_media_type_fiber) {\n-\t\t\tixgbe_dev_wait_setup_link_complete(dev, 0);\n-\t\t\tif (rte_atomic32_test_and_set(&ad->link_thread_running)) {\n-\t\t\t\t/* To avoid race condition between threads, set\n-\t\t\t\t * the IXGBE_FLAG_NEED_LINK_CONFIG flag only\n-\t\t\t\t * when there is no link thread running.\n-\t\t\t\t */\n-\t\t\t\tintr->flags |= IXGBE_FLAG_NEED_LINK_CONFIG;\n-\t\t\t\tif (rte_ctrl_thread_create(&ad->link_thread_tid,\n-\t\t\t\t\t\"ixgbe-link-handler\",\n-\t\t\t\t\tNULL,\n-\t\t\t\t\tixgbe_dev_setup_link_thread_handler,\n-\t\t\t\t\tdev) < 0) {\n-\t\t\t\t\tPMD_DRV_LOG(ERR,\n-\t\t\t\t\t\t\"Create link thread failed!\");\n-\t\t\t\t\trte_atomic32_clear(&ad->link_thread_running);\n-\t\t\t\t}\n-\t\t\t} else {\n-\t\t\t\tPMD_DRV_LOG(ERR,\n-\t\t\t\t\t\"Other link thread is running now!\");\n-\t\t\t}\n-\t\t}\n-\t\treturn rte_eth_linkstatus_set(dev, &link);\n-\t}\n-\n \tlink.link_status = RTE_ETH_LINK_UP;\n \tlink.link_duplex = RTE_ETH_LINK_FULL_DUPLEX;\n \n@@ -4480,8 +4572,6 @@ ixgbe_dev_interrupt_get_status(struct rte_eth_dev *dev)\n \teicr = IXGBE_READ_REG(hw, IXGBE_EICR);\n \tPMD_DRV_LOG(DEBUG, \"eicr %x\", eicr);\n \n-\tintr->flags = 0;\n-\n \t/* set flag for async link update */\n \tif (eicr & IXGBE_EICR_LSC)\n \t\tintr->flags |= IXGBE_FLAG_NEED_LINK_UPDATE;\n@@ -4497,6 +4587,11 @@ ixgbe_dev_interrupt_get_status(struct rte_eth_dev *dev)\n \t    (eicr & IXGBE_EICR_GPI_SDP0_X550EM_x))\n \t\tintr->flags |= IXGBE_FLAG_PHY_INTERRUPT;\n \n+\t/* Check for loss of SFP */\n+\tif (hw->mac.type ==  ixgbe_mac_X550EM_a &&\n+\t    (eicr & IXGBE_EICR_GPI_SDP0_X550EM_a))\n+\t\tintr->flags |= IXGBE_FLAG_NEED_SFP_SETUP;\n+\n \treturn 0;\n }\n \n@@ -4548,11 +4643,13 @@ ixgbe_dev_link_status_print(struct rte_eth_dev *dev)\n static int\n ixgbe_dev_interrupt_action(struct rte_eth_dev *dev)\n {\n+\tstruct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev);\n+\tstruct rte_intr_handle *intr_handle = pci_dev->intr_handle;\n \tstruct ixgbe_interrupt *intr =\n \t\tIXGBE_DEV_PRIVATE_TO_INTR(dev->data->dev_private);\n-\tint64_t timeout;\n \tstruct ixgbe_hw *hw =\n \t\tIXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);\n+\tint64_t timeout;\n \n \tPMD_DRV_LOG(DEBUG, \"intr action type %d\", intr->flags);\n \n@@ -4587,16 +4684,14 @@ ixgbe_dev_interrupt_action(struct rte_eth_dev *dev)\n \t\tif (rte_eal_alarm_set(timeout * 1000,\n \t\t\t\t      ixgbe_dev_interrupt_delayed_handler, (void *)dev) < 0)\n \t\t\tPMD_DRV_LOG(ERR, \"Error setting alarm\");\n-\t\telse {\n-\t\t\t/* remember original mask */\n-\t\t\tintr->mask_original = intr->mask;\n+\t\telse\n \t\t\t/* only disable lsc interrupt */\n \t\t\tintr->mask &= ~IXGBE_EIMS_LSC;\n-\t\t}\n \t}\n \n \tPMD_DRV_LOG(DEBUG, \"enable intr immediately\");\n \tixgbe_enable_intr(dev);\n+\trte_intr_ack(intr_handle);\n \n \treturn 0;\n }\n@@ -4619,8 +4714,6 @@ static void\n ixgbe_dev_interrupt_delayed_handler(void *param)\n {\n \tstruct rte_eth_dev *dev = (struct rte_eth_dev *)param;\n-\tstruct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev);\n-\tstruct rte_intr_handle *intr_handle = pci_dev->intr_handle;\n \tstruct ixgbe_interrupt *intr =\n \t\tIXGBE_DEV_PRIVATE_TO_INTR(dev->data->dev_private);\n \tstruct ixgbe_hw *hw =\n@@ -4650,13 +4743,10 @@ ixgbe_dev_interrupt_delayed_handler(void *param)\n \t\tintr->flags &= ~IXGBE_FLAG_MACSEC;\n \t}\n \n-\t/* restore original mask */\n-\tintr->mask = intr->mask_original;\n-\tintr->mask_original = 0;\n+\tif (dev->data->dev_conf.intr_conf.lsc != 0)\n+\t\tintr->mask |= IXGBE_EICR_LSC;\n \n-\tPMD_DRV_LOG(DEBUG, \"enable intr in delayed handler S[%08x]\", eicr);\n \tixgbe_enable_intr(dev);\n-\trte_intr_ack(intr_handle);\n }\n \n /**\n@@ -5298,9 +5388,6 @@ ixgbevf_dev_start(struct rte_eth_dev *dev)\n \n \tPMD_INIT_FUNC_TRACE();\n \n-\t/* Stop the link setup handler before resetting the HW. */\n-\tixgbe_dev_wait_setup_link_complete(dev, 0);\n-\n \terr = hw->mac.ops.reset_hw(hw);\n \n \t/**\n@@ -5380,12 +5467,6 @@ ixgbevf_dev_start(struct rte_eth_dev *dev)\n \t/* Re-enable interrupt for VF */\n \tixgbevf_intr_enable(dev);\n \n-\t/*\n-\t * Update link status right before return, because it may\n-\t * start link configuration process in a separate thread.\n-\t */\n-\tixgbevf_dev_link_update(dev, 0);\n-\n \thw->adapter_stopped = false;\n \n \treturn 0;\n@@ -5404,8 +5485,6 @@ ixgbevf_dev_stop(struct rte_eth_dev *dev)\n \n \tPMD_INIT_FUNC_TRACE();\n \n-\tixgbe_dev_wait_setup_link_complete(dev, 0);\n-\n \tixgbevf_intr_disable(dev);\n \n \tdev->data->dev_started = 0;\ndiff --git a/drivers/net/ixgbe/ixgbe_ethdev.h b/drivers/net/ixgbe/ixgbe_ethdev.h\nindex 83e8b5e56a..14658a2a82 100644\n--- a/drivers/net/ixgbe/ixgbe_ethdev.h\n+++ b/drivers/net/ixgbe/ixgbe_ethdev.h\n@@ -24,11 +24,12 @@\n #include <rte_tm_driver.h>\n \n /* need update link, bit flag */\n-#define IXGBE_FLAG_NEED_LINK_UPDATE (uint32_t)(1 << 0)\n-#define IXGBE_FLAG_MAILBOX          (uint32_t)(1 << 1)\n-#define IXGBE_FLAG_PHY_INTERRUPT    (uint32_t)(1 << 2)\n-#define IXGBE_FLAG_MACSEC           (uint32_t)(1 << 3)\n-#define IXGBE_FLAG_NEED_LINK_CONFIG (uint32_t)(1 << 4)\n+#define IXGBE_FLAG_NEED_LINK_UPDATE BIT(0)\n+#define IXGBE_FLAG_MAILBOX          BIT(1)\n+#define IXGBE_FLAG_PHY_INTERRUPT    BIT(2)\n+#define IXGBE_FLAG_MACSEC           BIT(3)\n+#define IXGBE_FLAG_NEED_LINK_CONFIG BIT(4)\n+#define IXGBE_FLAG_NEED_SFP_SETUP   BIT(5)\n \n /*\n  * Defines that were not part of ixgbe_type.h as they are not used by the\n@@ -41,7 +42,7 @@\n #define IXGBE_RXDADV_ERR_CKSUM_MSK  3\n #define IXGBE_ADVTXD_MACLEN_SHIFT   9          /* Bit shift for l2_len */\n #define IXGBE_NB_STAT_MAPPING_REGS  32\n-#define IXGBE_EXTENDED_VLAN\t  (uint32_t)(1 << 26) /* EXTENDED VLAN ENABLE */\n+#define IXGBE_EXTENDED_VLAN\t    BIT(26)    /* EXTENDED VLAN ENABLE */\n #define IXGBE_VFTA_SIZE 128\n #define IXGBE_HKEY_MAX_INDEX 10\n #define IXGBE_MAX_RX_QUEUE_NUM\t128\n@@ -223,8 +224,6 @@ struct ixgbe_rte_flow_rss_conf {\n struct ixgbe_interrupt {\n \tuint32_t flags;\n \tuint32_t mask;\n-\t/*to save original mask during delayed handler */\n-\tuint32_t mask_original;\n };\n \n struct ixgbe_stat_mapping_registers {\n@@ -506,8 +505,7 @@ struct ixgbe_adapter {\n \t */\n \tuint8_t pflink_fullchk;\n \tuint8_t mac_ctrl_frame_fwd;\n-\trte_atomic32_t link_thread_running;\n-\tpthread_t link_thread_tid;\n+\tpthread_t service_thread_tid;\n };\n \n struct ixgbe_vf_representor {\n",
    "prefixes": [
        "v2",
        "5/7"
    ]
}