From nobody Mon Apr 6 10:31:28 2026 Received: from CH4PR04CU002.outbound.protection.outlook.com (mail-northcentralusazon11013013.outbound.protection.outlook.com [40.107.201.13]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B188A3ED5C3; Thu, 19 Mar 2026 16:33:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.201.13 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773938015; cv=fail; b=cSfq20dgREIvl8q+EMF0sVnjJRmkz/DIV2gXUMIH4VnRST9yla2Z4anHkuRoBiPwv5HoaLdp8aMdwgvny/paF+5+XloXZ5zDVrpljuhYTQku60baqFlASu14Sb9C04DD14hGseCLYoIbFmhgb7RjbFKnBc/6qS+2YObmJJSRCbQ= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773938015; c=relaxed/simple; bh=/hOq6Ly2egoiqJym1Nf9smAKv4cA/LTfsf2ehV+HC5M=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=aU5lQedpofI+9G1mzca1RaMsiaNnjCNiytnJ9Ht5TT+zywniiQvjBlp1Rw7V37NLs/hq2Pc8IejXgDKAhuNwYszNih6CD8UNqdEAgkQ+5p9WTuYSj8x1A9LQOnfkWnyQbU4o4bwUgYykT78/OGfo9oM3mJzvn5LDQ/lkuEpbf2Y= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com; spf=fail smtp.mailfrom=amd.com; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b=k6VRagvD; arc=fail smtp.client-ip=40.107.201.13 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=amd.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b="k6VRagvD" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=rOzKjX8EtniE1LiI6/+3ZiOYZDwApQUVITeetPBnRg8IHWBKpDltYgLO3Q6aJZ82jN8xOXR7t4/Vc6KEKjUqtTFfC7ekiubWdhWddRwdoom1Z8X88vC4ZsGYDYBBY3VppLX8ug5l/9cSiLvph7BLriLVoTwwn6UYZkdB0Z+lERyhx4jnoHdk7j8/JTwiYJMkUmDNf3lDzXJEf0huap8ZUgAGUD5PsxLO+x1XdW1oyzkbSaQE0AfJkfpmASXUKEtx5LzWU8CNu71/Nlp3EmtjkLqAy8HyPhl+VaTPs/bkEINYR/9Rv85pOU967D/7X1V6eYYqzzuthTY0ktULPPzUJQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; 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=EVRD/6WJ4Y7LMIP7siLO5DA31yQ+4epO0WFal+6A3rw=; b=YYZr8/3GbnudzIrh5KitSyt+ZIsshhItvBAIkTB5/oUDJeYqundO4dSNWzxz4GOn/dIdMxoaZpnDJP1SR0nmBba0FewhrmpkCvDvo9Ulx59bIBddw+iNO3LiWzJu4VdtdRQJRPWIb2Qv9cGXbWR8jpQZQoUO1E5UOFhunXncCJR+KOVxRp6tm3Azh28o22TaPgBfneJvqvf+ld6N6RJKKBymPDPbrkQP0L6SQUbsYir2ldrGzb01Udi8HdtvCLzftaJYy7zLyE9bfJ9gaSpyqta0XSkQ6GNvkV83MAoVzZkeduSWpq7tvQSq8jNe0aLHeqWSuXTUs20yyZC/Lwu26A== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=vger.kernel.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=EVRD/6WJ4Y7LMIP7siLO5DA31yQ+4epO0WFal+6A3rw=; b=k6VRagvDQMoDMOZvTCg/RPuSZ+glkU7UraRhlSRUMlp8Kj/+chwUAbZR7lp9MT9qPXgtN1FHcSrZSXtrhOfkCJ3U8WUKhXy33eppYc7mW0ZAd1jPs8d3XLIiHS6DdeLaY3kZxdrNO/YtSlbAs6/TH3SAnPVUuti1eGk+DxXK4Ro= Received: from DM6PR14CA0050.namprd14.prod.outlook.com (2603:10b6:5:18f::27) by CY8PR12MB7219.namprd12.prod.outlook.com (2603:10b6:930:59::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9745.9; Thu, 19 Mar 2026 16:33:22 +0000 Received: from DS2PEPF000061C8.namprd02.prod.outlook.com (2603:10b6:5:18f:cafe::59) by DM6PR14CA0050.outlook.office365.com (2603:10b6:5:18f::27) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9700.28 via Frontend Transport; Thu, 19 Mar 2026 16:33:22 +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=satlexmb07.amd.com; pr=C Received: from satlexmb07.amd.com (165.204.84.17) by DS2PEPF000061C8.mail.protection.outlook.com (10.167.23.75) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9723.19 via Frontend Transport; Thu, 19 Mar 2026 16:33:22 +0000 Received: from airavat.amd.com (10.180.168.240) by satlexmb07.amd.com (10.181.42.216) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.17; Thu, 19 Mar 2026 11:33:19 -0500 From: Raju Rangoju To: CC: , , , , , , "Raju Rangoju" Subject: [PATCH v3 net-next 1/3] amd-xgbe: add adaptive link status polling Date: Thu, 19 Mar 2026 22:02:49 +0530 Message-ID: <20260319163251.1808611-2-Raju.Rangoju@amd.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260319163251.1808611-1-Raju.Rangoju@amd.com> References: <20260319163251.1808611-1-Raju.Rangoju@amd.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: satlexmb07.amd.com (10.181.42.216) To satlexmb07.amd.com (10.181.42.216) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DS2PEPF000061C8:EE_|CY8PR12MB7219:EE_ X-MS-Office365-Filtering-Correlation-Id: 46ab296c-a4a9-449e-44ed-08de85d53c9a X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|82310400026|1800799024|36860700016|376014|18002099003|56012099003|22082099003; X-Microsoft-Antispam-Message-Info: RW9rFBgvLXjQtryA+UZs07MiQ+RCDvcz5RboPrk+nZTFMVkE8S6BHZCnp4Tyh1rklsR6LUubjPQZuDnZy3gEddWdRwB0mlC1HxMNk2Kb3HmJt+4SJHnAS7SH9ncSw/GucVOmb1tmuLysThaksMfyqKAkQpzDSW882KS8Hpgx6FWfO8XnA7pezFKU5fG6h6EbGi8PKvzEEy1qpoNWwvZAm3inPLF2ZUyZDlShuh5ptm3CK7qxluJTE8XtT72M7QvoPfCLwRHIQt/l87keJ//v2fsQNWJhpFLUeaY27QMHxtXJNcZBcblpX4u+s76vnX+m/SXh3+jZsXNeW3Yk99Y0pnGN31k0o93JKwviBvK4H7rxR9rS15jCgR5UsweTWGOjM1E+Ih1w2loiBEvudZ5qun2H5aaleMEJJHc6nRGHKqFEIO5xk/QfCtmz9/PpydRalyy4rh82Ygepvscg5fhA7M8JY4ohoUu1JW9dkLooaqkladStCABPJM7wTQ9lRO+SV6Q0RaTOyBuwrG5BeZEECXhzt+OedydKJYlRJiPThRyjeCq9s0ThCguV9GKtpmmxOsVVsIT9O1FLE7L3nsPTZhAVhTRSRAgoopBJbt7PB0M1GaFr30EmAv9Zz17kITltgKC5PVRHnMdSjTzAWj4GI+VmNY6cTZp60DwgwFGAc34uBIusfPJVQwVOjH6tIA2iChXtDICuiuJZPIg2Q7v+u7jmJ4w+GGzD0l8hqHimHpOaswXzCUXD7PIYcujKL4VLDdPOZRT/jNB8Q+tyHVsJaw== X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:satlexmb07.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(82310400026)(1800799024)(36860700016)(376014)(18002099003)(56012099003)(22082099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: hKy/i/lVxomdO5l6h2ynFrrL6Uery3G1F6BNu4Gkpvu1eMkcwGaHrw59Y9v+963RuJvYZK40KkIJimFAM+Ep3X9R1q45eZAWqfA5xftv1az+Ccqu7SKQa7r+XmAuFD+0C1SpIb8/YQbyU+t/9Mt/S1yol1PvIAxGKZQjZYvQ93uSjMGpfWF5eroDMZQwjZiUJXJe/6GDcHNQWntTIuc1iA63EUR2LJPEghhgrZZoPaOeQwthKK5Fx4FbL8VKcL230tQqWFNJW9mkf27surAbFYghtgcEUxLlYgpEtxBrNUlBRMQGKxrFXP5KrhFTXUT3y1N0t3OvKo70/Q5KGrhU9ginJwRhyUj5OZKIKyrc2AmyTkRplinlffZGd+Eeqbm8uFSnWHe/Pm8N5ZNWlfsZF0KitMsaMVaAFGL+yviy0A1Tm37A839gTtzGgUj0OVeS X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 19 Mar 2026 16:33:22.4069 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 46ab296c-a4a9-449e-44ed-08de85d53c9a 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=[satlexmb07.amd.com] X-MS-Exchange-CrossTenant-AuthSource: DS2PEPF000061C8.namprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY8PR12MB7219 Implement adaptive link status polling to enable fast link-down detection while conserving CPU resources during link-down periods. Currently, the driver polls link status at a fixed 1-second interval regardless of link state. This creates a trade-off: - Slow polling (1s): Misses rapid link state changes, causing delays - Fast polling: Wastes CPU when link is stable or down This enhancement introduces state-aware polling: When carrier is UP: Poll every 100ms to enable rapid link-down detection. This provides ~100-200ms response time to link failures, minimizing packet loss and enabling fast failover in link aggregation configurations. When carrier is DOWN: Poll every 1s to conserve CPU resources. Link-up detection is less time-critical since no traffic is flowing. Performance impact: - Link-down detection: 1000ms =E2=86=92 100-200ms (10x improvement) - CPU overhead when link up: 0.1% =E2=86=92 1% (acceptable for active lin= ks) - CPU overhead when link down: unchanged at 0.1% This is particularly valuable for: - Link aggregation deployments requiring sub-second failover - Environments with flaky links or cable issues - Applications sensitive to connection recovery time Signed-off-by: Raju Rangoju --- drivers/net/ethernet/amd/xgbe/xgbe-drv.c | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-drv.c b/drivers/net/etherne= t/amd/xgbe/xgbe-drv.c index 2f39f38fecf9..6886d3b33ffe 100644 --- a/drivers/net/ethernet/amd/xgbe/xgbe-drv.c +++ b/drivers/net/ethernet/amd/xgbe/xgbe-drv.c @@ -607,11 +607,33 @@ static void xgbe_service_timer(struct timer_list *t) struct xgbe_prv_data *pdata =3D timer_container_of(pdata, t, service_timer); struct xgbe_channel *channel; + unsigned int poll_interval; unsigned int i; =20 queue_work(pdata->dev_workqueue, &pdata->service_work); =20 - mod_timer(&pdata->service_timer, jiffies + HZ); + /* Adaptive link status polling for fast failure detection: + * + * - When carrier is UP: poll every 100ms for rapid link-down detection + * Enables sub-second response to link failures, minimizing traffic + * loss. + * + * - When carrier is DOWN: poll every 1s to conserve CPU resources + * Link-up events are less time-critical. + * + * The 100ms active polling interval balances responsiveness with + * efficiency: + * - Provides ~100-200ms link-down detection (10x faster than 1s + * polling) + * - Minimal CPU overhead (1% vs 0.1% with 1s polling) + * - Enables fast failover in link aggregation deployments + */ + if (netif_running(pdata->netdev) && netif_carrier_ok(pdata->netdev)) + poll_interval =3D msecs_to_jiffies(100); /* 100ms when up */ + else + poll_interval =3D HZ; /* 1 second when down */ + + mod_timer(&pdata->service_timer, jiffies + poll_interval); =20 if (!pdata->tx_usecs) return; --=20 2.34.1 From nobody Mon Apr 6 10:31:28 2026 Received: from CY7PR03CU001.outbound.protection.outlook.com (mail-westcentralusazon11010013.outbound.protection.outlook.com [40.93.198.13]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4DA753EAC83; Thu, 19 Mar 2026 16:33:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.198.13 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773938021; cv=fail; b=BwcegoYVsjfsalSSNudAUiwAuxUcSKS0qRoxXn+JX6tloiIzYw9uO6gZtzlvaBAMgA9v7Pg2oKZPehPOMlR3sYy/Ntk5aNoXYC3GR9a1bUUxOYCUpgysLdlObv+jgZ3CYrQ//oilK05oJ8iWPCop7mWA6pGBHDyCX+r9vH3Xn74= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773938021; c=relaxed/simple; bh=5t4NKf0j+SXzgf5SCIsB//5lQpHU0Kzix4I4EDcI6hE=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=dVOOJcQZ7MYoguZk+3jH3ytSOcHXuHETwKl+dZDXZFK0WfjhOv2wqaIuwPFAhoXkpPbYKf+5Lrv/CDwuoO6lADN0tn/P5POkOlfuzFGxSF2NZNV30ccv4SsTjq6rF5g6kGGnpZqWJimMKx2aMUcJtOVWpZS3M08+SpfcRxWdOes= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com; spf=fail smtp.mailfrom=amd.com; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b=jnfntKyd; arc=fail smtp.client-ip=40.93.198.13 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=amd.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b="jnfntKyd" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=VwVDhP3u+SnVUJ4rWd6XigYHvO5XRrCDWvXMB7OhhitJGA32GKQI7/PxR4nButkyyH2S4J7Uv0EAK28vuce1NvlPY0O6vUjquvo7CAnk1lUI/EHDXqJxPsrcccpUNqiCPNzdth45AMOcnMaQlPMLXq9T7pqnTs9eM4D2xLJPbDAVNAzJTOe8xKsC2tsIPGiC+DgoFNyJtl49PzV1UaB9P9PvcYYM/EdLK/XOg0ajPc8ZAGlXhU4XUHGIyuh5x9C7vz7gLTKKOxysSHvYrf2HyPNHeBN7ErkLn/gyyDRGpF7lZJUyCwrVuGIhTbabEgPOB/n5cAhqA+15Mqu/+tjoCQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; 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=VRyarCsVsCZSla8kHKhCHaGZGv7x8BLtoxROpxUPfCE=; b=JzXE+7F3mkrL0pZfDrVJMfRXv5DxKcDoZ8k6tumvdkcpk7hb/Ra0sQvq4psQxQOq/m6n87is/CAsy6kwHdEx40XGFn/L8np2zAeUDGMC0dbue77n37On/W0ROJwUHruiYFuD6lSaiDrZFkYWO26NRIT+M6UZthR9Wc0uCG22lkBjKtEL2AJ8JyuHb11AHQQYWhK07vbESgj6z4QZECorGRgWga4e6jQ4QALrqZOjaBFTiCTtA48u9l6qOvr2c1dGUsApsLSAEf3LGPV0t7XBY7AsDCLGwowDsaJ3VUn5ZX0tIQ2ep5eKRV0zfl8qDIesJIN/fXE1Ki00fhGYNMA0bg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=vger.kernel.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=VRyarCsVsCZSla8kHKhCHaGZGv7x8BLtoxROpxUPfCE=; b=jnfntKydHAmzMh4qUxL2wHoJTHvcOUt39DEYC+bUEhjTDSP6ACnixfuBI6ScgnefHNZSJwpfmMxAINBYXrtUN1GLJtgXjwXCCUx+V93bB6QNaYuzRUAX+9r6k6bOLqJQH+GBCFCKDgX/dfmqHxF1MmKPy0NAreb/dL3FfH+0m4w= Received: from CH0PR03CA0062.namprd03.prod.outlook.com (2603:10b6:610:cc::7) by SJ2PR12MB7798.namprd12.prod.outlook.com (2603:10b6:a03:4c0::21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9745.9; Thu, 19 Mar 2026 16:33:29 +0000 Received: from DS2PEPF000061C5.namprd02.prod.outlook.com (2603:10b6:610:cc:cafe::e4) by CH0PR03CA0062.outlook.office365.com (2603:10b6:610:cc::7) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9723.19 via Frontend Transport; Thu, 19 Mar 2026 16:33:28 +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=satlexmb07.amd.com; pr=C Received: from satlexmb07.amd.com (165.204.84.17) by DS2PEPF000061C5.mail.protection.outlook.com (10.167.23.72) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9723.19 via Frontend Transport; Thu, 19 Mar 2026 16:33:28 +0000 Received: from airavat.amd.com (10.180.168.240) by satlexmb07.amd.com (10.181.42.216) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.17; Thu, 19 Mar 2026 11:33:25 -0500 From: Raju Rangoju To: CC: , , , , , , "Raju Rangoju" Subject: [PATCH v3 net-next 2/3] amd-xgbe: optimize TX shutdown on link-down Date: Thu, 19 Mar 2026 22:02:50 +0530 Message-ID: <20260319163251.1808611-3-Raju.Rangoju@amd.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260319163251.1808611-1-Raju.Rangoju@amd.com> References: <20260319163251.1808611-1-Raju.Rangoju@amd.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: satlexmb07.amd.com (10.181.42.216) To satlexmb07.amd.com (10.181.42.216) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DS2PEPF000061C5:EE_|SJ2PR12MB7798:EE_ X-MS-Office365-Filtering-Correlation-Id: 251c5999-3586-4cdf-659a-08de85d54021 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|82310400026|376014|36860700016|1800799024|22082099003|56012099003|18002099003; X-Microsoft-Antispam-Message-Info: xW8ERcjvZH5Dx4KiVSECA/MnFg+SLntmhr+vdKkjDo+Msw7drrjNzcpncUgKQshg9QKSxVe5vlvNIjwZ7TAwJ2mR6h57Y2Q8oZZWJ0fAWaaqnxO+IWbMaeT859Itjou+ViOjYbRNmpN6lKO0tipVRozdAVFXHaZ0YcRPOwfGQvNewvWMrwpGONwA3DXcqRRuCFfdqHcrlDLz3gqimNJqZJaMmjjtPwKHXTFTnQraihAAZ93reCcKjCv1hX3uRqKNw+QbWBJ6VxwF9BgKFPId2wUBK+DwpRDklW65YEN7Rg8KF3DUolmRewA0nBbldXfUjvzaw5QXgsSmXlLXNNKjB9QOslo0vcQqOnaTweyzScrZBZMhOooXo/cmIR2rHOJZKJBmjHTgb3cyhRQWyBGU63+1mJOG1f3D3z7oj4vjc/7uFoWoIepmWRYv2rjy/scIRx0DLgdcU3J7NDQwtDZkx3VlQpYmwTGdJ8ecoRm7yl5iD/RAOd/MKal5FofQjJTm5P3uxlbPzKqSRze9mLJWld1FgBGm4wExNYp7+SCk35X7vzUu1M1t10zjuZ12F4xOOYPQN8TGEELjJ+VbyMPFRhXAHt9+0bakKWzyxZDhOluCifX3QR552iTYpCz3NBf9ZdMPGvS17UZ3KYueuCFJn7ZNIxDyfxJsHpXMiELcir+shpVkSQzpRG2/agc//w8fJiVlQHmhL8veCTUv/77iHzZjyoZ4zW+GF4JFOjMD3dsOfap4lDGL357SKWaHVVgHxhCffTkf9HxKIXgUQdSd4Q== X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:satlexmb07.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(82310400026)(376014)(36860700016)(1800799024)(22082099003)(56012099003)(18002099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: ABJ1OEPma6VuLwQlXyqvtXfaMx0Clb1awUHtOUWz3fYsETaU6iXL4JcJWezgt8REkar2MUHHu8k9VhGymNeFN237MDO0b+n0zmudmwQ9gHwqowMoqvNKpBXL0ppnPR2OaYRBNzoV5TtBFrHfTDLBXJPh7ts1hWWwWkX2xdTt5H3FpqmkzZQ2O7asVDf9yxmDiPfbFyg5eIj0TSiwG72hSqAqVKnytLU1byUT1L/8spp+TD2ezeDHqKczgwVXpUK7LlTSo7PSgWk4NzHDyEjizA0H81TyHF3JJA24MmWeiXkxqPRCnjQ0PSqsBGNM2lgt1FAkrc6UwsujKmAKt+BxfG+VIipEHXrsevie4Z2ZuuRcWDKDzThjBF3nVQOaVexLvUmNzxLjAv+l60+R6lmF5V0yyOUoqaLzKl9EMTalnuC3mCaaOuxBaSAoP7x/1r3J X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 19 Mar 2026 16:33:28.2883 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 251c5999-3586-4cdf-659a-08de85d54021 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=[satlexmb07.amd.com] X-MS-Exchange-CrossTenant-AuthSource: DS2PEPF000061C5.namprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: SJ2PR12MB7798 Content-Type: text/plain; charset="utf-8" Optimize the TX shutdown sequence when link goes down by skipping futile hardware wait operations and immediately stopping TX queues. Current behavior creates delays and resource issues during link-down: 1. xgbe_txq_prepare_tx_stop() waits up to XGBE_DMA_STOP_TIMEOUT for TX queues to drain, but when link is down, hardware will never complete the pending descriptors. This causes unnecessary delays during interface shutdown. 2. TX queues remain active after link-down, allowing the network stack to continue queuing packets that cannot be transmitted. This leads to resource buildup and complicates recovery. This patch adds two optimizations: Optimization 1: Skip TX queue drain when link is down In xgbe_txq_prepare_tx_stop(), detect link-down state and return immediately instead of waiting for hardware. Abandoned descriptors will be cleaned up by the force-cleanup mechanism (next patch). Optimization 2: Immediate TX queue stop on link-down In xgbe_phy_adjust_link(), call netif_tx_stop_all_queues() as soon as link-down is detected. Also wake TX queues on link-up to resume transmission. Benefits: - Faster interface shutdown (no pointless timeout waits) - Prevents packet queue buildup in network stack - Cleaner state management during link transitions - Enables orderly descriptor cleanup by NAPI poll Note: We do not call netdev_tx_reset_queue() on link-down because NAPI poll may still be running, which would trigger BQL assertions. BQL state is cleaned up naturally during descriptor reclamation. Signed-off-by: Raju Rangoju --- drivers/net/ethernet/amd/xgbe/xgbe-dev.c | 9 +++++++++ drivers/net/ethernet/amd/xgbe/xgbe-mdio.c | 18 ++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-dev.c b/drivers/net/etherne= t/amd/xgbe/xgbe-dev.c index f1357619097e..b7bf74c6bb47 100644 --- a/drivers/net/ethernet/amd/xgbe/xgbe-dev.c +++ b/drivers/net/ethernet/amd/xgbe/xgbe-dev.c @@ -3186,7 +3186,16 @@ static void xgbe_txq_prepare_tx_stop(struct xgbe_prv= _data *pdata, /* The Tx engine cannot be stopped if it is actively processing * packets. Wait for the Tx queue to empty the Tx fifo. Don't * wait forever though... + * + * Optimization: Skip the wait when link is down. Hardware won't + * complete TX processing, so waiting serves no purpose and only + * delays interface shutdown. Descriptors will be reclaimed via + * the force-cleanup path in tx_poll. */ + + if (!pdata->phy.link) + return; + tx_timeout =3D jiffies + (XGBE_DMA_STOP_TIMEOUT * HZ); while (time_before(jiffies, tx_timeout)) { tx_status =3D XGMAC_MTL_IOREAD(pdata, queue, MTL_Q_TQDR); diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c b/drivers/net/ethern= et/amd/xgbe/xgbe-mdio.c index 7675bb98f029..fa0df6181207 100644 --- a/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c +++ b/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c @@ -1047,11 +1047,29 @@ static void xgbe_phy_adjust_link(struct xgbe_prv_da= ta *pdata) if (pdata->phy_link !=3D pdata->phy.link) { new_state =3D 1; pdata->phy_link =3D pdata->phy.link; + + /* Link is coming up - wake TX queues */ + netif_tx_wake_all_queues(pdata->netdev); } } else if (pdata->phy_link) { new_state =3D 1; pdata->phy_link =3D 0; pdata->phy_speed =3D SPEED_UNKNOWN; + + /* Proactive TX queue management on link-down. + * + * Immediately stop TX queues to enable clean link-down + * handling: + * - Prevents queueing packets that can't be transmitted + * - Allows orderly descriptor cleanup by NAPI poll + * - Enables rapid failover in link aggregation configurations + * + * Note: We do NOT call netdev_tx_reset_queue() here because + * NAPI poll may still be running and would trigger BQL + * assertion. BQL state is cleaned up naturally during + * descriptor reclamation. + */ + netif_tx_stop_all_queues(pdata->netdev); } =20 if (new_state && netif_msg_link(pdata)) --=20 2.34.1 From nobody Mon Apr 6 10:31:28 2026 Received: from BN8PR05CU002.outbound.protection.outlook.com (mail-eastus2azon11011042.outbound.protection.outlook.com [52.101.57.42]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 25FAF3ED13F; Thu, 19 Mar 2026 16:33:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.57.42 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773938030; cv=fail; b=N8W1qWxcdj10tP6VyXJ6QAUy6VAVeaFln27ROXesOIkoErXgMw9GXJq2et7Hj0I/pHs+zlkUGXYSl4plQt9BobV8SB5YSg0/fq2LXCbIEMsv6xvtU3G0tezmJ2NLrVEk+TA88RCI6i+EnTWnpuxetC/DUmK9jLDu+g7/YCTZ5QA= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773938030; c=relaxed/simple; bh=eCUxtM5FqvzQDqmro94RyRcsJOYAr+LNrUVPBX4/2Ds=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=bQk1fJvgBMZZOgy9eenqZjnD098AccL6/7ACopGUtUYWdJOJECcurMUhkz2zCb3EOZQqgneLRRiFfxZl1PH+IMzyL+GsB6JZuA6VuHkPMP9mC/ogmoExEmtI6y8zV5rGf696rPm+LpDG2O5qqBwewjbqN0QVumSZXo845Hbbkhk= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com; spf=fail smtp.mailfrom=amd.com; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b=tRz86PEB; arc=fail smtp.client-ip=52.101.57.42 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=amd.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b="tRz86PEB" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=s48czP0db0q6iLw2WsEA9s7Qc1U7bEOs3lNp/G8Q0VCnmu04La/UPClLgS382X7Tz04qUNPdoH9I9cYNlOQRki4sM7uYzPf1x+5+uvMN83nM8psTQvKfW1dymBUzTipvKi6xCRmmwPYU4wCdc/um0wEScsZ1+1Qtydo5Bo3uX2yA4kQAph1AVltXmOQ726+HTEatdoQveZb6uirKbMhf0v7MhSGi/6UGCX8Z7aTiiME48PPe3HdsKd1qaP86vXgrxJ6ky1HgG03z99DUU7qtXf5GTWhc6J9gX8StubCiU+cv81KjvYZqC9S7g3hkuF1b5boD9ukC2c1DSVom3tnWAA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; 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=lPA7GXa1M8456vwl6JOknyjUmuPRoj7F1evgbsbQHOQ=; b=r3sWt9f5dB4mnyFhHcOS5Chim70C3LvR3Il01aWSUvaA8DHY2TujvpIdZw0QLVcAq1BkwcSFxnJfUEcmWdRkzjQVeXF7qNU4lcw03UMEOQvoRW7U4vhaZqI7G4rKWYTefELM8iz99cWWp6pTVnUPaUmwIexzsVzSdwcuBXuA4yKQ6ETJTKZBTCk/JPmyExuk14ZxM56C5ZN1vT4QeJT6CTPoI0O1Bdn5Yi8f00fEc/sKgdZAAFZ4Whbcp2QRUatzeT9yctqPf69Mv219OY5TqxXU7yzTm8LUUxKkB1vKBSTgp+ENdHUF+bLqs52ibbeWsp4ZOnKcxe/mggBmt5RIzg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=temperror (sender ip is 165.204.84.17) smtp.rcpttodomain=vger.kernel.org smtp.mailfrom=amd.com; dmarc=temperror 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=lPA7GXa1M8456vwl6JOknyjUmuPRoj7F1evgbsbQHOQ=; b=tRz86PEBzjerpPbIen1Dc9OedVGL+pM/NItLuuIgDYf3SkJdnG3cK2xiVveQKeACL3Nnls7DQvrBlLptwHJQwki7jGavUYiJbaxkH7WZhAhsvyLSbuYy7TcetHRs+hSj7+gYlMRYkaSA6QpMbqYYSyexPwZLjNNFgrSn+K8gveM= Received: from DM6PR08CA0013.namprd08.prod.outlook.com (2603:10b6:5:80::26) by SA1PR12MB9469.namprd12.prod.outlook.com (2603:10b6:806:45a::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9723.16; Thu, 19 Mar 2026 16:33:37 +0000 Received: from DS2PEPF000061C6.namprd02.prod.outlook.com (2603:10b6:5:80:cafe::ec) by DM6PR08CA0013.outlook.office365.com (2603:10b6:5:80::26) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9700.30 via Frontend Transport; Thu, 19 Mar 2026 16:33:37 +0000 X-MS-Exchange-Authentication-Results: spf=temperror (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=temperror action=none header.from=amd.com; Received-SPF: TempError (protection.outlook.com: error in processing during lookup of amd.com: DNS Timeout) Received: from satlexmb07.amd.com (165.204.84.17) by DS2PEPF000061C6.mail.protection.outlook.com (10.167.23.73) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9723.19 via Frontend Transport; Thu, 19 Mar 2026 16:33:36 +0000 Received: from airavat.amd.com (10.180.168.240) by satlexmb07.amd.com (10.181.42.216) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.17; Thu, 19 Mar 2026 11:33:33 -0500 From: Raju Rangoju To: CC: , , , , , , "Raju Rangoju" Subject: [PATCH v3 net-next 3/3] amd-xgbe: add TX descriptor cleanup for link-down Date: Thu, 19 Mar 2026 22:02:51 +0530 Message-ID: <20260319163251.1808611-4-Raju.Rangoju@amd.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260319163251.1808611-1-Raju.Rangoju@amd.com> References: <20260319163251.1808611-1-Raju.Rangoju@amd.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: satlexmb07.amd.com (10.181.42.216) To satlexmb07.amd.com (10.181.42.216) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DS2PEPF000061C6:EE_|SA1PR12MB9469:EE_ X-MS-Office365-Filtering-Correlation-Id: 4a1447bb-e6a7-4d6e-fd74-08de85d544bc X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|36860700016|82310400026|1800799024|22082099003|18002099003|56012099003; X-Microsoft-Antispam-Message-Info: +rpNIyjUuWMYyt8yQJjt7C/nkSkU+wgRcwsw0/zPmQ1w1GQKijrGYxHAA2FfNriItJBNqF4g0TSXULxy4g2VLWPbByoXQfHIaXLR+M49ipv2Wa+DMYNaC3Bh7EY3rlD/vnZx9QE+sYc1M2HNkeFNawhbRUr6DaXJnVLlSDHjFiSr9VS+PzzXfAjUJIRRQMs0UIkIW9hpZpOCDey1Ic979Wx4yTCX9s2+v4yeV3JPe+/XT+cGUDt7ycLyst04sazZ+szXSLv9GzUbTmA7GU+an9TKSMARziPqx/8TzAEvjEkmTDQKtuUwNXGB4g+9m+UfwQAfOLR66KbXZnX9hN3kPRMqLuIlS/sqkas89XlFbwWg5AJoz/EP1RNB1awaB0ADpg4sixGux//CQznrYnz7bbzftcSioDggWzDzBE+B6w9Qn8OdegOug+W+RVly4//VPPhxKhz2kmg2s6McBFZZpvd8IXFm0InyRhbh5iSxn+L4/ApN9YqK4f8xUnn/8CNRFrZBaNeJF7u0Ed4W9Ksy1FRBfPa9ckV0RaGWkh7f8UjMbId//wREgpFjGuM/UsK7ifoQIvXyi5YVxDoHG0o3sPp/wl+yENJ3zLQW9vAz6sOD6dVqzkcLaoLASFRA0I7l/zwzXNtpsH7LbugN82ALooUEuv7QHYRFaujC0pcROwVZw2OFZLsJ4384HhkEhqTA51h8h+tNIrh6rlTM+5uvWOoQCDaWSoYl11K3nJlKJyPOjkFC/YGOZNgrCvIFgywkl38m1ARhTT7fwe05IxLyPA== X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:satlexmb07.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(376014)(36860700016)(82310400026)(1800799024)(22082099003)(18002099003)(56012099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: iiIHsjfi6i7ctwOuiNFAWD4kWq5TJXkZodYVZy6pyLqG8n+ucCrV1xPd/Q9rFa6Z0wfnjHAJyHOx2ur6aV+f/f3Vjzqhbdk1ojr6XcKtFCA+1Z5dana+NqErm8wW9O3c3UgLMEKvK9ePOAhSFppr2mrIvIA6U/sWCP8smVpAAz50E4kWOnW6g7cxpi70TM1ePps8hHIXAG31nasdMROa5pTqvgJbn8gxYZiDp3g7V/t80oqvHQsNVBK3VuLWHs6e9LM9Tq8u0oq7AfB7qdtQl1vxbv0rFHgf2oyN9vT3UfYKP7GHxcIGfBqtKrbfazKylEvBqV3yIS/K0STyIHFNBEXB+EGVKOyarj/ENMV5IriuXpYjtFcHXFC8JTDvt6xu51kQrc2VDJpOu4MwzAGq9zMi59s4wU+9jT0JLYrLZYn2+cR0/iCQ0yX0vwyjaVAs X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 19 Mar 2026 16:33:36.0225 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 4a1447bb-e6a7-4d6e-fd74-08de85d544bc 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=[satlexmb07.amd.com] X-MS-Exchange-CrossTenant-AuthSource: DS2PEPF000061C6.namprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: SA1PR12MB9469 Content-Type: text/plain; charset="utf-8" Add intelligent TX descriptor cleanup mechanism to reclaim abandoned descriptors when the physical link goes down. When the link goes down while TX packets are in-flight, the hardware stops processing descriptors with the OWN bit still set. The current driver waits indefinitely for these descriptors to complete, which never happens. This causes: - TX ring exhaustion (no descriptors available for new packets) - Memory leaks (skbs never freed) - DMA mapping leaks (mappings never unmapped) - Network stack backpressure buildup Add force-cleanup mechanism in xgbe_tx_poll() that detects link-down state and reclaims abandoned descriptors. The helper functions and DMA optimizations support efficient TX shutdown: - xgbe_wait_for_dma_tx_complete(): Wait for DMA completion with link-down optimization - Restructure xgbe_disable_tx() for proper shutdown sequence Implementation: 1. Check link state at the start of tx_poll 2. If link is down, set force_cleanup flag 3. For descriptors that hardware hasn't completed (!tx_complete): - If force_cleanup: treat as completed and reclaim resources - If link up: break and wait for hardware (normal behavior) The cleanup process: - Frees skbs that will never be transmitted - Unmaps DMA mappings - Resets descriptors for reuse - Does NOT count as successful transmission (correct statistics) Benefits: - Prevents TX ring starvation - Eliminates memory and DMA mapping leaks - Enables fast link recovery when link comes back up - Critical for link aggregation failover scenarios Signed-off-by: Raju Rangoju --- Changes since v2: - remove the stale function xgbe_reset_tx_queues(), otherwise it would result in undefined symbol during linking. drivers/net/ethernet/amd/xgbe/xgbe-common.h | 4 ++ drivers/net/ethernet/amd/xgbe/xgbe-dev.c | 77 ++++++++++++++++++--- drivers/net/ethernet/amd/xgbe/xgbe-drv.c | 43 ++++++++++-- 3 files changed, 108 insertions(+), 16 deletions(-) diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-common.h b/drivers/net/ethe= rnet/amd/xgbe/xgbe-common.h index c17900a49595..66807d67e984 100644 --- a/drivers/net/ethernet/amd/xgbe/xgbe-common.h +++ b/drivers/net/ethernet/amd/xgbe/xgbe-common.h @@ -330,6 +330,10 @@ #define MAC_ISR_SMI_WIDTH 1 #define MAC_ISR_TSIS_INDEX 12 #define MAC_ISR_TSIS_WIDTH 1 +#define MAC_ISR_LS_INDEX 24 +#define MAC_ISR_LS_WIDTH 2 +#define MAC_ISR_LSI_INDEX 0 +#define MAC_ISR_LSI_WIDTH 1 #define MAC_MACA1HR_AE_INDEX 31 #define MAC_MACA1HR_AE_WIDTH 1 #define MAC_MDIOIER_SNGLCOMPIE_INDEX 12 diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-dev.c b/drivers/net/etherne= t/amd/xgbe/xgbe-dev.c index b7bf74c6bb47..2de974213090 100644 --- a/drivers/net/ethernet/amd/xgbe/xgbe-dev.c +++ b/drivers/net/ethernet/amd/xgbe/xgbe-dev.c @@ -3276,28 +3276,83 @@ static void xgbe_enable_tx(struct xgbe_prv_data *pd= ata) XGMAC_IOWRITE_BITS(pdata, MAC_TCR, TE, 1); } =20 -static void xgbe_disable_tx(struct xgbe_prv_data *pdata) +/** + * xgbe_wait_for_dma_tx_complete - Wait for DMA to complete pending TX + * @pdata: driver private data + * + * Wait for the DMA TX channels to complete all pending descriptors. + * This ensures no frames are in-flight before we disable the transmitter. + * If link is down, return immediately as TX will never complete. + * + * Return: 0 on success, -ETIMEDOUT on timeout + */ +static int xgbe_wait_for_dma_tx_complete(struct xgbe_prv_data *pdata) { + struct xgbe_channel *channel; + struct xgbe_ring *ring; + unsigned long timeout; unsigned int i; + bool complete; =20 - /* Prepare for Tx DMA channel stop */ - for (i =3D 0; i < pdata->tx_q_count; i++) - xgbe_prepare_tx_stop(pdata, i); + /* If link is down, TX will never complete - skip waiting */ + if (!pdata->phy.link) + return 0; =20 - /* Disable MAC Tx */ - XGMAC_IOWRITE_BITS(pdata, MAC_TCR, TE, 0); + timeout =3D jiffies + (XGBE_DMA_STOP_TIMEOUT * HZ); =20 - /* Disable each Tx queue */ - for (i =3D 0; i < pdata->tx_q_count; i++) - XGMAC_MTL_IOWRITE_BITS(pdata, i, MTL_Q_TQOMR, TXQEN, 0); + do { + complete =3D true; =20 - /* Disable each Tx DMA channel */ + for (i =3D 0; i < pdata->channel_count; i++) { + channel =3D pdata->channel[i]; + ring =3D channel->tx_ring; + if (!ring) + continue; + + /* Check if DMA has processed all descriptors */ + if (ring->dirty !=3D ring->cur) { + complete =3D false; + break; + } + } + + if (complete) + return 0; + + usleep_range(100, 200); + } while (time_before(jiffies, timeout)); + + netif_warn(pdata, drv, pdata->netdev, + "timeout waiting for DMA TX to complete\n"); + return -ETIMEDOUT; +} + +static void xgbe_disable_tx(struct xgbe_prv_data *pdata) +{ + unsigned int i; + + /* Step 1: Wait for DMA to complete pending descriptors */ + xgbe_wait_for_dma_tx_complete(pdata); + + /* Step 2: Disable each Tx DMA channel to stop + * processing new descriptors + */ for (i =3D 0; i < pdata->channel_count; i++) { if (!pdata->channel[i]->tx_ring) break; - XGMAC_DMA_IOWRITE_BITS(pdata->channel[i], DMA_CH_TCR, ST, 0); } + + /* Step 3: Wait for MTL TX queues to drain */ + for (i =3D 0; i < pdata->tx_q_count; i++) + xgbe_prepare_tx_stop(pdata, i); + + /* Step 4: Disable MTL TX queues */ + for (i =3D 0; i < pdata->tx_q_count; i++) + XGMAC_MTL_IOWRITE_BITS(pdata, i, MTL_Q_TQOMR, TXQEN, 0); + + /* Step 5: Disable MAC TX last */ + XGMAC_IOWRITE_BITS(pdata, MAC_TCR, TE, 0); } =20 static void xgbe_prepare_rx_stop(struct xgbe_prv_data *pdata, diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-drv.c b/drivers/net/etherne= t/amd/xgbe/xgbe-drv.c index 6886d3b33ffe..2d6d00e3689b 100644 --- a/drivers/net/ethernet/amd/xgbe/xgbe-drv.c +++ b/drivers/net/ethernet/amd/xgbe/xgbe-drv.c @@ -2169,6 +2169,7 @@ static int xgbe_tx_poll(struct xgbe_channel *channel) struct net_device *netdev =3D pdata->netdev; struct netdev_queue *txq; int processed =3D 0; + int force_cleanup; unsigned int tx_packets =3D 0, tx_bytes =3D 0; unsigned int cur; =20 @@ -2185,13 +2186,41 @@ static int xgbe_tx_poll(struct xgbe_channel *channe= l) =20 txq =3D netdev_get_tx_queue(netdev, channel->queue_index); =20 + /* Smart descriptor cleanup during link-down conditions. + * + * When link is down, hardware stops processing TX descriptors (OWN bit + * remains set). Enable intelligent cleanup to reclaim these abandoned + * descriptors and maintain TX queue health. + * + * This cleanup mechanism enables: + * - Continuous TX queue availability for new packets when link recovers + * - Clean resource management (skbs, DMA mappings, descriptors) + * - Fast failover in link aggregation scenarios + */ + force_cleanup =3D !pdata->phy.link; + while ((processed < XGBE_TX_DESC_MAX_PROC) && (ring->dirty !=3D cur)) { rdata =3D XGBE_GET_DESC_DATA(ring, ring->dirty); rdesc =3D rdata->rdesc; =20 - if (!hw_if->tx_complete(rdesc)) - break; + if (!hw_if->tx_complete(rdesc)) { + if (!force_cleanup) + break; + /* Link-down descriptor cleanup: reclaim abandoned + * resources. + * + * Hardware has stopped processing this descriptor, so + * perform intelligent cleanup to free skbs and reclaim + * descriptors for future use when link recovers. + * + * These are not counted as successful transmissions + * since packets never reached the wire. + */ + netif_dbg(pdata, tx_err, netdev, + "force-freeing stuck TX desc %u (link down)\n", + ring->dirty); + } =20 /* Make sure descriptor fields are read after reading the OWN * bit */ @@ -2200,9 +2229,13 @@ static int xgbe_tx_poll(struct xgbe_channel *channel) if (netif_msg_tx_done(pdata)) xgbe_dump_tx_desc(pdata, ring, ring->dirty, 1, 0); =20 - if (hw_if->is_last_desc(rdesc)) { - tx_packets +=3D rdata->tx.packets; - tx_bytes +=3D rdata->tx.bytes; + /* Only count packets actually transmitted (not force-cleaned) + */ + if (!force_cleanup || hw_if->is_last_desc(rdesc)) { + if (hw_if->is_last_desc(rdesc)) { + tx_packets +=3D rdata->tx.packets; + tx_bytes +=3D rdata->tx.bytes; + } } =20 /* Free the SKB and reset the descriptor for re-use */ --=20 2.34.1