All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH net-next v2] r8169: reset bus if NIC isn't accessible after tx timeout
@ 2023-01-13 22:46 Heiner Kallweit
  2023-01-14  0:24 ` Alexander Duyck
  2023-01-16 13:40 ` patchwork-bot+netdevbpf
  0 siblings, 2 replies; 3+ messages in thread
From: Heiner Kallweit @ 2023-01-13 22:46 UTC (permalink / raw)
  To: Jakub Kicinski, David Miller, Realtek linux nic maintainers,
	Eric Dumazet, Paolo Abeni, Alexander Duyck
  Cc: netdev

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>
---
 drivers/net/ethernet/realtek/r8169_main.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/drivers/net/ethernet/realtek/r8169_main.c b/drivers/net/ethernet/realtek/r8169_main.c
index 49c124d8e..02ef98a95 100644
--- a/drivers/net/ethernet/realtek/r8169_main.c
+++ b/drivers/net/ethernet/realtek/r8169_main.c
@@ -4535,6 +4535,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);
-- 
2.39.0


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH net-next v2] r8169: reset bus if NIC isn't accessible after tx timeout
  2023-01-13 22:46 [PATCH net-next v2] r8169: reset bus if NIC isn't accessible after tx timeout Heiner Kallweit
@ 2023-01-14  0:24 ` Alexander Duyck
  2023-01-16 13:40 ` patchwork-bot+netdevbpf
  1 sibling, 0 replies; 3+ messages in thread
From: Alexander Duyck @ 2023-01-14  0:24 UTC (permalink / raw)
  To: Heiner Kallweit
  Cc: Jakub Kicinski, David Miller, Realtek linux nic maintainers,
	Eric Dumazet, Paolo Abeni, netdev

On Fri, Jan 13, 2023 at 2:46 PM Heiner Kallweit <hkallweit1@gmail.com> wrote:
>
> 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>
> ---
>  drivers/net/ethernet/realtek/r8169_main.c | 10 ++++++++++
>  1 file changed, 10 insertions(+)
>
> diff --git a/drivers/net/ethernet/realtek/r8169_main.c b/drivers/net/ethernet/realtek/r8169_main.c
> index 49c124d8e..02ef98a95 100644
> --- a/drivers/net/ethernet/realtek/r8169_main.c
> +++ b/drivers/net/ethernet/realtek/r8169_main.c
> @@ -4535,6 +4535,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);

Looks good to me.

Reviewed-by: Alexander Duyck <alexanderduyck@fb.com>

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH net-next v2] r8169: reset bus if NIC isn't accessible after tx timeout
  2023-01-13 22:46 [PATCH net-next v2] r8169: reset bus if NIC isn't accessible after tx timeout Heiner Kallweit
  2023-01-14  0:24 ` Alexander Duyck
@ 2023-01-16 13:40 ` patchwork-bot+netdevbpf
  1 sibling, 0 replies; 3+ messages in thread
From: patchwork-bot+netdevbpf @ 2023-01-16 13:40 UTC (permalink / raw)
  To: Heiner Kallweit
  Cc: kuba, davem, nic_swsd, edumazet, pabeni, alexander.duyck, netdev

Hello:

This patch was applied to netdev/net-next.git (master)
by David S. Miller <davem@davemloft.net>:

On Fri, 13 Jan 2023 23:46:19 +0100 you wrote:
> 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
> 
> [...]

Here is the summary with links:
  - [net-next,v2] r8169: reset bus if NIC isn't accessible after tx timeout
    https://git.kernel.org/netdev/net-next/c/ce870af39558

You are awesome, thank you!
-- 
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html



^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2023-01-16 13:40 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-01-13 22:46 [PATCH net-next v2] r8169: reset bus if NIC isn't accessible after tx timeout Heiner Kallweit
2023-01-14  0:24 ` Alexander Duyck
2023-01-16 13:40 ` patchwork-bot+netdevbpf

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.