Received: by 2002:a05:6a10:1287:0:0:0:0 with SMTP id d7csp3694792pxv; Mon, 26 Jul 2021 09:34:22 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwAkeJvwjq3eZ70jCteK/vgq7/5IHcRUpK2GzGhAOT2oxkA5froCAALBPLcHhgVDsKqyk/P X-Received: by 2002:a05:6602:2057:: with SMTP id z23mr15073883iod.29.1627317262629; Mon, 26 Jul 2021 09:34:22 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1627317262; cv=none; d=google.com; s=arc-20160816; b=P+4UPo2iq6A0BMJvV7MxKEfz3ysO+V0aChDVgZwRNmmYppxa7eOpJQXeNL/JWkSF6r HXeYjWA2AoC7VNMBdA0FabbkXwPo1t1YktXDgooOBCMJ6AMTCPGMjJMQK+y0AauJ3+we 2mZiKW/Qxuo8xOyKBOVemAmV7YFcSvrs3ldz4BEwYNBjU+z4c00d83qvpAoWn+9YDHm6 ++tVed1WCddrqd8M+1W9VzA0asgPxElkJCEhljUpmsb17mRmEqyD1XOpy4SP/0wnS0Ub /ELvH/ydj55FmiSjNa4mvCzt8Wjxy/fpPg4JuCCJyjCxU89MgNluylutAv4arungpE0g hKuA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=+FNXLot76qWjs4kpTyWtZGq88jqdKUAU+0lYu785eZE=; b=sGI+KDRTjic5ST0TzidmPszJ0xtjiuNo1J4GCzcekyYrl/CCQQ1/T+zjsb0Fn0AjOj +zFBXova5uc1xxtsRRSvnwgRR9ju130nWMjmMIivGBhpQtke+iK4tFBxpHAkVneh8Tzw ab1cP8rV0Srgpv+A2TnRPE7TKTMGQZm7AyXdbRSURfOCqlZhutiuEVIM7kQHLiXDZ/h9 VxY3OIl+m+TpmLFmW1/quKE93xiFCjphL2DBRYMVzVdnkwEagLQv+Y7gfinWsbCBLFJA 3CGQ6FzjTj+IRc1nzSMH6KN01pbYZrXnx5P5yRsoILrWzQxe9dr6K9JfEiLQLcUKNK46 6otw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=f+veGjOe; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id g11si329063ilc.156.2021.07.26.09.34.09; Mon, 26 Jul 2021 09:34:22 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=f+veGjOe; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239415AbhGZPwS (ORCPT + 99 others); Mon, 26 Jul 2021 11:52:18 -0400 Received: from mail.kernel.org ([198.145.29.99]:47516 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232754AbhGZPbW (ORCPT ); Mon, 26 Jul 2021 11:31:22 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id DC765604AC; Mon, 26 Jul 2021 16:11:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1627315910; bh=FgK9NZuTa9AKJ+M+a+SkaDwispSR9I/vi0k5rtH8yE4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=f+veGjOeEZy5Y8xvHqGlJtKtOPwylkLLDe01SYY0OYLy0vqdoKKkxq7TQOIGidonu d1ZFEnDeSZa0W3X1ccgDM7G6eVXN7TTfPkc2gsAK6XYQh2YJE9PqTju9/2cF01ZS9n 9LjcFJ87ePYfAXnpsQvweQ4wXenBCheXCzqSNtaM= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Somnath Kotur , Michael Chan , "David S. Miller" , Sasha Levin Subject: [PATCH 5.13 107/223] bnxt_en: fix error path of FW reset Date: Mon, 26 Jul 2021 17:38:19 +0200 Message-Id: <20210726153849.779301572@linuxfoundation.org> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20210726153846.245305071@linuxfoundation.org> References: <20210726153846.245305071@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Somnath Kotur [ Upstream commit 3958b1da725a477b4a222183d16a14d85445d4b6 ] When bnxt_open() fails in the firmware reset path, the driver needs to gracefully abort, but it is executing code that should be invoked only in the success path. Define a function to abort FW reset and consolidate all error paths to call this new function. Fixes: dab62e7c2de7 ("bnxt_en: Implement faster recovery for firmware fatal error.") Signed-off-by: Somnath Kotur Signed-off-by: Michael Chan Signed-off-by: David S. Miller Signed-off-by: Sasha Levin --- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 31 +++++++++++++++-------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c index 07efab5bad95..49aca3289c00 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c @@ -11849,10 +11849,21 @@ static bool bnxt_fw_reset_timeout(struct bnxt *bp) (bp->fw_reset_max_dsecs * HZ / 10)); } +static void bnxt_fw_reset_abort(struct bnxt *bp, int rc) +{ + clear_bit(BNXT_STATE_IN_FW_RESET, &bp->state); + if (bp->fw_reset_state != BNXT_FW_RESET_STATE_POLL_VF) { + bnxt_ulp_start(bp, rc); + bnxt_dl_health_status_update(bp, false); + } + bp->fw_reset_state = 0; + dev_close(bp->dev); +} + static void bnxt_fw_reset_task(struct work_struct *work) { struct bnxt *bp = container_of(work, struct bnxt, fw_reset_task.work); - int rc; + int rc = 0; if (!test_bit(BNXT_STATE_IN_FW_RESET, &bp->state)) { netdev_err(bp->dev, "bnxt_fw_reset_task() called when not in fw reset mode!\n"); @@ -11883,8 +11894,9 @@ static void bnxt_fw_reset_task(struct work_struct *work) bp->fw_reset_timestamp = jiffies; rtnl_lock(); if (test_bit(BNXT_STATE_ABORT_ERR, &bp->state)) { + bnxt_fw_reset_abort(bp, rc); rtnl_unlock(); - goto fw_reset_abort; + return; } bnxt_fw_reset_close(bp); if (bp->fw_cap & BNXT_FW_CAP_ERR_RECOVER_RELOAD) { @@ -11933,6 +11945,7 @@ static void bnxt_fw_reset_task(struct work_struct *work) if (val == 0xffff) { if (bnxt_fw_reset_timeout(bp)) { netdev_err(bp->dev, "Firmware reset aborted, PCI config space invalid\n"); + rc = -ETIMEDOUT; goto fw_reset_abort; } bnxt_queue_fw_reset_work(bp, HZ / 1000); @@ -11942,6 +11955,7 @@ static void bnxt_fw_reset_task(struct work_struct *work) clear_bit(BNXT_STATE_FW_FATAL_COND, &bp->state); if (pci_enable_device(bp->pdev)) { netdev_err(bp->dev, "Cannot re-enable PCI device\n"); + rc = -ENODEV; goto fw_reset_abort; } pci_set_master(bp->pdev); @@ -11968,9 +11982,10 @@ static void bnxt_fw_reset_task(struct work_struct *work) } rc = bnxt_open(bp->dev); if (rc) { - netdev_err(bp->dev, "bnxt_open_nic() failed\n"); - clear_bit(BNXT_STATE_IN_FW_RESET, &bp->state); - dev_close(bp->dev); + netdev_err(bp->dev, "bnxt_open() failed during FW reset\n"); + bnxt_fw_reset_abort(bp, rc); + rtnl_unlock(); + return; } bp->fw_reset_state = 0; @@ -11997,12 +12012,8 @@ fw_reset_abort_status: netdev_err(bp->dev, "fw_health_status 0x%x\n", sts); } fw_reset_abort: - clear_bit(BNXT_STATE_IN_FW_RESET, &bp->state); - if (bp->fw_reset_state != BNXT_FW_RESET_STATE_POLL_VF) - bnxt_dl_health_status_update(bp, false); - bp->fw_reset_state = 0; rtnl_lock(); - dev_close(bp->dev); + bnxt_fw_reset_abort(bp, rc); rtnl_unlock(); } -- 2.30.2