[RFC Patch] r8169: fix RTL8116af cant enter s0idle

From: javen

Date: Thu Apr 30 2026 - 02:17:15 EST


From: Javen Xu <javen_xu@xxxxxxxxxxxxxx>

RTL8116af is a multi function card, if system want to enter s0idle
state, all of the functions should enable aspm. As function 2 to 7 are
not exposed to pci system, we must set aspm by csi channel.
Email just for test.

Signed-off-by: Javen Xu <javen_xu@xxxxxxxxxxxxxx>
---
drivers/net/ethernet/realtek/r8169_main.c | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)

diff --git a/drivers/net/ethernet/realtek/r8169_main.c b/drivers/net/ethernet/realtek/r8169_main.c
index 1173a305735a..c0feb1929057 100644
--- a/drivers/net/ethernet/realtek/r8169_main.c
+++ b/drivers/net/ethernet/realtek/r8169_main.c
@@ -1200,6 +1200,24 @@ static void rtl8168_other_fun_dev_pci_setting(struct rtl8169_private *tp,
}
}

+static void
+rtl8168_set_dash_other_fun_dev_aspm_clkreq(struct rtl8169_private *tp,
+ u8 aspm_val,
+ u8 clkreq_en,
+ u8 multi_fun_sel_bit)
+{
+ u32 clearmask;
+ u32 setmask;
+
+ aspm_val &= (BIT(0) | BIT(1));
+ clearmask = (BIT(0) | BIT(1) | BIT(8));
+ setmask = aspm_val;
+ if (clkreq_en)
+ setmask |= BIT(8);
+
+ rtl8168_other_fun_dev_pci_setting(tp, 0x80, clearmask, setmask, multi_fun_sel_bit);
+}
+
static void rtl8168_set_dash_other_fun_dev_state_change(struct rtl8169_private *tp,
u8 dev_state,
u8 multi_fun_sel_bit)
@@ -3895,6 +3913,7 @@ static void rtl_hw_start_8117(struct rtl8169_private *tp)
r8168_mac_ocp_write(tp, 0xc094, 0x0000);
r8168_mac_ocp_write(tp, 0xc09e, 0x0000);

+ rtl8168_set_dash_other_fun_dev_aspm_clkreq(tp, 3, 1, 0xfc);
rtl8168_set_dash_other_fun_dev_state_change(tp, 3, 0xfc);
/* firmware is for MAC only */
r8169_apply_firmware(tp);
--
2.43.0