| From foo@baz Tue Aug 21 07:23:34 CEST 2018 |
| From: Jian-Hong Pan <jian-hong@endlessm.com> |
| Date: Fri, 17 Aug 2018 13:07:35 +0800 |
| Subject: r8169: don't use MSI-X on RTL8106e |
| |
| From: Jian-Hong Pan <jian-hong@endlessm.com> |
| |
| [ Upstream commit 7bb05b85bc2d1a1b647b91424b2ed4a18e6ecd81 ] |
| |
| 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. |
| |
| [ 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: |
| |
| 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: <access denied> |
| Kernel driver in use: r8169 |
| Kernel modules: r8169 |
| |
| Falling back to MSI fixes the issue. |
| |
| Fixes: 6c6aa15fdea5 ("r8169: improve interrupt handling") |
| Signed-off-by: Jian-Hong Pan <jian-hong@endlessm.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/net/ethernet/realtek/r8169.c | 9 ++++++--- |
| 1 file changed, 6 insertions(+), 3 deletions(-) |
| |
| --- a/drivers/net/ethernet/realtek/r8169.c |
| +++ b/drivers/net/ethernet/realtek/r8169.c |
| @@ -8061,17 +8061,20 @@ static int rtl_alloc_irq(struct rtl8169_ |
| { |
| 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; |
| } |
| |