Commit d192181c authored by Heiner Kallweit's avatar Heiner Kallweit Committed by David S. Miller

r8169: add rtl_disable_exit_l1()

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: default avatarChun-Hao Lin <hau@realtek.com>
Signed-off-by: default avatarHeiner Kallweit <hkallweit1@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 73c105ad
...@@ -2667,10 +2667,7 @@ static void rtl_enable_exit_l1(struct rtl8169_private *tp) ...@@ -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: case RTL_GIGA_MAC_VER_37 ... RTL_GIGA_MAC_VER_38:
rtl_eri_set_bits(tp, 0xd4, 0x0c00); rtl_eri_set_bits(tp, 0xd4, 0x0c00);
break; break;
case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_53: case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_63:
rtl_eri_set_bits(tp, 0xd4, 0x1f80);
break;
case RTL_GIGA_MAC_VER_60 ... RTL_GIGA_MAC_VER_63:
r8168_mac_ocp_modify(tp, 0xc0ac, 0, 0x1f80); r8168_mac_ocp_modify(tp, 0xc0ac, 0, 0x1f80);
break; break;
default: default:
...@@ -2678,6 +2675,20 @@ static void rtl_enable_exit_l1(struct rtl8169_private *tp) ...@@ -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) 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 */ /* 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) ...@@ -4702,7 +4713,7 @@ static void rtl8169_down(struct rtl8169_private *tp)
rtl_pci_commit(tp); rtl_pci_commit(tp);
rtl8169_cleanup(tp, true); rtl8169_cleanup(tp, true);
rtl_disable_exit_l1(tp);
rtl_prepare_power_down(tp); rtl_prepare_power_down(tp);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment