From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 124A6A0C43 for ; Mon, 16 Aug 2021 16:30:23 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 09EFB40150; Mon, 16 Aug 2021 16:30:23 +0200 (CEST) Received: from relay.smtp-ext.broadcom.com (lpdvsmtp11.broadcom.com [192.19.166.231]) by mails.dpdk.org (Postfix) with ESMTP id 3589A4003C for ; Mon, 16 Aug 2021 16:30:21 +0200 (CEST) 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 EEDEE2477F for ; Mon, 16 Aug 2021 07:30:19 -0700 (PDT) DKIM-Filter: OpenDKIM Filter v2.11.0 relay.smtp-ext.broadcom.com EEDEE2477F DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=broadcom.com; s=dkimrelay; t=1629124220; bh=iHsuehToHwHQNH+CnGh5IZALkTBdTPfNbafgQru11EQ=; h=From:To:Subject:Date:In-Reply-To:References:From; b=ZJhL+dXLsvVt9XIOV1VP2H0RVq4l/xgCzzl7615pYbz+1wzfLFE2QiZT9kplzpwfL ALC+rTQUfpkm+Ip+0IjD8CQ27cJ/k4cZo6BIvBwfDenF7QdHA/T6/vulBVLzw6ZB8i DEltLgjwurH442tFpWZetbJqBj7P91q1zm32+qLo= From: Kalesh A P To: stable@dpdk.org Date: Mon, 16 Aug 2021 20:20:54 +0530 Message-Id: <20210816145059.31065-2-kalesh-anakkur.purayil@broadcom.com> X-Mailer: git-send-email 2.10.1 In-Reply-To: <20210816145059.31065-1-kalesh-anakkur.purayil@broadcom.com> References: <20210816145059.31065-1-kalesh-anakkur.purayil@broadcom.com> Subject: [dpdk-stable] [PATCH 19.11 1/6] net/bnxt: fix auto-negotiation on Whitney+ X-BeenThere: stable@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: patches for DPDK stable branches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: stable-bounces@dpdk.org Sender: "stable" From: Kalesh AP [ upstream commit 70c7d4184cb9a32ab6c65ce67ce5fbe3a5be5294 ] Driver should enable autoneg on a port if FW supports it. Because of a wrong check, driver is not enabling autoneg on a port after setting forced speed on Whitney+. There was some dependency on other changes which are not there in the 19.11 stable. Merged the minimal needed changes for this. Fixes: 7bc8e9a227cc ("net/bnxt: support async link notification") Signed-off-by: Kalesh AP Reviewed-by: Somnath Kotur Reviewed-by: Ajit Khaparde --- drivers/net/bnxt/bnxt.h | 1 + drivers/net/bnxt/bnxt_ethdev.c | 2 ++ drivers/net/bnxt/bnxt_hwrm.c | 43 +++++++++++++++++++++++++++++++++--------- drivers/net/bnxt/bnxt_hwrm.h | 1 + 4 files changed, 38 insertions(+), 9 deletions(-) diff --git a/drivers/net/bnxt/bnxt.h b/drivers/net/bnxt/bnxt.h index 335c88d..60173e4 100644 --- a/drivers/net/bnxt/bnxt.h +++ b/drivers/net/bnxt/bnxt.h @@ -251,6 +251,7 @@ struct bnxt_link_info { uint8_t phy_ver[PHY_VER_LEN]; uint16_t link_speed; uint16_t support_speeds; + uint16_t support_auto_speeds; uint16_t auto_link_speed; uint16_t force_link_speed; uint16_t auto_link_speed_mask; diff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c index 5ca0317..64df248 100644 --- a/drivers/net/bnxt/bnxt_ethdev.c +++ b/drivers/net/bnxt/bnxt_ethdev.c @@ -4993,6 +4993,8 @@ static int bnxt_init_fw(struct bnxt *bp) bnxt_hwrm_port_led_qcaps(bp); + bnxt_hwrm_port_phy_qcaps(bp); + return 0; } diff --git a/drivers/net/bnxt/bnxt_hwrm.c b/drivers/net/bnxt/bnxt_hwrm.c index d1f6d23..e354df1 100644 --- a/drivers/net/bnxt/bnxt_hwrm.c +++ b/drivers/net/bnxt/bnxt_hwrm.c @@ -1239,6 +1239,7 @@ static int bnxt_hwrm_port_phy_qcfg(struct bnxt *bp, link_info->support_speeds = rte_le_to_cpu_16(resp->support_speeds); link_info->auto_link_speed = rte_le_to_cpu_16(resp->auto_link_speed); + link_info->auto_link_speed_mask = rte_le_to_cpu_16(resp->auto_link_speed_mask); link_info->preemphasis = rte_le_to_cpu_32(resp->preemphasis); link_info->force_link_speed = rte_le_to_cpu_16(resp->force_link_speed); link_info->phy_ver[0] = resp->phy_maj; @@ -2885,15 +2886,8 @@ int bnxt_set_hwrm_link_config(struct bnxt *bp, bool link_up) speed = bnxt_parse_eth_link_speed(dev_conf->link_speeds); link_req.phy_flags = HWRM_PORT_PHY_CFG_INPUT_FLAGS_RESET_PHY; - /* Autoneg can be done only when the FW allows. - * When user configures fixed speed of 40G and later changes to - * any other speed, auto_link_speed/force_link_speed is still set - * to 40G until link comes up at new speed. - */ - if (autoneg == 1 && - !(!BNXT_CHIP_THOR(bp) && - (bp->link_info.auto_link_speed || - bp->link_info.force_link_speed))) { + /* Autoneg can be done only when the FW allows. */ + if (autoneg == 1 && bp->link_info.support_auto_speeds) { link_req.phy_flags |= HWRM_PORT_PHY_CFG_INPUT_FLAGS_RESTART_AUTONEG; link_req.auto_link_speed_mask = @@ -5122,3 +5116,34 @@ int bnxt_hwrm_poll_ver_get(struct bnxt *bp) return rc; } + +int bnxt_hwrm_port_phy_qcaps(struct bnxt *bp) +{ + int rc = 0; + struct hwrm_port_phy_qcaps_input req = {0}; + struct hwrm_port_phy_qcaps_output *resp = bp->hwrm_cmd_resp_addr; + struct bnxt_link_info *link_info = &bp->link_info; + + if (BNXT_VF(bp) && !BNXT_VF_IS_TRUSTED(bp)) + return 0; + + HWRM_PREP(req, PORT_PHY_QCAPS, BNXT_USE_CHIMP_MB); + + rc = bnxt_hwrm_send_message(bp, &req, sizeof(req), BNXT_USE_CHIMP_MB); + + HWRM_CHECK_RESULT(); + + if (resp->supported_speeds_auto_mode) + link_info->support_auto_speeds = + rte_le_to_cpu_16(resp->supported_speeds_auto_mode); + + /* Older firmware does not have supported_auto_speeds, so assume + * that all supported speeds can be autonegotiated. + */ + if (link_info->auto_link_speed_mask && !link_info->support_auto_speeds) + link_info->support_auto_speeds = link_info->support_speeds; + + HWRM_UNLOCK(); + + return 0; +} diff --git a/drivers/net/bnxt/bnxt_hwrm.h b/drivers/net/bnxt/bnxt_hwrm.h index 7b2432f..b8fb37d 100644 --- a/drivers/net/bnxt/bnxt_hwrm.h +++ b/drivers/net/bnxt/bnxt_hwrm.h @@ -228,4 +228,5 @@ int bnxt_hwrm_port_ts_query(struct bnxt *bp, uint8_t path, int bnxt_clear_one_vnic_filter(struct bnxt *bp, struct bnxt_filter_info *filter); int bnxt_hwrm_poll_ver_get(struct bnxt *bp); +int bnxt_hwrm_port_phy_qcaps(struct bnxt *bp); #endif -- 2.10.1