aboutsummaryrefslogtreecommitdiff
path: root/drivers/net/ethernet/realtek
diff options
context:
space:
mode:
authorGravatar Heiner Kallweit <hkallweit1@gmail.com> 2023-01-13 23:46:19 +0100
committerGravatar David S. Miller <davem@davemloft.net> 2023-01-16 13:38:28 +0000
commitce870af39558448dcfabef7114b9aa389f3f895a (patch)
tree408faa00d371d55ca3edcd8360735e9cb92d34f0 /drivers/net/ethernet/realtek
parentnet: dsa: mv88e6xxx: Enable PTP receive for mv88e6390 (diff)
downloadlinux-ce870af39558448dcfabef7114b9aa389f3f895a.tar.gz
linux-ce870af39558448dcfabef7114b9aa389f3f895a.tar.bz2
linux-ce870af39558448dcfabef7114b9aa389f3f895a.zip
r8169: reset bus if NIC isn't accessible after tx timeout
ASPM issues may result in the NIC not being accessible any longer. In this case disabling ASPM may not work. Therefore detect this case by checking whether register reads return ~0, and try to make the NIC accessible again by resetting the secondary bus. v2: - add exception handling for the case that pci_reset_bus() fails Suggested-by: Alexander Duyck <alexander.duyck@gmail.com> Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com> Reviewed-by: Alexander Duyck <alexanderduyck@fb.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/realtek')
-rw-r--r--drivers/net/ethernet/realtek/r8169_main.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/drivers/net/ethernet/realtek/r8169_main.c b/drivers/net/ethernet/realtek/r8169_main.c
index c7ddcb829535..45147a1016be 100644
--- a/drivers/net/ethernet/realtek/r8169_main.c
+++ b/drivers/net/ethernet/realtek/r8169_main.c
@@ -4532,6 +4532,16 @@ static void rtl_task(struct work_struct *work)
goto out_unlock;
if (test_and_clear_bit(RTL_FLAG_TASK_TX_TIMEOUT, tp->wk.flags)) {
+ /* if chip isn't accessible, reset bus to revive it */
+ if (RTL_R32(tp, TxConfig) == ~0) {
+ ret = pci_reset_bus(tp->pci_dev);
+ if (ret < 0) {
+ netdev_err(tp->dev, "Can't reset secondary PCI bus, detach NIC\n");
+ netif_device_detach(tp->dev);
+ goto out_unlock;
+ }
+ }
+
/* ASPM compatibility issues are a typical reason for tx timeouts */
ret = pci_disable_link_state(tp->pci_dev, PCIE_LINK_STATE_L1 |
PCIE_LINK_STATE_L0S);