Thread (34 messages) 34 messages, 3 authors, 2020-10-01

Re: RTL8402 stops working after hibernate/resume

From: Heiner Kallweit <hkallweit1@gmail.com>
Date: 2020-09-24 19:37:53

On 24.09.2020 21:14, Petr Tesarik wrote:
On Wed, 23 Sep 2020 11:57:41 +0200
Heiner Kallweit [off-list ref] wrote:
quoted
On 03.09.2020 10:41, Petr Tesarik wrote:
quoted
Hi Heiner,

this issue was on the back-burner for some time, but I've got some
interesting news now.

On Sat, 18 Jul 2020 14:07:50 +0200
Heiner Kallweit [off-list ref] wrote:
  
quoted
[...]
Maybe the following gives us an idea:
Please do "ethtool -d <if>" after boot and after resume from suspend,
and check for differences.  
The register dump did not reveal anything of interest - the only
differences were in the physical addresses after a device reopen.

However, knowing that reloading the driver can fix the issue, I copied
the initialization sequence from init_one() to rtl8169_resume() and
gave it a try. That works!

Then I started removing the initialization calls one by one. This
exercise left me with a call to rtl_init_rxcfg(), which simply sets the
RxConfig register. In other words, these is the difference between
5.8.4 and my working version:
--- linux-orig/drivers/net/ethernet/realtek/r8169_main.c	2020-09-02 22:43:09.361951750 +0200
+++ linux/drivers/net/ethernet/realtek/r8169_main.c	2020-09-03 10:36:23.915803703 +0200
@@ -4925,6 +4925,9 @@
 
 	clk_prepare_enable(tp->clk);
 
+	if (tp->mac_version == RTL_GIGA_MAC_VER_37)
+		RTL_W32(tp, RxConfig, RX128_INT_EN | RX_DMA_BURST);
+
 	if (netif_running(tp->dev))
 		__rtl8169_resume(tp);
 
This is quite surprising, at least when the device is managed by
NetworkManager, because then it is closed on wakeup, and the open
method should call rtl_init_rxcfg() anyway. So, it might be a timing
issue, or incorrect order of register writes.
  
Thanks for the analysis. If you manually bring down and up the
interface, do you see the same issue?
I'm not quite sure what you mean, but if the interface is configured
(and NetworkManager is stopped), I can do 'ip link set eth0 down' and
then 'ip link set eth0 up', and the interface is fully functional.
quoted
What is the value of RxConfig when entering the resume function?
I added a dev_info() to rtl8169_resume(). First with NetworkManager
active (i.e. interface down on suspend):

[  525.956675] r8169 0000:03:00.2: RxConfig after resume: 0x0002400f

Then I re-tried with NetworkManager stopped (i.e. interface up on
suspend). Same result:

[  785.413887] r8169 0000:03:00.2: RxConfig after resume: 0x0002400f
Thanks for checking this. The value is not what I would have expected,
it may be a BIOS bug or HW issue with RTL8402. I'll slightly modify
your proposed patch and then let you re-test it.
I hope that's what you were asking for...

Petr T
Heiner
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help