1814c2bfdSHeiner Kallweit // SPDX-License-Identifier: GPL-2.0-only
2814c2bfdSHeiner Kallweit /*
3814c2bfdSHeiner Kallweit  * r8169_phy_config.c: RealTek 8169/8168/8101 ethernet driver.
4814c2bfdSHeiner Kallweit  *
5814c2bfdSHeiner Kallweit  * Copyright (c) 2002 ShuChen <shuchen@realtek.com.tw>
6814c2bfdSHeiner Kallweit  * Copyright (c) 2003 - 2007 Francois Romieu <romieu@fr.zoreil.com>
7814c2bfdSHeiner Kallweit  * Copyright (c) a lot of people too. Please respect their work.
8814c2bfdSHeiner Kallweit  *
9814c2bfdSHeiner Kallweit  * See MAINTAINERS file for support contact information.
10814c2bfdSHeiner Kallweit  */
11814c2bfdSHeiner Kallweit 
12814c2bfdSHeiner Kallweit #include <linux/delay.h>
13814c2bfdSHeiner Kallweit #include <linux/phy.h>
14814c2bfdSHeiner Kallweit 
15814c2bfdSHeiner Kallweit #include "r8169.h"
16814c2bfdSHeiner Kallweit 
17814c2bfdSHeiner Kallweit typedef void (*rtl_phy_cfg_fct)(struct rtl8169_private *tp,
18814c2bfdSHeiner Kallweit 				struct phy_device *phydev);
19814c2bfdSHeiner Kallweit 
r8168d_modify_extpage(struct phy_device * phydev,int extpage,int reg,u16 mask,u16 val)20814c2bfdSHeiner Kallweit static void r8168d_modify_extpage(struct phy_device *phydev, int extpage,
21814c2bfdSHeiner Kallweit 				  int reg, u16 mask, u16 val)
22814c2bfdSHeiner Kallweit {
23814c2bfdSHeiner Kallweit 	int oldpage = phy_select_page(phydev, 0x0007);
24814c2bfdSHeiner Kallweit 
25814c2bfdSHeiner Kallweit 	__phy_write(phydev, 0x1e, extpage);
26814c2bfdSHeiner Kallweit 	__phy_modify(phydev, reg, mask, val);
27814c2bfdSHeiner Kallweit 
28814c2bfdSHeiner Kallweit 	phy_restore_page(phydev, oldpage, 0);
29814c2bfdSHeiner Kallweit }
30814c2bfdSHeiner Kallweit 
r8168d_phy_param(struct phy_device * phydev,u16 parm,u16 mask,u16 val)31814c2bfdSHeiner Kallweit static void r8168d_phy_param(struct phy_device *phydev, u16 parm,
32814c2bfdSHeiner Kallweit 			     u16 mask, u16 val)
33814c2bfdSHeiner Kallweit {
34814c2bfdSHeiner Kallweit 	int oldpage = phy_select_page(phydev, 0x0005);
35814c2bfdSHeiner Kallweit 
36814c2bfdSHeiner Kallweit 	__phy_write(phydev, 0x05, parm);
37814c2bfdSHeiner Kallweit 	__phy_modify(phydev, 0x06, mask, val);
38814c2bfdSHeiner Kallweit 
39814c2bfdSHeiner Kallweit 	phy_restore_page(phydev, oldpage, 0);
40814c2bfdSHeiner Kallweit }
41814c2bfdSHeiner Kallweit 
r8168g_phy_param(struct phy_device * phydev,u16 parm,u16 mask,u16 val)42814c2bfdSHeiner Kallweit static void r8168g_phy_param(struct phy_device *phydev, u16 parm,
43814c2bfdSHeiner Kallweit 			     u16 mask, u16 val)
44814c2bfdSHeiner Kallweit {
45814c2bfdSHeiner Kallweit 	int oldpage = phy_select_page(phydev, 0x0a43);
46814c2bfdSHeiner Kallweit 
47814c2bfdSHeiner Kallweit 	__phy_write(phydev, 0x13, parm);
48814c2bfdSHeiner Kallweit 	__phy_modify(phydev, 0x14, mask, val);
49814c2bfdSHeiner Kallweit 
50814c2bfdSHeiner Kallweit 	phy_restore_page(phydev, oldpage, 0);
51814c2bfdSHeiner Kallweit }
52814c2bfdSHeiner Kallweit 
53814c2bfdSHeiner Kallweit struct phy_reg {
54814c2bfdSHeiner Kallweit 	u16 reg;
55814c2bfdSHeiner Kallweit 	u16 val;
56814c2bfdSHeiner Kallweit };
57814c2bfdSHeiner Kallweit 
__rtl_writephy_batch(struct phy_device * phydev,const struct phy_reg * regs,int len)58814c2bfdSHeiner Kallweit static void __rtl_writephy_batch(struct phy_device *phydev,
59814c2bfdSHeiner Kallweit 				 const struct phy_reg *regs, int len)
60814c2bfdSHeiner Kallweit {
61814c2bfdSHeiner Kallweit 	phy_lock_mdio_bus(phydev);
62814c2bfdSHeiner Kallweit 
63814c2bfdSHeiner Kallweit 	while (len-- > 0) {
64814c2bfdSHeiner Kallweit 		__phy_write(phydev, regs->reg, regs->val);
65814c2bfdSHeiner Kallweit 		regs++;
66814c2bfdSHeiner Kallweit 	}
67814c2bfdSHeiner Kallweit 
68814c2bfdSHeiner Kallweit 	phy_unlock_mdio_bus(phydev);
69814c2bfdSHeiner Kallweit }
70814c2bfdSHeiner Kallweit 
71814c2bfdSHeiner Kallweit #define rtl_writephy_batch(p, a) __rtl_writephy_batch(p, a, ARRAY_SIZE(a))
72814c2bfdSHeiner Kallweit 
rtl8168f_config_eee_phy(struct phy_device * phydev)73814c2bfdSHeiner Kallweit static void rtl8168f_config_eee_phy(struct phy_device *phydev)
74814c2bfdSHeiner Kallweit {
75814c2bfdSHeiner Kallweit 	r8168d_modify_extpage(phydev, 0x0020, 0x15, 0, BIT(8));
76814c2bfdSHeiner Kallweit 	r8168d_phy_param(phydev, 0x8b85, 0, BIT(13));
77814c2bfdSHeiner Kallweit }
78814c2bfdSHeiner Kallweit 
rtl8168g_config_eee_phy(struct phy_device * phydev)79814c2bfdSHeiner Kallweit static void rtl8168g_config_eee_phy(struct phy_device *phydev)
80814c2bfdSHeiner Kallweit {
81814c2bfdSHeiner Kallweit 	phy_modify_paged(phydev, 0x0a43, 0x11, 0, BIT(4));
82814c2bfdSHeiner Kallweit }
83814c2bfdSHeiner Kallweit 
rtl8168h_config_eee_phy(struct phy_device * phydev)84814c2bfdSHeiner Kallweit static void rtl8168h_config_eee_phy(struct phy_device *phydev)
85814c2bfdSHeiner Kallweit {
86814c2bfdSHeiner Kallweit 	rtl8168g_config_eee_phy(phydev);
87814c2bfdSHeiner Kallweit 
88814c2bfdSHeiner Kallweit 	phy_modify_paged(phydev, 0xa4a, 0x11, 0x0000, 0x0200);
89814c2bfdSHeiner Kallweit 	phy_modify_paged(phydev, 0xa42, 0x14, 0x0000, 0x0080);
90814c2bfdSHeiner Kallweit }
91814c2bfdSHeiner Kallweit 
rtl8125a_config_eee_phy(struct phy_device * phydev)924640338cSHeiner Kallweit static void rtl8125a_config_eee_phy(struct phy_device *phydev)
93814c2bfdSHeiner Kallweit {
94814c2bfdSHeiner Kallweit 	rtl8168h_config_eee_phy(phydev);
95814c2bfdSHeiner Kallweit 
96814c2bfdSHeiner Kallweit 	phy_modify_paged(phydev, 0xa6d, 0x12, 0x0001, 0x0000);
97814c2bfdSHeiner Kallweit 	phy_modify_paged(phydev, 0xa6d, 0x14, 0x0010, 0x0000);
98814c2bfdSHeiner Kallweit }
99814c2bfdSHeiner Kallweit 
rtl8125b_config_eee_phy(struct phy_device * phydev)1000439297bSHeiner Kallweit static void rtl8125b_config_eee_phy(struct phy_device *phydev)
1010439297bSHeiner Kallweit {
1020439297bSHeiner Kallweit 	phy_modify_paged(phydev, 0xa6d, 0x12, 0x0001, 0x0000);
1030439297bSHeiner Kallweit 	phy_modify_paged(phydev, 0xa6d, 0x14, 0x0010, 0x0000);
1040439297bSHeiner Kallweit 	phy_modify_paged(phydev, 0xa42, 0x14, 0x0080, 0x0000);
1050439297bSHeiner Kallweit 	phy_modify_paged(phydev, 0xa4a, 0x11, 0x0200, 0x0000);
1060439297bSHeiner Kallweit }
1070439297bSHeiner Kallweit 
rtl8169s_hw_phy_config(struct rtl8169_private * tp,struct phy_device * phydev)108814c2bfdSHeiner Kallweit static void rtl8169s_hw_phy_config(struct rtl8169_private *tp,
109814c2bfdSHeiner Kallweit 				   struct phy_device *phydev)
110814c2bfdSHeiner Kallweit {
111814c2bfdSHeiner Kallweit 	static const struct phy_reg phy_reg_init[] = {
112814c2bfdSHeiner Kallweit 		{ 0x1f, 0x0001 },
113814c2bfdSHeiner Kallweit 		{ 0x06, 0x006e },
114814c2bfdSHeiner Kallweit 		{ 0x08, 0x0708 },
115814c2bfdSHeiner Kallweit 		{ 0x15, 0x4000 },
116814c2bfdSHeiner Kallweit 		{ 0x18, 0x65c7 },
117814c2bfdSHeiner Kallweit 
118814c2bfdSHeiner Kallweit 		{ 0x1f, 0x0001 },
119814c2bfdSHeiner Kallweit 		{ 0x03, 0x00a1 },
120814c2bfdSHeiner Kallweit 		{ 0x02, 0x0008 },
121814c2bfdSHeiner Kallweit 		{ 0x01, 0x0120 },
122814c2bfdSHeiner Kallweit 		{ 0x00, 0x1000 },
123814c2bfdSHeiner Kallweit 		{ 0x04, 0x0800 },
124814c2bfdSHeiner Kallweit 		{ 0x04, 0x0000 },
125814c2bfdSHeiner Kallweit 
126814c2bfdSHeiner Kallweit 		{ 0x03, 0xff41 },
127814c2bfdSHeiner Kallweit 		{ 0x02, 0xdf60 },
128814c2bfdSHeiner Kallweit 		{ 0x01, 0x0140 },
129814c2bfdSHeiner Kallweit 		{ 0x00, 0x0077 },
130814c2bfdSHeiner Kallweit 		{ 0x04, 0x7800 },
131814c2bfdSHeiner Kallweit 		{ 0x04, 0x7000 },
132814c2bfdSHeiner Kallweit 
133814c2bfdSHeiner Kallweit 		{ 0x03, 0x802f },
134814c2bfdSHeiner Kallweit 		{ 0x02, 0x4f02 },
135814c2bfdSHeiner Kallweit 		{ 0x01, 0x0409 },
136814c2bfdSHeiner Kallweit 		{ 0x00, 0xf0f9 },
137814c2bfdSHeiner Kallweit 		{ 0x04, 0x9800 },
138814c2bfdSHeiner Kallweit 		{ 0x04, 0x9000 },
139814c2bfdSHeiner Kallweit 
140814c2bfdSHeiner Kallweit 		{ 0x03, 0xdf01 },
141814c2bfdSHeiner Kallweit 		{ 0x02, 0xdf20 },
142814c2bfdSHeiner Kallweit 		{ 0x01, 0xff95 },
143814c2bfdSHeiner Kallweit 		{ 0x00, 0xba00 },
144814c2bfdSHeiner Kallweit 		{ 0x04, 0xa800 },
145814c2bfdSHeiner Kallweit 		{ 0x04, 0xa000 },
146814c2bfdSHeiner Kallweit 
147814c2bfdSHeiner Kallweit 		{ 0x03, 0xff41 },
148814c2bfdSHeiner Kallweit 		{ 0x02, 0xdf20 },
149814c2bfdSHeiner Kallweit 		{ 0x01, 0x0140 },
150814c2bfdSHeiner Kallweit 		{ 0x00, 0x00bb },
151814c2bfdSHeiner Kallweit 		{ 0x04, 0xb800 },
152814c2bfdSHeiner Kallweit 		{ 0x04, 0xb000 },
153814c2bfdSHeiner Kallweit 
154814c2bfdSHeiner Kallweit 		{ 0x03, 0xdf41 },
155814c2bfdSHeiner Kallweit 		{ 0x02, 0xdc60 },
156814c2bfdSHeiner Kallweit 		{ 0x01, 0x6340 },
157814c2bfdSHeiner Kallweit 		{ 0x00, 0x007d },
158814c2bfdSHeiner Kallweit 		{ 0x04, 0xd800 },
159814c2bfdSHeiner Kallweit 		{ 0x04, 0xd000 },
160814c2bfdSHeiner Kallweit 
161814c2bfdSHeiner Kallweit 		{ 0x03, 0xdf01 },
162814c2bfdSHeiner Kallweit 		{ 0x02, 0xdf20 },
163814c2bfdSHeiner Kallweit 		{ 0x01, 0x100a },
164814c2bfdSHeiner Kallweit 		{ 0x00, 0xa0ff },
165814c2bfdSHeiner Kallweit 		{ 0x04, 0xf800 },
166814c2bfdSHeiner Kallweit 		{ 0x04, 0xf000 },
167814c2bfdSHeiner Kallweit 
168814c2bfdSHeiner Kallweit 		{ 0x1f, 0x0000 },
169814c2bfdSHeiner Kallweit 		{ 0x0b, 0x0000 },
170814c2bfdSHeiner Kallweit 		{ 0x00, 0x9200 }
171814c2bfdSHeiner Kallweit 	};
172814c2bfdSHeiner Kallweit 
173814c2bfdSHeiner Kallweit 	rtl_writephy_batch(phydev, phy_reg_init);
174814c2bfdSHeiner Kallweit }
175814c2bfdSHeiner Kallweit 
rtl8169sb_hw_phy_config(struct rtl8169_private * tp,struct phy_device * phydev)176814c2bfdSHeiner Kallweit static void rtl8169sb_hw_phy_config(struct rtl8169_private *tp,
177814c2bfdSHeiner Kallweit 				    struct phy_device *phydev)
178814c2bfdSHeiner Kallweit {
179814c2bfdSHeiner Kallweit 	phy_write_paged(phydev, 0x0002, 0x01, 0x90d0);
180814c2bfdSHeiner Kallweit }
181814c2bfdSHeiner Kallweit 
rtl8169scd_hw_phy_config(struct rtl8169_private * tp,struct phy_device * phydev)182814c2bfdSHeiner Kallweit static void rtl8169scd_hw_phy_config(struct rtl8169_private *tp,
183814c2bfdSHeiner Kallweit 				     struct phy_device *phydev)
184814c2bfdSHeiner Kallweit {
185814c2bfdSHeiner Kallweit 	static const struct phy_reg phy_reg_init[] = {
186814c2bfdSHeiner Kallweit 		{ 0x1f, 0x0001 },
187814c2bfdSHeiner Kallweit 		{ 0x04, 0x0000 },
188814c2bfdSHeiner Kallweit 		{ 0x03, 0x00a1 },
189814c2bfdSHeiner Kallweit 		{ 0x02, 0x0008 },
190814c2bfdSHeiner Kallweit 		{ 0x01, 0x0120 },
191814c2bfdSHeiner Kallweit 		{ 0x00, 0x1000 },
192814c2bfdSHeiner Kallweit 		{ 0x04, 0x0800 },
193814c2bfdSHeiner Kallweit 		{ 0x04, 0x9000 },
194814c2bfdSHeiner Kallweit 		{ 0x03, 0x802f },
195814c2bfdSHeiner Kallweit 		{ 0x02, 0x4f02 },
196814c2bfdSHeiner Kallweit 		{ 0x01, 0x0409 },
197814c2bfdSHeiner Kallweit 		{ 0x00, 0xf099 },
198814c2bfdSHeiner Kallweit 		{ 0x04, 0x9800 },
199814c2bfdSHeiner Kallweit 		{ 0x04, 0xa000 },
200814c2bfdSHeiner Kallweit 		{ 0x03, 0xdf01 },
201814c2bfdSHeiner Kallweit 		{ 0x02, 0xdf20 },
202814c2bfdSHeiner Kallweit 		{ 0x01, 0xff95 },
203814c2bfdSHeiner Kallweit 		{ 0x00, 0xba00 },
204814c2bfdSHeiner Kallweit 		{ 0x04, 0xa800 },
205814c2bfdSHeiner Kallweit 		{ 0x04, 0xf000 },
206814c2bfdSHeiner Kallweit 		{ 0x03, 0xdf01 },
207814c2bfdSHeiner Kallweit 		{ 0x02, 0xdf20 },
208814c2bfdSHeiner Kallweit 		{ 0x01, 0x101a },
209814c2bfdSHeiner Kallweit 		{ 0x00, 0xa0ff },
210814c2bfdSHeiner Kallweit 		{ 0x04, 0xf800 },
211814c2bfdSHeiner Kallweit 		{ 0x04, 0x0000 },
212814c2bfdSHeiner Kallweit 		{ 0x1f, 0x0000 },
213814c2bfdSHeiner Kallweit 
214814c2bfdSHeiner Kallweit 		{ 0x1f, 0x0001 },
215814c2bfdSHeiner Kallweit 		{ 0x10, 0xf41b },
216814c2bfdSHeiner Kallweit 		{ 0x14, 0xfb54 },
217814c2bfdSHeiner Kallweit 		{ 0x18, 0xf5c7 },
218814c2bfdSHeiner Kallweit 		{ 0x1f, 0x0000 },
219814c2bfdSHeiner Kallweit 
220814c2bfdSHeiner Kallweit 		{ 0x1f, 0x0001 },
221814c2bfdSHeiner Kallweit 		{ 0x17, 0x0cc0 },
222814c2bfdSHeiner Kallweit 		{ 0x1f, 0x0000 }
223814c2bfdSHeiner Kallweit 	};
224814c2bfdSHeiner Kallweit 
225814c2bfdSHeiner Kallweit 	rtl_writephy_batch(phydev, phy_reg_init);
226814c2bfdSHeiner Kallweit }
227814c2bfdSHeiner Kallweit 
rtl8169sce_hw_phy_config(struct rtl8169_private * tp,struct phy_device * phydev)228814c2bfdSHeiner Kallweit static void rtl8169sce_hw_phy_config(struct rtl8169_private *tp,
229814c2bfdSHeiner Kallweit 				     struct phy_device *phydev)
230814c2bfdSHeiner Kallweit {
231814c2bfdSHeiner Kallweit 	static const struct phy_reg phy_reg_init[] = {
232814c2bfdSHeiner Kallweit 		{ 0x1f, 0x0001 },
233814c2bfdSHeiner Kallweit 		{ 0x04, 0x0000 },
234814c2bfdSHeiner Kallweit 		{ 0x03, 0x00a1 },
235814c2bfdSHeiner Kallweit 		{ 0x02, 0x0008 },
236814c2bfdSHeiner Kallweit 		{ 0x01, 0x0120 },
237814c2bfdSHeiner Kallweit 		{ 0x00, 0x1000 },
238814c2bfdSHeiner Kallweit 		{ 0x04, 0x0800 },
239814c2bfdSHeiner Kallweit 		{ 0x04, 0x9000 },
240814c2bfdSHeiner Kallweit 		{ 0x03, 0x802f },
241814c2bfdSHeiner Kallweit 		{ 0x02, 0x4f02 },
242814c2bfdSHeiner Kallweit 		{ 0x01, 0x0409 },
243814c2bfdSHeiner Kallweit 		{ 0x00, 0xf099 },
244814c2bfdSHeiner Kallweit 		{ 0x04, 0x9800 },
245814c2bfdSHeiner Kallweit 		{ 0x04, 0xa000 },
246814c2bfdSHeiner Kallweit 		{ 0x03, 0xdf01 },
247814c2bfdSHeiner Kallweit 		{ 0x02, 0xdf20 },
248814c2bfdSHeiner Kallweit 		{ 0x01, 0xff95 },
249814c2bfdSHeiner Kallweit 		{ 0x00, 0xba00 },
250814c2bfdSHeiner Kallweit 		{ 0x04, 0xa800 },
251814c2bfdSHeiner Kallweit 		{ 0x04, 0xf000 },
252814c2bfdSHeiner Kallweit 		{ 0x03, 0xdf01 },
253814c2bfdSHeiner Kallweit 		{ 0x02, 0xdf20 },
254814c2bfdSHeiner Kallweit 		{ 0x01, 0x101a },
255814c2bfdSHeiner Kallweit 		{ 0x00, 0xa0ff },
256814c2bfdSHeiner Kallweit 		{ 0x04, 0xf800 },
257814c2bfdSHeiner Kallweit 		{ 0x04, 0x0000 },
258814c2bfdSHeiner Kallweit 		{ 0x1f, 0x0000 },
259814c2bfdSHeiner Kallweit 
260814c2bfdSHeiner Kallweit 		{ 0x1f, 0x0001 },
261814c2bfdSHeiner Kallweit 		{ 0x0b, 0x8480 },
262814c2bfdSHeiner Kallweit 		{ 0x1f, 0x0000 },
263814c2bfdSHeiner Kallweit 
264814c2bfdSHeiner Kallweit 		{ 0x1f, 0x0001 },
265814c2bfdSHeiner Kallweit 		{ 0x18, 0x67c7 },
266814c2bfdSHeiner Kallweit 		{ 0x04, 0x2000 },
267814c2bfdSHeiner Kallweit 		{ 0x03, 0x002f },
268814c2bfdSHeiner Kallweit 		{ 0x02, 0x4360 },
269814c2bfdSHeiner Kallweit 		{ 0x01, 0x0109 },
270814c2bfdSHeiner Kallweit 		{ 0x00, 0x3022 },
271814c2bfdSHeiner Kallweit 		{ 0x04, 0x2800 },
272814c2bfdSHeiner Kallweit 		{ 0x1f, 0x0000 },
273814c2bfdSHeiner Kallweit 
274814c2bfdSHeiner Kallweit 		{ 0x1f, 0x0001 },
275814c2bfdSHeiner Kallweit 		{ 0x17, 0x0cc0 },
276814c2bfdSHeiner Kallweit 		{ 0x1f, 0x0000 }
277814c2bfdSHeiner Kallweit 	};
278814c2bfdSHeiner Kallweit 
279814c2bfdSHeiner Kallweit 	rtl_writephy_batch(phydev, phy_reg_init);
280814c2bfdSHeiner Kallweit }
281814c2bfdSHeiner Kallweit 
rtl8168bb_hw_phy_config(struct rtl8169_private * tp,struct phy_device * phydev)282814c2bfdSHeiner Kallweit static void rtl8168bb_hw_phy_config(struct rtl8169_private *tp,
283814c2bfdSHeiner Kallweit 				    struct phy_device *phydev)
284814c2bfdSHeiner Kallweit {
285814c2bfdSHeiner Kallweit 	phy_write(phydev, 0x1f, 0x0001);
286814c2bfdSHeiner Kallweit 	phy_set_bits(phydev, 0x16, BIT(0));
287814c2bfdSHeiner Kallweit 	phy_write(phydev, 0x10, 0xf41b);
288814c2bfdSHeiner Kallweit 	phy_write(phydev, 0x1f, 0x0000);
289814c2bfdSHeiner Kallweit }
290814c2bfdSHeiner Kallweit 
rtl8168bef_hw_phy_config(struct rtl8169_private * tp,struct phy_device * phydev)291814c2bfdSHeiner Kallweit static void rtl8168bef_hw_phy_config(struct rtl8169_private *tp,
292814c2bfdSHeiner Kallweit 				     struct phy_device *phydev)
293814c2bfdSHeiner Kallweit {
294814c2bfdSHeiner Kallweit 	phy_write_paged(phydev, 0x0001, 0x10, 0xf41b);
295814c2bfdSHeiner Kallweit }
296814c2bfdSHeiner Kallweit 
rtl8168cp_1_hw_phy_config(struct rtl8169_private * tp,struct phy_device * phydev)297814c2bfdSHeiner Kallweit static void rtl8168cp_1_hw_phy_config(struct rtl8169_private *tp,
298814c2bfdSHeiner Kallweit 				      struct phy_device *phydev)
299814c2bfdSHeiner Kallweit {
300814c2bfdSHeiner Kallweit 	phy_write(phydev, 0x1d, 0x0f00);
301814c2bfdSHeiner Kallweit 	phy_write_paged(phydev, 0x0002, 0x0c, 0x1ec8);
302814c2bfdSHeiner Kallweit }
303814c2bfdSHeiner Kallweit 
rtl8168cp_2_hw_phy_config(struct rtl8169_private * tp,struct phy_device * phydev)304814c2bfdSHeiner Kallweit static void rtl8168cp_2_hw_phy_config(struct rtl8169_private *tp,
305814c2bfdSHeiner Kallweit 				      struct phy_device *phydev)
306814c2bfdSHeiner Kallweit {
307814c2bfdSHeiner Kallweit 	phy_set_bits(phydev, 0x14, BIT(5));
308814c2bfdSHeiner Kallweit 	phy_set_bits(phydev, 0x0d, BIT(5));
309814c2bfdSHeiner Kallweit 	phy_write_paged(phydev, 0x0001, 0x1d, 0x3d98);
310814c2bfdSHeiner Kallweit }
311814c2bfdSHeiner Kallweit 
rtl8168c_1_hw_phy_config(struct rtl8169_private * tp,struct phy_device * phydev)312814c2bfdSHeiner Kallweit static void rtl8168c_1_hw_phy_config(struct rtl8169_private *tp,
313814c2bfdSHeiner Kallweit 				     struct phy_device *phydev)
314814c2bfdSHeiner Kallweit {
315814c2bfdSHeiner Kallweit 	static const struct phy_reg phy_reg_init[] = {
316814c2bfdSHeiner Kallweit 		{ 0x1f, 0x0001 },
317814c2bfdSHeiner Kallweit 		{ 0x12, 0x2300 },
318814c2bfdSHeiner Kallweit 		{ 0x1f, 0x0002 },
319814c2bfdSHeiner Kallweit 		{ 0x00, 0x88d4 },
320814c2bfdSHeiner Kallweit 		{ 0x01, 0x82b1 },
321814c2bfdSHeiner Kallweit 		{ 0x03, 0x7002 },
322814c2bfdSHeiner Kallweit 		{ 0x08, 0x9e30 },
323814c2bfdSHeiner Kallweit 		{ 0x09, 0x01f0 },
324814c2bfdSHeiner Kallweit 		{ 0x0a, 0x5500 },
325814c2bfdSHeiner Kallweit 		{ 0x0c, 0x00c8 },
326814c2bfdSHeiner Kallweit 		{ 0x1f, 0x0003 },
327814c2bfdSHeiner Kallweit 		{ 0x12, 0xc096 },
328814c2bfdSHeiner Kallweit 		{ 0x16, 0x000a },
329814c2bfdSHeiner Kallweit 		{ 0x1f, 0x0000 },
330814c2bfdSHeiner Kallweit 		{ 0x1f, 0x0000 },
331814c2bfdSHeiner Kallweit 		{ 0x09, 0x2000 },
332814c2bfdSHeiner Kallweit 		{ 0x09, 0x0000 }
333814c2bfdSHeiner Kallweit 	};
334814c2bfdSHeiner Kallweit 
335814c2bfdSHeiner Kallweit 	rtl_writephy_batch(phydev, phy_reg_init);
336814c2bfdSHeiner Kallweit 
337814c2bfdSHeiner Kallweit 	phy_set_bits(phydev, 0x14, BIT(5));
338814c2bfdSHeiner Kallweit 	phy_set_bits(phydev, 0x0d, BIT(5));
339814c2bfdSHeiner Kallweit }
340814c2bfdSHeiner Kallweit 
rtl8168c_2_hw_phy_config(struct rtl8169_private * tp,struct phy_device * phydev)341814c2bfdSHeiner Kallweit static void rtl8168c_2_hw_phy_config(struct rtl8169_private *tp,
342814c2bfdSHeiner Kallweit 				     struct phy_device *phydev)
343814c2bfdSHeiner Kallweit {
344814c2bfdSHeiner Kallweit 	static const struct phy_reg phy_reg_init[] = {
345814c2bfdSHeiner Kallweit 		{ 0x1f, 0x0001 },
346814c2bfdSHeiner Kallweit 		{ 0x12, 0x2300 },
347814c2bfdSHeiner Kallweit 		{ 0x03, 0x802f },
348814c2bfdSHeiner Kallweit 		{ 0x02, 0x4f02 },
349814c2bfdSHeiner Kallweit 		{ 0x01, 0x0409 },
350814c2bfdSHeiner Kallweit 		{ 0x00, 0xf099 },
351814c2bfdSHeiner Kallweit 		{ 0x04, 0x9800 },
352814c2bfdSHeiner Kallweit 		{ 0x04, 0x9000 },
353814c2bfdSHeiner Kallweit 		{ 0x1d, 0x3d98 },
354814c2bfdSHeiner Kallweit 		{ 0x1f, 0x0002 },
355814c2bfdSHeiner Kallweit 		{ 0x0c, 0x7eb8 },
356814c2bfdSHeiner Kallweit 		{ 0x06, 0x0761 },
357814c2bfdSHeiner Kallweit 		{ 0x1f, 0x0003 },
358814c2bfdSHeiner Kallweit 		{ 0x16, 0x0f0a },
359814c2bfdSHeiner Kallweit 		{ 0x1f, 0x0000 }
360814c2bfdSHeiner Kallweit 	};
361814c2bfdSHeiner Kallweit 
362814c2bfdSHeiner Kallweit 	rtl_writephy_batch(phydev, phy_reg_init);
363814c2bfdSHeiner Kallweit 
364814c2bfdSHeiner Kallweit 	phy_set_bits(phydev, 0x16, BIT(0));
365814c2bfdSHeiner Kallweit 	phy_set_bits(phydev, 0x14, BIT(5));
366814c2bfdSHeiner Kallweit 	phy_set_bits(phydev, 0x0d, BIT(5));
367814c2bfdSHeiner Kallweit }
368814c2bfdSHeiner Kallweit 
rtl8168c_3_hw_phy_config(struct rtl8169_private * tp,struct phy_device * phydev)369814c2bfdSHeiner Kallweit static void rtl8168c_3_hw_phy_config(struct rtl8169_private *tp,
370814c2bfdSHeiner Kallweit 				     struct phy_device *phydev)
371814c2bfdSHeiner Kallweit {
372814c2bfdSHeiner Kallweit 	static const struct phy_reg phy_reg_init[] = {
373814c2bfdSHeiner Kallweit 		{ 0x1f, 0x0001 },
374814c2bfdSHeiner Kallweit 		{ 0x12, 0x2300 },
375814c2bfdSHeiner Kallweit 		{ 0x1d, 0x3d98 },
376814c2bfdSHeiner Kallweit 		{ 0x1f, 0x0002 },
377814c2bfdSHeiner Kallweit 		{ 0x0c, 0x7eb8 },
378814c2bfdSHeiner Kallweit 		{ 0x06, 0x5461 },
379814c2bfdSHeiner Kallweit 		{ 0x1f, 0x0003 },
380814c2bfdSHeiner Kallweit 		{ 0x16, 0x0f0a },
381814c2bfdSHeiner Kallweit 		{ 0x1f, 0x0000 }
382814c2bfdSHeiner Kallweit 	};
383814c2bfdSHeiner Kallweit 
384814c2bfdSHeiner Kallweit 	rtl_writephy_batch(phydev, phy_reg_init);
385814c2bfdSHeiner Kallweit 
386814c2bfdSHeiner Kallweit 	phy_set_bits(phydev, 0x16, BIT(0));
387814c2bfdSHeiner Kallweit 	phy_set_bits(phydev, 0x14, BIT(5));
388814c2bfdSHeiner Kallweit 	phy_set_bits(phydev, 0x0d, BIT(5));
389814c2bfdSHeiner Kallweit }
390814c2bfdSHeiner Kallweit 
391814c2bfdSHeiner Kallweit static const struct phy_reg rtl8168d_1_phy_reg_init_0[] = {
392814c2bfdSHeiner Kallweit 	/* Channel Estimation */
393814c2bfdSHeiner Kallweit 	{ 0x1f, 0x0001 },
394814c2bfdSHeiner Kallweit 	{ 0x06, 0x4064 },
395814c2bfdSHeiner Kallweit 	{ 0x07, 0x2863 },
396814c2bfdSHeiner Kallweit 	{ 0x08, 0x059c },
397814c2bfdSHeiner Kallweit 	{ 0x09, 0x26b4 },
398814c2bfdSHeiner Kallweit 	{ 0x0a, 0x6a19 },
399814c2bfdSHeiner Kallweit 	{ 0x0b, 0xdcc8 },
400814c2bfdSHeiner Kallweit 	{ 0x10, 0xf06d },
401814c2bfdSHeiner Kallweit 	{ 0x14, 0x7f68 },
402814c2bfdSHeiner Kallweit 	{ 0x18, 0x7fd9 },
403814c2bfdSHeiner Kallweit 	{ 0x1c, 0xf0ff },
404814c2bfdSHeiner Kallweit 	{ 0x1d, 0x3d9c },
405814c2bfdSHeiner Kallweit 	{ 0x1f, 0x0003 },
406814c2bfdSHeiner Kallweit 	{ 0x12, 0xf49f },
407814c2bfdSHeiner Kallweit 	{ 0x13, 0x070b },
408814c2bfdSHeiner Kallweit 	{ 0x1a, 0x05ad },
409814c2bfdSHeiner Kallweit 	{ 0x14, 0x94c0 },
410814c2bfdSHeiner Kallweit 
411814c2bfdSHeiner Kallweit 	/*
412814c2bfdSHeiner Kallweit 	 * Tx Error Issue
413814c2bfdSHeiner Kallweit 	 * Enhance line driver power
414814c2bfdSHeiner Kallweit 	 */
415814c2bfdSHeiner Kallweit 	{ 0x1f, 0x0002 },
416814c2bfdSHeiner Kallweit 	{ 0x06, 0x5561 },
417814c2bfdSHeiner Kallweit 	{ 0x1f, 0x0005 },
418814c2bfdSHeiner Kallweit 	{ 0x05, 0x8332 },
419814c2bfdSHeiner Kallweit 	{ 0x06, 0x5561 },
420814c2bfdSHeiner Kallweit 
421814c2bfdSHeiner Kallweit 	/*
422814c2bfdSHeiner Kallweit 	 * Can not link to 1Gbps with bad cable
423814c2bfdSHeiner Kallweit 	 * Decrease SNR threshold form 21.07dB to 19.04dB
424814c2bfdSHeiner Kallweit 	 */
425814c2bfdSHeiner Kallweit 	{ 0x1f, 0x0001 },
426814c2bfdSHeiner Kallweit 	{ 0x17, 0x0cc0 },
427814c2bfdSHeiner Kallweit 
428814c2bfdSHeiner Kallweit 	{ 0x1f, 0x0000 },
429814c2bfdSHeiner Kallweit 	{ 0x0d, 0xf880 }
430814c2bfdSHeiner Kallweit };
431814c2bfdSHeiner Kallweit 
rtl8168d_apply_firmware_cond(struct rtl8169_private * tp,struct phy_device * phydev,u16 val)432814c2bfdSHeiner Kallweit static void rtl8168d_apply_firmware_cond(struct rtl8169_private *tp,
433814c2bfdSHeiner Kallweit 					 struct phy_device *phydev,
434814c2bfdSHeiner Kallweit 					 u16 val)
435814c2bfdSHeiner Kallweit {
436814c2bfdSHeiner Kallweit 	u16 reg_val;
437814c2bfdSHeiner Kallweit 
438814c2bfdSHeiner Kallweit 	phy_write(phydev, 0x1f, 0x0005);
439814c2bfdSHeiner Kallweit 	phy_write(phydev, 0x05, 0x001b);
440814c2bfdSHeiner Kallweit 	reg_val = phy_read(phydev, 0x06);
441814c2bfdSHeiner Kallweit 	phy_write(phydev, 0x1f, 0x0000);
442814c2bfdSHeiner Kallweit 
443814c2bfdSHeiner Kallweit 	if (reg_val != val)
444814c2bfdSHeiner Kallweit 		phydev_warn(phydev, "chipset not ready for firmware\n");
445814c2bfdSHeiner Kallweit 	else
446814c2bfdSHeiner Kallweit 		r8169_apply_firmware(tp);
447814c2bfdSHeiner Kallweit }
448814c2bfdSHeiner Kallweit 
rtl8168d_1_common(struct phy_device * phydev)449b845bac8SHeiner Kallweit static void rtl8168d_1_common(struct phy_device *phydev)
450b845bac8SHeiner Kallweit {
451b845bac8SHeiner Kallweit 	u16 val;
452b845bac8SHeiner Kallweit 
453b845bac8SHeiner Kallweit 	phy_write_paged(phydev, 0x0002, 0x05, 0x669a);
454b845bac8SHeiner Kallweit 	r8168d_phy_param(phydev, 0x8330, 0xffff, 0x669a);
455b845bac8SHeiner Kallweit 	phy_write(phydev, 0x1f, 0x0002);
456b845bac8SHeiner Kallweit 
457b845bac8SHeiner Kallweit 	val = phy_read(phydev, 0x0d);
458b845bac8SHeiner Kallweit 
459b845bac8SHeiner Kallweit 	if ((val & 0x00ff) != 0x006c) {
460b845bac8SHeiner Kallweit 		static const u16 set[] = {
461b845bac8SHeiner Kallweit 			0x0065, 0x0066, 0x0067, 0x0068,
462b845bac8SHeiner Kallweit 			0x0069, 0x006a, 0x006b, 0x006c
463b845bac8SHeiner Kallweit 		};
464b845bac8SHeiner Kallweit 		int i;
465b845bac8SHeiner Kallweit 
466b845bac8SHeiner Kallweit 		val &= 0xff00;
467b845bac8SHeiner Kallweit 		for (i = 0; i < ARRAY_SIZE(set); i++)
468b845bac8SHeiner Kallweit 			phy_write(phydev, 0x0d, val | set[i]);
469b845bac8SHeiner Kallweit 	}
470b845bac8SHeiner Kallweit }
471b845bac8SHeiner Kallweit 
rtl8168d_1_hw_phy_config(struct rtl8169_private * tp,struct phy_device * phydev)472814c2bfdSHeiner Kallweit static void rtl8168d_1_hw_phy_config(struct rtl8169_private *tp,
473814c2bfdSHeiner Kallweit 				     struct phy_device *phydev)
474814c2bfdSHeiner Kallweit {
475814c2bfdSHeiner Kallweit 	rtl_writephy_batch(phydev, rtl8168d_1_phy_reg_init_0);
476814c2bfdSHeiner Kallweit 
477814c2bfdSHeiner Kallweit 	/*
478814c2bfdSHeiner Kallweit 	 * Rx Error Issue
479814c2bfdSHeiner Kallweit 	 * Fine Tune Switching regulator parameter
480814c2bfdSHeiner Kallweit 	 */
481814c2bfdSHeiner Kallweit 	phy_write(phydev, 0x1f, 0x0002);
482814c2bfdSHeiner Kallweit 	phy_modify(phydev, 0x0b, 0x00ef, 0x0010);
483814c2bfdSHeiner Kallweit 	phy_modify(phydev, 0x0c, 0x5d00, 0xa200);
484814c2bfdSHeiner Kallweit 
485814c2bfdSHeiner Kallweit 	if (rtl8168d_efuse_read(tp, 0x01) == 0xb1) {
486b845bac8SHeiner Kallweit 		rtl8168d_1_common(phydev);
487814c2bfdSHeiner Kallweit 	} else {
488814c2bfdSHeiner Kallweit 		phy_write_paged(phydev, 0x0002, 0x05, 0x6662);
489814c2bfdSHeiner Kallweit 		r8168d_phy_param(phydev, 0x8330, 0xffff, 0x6662);
490814c2bfdSHeiner Kallweit 	}
491814c2bfdSHeiner Kallweit 
492814c2bfdSHeiner Kallweit 	/* RSET couple improve */
493814c2bfdSHeiner Kallweit 	phy_write(phydev, 0x1f, 0x0002);
494814c2bfdSHeiner Kallweit 	phy_set_bits(phydev, 0x0d, 0x0300);
495814c2bfdSHeiner Kallweit 	phy_set_bits(phydev, 0x0f, 0x0010);
496814c2bfdSHeiner Kallweit 
497814c2bfdSHeiner Kallweit 	/* Fine tune PLL performance */
498814c2bfdSHeiner Kallweit 	phy_write(phydev, 0x1f, 0x0002);
499814c2bfdSHeiner Kallweit 	phy_modify(phydev, 0x02, 0x0600, 0x0100);
500814c2bfdSHeiner Kallweit 	phy_clear_bits(phydev, 0x03, 0xe000);
501814c2bfdSHeiner Kallweit 	phy_write(phydev, 0x1f, 0x0000);
502814c2bfdSHeiner Kallweit 
503814c2bfdSHeiner Kallweit 	rtl8168d_apply_firmware_cond(tp, phydev, 0xbf00);
504814c2bfdSHeiner Kallweit }
505814c2bfdSHeiner Kallweit 
rtl8168d_2_hw_phy_config(struct rtl8169_private * tp,struct phy_device * phydev)506814c2bfdSHeiner Kallweit static void rtl8168d_2_hw_phy_config(struct rtl8169_private *tp,
507814c2bfdSHeiner Kallweit 				     struct phy_device *phydev)
508814c2bfdSHeiner Kallweit {
509814c2bfdSHeiner Kallweit 	rtl_writephy_batch(phydev, rtl8168d_1_phy_reg_init_0);
510814c2bfdSHeiner Kallweit 
511814c2bfdSHeiner Kallweit 	if (rtl8168d_efuse_read(tp, 0x01) == 0xb1) {
512b845bac8SHeiner Kallweit 		rtl8168d_1_common(phydev);
513814c2bfdSHeiner Kallweit 	} else {
514814c2bfdSHeiner Kallweit 		phy_write_paged(phydev, 0x0002, 0x05, 0x2642);
515814c2bfdSHeiner Kallweit 		r8168d_phy_param(phydev, 0x8330, 0xffff, 0x2642);
516814c2bfdSHeiner Kallweit 	}
517814c2bfdSHeiner Kallweit 
518814c2bfdSHeiner Kallweit 	/* Fine tune PLL performance */
519814c2bfdSHeiner Kallweit 	phy_write(phydev, 0x1f, 0x0002);
520814c2bfdSHeiner Kallweit 	phy_modify(phydev, 0x02, 0x0600, 0x0100);
521814c2bfdSHeiner Kallweit 	phy_clear_bits(phydev, 0x03, 0xe000);
522814c2bfdSHeiner Kallweit 	phy_write(phydev, 0x1f, 0x0000);
523814c2bfdSHeiner Kallweit 
524814c2bfdSHeiner Kallweit 	/* Switching regulator Slew rate */
525814c2bfdSHeiner Kallweit 	phy_modify_paged(phydev, 0x0002, 0x0f, 0x0000, 0x0017);
526814c2bfdSHeiner Kallweit 
527814c2bfdSHeiner Kallweit 	rtl8168d_apply_firmware_cond(tp, phydev, 0xb300);
528814c2bfdSHeiner Kallweit }
529814c2bfdSHeiner Kallweit 
rtl8168d_4_hw_phy_config(struct rtl8169_private * tp,struct phy_device * phydev)530814c2bfdSHeiner Kallweit static void rtl8168d_4_hw_phy_config(struct rtl8169_private *tp,
531814c2bfdSHeiner Kallweit 				     struct phy_device *phydev)
532814c2bfdSHeiner Kallweit {
533814c2bfdSHeiner Kallweit 	phy_write_paged(phydev, 0x0001, 0x17, 0x0cc0);
534814c2bfdSHeiner Kallweit 	r8168d_modify_extpage(phydev, 0x002d, 0x18, 0xffff, 0x0040);
535814c2bfdSHeiner Kallweit 	phy_set_bits(phydev, 0x0d, BIT(5));
536814c2bfdSHeiner Kallweit }
537814c2bfdSHeiner Kallweit 
rtl8168e_1_hw_phy_config(struct rtl8169_private * tp,struct phy_device * phydev)538814c2bfdSHeiner Kallweit static void rtl8168e_1_hw_phy_config(struct rtl8169_private *tp,
539814c2bfdSHeiner Kallweit 				     struct phy_device *phydev)
540814c2bfdSHeiner Kallweit {
541814c2bfdSHeiner Kallweit 	static const struct phy_reg phy_reg_init[] = {
542814c2bfdSHeiner Kallweit 		/* Channel estimation fine tune */
543814c2bfdSHeiner Kallweit 		{ 0x1f, 0x0001 },
544814c2bfdSHeiner Kallweit 		{ 0x0b, 0x6c20 },
545814c2bfdSHeiner Kallweit 		{ 0x07, 0x2872 },
546814c2bfdSHeiner Kallweit 		{ 0x1c, 0xefff },
547814c2bfdSHeiner Kallweit 		{ 0x1f, 0x0003 },
548814c2bfdSHeiner Kallweit 		{ 0x14, 0x6420 },
549814c2bfdSHeiner Kallweit 		{ 0x1f, 0x0000 },
550814c2bfdSHeiner Kallweit 	};
551814c2bfdSHeiner Kallweit 
552814c2bfdSHeiner Kallweit 	r8169_apply_firmware(tp);
553814c2bfdSHeiner Kallweit 
554814c2bfdSHeiner Kallweit 	/* Enable Delay cap */
555814c2bfdSHeiner Kallweit 	r8168d_phy_param(phydev, 0x8b80, 0xffff, 0xc896);
556814c2bfdSHeiner Kallweit 
557814c2bfdSHeiner Kallweit 	rtl_writephy_batch(phydev, phy_reg_init);
558814c2bfdSHeiner Kallweit 
559814c2bfdSHeiner Kallweit 	/* Update PFM & 10M TX idle timer */
560814c2bfdSHeiner Kallweit 	r8168d_modify_extpage(phydev, 0x002f, 0x15, 0xffff, 0x1919);
561814c2bfdSHeiner Kallweit 
562814c2bfdSHeiner Kallweit 	r8168d_modify_extpage(phydev, 0x00ac, 0x18, 0xffff, 0x0006);
563814c2bfdSHeiner Kallweit 
564814c2bfdSHeiner Kallweit 	/* DCO enable for 10M IDLE Power */
565814c2bfdSHeiner Kallweit 	r8168d_modify_extpage(phydev, 0x0023, 0x17, 0x0000, 0x0006);
566814c2bfdSHeiner Kallweit 
567814c2bfdSHeiner Kallweit 	/* For impedance matching */
568814c2bfdSHeiner Kallweit 	phy_modify_paged(phydev, 0x0002, 0x08, 0x7f00, 0x8000);
569814c2bfdSHeiner Kallweit 
570814c2bfdSHeiner Kallweit 	/* PHY auto speed down */
571814c2bfdSHeiner Kallweit 	r8168d_modify_extpage(phydev, 0x002d, 0x18, 0x0000, 0x0050);
572814c2bfdSHeiner Kallweit 	phy_set_bits(phydev, 0x14, BIT(15));
573814c2bfdSHeiner Kallweit 
574814c2bfdSHeiner Kallweit 	r8168d_phy_param(phydev, 0x8b86, 0x0000, 0x0001);
575814c2bfdSHeiner Kallweit 	r8168d_phy_param(phydev, 0x8b85, 0x2000, 0x0000);
576814c2bfdSHeiner Kallweit 
577814c2bfdSHeiner Kallweit 	r8168d_modify_extpage(phydev, 0x0020, 0x15, 0x1100, 0x0000);
578814c2bfdSHeiner Kallweit 	phy_write_paged(phydev, 0x0006, 0x00, 0x5a00);
579814c2bfdSHeiner Kallweit 
580814c2bfdSHeiner Kallweit 	phy_write_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_ADV, 0x0000);
581814c2bfdSHeiner Kallweit }
582814c2bfdSHeiner Kallweit 
rtl8168e_2_hw_phy_config(struct rtl8169_private * tp,struct phy_device * phydev)583814c2bfdSHeiner Kallweit static void rtl8168e_2_hw_phy_config(struct rtl8169_private *tp,
584814c2bfdSHeiner Kallweit 				     struct phy_device *phydev)
585814c2bfdSHeiner Kallweit {
586814c2bfdSHeiner Kallweit 	r8169_apply_firmware(tp);
587814c2bfdSHeiner Kallweit 
588814c2bfdSHeiner Kallweit 	/* Enable Delay cap */
589814c2bfdSHeiner Kallweit 	r8168d_modify_extpage(phydev, 0x00ac, 0x18, 0xffff, 0x0006);
590814c2bfdSHeiner Kallweit 
591814c2bfdSHeiner Kallweit 	/* Channel estimation fine tune */
592814c2bfdSHeiner Kallweit 	phy_write_paged(phydev, 0x0003, 0x09, 0xa20f);
593814c2bfdSHeiner Kallweit 
594814c2bfdSHeiner Kallweit 	/* Green Setting */
595814c2bfdSHeiner Kallweit 	r8168d_phy_param(phydev, 0x8b5b, 0xffff, 0x9222);
596814c2bfdSHeiner Kallweit 	r8168d_phy_param(phydev, 0x8b6d, 0xffff, 0x8000);
597814c2bfdSHeiner Kallweit 	r8168d_phy_param(phydev, 0x8b76, 0xffff, 0x8000);
598814c2bfdSHeiner Kallweit 
599814c2bfdSHeiner Kallweit 	/* For 4-corner performance improve */
600814c2bfdSHeiner Kallweit 	phy_write(phydev, 0x1f, 0x0005);
601814c2bfdSHeiner Kallweit 	phy_write(phydev, 0x05, 0x8b80);
602814c2bfdSHeiner Kallweit 	phy_set_bits(phydev, 0x17, 0x0006);
603814c2bfdSHeiner Kallweit 	phy_write(phydev, 0x1f, 0x0000);
604814c2bfdSHeiner Kallweit 
605814c2bfdSHeiner Kallweit 	/* PHY auto speed down */
606814c2bfdSHeiner Kallweit 	r8168d_modify_extpage(phydev, 0x002d, 0x18, 0x0000, 0x0010);
607814c2bfdSHeiner Kallweit 	phy_set_bits(phydev, 0x14, BIT(15));
608814c2bfdSHeiner Kallweit 
609814c2bfdSHeiner Kallweit 	/* improve 10M EEE waveform */
610814c2bfdSHeiner Kallweit 	r8168d_phy_param(phydev, 0x8b86, 0x0000, 0x0001);
611814c2bfdSHeiner Kallweit 
612814c2bfdSHeiner Kallweit 	/* Improve 2-pair detection performance */
613814c2bfdSHeiner Kallweit 	r8168d_phy_param(phydev, 0x8b85, 0x0000, 0x4000);
614814c2bfdSHeiner Kallweit 
615814c2bfdSHeiner Kallweit 	rtl8168f_config_eee_phy(phydev);
616814c2bfdSHeiner Kallweit 
617814c2bfdSHeiner Kallweit 	/* Green feature */
618814c2bfdSHeiner Kallweit 	phy_write(phydev, 0x1f, 0x0003);
619814c2bfdSHeiner Kallweit 	phy_set_bits(phydev, 0x19, BIT(0));
620814c2bfdSHeiner Kallweit 	phy_set_bits(phydev, 0x10, BIT(10));
621814c2bfdSHeiner Kallweit 	phy_write(phydev, 0x1f, 0x0000);
622814c2bfdSHeiner Kallweit 	phy_modify_paged(phydev, 0x0005, 0x01, 0, BIT(8));
623814c2bfdSHeiner Kallweit }
624814c2bfdSHeiner Kallweit 
rtl8168f_hw_phy_config(struct rtl8169_private * tp,struct phy_device * phydev)625814c2bfdSHeiner Kallweit static void rtl8168f_hw_phy_config(struct rtl8169_private *tp,
626814c2bfdSHeiner Kallweit 				   struct phy_device *phydev)
627814c2bfdSHeiner Kallweit {
628814c2bfdSHeiner Kallweit 	/* For 4-corner performance improve */
629814c2bfdSHeiner Kallweit 	r8168d_phy_param(phydev, 0x8b80, 0x0000, 0x0006);
630814c2bfdSHeiner Kallweit 
631814c2bfdSHeiner Kallweit 	/* PHY auto speed down */
632814c2bfdSHeiner Kallweit 	r8168d_modify_extpage(phydev, 0x002d, 0x18, 0x0000, 0x0010);
633814c2bfdSHeiner Kallweit 	phy_set_bits(phydev, 0x14, BIT(15));
634814c2bfdSHeiner Kallweit 
635814c2bfdSHeiner Kallweit 	/* Improve 10M EEE waveform */
636814c2bfdSHeiner Kallweit 	r8168d_phy_param(phydev, 0x8b86, 0x0000, 0x0001);
637814c2bfdSHeiner Kallweit 
638814c2bfdSHeiner Kallweit 	rtl8168f_config_eee_phy(phydev);
639814c2bfdSHeiner Kallweit }
640814c2bfdSHeiner Kallweit 
rtl8168f_1_hw_phy_config(struct rtl8169_private * tp,struct phy_device * phydev)641814c2bfdSHeiner Kallweit static void rtl8168f_1_hw_phy_config(struct rtl8169_private *tp,
642814c2bfdSHeiner Kallweit 				     struct phy_device *phydev)
643814c2bfdSHeiner Kallweit {
644814c2bfdSHeiner Kallweit 	r8169_apply_firmware(tp);
645814c2bfdSHeiner Kallweit 
646814c2bfdSHeiner Kallweit 	/* Channel estimation fine tune */
647814c2bfdSHeiner Kallweit 	phy_write_paged(phydev, 0x0003, 0x09, 0xa20f);
648814c2bfdSHeiner Kallweit 
649814c2bfdSHeiner Kallweit 	/* Modify green table for giga & fnet */
650814c2bfdSHeiner Kallweit 	r8168d_phy_param(phydev, 0x8b55, 0xffff, 0x0000);
651814c2bfdSHeiner Kallweit 	r8168d_phy_param(phydev, 0x8b5e, 0xffff, 0x0000);
652814c2bfdSHeiner Kallweit 	r8168d_phy_param(phydev, 0x8b67, 0xffff, 0x0000);
653814c2bfdSHeiner Kallweit 	r8168d_phy_param(phydev, 0x8b70, 0xffff, 0x0000);
654814c2bfdSHeiner Kallweit 	r8168d_modify_extpage(phydev, 0x0078, 0x17, 0xffff, 0x0000);
655814c2bfdSHeiner Kallweit 	r8168d_modify_extpage(phydev, 0x0078, 0x19, 0xffff, 0x00fb);
656814c2bfdSHeiner Kallweit 
657814c2bfdSHeiner Kallweit 	/* Modify green table for 10M */
658814c2bfdSHeiner Kallweit 	r8168d_phy_param(phydev, 0x8b79, 0xffff, 0xaa00);
659814c2bfdSHeiner Kallweit 
660814c2bfdSHeiner Kallweit 	/* Disable hiimpedance detection (RTCT) */
661814c2bfdSHeiner Kallweit 	phy_write_paged(phydev, 0x0003, 0x01, 0x328a);
662814c2bfdSHeiner Kallweit 
663814c2bfdSHeiner Kallweit 	rtl8168f_hw_phy_config(tp, phydev);
664814c2bfdSHeiner Kallweit 
665814c2bfdSHeiner Kallweit 	/* Improve 2-pair detection performance */
666814c2bfdSHeiner Kallweit 	r8168d_phy_param(phydev, 0x8b85, 0x0000, 0x4000);
667814c2bfdSHeiner Kallweit }
668814c2bfdSHeiner Kallweit 
rtl8168f_2_hw_phy_config(struct rtl8169_private * tp,struct phy_device * phydev)669814c2bfdSHeiner Kallweit static void rtl8168f_2_hw_phy_config(struct rtl8169_private *tp,
670814c2bfdSHeiner Kallweit 				     struct phy_device *phydev)
671814c2bfdSHeiner Kallweit {
672814c2bfdSHeiner Kallweit 	r8169_apply_firmware(tp);
673814c2bfdSHeiner Kallweit 
674814c2bfdSHeiner Kallweit 	rtl8168f_hw_phy_config(tp, phydev);
675814c2bfdSHeiner Kallweit }
676814c2bfdSHeiner Kallweit 
rtl8411_hw_phy_config(struct rtl8169_private * tp,struct phy_device * phydev)677814c2bfdSHeiner Kallweit static void rtl8411_hw_phy_config(struct rtl8169_private *tp,
678814c2bfdSHeiner Kallweit 				  struct phy_device *phydev)
679814c2bfdSHeiner Kallweit {
680814c2bfdSHeiner Kallweit 	r8169_apply_firmware(tp);
681814c2bfdSHeiner Kallweit 
682814c2bfdSHeiner Kallweit 	rtl8168f_hw_phy_config(tp, phydev);
683814c2bfdSHeiner Kallweit 
684814c2bfdSHeiner Kallweit 	/* Improve 2-pair detection performance */
685814c2bfdSHeiner Kallweit 	r8168d_phy_param(phydev, 0x8b85, 0x0000, 0x4000);
686814c2bfdSHeiner Kallweit 
687814c2bfdSHeiner Kallweit 	/* Channel estimation fine tune */
688814c2bfdSHeiner Kallweit 	phy_write_paged(phydev, 0x0003, 0x09, 0xa20f);
689814c2bfdSHeiner Kallweit 
690814c2bfdSHeiner Kallweit 	/* Modify green table for giga & fnet */
691814c2bfdSHeiner Kallweit 	r8168d_phy_param(phydev, 0x8b55, 0xffff, 0x0000);
692814c2bfdSHeiner Kallweit 	r8168d_phy_param(phydev, 0x8b5e, 0xffff, 0x0000);
693814c2bfdSHeiner Kallweit 	r8168d_phy_param(phydev, 0x8b67, 0xffff, 0x0000);
694814c2bfdSHeiner Kallweit 	r8168d_phy_param(phydev, 0x8b70, 0xffff, 0x0000);
695814c2bfdSHeiner Kallweit 	r8168d_modify_extpage(phydev, 0x0078, 0x17, 0xffff, 0x0000);
696814c2bfdSHeiner Kallweit 	r8168d_modify_extpage(phydev, 0x0078, 0x19, 0xffff, 0x00aa);
697814c2bfdSHeiner Kallweit 
698814c2bfdSHeiner Kallweit 	/* Modify green table for 10M */
699814c2bfdSHeiner Kallweit 	r8168d_phy_param(phydev, 0x8b79, 0xffff, 0xaa00);
700814c2bfdSHeiner Kallweit 
701814c2bfdSHeiner Kallweit 	/* Disable hiimpedance detection (RTCT) */
702814c2bfdSHeiner Kallweit 	phy_write_paged(phydev, 0x0003, 0x01, 0x328a);
703814c2bfdSHeiner Kallweit 
704814c2bfdSHeiner Kallweit 	/* Modify green table for giga */
705814c2bfdSHeiner Kallweit 	r8168d_phy_param(phydev, 0x8b54, 0x0800, 0x0000);
706814c2bfdSHeiner Kallweit 	r8168d_phy_param(phydev, 0x8b5d, 0x0800, 0x0000);
707814c2bfdSHeiner Kallweit 	r8168d_phy_param(phydev, 0x8a7c, 0x0100, 0x0000);
708814c2bfdSHeiner Kallweit 	r8168d_phy_param(phydev, 0x8a7f, 0x0000, 0x0100);
709814c2bfdSHeiner Kallweit 	r8168d_phy_param(phydev, 0x8a82, 0x0100, 0x0000);
710814c2bfdSHeiner Kallweit 	r8168d_phy_param(phydev, 0x8a85, 0x0100, 0x0000);
711814c2bfdSHeiner Kallweit 	r8168d_phy_param(phydev, 0x8a88, 0x0100, 0x0000);
712814c2bfdSHeiner Kallweit 
713814c2bfdSHeiner Kallweit 	/* uc same-seed solution */
714814c2bfdSHeiner Kallweit 	r8168d_phy_param(phydev, 0x8b85, 0x0000, 0x8000);
715814c2bfdSHeiner Kallweit 
716814c2bfdSHeiner Kallweit 	/* Green feature */
717814c2bfdSHeiner Kallweit 	phy_write(phydev, 0x1f, 0x0003);
718814c2bfdSHeiner Kallweit 	phy_clear_bits(phydev, 0x19, BIT(0));
719814c2bfdSHeiner Kallweit 	phy_clear_bits(phydev, 0x10, BIT(10));
720814c2bfdSHeiner Kallweit 	phy_write(phydev, 0x1f, 0x0000);
721814c2bfdSHeiner Kallweit }
722814c2bfdSHeiner Kallweit 
rtl8168g_disable_aldps(struct phy_device * phydev)723814c2bfdSHeiner Kallweit static void rtl8168g_disable_aldps(struct phy_device *phydev)
724814c2bfdSHeiner Kallweit {
725814c2bfdSHeiner Kallweit 	phy_modify_paged(phydev, 0x0a43, 0x10, BIT(2), 0);
726814c2bfdSHeiner Kallweit }
727814c2bfdSHeiner Kallweit 
rtl8168g_enable_gphy_10m(struct phy_device * phydev)728aba53204SHeiner Kallweit static void rtl8168g_enable_gphy_10m(struct phy_device *phydev)
729aba53204SHeiner Kallweit {
730aba53204SHeiner Kallweit 	phy_modify_paged(phydev, 0x0a44, 0x11, 0, BIT(11));
731aba53204SHeiner Kallweit }
732aba53204SHeiner Kallweit 
rtl8168g_phy_adjust_10m_aldps(struct phy_device * phydev)733814c2bfdSHeiner Kallweit static void rtl8168g_phy_adjust_10m_aldps(struct phy_device *phydev)
734814c2bfdSHeiner Kallweit {
735814c2bfdSHeiner Kallweit 	phy_modify_paged(phydev, 0x0bcc, 0x14, BIT(8), 0);
736814c2bfdSHeiner Kallweit 	phy_modify_paged(phydev, 0x0a44, 0x11, 0, BIT(7) | BIT(6));
737814c2bfdSHeiner Kallweit 	r8168g_phy_param(phydev, 0x8084, 0x6000, 0x0000);
738814c2bfdSHeiner Kallweit 	phy_modify_paged(phydev, 0x0a43, 0x10, 0x0000, 0x1003);
739814c2bfdSHeiner Kallweit }
740814c2bfdSHeiner Kallweit 
rtl8168g_1_hw_phy_config(struct rtl8169_private * tp,struct phy_device * phydev)741814c2bfdSHeiner Kallweit static void rtl8168g_1_hw_phy_config(struct rtl8169_private *tp,
742814c2bfdSHeiner Kallweit 				     struct phy_device *phydev)
743814c2bfdSHeiner Kallweit {
744814c2bfdSHeiner Kallweit 	int ret;
745814c2bfdSHeiner Kallweit 
746814c2bfdSHeiner Kallweit 	r8169_apply_firmware(tp);
747814c2bfdSHeiner Kallweit 
748814c2bfdSHeiner Kallweit 	ret = phy_read_paged(phydev, 0x0a46, 0x10);
749814c2bfdSHeiner Kallweit 	if (ret & BIT(8))
750814c2bfdSHeiner Kallweit 		phy_modify_paged(phydev, 0x0bcc, 0x12, BIT(15), 0);
751814c2bfdSHeiner Kallweit 	else
752814c2bfdSHeiner Kallweit 		phy_modify_paged(phydev, 0x0bcc, 0x12, 0, BIT(15));
753814c2bfdSHeiner Kallweit 
754814c2bfdSHeiner Kallweit 	ret = phy_read_paged(phydev, 0x0a46, 0x13);
755814c2bfdSHeiner Kallweit 	if (ret & BIT(8))
756814c2bfdSHeiner Kallweit 		phy_modify_paged(phydev, 0x0c41, 0x15, 0, BIT(1));
757814c2bfdSHeiner Kallweit 	else
758814c2bfdSHeiner Kallweit 		phy_modify_paged(phydev, 0x0c41, 0x15, BIT(1), 0);
759814c2bfdSHeiner Kallweit 
760814c2bfdSHeiner Kallweit 	/* Enable PHY auto speed down */
761814c2bfdSHeiner Kallweit 	phy_modify_paged(phydev, 0x0a44, 0x11, 0, BIT(3) | BIT(2));
762814c2bfdSHeiner Kallweit 
763814c2bfdSHeiner Kallweit 	rtl8168g_phy_adjust_10m_aldps(phydev);
764814c2bfdSHeiner Kallweit 
765814c2bfdSHeiner Kallweit 	/* EEE auto-fallback function */
766814c2bfdSHeiner Kallweit 	phy_modify_paged(phydev, 0x0a4b, 0x11, 0, BIT(2));
767814c2bfdSHeiner Kallweit 
768814c2bfdSHeiner Kallweit 	/* Enable UC LPF tune function */
769814c2bfdSHeiner Kallweit 	r8168g_phy_param(phydev, 0x8012, 0x0000, 0x8000);
770814c2bfdSHeiner Kallweit 
771814c2bfdSHeiner Kallweit 	phy_modify_paged(phydev, 0x0c42, 0x11, BIT(13), BIT(14));
772814c2bfdSHeiner Kallweit 
773814c2bfdSHeiner Kallweit 	/* Improve SWR Efficiency */
774814c2bfdSHeiner Kallweit 	phy_write(phydev, 0x1f, 0x0bcd);
775814c2bfdSHeiner Kallweit 	phy_write(phydev, 0x14, 0x5065);
776814c2bfdSHeiner Kallweit 	phy_write(phydev, 0x14, 0xd065);
777814c2bfdSHeiner Kallweit 	phy_write(phydev, 0x1f, 0x0bc8);
778814c2bfdSHeiner Kallweit 	phy_write(phydev, 0x11, 0x5655);
779814c2bfdSHeiner Kallweit 	phy_write(phydev, 0x1f, 0x0bcd);
780814c2bfdSHeiner Kallweit 	phy_write(phydev, 0x14, 0x1065);
781814c2bfdSHeiner Kallweit 	phy_write(phydev, 0x14, 0x9065);
782814c2bfdSHeiner Kallweit 	phy_write(phydev, 0x14, 0x1065);
783814c2bfdSHeiner Kallweit 	phy_write(phydev, 0x1f, 0x0000);
784814c2bfdSHeiner Kallweit 
785814c2bfdSHeiner Kallweit 	rtl8168g_disable_aldps(phydev);
786814c2bfdSHeiner Kallweit 	rtl8168g_config_eee_phy(phydev);
787814c2bfdSHeiner Kallweit }
788814c2bfdSHeiner Kallweit 
rtl8168g_2_hw_phy_config(struct rtl8169_private * tp,struct phy_device * phydev)789814c2bfdSHeiner Kallweit static void rtl8168g_2_hw_phy_config(struct rtl8169_private *tp,
790814c2bfdSHeiner Kallweit 				     struct phy_device *phydev)
791814c2bfdSHeiner Kallweit {
792814c2bfdSHeiner Kallweit 	r8169_apply_firmware(tp);
793814c2bfdSHeiner Kallweit 	rtl8168g_config_eee_phy(phydev);
794814c2bfdSHeiner Kallweit }
795814c2bfdSHeiner Kallweit 
rtl8168h_2_hw_phy_config(struct rtl8169_private * tp,struct phy_device * phydev)796814c2bfdSHeiner Kallweit static void rtl8168h_2_hw_phy_config(struct rtl8169_private *tp,
797814c2bfdSHeiner Kallweit 				     struct phy_device *phydev)
798814c2bfdSHeiner Kallweit {
799814c2bfdSHeiner Kallweit 	u16 ioffset, rlen;
800814c2bfdSHeiner Kallweit 	u32 data;
801814c2bfdSHeiner Kallweit 
802814c2bfdSHeiner Kallweit 	r8169_apply_firmware(tp);
803814c2bfdSHeiner Kallweit 
804814c2bfdSHeiner Kallweit 	/* CHIN EST parameter update */
805814c2bfdSHeiner Kallweit 	r8168g_phy_param(phydev, 0x808a, 0x003f, 0x000a);
806814c2bfdSHeiner Kallweit 
807814c2bfdSHeiner Kallweit 	/* enable R-tune & PGA-retune function */
808814c2bfdSHeiner Kallweit 	r8168g_phy_param(phydev, 0x0811, 0x0000, 0x0800);
809814c2bfdSHeiner Kallweit 	phy_modify_paged(phydev, 0x0a42, 0x16, 0x0000, 0x0002);
810814c2bfdSHeiner Kallweit 
811aba53204SHeiner Kallweit 	rtl8168g_enable_gphy_10m(phydev);
812814c2bfdSHeiner Kallweit 
813814c2bfdSHeiner Kallweit 	ioffset = rtl8168h_2_get_adc_bias_ioffset(tp);
814814c2bfdSHeiner Kallweit 	if (ioffset != 0xffff)
815814c2bfdSHeiner Kallweit 		phy_write_paged(phydev, 0x0bcf, 0x16, ioffset);
816814c2bfdSHeiner Kallweit 
817814c2bfdSHeiner Kallweit 	/* Modify rlen (TX LPF corner frequency) level */
818814c2bfdSHeiner Kallweit 	data = phy_read_paged(phydev, 0x0bcd, 0x16);
819814c2bfdSHeiner Kallweit 	data &= 0x000f;
820814c2bfdSHeiner Kallweit 	rlen = 0;
821814c2bfdSHeiner Kallweit 	if (data > 3)
822814c2bfdSHeiner Kallweit 		rlen = data - 3;
823814c2bfdSHeiner Kallweit 	data = rlen | (rlen << 4) | (rlen << 8) | (rlen << 12);
824814c2bfdSHeiner Kallweit 	phy_write_paged(phydev, 0x0bcd, 0x17, data);
825814c2bfdSHeiner Kallweit 
826814c2bfdSHeiner Kallweit 	/* disable phy pfm mode */
827814c2bfdSHeiner Kallweit 	phy_modify_paged(phydev, 0x0a44, 0x11, BIT(7), 0);
828814c2bfdSHeiner Kallweit 
829*33189f0aSChunHao Lin 	/* disable 10m pll off */
830*33189f0aSChunHao Lin 	phy_modify_paged(phydev, 0x0a43, 0x10, BIT(0), 0);
831*33189f0aSChunHao Lin 
832814c2bfdSHeiner Kallweit 	rtl8168g_disable_aldps(phydev);
833814c2bfdSHeiner Kallweit 	rtl8168g_config_eee_phy(phydev);
834814c2bfdSHeiner Kallweit }
835814c2bfdSHeiner Kallweit 
rtl8168ep_2_hw_phy_config(struct rtl8169_private * tp,struct phy_device * phydev)836814c2bfdSHeiner Kallweit static void rtl8168ep_2_hw_phy_config(struct rtl8169_private *tp,
837814c2bfdSHeiner Kallweit 				      struct phy_device *phydev)
838814c2bfdSHeiner Kallweit {
839814c2bfdSHeiner Kallweit 	rtl8168g_phy_adjust_10m_aldps(phydev);
840814c2bfdSHeiner Kallweit 
841814c2bfdSHeiner Kallweit 	/* Enable UC LPF tune function */
842814c2bfdSHeiner Kallweit 	r8168g_phy_param(phydev, 0x8012, 0x0000, 0x8000);
843814c2bfdSHeiner Kallweit 
844814c2bfdSHeiner Kallweit 	/* Set rg_sel_sdm_rate */
845814c2bfdSHeiner Kallweit 	phy_modify_paged(phydev, 0x0c42, 0x11, BIT(13), BIT(14));
846814c2bfdSHeiner Kallweit 
847814c2bfdSHeiner Kallweit 	/* Channel estimation parameters */
848814c2bfdSHeiner Kallweit 	r8168g_phy_param(phydev, 0x80f3, 0xff00, 0x8b00);
849814c2bfdSHeiner Kallweit 	r8168g_phy_param(phydev, 0x80f0, 0xff00, 0x3a00);
850814c2bfdSHeiner Kallweit 	r8168g_phy_param(phydev, 0x80ef, 0xff00, 0x0500);
851814c2bfdSHeiner Kallweit 	r8168g_phy_param(phydev, 0x80f6, 0xff00, 0x6e00);
852814c2bfdSHeiner Kallweit 	r8168g_phy_param(phydev, 0x80ec, 0xff00, 0x6800);
853814c2bfdSHeiner Kallweit 	r8168g_phy_param(phydev, 0x80ed, 0xff00, 0x7c00);
854814c2bfdSHeiner Kallweit 	r8168g_phy_param(phydev, 0x80f2, 0xff00, 0xf400);
855814c2bfdSHeiner Kallweit 	r8168g_phy_param(phydev, 0x80f4, 0xff00, 0x8500);
856814c2bfdSHeiner Kallweit 	r8168g_phy_param(phydev, 0x8110, 0xff00, 0xa800);
857814c2bfdSHeiner Kallweit 	r8168g_phy_param(phydev, 0x810f, 0xff00, 0x1d00);
858814c2bfdSHeiner Kallweit 	r8168g_phy_param(phydev, 0x8111, 0xff00, 0xf500);
859814c2bfdSHeiner Kallweit 	r8168g_phy_param(phydev, 0x8113, 0xff00, 0x6100);
860814c2bfdSHeiner Kallweit 	r8168g_phy_param(phydev, 0x8115, 0xff00, 0x9200);
861814c2bfdSHeiner Kallweit 	r8168g_phy_param(phydev, 0x810e, 0xff00, 0x0400);
862814c2bfdSHeiner Kallweit 	r8168g_phy_param(phydev, 0x810c, 0xff00, 0x7c00);
863814c2bfdSHeiner Kallweit 	r8168g_phy_param(phydev, 0x810b, 0xff00, 0x5a00);
864814c2bfdSHeiner Kallweit 	r8168g_phy_param(phydev, 0x80d1, 0xff00, 0xff00);
865814c2bfdSHeiner Kallweit 	r8168g_phy_param(phydev, 0x80cd, 0xff00, 0x9e00);
866814c2bfdSHeiner Kallweit 	r8168g_phy_param(phydev, 0x80d3, 0xff00, 0x0e00);
867814c2bfdSHeiner Kallweit 	r8168g_phy_param(phydev, 0x80d5, 0xff00, 0xca00);
868814c2bfdSHeiner Kallweit 	r8168g_phy_param(phydev, 0x80d7, 0xff00, 0x8400);
869814c2bfdSHeiner Kallweit 
870814c2bfdSHeiner Kallweit 	/* Force PWM-mode */
871814c2bfdSHeiner Kallweit 	phy_write(phydev, 0x1f, 0x0bcd);
872814c2bfdSHeiner Kallweit 	phy_write(phydev, 0x14, 0x5065);
873814c2bfdSHeiner Kallweit 	phy_write(phydev, 0x14, 0xd065);
874814c2bfdSHeiner Kallweit 	phy_write(phydev, 0x1f, 0x0bc8);
875814c2bfdSHeiner Kallweit 	phy_write(phydev, 0x12, 0x00ed);
876814c2bfdSHeiner Kallweit 	phy_write(phydev, 0x1f, 0x0bcd);
877814c2bfdSHeiner Kallweit 	phy_write(phydev, 0x14, 0x1065);
878814c2bfdSHeiner Kallweit 	phy_write(phydev, 0x14, 0x9065);
879814c2bfdSHeiner Kallweit 	phy_write(phydev, 0x14, 0x1065);
880814c2bfdSHeiner Kallweit 	phy_write(phydev, 0x1f, 0x0000);
881814c2bfdSHeiner Kallweit 
882814c2bfdSHeiner Kallweit 	rtl8168g_disable_aldps(phydev);
883814c2bfdSHeiner Kallweit 	rtl8168g_config_eee_phy(phydev);
884814c2bfdSHeiner Kallweit }
885814c2bfdSHeiner Kallweit 
rtl8117_hw_phy_config(struct rtl8169_private * tp,struct phy_device * phydev)886814c2bfdSHeiner Kallweit static void rtl8117_hw_phy_config(struct rtl8169_private *tp,
887814c2bfdSHeiner Kallweit 				  struct phy_device *phydev)
888814c2bfdSHeiner Kallweit {
889814c2bfdSHeiner Kallweit 	/* CHN EST parameters adjust - fnet */
890814c2bfdSHeiner Kallweit 	r8168g_phy_param(phydev, 0x808e, 0xff00, 0x4800);
891814c2bfdSHeiner Kallweit 	r8168g_phy_param(phydev, 0x8090, 0xff00, 0xcc00);
892814c2bfdSHeiner Kallweit 	r8168g_phy_param(phydev, 0x8092, 0xff00, 0xb000);
893814c2bfdSHeiner Kallweit 
894814c2bfdSHeiner Kallweit 	r8168g_phy_param(phydev, 0x8088, 0xff00, 0x6000);
895814c2bfdSHeiner Kallweit 	r8168g_phy_param(phydev, 0x808b, 0x3f00, 0x0b00);
896814c2bfdSHeiner Kallweit 	r8168g_phy_param(phydev, 0x808d, 0x1f00, 0x0600);
897814c2bfdSHeiner Kallweit 	r8168g_phy_param(phydev, 0x808c, 0xff00, 0xb000);
898814c2bfdSHeiner Kallweit 	r8168g_phy_param(phydev, 0x80a0, 0xff00, 0x2800);
899814c2bfdSHeiner Kallweit 	r8168g_phy_param(phydev, 0x80a2, 0xff00, 0x5000);
900814c2bfdSHeiner Kallweit 	r8168g_phy_param(phydev, 0x809b, 0xf800, 0xb000);
901814c2bfdSHeiner Kallweit 	r8168g_phy_param(phydev, 0x809a, 0xff00, 0x4b00);
902814c2bfdSHeiner Kallweit 	r8168g_phy_param(phydev, 0x809d, 0x3f00, 0x0800);
903814c2bfdSHeiner Kallweit 	r8168g_phy_param(phydev, 0x80a1, 0xff00, 0x7000);
904814c2bfdSHeiner Kallweit 	r8168g_phy_param(phydev, 0x809f, 0x1f00, 0x0300);
905814c2bfdSHeiner Kallweit 	r8168g_phy_param(phydev, 0x809e, 0xff00, 0x8800);
906814c2bfdSHeiner Kallweit 	r8168g_phy_param(phydev, 0x80b2, 0xff00, 0x2200);
907814c2bfdSHeiner Kallweit 	r8168g_phy_param(phydev, 0x80ad, 0xf800, 0x9800);
908814c2bfdSHeiner Kallweit 	r8168g_phy_param(phydev, 0x80af, 0x3f00, 0x0800);
909814c2bfdSHeiner Kallweit 	r8168g_phy_param(phydev, 0x80b3, 0xff00, 0x6f00);
910814c2bfdSHeiner Kallweit 	r8168g_phy_param(phydev, 0x80b1, 0x1f00, 0x0300);
911814c2bfdSHeiner Kallweit 	r8168g_phy_param(phydev, 0x80b0, 0xff00, 0x9300);
912814c2bfdSHeiner Kallweit 
913814c2bfdSHeiner Kallweit 	r8168g_phy_param(phydev, 0x8011, 0x0000, 0x0800);
914814c2bfdSHeiner Kallweit 
915aba53204SHeiner Kallweit 	rtl8168g_enable_gphy_10m(phydev);
916814c2bfdSHeiner Kallweit 
917814c2bfdSHeiner Kallweit 	r8168g_phy_param(phydev, 0x8016, 0x0000, 0x0400);
918814c2bfdSHeiner Kallweit 
919814c2bfdSHeiner Kallweit 	rtl8168g_disable_aldps(phydev);
920814c2bfdSHeiner Kallweit 	rtl8168h_config_eee_phy(phydev);
921814c2bfdSHeiner Kallweit }
922814c2bfdSHeiner Kallweit 
rtl8102e_hw_phy_config(struct rtl8169_private * tp,struct phy_device * phydev)923814c2bfdSHeiner Kallweit static void rtl8102e_hw_phy_config(struct rtl8169_private *tp,
924814c2bfdSHeiner Kallweit 				   struct phy_device *phydev)
925814c2bfdSHeiner Kallweit {
926814c2bfdSHeiner Kallweit 	static const struct phy_reg phy_reg_init[] = {
927814c2bfdSHeiner Kallweit 		{ 0x1f, 0x0003 },
928814c2bfdSHeiner Kallweit 		{ 0x08, 0x441d },
929814c2bfdSHeiner Kallweit 		{ 0x01, 0x9100 },
930814c2bfdSHeiner Kallweit 		{ 0x1f, 0x0000 }
931814c2bfdSHeiner Kallweit 	};
932814c2bfdSHeiner Kallweit 
933814c2bfdSHeiner Kallweit 	phy_set_bits(phydev, 0x11, BIT(12));
934814c2bfdSHeiner Kallweit 	phy_set_bits(phydev, 0x19, BIT(13));
935814c2bfdSHeiner Kallweit 	phy_set_bits(phydev, 0x10, BIT(15));
936814c2bfdSHeiner Kallweit 
937814c2bfdSHeiner Kallweit 	rtl_writephy_batch(phydev, phy_reg_init);
938814c2bfdSHeiner Kallweit }
939814c2bfdSHeiner Kallweit 
rtl8401_hw_phy_config(struct rtl8169_private * tp,struct phy_device * phydev)940cdafdc29SHeiner Kallweit static void rtl8401_hw_phy_config(struct rtl8169_private *tp,
941cdafdc29SHeiner Kallweit 				  struct phy_device *phydev)
942cdafdc29SHeiner Kallweit {
943cdafdc29SHeiner Kallweit 	phy_set_bits(phydev, 0x11, BIT(12));
944cdafdc29SHeiner Kallweit 	phy_modify_paged(phydev, 0x0002, 0x0f, 0x0000, 0x0003);
945cdafdc29SHeiner Kallweit }
946cdafdc29SHeiner Kallweit 
rtl8105e_hw_phy_config(struct rtl8169_private * tp,struct phy_device * phydev)947814c2bfdSHeiner Kallweit static void rtl8105e_hw_phy_config(struct rtl8169_private *tp,
948814c2bfdSHeiner Kallweit 				   struct phy_device *phydev)
949814c2bfdSHeiner Kallweit {
950814c2bfdSHeiner Kallweit 	/* Disable ALDPS before ram code */
951814c2bfdSHeiner Kallweit 	phy_write(phydev, 0x18, 0x0310);
952814c2bfdSHeiner Kallweit 	msleep(100);
953814c2bfdSHeiner Kallweit 
954814c2bfdSHeiner Kallweit 	r8169_apply_firmware(tp);
955814c2bfdSHeiner Kallweit 
956814c2bfdSHeiner Kallweit 	phy_write_paged(phydev, 0x0005, 0x1a, 0x0000);
957814c2bfdSHeiner Kallweit 	phy_write_paged(phydev, 0x0004, 0x1c, 0x0000);
958814c2bfdSHeiner Kallweit 	phy_write_paged(phydev, 0x0001, 0x15, 0x7701);
959814c2bfdSHeiner Kallweit }
960814c2bfdSHeiner Kallweit 
rtl8402_hw_phy_config(struct rtl8169_private * tp,struct phy_device * phydev)961814c2bfdSHeiner Kallweit static void rtl8402_hw_phy_config(struct rtl8169_private *tp,
962814c2bfdSHeiner Kallweit 				  struct phy_device *phydev)
963814c2bfdSHeiner Kallweit {
964814c2bfdSHeiner Kallweit 	/* Disable ALDPS before setting firmware */
965814c2bfdSHeiner Kallweit 	phy_write(phydev, 0x18, 0x0310);
966814c2bfdSHeiner Kallweit 	msleep(20);
967814c2bfdSHeiner Kallweit 
968814c2bfdSHeiner Kallweit 	r8169_apply_firmware(tp);
969814c2bfdSHeiner Kallweit 
970814c2bfdSHeiner Kallweit 	/* EEE setting */
971814c2bfdSHeiner Kallweit 	phy_write(phydev, 0x1f, 0x0004);
972814c2bfdSHeiner Kallweit 	phy_write(phydev, 0x10, 0x401f);
973814c2bfdSHeiner Kallweit 	phy_write(phydev, 0x19, 0x7030);
974814c2bfdSHeiner Kallweit 	phy_write(phydev, 0x1f, 0x0000);
975814c2bfdSHeiner Kallweit }
976814c2bfdSHeiner Kallweit 
rtl8106e_hw_phy_config(struct rtl8169_private * tp,struct phy_device * phydev)977814c2bfdSHeiner Kallweit static void rtl8106e_hw_phy_config(struct rtl8169_private *tp,
978814c2bfdSHeiner Kallweit 				   struct phy_device *phydev)
979814c2bfdSHeiner Kallweit {
980814c2bfdSHeiner Kallweit 	static const struct phy_reg phy_reg_init[] = {
981814c2bfdSHeiner Kallweit 		{ 0x1f, 0x0004 },
982814c2bfdSHeiner Kallweit 		{ 0x10, 0xc07f },
983814c2bfdSHeiner Kallweit 		{ 0x19, 0x7030 },
984814c2bfdSHeiner Kallweit 		{ 0x1f, 0x0000 }
985814c2bfdSHeiner Kallweit 	};
986814c2bfdSHeiner Kallweit 
987814c2bfdSHeiner Kallweit 	/* Disable ALDPS before ram code */
988814c2bfdSHeiner Kallweit 	phy_write(phydev, 0x18, 0x0310);
989814c2bfdSHeiner Kallweit 	msleep(100);
990814c2bfdSHeiner Kallweit 
991814c2bfdSHeiner Kallweit 	r8169_apply_firmware(tp);
992814c2bfdSHeiner Kallweit 
993814c2bfdSHeiner Kallweit 	rtl_writephy_batch(phydev, phy_reg_init);
994814c2bfdSHeiner Kallweit }
995814c2bfdSHeiner Kallweit 
rtl8125_legacy_force_mode(struct phy_device * phydev)9960439297bSHeiner Kallweit static void rtl8125_legacy_force_mode(struct phy_device *phydev)
9970439297bSHeiner Kallweit {
9980439297bSHeiner Kallweit 	phy_modify_paged(phydev, 0xa5b, 0x12, BIT(15), 0);
9990439297bSHeiner Kallweit }
10000439297bSHeiner Kallweit 
rtl8125a_2_hw_phy_config(struct rtl8169_private * tp,struct phy_device * phydev)10014640338cSHeiner Kallweit static void rtl8125a_2_hw_phy_config(struct rtl8169_private *tp,
1002814c2bfdSHeiner Kallweit 				     struct phy_device *phydev)
1003814c2bfdSHeiner Kallweit {
1004814c2bfdSHeiner Kallweit 	int i;
1005814c2bfdSHeiner Kallweit 
1006814c2bfdSHeiner Kallweit 	phy_modify_paged(phydev, 0xad4, 0x17, 0x0000, 0x0010);
1007814c2bfdSHeiner Kallweit 	phy_modify_paged(phydev, 0xad1, 0x13, 0x03ff, 0x03ff);
1008814c2bfdSHeiner Kallweit 	phy_modify_paged(phydev, 0xad3, 0x11, 0x003f, 0x0006);
1009814c2bfdSHeiner Kallweit 	phy_modify_paged(phydev, 0xac0, 0x14, 0x1100, 0x0000);
1010814c2bfdSHeiner Kallweit 	phy_modify_paged(phydev, 0xacc, 0x10, 0x0003, 0x0002);
1011814c2bfdSHeiner Kallweit 	phy_modify_paged(phydev, 0xad4, 0x10, 0x00e7, 0x0044);
1012814c2bfdSHeiner Kallweit 	phy_modify_paged(phydev, 0xac1, 0x12, 0x0080, 0x0000);
1013814c2bfdSHeiner Kallweit 	phy_modify_paged(phydev, 0xac8, 0x10, 0x0300, 0x0000);
1014814c2bfdSHeiner Kallweit 	phy_modify_paged(phydev, 0xac5, 0x17, 0x0007, 0x0002);
1015814c2bfdSHeiner Kallweit 	phy_write_paged(phydev, 0xad4, 0x16, 0x00a8);
1016814c2bfdSHeiner Kallweit 	phy_write_paged(phydev, 0xac5, 0x16, 0x01ff);
1017814c2bfdSHeiner Kallweit 	phy_modify_paged(phydev, 0xac8, 0x15, 0x00f0, 0x0030);
1018814c2bfdSHeiner Kallweit 
1019814c2bfdSHeiner Kallweit 	phy_write(phydev, 0x1f, 0x0b87);
1020814c2bfdSHeiner Kallweit 	phy_write(phydev, 0x16, 0x80a2);
1021814c2bfdSHeiner Kallweit 	phy_write(phydev, 0x17, 0x0153);
1022814c2bfdSHeiner Kallweit 	phy_write(phydev, 0x16, 0x809c);
1023814c2bfdSHeiner Kallweit 	phy_write(phydev, 0x17, 0x0153);
1024814c2bfdSHeiner Kallweit 	phy_write(phydev, 0x1f, 0x0000);
1025814c2bfdSHeiner Kallweit 
1026814c2bfdSHeiner Kallweit 	phy_write(phydev, 0x1f, 0x0a43);
1027814c2bfdSHeiner Kallweit 	phy_write(phydev, 0x13, 0x81B3);
1028814c2bfdSHeiner Kallweit 	phy_write(phydev, 0x14, 0x0043);
1029814c2bfdSHeiner Kallweit 	phy_write(phydev, 0x14, 0x00A7);
1030814c2bfdSHeiner Kallweit 	phy_write(phydev, 0x14, 0x00D6);
1031814c2bfdSHeiner Kallweit 	phy_write(phydev, 0x14, 0x00EC);
1032814c2bfdSHeiner Kallweit 	phy_write(phydev, 0x14, 0x00F6);
1033814c2bfdSHeiner Kallweit 	phy_write(phydev, 0x14, 0x00FB);
1034814c2bfdSHeiner Kallweit 	phy_write(phydev, 0x14, 0x00FD);
1035814c2bfdSHeiner Kallweit 	phy_write(phydev, 0x14, 0x00FF);
1036814c2bfdSHeiner Kallweit 	phy_write(phydev, 0x14, 0x00BB);
1037814c2bfdSHeiner Kallweit 	phy_write(phydev, 0x14, 0x0058);
1038814c2bfdSHeiner Kallweit 	phy_write(phydev, 0x14, 0x0029);
1039814c2bfdSHeiner Kallweit 	phy_write(phydev, 0x14, 0x0013);
1040814c2bfdSHeiner Kallweit 	phy_write(phydev, 0x14, 0x0009);
1041814c2bfdSHeiner Kallweit 	phy_write(phydev, 0x14, 0x0004);
1042814c2bfdSHeiner Kallweit 	phy_write(phydev, 0x14, 0x0002);
1043814c2bfdSHeiner Kallweit 	for (i = 0; i < 25; i++)
1044814c2bfdSHeiner Kallweit 		phy_write(phydev, 0x14, 0x0000);
1045814c2bfdSHeiner Kallweit 	phy_write(phydev, 0x1f, 0x0000);
1046814c2bfdSHeiner Kallweit 
1047814c2bfdSHeiner Kallweit 	r8168g_phy_param(phydev, 0x8257, 0xffff, 0x020F);
1048814c2bfdSHeiner Kallweit 	r8168g_phy_param(phydev, 0x80ea, 0xffff, 0x7843);
1049814c2bfdSHeiner Kallweit 
1050814c2bfdSHeiner Kallweit 	r8169_apply_firmware(tp);
1051814c2bfdSHeiner Kallweit 
1052814c2bfdSHeiner Kallweit 	phy_modify_paged(phydev, 0xd06, 0x14, 0x0000, 0x2000);
1053814c2bfdSHeiner Kallweit 
1054814c2bfdSHeiner Kallweit 	r8168g_phy_param(phydev, 0x81a2, 0x0000, 0x0100);
1055814c2bfdSHeiner Kallweit 
1056814c2bfdSHeiner Kallweit 	phy_modify_paged(phydev, 0xb54, 0x16, 0xff00, 0xdb00);
1057814c2bfdSHeiner Kallweit 	phy_modify_paged(phydev, 0xa45, 0x12, 0x0001, 0x0000);
1058814c2bfdSHeiner Kallweit 	phy_modify_paged(phydev, 0xa5d, 0x12, 0x0000, 0x0020);
1059814c2bfdSHeiner Kallweit 	phy_modify_paged(phydev, 0xad4, 0x17, 0x0010, 0x0000);
1060814c2bfdSHeiner Kallweit 	phy_modify_paged(phydev, 0xa86, 0x15, 0x0001, 0x0000);
1061aba53204SHeiner Kallweit 	rtl8168g_enable_gphy_10m(phydev);
1062814c2bfdSHeiner Kallweit 
10634640338cSHeiner Kallweit 	rtl8125a_config_eee_phy(phydev);
1064814c2bfdSHeiner Kallweit }
1065814c2bfdSHeiner Kallweit 
rtl8125b_hw_phy_config(struct rtl8169_private * tp,struct phy_device * phydev)10660439297bSHeiner Kallweit static void rtl8125b_hw_phy_config(struct rtl8169_private *tp,
10670439297bSHeiner Kallweit 				   struct phy_device *phydev)
10680439297bSHeiner Kallweit {
10690439297bSHeiner Kallweit 	r8169_apply_firmware(tp);
10700439297bSHeiner Kallweit 
10710439297bSHeiner Kallweit 	phy_modify_paged(phydev, 0xa44, 0x11, 0x0000, 0x0800);
10720439297bSHeiner Kallweit 	phy_modify_paged(phydev, 0xac4, 0x13, 0x00f0, 0x0090);
10730439297bSHeiner Kallweit 	phy_modify_paged(phydev, 0xad3, 0x10, 0x0003, 0x0001);
10740439297bSHeiner Kallweit 
10750439297bSHeiner Kallweit 	phy_write(phydev, 0x1f, 0x0b87);
10760439297bSHeiner Kallweit 	phy_write(phydev, 0x16, 0x80f5);
10770439297bSHeiner Kallweit 	phy_write(phydev, 0x17, 0x760e);
10780439297bSHeiner Kallweit 	phy_write(phydev, 0x16, 0x8107);
10790439297bSHeiner Kallweit 	phy_write(phydev, 0x17, 0x360e);
10800439297bSHeiner Kallweit 	phy_write(phydev, 0x16, 0x8551);
10810439297bSHeiner Kallweit 	phy_modify(phydev, 0x17, 0xff00, 0x0800);
10820439297bSHeiner Kallweit 	phy_write(phydev, 0x1f, 0x0000);
10830439297bSHeiner Kallweit 
10840439297bSHeiner Kallweit 	phy_modify_paged(phydev, 0xbf0, 0x10, 0xe000, 0xa000);
10850439297bSHeiner Kallweit 	phy_modify_paged(phydev, 0xbf4, 0x13, 0x0f00, 0x0300);
10860439297bSHeiner Kallweit 
10870439297bSHeiner Kallweit 	r8168g_phy_param(phydev, 0x8044, 0xffff, 0x2417);
10880439297bSHeiner Kallweit 	r8168g_phy_param(phydev, 0x804a, 0xffff, 0x2417);
10890439297bSHeiner Kallweit 	r8168g_phy_param(phydev, 0x8050, 0xffff, 0x2417);
10900439297bSHeiner Kallweit 	r8168g_phy_param(phydev, 0x8056, 0xffff, 0x2417);
10910439297bSHeiner Kallweit 	r8168g_phy_param(phydev, 0x805c, 0xffff, 0x2417);
10920439297bSHeiner Kallweit 	r8168g_phy_param(phydev, 0x8062, 0xffff, 0x2417);
10930439297bSHeiner Kallweit 	r8168g_phy_param(phydev, 0x8068, 0xffff, 0x2417);
10940439297bSHeiner Kallweit 	r8168g_phy_param(phydev, 0x806e, 0xffff, 0x2417);
10950439297bSHeiner Kallweit 	r8168g_phy_param(phydev, 0x8074, 0xffff, 0x2417);
10960439297bSHeiner Kallweit 	r8168g_phy_param(phydev, 0x807a, 0xffff, 0x2417);
10970439297bSHeiner Kallweit 
10980439297bSHeiner Kallweit 	phy_modify_paged(phydev, 0xa4c, 0x15, 0x0000, 0x0040);
10990439297bSHeiner Kallweit 	phy_modify_paged(phydev, 0xbf8, 0x12, 0xe000, 0xa000);
11000439297bSHeiner Kallweit 
11010439297bSHeiner Kallweit 	rtl8125_legacy_force_mode(phydev);
11020439297bSHeiner Kallweit 	rtl8125b_config_eee_phy(phydev);
11030439297bSHeiner Kallweit }
11040439297bSHeiner Kallweit 
r8169_hw_phy_config(struct rtl8169_private * tp,struct phy_device * phydev,enum mac_version ver)1105814c2bfdSHeiner Kallweit void r8169_hw_phy_config(struct rtl8169_private *tp, struct phy_device *phydev,
1106814c2bfdSHeiner Kallweit 			 enum mac_version ver)
1107814c2bfdSHeiner Kallweit {
1108814c2bfdSHeiner Kallweit 	static const rtl_phy_cfg_fct phy_configs[] = {
1109814c2bfdSHeiner Kallweit 		/* PCI devices. */
1110814c2bfdSHeiner Kallweit 		[RTL_GIGA_MAC_VER_02] = rtl8169s_hw_phy_config,
1111814c2bfdSHeiner Kallweit 		[RTL_GIGA_MAC_VER_03] = rtl8169s_hw_phy_config,
1112814c2bfdSHeiner Kallweit 		[RTL_GIGA_MAC_VER_04] = rtl8169sb_hw_phy_config,
1113814c2bfdSHeiner Kallweit 		[RTL_GIGA_MAC_VER_05] = rtl8169scd_hw_phy_config,
1114814c2bfdSHeiner Kallweit 		[RTL_GIGA_MAC_VER_06] = rtl8169sce_hw_phy_config,
1115814c2bfdSHeiner Kallweit 		/* PCI-E devices. */
1116814c2bfdSHeiner Kallweit 		[RTL_GIGA_MAC_VER_07] = rtl8102e_hw_phy_config,
1117814c2bfdSHeiner Kallweit 		[RTL_GIGA_MAC_VER_08] = rtl8102e_hw_phy_config,
1118814c2bfdSHeiner Kallweit 		[RTL_GIGA_MAC_VER_09] = rtl8102e_hw_phy_config,
1119814c2bfdSHeiner Kallweit 		[RTL_GIGA_MAC_VER_10] = NULL,
1120814c2bfdSHeiner Kallweit 		[RTL_GIGA_MAC_VER_11] = rtl8168bb_hw_phy_config,
1121cdafdc29SHeiner Kallweit 		[RTL_GIGA_MAC_VER_14] = rtl8401_hw_phy_config,
1122814c2bfdSHeiner Kallweit 		[RTL_GIGA_MAC_VER_17] = rtl8168bef_hw_phy_config,
1123814c2bfdSHeiner Kallweit 		[RTL_GIGA_MAC_VER_18] = rtl8168cp_1_hw_phy_config,
1124814c2bfdSHeiner Kallweit 		[RTL_GIGA_MAC_VER_19] = rtl8168c_1_hw_phy_config,
1125814c2bfdSHeiner Kallweit 		[RTL_GIGA_MAC_VER_20] = rtl8168c_2_hw_phy_config,
1126814c2bfdSHeiner Kallweit 		[RTL_GIGA_MAC_VER_21] = rtl8168c_3_hw_phy_config,
1127814c2bfdSHeiner Kallweit 		[RTL_GIGA_MAC_VER_22] = rtl8168c_3_hw_phy_config,
1128814c2bfdSHeiner Kallweit 		[RTL_GIGA_MAC_VER_23] = rtl8168cp_2_hw_phy_config,
1129814c2bfdSHeiner Kallweit 		[RTL_GIGA_MAC_VER_24] = rtl8168cp_2_hw_phy_config,
1130814c2bfdSHeiner Kallweit 		[RTL_GIGA_MAC_VER_25] = rtl8168d_1_hw_phy_config,
1131814c2bfdSHeiner Kallweit 		[RTL_GIGA_MAC_VER_26] = rtl8168d_2_hw_phy_config,
1132814c2bfdSHeiner Kallweit 		[RTL_GIGA_MAC_VER_28] = rtl8168d_4_hw_phy_config,
1133814c2bfdSHeiner Kallweit 		[RTL_GIGA_MAC_VER_29] = rtl8105e_hw_phy_config,
1134814c2bfdSHeiner Kallweit 		[RTL_GIGA_MAC_VER_30] = rtl8105e_hw_phy_config,
1135814c2bfdSHeiner Kallweit 		[RTL_GIGA_MAC_VER_31] = NULL,
1136814c2bfdSHeiner Kallweit 		[RTL_GIGA_MAC_VER_32] = rtl8168e_1_hw_phy_config,
1137814c2bfdSHeiner Kallweit 		[RTL_GIGA_MAC_VER_33] = rtl8168e_1_hw_phy_config,
1138814c2bfdSHeiner Kallweit 		[RTL_GIGA_MAC_VER_34] = rtl8168e_2_hw_phy_config,
1139814c2bfdSHeiner Kallweit 		[RTL_GIGA_MAC_VER_35] = rtl8168f_1_hw_phy_config,
1140814c2bfdSHeiner Kallweit 		[RTL_GIGA_MAC_VER_36] = rtl8168f_2_hw_phy_config,
1141814c2bfdSHeiner Kallweit 		[RTL_GIGA_MAC_VER_37] = rtl8402_hw_phy_config,
1142814c2bfdSHeiner Kallweit 		[RTL_GIGA_MAC_VER_38] = rtl8411_hw_phy_config,
1143814c2bfdSHeiner Kallweit 		[RTL_GIGA_MAC_VER_39] = rtl8106e_hw_phy_config,
1144814c2bfdSHeiner Kallweit 		[RTL_GIGA_MAC_VER_40] = rtl8168g_1_hw_phy_config,
1145814c2bfdSHeiner Kallweit 		[RTL_GIGA_MAC_VER_42] = rtl8168g_2_hw_phy_config,
1146814c2bfdSHeiner Kallweit 		[RTL_GIGA_MAC_VER_43] = rtl8168g_2_hw_phy_config,
1147814c2bfdSHeiner Kallweit 		[RTL_GIGA_MAC_VER_44] = rtl8168g_2_hw_phy_config,
1148814c2bfdSHeiner Kallweit 		[RTL_GIGA_MAC_VER_46] = rtl8168h_2_hw_phy_config,
1149814c2bfdSHeiner Kallweit 		[RTL_GIGA_MAC_VER_48] = rtl8168h_2_hw_phy_config,
1150814c2bfdSHeiner Kallweit 		[RTL_GIGA_MAC_VER_51] = rtl8168ep_2_hw_phy_config,
1151814c2bfdSHeiner Kallweit 		[RTL_GIGA_MAC_VER_52] = rtl8117_hw_phy_config,
1152e6d6ca6eSKai-Heng Feng 		[RTL_GIGA_MAC_VER_53] = rtl8117_hw_phy_config,
11534640338cSHeiner Kallweit 		[RTL_GIGA_MAC_VER_61] = rtl8125a_2_hw_phy_config,
11540439297bSHeiner Kallweit 		[RTL_GIGA_MAC_VER_63] = rtl8125b_hw_phy_config,
1155814c2bfdSHeiner Kallweit 	};
1156814c2bfdSHeiner Kallweit 
1157814c2bfdSHeiner Kallweit 	if (phy_configs[ver])
1158814c2bfdSHeiner Kallweit 		phy_configs[ver](tp, phydev);
1159814c2bfdSHeiner Kallweit }
1160