r8169: don’t use MSI before RTL8168d [Linux 4.19.66]

This Linux kernel change "r8169: don’t use MSI before RTL8168d" is included in the Linux 4.19.66 release. This change is authored by Heiner Kallweit <hkallweit1 [at] gmail.com> on Sat Jul 27 12:45:10 2019 +0200. The commit for this change in Linux stable tree is 473430e (patch) which is from upstream commit 003bd5b. The same Linux upstream change may have been applied to various maintained Linux releases and you can find all Linux releases containing changes from upstream 003bd5b.

r8169: don't use MSI before RTL8168d

[ Upstream commit 003bd5b4a7b4a94b501e3a1e2e7c9df6b2a94ed4 ]

It was reported that after resuming from suspend network fails with
error "do_IRQ: 3.38 No irq handler for vector", see [0]. Enabling WoL
can work around the issue, but the only actual fix is to disable MSI.
So let's mimic the behavior of the vendor driver and disable MSI on
all chip versions before RTL8168d.

[0] https://bugzilla.kernel.org/show_bug.cgi?id=204079

Fixes: 6c6aa15fdea5 ("r8169: improve interrupt handling")
Reported-by: Dušan Dragić <dragic.dusan@gmail.com>
Tested-by: Dušan Dragić <dragic.dusan@gmail.com>
Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

There are 9 lines of Linux source code added/deleted in this change. Code changes to Linux kernel are as follows.

 drivers/net/ethernet/realtek/r8169.c | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c
index a6992c4..0c8b714 100644
--- a/drivers/net/ethernet/realtek/r8169.c
+++ b/drivers/net/ethernet/realtek/r8169.c
@@ -7239,13 +7239,18 @@ 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_02 ... 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);
+       /* fall through */
+   case RTL_GIGA_MAC_VER_07 ... RTL_GIGA_MAC_VER_24:
        flags = PCI_IRQ_LEGACY;
-   } else {
+       break;
+   default:
        flags = PCI_IRQ_ALL_TYPES;
+       break;
    }

    return pci_alloc_irq_vectors(tp->pci_dev, 1, 1, flags);

Leave a Reply

Your email address will not be published. Required fields are marked *