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 <ruppala@nvidia.com>
Reviewed-on: https://git-master.nvidia.com/r/c/linux-nv-oot/+/3482325
Reviewed-by: Ashutosh Jha <ajha@nvidia.com>
GVS: buildbot_gerritrpt <buildbot_gerritrpt@nvidia.com>
Reviewed-by: Ninad Malwade <nmalwade@nvidia.com>
Tested-by: Ninad Malwade <nmalwade@nvidia.com>
Reviewed-by: Shobek Attupurath <sattupurath@nvidia.com>
This commit is contained in:
Revanth Kumar Uppala
2025-11-04 04:36:44 +00:00
committed by mobile promotions
parent e3f7b0f173
commit d25418285d
2 changed files with 5 additions and 2 deletions

View File

@@ -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
};

View File

@@ -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)