get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 111441,
    "url": "http://patches.dpdk.org/api/patches/111441/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/ffbdaf3aa487241a51bb6512bbb4701da17e69fe.1652987887.git.jeffd@silicom-usa.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": "<ffbdaf3aa487241a51bb6512bbb4701da17e69fe.1652987887.git.jeffd@silicom-usa.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/ffbdaf3aa487241a51bb6512bbb4701da17e69fe.1652987887.git.jeffd@silicom-usa.com",
    "date": "2022-05-19T19:25:13",
    "name": "[1/3] ixgbe: make link update thread periodic",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "ac76812fa8d3359849a9474249682338407295fb",
    "submitter": {
        "id": 2500,
        "url": "http://patches.dpdk.org/api/people/2500/?format=api",
        "name": "Jeff Daly",
        "email": "jeffd@silicom-usa.com"
    },
    "delegate": {
        "id": 1540,
        "url": "http://patches.dpdk.org/api/users/1540/?format=api",
        "username": "qzhan15",
        "first_name": "Qi",
        "last_name": "Zhang",
        "email": "qi.z.zhang@intel.com"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/ffbdaf3aa487241a51bb6512bbb4701da17e69fe.1652987887.git.jeffd@silicom-usa.com/mbox/",
    "series": [
        {
            "id": 23045,
            "url": "http://patches.dpdk.org/api/series/23045/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=23045",
            "date": "2022-05-19T19:25:12",
            "name": "ixgbe: fix SFP hotplug detection",
            "version": 1,
            "mbox": "http://patches.dpdk.org/series/23045/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/111441/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/111441/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 64463A0503;\n\tThu, 19 May 2022 21:25:43 +0200 (CEST)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 4A66642B6C;\n\tThu, 19 May 2022 21:25:39 +0200 (CEST)",
            "from EUR05-DB8-obe.outbound.protection.outlook.com\n (mail-db8eur05on2121.outbound.protection.outlook.com [40.107.20.121])\n by mails.dpdk.org (Postfix) with ESMTP id 9D92240DF7\n for <dev@dpdk.org>; Thu, 19 May 2022 21:25:37 +0200 (CEST)",
            "from VI1PR0402MB3517.eurprd04.prod.outlook.com (2603:10a6:803:b::16)\n by DU0PR04MB9562.eurprd04.prod.outlook.com (2603:10a6:10:321::10)\n with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5250.18; Thu, 19 May\n 2022 19:25:35 +0000",
            "from VI1PR0402MB3517.eurprd04.prod.outlook.com\n ([fe80::a8d9:7211:83e:46db]) by VI1PR0402MB3517.eurprd04.prod.outlook.com\n ([fe80::a8d9:7211:83e:46db%4]) with mapi id 15.20.5250.018; Thu, 19 May 2022\n 19:25:35 +0000"
        ],
        "ARC-Seal": "i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none;\n b=djMCmuYbkGYfgcvuUxJU6hd12YzlNgZ/044dRLiJaBTYUR13Xd/LT1dOaO6u62WdeF7j21QU7jvbx0i07osot/0L1Qgd8yhGOg33KVj+4xpdaTB25UmrfBcuvTwNsnWhoL5OobCa2+EZ/QTOMINWpgMBrDEA+ICh0jia6Cv0kpeTAdwnCqsfyJ/wpQKsnnxJAx+F9h+J8fwaGMOozAnFZ3iJ2onWa9KcuA3w7ILesELdwQXArdRTtfktjDdeYjBMYWeoKtsRcvM03q6AvxE+a9uIbOsoMT8B4gTPFllWr0+ZvvjCXNonC+UPhEZfIuPtw1dsXEKNdFvcufxRH05YuA==",
        "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=O8VZnZsHaGRBjYJ4Uhj45f9cEFWOD2IWXCHQEYhN/BA=;\n b=Qp3DzvxJr086yVsikp7NIShsK48LSh/aennL3pUN+/RgVdVCEBMkddjLSeQ4v1/09EtFCeKAURSMZ+QhsXIOam2HBoZ0GhxlRV0pkzleuSesAu/o3XijG2tH7XUe/QjaXliEEtM/HnKnZyjZY9o3VFh6UGTLXevbYN3i/RQLiMaGGG9m2Qrts0EzrHMxK0kpz9aJiilX/8vb8rgAzIyMqeJA7OMgB96yLEEjTva8pqp7zFatE3zy+F26E0BK53dE3hgvlkXUptGJlEP5FvODQ3P8S90d/PXpcMmTz9txNKr3or/+l+z2eijzzmjZx0B+92B/HcLNu0hI4xzIf/dLFg==",
        "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=O8VZnZsHaGRBjYJ4Uhj45f9cEFWOD2IWXCHQEYhN/BA=;\n b=B8VFnaYIe7WTNPb55pK82u9JMr1FwU+jKtSbdm59PfeHU/oiHGmF4jbuzB6CXM9ynhUqw7yU3MH1i3wS3UgaAxnIRkRc/Er0KMqvqGkG1Z/e0fx+hm7l+MHCLKLcGXpAZyx3FdBJKX/iGjBOcKVUWio1LfgPhabNCjLGW8OLE/8=",
        "Authentication-Results": "dkim=none (message not signed)\n header.d=none;dmarc=none action=none header.from=silicom-usa.com;",
        "From": "Jeff Daly <jeffd@silicom-usa.com>",
        "To": "dev@dpdk.org",
        "Cc": "Stephen Douthit <stephend@silicom-usa.com>,\n Qiming Yang <qiming.yang@intel.com>, Wenjun Wu <wenjun1.wu@intel.com>",
        "Subject": "[PATCH 1/3] ixgbe: make link update thread periodic",
        "Date": "Thu, 19 May 2022 15:25:13 -0400",
        "Message-Id": "\n <ffbdaf3aa487241a51bb6512bbb4701da17e69fe.1652987887.git.jeffd@silicom-usa.com>",
        "X-Mailer": "git-send-email 2.25.1",
        "In-Reply-To": "<cover.1652987887.git.jeffd@silicom-usa.com>",
        "References": "<cover.1652987887.git.jeffd@silicom-usa.com>",
        "Content-Transfer-Encoding": "8bit",
        "Content-Type": "text/plain",
        "X-ClientProxiedBy": "MN2PR08CA0026.namprd08.prod.outlook.com\n (2603:10b6:208:239::31) To VI1PR0402MB3517.eurprd04.prod.outlook.com\n (2603:10a6:803:b::16)",
        "MIME-Version": "1.0",
        "X-MS-PublicTrafficType": "Email",
        "X-MS-Office365-Filtering-Correlation-Id": "a51a7ce0-41c5-4cae-007e-08da39cd5955",
        "X-MS-TrafficTypeDiagnostic": "DU0PR04MB9562:EE_",
        "X-Microsoft-Antispam-PRVS": "\n <DU0PR04MB9562D2F0320DB5A7BA03E33FEAD09@DU0PR04MB9562.eurprd04.prod.outlook.com>",
        "X-MS-Exchange-SenderADCheck": "1",
        "X-MS-Exchange-AntiSpam-Relay": "0",
        "X-Microsoft-Antispam": "BCL:0;",
        "X-Microsoft-Antispam-Message-Info": "\n oKm1n0fmZkPhqcW10Guw/mrDvzgclCg10ZWm2/OOOerl1OAQYxIhIG0irOhBhPuqqBJE/QX+UZi3quwVUNCR4fynKpQklU2KnEPEJT+ChXON4S5ysdD8Y54+lOZ9u23bZZWcfUTO+/q9pgUsM3XniOKzDeCR+rIsUtAS/Jt+fXoyJhmOdzFSrs2a6IfvzabpIdVxZjJgWpNgOQtBumFWpRIx87ScCNJJq/+sP0H/5VMz4mommxJVDXbPmFEZcU5NKArjQf9ct4sbtzABjwk+OcK+ibn4BYDQc8xQ0KvIDINbSVoyvTRhDj2DSpLyLoVWdmLZ3nU/76mbq5VY3lk07vWLfZXr2Wn2IcRQ7as8f4iMsYskxT0JP9+t9hMPT5lNFcXA5H3dD/R9KT81OBnreiOVITdQhETu0AIIMIxudlBMMBQv5OjyzF9dmUFMGbb67Li3j9w/PH6Uh25IccLSH6XszhNjT0Ezn8FbtcF9jbPNc6zq6m+b9+I9umjzgCTcXFtZhpvZPVGwkSjPAnxBBk2YLQAlMKUYP6y5w6gL23OhQAM3tPERSKm43QNRAgAn5pjhuTK3FwkkvGAdOnKIqAE86vLxznvo8l/Nl2CP2B2X+0j61TC5AOd97Oe9zXKbScWLxUuXnmyjJVYcgBmkrvwWAp8WVmbyLBefW6r/k3E17UnPHBKC9kQ8w5DpsGIQLdt5Ob7ZEl+SuabQG2o5/A==",
        "X-Forefront-Antispam-Report": "CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:;\n IPV:NLI; SFV:NSPM; H:VI1PR0402MB3517.eurprd04.prod.outlook.com; PTR:;\n CAT:NONE;\n SFS:(13230001)(4636009)(366004)(36756003)(66556008)(4326008)(66946007)(66476007)(8676002)(86362001)(54906003)(8936002)(6916009)(316002)(6486002)(38350700002)(38100700002)(5660300002)(508600001)(52116002)(6666004)(26005)(6512007)(186003)(83380400001)(15650500001)(2906002)(6506007)(30864003)(2616005);\n DIR:OUT; SFP:1102;",
        "X-MS-Exchange-AntiSpam-MessageData-ChunkCount": "1",
        "X-MS-Exchange-AntiSpam-MessageData-0": "\n 6cjvlT7lgcyvoeCsYoc+IJ5C/sEnRfCl7S+KPu7c4OAgkQ1gM/tqrdsgGfJ8qNtK8yfR6YOAOJ1cHpPcQqpC75GqesoW4tBBa2jHzxcDwAfXMWNUtzQyRf26TQTMT5CuP6cdCs9nZEfOMqmhAegtN2WxQs9ofxe4a246K5dDS2bnllPxzloU+JI7UL+bG3mqehj4jtkQBQ9m6brMyK0vuS8V79pToVt1Yzm4S/sFrvJ6Q3etFrFgmochj9zruB29ll0T5fZ7DyZzEe49Z7Yzu7TcRTwgATZzjrBWusBpaGL+y+8dNSvETrSsdNVImbvs/GSoyjE7XAi5P5WMKFqkTQaxx24SaCbGWM5xnnqCC2bRs35THRnQUQeKKLqL/UrxScWgp7SoTqAkD7RvgODvyZolcNOAftEfQBqQTJOaks34k9czKTQhRMEszFWXb3pqg7VmCFIpTDd/aaEbFDeEI+Pr/S/a5+MzR9N2cKj0w+Z1PNggVlQAVT25Vg2qnGrRKK8pKbnlckpZZ+s5b85IibRIBuoj+ccALe3MJraM+B0op/EgdzzAcj6JNQJ8iPzL6me5u4TfaOhHYVIZTrp2HDbDMMsAma1KhuGISPBKW1aJ5GrYkwYfQsCcR3RwRnoeGs6Q2UbjtJO53Nc2/v8WXUHAFInXEiEUNu3Tp42k4GY6DU7IUBZH2IX8lTOPm9MkfyJnw/gZEfWy2ow+pYsQplKWRQV7DOABFdL7TA/MgELPwLC3frx62W0CNrrUt8xM1jUka2OB6SiOzu+4xz7DKIRJpisjDb+Yh4W3wtCEInvyD8dRaMIPUuAppvMaDFUe2tZoefDXdfyUgjRkAcjZyF4IrQgWMVs9NAII3S76YOEyopIUXZ6GgYDTVSlPwcvDmJXeIVHPAg2NS2xzBRvlK4JR0blJc+nFb8ViC0kJYoOhCqvAxhEadwQMGyZObLTLoTtLDkqPeamJnUY7bRxOVqQz2qkORO5dAEYcCjhwsZftf5LhwvKrzWNekTTZvcp1UMDDHirzrO7QRhF8KnxqZ+Tnq978OYauJ5zZ0rlTor/sTCNjMh94rmDnlzw6mWvkk+yeuxJ+q2pSbs2uaKZf4zitYG7DQ9hsYJ/WkTtemAdiOOPRrvUOhxvavK4e1vJ3Kxv4IsXgUKaVmuT0BhN7jzuNvor2Hn6x2TKcDBqU9wbxiHILI0kCqPCq7+3qHf8Y8BZOoQ90cIxxkQ8F5NwqZpucjvaWyD5KuAQBf1h2my/LTzNznemBGGdjfyOhVbEcNtDSOx4wUwh1mwsbzC2KR9i0Q6LZ/C5pRjlXT0bfiBL/vHCi4FmVU41qfI4Ai1goRppC0/55500FgVxxbltNWJCupgNxyMKmp/zS+rspMjuCJZiFj5lzkz47+8i0dLVV9AylOkNxg3R3TwYll+I3vhIMOfOErRSb2UKpdrMjefSGS9DCUSRupW6jwJ9RtzUVyj0S5iPUVjMMQ8dn/8ksHRIT9LP/iOYKmTosSmkvUn8sRAN8Z886ckJ9wxTnTpfO89Us/78PO68v+go9GWgaHA++xc6yN3OIs4WbIYbZyVGks3ZeW2MBtI1MsQjHK82WPsTjkmKdiZ5dnxLB8GPdMcyN0l9boEGC/ggjb+qAxBl/8QEiwXigZdPQtRZ7qcHkzV8xmitnERQ6Qtz+JgyEKG9a6TuUhAkwqIGrCAbXqpEK8v80J/qwIi/ZkNeved52Sxd1lcNPVLzpGx4bFf5T2w==",
        "X-OriginatorOrg": "silicom-usa.com",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "\n a51a7ce0-41c5-4cae-007e-08da39cd5955",
        "X-MS-Exchange-CrossTenant-AuthSource": "\n VI1PR0402MB3517.eurprd04.prod.outlook.com",
        "X-MS-Exchange-CrossTenant-AuthAs": "Internal",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "19 May 2022 19:25:35.8511 (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 VHvP4drjPwpH0s9Va0lE/v4PX3QTLEfTJwi1phs7LDcVsdnHRaZ8p2lubITNJFqcinAw867tOM6shsONHHVc8g==",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "DU0PR04MB9562",
        "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": "Rather than run-to-completion, allow the link update thread to be\nperiodic.  This will set the stage for properly handling hot-plugging.\n\nSigned-off-by: Jeff Daly <jeffd@silicom-usa.com>\nSuggested-by: Stephen Douthit <stephend@silicom-usa.com>\n---\n drivers/net/ixgbe/base/ixgbe_common.c |   4 +-\n drivers/net/ixgbe/ixgbe_ethdev.c      | 180 ++++++++++----------------\n 2 files changed, 71 insertions(+), 113 deletions(-)",
    "diff": "diff --git a/drivers/net/ixgbe/base/ixgbe_common.c b/drivers/net/ixgbe/base/ixgbe_common.c\nindex aa843bd5c4a5..712062306491 100644\n--- a/drivers/net/ixgbe/base/ixgbe_common.c\n+++ b/drivers/net/ixgbe/base/ixgbe_common.c\n@@ -4154,8 +4154,8 @@ s32 ixgbe_check_mac_link_generic(struct ixgbe_hw *hw, ixgbe_link_speed *speed,\n \t\t\tbreak;\n \t\tcase ixgbe_mac_X550EM_x:\n \t\tcase ixgbe_mac_X550EM_a:\n-\t\t\tsfp_cage_full = IXGBE_READ_REG(hw, IXGBE_ESDP) &\n-\t\t\t\t\tIXGBE_ESDP_SDP0;\n+\t\t\tsfp_cage_full = !(IXGBE_READ_REG(hw, IXGBE_ESDP) &\n+\t\t\t\t\t  IXGBE_ESDP_SDP0);\n \t\t\tbreak;\n \t\tdefault:\n \t\t\t/* sanity check - No SFP+ devices here */\ndiff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c\nindex 2da3f67bbc78..81b15ad28212 100644\n--- a/drivers/net/ixgbe/ixgbe_ethdev.c\n+++ b/drivers/net/ixgbe/ixgbe_ethdev.c\n@@ -230,8 +230,6 @@ 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@@ -1039,7 +1037,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 +1091,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@@ -1547,7 +1543,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@@ -1590,7 +1585,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@@ -2558,8 +2552,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@@ -2580,9 +2577,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@@ -2700,8 +2694,16 @@ ixgbe_dev_start(struct rte_eth_dev *dev)\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\tintr->flags |= IXGBE_FLAG_NEED_LINK_CONFIG;\n+\t\terr = rte_ctrl_thread_create(&ad->link_thread_tid,\n+\t\t\t\t\t     \"ixgbe-service-tid\",\n+\t\t\t\t\t     NULL,\n+\t\t\t\t\t     ixgbe_dev_setup_link_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 (hw->mac.ops.get_media_type(hw) == ixgbe_media_type_copper) {\n@@ -2825,12 +2827,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@@ -2860,13 +2856,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 */\n+\terr = pthread_cancel(adapter->link_thread_tid);\n+\tif (err)\n+\t\tPMD_DRV_LOG(ERR, \"failed to cancel service thread %d\", err);\n+\terr = pthread_join(adapter->link_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@@ -2945,7 +2949,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@@ -2976,7 +2979,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@@ -4129,54 +4131,58 @@ 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+\tu32 speed, start, ticks, service_ms;\n+\ts32 err;\n+\tbool link_up, 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+\twhile (1) {\n+\t\tservice_ms = 100;\n+\t\tif (intr->flags & IXGBE_FLAG_NEED_LINK_CONFIG) {\n+\t\t\tspeed = hw->phy.autoneg_advertised;\n+\n+\t\t\tif (!speed)\n+\t\t\t\tixgbe_get_link_capabilities(hw, &speed, &autoneg);\n+\n+\t\t\terr = ixgbe_setup_link(hw, speed, true);\n+\n+\t\t\tif (err == IXGBE_SUCCESS)\n+\t\t\t\terr = ixgbe_check_link(hw, &speed, &link_up, 0);\n+\n+\t\t\t/* Run the service thread handler more frequently when link is\n+\t\t\t * down to reduce link up latency (every 200ms vs 1s)\n+\t\t\t *\n+\t\t\t * Use a number of smaller sleeps to decrease exit latency when\n+\t\t\t * ixgbe_dev_stop() wants this thread to join\n+\t\t\t */\n+\t\t\tif (err == IXGBE_SUCCESS && link_up) {\n+\t\t\t\tservice_ms = 2000;\n+\t\t\t\tintr->flags &= ~IXGBE_FLAG_NEED_LINK_CONFIG;\n+\t\t\t}\n+\n+\t\t\tif (!ixgbe_dev_link_update(dev, 0)) {\n+\t\t\t\tixgbe_dev_link_status_print(dev);\n+\t\t\t\trte_eth_dev_callback_process(dev, RTE_ETH_EVENT_INTR_LSC, NULL);\n+\t\t\t}\n+\t\t}\n+\n+\t\t/* Call msec_delay 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-\tintr->flags &= ~IXGBE_FLAG_NEED_LINK_CONFIG;\n-\trte_atomic32_clear(&ad->link_thread_running);\n \treturn NULL;\n }\n \n@@ -4219,11 +4225,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@@ -4238,9 +4241,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@@ -4255,7 +4255,7 @@ 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@@ -4267,32 +4267,6 @@ ixgbe_dev_link_update_share(struct rte_eth_dev *dev,\n \t\t\tlink_up = 0;\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@@ -4566,6 +4540,8 @@ 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@@ -4605,16 +4581,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@@ -4637,8 +4611,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@@ -4668,13 +4640,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@@ -5316,9 +5285,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@@ -5398,12 +5364,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@@ -5422,8 +5382,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;\n",
    "prefixes": [
        "1/3"
    ]
}