From patchwork Wed Feb 24 15:55:52 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kalesh A P X-Patchwork-Id: 88172 X-Patchwork-Delegate: ajit.khaparde@broadcom.com Return-Path: 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]) by inbox.dpdk.org (Postfix) with ESMTP id 9D518A054F; Wed, 24 Feb 2021 16:35:09 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 61356160889; Wed, 24 Feb 2021 16:33:48 +0100 (CET) Received: from relay.smtp-ext.broadcom.com (saphodev.broadcom.com [192.19.232.172]) by mails.dpdk.org (Postfix) with ESMTP id 7945B160880 for ; Wed, 24 Feb 2021 16:33:47 +0100 (CET) Received: from dhcp-10-123-153-22.dhcp.broadcom.net (bgccx-dev-host-lnx2.bec.broadcom.net [10.123.153.22]) by relay.smtp-ext.broadcom.com (Postfix) with ESMTP id 072E8E7; Wed, 24 Feb 2021 07:33:45 -0800 (PST) DKIM-Filter: OpenDKIM Filter v2.11.0 relay.smtp-ext.broadcom.com 072E8E7 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=broadcom.com; s=dkimrelay; t=1614180827; bh=dL6jBHVmFzvw7SpelRW4ocecbuMOj82FMOYaKgzWmoc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=vDp9nfrsxdj5PAF0etvyVI6wsxU9haIo8a/i6ynylZv4Yn0QqOeSzYdPawz6dHhiz ufNBQXSAPXpRyyTKpO7RcXByZvmjYhd8ieAC3JUu9iz+8UcYzRxmMAvxqNm+wUyRqC 8iaBJ4D9wzRIXShpf3GWvhDaYMfXm41N/ZTx252o= From: Kalesh A P To: dev@dpdk.org Cc: ferruh.yigit@intel.com, ajit.khaparde@broadcom.com Date: Wed, 24 Feb 2021 21:25:52 +0530 Message-Id: <20210224155553.26893-11-kalesh-anakkur.purayil@broadcom.com> X-Mailer: git-send-email 2.10.1 In-Reply-To: <20210224155553.26893-1-kalesh-anakkur.purayil@broadcom.com> References: <20210224155553.26893-1-kalesh-anakkur.purayil@broadcom.com> Subject: [dpdk-dev] [PATCH 10/11] net/bnxt: fix fw readiness check during recovery X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Kalesh AP Moved fw readiness check to a new routine bnxt_check_fw_ready(). During error recovery, driver needs to wait for fw readiness. For that, it uses bnxt_hwrm_ver_get() function now and that function does parsing of the VER_GET response as well. Added a new lightweight function bnxt_hwrm_poll_ver_get() for polling the firmware readiness which issues VER_GET and checks for success without processing the command response. Fixes: df6cd7c1f73a ("net/bnxt: handle reset notify async event from FW") Cc: stable@dpdk.org Signed-off-by: Kalesh AP Reviewed-by: Ajit Kumar Khaparde Reviewed-by: Somnath Kotur --- drivers/net/bnxt/bnxt_ethdev.c | 33 +++++++++++++++++++++------------ drivers/net/bnxt/bnxt_hwrm.c | 22 ++++++++++++++++++++++ drivers/net/bnxt/bnxt_hwrm.h | 1 + 3 files changed, 44 insertions(+), 12 deletions(-) diff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c index 986e40a..c4f334f 100644 --- a/drivers/net/bnxt/bnxt_ethdev.c +++ b/drivers/net/bnxt/bnxt_ethdev.c @@ -3831,10 +3831,28 @@ static int bnxt_restore_filters(struct bnxt *bp) return ret; } +static int bnxt_check_fw_ready(struct bnxt *bp) +{ + int timeout = bp->fw_reset_max_msecs; + int rc = 0; + + do { + rc = bnxt_hwrm_poll_ver_get(bp); + if (rc == 0) + break; + rte_delay_ms(BNXT_FW_READY_WAIT_INTERVAL); + timeout -= BNXT_FW_READY_WAIT_INTERVAL; + } while (rc && timeout > 0); + + if (rc) + PMD_DRV_LOG(ERR, "FW is not Ready after reset\n"); + + return rc; +} + static void bnxt_dev_recover(void *arg) { struct bnxt *bp = arg; - int timeout = bp->fw_reset_max_msecs; int rc = 0; pthread_mutex_lock(&bp->err_recovery_lock); @@ -3848,18 +3866,9 @@ static void bnxt_dev_recover(void *arg) /* Clear Error flag so that device re-init should happen */ bp->flags &= ~BNXT_FLAG_FATAL_ERROR; - do { - rc = bnxt_hwrm_ver_get(bp, SHORT_HWRM_CMD_TIMEOUT); - if (rc == 0) - break; - rte_delay_ms(BNXT_FW_READY_WAIT_INTERVAL); - timeout -= BNXT_FW_READY_WAIT_INTERVAL; - } while (rc && timeout); - - if (rc) { - PMD_DRV_LOG(ERR, "FW is not Ready after reset\n"); + rc = bnxt_check_fw_ready(bp); + if (rc) goto err; - } rc = bnxt_init_resources(bp, true); if (rc) { diff --git a/drivers/net/bnxt/bnxt_hwrm.c b/drivers/net/bnxt/bnxt_hwrm.c index 9142119..0b5318e 100644 --- a/drivers/net/bnxt/bnxt_hwrm.c +++ b/drivers/net/bnxt/bnxt_hwrm.c @@ -5913,3 +5913,25 @@ int bnxt_hwrm_fw_echo_reply(struct bnxt *bp, uint32_t echo_req_data1, return rc; } + +int bnxt_hwrm_poll_ver_get(struct bnxt *bp) +{ + struct hwrm_ver_get_input req = {.req_type = 0 }; + struct hwrm_ver_get_output *resp = bp->hwrm_cmd_resp_addr; + int rc = 0; + + bp->max_req_len = HWRM_MAX_REQ_LEN; + bp->hwrm_cmd_timeout = SHORT_HWRM_CMD_TIMEOUT; + + HWRM_PREP(&req, HWRM_VER_GET, BNXT_USE_CHIMP_MB); + req.hwrm_intf_maj = HWRM_VERSION_MAJOR; + req.hwrm_intf_min = HWRM_VERSION_MINOR; + req.hwrm_intf_upd = HWRM_VERSION_UPDATE; + + rc = bnxt_hwrm_send_message(bp, &req, sizeof(req), BNXT_USE_CHIMP_MB); + + HWRM_CHECK_RESULT_SILENT(); + HWRM_UNLOCK(); + + return rc; +} diff --git a/drivers/net/bnxt/bnxt_hwrm.h b/drivers/net/bnxt/bnxt_hwrm.h index c47c249..785e321 100644 --- a/drivers/net/bnxt/bnxt_hwrm.h +++ b/drivers/net/bnxt/bnxt_hwrm.h @@ -304,4 +304,5 @@ int bnxt_hwrm_cfa_pair_free(struct bnxt *bp, struct bnxt_representor *rep); int bnxt_hwrm_cfa_adv_flow_mgmt_qcaps(struct bnxt *bp); int bnxt_hwrm_fw_echo_reply(struct bnxt *bp, uint32_t echo_req_data1, uint32_t echo_req_data2); +int bnxt_hwrm_poll_ver_get(struct bnxt *bp); #endif