Linux Audio

Check our new training course

Loading...
v6.13.7
   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 rtl8125_common_config_eee_phy(struct phy_device *phydev)
  93{
 
 
 
  94	phy_modify_paged(phydev, 0xa6d, 0x14, 0x0010, 0x0000);
  95	phy_modify_paged(phydev, 0xa42, 0x14, 0x0080, 0x0000);
  96	phy_modify_paged(phydev, 0xa4a, 0x11, 0x0200, 0x0000);
  97}
  98
  99static void rtl8125_config_eee_phy(struct phy_device *phydev)
 100{
 101	rtl8168g_config_eee_phy(phydev);
 102	rtl8125_common_config_eee_phy(phydev);
 
 
 103}
 104
 105static void rtl8169s_hw_phy_config(struct rtl8169_private *tp,
 106				   struct phy_device *phydev)
 107{
 108	static const struct phy_reg phy_reg_init[] = {
 109		{ 0x1f, 0x0001 },
 110		{ 0x06, 0x006e },
 111		{ 0x08, 0x0708 },
 112		{ 0x15, 0x4000 },
 113		{ 0x18, 0x65c7 },
 114
 115		{ 0x1f, 0x0001 },
 116		{ 0x03, 0x00a1 },
 117		{ 0x02, 0x0008 },
 118		{ 0x01, 0x0120 },
 119		{ 0x00, 0x1000 },
 120		{ 0x04, 0x0800 },
 121		{ 0x04, 0x0000 },
 122
 123		{ 0x03, 0xff41 },
 124		{ 0x02, 0xdf60 },
 125		{ 0x01, 0x0140 },
 126		{ 0x00, 0x0077 },
 127		{ 0x04, 0x7800 },
 128		{ 0x04, 0x7000 },
 129
 130		{ 0x03, 0x802f },
 131		{ 0x02, 0x4f02 },
 132		{ 0x01, 0x0409 },
 133		{ 0x00, 0xf0f9 },
 134		{ 0x04, 0x9800 },
 135		{ 0x04, 0x9000 },
 136
 137		{ 0x03, 0xdf01 },
 138		{ 0x02, 0xdf20 },
 139		{ 0x01, 0xff95 },
 140		{ 0x00, 0xba00 },
 141		{ 0x04, 0xa800 },
 142		{ 0x04, 0xa000 },
 143
 144		{ 0x03, 0xff41 },
 145		{ 0x02, 0xdf20 },
 146		{ 0x01, 0x0140 },
 147		{ 0x00, 0x00bb },
 148		{ 0x04, 0xb800 },
 149		{ 0x04, 0xb000 },
 150
 151		{ 0x03, 0xdf41 },
 152		{ 0x02, 0xdc60 },
 153		{ 0x01, 0x6340 },
 154		{ 0x00, 0x007d },
 155		{ 0x04, 0xd800 },
 156		{ 0x04, 0xd000 },
 157
 158		{ 0x03, 0xdf01 },
 159		{ 0x02, 0xdf20 },
 160		{ 0x01, 0x100a },
 161		{ 0x00, 0xa0ff },
 162		{ 0x04, 0xf800 },
 163		{ 0x04, 0xf000 },
 164
 165		{ 0x1f, 0x0000 },
 166		{ 0x0b, 0x0000 },
 167		{ 0x00, 0x9200 }
 168	};
 169
 170	rtl_writephy_batch(phydev, phy_reg_init);
 171}
 172
 173static void rtl8169sb_hw_phy_config(struct rtl8169_private *tp,
 174				    struct phy_device *phydev)
 175{
 176	phy_write_paged(phydev, 0x0002, 0x01, 0x90d0);
 177}
 178
 179static void rtl8169scd_hw_phy_config(struct rtl8169_private *tp,
 180				     struct phy_device *phydev)
 181{
 182	static const struct phy_reg phy_reg_init[] = {
 183		{ 0x1f, 0x0001 },
 184		{ 0x04, 0x0000 },
 185		{ 0x03, 0x00a1 },
 186		{ 0x02, 0x0008 },
 187		{ 0x01, 0x0120 },
 188		{ 0x00, 0x1000 },
 189		{ 0x04, 0x0800 },
 190		{ 0x04, 0x9000 },
 191		{ 0x03, 0x802f },
 192		{ 0x02, 0x4f02 },
 193		{ 0x01, 0x0409 },
 194		{ 0x00, 0xf099 },
 195		{ 0x04, 0x9800 },
 196		{ 0x04, 0xa000 },
 197		{ 0x03, 0xdf01 },
 198		{ 0x02, 0xdf20 },
 199		{ 0x01, 0xff95 },
 200		{ 0x00, 0xba00 },
 201		{ 0x04, 0xa800 },
 202		{ 0x04, 0xf000 },
 203		{ 0x03, 0xdf01 },
 204		{ 0x02, 0xdf20 },
 205		{ 0x01, 0x101a },
 206		{ 0x00, 0xa0ff },
 207		{ 0x04, 0xf800 },
 208		{ 0x04, 0x0000 },
 209		{ 0x1f, 0x0000 },
 210
 211		{ 0x1f, 0x0001 },
 212		{ 0x10, 0xf41b },
 213		{ 0x14, 0xfb54 },
 214		{ 0x18, 0xf5c7 },
 215		{ 0x1f, 0x0000 },
 216
 217		{ 0x1f, 0x0001 },
 218		{ 0x17, 0x0cc0 },
 219		{ 0x1f, 0x0000 }
 220	};
 221
 222	rtl_writephy_batch(phydev, phy_reg_init);
 223}
 224
 225static void rtl8169sce_hw_phy_config(struct rtl8169_private *tp,
 226				     struct phy_device *phydev)
 227{
 228	static const struct phy_reg phy_reg_init[] = {
 229		{ 0x1f, 0x0001 },
 230		{ 0x04, 0x0000 },
 231		{ 0x03, 0x00a1 },
 232		{ 0x02, 0x0008 },
 233		{ 0x01, 0x0120 },
 234		{ 0x00, 0x1000 },
 235		{ 0x04, 0x0800 },
 236		{ 0x04, 0x9000 },
 237		{ 0x03, 0x802f },
 238		{ 0x02, 0x4f02 },
 239		{ 0x01, 0x0409 },
 240		{ 0x00, 0xf099 },
 241		{ 0x04, 0x9800 },
 242		{ 0x04, 0xa000 },
 243		{ 0x03, 0xdf01 },
 244		{ 0x02, 0xdf20 },
 245		{ 0x01, 0xff95 },
 246		{ 0x00, 0xba00 },
 247		{ 0x04, 0xa800 },
 248		{ 0x04, 0xf000 },
 249		{ 0x03, 0xdf01 },
 250		{ 0x02, 0xdf20 },
 251		{ 0x01, 0x101a },
 252		{ 0x00, 0xa0ff },
 253		{ 0x04, 0xf800 },
 254		{ 0x04, 0x0000 },
 255		{ 0x1f, 0x0000 },
 256
 257		{ 0x1f, 0x0001 },
 258		{ 0x0b, 0x8480 },
 259		{ 0x1f, 0x0000 },
 260
 261		{ 0x1f, 0x0001 },
 262		{ 0x18, 0x67c7 },
 263		{ 0x04, 0x2000 },
 264		{ 0x03, 0x002f },
 265		{ 0x02, 0x4360 },
 266		{ 0x01, 0x0109 },
 267		{ 0x00, 0x3022 },
 268		{ 0x04, 0x2800 },
 269		{ 0x1f, 0x0000 },
 270
 271		{ 0x1f, 0x0001 },
 272		{ 0x17, 0x0cc0 },
 273		{ 0x1f, 0x0000 }
 274	};
 275
 276	rtl_writephy_batch(phydev, phy_reg_init);
 277}
 278
 279static void rtl8168bb_hw_phy_config(struct rtl8169_private *tp,
 280				    struct phy_device *phydev)
 281{
 282	phy_write(phydev, 0x1f, 0x0001);
 283	phy_set_bits(phydev, 0x16, BIT(0));
 284	phy_write(phydev, 0x10, 0xf41b);
 285	phy_write(phydev, 0x1f, 0x0000);
 286}
 287
 288static void rtl8168bef_hw_phy_config(struct rtl8169_private *tp,
 289				     struct phy_device *phydev)
 290{
 291	phy_write_paged(phydev, 0x0001, 0x10, 0xf41b);
 292}
 293
 294static void rtl8168cp_1_hw_phy_config(struct rtl8169_private *tp,
 295				      struct phy_device *phydev)
 296{
 297	phy_write(phydev, 0x1d, 0x0f00);
 298	phy_write_paged(phydev, 0x0002, 0x0c, 0x1ec8);
 299}
 300
 301static void rtl8168cp_2_hw_phy_config(struct rtl8169_private *tp,
 302				      struct phy_device *phydev)
 303{
 304	phy_set_bits(phydev, 0x14, BIT(5));
 305	phy_set_bits(phydev, 0x0d, BIT(5));
 306	phy_write_paged(phydev, 0x0001, 0x1d, 0x3d98);
 307}
 308
 309static void rtl8168c_1_hw_phy_config(struct rtl8169_private *tp,
 310				     struct phy_device *phydev)
 311{
 312	static const struct phy_reg phy_reg_init[] = {
 313		{ 0x1f, 0x0001 },
 314		{ 0x12, 0x2300 },
 315		{ 0x1f, 0x0002 },
 316		{ 0x00, 0x88d4 },
 317		{ 0x01, 0x82b1 },
 318		{ 0x03, 0x7002 },
 319		{ 0x08, 0x9e30 },
 320		{ 0x09, 0x01f0 },
 321		{ 0x0a, 0x5500 },
 322		{ 0x0c, 0x00c8 },
 323		{ 0x1f, 0x0003 },
 324		{ 0x12, 0xc096 },
 325		{ 0x16, 0x000a },
 326		{ 0x1f, 0x0000 },
 327		{ 0x1f, 0x0000 },
 328		{ 0x09, 0x2000 },
 329		{ 0x09, 0x0000 }
 330	};
 331
 332	rtl_writephy_batch(phydev, phy_reg_init);
 333
 334	phy_set_bits(phydev, 0x14, BIT(5));
 335	phy_set_bits(phydev, 0x0d, BIT(5));
 336}
 337
 338static void rtl8168c_2_hw_phy_config(struct rtl8169_private *tp,
 339				     struct phy_device *phydev)
 340{
 341	static const struct phy_reg phy_reg_init[] = {
 342		{ 0x1f, 0x0001 },
 343		{ 0x12, 0x2300 },
 344		{ 0x03, 0x802f },
 345		{ 0x02, 0x4f02 },
 346		{ 0x01, 0x0409 },
 347		{ 0x00, 0xf099 },
 348		{ 0x04, 0x9800 },
 349		{ 0x04, 0x9000 },
 350		{ 0x1d, 0x3d98 },
 351		{ 0x1f, 0x0002 },
 352		{ 0x0c, 0x7eb8 },
 353		{ 0x06, 0x0761 },
 354		{ 0x1f, 0x0003 },
 355		{ 0x16, 0x0f0a },
 356		{ 0x1f, 0x0000 }
 357	};
 358
 359	rtl_writephy_batch(phydev, phy_reg_init);
 360
 361	phy_set_bits(phydev, 0x16, BIT(0));
 362	phy_set_bits(phydev, 0x14, BIT(5));
 363	phy_set_bits(phydev, 0x0d, BIT(5));
 364}
 365
 366static void rtl8168c_3_hw_phy_config(struct rtl8169_private *tp,
 367				     struct phy_device *phydev)
 368{
 369	static const struct phy_reg phy_reg_init[] = {
 370		{ 0x1f, 0x0001 },
 371		{ 0x12, 0x2300 },
 372		{ 0x1d, 0x3d98 },
 373		{ 0x1f, 0x0002 },
 374		{ 0x0c, 0x7eb8 },
 375		{ 0x06, 0x5461 },
 376		{ 0x1f, 0x0003 },
 377		{ 0x16, 0x0f0a },
 378		{ 0x1f, 0x0000 }
 379	};
 380
 381	rtl_writephy_batch(phydev, phy_reg_init);
 382
 383	phy_set_bits(phydev, 0x16, BIT(0));
 384	phy_set_bits(phydev, 0x14, BIT(5));
 385	phy_set_bits(phydev, 0x0d, BIT(5));
 386}
 387
 388static const struct phy_reg rtl8168d_1_phy_reg_init_0[] = {
 389	/* Channel Estimation */
 390	{ 0x1f, 0x0001 },
 391	{ 0x06, 0x4064 },
 392	{ 0x07, 0x2863 },
 393	{ 0x08, 0x059c },
 394	{ 0x09, 0x26b4 },
 395	{ 0x0a, 0x6a19 },
 396	{ 0x0b, 0xdcc8 },
 397	{ 0x10, 0xf06d },
 398	{ 0x14, 0x7f68 },
 399	{ 0x18, 0x7fd9 },
 400	{ 0x1c, 0xf0ff },
 401	{ 0x1d, 0x3d9c },
 402	{ 0x1f, 0x0003 },
 403	{ 0x12, 0xf49f },
 404	{ 0x13, 0x070b },
 405	{ 0x1a, 0x05ad },
 406	{ 0x14, 0x94c0 },
 407
 408	/*
 409	 * Tx Error Issue
 410	 * Enhance line driver power
 411	 */
 412	{ 0x1f, 0x0002 },
 413	{ 0x06, 0x5561 },
 414	{ 0x1f, 0x0005 },
 415	{ 0x05, 0x8332 },
 416	{ 0x06, 0x5561 },
 417
 418	/*
 419	 * Can not link to 1Gbps with bad cable
 420	 * Decrease SNR threshold form 21.07dB to 19.04dB
 421	 */
 422	{ 0x1f, 0x0001 },
 423	{ 0x17, 0x0cc0 },
 424
 425	{ 0x1f, 0x0000 },
 426	{ 0x0d, 0xf880 }
 427};
 428
 
 
 
 
 
 
 
 
 
 429static void rtl8168d_apply_firmware_cond(struct rtl8169_private *tp,
 430					 struct phy_device *phydev,
 431					 u16 val)
 432{
 433	u16 reg_val;
 434
 435	phy_write(phydev, 0x1f, 0x0005);
 436	phy_write(phydev, 0x05, 0x001b);
 437	reg_val = phy_read(phydev, 0x06);
 438	phy_write(phydev, 0x1f, 0x0000);
 439
 440	if (reg_val != val)
 441		phydev_warn(phydev, "chipset not ready for firmware\n");
 442	else
 443		r8169_apply_firmware(tp);
 444}
 445
 446static void rtl8168d_1_common(struct phy_device *phydev)
 447{
 448	u16 val;
 449
 450	phy_write_paged(phydev, 0x0002, 0x05, 0x669a);
 451	r8168d_phy_param(phydev, 0x8330, 0xffff, 0x669a);
 452	phy_write(phydev, 0x1f, 0x0002);
 453
 454	val = phy_read(phydev, 0x0d);
 455
 456	if ((val & 0x00ff) != 0x006c) {
 457		static const u16 set[] = {
 458			0x0065, 0x0066, 0x0067, 0x0068,
 459			0x0069, 0x006a, 0x006b, 0x006c
 460		};
 461		int i;
 462
 463		val &= 0xff00;
 464		for (i = 0; i < ARRAY_SIZE(set); i++)
 465			phy_write(phydev, 0x0d, val | set[i]);
 466	}
 467}
 468
 469static void rtl8168d_1_hw_phy_config(struct rtl8169_private *tp,
 470				     struct phy_device *phydev)
 471{
 472	rtl_writephy_batch(phydev, rtl8168d_1_phy_reg_init_0);
 473
 474	/*
 475	 * Rx Error Issue
 476	 * Fine Tune Switching regulator parameter
 477	 */
 478	phy_write(phydev, 0x1f, 0x0002);
 479	phy_modify(phydev, 0x0b, 0x00ef, 0x0010);
 480	phy_modify(phydev, 0x0c, 0x5d00, 0xa200);
 481
 482	if (rtl8168d_efuse_read(tp, 0x01) == 0xb1) {
 483		rtl8168d_1_common(phydev);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 484	} else {
 485		phy_write_paged(phydev, 0x0002, 0x05, 0x6662);
 486		r8168d_phy_param(phydev, 0x8330, 0xffff, 0x6662);
 487	}
 488
 489	/* RSET couple improve */
 490	phy_write(phydev, 0x1f, 0x0002);
 491	phy_set_bits(phydev, 0x0d, 0x0300);
 492	phy_set_bits(phydev, 0x0f, 0x0010);
 493
 494	/* Fine tune PLL performance */
 495	phy_write(phydev, 0x1f, 0x0002);
 496	phy_modify(phydev, 0x02, 0x0600, 0x0100);
 497	phy_clear_bits(phydev, 0x03, 0xe000);
 498	phy_write(phydev, 0x1f, 0x0000);
 499
 500	rtl8168d_apply_firmware_cond(tp, phydev, 0xbf00);
 501}
 502
 503static void rtl8168d_2_hw_phy_config(struct rtl8169_private *tp,
 504				     struct phy_device *phydev)
 505{
 506	rtl_writephy_batch(phydev, rtl8168d_1_phy_reg_init_0);
 507
 508	if (rtl8168d_efuse_read(tp, 0x01) == 0xb1) {
 509		rtl8168d_1_common(phydev);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 510	} else {
 511		phy_write_paged(phydev, 0x0002, 0x05, 0x2642);
 512		r8168d_phy_param(phydev, 0x8330, 0xffff, 0x2642);
 513	}
 514
 515	/* Fine tune PLL performance */
 516	phy_write(phydev, 0x1f, 0x0002);
 517	phy_modify(phydev, 0x02, 0x0600, 0x0100);
 518	phy_clear_bits(phydev, 0x03, 0xe000);
 519	phy_write(phydev, 0x1f, 0x0000);
 520
 521	/* Switching regulator Slew rate */
 522	phy_modify_paged(phydev, 0x0002, 0x0f, 0x0000, 0x0017);
 523
 524	rtl8168d_apply_firmware_cond(tp, phydev, 0xb300);
 525}
 526
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 527static void rtl8168d_4_hw_phy_config(struct rtl8169_private *tp,
 528				     struct phy_device *phydev)
 529{
 530	phy_write_paged(phydev, 0x0001, 0x17, 0x0cc0);
 531	r8168d_modify_extpage(phydev, 0x002d, 0x18, 0xffff, 0x0040);
 532	phy_set_bits(phydev, 0x0d, BIT(5));
 533}
 534
 535static void rtl8168e_1_hw_phy_config(struct rtl8169_private *tp,
 536				     struct phy_device *phydev)
 537{
 538	static const struct phy_reg phy_reg_init[] = {
 539		/* Channel estimation fine tune */
 540		{ 0x1f, 0x0001 },
 541		{ 0x0b, 0x6c20 },
 542		{ 0x07, 0x2872 },
 543		{ 0x1c, 0xefff },
 544		{ 0x1f, 0x0003 },
 545		{ 0x14, 0x6420 },
 546		{ 0x1f, 0x0000 },
 547	};
 548
 549	r8169_apply_firmware(tp);
 550
 551	/* Enable Delay cap */
 552	r8168d_phy_param(phydev, 0x8b80, 0xffff, 0xc896);
 553
 554	rtl_writephy_batch(phydev, phy_reg_init);
 555
 556	/* Update PFM & 10M TX idle timer */
 557	r8168d_modify_extpage(phydev, 0x002f, 0x15, 0xffff, 0x1919);
 558
 559	r8168d_modify_extpage(phydev, 0x00ac, 0x18, 0xffff, 0x0006);
 560
 561	/* DCO enable for 10M IDLE Power */
 562	r8168d_modify_extpage(phydev, 0x0023, 0x17, 0x0000, 0x0006);
 563
 564	/* For impedance matching */
 565	phy_modify_paged(phydev, 0x0002, 0x08, 0x7f00, 0x8000);
 566
 567	/* PHY auto speed down */
 568	r8168d_modify_extpage(phydev, 0x002d, 0x18, 0x0000, 0x0050);
 569	phy_set_bits(phydev, 0x14, BIT(15));
 570
 571	r8168d_phy_param(phydev, 0x8b86, 0x0000, 0x0001);
 572	r8168d_phy_param(phydev, 0x8b85, 0x2000, 0x0000);
 573
 574	r8168d_modify_extpage(phydev, 0x0020, 0x15, 0x1100, 0x0000);
 575	phy_write_paged(phydev, 0x0006, 0x00, 0x5a00);
 576
 577	phy_write_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_ADV, 0x0000);
 578}
 579
 580static void rtl8168e_2_hw_phy_config(struct rtl8169_private *tp,
 581				     struct phy_device *phydev)
 582{
 583	r8169_apply_firmware(tp);
 584
 585	/* Enable Delay cap */
 586	r8168d_modify_extpage(phydev, 0x00ac, 0x18, 0xffff, 0x0006);
 587
 588	/* Channel estimation fine tune */
 589	phy_write_paged(phydev, 0x0003, 0x09, 0xa20f);
 590
 591	/* Green Setting */
 592	r8168d_phy_param(phydev, 0x8b5b, 0xffff, 0x9222);
 593	r8168d_phy_param(phydev, 0x8b6d, 0xffff, 0x8000);
 594	r8168d_phy_param(phydev, 0x8b76, 0xffff, 0x8000);
 595
 596	/* For 4-corner performance improve */
 597	phy_write(phydev, 0x1f, 0x0005);
 598	phy_write(phydev, 0x05, 0x8b80);
 599	phy_set_bits(phydev, 0x17, 0x0006);
 600	phy_write(phydev, 0x1f, 0x0000);
 601
 602	/* PHY auto speed down */
 603	r8168d_modify_extpage(phydev, 0x002d, 0x18, 0x0000, 0x0010);
 604	phy_set_bits(phydev, 0x14, BIT(15));
 605
 606	/* improve 10M EEE waveform */
 607	r8168d_phy_param(phydev, 0x8b86, 0x0000, 0x0001);
 608
 609	/* Improve 2-pair detection performance */
 610	r8168d_phy_param(phydev, 0x8b85, 0x0000, 0x4000);
 611
 612	rtl8168f_config_eee_phy(phydev);
 613
 614	/* Green feature */
 615	phy_write(phydev, 0x1f, 0x0003);
 616	phy_set_bits(phydev, 0x19, BIT(0));
 617	phy_set_bits(phydev, 0x10, BIT(10));
 618	phy_write(phydev, 0x1f, 0x0000);
 619	phy_modify_paged(phydev, 0x0005, 0x01, 0, BIT(8));
 620}
 621
 622static void rtl8168f_hw_phy_config(struct rtl8169_private *tp,
 623				   struct phy_device *phydev)
 624{
 625	/* For 4-corner performance improve */
 626	r8168d_phy_param(phydev, 0x8b80, 0x0000, 0x0006);
 627
 628	/* PHY auto speed down */
 629	r8168d_modify_extpage(phydev, 0x002d, 0x18, 0x0000, 0x0010);
 630	phy_set_bits(phydev, 0x14, BIT(15));
 631
 632	/* Improve 10M EEE waveform */
 633	r8168d_phy_param(phydev, 0x8b86, 0x0000, 0x0001);
 634
 635	rtl8168f_config_eee_phy(phydev);
 636}
 637
 638static void rtl8168f_1_hw_phy_config(struct rtl8169_private *tp,
 639				     struct phy_device *phydev)
 640{
 641	r8169_apply_firmware(tp);
 642
 643	/* Channel estimation fine tune */
 644	phy_write_paged(phydev, 0x0003, 0x09, 0xa20f);
 645
 646	/* Modify green table for giga & fnet */
 647	r8168d_phy_param(phydev, 0x8b55, 0xffff, 0x0000);
 648	r8168d_phy_param(phydev, 0x8b5e, 0xffff, 0x0000);
 649	r8168d_phy_param(phydev, 0x8b67, 0xffff, 0x0000);
 650	r8168d_phy_param(phydev, 0x8b70, 0xffff, 0x0000);
 651	r8168d_modify_extpage(phydev, 0x0078, 0x17, 0xffff, 0x0000);
 652	r8168d_modify_extpage(phydev, 0x0078, 0x19, 0xffff, 0x00fb);
 653
 654	/* Modify green table for 10M */
 655	r8168d_phy_param(phydev, 0x8b79, 0xffff, 0xaa00);
 656
 657	/* Disable hiimpedance detection (RTCT) */
 658	phy_write_paged(phydev, 0x0003, 0x01, 0x328a);
 659
 660	rtl8168f_hw_phy_config(tp, phydev);
 661
 662	/* Improve 2-pair detection performance */
 663	r8168d_phy_param(phydev, 0x8b85, 0x0000, 0x4000);
 664}
 665
 666static void rtl8168f_2_hw_phy_config(struct rtl8169_private *tp,
 667				     struct phy_device *phydev)
 668{
 669	r8169_apply_firmware(tp);
 670
 671	rtl8168f_hw_phy_config(tp, phydev);
 672}
 673
 674static void rtl8411_hw_phy_config(struct rtl8169_private *tp,
 675				  struct phy_device *phydev)
 676{
 677	r8169_apply_firmware(tp);
 678
 679	rtl8168f_hw_phy_config(tp, phydev);
 680
 681	/* Improve 2-pair detection performance */
 682	r8168d_phy_param(phydev, 0x8b85, 0x0000, 0x4000);
 683
 684	/* Channel estimation fine tune */
 685	phy_write_paged(phydev, 0x0003, 0x09, 0xa20f);
 686
 687	/* Modify green table for giga & fnet */
 688	r8168d_phy_param(phydev, 0x8b55, 0xffff, 0x0000);
 689	r8168d_phy_param(phydev, 0x8b5e, 0xffff, 0x0000);
 690	r8168d_phy_param(phydev, 0x8b67, 0xffff, 0x0000);
 691	r8168d_phy_param(phydev, 0x8b70, 0xffff, 0x0000);
 692	r8168d_modify_extpage(phydev, 0x0078, 0x17, 0xffff, 0x0000);
 693	r8168d_modify_extpage(phydev, 0x0078, 0x19, 0xffff, 0x00aa);
 694
 695	/* Modify green table for 10M */
 696	r8168d_phy_param(phydev, 0x8b79, 0xffff, 0xaa00);
 697
 698	/* Disable hiimpedance detection (RTCT) */
 699	phy_write_paged(phydev, 0x0003, 0x01, 0x328a);
 700
 701	/* Modify green table for giga */
 702	r8168d_phy_param(phydev, 0x8b54, 0x0800, 0x0000);
 703	r8168d_phy_param(phydev, 0x8b5d, 0x0800, 0x0000);
 704	r8168d_phy_param(phydev, 0x8a7c, 0x0100, 0x0000);
 705	r8168d_phy_param(phydev, 0x8a7f, 0x0000, 0x0100);
 706	r8168d_phy_param(phydev, 0x8a82, 0x0100, 0x0000);
 707	r8168d_phy_param(phydev, 0x8a85, 0x0100, 0x0000);
 708	r8168d_phy_param(phydev, 0x8a88, 0x0100, 0x0000);
 709
 710	/* uc same-seed solution */
 711	r8168d_phy_param(phydev, 0x8b85, 0x0000, 0x8000);
 712
 713	/* Green feature */
 714	phy_write(phydev, 0x1f, 0x0003);
 715	phy_clear_bits(phydev, 0x19, BIT(0));
 716	phy_clear_bits(phydev, 0x10, BIT(10));
 717	phy_write(phydev, 0x1f, 0x0000);
 718}
 719
 720static void rtl8168g_disable_aldps(struct phy_device *phydev)
 721{
 722	phy_modify_paged(phydev, 0x0a43, 0x10, BIT(2), 0);
 723}
 724
 725static void rtl8168g_enable_gphy_10m(struct phy_device *phydev)
 726{
 727	phy_modify_paged(phydev, 0x0a44, 0x11, 0, BIT(11));
 728}
 729
 730static void rtl8168g_phy_adjust_10m_aldps(struct phy_device *phydev)
 731{
 732	phy_modify_paged(phydev, 0x0bcc, 0x14, BIT(8), 0);
 733	phy_modify_paged(phydev, 0x0a44, 0x11, 0, BIT(7) | BIT(6));
 734	r8168g_phy_param(phydev, 0x8084, 0x6000, 0x0000);
 735	phy_modify_paged(phydev, 0x0a43, 0x10, 0x0000, 0x1003);
 736}
 737
 738static void rtl8168g_1_hw_phy_config(struct rtl8169_private *tp,
 739				     struct phy_device *phydev)
 740{
 741	int ret;
 742
 743	r8169_apply_firmware(tp);
 744
 745	ret = phy_read_paged(phydev, 0x0a46, 0x10);
 746	if (ret & BIT(8))
 747		phy_modify_paged(phydev, 0x0bcc, 0x12, BIT(15), 0);
 748	else
 749		phy_modify_paged(phydev, 0x0bcc, 0x12, 0, BIT(15));
 750
 751	ret = phy_read_paged(phydev, 0x0a46, 0x13);
 752	if (ret & BIT(8))
 753		phy_modify_paged(phydev, 0x0c41, 0x15, 0, BIT(1));
 754	else
 755		phy_modify_paged(phydev, 0x0c41, 0x15, BIT(1), 0);
 756
 757	/* Enable PHY auto speed down */
 758	phy_modify_paged(phydev, 0x0a44, 0x11, 0, BIT(3) | BIT(2));
 759
 760	rtl8168g_phy_adjust_10m_aldps(phydev);
 761
 762	/* EEE auto-fallback function */
 763	phy_modify_paged(phydev, 0x0a4b, 0x11, 0, BIT(2));
 764
 765	/* Enable UC LPF tune function */
 766	r8168g_phy_param(phydev, 0x8012, 0x0000, 0x8000);
 767
 768	phy_modify_paged(phydev, 0x0c42, 0x11, BIT(13), BIT(14));
 769
 770	/* Improve SWR Efficiency */
 771	phy_write(phydev, 0x1f, 0x0bcd);
 772	phy_write(phydev, 0x14, 0x5065);
 773	phy_write(phydev, 0x14, 0xd065);
 774	phy_write(phydev, 0x1f, 0x0bc8);
 775	phy_write(phydev, 0x11, 0x5655);
 776	phy_write(phydev, 0x1f, 0x0bcd);
 777	phy_write(phydev, 0x14, 0x1065);
 778	phy_write(phydev, 0x14, 0x9065);
 779	phy_write(phydev, 0x14, 0x1065);
 780	phy_write(phydev, 0x1f, 0x0000);
 781
 782	rtl8168g_disable_aldps(phydev);
 783	rtl8168g_config_eee_phy(phydev);
 784}
 785
 786static void rtl8168g_2_hw_phy_config(struct rtl8169_private *tp,
 787				     struct phy_device *phydev)
 788{
 789	r8169_apply_firmware(tp);
 790	rtl8168g_config_eee_phy(phydev);
 791}
 792
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 793static void rtl8168h_2_hw_phy_config(struct rtl8169_private *tp,
 794				     struct phy_device *phydev)
 795{
 796	u16 ioffset, rlen;
 797	u32 data;
 798
 799	r8169_apply_firmware(tp);
 800
 801	/* CHIN EST parameter update */
 802	r8168g_phy_param(phydev, 0x808a, 0x003f, 0x000a);
 803
 804	/* enable R-tune & PGA-retune function */
 805	r8168g_phy_param(phydev, 0x0811, 0x0000, 0x0800);
 806	phy_modify_paged(phydev, 0x0a42, 0x16, 0x0000, 0x0002);
 807
 808	rtl8168g_enable_gphy_10m(phydev);
 809
 810	ioffset = rtl8168h_2_get_adc_bias_ioffset(tp);
 811	if (ioffset != 0xffff)
 812		phy_write_paged(phydev, 0x0bcf, 0x16, ioffset);
 813
 814	/* Modify rlen (TX LPF corner frequency) level */
 815	data = phy_read_paged(phydev, 0x0bcd, 0x16);
 816	data &= 0x000f;
 817	rlen = 0;
 818	if (data > 3)
 819		rlen = data - 3;
 820	data = rlen | (rlen << 4) | (rlen << 8) | (rlen << 12);
 821	phy_write_paged(phydev, 0x0bcd, 0x17, data);
 822
 823	/* disable phy pfm mode */
 824	phy_modify_paged(phydev, 0x0a44, 0x11, BIT(7), 0);
 825
 826	/* disable 10m pll off */
 827	phy_modify_paged(phydev, 0x0a43, 0x10, BIT(0), 0);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 828
 829	rtl8168g_disable_aldps(phydev);
 830	rtl8168g_config_eee_phy(phydev);
 831}
 832
 833static void rtl8168ep_2_hw_phy_config(struct rtl8169_private *tp,
 834				      struct phy_device *phydev)
 835{
 836	rtl8168g_phy_adjust_10m_aldps(phydev);
 837
 838	/* Enable UC LPF tune function */
 839	r8168g_phy_param(phydev, 0x8012, 0x0000, 0x8000);
 840
 841	/* Set rg_sel_sdm_rate */
 842	phy_modify_paged(phydev, 0x0c42, 0x11, BIT(13), BIT(14));
 843
 844	/* Channel estimation parameters */
 845	r8168g_phy_param(phydev, 0x80f3, 0xff00, 0x8b00);
 846	r8168g_phy_param(phydev, 0x80f0, 0xff00, 0x3a00);
 847	r8168g_phy_param(phydev, 0x80ef, 0xff00, 0x0500);
 848	r8168g_phy_param(phydev, 0x80f6, 0xff00, 0x6e00);
 849	r8168g_phy_param(phydev, 0x80ec, 0xff00, 0x6800);
 850	r8168g_phy_param(phydev, 0x80ed, 0xff00, 0x7c00);
 851	r8168g_phy_param(phydev, 0x80f2, 0xff00, 0xf400);
 852	r8168g_phy_param(phydev, 0x80f4, 0xff00, 0x8500);
 853	r8168g_phy_param(phydev, 0x8110, 0xff00, 0xa800);
 854	r8168g_phy_param(phydev, 0x810f, 0xff00, 0x1d00);
 855	r8168g_phy_param(phydev, 0x8111, 0xff00, 0xf500);
 856	r8168g_phy_param(phydev, 0x8113, 0xff00, 0x6100);
 857	r8168g_phy_param(phydev, 0x8115, 0xff00, 0x9200);
 858	r8168g_phy_param(phydev, 0x810e, 0xff00, 0x0400);
 859	r8168g_phy_param(phydev, 0x810c, 0xff00, 0x7c00);
 860	r8168g_phy_param(phydev, 0x810b, 0xff00, 0x5a00);
 861	r8168g_phy_param(phydev, 0x80d1, 0xff00, 0xff00);
 862	r8168g_phy_param(phydev, 0x80cd, 0xff00, 0x9e00);
 863	r8168g_phy_param(phydev, 0x80d3, 0xff00, 0x0e00);
 864	r8168g_phy_param(phydev, 0x80d5, 0xff00, 0xca00);
 865	r8168g_phy_param(phydev, 0x80d7, 0xff00, 0x8400);
 866
 867	/* Force PWM-mode */
 868	phy_write(phydev, 0x1f, 0x0bcd);
 869	phy_write(phydev, 0x14, 0x5065);
 870	phy_write(phydev, 0x14, 0xd065);
 871	phy_write(phydev, 0x1f, 0x0bc8);
 872	phy_write(phydev, 0x12, 0x00ed);
 873	phy_write(phydev, 0x1f, 0x0bcd);
 874	phy_write(phydev, 0x14, 0x1065);
 875	phy_write(phydev, 0x14, 0x9065);
 876	phy_write(phydev, 0x14, 0x1065);
 877	phy_write(phydev, 0x1f, 0x0000);
 878
 879	rtl8168g_disable_aldps(phydev);
 880	rtl8168g_config_eee_phy(phydev);
 881}
 882
 883static void rtl8117_hw_phy_config(struct rtl8169_private *tp,
 884				  struct phy_device *phydev)
 885{
 886	/* CHN EST parameters adjust - fnet */
 887	r8168g_phy_param(phydev, 0x808e, 0xff00, 0x4800);
 888	r8168g_phy_param(phydev, 0x8090, 0xff00, 0xcc00);
 889	r8168g_phy_param(phydev, 0x8092, 0xff00, 0xb000);
 890
 891	r8168g_phy_param(phydev, 0x8088, 0xff00, 0x6000);
 892	r8168g_phy_param(phydev, 0x808b, 0x3f00, 0x0b00);
 893	r8168g_phy_param(phydev, 0x808d, 0x1f00, 0x0600);
 894	r8168g_phy_param(phydev, 0x808c, 0xff00, 0xb000);
 895	r8168g_phy_param(phydev, 0x80a0, 0xff00, 0x2800);
 896	r8168g_phy_param(phydev, 0x80a2, 0xff00, 0x5000);
 897	r8168g_phy_param(phydev, 0x809b, 0xf800, 0xb000);
 898	r8168g_phy_param(phydev, 0x809a, 0xff00, 0x4b00);
 899	r8168g_phy_param(phydev, 0x809d, 0x3f00, 0x0800);
 900	r8168g_phy_param(phydev, 0x80a1, 0xff00, 0x7000);
 901	r8168g_phy_param(phydev, 0x809f, 0x1f00, 0x0300);
 902	r8168g_phy_param(phydev, 0x809e, 0xff00, 0x8800);
 903	r8168g_phy_param(phydev, 0x80b2, 0xff00, 0x2200);
 904	r8168g_phy_param(phydev, 0x80ad, 0xf800, 0x9800);
 905	r8168g_phy_param(phydev, 0x80af, 0x3f00, 0x0800);
 906	r8168g_phy_param(phydev, 0x80b3, 0xff00, 0x6f00);
 907	r8168g_phy_param(phydev, 0x80b1, 0x1f00, 0x0300);
 908	r8168g_phy_param(phydev, 0x80b0, 0xff00, 0x9300);
 909
 910	r8168g_phy_param(phydev, 0x8011, 0x0000, 0x0800);
 911
 912	rtl8168g_enable_gphy_10m(phydev);
 913
 914	r8168g_phy_param(phydev, 0x8016, 0x0000, 0x0400);
 915
 916	rtl8168g_disable_aldps(phydev);
 917	rtl8168h_config_eee_phy(phydev);
 918}
 919
 920static void rtl8102e_hw_phy_config(struct rtl8169_private *tp,
 921				   struct phy_device *phydev)
 922{
 923	static const struct phy_reg phy_reg_init[] = {
 924		{ 0x1f, 0x0003 },
 925		{ 0x08, 0x441d },
 926		{ 0x01, 0x9100 },
 927		{ 0x1f, 0x0000 }
 928	};
 929
 930	phy_set_bits(phydev, 0x11, BIT(12));
 931	phy_set_bits(phydev, 0x19, BIT(13));
 932	phy_set_bits(phydev, 0x10, BIT(15));
 933
 934	rtl_writephy_batch(phydev, phy_reg_init);
 935}
 936
 937static void rtl8401_hw_phy_config(struct rtl8169_private *tp,
 938				  struct phy_device *phydev)
 939{
 940	phy_set_bits(phydev, 0x11, BIT(12));
 941	phy_modify_paged(phydev, 0x0002, 0x0f, 0x0000, 0x0003);
 942}
 943
 944static void rtl8105e_hw_phy_config(struct rtl8169_private *tp,
 945				   struct phy_device *phydev)
 946{
 947	/* Disable ALDPS before ram code */
 948	phy_write(phydev, 0x18, 0x0310);
 949	msleep(100);
 950
 951	r8169_apply_firmware(tp);
 952
 953	phy_write_paged(phydev, 0x0005, 0x1a, 0x0000);
 954	phy_write_paged(phydev, 0x0004, 0x1c, 0x0000);
 955	phy_write_paged(phydev, 0x0001, 0x15, 0x7701);
 956}
 957
 958static void rtl8402_hw_phy_config(struct rtl8169_private *tp,
 959				  struct phy_device *phydev)
 960{
 961	/* Disable ALDPS before setting firmware */
 962	phy_write(phydev, 0x18, 0x0310);
 963	msleep(20);
 964
 965	r8169_apply_firmware(tp);
 966
 967	/* EEE setting */
 968	phy_write(phydev, 0x1f, 0x0004);
 969	phy_write(phydev, 0x10, 0x401f);
 970	phy_write(phydev, 0x19, 0x7030);
 971	phy_write(phydev, 0x1f, 0x0000);
 972}
 973
 974static void rtl8106e_hw_phy_config(struct rtl8169_private *tp,
 975				   struct phy_device *phydev)
 976{
 977	static const struct phy_reg phy_reg_init[] = {
 978		{ 0x1f, 0x0004 },
 979		{ 0x10, 0xc07f },
 980		{ 0x19, 0x7030 },
 981		{ 0x1f, 0x0000 }
 982	};
 983
 984	/* Disable ALDPS before ram code */
 985	phy_write(phydev, 0x18, 0x0310);
 986	msleep(100);
 987
 988	r8169_apply_firmware(tp);
 989
 990	rtl_writephy_batch(phydev, phy_reg_init);
 991}
 992
 993static void rtl8125_legacy_force_mode(struct phy_device *phydev)
 994{
 995	phy_modify_paged(phydev, 0xa5b, 0x12, BIT(15), 0);
 996}
 997
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 998static void rtl8125a_2_hw_phy_config(struct rtl8169_private *tp,
 999				     struct phy_device *phydev)
1000{
1001	int i;
1002
1003	phy_modify_paged(phydev, 0xad4, 0x17, 0x0000, 0x0010);
1004	phy_modify_paged(phydev, 0xad1, 0x13, 0x03ff, 0x03ff);
1005	phy_modify_paged(phydev, 0xad3, 0x11, 0x003f, 0x0006);
1006	phy_modify_paged(phydev, 0xac0, 0x14, 0x1100, 0x0000);
1007	phy_modify_paged(phydev, 0xacc, 0x10, 0x0003, 0x0002);
1008	phy_modify_paged(phydev, 0xad4, 0x10, 0x00e7, 0x0044);
1009	phy_modify_paged(phydev, 0xac1, 0x12, 0x0080, 0x0000);
1010	phy_modify_paged(phydev, 0xac8, 0x10, 0x0300, 0x0000);
1011	phy_modify_paged(phydev, 0xac5, 0x17, 0x0007, 0x0002);
1012	phy_write_paged(phydev, 0xad4, 0x16, 0x00a8);
1013	phy_write_paged(phydev, 0xac5, 0x16, 0x01ff);
1014	phy_modify_paged(phydev, 0xac8, 0x15, 0x00f0, 0x0030);
1015
1016	phy_write(phydev, 0x1f, 0x0b87);
1017	phy_write(phydev, 0x16, 0x80a2);
1018	phy_write(phydev, 0x17, 0x0153);
1019	phy_write(phydev, 0x16, 0x809c);
1020	phy_write(phydev, 0x17, 0x0153);
1021	phy_write(phydev, 0x1f, 0x0000);
1022
1023	phy_write(phydev, 0x1f, 0x0a43);
1024	phy_write(phydev, 0x13, 0x81B3);
1025	phy_write(phydev, 0x14, 0x0043);
1026	phy_write(phydev, 0x14, 0x00A7);
1027	phy_write(phydev, 0x14, 0x00D6);
1028	phy_write(phydev, 0x14, 0x00EC);
1029	phy_write(phydev, 0x14, 0x00F6);
1030	phy_write(phydev, 0x14, 0x00FB);
1031	phy_write(phydev, 0x14, 0x00FD);
1032	phy_write(phydev, 0x14, 0x00FF);
1033	phy_write(phydev, 0x14, 0x00BB);
1034	phy_write(phydev, 0x14, 0x0058);
1035	phy_write(phydev, 0x14, 0x0029);
1036	phy_write(phydev, 0x14, 0x0013);
1037	phy_write(phydev, 0x14, 0x0009);
1038	phy_write(phydev, 0x14, 0x0004);
1039	phy_write(phydev, 0x14, 0x0002);
1040	for (i = 0; i < 25; i++)
1041		phy_write(phydev, 0x14, 0x0000);
1042	phy_write(phydev, 0x1f, 0x0000);
1043
1044	r8168g_phy_param(phydev, 0x8257, 0xffff, 0x020F);
1045	r8168g_phy_param(phydev, 0x80ea, 0xffff, 0x7843);
1046
1047	r8169_apply_firmware(tp);
1048
1049	phy_modify_paged(phydev, 0xd06, 0x14, 0x0000, 0x2000);
1050
1051	r8168g_phy_param(phydev, 0x81a2, 0x0000, 0x0100);
1052
1053	phy_modify_paged(phydev, 0xb54, 0x16, 0xff00, 0xdb00);
1054	phy_modify_paged(phydev, 0xa45, 0x12, 0x0001, 0x0000);
1055	phy_modify_paged(phydev, 0xa5d, 0x12, 0x0000, 0x0020);
1056	phy_modify_paged(phydev, 0xad4, 0x17, 0x0010, 0x0000);
1057	phy_modify_paged(phydev, 0xa86, 0x15, 0x0001, 0x0000);
1058	rtl8168g_enable_gphy_10m(phydev);
1059
1060	rtl8168g_disable_aldps(phydev);
1061	rtl8125_config_eee_phy(phydev);
1062}
1063
1064static void rtl8125b_hw_phy_config(struct rtl8169_private *tp,
1065				   struct phy_device *phydev)
1066{
1067	r8169_apply_firmware(tp);
1068	rtl8168g_enable_gphy_10m(phydev);
1069
 
1070	phy_modify_paged(phydev, 0xac4, 0x13, 0x00f0, 0x0090);
1071	phy_modify_paged(phydev, 0xad3, 0x10, 0x0003, 0x0001);
1072
1073	phy_write(phydev, 0x1f, 0x0b87);
1074	phy_write(phydev, 0x16, 0x80f5);
1075	phy_write(phydev, 0x17, 0x760e);
1076	phy_write(phydev, 0x16, 0x8107);
1077	phy_write(phydev, 0x17, 0x360e);
1078	phy_write(phydev, 0x16, 0x8551);
1079	phy_modify(phydev, 0x17, 0xff00, 0x0800);
1080	phy_write(phydev, 0x1f, 0x0000);
1081
1082	phy_modify_paged(phydev, 0xbf0, 0x10, 0xe000, 0xa000);
1083	phy_modify_paged(phydev, 0xbf4, 0x13, 0x0f00, 0x0300);
1084
1085	r8168g_phy_param(phydev, 0x8044, 0xffff, 0x2417);
1086	r8168g_phy_param(phydev, 0x804a, 0xffff, 0x2417);
1087	r8168g_phy_param(phydev, 0x8050, 0xffff, 0x2417);
1088	r8168g_phy_param(phydev, 0x8056, 0xffff, 0x2417);
1089	r8168g_phy_param(phydev, 0x805c, 0xffff, 0x2417);
1090	r8168g_phy_param(phydev, 0x8062, 0xffff, 0x2417);
1091	r8168g_phy_param(phydev, 0x8068, 0xffff, 0x2417);
1092	r8168g_phy_param(phydev, 0x806e, 0xffff, 0x2417);
1093	r8168g_phy_param(phydev, 0x8074, 0xffff, 0x2417);
1094	r8168g_phy_param(phydev, 0x807a, 0xffff, 0x2417);
1095
1096	phy_modify_paged(phydev, 0xa4c, 0x15, 0x0000, 0x0040);
1097	phy_modify_paged(phydev, 0xbf8, 0x12, 0xe000, 0xa000);
1098
1099	rtl8125_legacy_force_mode(phydev);
1100	rtl8168g_disable_aldps(phydev);
1101	rtl8125_config_eee_phy(phydev);
1102}
1103
1104static void rtl8125d_hw_phy_config(struct rtl8169_private *tp,
1105				   struct phy_device *phydev)
1106{
1107	r8169_apply_firmware(tp);
1108	rtl8168g_enable_gphy_10m(phydev);
1109	rtl8125_legacy_force_mode(phydev);
1110	rtl8168g_disable_aldps(phydev);
1111	rtl8125_config_eee_phy(phydev);
1112}
1113
1114static void rtl8126a_hw_phy_config(struct rtl8169_private *tp,
1115				   struct phy_device *phydev)
1116{
1117	r8169_apply_firmware(tp);
1118	rtl8168g_enable_gphy_10m(phydev);
1119	rtl8125_legacy_force_mode(phydev);
1120	rtl8168g_disable_aldps(phydev);
1121	rtl8125_common_config_eee_phy(phydev);
1122}
1123
1124void r8169_hw_phy_config(struct rtl8169_private *tp, struct phy_device *phydev,
1125			 enum mac_version ver)
1126{
1127	static const rtl_phy_cfg_fct phy_configs[] = {
1128		/* PCI devices. */
1129		[RTL_GIGA_MAC_VER_02] = rtl8169s_hw_phy_config,
1130		[RTL_GIGA_MAC_VER_03] = rtl8169s_hw_phy_config,
1131		[RTL_GIGA_MAC_VER_04] = rtl8169sb_hw_phy_config,
1132		[RTL_GIGA_MAC_VER_05] = rtl8169scd_hw_phy_config,
1133		[RTL_GIGA_MAC_VER_06] = rtl8169sce_hw_phy_config,
1134		/* PCI-E devices. */
1135		[RTL_GIGA_MAC_VER_07] = rtl8102e_hw_phy_config,
1136		[RTL_GIGA_MAC_VER_08] = rtl8102e_hw_phy_config,
1137		[RTL_GIGA_MAC_VER_09] = rtl8102e_hw_phy_config,
1138		[RTL_GIGA_MAC_VER_10] = NULL,
1139		[RTL_GIGA_MAC_VER_11] = rtl8168bb_hw_phy_config,
 
 
1140		[RTL_GIGA_MAC_VER_14] = rtl8401_hw_phy_config,
 
1141		[RTL_GIGA_MAC_VER_17] = rtl8168bef_hw_phy_config,
1142		[RTL_GIGA_MAC_VER_18] = rtl8168cp_1_hw_phy_config,
1143		[RTL_GIGA_MAC_VER_19] = rtl8168c_1_hw_phy_config,
1144		[RTL_GIGA_MAC_VER_20] = rtl8168c_2_hw_phy_config,
1145		[RTL_GIGA_MAC_VER_21] = rtl8168c_3_hw_phy_config,
1146		[RTL_GIGA_MAC_VER_22] = rtl8168c_3_hw_phy_config,
1147		[RTL_GIGA_MAC_VER_23] = rtl8168cp_2_hw_phy_config,
1148		[RTL_GIGA_MAC_VER_24] = rtl8168cp_2_hw_phy_config,
1149		[RTL_GIGA_MAC_VER_25] = rtl8168d_1_hw_phy_config,
1150		[RTL_GIGA_MAC_VER_26] = rtl8168d_2_hw_phy_config,
 
1151		[RTL_GIGA_MAC_VER_28] = rtl8168d_4_hw_phy_config,
1152		[RTL_GIGA_MAC_VER_29] = rtl8105e_hw_phy_config,
1153		[RTL_GIGA_MAC_VER_30] = rtl8105e_hw_phy_config,
1154		[RTL_GIGA_MAC_VER_31] = NULL,
1155		[RTL_GIGA_MAC_VER_32] = rtl8168e_1_hw_phy_config,
1156		[RTL_GIGA_MAC_VER_33] = rtl8168e_1_hw_phy_config,
1157		[RTL_GIGA_MAC_VER_34] = rtl8168e_2_hw_phy_config,
1158		[RTL_GIGA_MAC_VER_35] = rtl8168f_1_hw_phy_config,
1159		[RTL_GIGA_MAC_VER_36] = rtl8168f_2_hw_phy_config,
1160		[RTL_GIGA_MAC_VER_37] = rtl8402_hw_phy_config,
1161		[RTL_GIGA_MAC_VER_38] = rtl8411_hw_phy_config,
1162		[RTL_GIGA_MAC_VER_39] = rtl8106e_hw_phy_config,
1163		[RTL_GIGA_MAC_VER_40] = rtl8168g_1_hw_phy_config,
 
1164		[RTL_GIGA_MAC_VER_42] = rtl8168g_2_hw_phy_config,
1165		[RTL_GIGA_MAC_VER_43] = rtl8168g_2_hw_phy_config,
1166		[RTL_GIGA_MAC_VER_44] = rtl8168g_2_hw_phy_config,
 
1167		[RTL_GIGA_MAC_VER_46] = rtl8168h_2_hw_phy_config,
 
1168		[RTL_GIGA_MAC_VER_48] = rtl8168h_2_hw_phy_config,
 
 
1169		[RTL_GIGA_MAC_VER_51] = rtl8168ep_2_hw_phy_config,
1170		[RTL_GIGA_MAC_VER_52] = rtl8117_hw_phy_config,
1171		[RTL_GIGA_MAC_VER_53] = rtl8117_hw_phy_config,
 
1172		[RTL_GIGA_MAC_VER_61] = rtl8125a_2_hw_phy_config,
1173		[RTL_GIGA_MAC_VER_63] = rtl8125b_hw_phy_config,
1174		[RTL_GIGA_MAC_VER_64] = rtl8125d_hw_phy_config,
1175		[RTL_GIGA_MAC_VER_65] = rtl8126a_hw_phy_config,
1176		[RTL_GIGA_MAC_VER_66] = rtl8126a_hw_phy_config,
1177	};
1178
1179	if (phy_configs[ver])
1180		phy_configs[ver](tp, phydev);
1181}
v5.14.15
   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 const struct phy_reg rtl8168d_1_phy_reg_init_1[] = {
 433	{ 0x1f, 0x0002 },
 434	{ 0x05, 0x669a },
 435	{ 0x1f, 0x0005 },
 436	{ 0x05, 0x8330 },
 437	{ 0x06, 0x669a },
 438	{ 0x1f, 0x0002 }
 439};
 440
 441static void rtl8168d_apply_firmware_cond(struct rtl8169_private *tp,
 442					 struct phy_device *phydev,
 443					 u16 val)
 444{
 445	u16 reg_val;
 446
 447	phy_write(phydev, 0x1f, 0x0005);
 448	phy_write(phydev, 0x05, 0x001b);
 449	reg_val = phy_read(phydev, 0x06);
 450	phy_write(phydev, 0x1f, 0x0000);
 451
 452	if (reg_val != val)
 453		phydev_warn(phydev, "chipset not ready for firmware\n");
 454	else
 455		r8169_apply_firmware(tp);
 456}
 457
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 458static void rtl8168d_1_hw_phy_config(struct rtl8169_private *tp,
 459				     struct phy_device *phydev)
 460{
 461	rtl_writephy_batch(phydev, rtl8168d_1_phy_reg_init_0);
 462
 463	/*
 464	 * Rx Error Issue
 465	 * Fine Tune Switching regulator parameter
 466	 */
 467	phy_write(phydev, 0x1f, 0x0002);
 468	phy_modify(phydev, 0x0b, 0x00ef, 0x0010);
 469	phy_modify(phydev, 0x0c, 0x5d00, 0xa200);
 470
 471	if (rtl8168d_efuse_read(tp, 0x01) == 0xb1) {
 472		int val;
 473
 474		rtl_writephy_batch(phydev, rtl8168d_1_phy_reg_init_1);
 475
 476		val = phy_read(phydev, 0x0d);
 477
 478		if ((val & 0x00ff) != 0x006c) {
 479			static const u32 set[] = {
 480				0x0065, 0x0066, 0x0067, 0x0068,
 481				0x0069, 0x006a, 0x006b, 0x006c
 482			};
 483			int i;
 484
 485			phy_write(phydev, 0x1f, 0x0002);
 486
 487			val &= 0xff00;
 488			for (i = 0; i < ARRAY_SIZE(set); i++)
 489				phy_write(phydev, 0x0d, val | set[i]);
 490		}
 491	} else {
 492		phy_write_paged(phydev, 0x0002, 0x05, 0x6662);
 493		r8168d_phy_param(phydev, 0x8330, 0xffff, 0x6662);
 494	}
 495
 496	/* RSET couple improve */
 497	phy_write(phydev, 0x1f, 0x0002);
 498	phy_set_bits(phydev, 0x0d, 0x0300);
 499	phy_set_bits(phydev, 0x0f, 0x0010);
 500
 501	/* Fine tune PLL performance */
 502	phy_write(phydev, 0x1f, 0x0002);
 503	phy_modify(phydev, 0x02, 0x0600, 0x0100);
 504	phy_clear_bits(phydev, 0x03, 0xe000);
 505	phy_write(phydev, 0x1f, 0x0000);
 506
 507	rtl8168d_apply_firmware_cond(tp, phydev, 0xbf00);
 508}
 509
 510static void rtl8168d_2_hw_phy_config(struct rtl8169_private *tp,
 511				     struct phy_device *phydev)
 512{
 513	rtl_writephy_batch(phydev, rtl8168d_1_phy_reg_init_0);
 514
 515	if (rtl8168d_efuse_read(tp, 0x01) == 0xb1) {
 516		int val;
 517
 518		rtl_writephy_batch(phydev, rtl8168d_1_phy_reg_init_1);
 519
 520		val = phy_read(phydev, 0x0d);
 521		if ((val & 0x00ff) != 0x006c) {
 522			static const u32 set[] = {
 523				0x0065, 0x0066, 0x0067, 0x0068,
 524				0x0069, 0x006a, 0x006b, 0x006c
 525			};
 526			int i;
 527
 528			phy_write(phydev, 0x1f, 0x0002);
 529
 530			val &= 0xff00;
 531			for (i = 0; i < ARRAY_SIZE(set); i++)
 532				phy_write(phydev, 0x0d, val | set[i]);
 533		}
 534	} else {
 535		phy_write_paged(phydev, 0x0002, 0x05, 0x2642);
 536		r8168d_phy_param(phydev, 0x8330, 0xffff, 0x2642);
 537	}
 538
 539	/* Fine tune PLL performance */
 540	phy_write(phydev, 0x1f, 0x0002);
 541	phy_modify(phydev, 0x02, 0x0600, 0x0100);
 542	phy_clear_bits(phydev, 0x03, 0xe000);
 543	phy_write(phydev, 0x1f, 0x0000);
 544
 545	/* Switching regulator Slew rate */
 546	phy_modify_paged(phydev, 0x0002, 0x0f, 0x0000, 0x0017);
 547
 548	rtl8168d_apply_firmware_cond(tp, phydev, 0xb300);
 549}
 550
 551static void rtl8168d_3_hw_phy_config(struct rtl8169_private *tp,
 552				     struct phy_device *phydev)
 553{
 554	static const struct phy_reg phy_reg_init[] = {
 555		{ 0x1f, 0x0002 },
 556		{ 0x10, 0x0008 },
 557		{ 0x0d, 0x006c },
 558
 559		{ 0x1f, 0x0000 },
 560		{ 0x0d, 0xf880 },
 561
 562		{ 0x1f, 0x0001 },
 563		{ 0x17, 0x0cc0 },
 564
 565		{ 0x1f, 0x0001 },
 566		{ 0x0b, 0xa4d8 },
 567		{ 0x09, 0x281c },
 568		{ 0x07, 0x2883 },
 569		{ 0x0a, 0x6b35 },
 570		{ 0x1d, 0x3da4 },
 571		{ 0x1c, 0xeffd },
 572		{ 0x14, 0x7f52 },
 573		{ 0x18, 0x7fc6 },
 574		{ 0x08, 0x0601 },
 575		{ 0x06, 0x4063 },
 576		{ 0x10, 0xf074 },
 577		{ 0x1f, 0x0003 },
 578		{ 0x13, 0x0789 },
 579		{ 0x12, 0xf4bd },
 580		{ 0x1a, 0x04fd },
 581		{ 0x14, 0x84b0 },
 582		{ 0x1f, 0x0000 },
 583		{ 0x00, 0x9200 },
 584
 585		{ 0x1f, 0x0005 },
 586		{ 0x01, 0x0340 },
 587		{ 0x1f, 0x0001 },
 588		{ 0x04, 0x4000 },
 589		{ 0x03, 0x1d21 },
 590		{ 0x02, 0x0c32 },
 591		{ 0x01, 0x0200 },
 592		{ 0x00, 0x5554 },
 593		{ 0x04, 0x4800 },
 594		{ 0x04, 0x4000 },
 595		{ 0x04, 0xf000 },
 596		{ 0x03, 0xdf01 },
 597		{ 0x02, 0xdf20 },
 598		{ 0x01, 0x101a },
 599		{ 0x00, 0xa0ff },
 600		{ 0x04, 0xf800 },
 601		{ 0x04, 0xf000 },
 602		{ 0x1f, 0x0000 },
 603	};
 604
 605	rtl_writephy_batch(phydev, phy_reg_init);
 606	r8168d_modify_extpage(phydev, 0x0023, 0x16, 0xffff, 0x0000);
 607}
 608
 609static void rtl8168d_4_hw_phy_config(struct rtl8169_private *tp,
 610				     struct phy_device *phydev)
 611{
 612	phy_write_paged(phydev, 0x0001, 0x17, 0x0cc0);
 613	r8168d_modify_extpage(phydev, 0x002d, 0x18, 0xffff, 0x0040);
 614	phy_set_bits(phydev, 0x0d, BIT(5));
 615}
 616
 617static void rtl8168e_1_hw_phy_config(struct rtl8169_private *tp,
 618				     struct phy_device *phydev)
 619{
 620	static const struct phy_reg phy_reg_init[] = {
 621		/* Channel estimation fine tune */
 622		{ 0x1f, 0x0001 },
 623		{ 0x0b, 0x6c20 },
 624		{ 0x07, 0x2872 },
 625		{ 0x1c, 0xefff },
 626		{ 0x1f, 0x0003 },
 627		{ 0x14, 0x6420 },
 628		{ 0x1f, 0x0000 },
 629	};
 630
 631	r8169_apply_firmware(tp);
 632
 633	/* Enable Delay cap */
 634	r8168d_phy_param(phydev, 0x8b80, 0xffff, 0xc896);
 635
 636	rtl_writephy_batch(phydev, phy_reg_init);
 637
 638	/* Update PFM & 10M TX idle timer */
 639	r8168d_modify_extpage(phydev, 0x002f, 0x15, 0xffff, 0x1919);
 640
 641	r8168d_modify_extpage(phydev, 0x00ac, 0x18, 0xffff, 0x0006);
 642
 643	/* DCO enable for 10M IDLE Power */
 644	r8168d_modify_extpage(phydev, 0x0023, 0x17, 0x0000, 0x0006);
 645
 646	/* For impedance matching */
 647	phy_modify_paged(phydev, 0x0002, 0x08, 0x7f00, 0x8000);
 648
 649	/* PHY auto speed down */
 650	r8168d_modify_extpage(phydev, 0x002d, 0x18, 0x0000, 0x0050);
 651	phy_set_bits(phydev, 0x14, BIT(15));
 652
 653	r8168d_phy_param(phydev, 0x8b86, 0x0000, 0x0001);
 654	r8168d_phy_param(phydev, 0x8b85, 0x2000, 0x0000);
 655
 656	r8168d_modify_extpage(phydev, 0x0020, 0x15, 0x1100, 0x0000);
 657	phy_write_paged(phydev, 0x0006, 0x00, 0x5a00);
 658
 659	phy_write_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_ADV, 0x0000);
 660}
 661
 662static void rtl8168e_2_hw_phy_config(struct rtl8169_private *tp,
 663				     struct phy_device *phydev)
 664{
 665	r8169_apply_firmware(tp);
 666
 667	/* Enable Delay cap */
 668	r8168d_modify_extpage(phydev, 0x00ac, 0x18, 0xffff, 0x0006);
 669
 670	/* Channel estimation fine tune */
 671	phy_write_paged(phydev, 0x0003, 0x09, 0xa20f);
 672
 673	/* Green Setting */
 674	r8168d_phy_param(phydev, 0x8b5b, 0xffff, 0x9222);
 675	r8168d_phy_param(phydev, 0x8b6d, 0xffff, 0x8000);
 676	r8168d_phy_param(phydev, 0x8b76, 0xffff, 0x8000);
 677
 678	/* For 4-corner performance improve */
 679	phy_write(phydev, 0x1f, 0x0005);
 680	phy_write(phydev, 0x05, 0x8b80);
 681	phy_set_bits(phydev, 0x17, 0x0006);
 682	phy_write(phydev, 0x1f, 0x0000);
 683
 684	/* PHY auto speed down */
 685	r8168d_modify_extpage(phydev, 0x002d, 0x18, 0x0000, 0x0010);
 686	phy_set_bits(phydev, 0x14, BIT(15));
 687
 688	/* improve 10M EEE waveform */
 689	r8168d_phy_param(phydev, 0x8b86, 0x0000, 0x0001);
 690
 691	/* Improve 2-pair detection performance */
 692	r8168d_phy_param(phydev, 0x8b85, 0x0000, 0x4000);
 693
 694	rtl8168f_config_eee_phy(phydev);
 695
 696	/* Green feature */
 697	phy_write(phydev, 0x1f, 0x0003);
 698	phy_set_bits(phydev, 0x19, BIT(0));
 699	phy_set_bits(phydev, 0x10, BIT(10));
 700	phy_write(phydev, 0x1f, 0x0000);
 701	phy_modify_paged(phydev, 0x0005, 0x01, 0, BIT(8));
 702}
 703
 704static void rtl8168f_hw_phy_config(struct rtl8169_private *tp,
 705				   struct phy_device *phydev)
 706{
 707	/* For 4-corner performance improve */
 708	r8168d_phy_param(phydev, 0x8b80, 0x0000, 0x0006);
 709
 710	/* PHY auto speed down */
 711	r8168d_modify_extpage(phydev, 0x002d, 0x18, 0x0000, 0x0010);
 712	phy_set_bits(phydev, 0x14, BIT(15));
 713
 714	/* Improve 10M EEE waveform */
 715	r8168d_phy_param(phydev, 0x8b86, 0x0000, 0x0001);
 716
 717	rtl8168f_config_eee_phy(phydev);
 718}
 719
 720static void rtl8168f_1_hw_phy_config(struct rtl8169_private *tp,
 721				     struct phy_device *phydev)
 722{
 723	r8169_apply_firmware(tp);
 724
 725	/* Channel estimation fine tune */
 726	phy_write_paged(phydev, 0x0003, 0x09, 0xa20f);
 727
 728	/* Modify green table for giga & fnet */
 729	r8168d_phy_param(phydev, 0x8b55, 0xffff, 0x0000);
 730	r8168d_phy_param(phydev, 0x8b5e, 0xffff, 0x0000);
 731	r8168d_phy_param(phydev, 0x8b67, 0xffff, 0x0000);
 732	r8168d_phy_param(phydev, 0x8b70, 0xffff, 0x0000);
 733	r8168d_modify_extpage(phydev, 0x0078, 0x17, 0xffff, 0x0000);
 734	r8168d_modify_extpage(phydev, 0x0078, 0x19, 0xffff, 0x00fb);
 735
 736	/* Modify green table for 10M */
 737	r8168d_phy_param(phydev, 0x8b79, 0xffff, 0xaa00);
 738
 739	/* Disable hiimpedance detection (RTCT) */
 740	phy_write_paged(phydev, 0x0003, 0x01, 0x328a);
 741
 742	rtl8168f_hw_phy_config(tp, phydev);
 743
 744	/* Improve 2-pair detection performance */
 745	r8168d_phy_param(phydev, 0x8b85, 0x0000, 0x4000);
 746}
 747
 748static void rtl8168f_2_hw_phy_config(struct rtl8169_private *tp,
 749				     struct phy_device *phydev)
 750{
 751	r8169_apply_firmware(tp);
 752
 753	rtl8168f_hw_phy_config(tp, phydev);
 754}
 755
 756static void rtl8411_hw_phy_config(struct rtl8169_private *tp,
 757				  struct phy_device *phydev)
 758{
 759	r8169_apply_firmware(tp);
 760
 761	rtl8168f_hw_phy_config(tp, phydev);
 762
 763	/* Improve 2-pair detection performance */
 764	r8168d_phy_param(phydev, 0x8b85, 0x0000, 0x4000);
 765
 766	/* Channel estimation fine tune */
 767	phy_write_paged(phydev, 0x0003, 0x09, 0xa20f);
 768
 769	/* Modify green table for giga & fnet */
 770	r8168d_phy_param(phydev, 0x8b55, 0xffff, 0x0000);
 771	r8168d_phy_param(phydev, 0x8b5e, 0xffff, 0x0000);
 772	r8168d_phy_param(phydev, 0x8b67, 0xffff, 0x0000);
 773	r8168d_phy_param(phydev, 0x8b70, 0xffff, 0x0000);
 774	r8168d_modify_extpage(phydev, 0x0078, 0x17, 0xffff, 0x0000);
 775	r8168d_modify_extpage(phydev, 0x0078, 0x19, 0xffff, 0x00aa);
 776
 777	/* Modify green table for 10M */
 778	r8168d_phy_param(phydev, 0x8b79, 0xffff, 0xaa00);
 779
 780	/* Disable hiimpedance detection (RTCT) */
 781	phy_write_paged(phydev, 0x0003, 0x01, 0x328a);
 782
 783	/* Modify green table for giga */
 784	r8168d_phy_param(phydev, 0x8b54, 0x0800, 0x0000);
 785	r8168d_phy_param(phydev, 0x8b5d, 0x0800, 0x0000);
 786	r8168d_phy_param(phydev, 0x8a7c, 0x0100, 0x0000);
 787	r8168d_phy_param(phydev, 0x8a7f, 0x0000, 0x0100);
 788	r8168d_phy_param(phydev, 0x8a82, 0x0100, 0x0000);
 789	r8168d_phy_param(phydev, 0x8a85, 0x0100, 0x0000);
 790	r8168d_phy_param(phydev, 0x8a88, 0x0100, 0x0000);
 791
 792	/* uc same-seed solution */
 793	r8168d_phy_param(phydev, 0x8b85, 0x0000, 0x8000);
 794
 795	/* Green feature */
 796	phy_write(phydev, 0x1f, 0x0003);
 797	phy_clear_bits(phydev, 0x19, BIT(0));
 798	phy_clear_bits(phydev, 0x10, BIT(10));
 799	phy_write(phydev, 0x1f, 0x0000);
 800}
 801
 802static void rtl8168g_disable_aldps(struct phy_device *phydev)
 803{
 804	phy_modify_paged(phydev, 0x0a43, 0x10, BIT(2), 0);
 805}
 806
 807static void rtl8168g_enable_gphy_10m(struct phy_device *phydev)
 808{
 809	phy_modify_paged(phydev, 0x0a44, 0x11, 0, BIT(11));
 810}
 811
 812static void rtl8168g_phy_adjust_10m_aldps(struct phy_device *phydev)
 813{
 814	phy_modify_paged(phydev, 0x0bcc, 0x14, BIT(8), 0);
 815	phy_modify_paged(phydev, 0x0a44, 0x11, 0, BIT(7) | BIT(6));
 816	r8168g_phy_param(phydev, 0x8084, 0x6000, 0x0000);
 817	phy_modify_paged(phydev, 0x0a43, 0x10, 0x0000, 0x1003);
 818}
 819
 820static void rtl8168g_1_hw_phy_config(struct rtl8169_private *tp,
 821				     struct phy_device *phydev)
 822{
 823	int ret;
 824
 825	r8169_apply_firmware(tp);
 826
 827	ret = phy_read_paged(phydev, 0x0a46, 0x10);
 828	if (ret & BIT(8))
 829		phy_modify_paged(phydev, 0x0bcc, 0x12, BIT(15), 0);
 830	else
 831		phy_modify_paged(phydev, 0x0bcc, 0x12, 0, BIT(15));
 832
 833	ret = phy_read_paged(phydev, 0x0a46, 0x13);
 834	if (ret & BIT(8))
 835		phy_modify_paged(phydev, 0x0c41, 0x15, 0, BIT(1));
 836	else
 837		phy_modify_paged(phydev, 0x0c41, 0x15, BIT(1), 0);
 838
 839	/* Enable PHY auto speed down */
 840	phy_modify_paged(phydev, 0x0a44, 0x11, 0, BIT(3) | BIT(2));
 841
 842	rtl8168g_phy_adjust_10m_aldps(phydev);
 843
 844	/* EEE auto-fallback function */
 845	phy_modify_paged(phydev, 0x0a4b, 0x11, 0, BIT(2));
 846
 847	/* Enable UC LPF tune function */
 848	r8168g_phy_param(phydev, 0x8012, 0x0000, 0x8000);
 849
 850	phy_modify_paged(phydev, 0x0c42, 0x11, BIT(13), BIT(14));
 851
 852	/* Improve SWR Efficiency */
 853	phy_write(phydev, 0x1f, 0x0bcd);
 854	phy_write(phydev, 0x14, 0x5065);
 855	phy_write(phydev, 0x14, 0xd065);
 856	phy_write(phydev, 0x1f, 0x0bc8);
 857	phy_write(phydev, 0x11, 0x5655);
 858	phy_write(phydev, 0x1f, 0x0bcd);
 859	phy_write(phydev, 0x14, 0x1065);
 860	phy_write(phydev, 0x14, 0x9065);
 861	phy_write(phydev, 0x14, 0x1065);
 862	phy_write(phydev, 0x1f, 0x0000);
 863
 864	rtl8168g_disable_aldps(phydev);
 865	rtl8168g_config_eee_phy(phydev);
 866}
 867
 868static void rtl8168g_2_hw_phy_config(struct rtl8169_private *tp,
 869				     struct phy_device *phydev)
 870{
 871	r8169_apply_firmware(tp);
 872	rtl8168g_config_eee_phy(phydev);
 873}
 874
 875static void rtl8168h_1_hw_phy_config(struct rtl8169_private *tp,
 876				     struct phy_device *phydev)
 877{
 878	u16 dout_tapbin;
 879	u32 data;
 880
 881	r8169_apply_firmware(tp);
 882
 883	/* CHN EST parameters adjust - giga master */
 884	r8168g_phy_param(phydev, 0x809b, 0xf800, 0x8000);
 885	r8168g_phy_param(phydev, 0x80a2, 0xff00, 0x8000);
 886	r8168g_phy_param(phydev, 0x80a4, 0xff00, 0x8500);
 887	r8168g_phy_param(phydev, 0x809c, 0xff00, 0xbd00);
 888
 889	/* CHN EST parameters adjust - giga slave */
 890	r8168g_phy_param(phydev, 0x80ad, 0xf800, 0x7000);
 891	r8168g_phy_param(phydev, 0x80b4, 0xff00, 0x5000);
 892	r8168g_phy_param(phydev, 0x80ac, 0xff00, 0x4000);
 893
 894	/* CHN EST parameters adjust - fnet */
 895	r8168g_phy_param(phydev, 0x808e, 0xff00, 0x1200);
 896	r8168g_phy_param(phydev, 0x8090, 0xff00, 0xe500);
 897	r8168g_phy_param(phydev, 0x8092, 0xff00, 0x9f00);
 898
 899	/* enable R-tune & PGA-retune function */
 900	dout_tapbin = 0;
 901	data = phy_read_paged(phydev, 0x0a46, 0x13);
 902	data &= 3;
 903	data <<= 2;
 904	dout_tapbin |= data;
 905	data = phy_read_paged(phydev, 0x0a46, 0x12);
 906	data &= 0xc000;
 907	data >>= 14;
 908	dout_tapbin |= data;
 909	dout_tapbin = ~(dout_tapbin ^ 0x08);
 910	dout_tapbin <<= 12;
 911	dout_tapbin &= 0xf000;
 912
 913	r8168g_phy_param(phydev, 0x827a, 0xf000, dout_tapbin);
 914	r8168g_phy_param(phydev, 0x827b, 0xf000, dout_tapbin);
 915	r8168g_phy_param(phydev, 0x827c, 0xf000, dout_tapbin);
 916	r8168g_phy_param(phydev, 0x827d, 0xf000, dout_tapbin);
 917	r8168g_phy_param(phydev, 0x0811, 0x0000, 0x0800);
 918	phy_modify_paged(phydev, 0x0a42, 0x16, 0x0000, 0x0002);
 919
 920	rtl8168g_enable_gphy_10m(phydev);
 921
 922	/* SAR ADC performance */
 923	phy_modify_paged(phydev, 0x0bca, 0x17, BIT(12) | BIT(13), BIT(14));
 924
 925	r8168g_phy_param(phydev, 0x803f, 0x3000, 0x0000);
 926	r8168g_phy_param(phydev, 0x8047, 0x3000, 0x0000);
 927	r8168g_phy_param(phydev, 0x804f, 0x3000, 0x0000);
 928	r8168g_phy_param(phydev, 0x8057, 0x3000, 0x0000);
 929	r8168g_phy_param(phydev, 0x805f, 0x3000, 0x0000);
 930	r8168g_phy_param(phydev, 0x8067, 0x3000, 0x0000);
 931	r8168g_phy_param(phydev, 0x806f, 0x3000, 0x0000);
 932
 933	/* disable phy pfm mode */
 934	phy_modify_paged(phydev, 0x0a44, 0x11, BIT(7), 0);
 935
 936	rtl8168g_disable_aldps(phydev);
 937	rtl8168h_config_eee_phy(phydev);
 938}
 939
 940static void rtl8168h_2_hw_phy_config(struct rtl8169_private *tp,
 941				     struct phy_device *phydev)
 942{
 943	u16 ioffset, rlen;
 944	u32 data;
 945
 946	r8169_apply_firmware(tp);
 947
 948	/* CHIN EST parameter update */
 949	r8168g_phy_param(phydev, 0x808a, 0x003f, 0x000a);
 950
 951	/* enable R-tune & PGA-retune function */
 952	r8168g_phy_param(phydev, 0x0811, 0x0000, 0x0800);
 953	phy_modify_paged(phydev, 0x0a42, 0x16, 0x0000, 0x0002);
 954
 955	rtl8168g_enable_gphy_10m(phydev);
 956
 957	ioffset = rtl8168h_2_get_adc_bias_ioffset(tp);
 958	if (ioffset != 0xffff)
 959		phy_write_paged(phydev, 0x0bcf, 0x16, ioffset);
 960
 961	/* Modify rlen (TX LPF corner frequency) level */
 962	data = phy_read_paged(phydev, 0x0bcd, 0x16);
 963	data &= 0x000f;
 964	rlen = 0;
 965	if (data > 3)
 966		rlen = data - 3;
 967	data = rlen | (rlen << 4) | (rlen << 8) | (rlen << 12);
 968	phy_write_paged(phydev, 0x0bcd, 0x17, data);
 969
 970	/* disable phy pfm mode */
 971	phy_modify_paged(phydev, 0x0a44, 0x11, BIT(7), 0);
 972
 973	rtl8168g_disable_aldps(phydev);
 974	rtl8168g_config_eee_phy(phydev);
 975}
 976
 977static void rtl8168ep_1_hw_phy_config(struct rtl8169_private *tp,
 978				      struct phy_device *phydev)
 979{
 980	/* Enable PHY auto speed down */
 981	phy_modify_paged(phydev, 0x0a44, 0x11, 0, BIT(3) | BIT(2));
 982
 983	rtl8168g_phy_adjust_10m_aldps(phydev);
 984
 985	/* Enable EEE auto-fallback function */
 986	phy_modify_paged(phydev, 0x0a4b, 0x11, 0, BIT(2));
 987
 988	/* Enable UC LPF tune function */
 989	r8168g_phy_param(phydev, 0x8012, 0x0000, 0x8000);
 990
 991	/* set rg_sel_sdm_rate */
 992	phy_modify_paged(phydev, 0x0c42, 0x11, BIT(13), BIT(14));
 993
 994	rtl8168g_disable_aldps(phydev);
 995	rtl8168g_config_eee_phy(phydev);
 996}
 997
 998static void rtl8168ep_2_hw_phy_config(struct rtl8169_private *tp,
 999				      struct phy_device *phydev)
1000{
1001	rtl8168g_phy_adjust_10m_aldps(phydev);
1002
1003	/* Enable UC LPF tune function */
1004	r8168g_phy_param(phydev, 0x8012, 0x0000, 0x8000);
1005
1006	/* Set rg_sel_sdm_rate */
1007	phy_modify_paged(phydev, 0x0c42, 0x11, BIT(13), BIT(14));
1008
1009	/* Channel estimation parameters */
1010	r8168g_phy_param(phydev, 0x80f3, 0xff00, 0x8b00);
1011	r8168g_phy_param(phydev, 0x80f0, 0xff00, 0x3a00);
1012	r8168g_phy_param(phydev, 0x80ef, 0xff00, 0x0500);
1013	r8168g_phy_param(phydev, 0x80f6, 0xff00, 0x6e00);
1014	r8168g_phy_param(phydev, 0x80ec, 0xff00, 0x6800);
1015	r8168g_phy_param(phydev, 0x80ed, 0xff00, 0x7c00);
1016	r8168g_phy_param(phydev, 0x80f2, 0xff00, 0xf400);
1017	r8168g_phy_param(phydev, 0x80f4, 0xff00, 0x8500);
1018	r8168g_phy_param(phydev, 0x8110, 0xff00, 0xa800);
1019	r8168g_phy_param(phydev, 0x810f, 0xff00, 0x1d00);
1020	r8168g_phy_param(phydev, 0x8111, 0xff00, 0xf500);
1021	r8168g_phy_param(phydev, 0x8113, 0xff00, 0x6100);
1022	r8168g_phy_param(phydev, 0x8115, 0xff00, 0x9200);
1023	r8168g_phy_param(phydev, 0x810e, 0xff00, 0x0400);
1024	r8168g_phy_param(phydev, 0x810c, 0xff00, 0x7c00);
1025	r8168g_phy_param(phydev, 0x810b, 0xff00, 0x5a00);
1026	r8168g_phy_param(phydev, 0x80d1, 0xff00, 0xff00);
1027	r8168g_phy_param(phydev, 0x80cd, 0xff00, 0x9e00);
1028	r8168g_phy_param(phydev, 0x80d3, 0xff00, 0x0e00);
1029	r8168g_phy_param(phydev, 0x80d5, 0xff00, 0xca00);
1030	r8168g_phy_param(phydev, 0x80d7, 0xff00, 0x8400);
1031
1032	/* Force PWM-mode */
1033	phy_write(phydev, 0x1f, 0x0bcd);
1034	phy_write(phydev, 0x14, 0x5065);
1035	phy_write(phydev, 0x14, 0xd065);
1036	phy_write(phydev, 0x1f, 0x0bc8);
1037	phy_write(phydev, 0x12, 0x00ed);
1038	phy_write(phydev, 0x1f, 0x0bcd);
1039	phy_write(phydev, 0x14, 0x1065);
1040	phy_write(phydev, 0x14, 0x9065);
1041	phy_write(phydev, 0x14, 0x1065);
1042	phy_write(phydev, 0x1f, 0x0000);
1043
1044	rtl8168g_disable_aldps(phydev);
1045	rtl8168g_config_eee_phy(phydev);
1046}
1047
1048static void rtl8117_hw_phy_config(struct rtl8169_private *tp,
1049				  struct phy_device *phydev)
1050{
1051	/* CHN EST parameters adjust - fnet */
1052	r8168g_phy_param(phydev, 0x808e, 0xff00, 0x4800);
1053	r8168g_phy_param(phydev, 0x8090, 0xff00, 0xcc00);
1054	r8168g_phy_param(phydev, 0x8092, 0xff00, 0xb000);
1055
1056	r8168g_phy_param(phydev, 0x8088, 0xff00, 0x6000);
1057	r8168g_phy_param(phydev, 0x808b, 0x3f00, 0x0b00);
1058	r8168g_phy_param(phydev, 0x808d, 0x1f00, 0x0600);
1059	r8168g_phy_param(phydev, 0x808c, 0xff00, 0xb000);
1060	r8168g_phy_param(phydev, 0x80a0, 0xff00, 0x2800);
1061	r8168g_phy_param(phydev, 0x80a2, 0xff00, 0x5000);
1062	r8168g_phy_param(phydev, 0x809b, 0xf800, 0xb000);
1063	r8168g_phy_param(phydev, 0x809a, 0xff00, 0x4b00);
1064	r8168g_phy_param(phydev, 0x809d, 0x3f00, 0x0800);
1065	r8168g_phy_param(phydev, 0x80a1, 0xff00, 0x7000);
1066	r8168g_phy_param(phydev, 0x809f, 0x1f00, 0x0300);
1067	r8168g_phy_param(phydev, 0x809e, 0xff00, 0x8800);
1068	r8168g_phy_param(phydev, 0x80b2, 0xff00, 0x2200);
1069	r8168g_phy_param(phydev, 0x80ad, 0xf800, 0x9800);
1070	r8168g_phy_param(phydev, 0x80af, 0x3f00, 0x0800);
1071	r8168g_phy_param(phydev, 0x80b3, 0xff00, 0x6f00);
1072	r8168g_phy_param(phydev, 0x80b1, 0x1f00, 0x0300);
1073	r8168g_phy_param(phydev, 0x80b0, 0xff00, 0x9300);
1074
1075	r8168g_phy_param(phydev, 0x8011, 0x0000, 0x0800);
1076
1077	rtl8168g_enable_gphy_10m(phydev);
1078
1079	r8168g_phy_param(phydev, 0x8016, 0x0000, 0x0400);
1080
1081	rtl8168g_disable_aldps(phydev);
1082	rtl8168h_config_eee_phy(phydev);
1083}
1084
1085static void rtl8102e_hw_phy_config(struct rtl8169_private *tp,
1086				   struct phy_device *phydev)
1087{
1088	static const struct phy_reg phy_reg_init[] = {
1089		{ 0x1f, 0x0003 },
1090		{ 0x08, 0x441d },
1091		{ 0x01, 0x9100 },
1092		{ 0x1f, 0x0000 }
1093	};
1094
1095	phy_set_bits(phydev, 0x11, BIT(12));
1096	phy_set_bits(phydev, 0x19, BIT(13));
1097	phy_set_bits(phydev, 0x10, BIT(15));
1098
1099	rtl_writephy_batch(phydev, phy_reg_init);
1100}
1101
1102static void rtl8401_hw_phy_config(struct rtl8169_private *tp,
1103				  struct phy_device *phydev)
1104{
1105	phy_set_bits(phydev, 0x11, BIT(12));
1106	phy_modify_paged(phydev, 0x0002, 0x0f, 0x0000, 0x0003);
1107}
1108
1109static void rtl8105e_hw_phy_config(struct rtl8169_private *tp,
1110				   struct phy_device *phydev)
1111{
1112	/* Disable ALDPS before ram code */
1113	phy_write(phydev, 0x18, 0x0310);
1114	msleep(100);
1115
1116	r8169_apply_firmware(tp);
1117
1118	phy_write_paged(phydev, 0x0005, 0x1a, 0x0000);
1119	phy_write_paged(phydev, 0x0004, 0x1c, 0x0000);
1120	phy_write_paged(phydev, 0x0001, 0x15, 0x7701);
1121}
1122
1123static void rtl8402_hw_phy_config(struct rtl8169_private *tp,
1124				  struct phy_device *phydev)
1125{
1126	/* Disable ALDPS before setting firmware */
1127	phy_write(phydev, 0x18, 0x0310);
1128	msleep(20);
1129
1130	r8169_apply_firmware(tp);
1131
1132	/* EEE setting */
1133	phy_write(phydev, 0x1f, 0x0004);
1134	phy_write(phydev, 0x10, 0x401f);
1135	phy_write(phydev, 0x19, 0x7030);
1136	phy_write(phydev, 0x1f, 0x0000);
1137}
1138
1139static void rtl8106e_hw_phy_config(struct rtl8169_private *tp,
1140				   struct phy_device *phydev)
1141{
1142	static const struct phy_reg phy_reg_init[] = {
1143		{ 0x1f, 0x0004 },
1144		{ 0x10, 0xc07f },
1145		{ 0x19, 0x7030 },
1146		{ 0x1f, 0x0000 }
1147	};
1148
1149	/* Disable ALDPS before ram code */
1150	phy_write(phydev, 0x18, 0x0310);
1151	msleep(100);
1152
1153	r8169_apply_firmware(tp);
1154
1155	rtl_writephy_batch(phydev, phy_reg_init);
1156}
1157
1158static void rtl8125_legacy_force_mode(struct phy_device *phydev)
1159{
1160	phy_modify_paged(phydev, 0xa5b, 0x12, BIT(15), 0);
1161}
1162
1163static void rtl8125a_1_hw_phy_config(struct rtl8169_private *tp,
1164				     struct phy_device *phydev)
1165{
1166	phy_modify_paged(phydev, 0xad4, 0x10, 0x03ff, 0x0084);
1167	phy_modify_paged(phydev, 0xad4, 0x17, 0x0000, 0x0010);
1168	phy_modify_paged(phydev, 0xad1, 0x13, 0x03ff, 0x0006);
1169	phy_modify_paged(phydev, 0xad3, 0x11, 0x003f, 0x0006);
1170	phy_modify_paged(phydev, 0xac0, 0x14, 0x0000, 0x1100);
1171	phy_modify_paged(phydev, 0xac8, 0x15, 0xf000, 0x7000);
1172	phy_modify_paged(phydev, 0xad1, 0x14, 0x0000, 0x0400);
1173	phy_modify_paged(phydev, 0xad1, 0x15, 0x0000, 0x03ff);
1174	phy_modify_paged(phydev, 0xad1, 0x16, 0x0000, 0x03ff);
1175
1176	r8168g_phy_param(phydev, 0x80ea, 0xff00, 0xc400);
1177	r8168g_phy_param(phydev, 0x80eb, 0x0700, 0x0300);
1178	r8168g_phy_param(phydev, 0x80f8, 0xff00, 0x1c00);
1179	r8168g_phy_param(phydev, 0x80f1, 0xff00, 0x3000);
1180	r8168g_phy_param(phydev, 0x80fe, 0xff00, 0xa500);
1181	r8168g_phy_param(phydev, 0x8102, 0xff00, 0x5000);
1182	r8168g_phy_param(phydev, 0x8105, 0xff00, 0x3300);
1183	r8168g_phy_param(phydev, 0x8100, 0xff00, 0x7000);
1184	r8168g_phy_param(phydev, 0x8104, 0xff00, 0xf000);
1185	r8168g_phy_param(phydev, 0x8106, 0xff00, 0x6500);
1186	r8168g_phy_param(phydev, 0x80dc, 0xff00, 0xed00);
1187	r8168g_phy_param(phydev, 0x80df, 0x0000, 0x0100);
1188	r8168g_phy_param(phydev, 0x80e1, 0x0100, 0x0000);
1189
1190	phy_modify_paged(phydev, 0xbf0, 0x13, 0x003f, 0x0038);
1191	r8168g_phy_param(phydev, 0x819f, 0xffff, 0xd0b6);
1192
1193	phy_write_paged(phydev, 0xbc3, 0x12, 0x5555);
1194	phy_modify_paged(phydev, 0xbf0, 0x15, 0x0e00, 0x0a00);
1195	phy_modify_paged(phydev, 0xa5c, 0x10, 0x0400, 0x0000);
1196	rtl8168g_enable_gphy_10m(phydev);
1197
1198	rtl8125a_config_eee_phy(phydev);
1199}
1200
1201static void rtl8125a_2_hw_phy_config(struct rtl8169_private *tp,
1202				     struct phy_device *phydev)
1203{
1204	int i;
1205
1206	phy_modify_paged(phydev, 0xad4, 0x17, 0x0000, 0x0010);
1207	phy_modify_paged(phydev, 0xad1, 0x13, 0x03ff, 0x03ff);
1208	phy_modify_paged(phydev, 0xad3, 0x11, 0x003f, 0x0006);
1209	phy_modify_paged(phydev, 0xac0, 0x14, 0x1100, 0x0000);
1210	phy_modify_paged(phydev, 0xacc, 0x10, 0x0003, 0x0002);
1211	phy_modify_paged(phydev, 0xad4, 0x10, 0x00e7, 0x0044);
1212	phy_modify_paged(phydev, 0xac1, 0x12, 0x0080, 0x0000);
1213	phy_modify_paged(phydev, 0xac8, 0x10, 0x0300, 0x0000);
1214	phy_modify_paged(phydev, 0xac5, 0x17, 0x0007, 0x0002);
1215	phy_write_paged(phydev, 0xad4, 0x16, 0x00a8);
1216	phy_write_paged(phydev, 0xac5, 0x16, 0x01ff);
1217	phy_modify_paged(phydev, 0xac8, 0x15, 0x00f0, 0x0030);
1218
1219	phy_write(phydev, 0x1f, 0x0b87);
1220	phy_write(phydev, 0x16, 0x80a2);
1221	phy_write(phydev, 0x17, 0x0153);
1222	phy_write(phydev, 0x16, 0x809c);
1223	phy_write(phydev, 0x17, 0x0153);
1224	phy_write(phydev, 0x1f, 0x0000);
1225
1226	phy_write(phydev, 0x1f, 0x0a43);
1227	phy_write(phydev, 0x13, 0x81B3);
1228	phy_write(phydev, 0x14, 0x0043);
1229	phy_write(phydev, 0x14, 0x00A7);
1230	phy_write(phydev, 0x14, 0x00D6);
1231	phy_write(phydev, 0x14, 0x00EC);
1232	phy_write(phydev, 0x14, 0x00F6);
1233	phy_write(phydev, 0x14, 0x00FB);
1234	phy_write(phydev, 0x14, 0x00FD);
1235	phy_write(phydev, 0x14, 0x00FF);
1236	phy_write(phydev, 0x14, 0x00BB);
1237	phy_write(phydev, 0x14, 0x0058);
1238	phy_write(phydev, 0x14, 0x0029);
1239	phy_write(phydev, 0x14, 0x0013);
1240	phy_write(phydev, 0x14, 0x0009);
1241	phy_write(phydev, 0x14, 0x0004);
1242	phy_write(phydev, 0x14, 0x0002);
1243	for (i = 0; i < 25; i++)
1244		phy_write(phydev, 0x14, 0x0000);
1245	phy_write(phydev, 0x1f, 0x0000);
1246
1247	r8168g_phy_param(phydev, 0x8257, 0xffff, 0x020F);
1248	r8168g_phy_param(phydev, 0x80ea, 0xffff, 0x7843);
1249
1250	r8169_apply_firmware(tp);
1251
1252	phy_modify_paged(phydev, 0xd06, 0x14, 0x0000, 0x2000);
1253
1254	r8168g_phy_param(phydev, 0x81a2, 0x0000, 0x0100);
1255
1256	phy_modify_paged(phydev, 0xb54, 0x16, 0xff00, 0xdb00);
1257	phy_modify_paged(phydev, 0xa45, 0x12, 0x0001, 0x0000);
1258	phy_modify_paged(phydev, 0xa5d, 0x12, 0x0000, 0x0020);
1259	phy_modify_paged(phydev, 0xad4, 0x17, 0x0010, 0x0000);
1260	phy_modify_paged(phydev, 0xa86, 0x15, 0x0001, 0x0000);
1261	rtl8168g_enable_gphy_10m(phydev);
1262
1263	rtl8125a_config_eee_phy(phydev);
 
1264}
1265
1266static void rtl8125b_hw_phy_config(struct rtl8169_private *tp,
1267				   struct phy_device *phydev)
1268{
1269	r8169_apply_firmware(tp);
 
1270
1271	phy_modify_paged(phydev, 0xa44, 0x11, 0x0000, 0x0800);
1272	phy_modify_paged(phydev, 0xac4, 0x13, 0x00f0, 0x0090);
1273	phy_modify_paged(phydev, 0xad3, 0x10, 0x0003, 0x0001);
1274
1275	phy_write(phydev, 0x1f, 0x0b87);
1276	phy_write(phydev, 0x16, 0x80f5);
1277	phy_write(phydev, 0x17, 0x760e);
1278	phy_write(phydev, 0x16, 0x8107);
1279	phy_write(phydev, 0x17, 0x360e);
1280	phy_write(phydev, 0x16, 0x8551);
1281	phy_modify(phydev, 0x17, 0xff00, 0x0800);
1282	phy_write(phydev, 0x1f, 0x0000);
1283
1284	phy_modify_paged(phydev, 0xbf0, 0x10, 0xe000, 0xa000);
1285	phy_modify_paged(phydev, 0xbf4, 0x13, 0x0f00, 0x0300);
1286
1287	r8168g_phy_param(phydev, 0x8044, 0xffff, 0x2417);
1288	r8168g_phy_param(phydev, 0x804a, 0xffff, 0x2417);
1289	r8168g_phy_param(phydev, 0x8050, 0xffff, 0x2417);
1290	r8168g_phy_param(phydev, 0x8056, 0xffff, 0x2417);
1291	r8168g_phy_param(phydev, 0x805c, 0xffff, 0x2417);
1292	r8168g_phy_param(phydev, 0x8062, 0xffff, 0x2417);
1293	r8168g_phy_param(phydev, 0x8068, 0xffff, 0x2417);
1294	r8168g_phy_param(phydev, 0x806e, 0xffff, 0x2417);
1295	r8168g_phy_param(phydev, 0x8074, 0xffff, 0x2417);
1296	r8168g_phy_param(phydev, 0x807a, 0xffff, 0x2417);
1297
1298	phy_modify_paged(phydev, 0xa4c, 0x15, 0x0000, 0x0040);
1299	phy_modify_paged(phydev, 0xbf8, 0x12, 0xe000, 0xa000);
1300
1301	rtl8125_legacy_force_mode(phydev);
1302	rtl8125b_config_eee_phy(phydev);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1303}
1304
1305void r8169_hw_phy_config(struct rtl8169_private *tp, struct phy_device *phydev,
1306			 enum mac_version ver)
1307{
1308	static const rtl_phy_cfg_fct phy_configs[] = {
1309		/* PCI devices. */
1310		[RTL_GIGA_MAC_VER_02] = rtl8169s_hw_phy_config,
1311		[RTL_GIGA_MAC_VER_03] = rtl8169s_hw_phy_config,
1312		[RTL_GIGA_MAC_VER_04] = rtl8169sb_hw_phy_config,
1313		[RTL_GIGA_MAC_VER_05] = rtl8169scd_hw_phy_config,
1314		[RTL_GIGA_MAC_VER_06] = rtl8169sce_hw_phy_config,
1315		/* PCI-E devices. */
1316		[RTL_GIGA_MAC_VER_07] = rtl8102e_hw_phy_config,
1317		[RTL_GIGA_MAC_VER_08] = rtl8102e_hw_phy_config,
1318		[RTL_GIGA_MAC_VER_09] = rtl8102e_hw_phy_config,
1319		[RTL_GIGA_MAC_VER_10] = NULL,
1320		[RTL_GIGA_MAC_VER_11] = rtl8168bb_hw_phy_config,
1321		[RTL_GIGA_MAC_VER_12] = rtl8168bef_hw_phy_config,
1322		[RTL_GIGA_MAC_VER_13] = NULL,
1323		[RTL_GIGA_MAC_VER_14] = rtl8401_hw_phy_config,
1324		[RTL_GIGA_MAC_VER_16] = NULL,
1325		[RTL_GIGA_MAC_VER_17] = rtl8168bef_hw_phy_config,
1326		[RTL_GIGA_MAC_VER_18] = rtl8168cp_1_hw_phy_config,
1327		[RTL_GIGA_MAC_VER_19] = rtl8168c_1_hw_phy_config,
1328		[RTL_GIGA_MAC_VER_20] = rtl8168c_2_hw_phy_config,
1329		[RTL_GIGA_MAC_VER_21] = rtl8168c_3_hw_phy_config,
1330		[RTL_GIGA_MAC_VER_22] = rtl8168c_3_hw_phy_config,
1331		[RTL_GIGA_MAC_VER_23] = rtl8168cp_2_hw_phy_config,
1332		[RTL_GIGA_MAC_VER_24] = rtl8168cp_2_hw_phy_config,
1333		[RTL_GIGA_MAC_VER_25] = rtl8168d_1_hw_phy_config,
1334		[RTL_GIGA_MAC_VER_26] = rtl8168d_2_hw_phy_config,
1335		[RTL_GIGA_MAC_VER_27] = rtl8168d_3_hw_phy_config,
1336		[RTL_GIGA_MAC_VER_28] = rtl8168d_4_hw_phy_config,
1337		[RTL_GIGA_MAC_VER_29] = rtl8105e_hw_phy_config,
1338		[RTL_GIGA_MAC_VER_30] = rtl8105e_hw_phy_config,
1339		[RTL_GIGA_MAC_VER_31] = NULL,
1340		[RTL_GIGA_MAC_VER_32] = rtl8168e_1_hw_phy_config,
1341		[RTL_GIGA_MAC_VER_33] = rtl8168e_1_hw_phy_config,
1342		[RTL_GIGA_MAC_VER_34] = rtl8168e_2_hw_phy_config,
1343		[RTL_GIGA_MAC_VER_35] = rtl8168f_1_hw_phy_config,
1344		[RTL_GIGA_MAC_VER_36] = rtl8168f_2_hw_phy_config,
1345		[RTL_GIGA_MAC_VER_37] = rtl8402_hw_phy_config,
1346		[RTL_GIGA_MAC_VER_38] = rtl8411_hw_phy_config,
1347		[RTL_GIGA_MAC_VER_39] = rtl8106e_hw_phy_config,
1348		[RTL_GIGA_MAC_VER_40] = rtl8168g_1_hw_phy_config,
1349		[RTL_GIGA_MAC_VER_41] = NULL,
1350		[RTL_GIGA_MAC_VER_42] = rtl8168g_2_hw_phy_config,
1351		[RTL_GIGA_MAC_VER_43] = rtl8168g_2_hw_phy_config,
1352		[RTL_GIGA_MAC_VER_44] = rtl8168g_2_hw_phy_config,
1353		[RTL_GIGA_MAC_VER_45] = rtl8168h_1_hw_phy_config,
1354		[RTL_GIGA_MAC_VER_46] = rtl8168h_2_hw_phy_config,
1355		[RTL_GIGA_MAC_VER_47] = rtl8168h_1_hw_phy_config,
1356		[RTL_GIGA_MAC_VER_48] = rtl8168h_2_hw_phy_config,
1357		[RTL_GIGA_MAC_VER_49] = rtl8168ep_1_hw_phy_config,
1358		[RTL_GIGA_MAC_VER_50] = rtl8168ep_2_hw_phy_config,
1359		[RTL_GIGA_MAC_VER_51] = rtl8168ep_2_hw_phy_config,
1360		[RTL_GIGA_MAC_VER_52] = rtl8117_hw_phy_config,
1361		[RTL_GIGA_MAC_VER_53] = rtl8117_hw_phy_config,
1362		[RTL_GIGA_MAC_VER_60] = rtl8125a_1_hw_phy_config,
1363		[RTL_GIGA_MAC_VER_61] = rtl8125a_2_hw_phy_config,
1364		[RTL_GIGA_MAC_VER_63] = rtl8125b_hw_phy_config,
 
 
 
1365	};
1366
1367	if (phy_configs[ver])
1368		phy_configs[ver](tp, phydev);
1369}