From d25418285dc822747171de8ca78e59019a18535d Mon Sep 17 00:00:00 2001 From: Revanth Kumar Uppala Date: Tue, 4 Nov 2025 04:36:44 +0000 Subject: [PATCH] r8126: Fix system crash during shutdown During system shutdown, a kernel crash could occur because the r8126 driver's tally counter update routine (`rtl8126_dump_tally_counter`) was still accessing PCIe address space after the device was already stopped or powered down. To prevent this, introduce a new driver flag `R8126_FLAG_SHUTDOWN` that is set in `rtl8126_shutdown()`. This flag is checked now before accessing tally counters, ensuring no further crash during shutdown. Bug 5620576 Change-Id: I2bb74fc52e712198bfe15b109a2136dc8a2affcd Signed-off-by: Revanth Kumar Uppala Reviewed-on: https://git-master.nvidia.com/r/c/linux-nv-oot/+/3482325 Reviewed-by: Ashutosh Jha GVS: buildbot_gerritrpt Reviewed-by: Ninad Malwade Tested-by: Ninad Malwade Reviewed-by: Shobek Attupurath --- drivers/net/ethernet/realtek/r8126/r8126.h | 1 + drivers/net/ethernet/realtek/r8126/r8126_n.c | 6 ++++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/drivers/net/ethernet/realtek/r8126/r8126.h b/drivers/net/ethernet/realtek/r8126/r8126.h index ef028d11..ab72470a 100644 --- a/drivers/net/ethernet/realtek/r8126/r8126.h +++ b/drivers/net/ethernet/realtek/r8126/r8126.h @@ -2198,6 +2198,7 @@ enum r8126_flag { R8126_FLAG_TASK_ESD_CHECK_PENDING, R8126_FLAG_TASK_LINKCHG_CHECK_PENDING, R8126_FLAG_TASK_LINK_CHECK_PENDING, + R8126_FLAG_SHUTDOWN, R8126_FLAG_MAX }; diff --git a/drivers/net/ethernet/realtek/r8126/r8126_n.c b/drivers/net/ethernet/realtek/r8126/r8126_n.c index 5458c468..079ac4da 100644 --- a/drivers/net/ethernet/realtek/r8126/r8126_n.c +++ b/drivers/net/ethernet/realtek/r8126/r8126_n.c @@ -6175,7 +6175,7 @@ rtl8126_get_ethtool_stats(struct net_device *dev, counters = tp->tally_vaddr; paddr = tp->tally_paddr; - if (!counters) + if (!counters || test_bit(R8126_FLAG_SHUTDOWN, tp->task_flags)) return; rtl8126_dump_tally_counter(tp, paddr); @@ -12686,7 +12686,7 @@ rtl8126_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats) struct rtl8126_counters *counters = tp->tally_vaddr; dma_addr_t paddr = tp->tally_paddr; - if (!counters) + if (!counters || test_bit(R8126_FLAG_SHUTDOWN, tp->task_flags)) return; netdev_stats_to_stats64(stats, &dev->stats); @@ -16379,6 +16379,8 @@ static void rtl8126_shutdown(struct pci_dev *pdev) rtnl_lock(); + set_bit(R8126_FLAG_SHUTDOWN, tp->task_flags); + rtl8126_disable_pci_offset_180(tp); if (s5_keep_curr_mac == 0 && tp->random_mac == 0)