Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.1.
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * r8169_phy_config.c: RealTek 8169/8168/8101 ethernet driver.
   4 *
   5 * Copyright (c) 2002 ShuChen <shuchen@realtek.com.tw>
   6 * Copyright (c) 2003 - 2007 Francois Romieu <romieu@fr.zoreil.com>
   7 * Copyright (c) a lot of people too. Please respect their work.
   8 *
   9 * See MAINTAINERS file for support contact information.
  10 */
  11
  12#include <linux/delay.h>
  13#include <linux/phy.h>
  14
  15#include "r8169.h"
  16
  17typedef void (*rtl_phy_cfg_fct)(struct rtl8169_private *tp,
  18				struct phy_device *phydev);
  19
  20static void r8168d_modify_extpage(struct phy_device *phydev, int extpage,
  21				  int reg, u16 mask, u16 val)
  22{
  23	int oldpage = phy_select_page(phydev, 0x0007);
  24
  25	__phy_write(phydev, 0x1e, extpage);
  26	__phy_modify(phydev, reg, mask, val);
  27
  28	phy_restore_page(phydev, oldpage, 0);
  29}
  30
  31static void r8168d_phy_param(struct phy_device *phydev, u16 parm,
  32			     u16 mask, u16 val)
  33{
  34	int oldpage = phy_select_page(phydev, 0x0005);
  35
  36	__phy_write(phydev, 0x05, parm);
  37	__phy_modify(phydev, 0x06, mask, val);
  38
  39	phy_restore_page(phydev, oldpage, 0);
  40}
  41
  42static void r8168g_phy_param(struct phy_device *phydev, u16 parm,
  43			     u16 mask, u16 val)
  44{
  45	int oldpage = phy_select_page(phydev, 0x0a43);
  46
  47	__phy_write(phydev, 0x13, parm);
  48	__phy_modify(phydev, 0x14, mask, val);
  49
  50	phy_restore_page(phydev, oldpage, 0);
  51}
  52
  53struct phy_reg {
  54	u16 reg;
  55	u16 val;
  56};
  57
  58static void __rtl_writephy_batch(struct phy_device *phydev,
  59				 const struct phy_reg *regs, int len)
  60{
  61	phy_lock_mdio_bus(phydev);
  62
  63	while (len-- > 0) {
  64		__phy_write(phydev, regs->reg, regs->val);
  65		regs++;
  66	}
  67
  68	phy_unlock_mdio_bus(phydev);
  69}
  70
  71#define rtl_writephy_batch(p, a) __rtl_writephy_batch(p, a, ARRAY_SIZE(a))
  72
  73static void rtl8168f_config_eee_phy(struct phy_device *phydev)
  74{
  75	r8168d_modify_extpage(phydev, 0x0020, 0x15, 0, BIT(8));
  76	r8168d_phy_param(phydev, 0x8b85, 0, BIT(13));
  77}
  78
  79static void rtl8168g_config_eee_phy(struct phy_device *phydev)
  80{
  81	phy_modify_paged(phydev, 0x0a43, 0x11, 0, BIT(4));
  82}
  83
  84static void rtl8168h_config_eee_phy(struct phy_device *phydev)
  85{
  86	rtl8168g_config_eee_phy(phydev);
  87
  88	phy_modify_paged(phydev, 0xa4a, 0x11, 0x0000, 0x0200);
  89	phy_modify_paged(phydev, 0xa42, 0x14, 0x0000, 0x0080);
  90}
  91
  92static void rtl8125a_config_eee_phy(struct phy_device *phydev)
  93{
  94	rtl8168h_config_eee_phy(phydev);
  95
  96	phy_modify_paged(phydev, 0xa6d, 0x12, 0x0001, 0x0000);
  97	phy_modify_paged(phydev, 0xa6d, 0x14, 0x0010, 0x0000);
  98}
  99
 100static void rtl8125b_config_eee_phy(struct phy_device *phydev)
 101{
 102	phy_modify_paged(phydev, 0xa6d, 0x12, 0x0001, 0x0000);
 103	phy_modify_paged(phydev, 0xa6d, 0x14, 0x0010, 0x0000);
 104	phy_modify_paged(phydev, 0xa42, 0x14, 0x0080, 0x0000);
 105	phy_modify_paged(phydev, 0xa4a, 0x11, 0x0200, 0x0000);
 106}
 107
 108static void rtl8169s_hw_phy_config(struct rtl8169_private *tp,
 109				   struct phy_device *phydev)
 110{
 111	static const struct phy_reg phy_reg_init[] = {
 112		{ 0x1f, 0x0001 },
 113		{ 0x06, 0x006e },
 114		{ 0x08, 0x0708 },
 115		{ 0x15, 0x4000 },
 116		{ 0x18, 0x65c7 },
 117
 118		{ 0x1f, 0x0001 },
 119		{ 0x03, 0x00a1 },
 120		{ 0x02, 0x0008 },
 121		{ 0x01, 0x0120 },
 122		{ 0x00, 0x1000 },
 123		{ 0x04, 0x0800 },
 124		{ 0x04, 0x0000 },
 125
 126		{ 0x03, 0xff41 },
 127		{ 0x02, 0xdf60 },
 128		{ 0x01, 0x0140 },
 129		{ 0x00, 0x0077 },
 130		{ 0x04, 0x7800 },
 131		{ 0x04, 0x7000 },
 132
 133		{ 0x03, 0x802f },
 134		{ 0x02, 0x4f02 },
 135		{ 0x01, 0x0409 },
 136		{ 0x00, 0xf0f9 },
 137		{ 0x04, 0x9800 },
 138		{ 0x04, 0x9000 },
 139
 140		{ 0x03, 0xdf01 },
 141		{ 0x02, 0xdf20 },
 142		{ 0x01, 0xff95 },
 143		{ 0x00, 0xba00 },
 144		{ 0x04, 0xa800 },
 145		{ 0x04, 0xa000 },
 146
 147		{ 0x03, 0xff41 },
 148		{ 0x02, 0xdf20 },
 149		{ 0x01, 0x0140 },
 150		{ 0x00, 0x00bb },
 151		{ 0x04, 0xb800 },
 152		{ 0x04, 0xb000 },
 153
 154		{ 0x03, 0xdf41 },
 155		{ 0x02, 0xdc60 },
 156		{ 0x01, 0x6340 },
 157		{ 0x00, 0x007d },
 158		{ 0x04, 0xd800 },
 159		{ 0x04, 0xd000 },
 160
 161		{ 0x03, 0xdf01 },
 162		{ 0x02, 0xdf20 },
 163		{ 0x01, 0x100a },
 164		{ 0x00, 0xa0ff },
 165		{ 0x04, 0xf800 },
 166		{ 0x04, 0xf000 },
 167
 168		{ 0x1f, 0x0000 },
 169		{ 0x0b, 0x0000 },
 170		{ 0x00, 0x9200 }
 171	};
 172
 173	rtl_writephy_batch(phydev, phy_reg_init);
 174}
 175
 176static void rtl8169sb_hw_phy_config(struct rtl8169_private *tp,
 177				    struct phy_device *phydev)
 178{
 179	phy_write_paged(phydev, 0x0002, 0x01, 0x90d0);
 180}
 181
 182static void rtl8169scd_hw_phy_config(struct rtl8169_private *tp,
 183				     struct phy_device *phydev)
 184{
 185	static const struct phy_reg phy_reg_init[] = {
 186		{ 0x1f, 0x0001 },
 187		{ 0x04, 0x0000 },
 188		{ 0x03, 0x00a1 },
 189		{ 0x02, 0x0008 },
 190		{ 0x01, 0x0120 },
 191		{ 0x00, 0x1000 },
 192		{ 0x04, 0x0800 },
 193		{ 0x04, 0x9000 },
 194		{ 0x03, 0x802f },
 195		{ 0x02, 0x4f02 },
 196		{ 0x01, 0x0409 },
 197		{ 0x00, 0xf099 },
 198		{ 0x04, 0x9800 },
 199		{ 0x04, 0xa000 },
 200		{ 0x03, 0xdf01 },
 201		{ 0x02, 0xdf20 },
 202		{ 0x01, 0xff95 },
 203		{ 0x00, 0xba00 },
 204		{ 0x04, 0xa800 },
 205		{ 0x04, 0xf000 },
 206		{ 0x03, 0xdf01 },
 207		{ 0x02, 0xdf20 },
 208		{ 0x01, 0x101a },
 209		{ 0x00, 0xa0ff },
 210		{ 0x04, 0xf800 },
 211		{ 0x04, 0x0000 },
 212		{ 0x1f, 0x0000 },
 213
 214		{ 0x1f, 0x0001 },
 215		{ 0x10, 0xf41b },
 216		{ 0x14, 0xfb54 },
 217		{ 0x18, 0xf5c7 },
 218		{ 0x1f, 0x0000 },
 219
 220		{ 0x1f, 0x0001 },
 221		{ 0x17, 0x0cc0 },
 222		{ 0x1f, 0x0000 }
 223	};
 224
 225	rtl_writephy_batch(phydev, phy_reg_init);
 226}
 227
 228static void rtl8169sce_hw_phy_config(struct rtl8169_private *tp,
 229				     struct phy_device *phydev)
 230{
 231	static const struct phy_reg phy_reg_init[] = {
 232		{ 0x1f, 0x0001 },
 233		{ 0x04, 0x0000 },
 234		{ 0x03, 0x00a1 },
 235		{ 0x02, 0x0008 },
 236		{ 0x01, 0x0120 },
 237		{ 0x00, 0x1000 },
 238		{ 0x04, 0x0800 },
 239		{ 0x04, 0x9000 },
 240		{ 0x03, 0x802f },
 241		{ 0x02, 0x4f02 },
 242		{ 0x01, 0x0409 },
 243		{ 0x00, 0xf099 },
 244		{ 0x04, 0x9800 },
 245		{ 0x04, 0xa000 },
 246		{ 0x03, 0xdf01 },
 247		{ 0x02, 0xdf20 },
 248		{ 0x01, 0xff95 },
 249		{ 0x00, 0xba00 },
 250		{ 0x04, 0xa800 },
 251		{ 0x04, 0xf000 },
 252		{ 0x03, 0xdf01 },
 253		{ 0x02, 0xdf20 },
 254		{ 0x01, 0x101a },
 255		{ 0x00, 0xa0ff },
 256		{ 0x04, 0xf800 },
 257		{ 0x04, 0x0000 },
 258		{ 0x1f, 0x0000 },
 259
 260		{ 0x1f, 0x0001 },
 261		{ 0x0b, 0x8480 },
 262		{ 0x1f, 0x0000 },
 263
 264		{ 0x1f, 0x0001 },
 265		{ 0x18, 0x67c7 },
 266		{ 0x04, 0x2000 },
 267		{ 0x03, 0x002f },
 268		{ 0x02, 0x4360 },
 269		{ 0x01, 0x0109 },
 270		{ 0x00, 0x3022 },
 271		{ 0x04, 0x2800 },
 272		{ 0x1f, 0x0000 },
 273
 274		{ 0x1f, 0x0001 },
 275		{ 0x17, 0x0cc0 },
 276		{ 0x1f, 0x0000 }
 277	};
 278
 279	rtl_writephy_batch(phydev, phy_reg_init);
 280}
 281
 282static void rtl8168bb_hw_phy_config(struct rtl8169_private *tp,
 283				    struct phy_device *phydev)
 284{
 285	phy_write(phydev, 0x1f, 0x0001);
 286	phy_set_bits(phydev, 0x16, BIT(0));
 287	phy_write(phydev, 0x10, 0xf41b);
 288	phy_write(phydev, 0x1f, 0x0000);
 289}
 290
 291static void rtl8168bef_hw_phy_config(struct rtl8169_private *tp,
 292				     struct phy_device *phydev)
 293{
 294	phy_write_paged(phydev, 0x0001, 0x10, 0xf41b);
 295}
 296
 297static void rtl8168cp_1_hw_phy_config(struct rtl8169_private *tp,
 298				      struct phy_device *phydev)
 299{
 300	phy_write(phydev, 0x1d, 0x0f00);
 301	phy_write_paged(phydev, 0x0002, 0x0c, 0x1ec8);
 302}
 303
 304static void rtl8168cp_2_hw_phy_config(struct rtl8169_private *tp,
 305				      struct phy_device *phydev)
 306{
 307	phy_set_bits(phydev, 0x14, BIT(5));
 308	phy_set_bits(phydev, 0x0d, BIT(5));
 309	phy_write_paged(phydev, 0x0001, 0x1d, 0x3d98);
 310}
 311
 312static void rtl8168c_1_hw_phy_config(struct rtl8169_private *tp,
 313				     struct phy_device *phydev)
 314{
 315	static const struct phy_reg phy_reg_init[] = {
 316		{ 0x1f, 0x0001 },
 317		{ 0x12, 0x2300 },
 318		{ 0x1f, 0x0002 },
 319		{ 0x00, 0x88d4 },
 320		{ 0x01, 0x82b1 },
 321		{ 0x03, 0x7002 },
 322		{ 0x08, 0x9e30 },
 323		{ 0x09, 0x01f0 },
 324		{ 0x0a, 0x5500 },
 325		{ 0x0c, 0x00c8 },
 326		{ 0x1f, 0x0003 },
 327		{ 0x12, 0xc096 },
 328		{ 0x16, 0x000a },
 329		{ 0x1f, 0x0000 },
 330		{ 0x1f, 0x0000 },
 331		{ 0x09, 0x2000 },
 332		{ 0x09, 0x0000 }
 333	};
 334
 335	rtl_writephy_batch(phydev, phy_reg_init);
 336
 337	phy_set_bits(phydev, 0x14, BIT(5));
 338	phy_set_bits(phydev, 0x0d, BIT(5));
 339}
 340
 341static void rtl8168c_2_hw_phy_config(struct rtl8169_private *tp,
 342				     struct phy_device *phydev)
 343{
 344	static const struct phy_reg phy_reg_init[] = {
 345		{ 0x1f, 0x0001 },
 346		{ 0x12, 0x2300 },
 347		{ 0x03, 0x802f },
 348		{ 0x02, 0x4f02 },
 349		{ 0x01, 0x0409 },
 350		{ 0x00, 0xf099 },
 351		{ 0x04, 0x9800 },
 352		{ 0x04, 0x9000 },
 353		{ 0x1d, 0x3d98 },
 354		{ 0x1f, 0x0002 },
 355		{ 0x0c, 0x7eb8 },
 356		{ 0x06, 0x0761 },
 357		{ 0x1f, 0x0003 },
 358		{ 0x16, 0x0f0a },
 359		{ 0x1f, 0x0000 }
 360	};
 361
 362	rtl_writephy_batch(phydev, phy_reg_init);
 363
 364	phy_set_bits(phydev, 0x16, BIT(0));
 365	phy_set_bits(phydev, 0x14, BIT(5));
 366	phy_set_bits(phydev, 0x0d, BIT(5));
 367}
 368
 369static void rtl8168c_3_hw_phy_config(struct rtl8169_private *tp,
 370				     struct phy_device *phydev)
 371{
 372	static const struct phy_reg phy_reg_init[] = {
 373		{ 0x1f, 0x0001 },
 374		{ 0x12, 0x2300 },
 375		{ 0x1d, 0x3d98 },
 376		{ 0x1f, 0x0002 },
 377		{ 0x0c, 0x7eb8 },
 378		{ 0x06, 0x5461 },
 379		{ 0x1f, 0x0003 },
 380		{ 0x16, 0x0f0a },
 381		{ 0x1f, 0x0000 }
 382	};
 383
 384	rtl_writephy_batch(phydev, phy_reg_init);
 385
 386	phy_set_bits(phydev, 0x16, BIT(0));
 387	phy_set_bits(phydev, 0x14, BIT(5));
 388	phy_set_bits(phydev, 0x0d, BIT(5));
 389}
 390
 391static const struct phy_reg rtl8168d_1_phy_reg_init_0[] = {
 392	/* Channel Estimation */
 393	{ 0x1f, 0x0001 },
 394	{ 0x06, 0x4064 },
 395	{ 0x07, 0x2863 },
 396	{ 0x08, 0x059c },
 397	{ 0x09, 0x26b4 },
 398	{ 0x0a, 0x6a19 },
 399	{ 0x0b, 0xdcc8 },
 400	{ 0x10, 0xf06d },
 401	{ 0x14, 0x7f68 },
 402	{ 0x18, 0x7fd9 },
 403	{ 0x1c, 0xf0ff },
 404	{ 0x1d, 0x3d9c },
 405	{ 0x1f, 0x0003 },
 406	{ 0x12, 0xf49f },
 407	{ 0x13, 0x070b },
 408	{ 0x1a, 0x05ad },
 409	{ 0x14, 0x94c0 },
 410
 411	/*
 412	 * Tx Error Issue
 413	 * Enhance line driver power
 414	 */
 415	{ 0x1f, 0x0002 },
 416	{ 0x06, 0x5561 },
 417	{ 0x1f, 0x0005 },
 418	{ 0x05, 0x8332 },
 419	{ 0x06, 0x5561 },
 420
 421	/*
 422	 * Can not link to 1Gbps with bad cable
 423	 * Decrease SNR threshold form 21.07dB to 19.04dB
 424	 */
 425	{ 0x1f, 0x0001 },
 426	{ 0x17, 0x0cc0 },
 427
 428	{ 0x1f, 0x0000 },
 429	{ 0x0d, 0xf880 }
 430};
 431
 432static void rtl8168d_apply_firmware_cond(struct rtl8169_private *tp,
 433					 struct phy_device *phydev,
 434					 u16 val)
 435{
 436	u16 reg_val;
 437
 438	phy_write(phydev, 0x1f, 0x0005);
 439	phy_write(phydev, 0x05, 0x001b);
 440	reg_val = phy_read(phydev, 0x06);
 441	phy_write(phydev, 0x1f, 0x0000);
 442
 443	if (reg_val != val)
 444		phydev_warn(phydev, "chipset not ready for firmware\n");
 445	else
 446		r8169_apply_firmware(tp);
 447}
 448
 449static void rtl8168d_1_common(struct phy_device *phydev)
 450{
 451	u16 val;
 452
 453	phy_write_paged(phydev, 0x0002, 0x05, 0x669a);
 454	r8168d_phy_param(phydev, 0x8330, 0xffff, 0x669a);
 455	phy_write(phydev, 0x1f, 0x0002);
 456
 457	val = phy_read(phydev, 0x0d);
 458
 459	if ((val & 0x00ff) != 0x006c) {
 460		static const u16 set[] = {
 461			0x0065, 0x0066, 0x0067, 0x0068,
 462			0x0069, 0x006a, 0x006b, 0x006c
 463		};
 464		int i;
 465
 466		val &= 0xff00;
 467		for (i = 0; i < ARRAY_SIZE(set); i++)
 468			phy_write(phydev, 0x0d, val | set[i]);
 469	}
 470}
 471
 472static void rtl8168d_1_hw_phy_config(struct rtl8169_private *tp,
 473				     struct phy_device *phydev)
 474{
 475	rtl_writephy_batch(phydev, rtl8168d_1_phy_reg_init_0);
 476
 477	/*
 478	 * Rx Error Issue
 479	 * Fine Tune Switching regulator parameter
 480	 */
 481	phy_write(phydev, 0x1f, 0x0002);
 482	phy_modify(phydev, 0x0b, 0x00ef, 0x0010);
 483	phy_modify(phydev, 0x0c, 0x5d00, 0xa200);
 484
 485	if (rtl8168d_efuse_read(tp, 0x01) == 0xb1) {
 486		rtl8168d_1_common(phydev);
 487	} else {
 488		phy_write_paged(phydev, 0x0002, 0x05, 0x6662);
 489		r8168d_phy_param(phydev, 0x8330, 0xffff, 0x6662);
 490	}
 491
 492	/* RSET couple improve */
 493	phy_write(phydev, 0x1f, 0x0002);
 494	phy_set_bits(phydev, 0x0d, 0x0300);
 495	phy_set_bits(phydev, 0x0f, 0x0010);
 496
 497	/* Fine tune PLL performance */
 498	phy_write(phydev, 0x1f, 0x0002);
 499	phy_modify(phydev, 0x02, 0x0600, 0x0100);
 500	phy_clear_bits(phydev, 0x03, 0xe000);
 501	phy_write(phydev, 0x1f, 0x0000);
 502
 503	rtl8168d_apply_firmware_cond(tp, phydev, 0xbf00);
 504}
 505
 506static void rtl8168d_2_hw_phy_config(struct rtl8169_private *tp,
 507				     struct phy_device *phydev)
 508{
 509	rtl_writephy_batch(phydev, rtl8168d_1_phy_reg_init_0);
 510
 511	if (rtl8168d_efuse_read(tp, 0x01) == 0xb1) {
 512		rtl8168d_1_common(phydev);
 513	} else {
 514		phy_write_paged(phydev, 0x0002, 0x05, 0x2642);
 515		r8168d_phy_param(phydev, 0x8330, 0xffff, 0x2642);
 516	}
 517
 518	/* Fine tune PLL performance */
 519	phy_write(phydev, 0x1f, 0x0002);
 520	phy_modify(phydev, 0x02, 0x0600, 0x0100);
 521	phy_clear_bits(phydev, 0x03, 0xe000);
 522	phy_write(phydev, 0x1f, 0x0000);
 523
 524	/* Switching regulator Slew rate */
 525	phy_modify_paged(phydev, 0x0002, 0x0f, 0x0000, 0x0017);
 526
 527	rtl8168d_apply_firmware_cond(tp, phydev, 0xb300);
 528}
 529
 530static void rtl8168d_4_hw_phy_config(struct rtl8169_private *tp,
 531				     struct phy_device *phydev)
 532{
 533	phy_write_paged(phydev, 0x0001, 0x17, 0x0cc0);
 534	r8168d_modify_extpage(phydev, 0x002d, 0x18, 0xffff, 0x0040);
 535	phy_set_bits(phydev, 0x0d, BIT(5));
 536}
 537
 538static void rtl8168e_1_hw_phy_config(struct rtl8169_private *tp,
 539				     struct phy_device *phydev)
 540{
 541	static const struct phy_reg phy_reg_init[] = {
 542		/* Channel estimation fine tune */
 543		{ 0x1f, 0x0001 },
 544		{ 0x0b, 0x6c20 },
 545		{ 0x07, 0x2872 },
 546		{ 0x1c, 0xefff },
 547		{ 0x1f, 0x0003 },
 548		{ 0x14, 0x6420 },
 549		{ 0x1f, 0x0000 },
 550	};
 551
 552	r8169_apply_firmware(tp);
 553
 554	/* Enable Delay cap */
 555	r8168d_phy_param(phydev, 0x8b80, 0xffff, 0xc896);
 556
 557	rtl_writephy_batch(phydev, phy_reg_init);
 558
 559	/* Update PFM & 10M TX idle timer */
 560	r8168d_modify_extpage(phydev, 0x002f, 0x15, 0xffff, 0x1919);
 561
 562	r8168d_modify_extpage(phydev, 0x00ac, 0x18, 0xffff, 0x0006);
 563
 564	/* DCO enable for 10M IDLE Power */
 565	r8168d_modify_extpage(phydev, 0x0023, 0x17, 0x0000, 0x0006);
 566
 567	/* For impedance matching */
 568	phy_modify_paged(phydev, 0x0002, 0x08, 0x7f00, 0x8000);
 569
 570	/* PHY auto speed down */
 571	r8168d_modify_extpage(phydev, 0x002d, 0x18, 0x0000, 0x0050);
 572	phy_set_bits(phydev, 0x14, BIT(15));
 573
 574	r8168d_phy_param(phydev, 0x8b86, 0x0000, 0x0001);
 575	r8168d_phy_param(phydev, 0x8b85, 0x2000, 0x0000);
 576
 577	r8168d_modify_extpage(phydev, 0x0020, 0x15, 0x1100, 0x0000);
 578	phy_write_paged(phydev, 0x0006, 0x00, 0x5a00);
 579
 580	phy_write_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_ADV, 0x0000);
 581}
 582
 583static void rtl8168e_2_hw_phy_config(struct rtl8169_private *tp,
 584				     struct phy_device *phydev)
 585{
 586	r8169_apply_firmware(tp);
 587
 588	/* Enable Delay cap */
 589	r8168d_modify_extpage(phydev, 0x00ac, 0x18, 0xffff, 0x0006);
 590
 591	/* Channel estimation fine tune */
 592	phy_write_paged(phydev, 0x0003, 0x09, 0xa20f);
 593
 594	/* Green Setting */
 595	r8168d_phy_param(phydev, 0x8b5b, 0xffff, 0x9222);
 596	r8168d_phy_param(phydev, 0x8b6d, 0xffff, 0x8000);
 597	r8168d_phy_param(phydev, 0x8b76, 0xffff, 0x8000);
 598
 599	/* For 4-corner performance improve */
 600	phy_write(phydev, 0x1f, 0x0005);
 601	phy_write(phydev, 0x05, 0x8b80);
 602	phy_set_bits(phydev, 0x17, 0x0006);
 603	phy_write(phydev, 0x1f, 0x0000);
 604
 605	/* PHY auto speed down */
 606	r8168d_modify_extpage(phydev, 0x002d, 0x18, 0x0000, 0x0010);
 607	phy_set_bits(phydev, 0x14, BIT(15));
 608
 609	/* improve 10M EEE waveform */
 610	r8168d_phy_param(phydev, 0x8b86, 0x0000, 0x0001);
 611
 612	/* Improve 2-pair detection performance */
 613	r8168d_phy_param(phydev, 0x8b85, 0x0000, 0x4000);
 614
 615	rtl8168f_config_eee_phy(phydev);
 616
 617	/* Green feature */
 618	phy_write(phydev, 0x1f, 0x0003);
 619	phy_set_bits(phydev, 0x19, BIT(0));
 620	phy_set_bits(phydev, 0x10, BIT(10));
 621	phy_write(phydev, 0x1f, 0x0000);
 622	phy_modify_paged(phydev, 0x0005, 0x01, 0, BIT(8));
 623}
 624
 625static void rtl8168f_hw_phy_config(struct rtl8169_private *tp,
 626				   struct phy_device *phydev)
 627{
 628	/* For 4-corner performance improve */
 629	r8168d_phy_param(phydev, 0x8b80, 0x0000, 0x0006);
 630
 631	/* PHY auto speed down */
 632	r8168d_modify_extpage(phydev, 0x002d, 0x18, 0x0000, 0x0010);
 633	phy_set_bits(phydev, 0x14, BIT(15));
 634
 635	/* Improve 10M EEE waveform */
 636	r8168d_phy_param(phydev, 0x8b86, 0x0000, 0x0001);
 637
 638	rtl8168f_config_eee_phy(phydev);
 639}
 640
 641static void rtl8168f_1_hw_phy_config(struct rtl8169_private *tp,
 642				     struct phy_device *phydev)
 643{
 644	r8169_apply_firmware(tp);
 645
 646	/* Channel estimation fine tune */
 647	phy_write_paged(phydev, 0x0003, 0x09, 0xa20f);
 648
 649	/* Modify green table for giga & fnet */
 650	r8168d_phy_param(phydev, 0x8b55, 0xffff, 0x0000);
 651	r8168d_phy_param(phydev, 0x8b5e, 0xffff, 0x0000);
 652	r8168d_phy_param(phydev, 0x8b67, 0xffff, 0x0000);
 653	r8168d_phy_param(phydev, 0x8b70, 0xffff, 0x0000);
 654	r8168d_modify_extpage(phydev, 0x0078, 0x17, 0xffff, 0x0000);
 655	r8168d_modify_extpage(phydev, 0x0078, 0x19, 0xffff, 0x00fb);
 656
 657	/* Modify green table for 10M */
 658	r8168d_phy_param(phydev, 0x8b79, 0xffff, 0xaa00);
 659
 660	/* Disable hiimpedance detection (RTCT) */
 661	phy_write_paged(phydev, 0x0003, 0x01, 0x328a);
 662
 663	rtl8168f_hw_phy_config(tp, phydev);
 664
 665	/* Improve 2-pair detection performance */
 666	r8168d_phy_param(phydev, 0x8b85, 0x0000, 0x4000);
 667}
 668
 669static void rtl8168f_2_hw_phy_config(struct rtl8169_private *tp,
 670				     struct phy_device *phydev)
 671{
 672	r8169_apply_firmware(tp);
 673
 674	rtl8168f_hw_phy_config(tp, phydev);
 675}
 676
 677static void rtl8411_hw_phy_config(struct rtl8169_private *tp,
 678				  struct phy_device *phydev)
 679{
 680	r8169_apply_firmware(tp);
 681
 682	rtl8168f_hw_phy_config(tp, phydev);
 683
 684	/* Improve 2-pair detection performance */
 685	r8168d_phy_param(phydev, 0x8b85, 0x0000, 0x4000);
 686
 687	/* Channel estimation fine tune */
 688	phy_write_paged(phydev, 0x0003, 0x09, 0xa20f);
 689
 690	/* Modify green table for giga & fnet */
 691	r8168d_phy_param(phydev, 0x8b55, 0xffff, 0x0000);
 692	r8168d_phy_param(phydev, 0x8b5e, 0xffff, 0x0000);
 693	r8168d_phy_param(phydev, 0x8b67, 0xffff, 0x0000);
 694	r8168d_phy_param(phydev, 0x8b70, 0xffff, 0x0000);
 695	r8168d_modify_extpage(phydev, 0x0078, 0x17, 0xffff, 0x0000);
 696	r8168d_modify_extpage(phydev, 0x0078, 0x19, 0xffff, 0x00aa);
 697
 698	/* Modify green table for 10M */
 699	r8168d_phy_param(phydev, 0x8b79, 0xffff, 0xaa00);
 700
 701	/* Disable hiimpedance detection (RTCT) */
 702	phy_write_paged(phydev, 0x0003, 0x01, 0x328a);
 703
 704	/* Modify green table for giga */
 705	r8168d_phy_param(phydev, 0x8b54, 0x0800, 0x0000);
 706	r8168d_phy_param(phydev, 0x8b5d, 0x0800, 0x0000);
 707	r8168d_phy_param(phydev, 0x8a7c, 0x0100, 0x0000);
 708	r8168d_phy_param(phydev, 0x8a7f, 0x0000, 0x0100);
 709	r8168d_phy_param(phydev, 0x8a82, 0x0100, 0x0000);
 710	r8168d_phy_param(phydev, 0x8a85, 0x0100, 0x0000);
 711	r8168d_phy_param(phydev, 0x8a88, 0x0100, 0x0000);
 712
 713	/* uc same-seed solution */
 714	r8168d_phy_param(phydev, 0x8b85, 0x0000, 0x8000);
 715
 716	/* Green feature */
 717	phy_write(phydev, 0x1f, 0x0003);
 718	phy_clear_bits(phydev, 0x19, BIT(0));
 719	phy_clear_bits(phydev, 0x10, BIT(10));
 720	phy_write(phydev, 0x1f, 0x0000);
 721}
 722
 723static void rtl8168g_disable_aldps(struct phy_device *phydev)
 724{
 725	phy_modify_paged(phydev, 0x0a43, 0x10, BIT(2), 0);
 726}
 727
 728static void rtl8168g_enable_gphy_10m(struct phy_device *phydev)
 729{
 730	phy_modify_paged(phydev, 0x0a44, 0x11, 0, BIT(11));
 731}
 732
 733static void rtl8168g_phy_adjust_10m_aldps(struct phy_device *phydev)
 734{
 735	phy_modify_paged(phydev, 0x0bcc, 0x14, BIT(8), 0);
 736	phy_modify_paged(phydev, 0x0a44, 0x11, 0, BIT(7) | BIT(6));
 737	r8168g_phy_param(phydev, 0x8084, 0x6000, 0x0000);
 738	phy_modify_paged(phydev, 0x0a43, 0x10, 0x0000, 0x1003);
 739}
 740
 741static void rtl8168g_1_hw_phy_config(struct rtl8169_private *tp,
 742				     struct phy_device *phydev)
 743{
 744	int ret;
 745
 746	r8169_apply_firmware(tp);
 747
 748	ret = phy_read_paged(phydev, 0x0a46, 0x10);
 749	if (ret & BIT(8))
 750		phy_modify_paged(phydev, 0x0bcc, 0x12, BIT(15), 0);
 751	else
 752		phy_modify_paged(phydev, 0x0bcc, 0x12, 0, BIT(15));
 753
 754	ret = phy_read_paged(phydev, 0x0a46, 0x13);
 755	if (ret & BIT(8))
 756		phy_modify_paged(phydev, 0x0c41, 0x15, 0, BIT(1));
 757	else
 758		phy_modify_paged(phydev, 0x0c41, 0x15, BIT(1), 0);
 759
 760	/* Enable PHY auto speed down */
 761	phy_modify_paged(phydev, 0x0a44, 0x11, 0, BIT(3) | BIT(2));
 762
 763	rtl8168g_phy_adjust_10m_aldps(phydev);
 764
 765	/* EEE auto-fallback function */
 766	phy_modify_paged(phydev, 0x0a4b, 0x11, 0, BIT(2));
 767
 768	/* Enable UC LPF tune function */
 769	r8168g_phy_param(phydev, 0x8012, 0x0000, 0x8000);
 770
 771	phy_modify_paged(phydev, 0x0c42, 0x11, BIT(13), BIT(14));
 772
 773	/* Improve SWR Efficiency */
 774	phy_write(phydev, 0x1f, 0x0bcd);
 775	phy_write(phydev, 0x14, 0x5065);
 776	phy_write(phydev, 0x14, 0xd065);
 777	phy_write(phydev, 0x1f, 0x0bc8);
 778	phy_write(phydev, 0x11, 0x5655);
 779	phy_write(phydev, 0x1f, 0x0bcd);
 780	phy_write(phydev, 0x14, 0x1065);
 781	phy_write(phydev, 0x14, 0x9065);
 782	phy_write(phydev, 0x14, 0x1065);
 783	phy_write(phydev, 0x1f, 0x0000);
 784
 785	rtl8168g_disable_aldps(phydev);
 786	rtl8168g_config_eee_phy(phydev);
 787}
 788
 789static void rtl8168g_2_hw_phy_config(struct rtl8169_private *tp,
 790				     struct phy_device *phydev)
 791{
 792	r8169_apply_firmware(tp);
 793	rtl8168g_config_eee_phy(phydev);
 794}
 795
 796static void rtl8168h_2_hw_phy_config(struct rtl8169_private *tp,
 797				     struct phy_device *phydev)
 798{
 799	u16 ioffset, rlen;
 800	u32 data;
 801
 802	r8169_apply_firmware(tp);
 803
 804	/* CHIN EST parameter update */
 805	r8168g_phy_param(phydev, 0x808a, 0x003f, 0x000a);
 806
 807	/* enable R-tune & PGA-retune function */
 808	r8168g_phy_param(phydev, 0x0811, 0x0000, 0x0800);
 809	phy_modify_paged(phydev, 0x0a42, 0x16, 0x0000, 0x0002);
 810
 811	rtl8168g_enable_gphy_10m(phydev);
 812
 813	ioffset = rtl8168h_2_get_adc_bias_ioffset(tp);
 814	if (ioffset != 0xffff)
 815		phy_write_paged(phydev, 0x0bcf, 0x16, ioffset);
 816
 817	/* Modify rlen (TX LPF corner frequency) level */
 818	data = phy_read_paged(phydev, 0x0bcd, 0x16);
 819	data &= 0x000f;
 820	rlen = 0;
 821	if (data > 3)
 822		rlen = data - 3;
 823	data = rlen | (rlen << 4) | (rlen << 8) | (rlen << 12);
 824	phy_write_paged(phydev, 0x0bcd, 0x17, data);
 825
 826	/* disable phy pfm mode */
 827	phy_modify_paged(phydev, 0x0a44, 0x11, BIT(7), 0);
 828
 829	/* disable 10m pll off */
 830	phy_modify_paged(phydev, 0x0a43, 0x10, BIT(0), 0);
 831
 832	rtl8168g_disable_aldps(phydev);
 833	rtl8168g_config_eee_phy(phydev);
 834}
 835
 836static void rtl8168ep_2_hw_phy_config(struct rtl8169_private *tp,
 837				      struct phy_device *phydev)
 838{
 839	rtl8168g_phy_adjust_10m_aldps(phydev);
 840
 841	/* Enable UC LPF tune function */
 842	r8168g_phy_param(phydev, 0x8012, 0x0000, 0x8000);
 843
 844	/* Set rg_sel_sdm_rate */
 845	phy_modify_paged(phydev, 0x0c42, 0x11, BIT(13), BIT(14));
 846
 847	/* Channel estimation parameters */
 848	r8168g_phy_param(phydev, 0x80f3, 0xff00, 0x8b00);
 849	r8168g_phy_param(phydev, 0x80f0, 0xff00, 0x3a00);
 850	r8168g_phy_param(phydev, 0x80ef, 0xff00, 0x0500);
 851	r8168g_phy_param(phydev, 0x80f6, 0xff00, 0x6e00);
 852	r8168g_phy_param(phydev, 0x80ec, 0xff00, 0x6800);
 853	r8168g_phy_param(phydev, 0x80ed, 0xff00, 0x7c00);
 854	r8168g_phy_param(phydev, 0x80f2, 0xff00, 0xf400);
 855	r8168g_phy_param(phydev, 0x80f4, 0xff00, 0x8500);
 856	r8168g_phy_param(phydev, 0x8110, 0xff00, 0xa800);
 857	r8168g_phy_param(phydev, 0x810f, 0xff00, 0x1d00);
 858	r8168g_phy_param(phydev, 0x8111, 0xff00, 0xf500);
 859	r8168g_phy_param(phydev, 0x8113, 0xff00, 0x6100);
 860	r8168g_phy_param(phydev, 0x8115, 0xff00, 0x9200);
 861	r8168g_phy_param(phydev, 0x810e, 0xff00, 0x0400);
 862	r8168g_phy_param(phydev, 0x810c, 0xff00, 0x7c00);
 863	r8168g_phy_param(phydev, 0x810b, 0xff00, 0x5a00);
 864	r8168g_phy_param(phydev, 0x80d1, 0xff00, 0xff00);
 865	r8168g_phy_param(phydev, 0x80cd, 0xff00, 0x9e00);
 866	r8168g_phy_param(phydev, 0x80d3, 0xff00, 0x0e00);
 867	r8168g_phy_param(phydev, 0x80d5, 0xff00, 0xca00);
 868	r8168g_phy_param(phydev, 0x80d7, 0xff00, 0x8400);
 869
 870	/* Force PWM-mode */
 871	phy_write(phydev, 0x1f, 0x0bcd);
 872	phy_write(phydev, 0x14, 0x5065);
 873	phy_write(phydev, 0x14, 0xd065);
 874	phy_write(phydev, 0x1f, 0x0bc8);
 875	phy_write(phydev, 0x12, 0x00ed);
 876	phy_write(phydev, 0x1f, 0x0bcd);
 877	phy_write(phydev, 0x14, 0x1065);
 878	phy_write(phydev, 0x14, 0x9065);
 879	phy_write(phydev, 0x14, 0x1065);
 880	phy_write(phydev, 0x1f, 0x0000);
 881
 882	rtl8168g_disable_aldps(phydev);
 883	rtl8168g_config_eee_phy(phydev);
 884}
 885
 886static void rtl8117_hw_phy_config(struct rtl8169_private *tp,
 887				  struct phy_device *phydev)
 888{
 889	/* CHN EST parameters adjust - fnet */
 890	r8168g_phy_param(phydev, 0x808e, 0xff00, 0x4800);
 891	r8168g_phy_param(phydev, 0x8090, 0xff00, 0xcc00);
 892	r8168g_phy_param(phydev, 0x8092, 0xff00, 0xb000);
 893
 894	r8168g_phy_param(phydev, 0x8088, 0xff00, 0x6000);
 895	r8168g_phy_param(phydev, 0x808b, 0x3f00, 0x0b00);
 896	r8168g_phy_param(phydev, 0x808d, 0x1f00, 0x0600);
 897	r8168g_phy_param(phydev, 0x808c, 0xff00, 0xb000);
 898	r8168g_phy_param(phydev, 0x80a0, 0xff00, 0x2800);
 899	r8168g_phy_param(phydev, 0x80a2, 0xff00, 0x5000);
 900	r8168g_phy_param(phydev, 0x809b, 0xf800, 0xb000);
 901	r8168g_phy_param(phydev, 0x809a, 0xff00, 0x4b00);
 902	r8168g_phy_param(phydev, 0x809d, 0x3f00, 0x0800);
 903	r8168g_phy_param(phydev, 0x80a1, 0xff00, 0x7000);
 904	r8168g_phy_param(phydev, 0x809f, 0x1f00, 0x0300);
 905	r8168g_phy_param(phydev, 0x809e, 0xff00, 0x8800);
 906	r8168g_phy_param(phydev, 0x80b2, 0xff00, 0x2200);
 907	r8168g_phy_param(phydev, 0x80ad, 0xf800, 0x9800);
 908	r8168g_phy_param(phydev, 0x80af, 0x3f00, 0x0800);
 909	r8168g_phy_param(phydev, 0x80b3, 0xff00, 0x6f00);
 910	r8168g_phy_param(phydev, 0x80b1, 0x1f00, 0x0300);
 911	r8168g_phy_param(phydev, 0x80b0, 0xff00, 0x9300);
 912
 913	r8168g_phy_param(phydev, 0x8011, 0x0000, 0x0800);
 914
 915	rtl8168g_enable_gphy_10m(phydev);
 916
 917	r8168g_phy_param(phydev, 0x8016, 0x0000, 0x0400);
 918
 919	rtl8168g_disable_aldps(phydev);
 920	rtl8168h_config_eee_phy(phydev);
 921}
 922
 923static void rtl8102e_hw_phy_config(struct rtl8169_private *tp,
 924				   struct phy_device *phydev)
 925{
 926	static const struct phy_reg phy_reg_init[] = {
 927		{ 0x1f, 0x0003 },
 928		{ 0x08, 0x441d },
 929		{ 0x01, 0x9100 },
 930		{ 0x1f, 0x0000 }
 931	};
 932
 933	phy_set_bits(phydev, 0x11, BIT(12));
 934	phy_set_bits(phydev, 0x19, BIT(13));
 935	phy_set_bits(phydev, 0x10, BIT(15));
 936
 937	rtl_writephy_batch(phydev, phy_reg_init);
 938}
 939
 940static void rtl8401_hw_phy_config(struct rtl8169_private *tp,
 941				  struct phy_device *phydev)
 942{
 943	phy_set_bits(phydev, 0x11, BIT(12));
 944	phy_modify_paged(phydev, 0x0002, 0x0f, 0x0000, 0x0003);
 945}
 946
 947static void rtl8105e_hw_phy_config(struct rtl8169_private *tp,
 948				   struct phy_device *phydev)
 949{
 950	/* Disable ALDPS before ram code */
 951	phy_write(phydev, 0x18, 0x0310);
 952	msleep(100);
 953
 954	r8169_apply_firmware(tp);
 955
 956	phy_write_paged(phydev, 0x0005, 0x1a, 0x0000);
 957	phy_write_paged(phydev, 0x0004, 0x1c, 0x0000);
 958	phy_write_paged(phydev, 0x0001, 0x15, 0x7701);
 959}
 960
 961static void rtl8402_hw_phy_config(struct rtl8169_private *tp,
 962				  struct phy_device *phydev)
 963{
 964	/* Disable ALDPS before setting firmware */
 965	phy_write(phydev, 0x18, 0x0310);
 966	msleep(20);
 967
 968	r8169_apply_firmware(tp);
 969
 970	/* EEE setting */
 971	phy_write(phydev, 0x1f, 0x0004);
 972	phy_write(phydev, 0x10, 0x401f);
 973	phy_write(phydev, 0x19, 0x7030);
 974	phy_write(phydev, 0x1f, 0x0000);
 975}
 976
 977static void rtl8106e_hw_phy_config(struct rtl8169_private *tp,
 978				   struct phy_device *phydev)
 979{
 980	static const struct phy_reg phy_reg_init[] = {
 981		{ 0x1f, 0x0004 },
 982		{ 0x10, 0xc07f },
 983		{ 0x19, 0x7030 },
 984		{ 0x1f, 0x0000 }
 985	};
 986
 987	/* Disable ALDPS before ram code */
 988	phy_write(phydev, 0x18, 0x0310);
 989	msleep(100);
 990
 991	r8169_apply_firmware(tp);
 992
 993	rtl_writephy_batch(phydev, phy_reg_init);
 994}
 995
 996static void rtl8125_legacy_force_mode(struct phy_device *phydev)
 997{
 998	phy_modify_paged(phydev, 0xa5b, 0x12, BIT(15), 0);
 999}
1000
1001static void rtl8125a_2_hw_phy_config(struct rtl8169_private *tp,
1002				     struct phy_device *phydev)
1003{
1004	int i;
1005
1006	phy_modify_paged(phydev, 0xad4, 0x17, 0x0000, 0x0010);
1007	phy_modify_paged(phydev, 0xad1, 0x13, 0x03ff, 0x03ff);
1008	phy_modify_paged(phydev, 0xad3, 0x11, 0x003f, 0x0006);
1009	phy_modify_paged(phydev, 0xac0, 0x14, 0x1100, 0x0000);
1010	phy_modify_paged(phydev, 0xacc, 0x10, 0x0003, 0x0002);
1011	phy_modify_paged(phydev, 0xad4, 0x10, 0x00e7, 0x0044);
1012	phy_modify_paged(phydev, 0xac1, 0x12, 0x0080, 0x0000);
1013	phy_modify_paged(phydev, 0xac8, 0x10, 0x0300, 0x0000);
1014	phy_modify_paged(phydev, 0xac5, 0x17, 0x0007, 0x0002);
1015	phy_write_paged(phydev, 0xad4, 0x16, 0x00a8);
1016	phy_write_paged(phydev, 0xac5, 0x16, 0x01ff);
1017	phy_modify_paged(phydev, 0xac8, 0x15, 0x00f0, 0x0030);
1018
1019	phy_write(phydev, 0x1f, 0x0b87);
1020	phy_write(phydev, 0x16, 0x80a2);
1021	phy_write(phydev, 0x17, 0x0153);
1022	phy_write(phydev, 0x16, 0x809c);
1023	phy_write(phydev, 0x17, 0x0153);
1024	phy_write(phydev, 0x1f, 0x0000);
1025
1026	phy_write(phydev, 0x1f, 0x0a43);
1027	phy_write(phydev, 0x13, 0x81B3);
1028	phy_write(phydev, 0x14, 0x0043);
1029	phy_write(phydev, 0x14, 0x00A7);
1030	phy_write(phydev, 0x14, 0x00D6);
1031	phy_write(phydev, 0x14, 0x00EC);
1032	phy_write(phydev, 0x14, 0x00F6);
1033	phy_write(phydev, 0x14, 0x00FB);
1034	phy_write(phydev, 0x14, 0x00FD);
1035	phy_write(phydev, 0x14, 0x00FF);
1036	phy_write(phydev, 0x14, 0x00BB);
1037	phy_write(phydev, 0x14, 0x0058);
1038	phy_write(phydev, 0x14, 0x0029);
1039	phy_write(phydev, 0x14, 0x0013);
1040	phy_write(phydev, 0x14, 0x0009);
1041	phy_write(phydev, 0x14, 0x0004);
1042	phy_write(phydev, 0x14, 0x0002);
1043	for (i = 0; i < 25; i++)
1044		phy_write(phydev, 0x14, 0x0000);
1045	phy_write(phydev, 0x1f, 0x0000);
1046
1047	r8168g_phy_param(phydev, 0x8257, 0xffff, 0x020F);
1048	r8168g_phy_param(phydev, 0x80ea, 0xffff, 0x7843);
1049
1050	r8169_apply_firmware(tp);
1051
1052	phy_modify_paged(phydev, 0xd06, 0x14, 0x0000, 0x2000);
1053
1054	r8168g_phy_param(phydev, 0x81a2, 0x0000, 0x0100);
1055
1056	phy_modify_paged(phydev, 0xb54, 0x16, 0xff00, 0xdb00);
1057	phy_modify_paged(phydev, 0xa45, 0x12, 0x0001, 0x0000);
1058	phy_modify_paged(phydev, 0xa5d, 0x12, 0x0000, 0x0020);
1059	phy_modify_paged(phydev, 0xad4, 0x17, 0x0010, 0x0000);
1060	phy_modify_paged(phydev, 0xa86, 0x15, 0x0001, 0x0000);
1061	rtl8168g_enable_gphy_10m(phydev);
1062
1063	rtl8125a_config_eee_phy(phydev);
1064}
1065
1066static void rtl8125b_hw_phy_config(struct rtl8169_private *tp,
1067				   struct phy_device *phydev)
1068{
1069	r8169_apply_firmware(tp);
1070
1071	phy_modify_paged(phydev, 0xa44, 0x11, 0x0000, 0x0800);
1072	phy_modify_paged(phydev, 0xac4, 0x13, 0x00f0, 0x0090);
1073	phy_modify_paged(phydev, 0xad3, 0x10, 0x0003, 0x0001);
1074
1075	phy_write(phydev, 0x1f, 0x0b87);
1076	phy_write(phydev, 0x16, 0x80f5);
1077	phy_write(phydev, 0x17, 0x760e);
1078	phy_write(phydev, 0x16, 0x8107);
1079	phy_write(phydev, 0x17, 0x360e);
1080	phy_write(phydev, 0x16, 0x8551);
1081	phy_modify(phydev, 0x17, 0xff00, 0x0800);
1082	phy_write(phydev, 0x1f, 0x0000);
1083
1084	phy_modify_paged(phydev, 0xbf0, 0x10, 0xe000, 0xa000);
1085	phy_modify_paged(phydev, 0xbf4, 0x13, 0x0f00, 0x0300);
1086
1087	r8168g_phy_param(phydev, 0x8044, 0xffff, 0x2417);
1088	r8168g_phy_param(phydev, 0x804a, 0xffff, 0x2417);
1089	r8168g_phy_param(phydev, 0x8050, 0xffff, 0x2417);
1090	r8168g_phy_param(phydev, 0x8056, 0xffff, 0x2417);
1091	r8168g_phy_param(phydev, 0x805c, 0xffff, 0x2417);
1092	r8168g_phy_param(phydev, 0x8062, 0xffff, 0x2417);
1093	r8168g_phy_param(phydev, 0x8068, 0xffff, 0x2417);
1094	r8168g_phy_param(phydev, 0x806e, 0xffff, 0x2417);
1095	r8168g_phy_param(phydev, 0x8074, 0xffff, 0x2417);
1096	r8168g_phy_param(phydev, 0x807a, 0xffff, 0x2417);
1097
1098	phy_modify_paged(phydev, 0xa4c, 0x15, 0x0000, 0x0040);
1099	phy_modify_paged(phydev, 0xbf8, 0x12, 0xe000, 0xa000);
1100
1101	rtl8125_legacy_force_mode(phydev);
1102	rtl8125b_config_eee_phy(phydev);
1103}
1104
1105void r8169_hw_phy_config(struct rtl8169_private *tp, struct phy_device *phydev,
1106			 enum mac_version ver)
1107{
1108	static const rtl_phy_cfg_fct phy_configs[] = {
1109		/* PCI devices. */
1110		[RTL_GIGA_MAC_VER_02] = rtl8169s_hw_phy_config,
1111		[RTL_GIGA_MAC_VER_03] = rtl8169s_hw_phy_config,
1112		[RTL_GIGA_MAC_VER_04] = rtl8169sb_hw_phy_config,
1113		[RTL_GIGA_MAC_VER_05] = rtl8169scd_hw_phy_config,
1114		[RTL_GIGA_MAC_VER_06] = rtl8169sce_hw_phy_config,
1115		/* PCI-E devices. */
1116		[RTL_GIGA_MAC_VER_07] = rtl8102e_hw_phy_config,
1117		[RTL_GIGA_MAC_VER_08] = rtl8102e_hw_phy_config,
1118		[RTL_GIGA_MAC_VER_09] = rtl8102e_hw_phy_config,
1119		[RTL_GIGA_MAC_VER_10] = NULL,
1120		[RTL_GIGA_MAC_VER_11] = rtl8168bb_hw_phy_config,
1121		[RTL_GIGA_MAC_VER_14] = rtl8401_hw_phy_config,
1122		[RTL_GIGA_MAC_VER_17] = rtl8168bef_hw_phy_config,
1123		[RTL_GIGA_MAC_VER_18] = rtl8168cp_1_hw_phy_config,
1124		[RTL_GIGA_MAC_VER_19] = rtl8168c_1_hw_phy_config,
1125		[RTL_GIGA_MAC_VER_20] = rtl8168c_2_hw_phy_config,
1126		[RTL_GIGA_MAC_VER_21] = rtl8168c_3_hw_phy_config,
1127		[RTL_GIGA_MAC_VER_22] = rtl8168c_3_hw_phy_config,
1128		[RTL_GIGA_MAC_VER_23] = rtl8168cp_2_hw_phy_config,
1129		[RTL_GIGA_MAC_VER_24] = rtl8168cp_2_hw_phy_config,
1130		[RTL_GIGA_MAC_VER_25] = rtl8168d_1_hw_phy_config,
1131		[RTL_GIGA_MAC_VER_26] = rtl8168d_2_hw_phy_config,
1132		[RTL_GIGA_MAC_VER_28] = rtl8168d_4_hw_phy_config,
1133		[RTL_GIGA_MAC_VER_29] = rtl8105e_hw_phy_config,
1134		[RTL_GIGA_MAC_VER_30] = rtl8105e_hw_phy_config,
1135		[RTL_GIGA_MAC_VER_31] = NULL,
1136		[RTL_GIGA_MAC_VER_32] = rtl8168e_1_hw_phy_config,
1137		[RTL_GIGA_MAC_VER_33] = rtl8168e_1_hw_phy_config,
1138		[RTL_GIGA_MAC_VER_34] = rtl8168e_2_hw_phy_config,
1139		[RTL_GIGA_MAC_VER_35] = rtl8168f_1_hw_phy_config,
1140		[RTL_GIGA_MAC_VER_36] = rtl8168f_2_hw_phy_config,
1141		[RTL_GIGA_MAC_VER_37] = rtl8402_hw_phy_config,
1142		[RTL_GIGA_MAC_VER_38] = rtl8411_hw_phy_config,
1143		[RTL_GIGA_MAC_VER_39] = rtl8106e_hw_phy_config,
1144		[RTL_GIGA_MAC_VER_40] = rtl8168g_1_hw_phy_config,
1145		[RTL_GIGA_MAC_VER_42] = rtl8168g_2_hw_phy_config,
1146		[RTL_GIGA_MAC_VER_43] = rtl8168g_2_hw_phy_config,
1147		[RTL_GIGA_MAC_VER_44] = rtl8168g_2_hw_phy_config,
1148		[RTL_GIGA_MAC_VER_46] = rtl8168h_2_hw_phy_config,
1149		[RTL_GIGA_MAC_VER_48] = rtl8168h_2_hw_phy_config,
1150		[RTL_GIGA_MAC_VER_51] = rtl8168ep_2_hw_phy_config,
1151		[RTL_GIGA_MAC_VER_52] = rtl8117_hw_phy_config,
1152		[RTL_GIGA_MAC_VER_53] = rtl8117_hw_phy_config,
1153		[RTL_GIGA_MAC_VER_61] = rtl8125a_2_hw_phy_config,
1154		[RTL_GIGA_MAC_VER_63] = rtl8125b_hw_phy_config,
1155	};
1156
1157	if (phy_configs[ver])
1158		phy_configs[ver](tp, phydev);
1159}