mirror of
git://nv-tegra.nvidia.com/linux-nv-oot.git
synced 2025-12-22 17:25:35 +03:00
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:
committed by
mobile promotions
parent
e3f7b0f173
commit
d25418285d
@@ -2198,6 +2198,7 @@ enum r8126_flag {
|
|||||||
R8126_FLAG_TASK_ESD_CHECK_PENDING,
|
R8126_FLAG_TASK_ESD_CHECK_PENDING,
|
||||||
R8126_FLAG_TASK_LINKCHG_CHECK_PENDING,
|
R8126_FLAG_TASK_LINKCHG_CHECK_PENDING,
|
||||||
R8126_FLAG_TASK_LINK_CHECK_PENDING,
|
R8126_FLAG_TASK_LINK_CHECK_PENDING,
|
||||||
|
R8126_FLAG_SHUTDOWN,
|
||||||
R8126_FLAG_MAX
|
R8126_FLAG_MAX
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -6175,7 +6175,7 @@ rtl8126_get_ethtool_stats(struct net_device *dev,
|
|||||||
|
|
||||||
counters = tp->tally_vaddr;
|
counters = tp->tally_vaddr;
|
||||||
paddr = tp->tally_paddr;
|
paddr = tp->tally_paddr;
|
||||||
if (!counters)
|
if (!counters || test_bit(R8126_FLAG_SHUTDOWN, tp->task_flags))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
rtl8126_dump_tally_counter(tp, paddr);
|
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;
|
struct rtl8126_counters *counters = tp->tally_vaddr;
|
||||||
dma_addr_t paddr = tp->tally_paddr;
|
dma_addr_t paddr = tp->tally_paddr;
|
||||||
|
|
||||||
if (!counters)
|
if (!counters || test_bit(R8126_FLAG_SHUTDOWN, tp->task_flags))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
netdev_stats_to_stats64(stats, &dev->stats);
|
netdev_stats_to_stats64(stats, &dev->stats);
|
||||||
@@ -16379,6 +16379,8 @@ static void rtl8126_shutdown(struct pci_dev *pdev)
|
|||||||
|
|
||||||
rtnl_lock();
|
rtnl_lock();
|
||||||
|
|
||||||
|
set_bit(R8126_FLAG_SHUTDOWN, tp->task_flags);
|
||||||
|
|
||||||
rtl8126_disable_pci_offset_180(tp);
|
rtl8126_disable_pci_offset_180(tp);
|
||||||
|
|
||||||
if (s5_keep_curr_mac == 0 && tp->random_mac == 0)
|
if (s5_keep_curr_mac == 0 && tp->random_mac == 0)
|
||||||
|
|||||||
Reference in New Issue
Block a user