On 16.08.2018 20:59, Heiner Kallweit wrote: >> From: Jian-Hong Pan <jian-h...@endlessm.com> >> >> Found the ethernet network on ASUS X441UAR doesn't come back on resume >> from suspend when using MSI-X. The chip is RTL8106e - version 39. >> > The patch itself looks good, just the commit message is wrong in one > place and a little bit long. > Patch should also be annotated "net", and it misses a "Fixes" tag.
>> asus@endless:~$ dmesg | grep r8169 >> [ 21.848357] libphy: r8169: probed >> [ 21.848473] r8169 0000:02:00.0 eth0: RTL8106e, 0c:9d:92:32:67:b4, XID >> 44900000, IRQ 127 >> [ 22.518860] r8169 0000:02:00.0 enp2s0: renamed from eth0 >> [ 29.458041] Generic PHY r8169-200:00: attached PHY driver [Generic >> PHY] (mii_bus:phy_addr=r8169-200:00, irq=IGNORE) >> [ 63.227398] r8169 0000:02:00.0 enp2s0: Link is Up - 100Mbps/Full - >> flow control off >> [ 124.514648] Generic PHY r8169-200:00: attached PHY driver [Generic >> PHY] (mii_bus:phy_addr=r8169-200:00, irq=IGNORE) >> >> Here is the ethernet controller in detail: >> >> asus@endless:~$ sudo lspci -nnvs 02:00.0 >> [sudo] password for asus: >> 02:00.0 Ethernet controller [0200]: Realtek Semiconductor Co., Ltd. >> RTL8101/2/6E PCI Express Fast/Gigabit Ethernet controller [10ec:8136] >> (rev 07) >> Subsystem: ASUSTeK Computer Inc. RTL810xE PCI Express Fast >> Ethernet controller [1043:200f] >> Flags: bus master, fast devsel, latency 0, IRQ 16 >> I/O ports at e000 [size=256] >> Memory at ef100000 (64-bit, non-prefetchable) [size=4K] >> Memory at e0000000 (64-bit, prefetchable) [size=16K] >> Capabilities: [40] Power Management version 3 >> Capabilities: [50] MSI: Enable- Count=1/1 Maskable- 64bit+ >> Capabilities: [70] Express Endpoint, MSI 01 >> Capabilities: [b0] MSI-X: Enable+ Count=4 Masked- >> Capabilities: [d0] Vital Product Data >> Capabilities: [100] Advanced Error Reporting >> Capabilities: [140] Virtual Channel >> Capabilities: [160] Device Serial Number 01-00-00-00-36-4c-e0-00 >> Capabilities: [170] Latency Tolerance Reporting >> Kernel driver in use: r8169 >> Kernel modules: r8169 >> >> Here is the system interrupt table: >> >> asus@endless:~$ cat /proc/interrupts >> CPU0 CPU1 CPU2 CPU3 >> 0: 22 0 0 0 IO-APIC 2-edge >> timer >> 1: 157 42 0 0 IO-APIC 1-edge >> i8042 >> 8: 0 0 1 0 IO-APIC 8-edge >> rtc0 >> 9: 10 13 0 0 IO-APIC 9-fasteoi >> acpi >> 16: 0 0 0 0 IO-APIC 16-fasteoi >> i2c_designware.0, i801_smbus >> 17: 2445 0 3453 0 IO-APIC 17-fasteoi >> i2c_designware.1, rtl_pci >> 109: 2 0 0 1 IO-APIC 109-fasteoi >> FTE1200:00 >> 120: 0 0 0 0 PCI-MSI 458752-edge >> PCIe PME >> 121: 0 0 0 0 PCI-MSI 466944-edge >> PCIe PME >> 122: 0 0 0 0 PCI-MSI 468992-edge >> PCIe PME >> 123: 1465 0 0 21263 PCI-MSI 376832-edge >> ahci[0000:00:17.0] >> 124: 0 530 0 0 PCI-MSI 327680-edge >> xhci_hcd >> 125: 5204 0 0 0 PCI-MSI 32768-edge >> i915 >> 126: 0 0 149 0 PCI-MSI 514048-edge >> snd_hda_intel:card0 >> 127: 0 0 337 0 PCI-MSI 1048576-edge >> enp2s0 >> NMI: 0 0 0 0 Non-maskable >> interrupts >> LOC: 45049 39474 38978 46677 Local timer >> interrupts >> SPU: 0 0 0 0 Spurious interrupts >> PMI: 0 0 0 0 Performance >> monitoring interrupts >> IWI: 619 8 0 1 IRQ work interrupts >> RTR: 6 0 0 0 APIC ICR read >> retries >> RES: 4918 4436 3835 2943 Rescheduling >> interrupts >> CAL: 1399 1478 1598 1465 Function call >> interrupts >> TLB: 608 513 723 559 TLB shootdowns >> TRM: 0 0 0 0 Thermal event >> interrupts >> THR: 0 0 0 0 Threshold APIC >> interrupts >> DFR: 0 0 0 0 Deferred Error APIC >> interrupts >> MCE: 0 0 0 0 Machine check >> exceptions >> MCP: 3 4 4 4 Machine check polls >> ERR: 0 >> MIS: 0 >> PIN: 0 0 0 0 Posted-interrupt >> notification event >> NPI: 0 0 0 0 Nested >> posted-interrupt event >> PIW: 0 0 0 0 Posted-interrupt >> wakeup event >> >> It is the IRQ 127 - PCI-MSI used by enp2s0. However, lspci lists MSI is >> disabled and MSI-X is enabled which conflicts to the interrupt table. >> > Both types of interrupts, MSI and MSI-X, are listed with irq chip name > "PCI-MSI", because MSI-X is treated as a sub-feature of MSI. > Therefore the output of /proc/interrupts doesn't allow to tell whether > a MSI or MSI-X interrupt is used, and as a consequence there is no such > conflict. > Indeed only lspci provides the information whether MSI or MSI-X is used. > >> Falling back to MSI fixes the issue. >> >> Here is the test result with this patch in dmesg: >> >> asus@endless:~$ dmesg | grep r8169 >> [ 22.017477] libphy: r8169: probed >> [ 22.017735] r8169 0000:02:00.0 eth0: RTL8106e, 0c:9d:92:32:67:b4, XID >> 44900000, IRQ 127 >> [ 22.041489] r8169 0000:02:00.0 enp2s0: renamed from eth0 >> [ 29.138312] Generic PHY r8169-200:00: attached PHY driver [Generic >> PHY] (mii_bus:phy_addr=r8169-200:00, irq=IGNORE) >> [ 30.927359] r8169 0000:02:00.0 enp2s0: Link is Up - 100Mbps/Full - >> flow control off >> [ 289.998077] r8169 0000:02:00.0 enp2s0: Link is Up - 100Mbps/Full - >> flow control off >> [ 290.508084] Generic PHY r8169-200:00: attached PHY driver [Generic >> PHY] (mii_bus:phy_addr=r8169-200:00, irq=IGNORE) >> [ 290.745690] r8169 0000:02:00.0 enp2s0: Link is Down >> [ 292.367717] r8169 0000:02:00.0 enp2s0: Link is Up - 100Mbps/Full - >> flow control off >> >> lspci lists MSI is enabled and MSI-X is disabled with this patch: >> >> asus@endless:~/linux-net$ sudo lspci -nnvs 02:00.0 >> [sudo] password for asus: >> 02:00.0 Ethernet controller [0200]: Realtek Semiconductor Co., Ltd. >> RTL8101/2/6E PCI Express Fast/Gigabit Ethernet controller [10ec:8136] >> (rev 07) >> Subsystem: ASUSTeK Computer Inc. RTL810xE PCI Express Fast >> Ethernet controller [1043:200f] >> Flags: bus master, fast devsel, latency 0, IRQ 127 >> I/O ports at e000 [size=256] >> Memory at ef100000 (64-bit, non-prefetchable) [size=4K] >> Memory at e0000000 (64-bit, prefetchable) [size=16K] >> Capabilities: [40] Power Management version 3 >> Capabilities: [50] MSI: Enable+ Count=1/1 Maskable- 64bit+ >> Capabilities: [70] Express Endpoint, MSI 01 >> Capabilities: [b0] MSI-X: Enable- Count=4 Masked- >> Capabilities: [d0] Vital Product Data >> Capabilities: [100] Advanced Error Reporting >> Capabilities: [140] Virtual Channel >> Capabilities: [160] Device Serial Number 01-00-00-00-36-4c-e0-00 >> Capabilities: [170] Latency Tolerance Reporting >> Kernel driver in use: r8169 >> Kernel modules: r8169 >> >> Signed-off-by: Jian-Hong Pan <jian-h...@endlessm.com> >> --- >> drivers/net/ethernet/realtek/r8169.c | 9 ++++++--- >> 1 file changed, 6 insertions(+), 3 deletions(-) >> >> diff --git a/drivers/net/ethernet/realtek/r8169.c >> b/drivers/net/ethernet/realtek/r8169.c >> index 0d9c3831838f..0efa977c422d 100644 >> --- a/drivers/net/ethernet/realtek/r8169.c >> +++ b/drivers/net/ethernet/realtek/r8169.c >> @@ -7071,17 +7071,20 @@ static int rtl_alloc_irq(struct rtl8169_private *tp) >> { >> unsigned int flags; >> >> - if (tp->mac_version <= RTL_GIGA_MAC_VER_06) { >> + switch (tp->mac_version) { >> + case RTL_GIGA_MAC_VER_01 ... RTL_GIGA_MAC_VER_06: >> RTL_W8(tp, Cfg9346, Cfg9346_Unlock); >> RTL_W8(tp, Config2, RTL_R8(tp, Config2) & ~MSIEnable); >> RTL_W8(tp, Cfg9346, Cfg9346_Lock); >> flags = PCI_IRQ_LEGACY; >> - } else if (tp->mac_version == RTL_GIGA_MAC_VER_40) { >> + break; >> + case RTL_GIGA_MAC_VER_39 ... RTL_GIGA_MAC_VER_40: >> /* This version was reported to have issues with resume >> * from suspend when using MSI-X >> */ >> flags = PCI_IRQ_LEGACY | PCI_IRQ_MSI; >> - } else { >> + break; >> + default: >> flags = PCI_IRQ_ALL_TYPES; >> } >> >> > >