From patchwork Fri Apr 12 12:52:28 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Venkat Kumar Ande X-Patchwork-Id: 139253 X-Patchwork-Delegate: ferruh.yigit@amd.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 69AD043E52; Fri, 12 Apr 2024 14:53:40 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 4F3A6410FA; Fri, 12 Apr 2024 14:53:40 +0200 (CEST) Received: from NAM12-DM6-obe.outbound.protection.outlook.com (mail-dm6nam12on2061.outbound.protection.outlook.com [40.107.243.61]) by mails.dpdk.org (Postfix) with ESMTP id 9920E410FA for ; Fri, 12 Apr 2024 14:53:38 +0200 (CEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=LIKImuCbs7IyrGXlc/oFwZzMC5eOg5J57px4bstZG02ydE48G2qWM6fdeUtQBgfbHR2UzF2WxBQe2PMjlaAjsC5+0YhK+zFCT3HdzbJvIkAk5DVNnZVTJ6N2iekloc7RTk6dT6rnfho5mPfAK+0HgxX9rhQBw3idzSi5mkvtDspSuEz76CqPLGqYP9YIZTPtFtdF9bD5l+T+I3tcH7ZpBvDLekskhLckcAQd98uqSIYLZPipefQyZQPBcQh7Bp4u4krzc7eN7uDJLxaihTcsxtjnUjlUvXfYxmOb0rSlRTQYJM996F2r87/bAO6K9CNcxD8u+LDf9/3R4EWgf8rucg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; 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; bh=JQz/9DJz/6I/UEa2+0sjPqtZ562vcVVwszX/Q+CwDV4=; b=JQUztRzUFdwQqwRQynejfbhYfwI8Yl6Ki7+rQMYaNrAo9/wrjP8fmpw06OkAsjZS41LQ4zX6hE7CRVzeS/MSEggn03vmjwzf7B96+Jjo3pu1dvp2aIDLwKFZr+GdMaJuaXFGjOq1itPdKMnKQ9eogiVd6pQoAyibiW0yG6MhvLAuqgQImDyZt+4LQCPIjYJrf8Aomtr6lwagvL5tOXZgnlruS4H/EVfbBD/FashLJEcRFiCCgcT5bM9xjXr70WDajdNLS2Z1HPEFl8jFlbXBQCvgrsUZe7m7FXhe3d9AzpfKpHU5gZ0iZfxueVTiVXWJ65DBQmG96YxaMBqSBYiAXw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=dpdk.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=JQz/9DJz/6I/UEa2+0sjPqtZ562vcVVwszX/Q+CwDV4=; b=voF6CZl00wStqQI+hggFR1As/fRO4AtFjG/4rfnJKE/crCWIJJqCyHPe805CJT7opg9KNyzdEBrT0j7qNJ9xRxb5ewTFlGm3Pxjjrvif98N3QKFSJOyfkvT8PicxdDTCvnszeaKf05DMOexqyMj6Mp1rWRSsq35JG1yfA0RwhZM= Received: from BL1PR13CA0334.namprd13.prod.outlook.com (2603:10b6:208:2c6::9) by IA0PR12MB8226.namprd12.prod.outlook.com (2603:10b6:208:403::21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7409.46; Fri, 12 Apr 2024 12:53:35 +0000 Received: from BL6PEPF00020E63.namprd04.prod.outlook.com (2603:10b6:208:2c6:cafe::b2) by BL1PR13CA0334.outlook.office365.com (2603:10b6:208:2c6::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7495.13 via Frontend Transport; Fri, 12 Apr 2024 12:53:35 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=SATLEXMB04.amd.com; pr=C Received: from SATLEXMB04.amd.com (165.204.84.17) by BL6PEPF00020E63.mail.protection.outlook.com (10.167.249.24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.20.7452.22 via Frontend Transport; Fri, 12 Apr 2024 12:53:35 +0000 Received: from cae-Lilac-RMB.amd.com (10.180.168.240) by SATLEXMB04.amd.com (10.181.40.145) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.35; Fri, 12 Apr 2024 07:53:33 -0500 From: Venkat Kumar Ande To: CC: , Venkat Kumar Ande Subject: [PATCH 03/24] net/axgbe: improve SFP 100Mbps auto-negotiation Date: Fri, 12 Apr 2024 08:52:28 -0400 Message-ID: <20240412125249.10625-3-VenkatKumar.Ande@amd.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240412125249.10625-1-VenkatKumar.Ande@amd.com> References: <20240412125249.10625-1-VenkatKumar.Ande@amd.com> MIME-Version: 1.0 X-Originating-IP: [10.180.168.240] X-ClientProxiedBy: SATLEXMB04.amd.com (10.181.40.145) To SATLEXMB04.amd.com (10.181.40.145) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BL6PEPF00020E63:EE_|IA0PR12MB8226:EE_ X-MS-Office365-Filtering-Correlation-Id: a8f2a561-416e-4831-0451-08dc5aef9115 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: rquhl58c5uAweQ1fL9QmKGjzgGBkda4VB8Qkx5zswCMMednruY+7x+hxNnCon1ZsSsd/AuRRYmCW1izrqlYLxLqBtgjEPfnmeebq1LWn7SHXVJm+7ecWa4GypA7h9x5KitKJZRfjDQVPTCEKl+xz/We5Zg4NNZja6WA2TdhDk4sUN3VdAR3yKk7EZUubdmMa9soxCmcIbw7aFc7JaTGOiW133tRxy3hZQDuTDXCKniJ1cS1nRYWffTAg9c5UlVeXIhPZWsWarhSC+Ej5mrGQ6FKCUeKU/IReDR/ytVnd8a0Iq3jVV64/dDgtAD2VijX5uO22RQGzZovGKRBWl7hKID2X2xtBt++8QCMi6ObjeoUhwAbJHQ5nZzoBt5zc9rK8Xl2XqllXiMh1kbZj1ZJL8d0UZ8aEBO3Ojg0jIC/vTNaitvPNhdKAC4wd/7D12qRtw5xzQCv2QB7RePNBNx5AQ7Fdl5bWE8SjCvpMMLdTzd3SpsWv823rsQD11AAqjlzREt/w9QL3WQf7B3IkEiB+eguUy6ENyaMABJ2//tfTrweH/Lr3Dl5EMmhYajyDB6r/Njmtp+0cEPTKDg7HiLAzOpSTgemd2uqZWuvRT+QpwRyg45z7mrsK1WdAhIU/wuZ5KbilBIBlSNh3SQAoGL8AeIFQcoZWPhKtIkEAJxxmG3N4fYHnAzteK6n5heEJi6rO8bPPVml171tEvDZnrUNX6PClVjevZcWEz70APOUGwFiB5Cq7qTVAr9j0nFnLqNA+ X-Forefront-Antispam-Report: CIP:165.204.84.17; CTRY:US; LANG:en; SCL:1; SRV:; IPV:CAL; SFV:NSPM; H:SATLEXMB04.amd.com; PTR:InfoDomainNonexistent; CAT:NONE; SFS:(13230031)(1800799015)(376005)(82310400014)(36860700004); DIR:OUT; SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 12 Apr 2024 12:53:35.7056 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: a8f2a561-416e-4831-0451-08dc5aef9115 X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d; Ip=[165.204.84.17]; Helo=[SATLEXMB04.amd.com] X-MS-Exchange-CrossTenant-AuthSource: BL6PEPF00020E63.namprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: IA0PR12MB8226 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 After changing speed to 100Mbps as a result of auto-negotiation (AN), some 10/100/1000Mbps SFPs indicate a successful link (no faults or loss of signal), but cannot successfully transmit or receive data. These SFPs required an extra auto-negotiation (AN) after the speed change in order to operate properly. Add a quirk for these SFPs so that if the outcome of the AN actually results in changing to a new speed, re-initiate AN at that new speed. Signed-off-by: Venkat Kumar Ande --- drivers/net/axgbe/axgbe_ethdev.h | 1 + drivers/net/axgbe/axgbe_mdio.c | 73 ++++++++++++++++-------------- drivers/net/axgbe/axgbe_phy_impl.c | 5 ++ 3 files changed, 46 insertions(+), 33 deletions(-) diff --git a/drivers/net/axgbe/axgbe_ethdev.h b/drivers/net/axgbe/axgbe_ethdev.h index df5d63c493..924a26ebe3 100644 --- a/drivers/net/axgbe/axgbe_ethdev.h +++ b/drivers/net/axgbe/axgbe_ethdev.h @@ -656,6 +656,7 @@ struct axgbe_port { enum axgbe_an an_state; enum axgbe_rx kr_state; enum axgbe_rx kx_state; + unsigned int an_again; unsigned int an_supported; unsigned int parallel_detect; unsigned int fec_ability; diff --git a/drivers/net/axgbe/axgbe_mdio.c b/drivers/net/axgbe/axgbe_mdio.c index 913ceada0d..0beeb1d0f5 100644 --- a/drivers/net/axgbe/axgbe_mdio.c +++ b/drivers/net/axgbe/axgbe_mdio.c @@ -200,13 +200,14 @@ static void axgbe_switch_mode(struct axgbe_port *pdata) axgbe_change_mode(pdata, pdata->phy_if.phy_impl.switch_mode(pdata)); } -static void axgbe_set_mode(struct axgbe_port *pdata, +static bool axgbe_set_mode(struct axgbe_port *pdata, enum axgbe_mode mode) { if (mode == axgbe_cur_mode(pdata)) - return; + return false; axgbe_change_mode(pdata, mode); + return true; } static bool axgbe_use_mode(struct axgbe_port *pdata, @@ -880,21 +881,22 @@ static int axgbe_phy_config_fixed(struct axgbe_port *pdata) return 0; } -static int __axgbe_phy_config_aneg(struct axgbe_port *pdata) +static int __axgbe_phy_config_aneg(struct axgbe_port *pdata, bool set_mode) { int ret; + pthread_mutex_lock(&pdata->an_mutex); rte_bit_relaxed_set32(AXGBE_LINK_INIT, &pdata->dev_state); pdata->link_check = rte_get_timer_cycles(); ret = pdata->phy_if.phy_impl.an_config(pdata); if (ret) - return ret; + goto out; if (pdata->phy.autoneg != AUTONEG_ENABLE) { ret = axgbe_phy_config_fixed(pdata); if (ret || !pdata->kr_redrv) - return ret; + goto out; PMD_DRV_LOG(DEBUG, "AN redriver support\n"); } else { PMD_DRV_LOG(DEBUG, "AN PHY configuration\n"); @@ -904,23 +906,26 @@ static int __axgbe_phy_config_aneg(struct axgbe_port *pdata) rte_intr_disable(pdata->pci_dev->intr_handle); /* Start auto-negotiation in a supported mode */ - if (axgbe_use_mode(pdata, AXGBE_MODE_KR)) { - axgbe_set_mode(pdata, AXGBE_MODE_KR); - } else if (axgbe_use_mode(pdata, AXGBE_MODE_KX_2500)) { - axgbe_set_mode(pdata, AXGBE_MODE_KX_2500); - } else if (axgbe_use_mode(pdata, AXGBE_MODE_KX_1000)) { - axgbe_set_mode(pdata, AXGBE_MODE_KX_1000); - } else if (axgbe_use_mode(pdata, AXGBE_MODE_SFI)) { - axgbe_set_mode(pdata, AXGBE_MODE_SFI); - } else if (axgbe_use_mode(pdata, AXGBE_MODE_X)) { - axgbe_set_mode(pdata, AXGBE_MODE_X); - } else if (axgbe_use_mode(pdata, AXGBE_MODE_SGMII_1000)) { - axgbe_set_mode(pdata, AXGBE_MODE_SGMII_1000); - } else if (axgbe_use_mode(pdata, AXGBE_MODE_SGMII_100)) { - axgbe_set_mode(pdata, AXGBE_MODE_SGMII_100); - } else { - rte_intr_enable(pdata->pci_dev->intr_handle); - return -EINVAL; + if (set_mode) { + if (axgbe_use_mode(pdata, AXGBE_MODE_KR)) { + axgbe_set_mode(pdata, AXGBE_MODE_KR); + } else if (axgbe_use_mode(pdata, AXGBE_MODE_KX_2500)) { + axgbe_set_mode(pdata, AXGBE_MODE_KX_2500); + } else if (axgbe_use_mode(pdata, AXGBE_MODE_KX_1000)) { + axgbe_set_mode(pdata, AXGBE_MODE_KX_1000); + } else if (axgbe_use_mode(pdata, AXGBE_MODE_SFI)) { + axgbe_set_mode(pdata, AXGBE_MODE_SFI); + } else if (axgbe_use_mode(pdata, AXGBE_MODE_X)) { + axgbe_set_mode(pdata, AXGBE_MODE_X); + } else if (axgbe_use_mode(pdata, AXGBE_MODE_SGMII_1000)) { + axgbe_set_mode(pdata, AXGBE_MODE_SGMII_1000); + } else if (axgbe_use_mode(pdata, AXGBE_MODE_SGMII_100)) { + axgbe_set_mode(pdata, AXGBE_MODE_SGMII_100); + } else { + rte_intr_enable(pdata->pci_dev->intr_handle); + ret = -EINVAL; + goto out; + } } /* Disable and stop any in progress auto-negotiation */ @@ -938,16 +943,7 @@ static int __axgbe_phy_config_aneg(struct axgbe_port *pdata) axgbe_an_init(pdata); axgbe_an_restart(pdata); - return 0; -} - -static int axgbe_phy_config_aneg(struct axgbe_port *pdata) -{ - int ret; - - pthread_mutex_lock(&pdata->an_mutex); - - ret = __axgbe_phy_config_aneg(pdata); +out: if (ret) rte_bit_relaxed_set32(AXGBE_LINK_ERR, &pdata->dev_state); else @@ -958,6 +954,16 @@ static int axgbe_phy_config_aneg(struct axgbe_port *pdata) return ret; } +static int axgbe_phy_config_aneg(struct axgbe_port *pdata) +{ + return __axgbe_phy_config_aneg(pdata, true); +} + +static int axgbe_phy_reconfig_aneg(struct axgbe_port *pdata) +{ + return __axgbe_phy_config_aneg(pdata, false); +} + static bool axgbe_phy_aneg_done(struct axgbe_port *pdata) { return pdata->an_result == AXGBE_AN_COMPLETE; @@ -1016,7 +1022,8 @@ static void axgbe_phy_status_result(struct axgbe_port *pdata) pdata->phy.duplex = DUPLEX_FULL; - axgbe_set_mode(pdata, mode); + if (axgbe_set_mode(pdata, mode) && pdata->an_again) + axgbe_phy_reconfig_aneg(pdata); } static int autoneg_time_out(unsigned long autoneg_start_time) diff --git a/drivers/net/axgbe/axgbe_phy_impl.c b/drivers/net/axgbe/axgbe_phy_impl.c index e1b926d48a..5acccf9146 100644 --- a/drivers/net/axgbe/axgbe_phy_impl.c +++ b/drivers/net/axgbe/axgbe_phy_impl.c @@ -560,6 +560,8 @@ static bool axgbe_phy_belfuse_parse_quirks(struct axgbe_port *pdata) if (memcmp(&sfp_eeprom->base[AXGBE_SFP_BASE_VENDOR_NAME], AXGBE_BEL_FUSE_VENDOR, strlen(AXGBE_BEL_FUSE_VENDOR))) return false; + /* For Bel-Fuse, use the extra AN flag */ + pdata->an_again = 1; if (!memcmp(&sfp_eeprom->base[AXGBE_SFP_BASE_VENDOR_PN], AXGBE_BEL_FUSE_PARTNO, strlen(AXGBE_BEL_FUSE_PARTNO))) { @@ -796,6 +798,9 @@ static void axgbe_phy_sfp_detect(struct axgbe_port *pdata) struct axgbe_phy_data *phy_data = pdata->phy_data; int ret; + /* Clear the extra AN flag */ + pdata->an_again = 0; + /* Reset the SFP signals and info */ axgbe_phy_sfp_reset(phy_data);