Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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: Chun-Hao Lin <hau@realtek.com>
Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Heiner Kallweit and committed by
David S. Miller
d192181c 73c105ad

+16 -5
+16 -5
drivers/net/ethernet/realtek/r8169_main.c
··· 2667 2667 case RTL_GIGA_MAC_VER_37 ... RTL_GIGA_MAC_VER_38: 2668 2668 rtl_eri_set_bits(tp, 0xd4, 0x0c00); 2669 2669 break; 2670 - case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_53: 2671 - rtl_eri_set_bits(tp, 0xd4, 0x1f80); 2672 - break; 2673 - case RTL_GIGA_MAC_VER_60 ... RTL_GIGA_MAC_VER_63: 2670 + case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_63: 2674 2671 r8168_mac_ocp_modify(tp, 0xc0ac, 0, 0x1f80); 2672 + break; 2673 + default: 2674 + break; 2675 + } 2676 + } 2677 + 2678 + static void rtl_disable_exit_l1(struct rtl8169_private *tp) 2679 + { 2680 + switch (tp->mac_version) { 2681 + case RTL_GIGA_MAC_VER_34 ... RTL_GIGA_MAC_VER_38: 2682 + rtl_eri_clear_bits(tp, 0xd4, 0x1f00); 2683 + break; 2684 + case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_63: 2685 + r8168_mac_ocp_modify(tp, 0xc0ac, 0x1f80, 0); 2675 2686 break; 2676 2687 default: 2677 2688 break; ··· 4713 4702 rtl_pci_commit(tp); 4714 4703 4715 4704 rtl8169_cleanup(tp, true); 4716 - 4705 + rtl_disable_exit_l1(tp); 4717 4706 rtl_prepare_power_down(tp); 4718 4707 } 4719 4708