r8169: add rtl_disable_exit_l1()
authorHeiner Kallweit <hkallweit1@gmail.com>
Fri, 28 Jan 2022 20:41:42 +0000 (21:41 +0100)
committerDavid S. Miller <davem@davemloft.net>
Mon, 31 Jan 2022 11:32:20 +0000 (11:32 +0000)
Add rtl_disable_exit_l1() for ensuring that the chip doesn't
inadvertently exit ASPM L1 when being in a low-power mode.
The new function is called from rtl_prepare_power_down() which
has to be moved in the code to avoid a forward declaration.

According to Realtek OCP register 0xc0ac shadows ERI register 0xd4
on RTL8168 versions from RTL8168g. This allows to simplify the
code a little.

v2:
- call rtl_disable_exit_l1() also if DASH or WoL are enabled

Suggested-by: Chun-Hao Lin <hau@realtek.com>
Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/realtek/r8169_main.c

index 3c3d150..4c267b7 100644 (file)
@@ -2667,10 +2667,7 @@ static void rtl_enable_exit_l1(struct rtl8169_private *tp)
        case RTL_GIGA_MAC_VER_37 ... RTL_GIGA_MAC_VER_38:
                rtl_eri_set_bits(tp, 0xd4, 0x0c00);
                break;
-       case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_53:
-               rtl_eri_set_bits(tp, 0xd4, 0x1f80);
-               break;
-       case RTL_GIGA_MAC_VER_60 ... RTL_GIGA_MAC_VER_63:
+       case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_63:
                r8168_mac_ocp_modify(tp, 0xc0ac, 0, 0x1f80);
                break;
        default:
@@ -2678,6 +2675,20 @@ static void rtl_enable_exit_l1(struct rtl8169_private *tp)
        }
 }
 
+static void rtl_disable_exit_l1(struct rtl8169_private *tp)
+{
+       switch (tp->mac_version) {
+       case RTL_GIGA_MAC_VER_34 ... RTL_GIGA_MAC_VER_38:
+               rtl_eri_clear_bits(tp, 0xd4, 0x1f00);
+               break;
+       case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_63:
+               r8168_mac_ocp_modify(tp, 0xc0ac, 0x1f80, 0);
+               break;
+       default:
+               break;
+       }
+}
+
 static void rtl_hw_aspm_clkreq_enable(struct rtl8169_private *tp, bool enable)
 {
        /* Don't enable ASPM in the chip if OS can't control ASPM */
@@ -4702,7 +4713,7 @@ static void rtl8169_down(struct rtl8169_private *tp)
        rtl_pci_commit(tp);
 
        rtl8169_cleanup(tp, true);
-
+       rtl_disable_exit_l1(tp);
        rtl_prepare_power_down(tp);
 }