xref: /linux/drivers/net/phy/microchip_t1.c (revision 136fff12a7591b390e46521864ca641e6e74c0e8)
1 // SPDX-License-Identifier: GPL-2.0
2 // Copyright (C) 2018 Microchip Technology
3 
4 #include <linux/kernel.h>
5 #include <linux/module.h>
6 #include <linux/delay.h>
7 #include <linux/mii.h>
8 #include <linux/phy.h>
9 #include <linux/sort.h>
10 #include <linux/ethtool.h>
11 #include <linux/ethtool_netlink.h>
12 #include <linux/bitfield.h>
13 #include "microchip_rds_ptp.h"
14 
15 #define PHY_ID_LAN87XX				0x0007c150
16 #define PHY_ID_LAN937X				0x0007c180
17 #define PHY_ID_LAN887X				0x0007c1f0
18 
19 #define MCHP_RDS_PTP_LTC_BASE_ADDR		0xe000
20 #define MCHP_RDS_PTP_PORT_BASE_ADDR	    (MCHP_RDS_PTP_LTC_BASE_ADDR + 0x800)
21 
22 /* External Register Control Register */
23 #define LAN87XX_EXT_REG_CTL                     (0x14)
24 #define LAN87XX_EXT_REG_CTL_RD_CTL              (0x1000)
25 #define LAN87XX_EXT_REG_CTL_WR_CTL              (0x0800)
26 #define LAN87XX_REG_BANK_SEL_MASK		GENMASK(10, 8)
27 #define LAN87XX_REG_ADDR_MASK			GENMASK(7, 0)
28 
29 /* External Register Read Data Register */
30 #define LAN87XX_EXT_REG_RD_DATA                 (0x15)
31 
32 /* External Register Write Data Register */
33 #define LAN87XX_EXT_REG_WR_DATA                 (0x16)
34 
35 /* Interrupt Source Register */
36 #define LAN87XX_INTERRUPT_SOURCE                (0x18)
37 #define LAN87XX_INTERRUPT_SOURCE_2              (0x08)
38 
39 /* Interrupt Mask Register */
40 #define LAN87XX_INTERRUPT_MASK                  (0x19)
41 #define LAN87XX_MASK_LINK_UP                    (0x0004)
42 #define LAN87XX_MASK_LINK_DOWN                  (0x0002)
43 
44 #define LAN87XX_INTERRUPT_MASK_2                (0x09)
45 #define LAN87XX_MASK_COMM_RDY			BIT(10)
46 
47 /* MISC Control 1 Register */
48 #define LAN87XX_CTRL_1                          (0x11)
49 #define LAN87XX_MASK_RGMII_TXC_DLY_EN           (0x4000)
50 #define LAN87XX_MASK_RGMII_RXC_DLY_EN           (0x2000)
51 
52 /* phyaccess nested types */
53 #define	PHYACC_ATTR_MODE_READ		0
54 #define	PHYACC_ATTR_MODE_WRITE		1
55 #define	PHYACC_ATTR_MODE_MODIFY		2
56 #define	PHYACC_ATTR_MODE_POLL		3
57 
58 #define	PHYACC_ATTR_BANK_SMI		0
59 #define	PHYACC_ATTR_BANK_MISC		1
60 #define	PHYACC_ATTR_BANK_PCS		2
61 #define	PHYACC_ATTR_BANK_AFE		3
62 #define	PHYACC_ATTR_BANK_DSP		4
63 #define	PHYACC_ATTR_BANK_MAX		7
64 
65 /* measurement defines */
66 #define	LAN87XX_CABLE_TEST_OK		0
67 #define	LAN87XX_CABLE_TEST_OPEN	1
68 #define	LAN87XX_CABLE_TEST_SAME_SHORT	2
69 
70 /* T1 Registers */
71 #define T1_AFE_PORT_CFG1_REG		0x0B
72 #define T1_POWER_DOWN_CONTROL_REG	0x1A
73 #define T1_SLV_FD_MULT_CFG_REG		0x18
74 #define T1_CDR_CFG_PRE_LOCK_REG		0x05
75 #define T1_CDR_CFG_POST_LOCK_REG	0x06
76 #define T1_LCK_STG2_MUFACT_CFG_REG	0x1A
77 #define T1_LCK_STG3_MUFACT_CFG_REG	0x1B
78 #define T1_POST_LCK_MUFACT_CFG_REG	0x1C
79 #define T1_TX_RX_FIFO_CFG_REG		0x02
80 #define T1_TX_LPF_FIR_CFG_REG		0x55
81 #define T1_COEF_CLK_PWR_DN_CFG		0x04
82 #define T1_COEF_RW_CTL_CFG		0x0D
83 #define T1_SQI_CONFIG_REG		0x2E
84 #define T1_SQI_CONFIG2_REG		0x4A
85 #define T1_DCQ_SQI_REG			0xC3
86 #define T1_DCQ_SQI_MSK			GENMASK(3, 1)
87 #define T1_MDIO_CONTROL2_REG		0x10
88 #define T1_INTERRUPT_SOURCE_REG		0x18
89 #define T1_INTERRUPT2_SOURCE_REG	0x08
90 #define T1_EQ_FD_STG1_FRZ_CFG		0x69
91 #define T1_EQ_FD_STG2_FRZ_CFG		0x6A
92 #define T1_EQ_FD_STG3_FRZ_CFG		0x6B
93 #define T1_EQ_FD_STG4_FRZ_CFG		0x6C
94 #define T1_EQ_WT_FD_LCK_FRZ_CFG		0x6D
95 #define T1_PST_EQ_LCK_STG1_FRZ_CFG	0x6E
96 
97 #define T1_MODE_STAT_REG		0x11
98 #define T1_LINK_UP_MSK			BIT(0)
99 
100 /* SQI defines */
101 #define LAN87XX_MAX_SQI			0x07
102 
103 /* Chiptop registers */
104 #define LAN887X_PMA_EXT_ABILITY_2		0x12
105 #define LAN887X_PMA_EXT_ABILITY_2_1000T1	BIT(1)
106 #define LAN887X_PMA_EXT_ABILITY_2_100T1		BIT(0)
107 
108 /* DSP 100M registers */
109 #define LAN887x_CDR_CONFIG1_100			0x0405
110 #define LAN887x_LOCK1_EQLSR_CONFIG_100		0x0411
111 #define LAN887x_SLV_HD_MUFAC_CONFIG_100		0x0417
112 #define LAN887x_PLOCK_MUFAC_CONFIG_100		0x041c
113 #define LAN887x_PROT_DISABLE_100		0x0425
114 #define LAN887x_KF_LOOP_SAT_CONFIG_100		0x0454
115 
116 /* DSP 1000M registers */
117 #define LAN887X_LOCK1_EQLSR_CONFIG		0x0811
118 #define LAN887X_LOCK3_EQLSR_CONFIG		0x0813
119 #define LAN887X_PROT_DISABLE			0x0825
120 #define LAN887X_FFE_GAIN6			0x0843
121 #define LAN887X_FFE_GAIN7			0x0844
122 #define LAN887X_FFE_GAIN8			0x0845
123 #define LAN887X_FFE_GAIN9			0x0846
124 #define LAN887X_ECHO_DELAY_CONFIG		0x08ec
125 #define LAN887X_FFE_MAX_CONFIG			0x08ee
126 
127 /* PCS 1000M registers */
128 #define LAN887X_SCR_CONFIG_3			0x8043
129 #define LAN887X_INFO_FLD_CONFIG_5		0x8048
130 
131 /* T1 afe registers */
132 #define LAN887X_ZQCAL_CONTROL_1			0x8080
133 #define LAN887X_AFE_PORT_TESTBUS_CTRL2		0x8089
134 #define LAN887X_AFE_PORT_TESTBUS_CTRL4		0x808b
135 #define LAN887X_AFE_PORT_TESTBUS_CTRL6		0x808d
136 #define LAN887X_TX_AMPLT_1000T1_REG		0x80b0
137 #define LAN887X_INIT_COEFF_DFE1_100		0x0422
138 
139 /* PMA registers */
140 #define LAN887X_DSP_PMA_CONTROL			0x810e
141 #define LAN887X_DSP_PMA_CONTROL_LNK_SYNC	BIT(4)
142 
143 /* PCS 100M registers */
144 #define LAN887X_IDLE_ERR_TIMER_WIN		0x8204
145 #define LAN887X_IDLE_ERR_CNT_THRESH		0x8213
146 
147 /* Misc registers */
148 #define LAN887X_REG_REG26			0x001a
149 #define LAN887X_REG_REG26_HW_INIT_SEQ_EN	BIT(8)
150 
151 /* Mis registers */
152 #define LAN887X_MIS_CFG_REG0			0xa00
153 #define LAN887X_MIS_CFG_REG0_RCLKOUT_DIS	BIT(5)
154 #define LAN887X_MIS_CFG_REG0_MAC_MODE_SEL	GENMASK(1, 0)
155 
156 #define LAN887X_MAC_MODE_RGMII			0x01
157 #define LAN887X_MAC_MODE_SGMII			0x03
158 
159 #define LAN887X_MIS_DLL_CFG_REG0		0xa01
160 #define LAN887X_MIS_DLL_CFG_REG1		0xa02
161 
162 #define LAN887X_MIS_DLL_DELAY_EN		BIT(15)
163 #define LAN887X_MIS_DLL_EN			BIT(0)
164 #define LAN887X_MIS_DLL_CONF	(LAN887X_MIS_DLL_DELAY_EN |\
165 				 LAN887X_MIS_DLL_EN)
166 
167 #define LAN887X_MIS_CFG_REG2			0xa03
168 #define LAN887X_MIS_CFG_REG2_FE_LPBK_EN		BIT(2)
169 
170 #define LAN887X_MIS_PKT_STAT_REG0		0xa06
171 #define LAN887X_MIS_PKT_STAT_REG1		0xa07
172 #define LAN887X_MIS_PKT_STAT_REG3		0xa09
173 #define LAN887X_MIS_PKT_STAT_REG4		0xa0a
174 #define LAN887X_MIS_PKT_STAT_REG5		0xa0b
175 #define LAN887X_MIS_PKT_STAT_REG6		0xa0c
176 
177 /* Chiptop common registers */
178 #define LAN887X_COMMON_LED3_LED2		0xc05
179 #define LAN887X_COMMON_LED2_MODE_SEL_MASK	GENMASK(4, 0)
180 #define LAN887X_LED_LINK_ACT_ANY_SPEED		0x0
181 
182 /* MX chip top registers */
183 #define LAN887X_CHIP_HARD_RST			0xf03e
184 #define LAN887X_CHIP_HARD_RST_RESET		BIT(0)
185 
186 #define LAN887X_CHIP_SOFT_RST			0xf03f
187 #define LAN887X_CHIP_SOFT_RST_RESET		BIT(0)
188 
189 #define LAN887X_SGMII_CTL			0xf01a
190 #define LAN887X_SGMII_CTL_SGMII_MUX_EN		BIT(0)
191 
192 #define LAN887X_SGMII_PCS_CFG			0xf034
193 #define LAN887X_SGMII_PCS_CFG_PCS_ENA		BIT(9)
194 
195 #define LAN887X_EFUSE_READ_DAT9			0xf209
196 #define LAN887X_EFUSE_READ_DAT9_SGMII_DIS	BIT(9)
197 #define LAN887X_EFUSE_READ_DAT9_MAC_MODE	GENMASK(1, 0)
198 
199 #define LAN887X_CALIB_CONFIG_100		0x437
200 #define LAN887X_CALIB_CONFIG_100_CBL_DIAG_USE_LOCAL_SMPL	BIT(5)
201 #define LAN887X_CALIB_CONFIG_100_CBL_DIAG_STB_SYNC_MODE		BIT(4)
202 #define LAN887X_CALIB_CONFIG_100_CBL_DIAG_CLK_ALGN_MODE		BIT(3)
203 #define LAN887X_CALIB_CONFIG_100_VAL \
204 	(LAN887X_CALIB_CONFIG_100_CBL_DIAG_CLK_ALGN_MODE |\
205 	LAN887X_CALIB_CONFIG_100_CBL_DIAG_STB_SYNC_MODE |\
206 	LAN887X_CALIB_CONFIG_100_CBL_DIAG_USE_LOCAL_SMPL)
207 
208 #define LAN887X_MAX_PGA_GAIN_100		0x44f
209 #define LAN887X_MIN_PGA_GAIN_100		0x450
210 #define LAN887X_START_CBL_DIAG_100		0x45a
211 #define LAN887X_CBL_DIAG_DONE			BIT(1)
212 #define LAN887X_CBL_DIAG_START			BIT(0)
213 #define LAN887X_CBL_DIAG_STOP			0x0
214 
215 #define LAN887X_CBL_DIAG_TDR_THRESH_100		0x45b
216 #define LAN887X_CBL_DIAG_AGC_THRESH_100		0x45c
217 #define LAN887X_CBL_DIAG_MIN_WAIT_CONFIG_100	0x45d
218 #define LAN887X_CBL_DIAG_MAX_WAIT_CONFIG_100	0x45e
219 #define LAN887X_CBL_DIAG_CYC_CONFIG_100		0x45f
220 #define LAN887X_CBL_DIAG_TX_PULSE_CONFIG_100	0x460
221 #define LAN887X_CBL_DIAG_MIN_PGA_GAIN_100	0x462
222 #define LAN887X_CBL_DIAG_AGC_GAIN_100		0x497
223 #define LAN887X_CBL_DIAG_POS_PEAK_VALUE_100	0x499
224 #define LAN887X_CBL_DIAG_NEG_PEAK_VALUE_100	0x49a
225 #define LAN887X_CBL_DIAG_POS_PEAK_TIME_100	0x49c
226 #define LAN887X_CBL_DIAG_NEG_PEAK_TIME_100	0x49d
227 
228 #define MICROCHIP_CABLE_NOISE_MARGIN		20
229 #define MICROCHIP_CABLE_TIME_MARGIN		89
230 #define MICROCHIP_CABLE_MIN_TIME_DIFF		96
231 #define MICROCHIP_CABLE_MAX_TIME_DIFF	\
232 	(MICROCHIP_CABLE_MIN_TIME_DIFF + MICROCHIP_CABLE_TIME_MARGIN)
233 
234 #define LAN887X_INT_STS				0xf000
235 #define LAN887X_INT_MSK				0xf001
236 #define LAN887X_INT_MSK_P1588_MOD_INT_MSK	BIT(3)
237 #define LAN887X_INT_MSK_T1_PHY_INT_MSK		BIT(2)
238 #define LAN887X_INT_MSK_LINK_UP_MSK		BIT(1)
239 #define LAN887X_INT_MSK_LINK_DOWN_MSK		BIT(0)
240 
241 #define LAN887X_MX_CHIP_TOP_LINK_MSK	(LAN887X_INT_MSK_LINK_UP_MSK |\
242 					 LAN887X_INT_MSK_LINK_DOWN_MSK)
243 
244 #define LAN887X_MX_CHIP_TOP_ALL_MSK	(LAN887X_INT_MSK_T1_PHY_INT_MSK |\
245 					 LAN887X_MX_CHIP_TOP_LINK_MSK)
246 
247 #define LAN887X_COEFF_PWR_DN_CONFIG_100		0x0404
248 #define LAN887X_COEFF_PWR_DN_CONFIG_100_V	0x16d6
249 #define LAN887X_SQI_CONFIG_100			0x042e
250 #define LAN887X_SQI_CONFIG_100_V		0x9572
251 #define LAN887X_SQI_MSE_100			0x483
252 
253 #define LAN887X_POKE_PEEK_100			0x040d
254 #define LAN887X_POKE_PEEK_100_EN		BIT(0)
255 
256 #define LAN887X_COEFF_MOD_CONFIG		0x080d
257 #define LAN887X_COEFF_MOD_CONFIG_DCQ_COEFF_EN	BIT(8)
258 
259 #define LAN887X_DCQ_SQI_STATUS			0x08b2
260 
261 /* SQI raw samples count */
262 #define SQI_SAMPLES 200
263 
264 /* Samples percentage considered for SQI calculation */
265 #define SQI_INLINERS_PERCENT 60
266 
267 /* Samples count considered for SQI calculation */
268 #define SQI_INLIERS_NUM (SQI_SAMPLES * SQI_INLINERS_PERCENT / 100)
269 
270 /* Start offset of samples */
271 #define SQI_INLIERS_START ((SQI_SAMPLES - SQI_INLIERS_NUM) / 2)
272 
273 /* End offset of samples */
274 #define SQI_INLIERS_END (SQI_INLIERS_START + SQI_INLIERS_NUM)
275 
276 #define DRIVER_AUTHOR	"Nisar Sayed <nisar.sayed@microchip.com>"
277 #define DRIVER_DESC	"Microchip LAN87XX/LAN937x/LAN887x T1 PHY driver"
278 
279 /* TEST_MODE_NORMAL: Non-hybrid results to calculate cable status(open/short/ok)
280  * TEST_MODE_HYBRID: Hybrid results to calculate distance to fault
281  */
282 enum cable_diag_mode {
283 	TEST_MODE_NORMAL,
284 	TEST_MODE_HYBRID
285 };
286 
287 /* CD_TEST_INIT: Cable test is initated
288  * CD_TEST_DONE: Cable test is done
289  */
290 enum cable_diag_state {
291 	CD_TEST_INIT,
292 	CD_TEST_DONE
293 };
294 
295 struct access_ereg_val {
296 	u8  mode;
297 	u8  bank;
298 	u8  offset;
299 	u16 val;
300 	u16 mask;
301 };
302 
303 struct lan887x_hw_stat {
304 	const char *string;
305 	u8 mmd;
306 	u16 reg;
307 	u8 bits;
308 };
309 
310 static const struct lan887x_hw_stat lan887x_hw_stats[] = {
311 	{ "TX Good Count",                      MDIO_MMD_VEND1, LAN887X_MIS_PKT_STAT_REG0, 14},
312 	{ "RX Good Count",                      MDIO_MMD_VEND1, LAN887X_MIS_PKT_STAT_REG1, 14},
313 	{ "RX ERR Count detected by PCS",       MDIO_MMD_VEND1, LAN887X_MIS_PKT_STAT_REG3, 16},
314 	{ "TX CRC ERR Count",                   MDIO_MMD_VEND1, LAN887X_MIS_PKT_STAT_REG4, 8},
315 	{ "RX CRC ERR Count",                   MDIO_MMD_VEND1, LAN887X_MIS_PKT_STAT_REG5, 8},
316 	{ "RX ERR Count for SGMII MII2GMII",    MDIO_MMD_VEND1, LAN887X_MIS_PKT_STAT_REG6, 8},
317 };
318 
319 struct lan887x_regwr_map {
320 	u8  mmd;
321 	u16 reg;
322 	u16 val;
323 };
324 
325 struct lan887x_priv {
326 	u64 stats[ARRAY_SIZE(lan887x_hw_stats)];
327 	struct mchp_rds_ptp_clock *clock;
328 	bool init_done;
329 };
330 
331 static int lan937x_dsp_workaround(struct phy_device *phydev, u16 ereg, u8 bank)
332 {
333 	u8 prev_bank;
334 	int rc = 0;
335 	u16 val;
336 
337 	mutex_lock(&phydev->lock);
338 	/* Read previous selected bank */
339 	rc = phy_read(phydev, LAN87XX_EXT_REG_CTL);
340 	if (rc < 0)
341 		goto out_unlock;
342 
343 	/* store the prev_bank */
344 	prev_bank = FIELD_GET(LAN87XX_REG_BANK_SEL_MASK, rc);
345 
346 	if (bank != prev_bank && bank == PHYACC_ATTR_BANK_DSP) {
347 		val = ereg & ~LAN87XX_REG_ADDR_MASK;
348 
349 		val &= ~LAN87XX_EXT_REG_CTL_WR_CTL;
350 		val |= LAN87XX_EXT_REG_CTL_RD_CTL;
351 
352 		/* access twice for DSP bank change,dummy access */
353 		rc = phy_write(phydev, LAN87XX_EXT_REG_CTL, val);
354 	}
355 
356 out_unlock:
357 	mutex_unlock(&phydev->lock);
358 
359 	return rc;
360 }
361 
362 static int access_ereg(struct phy_device *phydev, u8 mode, u8 bank,
363 		       u8 offset, u16 val)
364 {
365 	u16 ereg = 0;
366 	int rc = 0;
367 
368 	if (mode > PHYACC_ATTR_MODE_WRITE || bank > PHYACC_ATTR_BANK_MAX)
369 		return -EINVAL;
370 
371 	if (bank == PHYACC_ATTR_BANK_SMI) {
372 		if (mode == PHYACC_ATTR_MODE_WRITE)
373 			rc = phy_write(phydev, offset, val);
374 		else
375 			rc = phy_read(phydev, offset);
376 		return rc;
377 	}
378 
379 	if (mode == PHYACC_ATTR_MODE_WRITE) {
380 		ereg = LAN87XX_EXT_REG_CTL_WR_CTL;
381 		rc = phy_write(phydev, LAN87XX_EXT_REG_WR_DATA, val);
382 		if (rc < 0)
383 			return rc;
384 	} else {
385 		ereg = LAN87XX_EXT_REG_CTL_RD_CTL;
386 	}
387 
388 	ereg |= (bank << 8) | offset;
389 
390 	/* DSP bank access workaround for lan937x */
391 	if (phydev->phy_id == PHY_ID_LAN937X) {
392 		rc = lan937x_dsp_workaround(phydev, ereg, bank);
393 		if (rc < 0)
394 			return rc;
395 	}
396 
397 	rc = phy_write(phydev, LAN87XX_EXT_REG_CTL, ereg);
398 	if (rc < 0)
399 		return rc;
400 
401 	if (mode == PHYACC_ATTR_MODE_READ)
402 		rc = phy_read(phydev, LAN87XX_EXT_REG_RD_DATA);
403 
404 	return rc;
405 }
406 
407 static int access_ereg_modify_changed(struct phy_device *phydev,
408 				      u8 bank, u8 offset, u16 val, u16 mask)
409 {
410 	int new = 0, rc = 0;
411 
412 	if (bank > PHYACC_ATTR_BANK_MAX)
413 		return -EINVAL;
414 
415 	rc = access_ereg(phydev, PHYACC_ATTR_MODE_READ, bank, offset, val);
416 	if (rc < 0)
417 		return rc;
418 
419 	new = val | (rc & (mask ^ 0xFFFF));
420 	rc = access_ereg(phydev, PHYACC_ATTR_MODE_WRITE, bank, offset, new);
421 
422 	return rc;
423 }
424 
425 static int access_smi_poll_timeout(struct phy_device *phydev,
426 				   u8 offset, u16 mask, u16 clr)
427 {
428 	int val;
429 
430 	return phy_read_poll_timeout(phydev, offset, val, (val & mask) == clr,
431 				     150, 30000, true);
432 }
433 
434 static int lan87xx_config_rgmii_delay(struct phy_device *phydev)
435 {
436 	int rc;
437 
438 	if (!phy_interface_is_rgmii(phydev))
439 		return 0;
440 
441 	rc = access_ereg(phydev, PHYACC_ATTR_MODE_READ,
442 			 PHYACC_ATTR_BANK_MISC, LAN87XX_CTRL_1, 0);
443 	if (rc < 0)
444 		return rc;
445 
446 	switch (phydev->interface) {
447 	case PHY_INTERFACE_MODE_RGMII:
448 		rc &= ~LAN87XX_MASK_RGMII_TXC_DLY_EN;
449 		rc &= ~LAN87XX_MASK_RGMII_RXC_DLY_EN;
450 		break;
451 	case PHY_INTERFACE_MODE_RGMII_ID:
452 		rc |= LAN87XX_MASK_RGMII_TXC_DLY_EN;
453 		rc |= LAN87XX_MASK_RGMII_RXC_DLY_EN;
454 		break;
455 	case PHY_INTERFACE_MODE_RGMII_RXID:
456 		rc &= ~LAN87XX_MASK_RGMII_TXC_DLY_EN;
457 		rc |= LAN87XX_MASK_RGMII_RXC_DLY_EN;
458 		break;
459 	case PHY_INTERFACE_MODE_RGMII_TXID:
460 		rc |= LAN87XX_MASK_RGMII_TXC_DLY_EN;
461 		rc &= ~LAN87XX_MASK_RGMII_RXC_DLY_EN;
462 		break;
463 	default:
464 		return 0;
465 	}
466 
467 	return access_ereg(phydev, PHYACC_ATTR_MODE_WRITE,
468 			   PHYACC_ATTR_BANK_MISC, LAN87XX_CTRL_1, rc);
469 }
470 
471 static int lan87xx_phy_init_cmd(struct phy_device *phydev,
472 				const struct access_ereg_val *cmd_seq, int cnt)
473 {
474 	int ret, i;
475 
476 	for (i = 0; i < cnt; i++) {
477 		if (cmd_seq[i].mode == PHYACC_ATTR_MODE_POLL &&
478 		    cmd_seq[i].bank == PHYACC_ATTR_BANK_SMI) {
479 			ret = access_smi_poll_timeout(phydev,
480 						      cmd_seq[i].offset,
481 						      cmd_seq[i].val,
482 						      cmd_seq[i].mask);
483 		} else {
484 			ret = access_ereg(phydev, cmd_seq[i].mode,
485 					  cmd_seq[i].bank, cmd_seq[i].offset,
486 					  cmd_seq[i].val);
487 		}
488 		if (ret < 0)
489 			return ret;
490 	}
491 
492 	return ret;
493 }
494 
495 static int lan87xx_phy_init(struct phy_device *phydev)
496 {
497 	static const struct access_ereg_val hw_init[] = {
498 		/* TXPD/TXAMP6 Configs */
499 		{ PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_AFE,
500 		  T1_AFE_PORT_CFG1_REG,       0x002D,  0 },
501 		/* HW_Init Hi and Force_ED */
502 		{ PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_SMI,
503 		  T1_POWER_DOWN_CONTROL_REG,  0x0308,  0 },
504 	};
505 
506 	static const struct access_ereg_val slave_init[] = {
507 		/* Equalizer Full Duplex Freeze - T1 Slave */
508 		{ PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
509 		  T1_EQ_FD_STG1_FRZ_CFG,     0x0002,  0 },
510 		{ PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
511 		  T1_EQ_FD_STG2_FRZ_CFG,     0x0002,  0 },
512 		{ PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
513 		  T1_EQ_FD_STG3_FRZ_CFG,     0x0002,  0 },
514 		{ PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
515 		  T1_EQ_FD_STG4_FRZ_CFG,     0x0002,  0 },
516 		{ PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
517 		  T1_EQ_WT_FD_LCK_FRZ_CFG,    0x0002,  0 },
518 		{ PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
519 		  T1_PST_EQ_LCK_STG1_FRZ_CFG, 0x0002,  0 },
520 	};
521 
522 	static const struct access_ereg_val phy_init[] = {
523 		/* Slave Full Duplex Multi Configs */
524 		{ PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
525 		  T1_SLV_FD_MULT_CFG_REG,     0x0D53,  0 },
526 		/* CDR Pre and Post Lock Configs */
527 		{ PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
528 		  T1_CDR_CFG_PRE_LOCK_REG,    0x0AB2,  0 },
529 		{ PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
530 		  T1_CDR_CFG_POST_LOCK_REG,   0x0AB3,  0 },
531 		/* Lock Stage 2-3 Multi Factor Config */
532 		{ PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
533 		  T1_LCK_STG2_MUFACT_CFG_REG, 0x0AEA,  0 },
534 		{ PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
535 		  T1_LCK_STG3_MUFACT_CFG_REG, 0x0AEB,  0 },
536 		{ PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
537 		  T1_POST_LCK_MUFACT_CFG_REG, 0x0AEB,  0 },
538 		/* Pointer delay */
539 		{ PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
540 		  T1_TX_RX_FIFO_CFG_REG, 0x1C00, 0 },
541 		/* Tx iir edits */
542 		{ PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
543 		  T1_TX_LPF_FIR_CFG_REG, 0x1000, 0 },
544 		{ PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
545 		  T1_TX_LPF_FIR_CFG_REG, 0x1861, 0 },
546 		{ PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
547 		  T1_TX_LPF_FIR_CFG_REG, 0x1061, 0 },
548 		{ PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
549 		  T1_TX_LPF_FIR_CFG_REG, 0x1922, 0 },
550 		{ PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
551 		  T1_TX_LPF_FIR_CFG_REG, 0x1122, 0 },
552 		{ PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
553 		  T1_TX_LPF_FIR_CFG_REG, 0x1983, 0 },
554 		{ PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
555 		  T1_TX_LPF_FIR_CFG_REG, 0x1183, 0 },
556 		{ PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
557 		  T1_TX_LPF_FIR_CFG_REG, 0x1944, 0 },
558 		{ PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
559 		  T1_TX_LPF_FIR_CFG_REG, 0x1144, 0 },
560 		{ PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
561 		  T1_TX_LPF_FIR_CFG_REG, 0x18c5, 0 },
562 		{ PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
563 		  T1_TX_LPF_FIR_CFG_REG, 0x10c5, 0 },
564 		{ PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
565 		  T1_TX_LPF_FIR_CFG_REG, 0x1846, 0 },
566 		{ PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
567 		  T1_TX_LPF_FIR_CFG_REG, 0x1046, 0 },
568 		{ PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
569 		  T1_TX_LPF_FIR_CFG_REG, 0x1807, 0 },
570 		{ PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
571 		  T1_TX_LPF_FIR_CFG_REG, 0x1007, 0 },
572 		{ PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
573 		  T1_TX_LPF_FIR_CFG_REG, 0x1808, 0 },
574 		{ PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
575 		  T1_TX_LPF_FIR_CFG_REG, 0x1008, 0 },
576 		{ PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
577 		  T1_TX_LPF_FIR_CFG_REG, 0x1809, 0 },
578 		{ PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
579 		  T1_TX_LPF_FIR_CFG_REG, 0x1009, 0 },
580 		{ PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
581 		  T1_TX_LPF_FIR_CFG_REG, 0x180A, 0 },
582 		{ PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
583 		  T1_TX_LPF_FIR_CFG_REG, 0x100A, 0 },
584 		{ PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
585 		  T1_TX_LPF_FIR_CFG_REG, 0x180B, 0 },
586 		{ PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
587 		  T1_TX_LPF_FIR_CFG_REG, 0x100B, 0 },
588 		{ PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
589 		  T1_TX_LPF_FIR_CFG_REG, 0x180C, 0 },
590 		{ PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
591 		  T1_TX_LPF_FIR_CFG_REG, 0x100C, 0 },
592 		{ PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
593 		  T1_TX_LPF_FIR_CFG_REG, 0x180D, 0 },
594 		{ PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
595 		  T1_TX_LPF_FIR_CFG_REG, 0x100D, 0 },
596 		{ PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
597 		  T1_TX_LPF_FIR_CFG_REG, 0x180E, 0 },
598 		{ PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
599 		  T1_TX_LPF_FIR_CFG_REG, 0x100E, 0 },
600 		{ PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
601 		  T1_TX_LPF_FIR_CFG_REG, 0x180F, 0 },
602 		{ PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
603 		  T1_TX_LPF_FIR_CFG_REG, 0x100F, 0 },
604 		{ PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
605 		  T1_TX_LPF_FIR_CFG_REG, 0x1810, 0 },
606 		{ PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
607 		  T1_TX_LPF_FIR_CFG_REG, 0x1010, 0 },
608 		{ PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
609 		  T1_TX_LPF_FIR_CFG_REG, 0x1811, 0 },
610 		{ PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
611 		  T1_TX_LPF_FIR_CFG_REG, 0x1011, 0 },
612 		{ PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
613 		  T1_TX_LPF_FIR_CFG_REG, 0x1000, 0 },
614 		/* Setup SQI measurement */
615 		{ PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
616 		  T1_COEF_CLK_PWR_DN_CFG,	0x16d6, 0 },
617 		/* SQI enable */
618 		{ PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
619 		  T1_SQI_CONFIG_REG,		0x9572, 0 },
620 		/* SQI select mode 5 */
621 		{ PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
622 		  T1_SQI_CONFIG2_REG,		0x0001, 0 },
623 		/* Throws the first SQI reading */
624 		{ PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP,
625 		  T1_COEF_RW_CTL_CFG,		0x0301,	0 },
626 		{ PHYACC_ATTR_MODE_READ, PHYACC_ATTR_BANK_DSP,
627 		  T1_DCQ_SQI_REG,		0,	0 },
628 		/* Flag LPS and WUR as idle errors */
629 		{ PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_SMI,
630 		  T1_MDIO_CONTROL2_REG,		0x0014, 0 },
631 		/* HW_Init toggle, undo force ED, TXPD off */
632 		{ PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_SMI,
633 		  T1_POWER_DOWN_CONTROL_REG,	0x0200, 0 },
634 		/* Reset PCS to trigger hardware initialization */
635 		{ PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_SMI,
636 		  T1_MDIO_CONTROL2_REG,		0x0094, 0 },
637 		/* Poll till Hardware is initialized */
638 		{ PHYACC_ATTR_MODE_POLL, PHYACC_ATTR_BANK_SMI,
639 		  T1_MDIO_CONTROL2_REG,		0x0080, 0 },
640 		/* Tx AMP - 0x06  */
641 		{ PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_AFE,
642 		  T1_AFE_PORT_CFG1_REG,		0x000C, 0 },
643 		/* Read INTERRUPT_SOURCE Register */
644 		{ PHYACC_ATTR_MODE_READ, PHYACC_ATTR_BANK_SMI,
645 		  T1_INTERRUPT_SOURCE_REG,	0,	0 },
646 		/* Read INTERRUPT_SOURCE Register */
647 		{ PHYACC_ATTR_MODE_READ, PHYACC_ATTR_BANK_MISC,
648 		  T1_INTERRUPT2_SOURCE_REG,	0,	0 },
649 		/* HW_Init Hi */
650 		{ PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_SMI,
651 		  T1_POWER_DOWN_CONTROL_REG,	0x0300, 0 },
652 	};
653 	int rc;
654 
655 	/* phy Soft reset */
656 	rc = genphy_soft_reset(phydev);
657 	if (rc < 0)
658 		return rc;
659 
660 	/* PHY Initialization */
661 	rc = lan87xx_phy_init_cmd(phydev, hw_init, ARRAY_SIZE(hw_init));
662 	if (rc < 0)
663 		return rc;
664 
665 	rc = genphy_read_master_slave(phydev);
666 	if (rc)
667 		return rc;
668 
669 	/* The following squence needs to run only if phydev is in
670 	 * slave mode.
671 	 */
672 	if (phydev->master_slave_state == MASTER_SLAVE_STATE_SLAVE) {
673 		rc = lan87xx_phy_init_cmd(phydev, slave_init,
674 					  ARRAY_SIZE(slave_init));
675 		if (rc < 0)
676 			return rc;
677 	}
678 
679 	rc = lan87xx_phy_init_cmd(phydev, phy_init, ARRAY_SIZE(phy_init));
680 	if (rc < 0)
681 		return rc;
682 
683 	return lan87xx_config_rgmii_delay(phydev);
684 }
685 
686 static int lan87xx_phy_config_intr(struct phy_device *phydev)
687 {
688 	int rc, val = 0;
689 
690 	if (phydev->interrupts == PHY_INTERRUPT_ENABLED) {
691 		/* clear all interrupt */
692 		rc = phy_write(phydev, LAN87XX_INTERRUPT_MASK, val);
693 		if (rc < 0)
694 			return rc;
695 
696 		rc = phy_read(phydev, LAN87XX_INTERRUPT_SOURCE);
697 		if (rc < 0)
698 			return rc;
699 
700 		rc = access_ereg(phydev, PHYACC_ATTR_MODE_WRITE,
701 				 PHYACC_ATTR_BANK_MISC,
702 				 LAN87XX_INTERRUPT_MASK_2, val);
703 		if (rc < 0)
704 			return rc;
705 
706 		rc = access_ereg(phydev, PHYACC_ATTR_MODE_READ,
707 				 PHYACC_ATTR_BANK_MISC,
708 				 LAN87XX_INTERRUPT_SOURCE_2, 0);
709 		if (rc < 0)
710 			return rc;
711 
712 		/* enable link down and comm ready interrupt */
713 		val = LAN87XX_MASK_LINK_DOWN;
714 		rc = phy_write(phydev, LAN87XX_INTERRUPT_MASK, val);
715 		if (rc < 0)
716 			return rc;
717 
718 		val = LAN87XX_MASK_COMM_RDY;
719 		rc = access_ereg(phydev, PHYACC_ATTR_MODE_WRITE,
720 				 PHYACC_ATTR_BANK_MISC,
721 				 LAN87XX_INTERRUPT_MASK_2, val);
722 	} else {
723 		rc = phy_write(phydev, LAN87XX_INTERRUPT_MASK, val);
724 		if (rc < 0)
725 			return rc;
726 
727 		rc = phy_read(phydev, LAN87XX_INTERRUPT_SOURCE);
728 		if (rc < 0)
729 			return rc;
730 
731 		rc = access_ereg(phydev, PHYACC_ATTR_MODE_WRITE,
732 				 PHYACC_ATTR_BANK_MISC,
733 				 LAN87XX_INTERRUPT_MASK_2, val);
734 		if (rc < 0)
735 			return rc;
736 
737 		rc = access_ereg(phydev, PHYACC_ATTR_MODE_READ,
738 				 PHYACC_ATTR_BANK_MISC,
739 				 LAN87XX_INTERRUPT_SOURCE_2, 0);
740 	}
741 
742 	return rc < 0 ? rc : 0;
743 }
744 
745 static irqreturn_t lan87xx_handle_interrupt(struct phy_device *phydev)
746 {
747 	int irq_status;
748 
749 	irq_status  = access_ereg(phydev, PHYACC_ATTR_MODE_READ,
750 				  PHYACC_ATTR_BANK_MISC,
751 				  LAN87XX_INTERRUPT_SOURCE_2, 0);
752 	if (irq_status < 0) {
753 		phy_error(phydev);
754 		return IRQ_NONE;
755 	}
756 
757 	irq_status = phy_read(phydev, LAN87XX_INTERRUPT_SOURCE);
758 	if (irq_status < 0) {
759 		phy_error(phydev);
760 		return IRQ_NONE;
761 	}
762 
763 	if (irq_status == 0)
764 		return IRQ_NONE;
765 
766 	phy_trigger_machine(phydev);
767 
768 	return IRQ_HANDLED;
769 }
770 
771 static int lan87xx_config_init(struct phy_device *phydev)
772 {
773 	int rc = lan87xx_phy_init(phydev);
774 
775 	return rc < 0 ? rc : 0;
776 }
777 
778 static int microchip_cable_test_start_common(struct phy_device *phydev)
779 {
780 	int bmcr, bmsr, ret;
781 
782 	/* If auto-negotiation is enabled, but not complete, the cable
783 	 * test never completes. So disable auto-neg.
784 	 */
785 	bmcr = phy_read(phydev, MII_BMCR);
786 	if (bmcr < 0)
787 		return bmcr;
788 
789 	bmsr = phy_read(phydev, MII_BMSR);
790 
791 	if (bmsr < 0)
792 		return bmsr;
793 
794 	if (bmcr & BMCR_ANENABLE) {
795 		ret =  phy_modify(phydev, MII_BMCR, BMCR_ANENABLE, 0);
796 		if (ret < 0)
797 			return ret;
798 		ret = genphy_soft_reset(phydev);
799 		if (ret < 0)
800 			return ret;
801 	}
802 
803 	/* If the link is up, allow it some time to go down */
804 	if (bmsr & BMSR_LSTATUS)
805 		msleep(1500);
806 
807 	return 0;
808 }
809 
810 static int lan87xx_cable_test_start(struct phy_device *phydev)
811 {
812 	static const struct access_ereg_val cable_test[] = {
813 		/* min wait */
814 		{PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP, 93,
815 		 0, 0},
816 		/* max wait */
817 		{PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP, 94,
818 		 10, 0},
819 		/* pulse cycle */
820 		{PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP, 95,
821 		 90, 0},
822 		/* cable diag thresh */
823 		{PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP, 92,
824 		 60, 0},
825 		/* max gain */
826 		{PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP, 79,
827 		 31, 0},
828 		/* clock align for each iteration */
829 		{PHYACC_ATTR_MODE_MODIFY, PHYACC_ATTR_BANK_DSP, 55,
830 		 0, 0x0038},
831 		/* max cycle wait config */
832 		{PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP, 94,
833 		 70, 0},
834 		/* start cable diag*/
835 		{PHYACC_ATTR_MODE_WRITE, PHYACC_ATTR_BANK_DSP, 90,
836 		 1, 0},
837 	};
838 	int rc, i;
839 
840 	rc = microchip_cable_test_start_common(phydev);
841 	if (rc < 0)
842 		return rc;
843 
844 	/* start cable diag */
845 	/* check if part is alive - if not, return diagnostic error */
846 	rc = access_ereg(phydev, PHYACC_ATTR_MODE_READ, PHYACC_ATTR_BANK_SMI,
847 			 0x00, 0);
848 	if (rc < 0)
849 		return rc;
850 
851 	/* master/slave specific configs */
852 	rc = access_ereg(phydev, PHYACC_ATTR_MODE_READ, PHYACC_ATTR_BANK_SMI,
853 			 0x0A, 0);
854 	if (rc < 0)
855 		return rc;
856 
857 	if ((rc & 0x4000) != 0x4000) {
858 		/* DUT is Slave */
859 		rc = access_ereg_modify_changed(phydev, PHYACC_ATTR_BANK_AFE,
860 						0x0E, 0x5, 0x7);
861 		if (rc < 0)
862 			return rc;
863 		rc = access_ereg_modify_changed(phydev, PHYACC_ATTR_BANK_SMI,
864 						0x1A, 0x8, 0x8);
865 		if (rc < 0)
866 			return rc;
867 	} else {
868 		/* DUT is Master */
869 		rc = access_ereg_modify_changed(phydev, PHYACC_ATTR_BANK_SMI,
870 						0x10, 0x8, 0x40);
871 		if (rc < 0)
872 			return rc;
873 	}
874 
875 	for (i = 0; i < ARRAY_SIZE(cable_test); i++) {
876 		if (cable_test[i].mode == PHYACC_ATTR_MODE_MODIFY) {
877 			rc = access_ereg_modify_changed(phydev,
878 							cable_test[i].bank,
879 							cable_test[i].offset,
880 							cable_test[i].val,
881 							cable_test[i].mask);
882 			/* wait 50ms */
883 			msleep(50);
884 		} else {
885 			rc = access_ereg(phydev, cable_test[i].mode,
886 					 cable_test[i].bank,
887 					 cable_test[i].offset,
888 					 cable_test[i].val);
889 		}
890 		if (rc < 0)
891 			return rc;
892 	}
893 	/* cable diag started */
894 
895 	return 0;
896 }
897 
898 static int lan87xx_cable_test_report_trans(u32 result)
899 {
900 	switch (result) {
901 	case LAN87XX_CABLE_TEST_OK:
902 		return ETHTOOL_A_CABLE_RESULT_CODE_OK;
903 	case LAN87XX_CABLE_TEST_OPEN:
904 		return ETHTOOL_A_CABLE_RESULT_CODE_OPEN;
905 	case LAN87XX_CABLE_TEST_SAME_SHORT:
906 		return ETHTOOL_A_CABLE_RESULT_CODE_SAME_SHORT;
907 	default:
908 		/* DIAGNOSTIC_ERROR */
909 		return ETHTOOL_A_CABLE_RESULT_CODE_UNSPEC;
910 	}
911 }
912 
913 static int lan87xx_cable_test_report(struct phy_device *phydev)
914 {
915 	int pos_peak_cycle = 0, pos_peak_in_phases = 0, pos_peak_phase = 0;
916 	int neg_peak_cycle = 0, neg_peak_in_phases = 0, neg_peak_phase = 0;
917 	int noise_margin = 20, time_margin = 89, jitter_var = 30;
918 	int min_time_diff = 96, max_time_diff = 96 + time_margin;
919 	bool fault = false, check_a = false, check_b = false;
920 	int gain_idx = 0, pos_peak = 0, neg_peak = 0;
921 	int pos_peak_time = 0, neg_peak_time = 0;
922 	int pos_peak_in_phases_hybrid = 0;
923 	int detect = -1;
924 
925 	gain_idx = access_ereg(phydev, PHYACC_ATTR_MODE_READ,
926 			       PHYACC_ATTR_BANK_DSP, 151, 0);
927 	/* read non-hybrid results */
928 	pos_peak = access_ereg(phydev, PHYACC_ATTR_MODE_READ,
929 			       PHYACC_ATTR_BANK_DSP, 153, 0);
930 	neg_peak = access_ereg(phydev, PHYACC_ATTR_MODE_READ,
931 			       PHYACC_ATTR_BANK_DSP, 154, 0);
932 	pos_peak_time = access_ereg(phydev, PHYACC_ATTR_MODE_READ,
933 				    PHYACC_ATTR_BANK_DSP, 156, 0);
934 	neg_peak_time = access_ereg(phydev, PHYACC_ATTR_MODE_READ,
935 				    PHYACC_ATTR_BANK_DSP, 157, 0);
936 
937 	pos_peak_cycle = (pos_peak_time >> 7) & 0x7F;
938 	/* calculate non-hybrid values */
939 	pos_peak_phase = pos_peak_time & 0x7F;
940 	pos_peak_in_phases = (pos_peak_cycle * 96) + pos_peak_phase;
941 	neg_peak_cycle = (neg_peak_time >> 7) & 0x7F;
942 	neg_peak_phase = neg_peak_time & 0x7F;
943 	neg_peak_in_phases = (neg_peak_cycle * 96) + neg_peak_phase;
944 
945 	/* process values */
946 	check_a =
947 		((pos_peak_in_phases - neg_peak_in_phases) >= min_time_diff) &&
948 		((pos_peak_in_phases - neg_peak_in_phases) < max_time_diff) &&
949 		pos_peak_in_phases_hybrid < pos_peak_in_phases &&
950 		(pos_peak_in_phases_hybrid < (neg_peak_in_phases + jitter_var));
951 	check_b =
952 		((neg_peak_in_phases - pos_peak_in_phases) >= min_time_diff) &&
953 		((neg_peak_in_phases - pos_peak_in_phases) < max_time_diff) &&
954 		pos_peak_in_phases_hybrid < neg_peak_in_phases &&
955 		(pos_peak_in_phases_hybrid < (pos_peak_in_phases + jitter_var));
956 
957 	if (pos_peak_in_phases > neg_peak_in_phases && check_a)
958 		detect = 2;
959 	else if ((neg_peak_in_phases > pos_peak_in_phases) && check_b)
960 		detect = 1;
961 
962 	if (pos_peak > noise_margin && neg_peak > noise_margin &&
963 	    gain_idx >= 0) {
964 		if (detect == 1 || detect == 2)
965 			fault = true;
966 	}
967 
968 	if (!fault)
969 		detect = 0;
970 
971 	ethnl_cable_test_result(phydev, ETHTOOL_A_CABLE_PAIR_A,
972 				lan87xx_cable_test_report_trans(detect));
973 
974 	return phy_init_hw(phydev);
975 }
976 
977 static int lan87xx_cable_test_get_status(struct phy_device *phydev,
978 					 bool *finished)
979 {
980 	int rc = 0;
981 
982 	*finished = false;
983 
984 	/* check if cable diag was finished */
985 	rc = access_ereg(phydev, PHYACC_ATTR_MODE_READ, PHYACC_ATTR_BANK_DSP,
986 			 90, 0);
987 	if (rc < 0)
988 		return rc;
989 
990 	if ((rc & 2) == 2) {
991 		/* stop cable diag*/
992 		rc = access_ereg(phydev, PHYACC_ATTR_MODE_WRITE,
993 				 PHYACC_ATTR_BANK_DSP,
994 				 90, 0);
995 		if (rc < 0)
996 			return rc;
997 
998 		*finished = true;
999 
1000 		return lan87xx_cable_test_report(phydev);
1001 	}
1002 
1003 	return 0;
1004 }
1005 
1006 static int lan87xx_read_status(struct phy_device *phydev)
1007 {
1008 	int rc = 0;
1009 
1010 	rc = phy_read(phydev, T1_MODE_STAT_REG);
1011 	if (rc < 0)
1012 		return rc;
1013 
1014 	if (rc & T1_LINK_UP_MSK)
1015 		phydev->link = 1;
1016 	else
1017 		phydev->link = 0;
1018 
1019 	phydev->speed = SPEED_UNKNOWN;
1020 	phydev->duplex = DUPLEX_UNKNOWN;
1021 	phydev->pause = 0;
1022 	phydev->asym_pause = 0;
1023 
1024 	rc = genphy_read_master_slave(phydev);
1025 	if (rc < 0)
1026 		return rc;
1027 
1028 	rc = genphy_read_status_fixed(phydev);
1029 	if (rc < 0)
1030 		return rc;
1031 
1032 	return rc;
1033 }
1034 
1035 static int lan87xx_config_aneg(struct phy_device *phydev)
1036 {
1037 	u16 ctl = 0;
1038 	int ret;
1039 
1040 	switch (phydev->master_slave_set) {
1041 	case MASTER_SLAVE_CFG_MASTER_FORCE:
1042 		ctl |= CTL1000_AS_MASTER;
1043 		break;
1044 	case MASTER_SLAVE_CFG_SLAVE_FORCE:
1045 		break;
1046 	case MASTER_SLAVE_CFG_UNKNOWN:
1047 	case MASTER_SLAVE_CFG_UNSUPPORTED:
1048 		return 0;
1049 	default:
1050 		phydev_warn(phydev, "Unsupported Master/Slave mode\n");
1051 		return -EOPNOTSUPP;
1052 	}
1053 
1054 	ret = phy_modify_changed(phydev, MII_CTRL1000, CTL1000_AS_MASTER, ctl);
1055 	if (ret == 1)
1056 		return phy_init_hw(phydev);
1057 
1058 	return ret;
1059 }
1060 
1061 static int lan87xx_get_sqi(struct phy_device *phydev)
1062 {
1063 	u8 sqi_value = 0;
1064 	int rc;
1065 
1066 	rc = access_ereg(phydev, PHYACC_ATTR_MODE_WRITE,
1067 			 PHYACC_ATTR_BANK_DSP, T1_COEF_RW_CTL_CFG, 0x0301);
1068 	if (rc < 0)
1069 		return rc;
1070 
1071 	rc = access_ereg(phydev, PHYACC_ATTR_MODE_READ,
1072 			 PHYACC_ATTR_BANK_DSP, T1_DCQ_SQI_REG, 0x0);
1073 	if (rc < 0)
1074 		return rc;
1075 
1076 	sqi_value = FIELD_GET(T1_DCQ_SQI_MSK, rc);
1077 
1078 	return sqi_value;
1079 }
1080 
1081 static int lan87xx_get_sqi_max(struct phy_device *phydev)
1082 {
1083 	return LAN87XX_MAX_SQI;
1084 }
1085 
1086 static int lan887x_rgmii_init(struct phy_device *phydev)
1087 {
1088 	int ret;
1089 
1090 	/* SGMII mux disable */
1091 	ret = phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1,
1092 				 LAN887X_SGMII_CTL,
1093 				 LAN887X_SGMII_CTL_SGMII_MUX_EN);
1094 	if (ret < 0)
1095 		return ret;
1096 
1097 	/* Select MAC_MODE as RGMII */
1098 	ret = phy_modify_mmd(phydev, MDIO_MMD_VEND1, LAN887X_MIS_CFG_REG0,
1099 			     LAN887X_MIS_CFG_REG0_MAC_MODE_SEL,
1100 			     LAN887X_MAC_MODE_RGMII);
1101 	if (ret < 0)
1102 		return ret;
1103 
1104 	/* Disable PCS */
1105 	ret = phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1,
1106 				 LAN887X_SGMII_PCS_CFG,
1107 				 LAN887X_SGMII_PCS_CFG_PCS_ENA);
1108 	if (ret < 0)
1109 		return ret;
1110 
1111 	/* LAN887x Errata: RGMII rx clock active in SGMII mode
1112 	 * Disabled it for SGMII mode
1113 	 * Re-enabling it for RGMII mode
1114 	 */
1115 	return phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1,
1116 				  LAN887X_MIS_CFG_REG0,
1117 				  LAN887X_MIS_CFG_REG0_RCLKOUT_DIS);
1118 }
1119 
1120 static int lan887x_sgmii_init(struct phy_device *phydev)
1121 {
1122 	int ret;
1123 
1124 	/* SGMII mux enable */
1125 	ret = phy_set_bits_mmd(phydev, MDIO_MMD_VEND1,
1126 			       LAN887X_SGMII_CTL,
1127 			       LAN887X_SGMII_CTL_SGMII_MUX_EN);
1128 	if (ret < 0)
1129 		return ret;
1130 
1131 	/* Select MAC_MODE as SGMII */
1132 	ret = phy_modify_mmd(phydev, MDIO_MMD_VEND1, LAN887X_MIS_CFG_REG0,
1133 			     LAN887X_MIS_CFG_REG0_MAC_MODE_SEL,
1134 			     LAN887X_MAC_MODE_SGMII);
1135 	if (ret < 0)
1136 		return ret;
1137 
1138 	/* LAN887x Errata: RGMII rx clock active in SGMII mode.
1139 	 * So disabling it for SGMII mode
1140 	 */
1141 	ret = phy_set_bits_mmd(phydev, MDIO_MMD_VEND1, LAN887X_MIS_CFG_REG0,
1142 			       LAN887X_MIS_CFG_REG0_RCLKOUT_DIS);
1143 	if (ret < 0)
1144 		return ret;
1145 
1146 	/* Enable PCS */
1147 	return phy_set_bits_mmd(phydev, MDIO_MMD_VEND1, LAN887X_SGMII_PCS_CFG,
1148 				LAN887X_SGMII_PCS_CFG_PCS_ENA);
1149 }
1150 
1151 static int lan887x_config_rgmii_en(struct phy_device *phydev)
1152 {
1153 	int txc;
1154 	int rxc;
1155 	int ret;
1156 
1157 	ret = lan887x_rgmii_init(phydev);
1158 	if (ret < 0)
1159 		return ret;
1160 
1161 	/* Control bit to enable/disable TX DLL delay line in signal path */
1162 	txc = phy_read_mmd(phydev, MDIO_MMD_VEND1, LAN887X_MIS_DLL_CFG_REG0);
1163 	if (txc < 0)
1164 		return txc;
1165 
1166 	/* Control bit to enable/disable RX DLL delay line in signal path */
1167 	rxc = phy_read_mmd(phydev, MDIO_MMD_VEND1, LAN887X_MIS_DLL_CFG_REG1);
1168 	if (rxc < 0)
1169 		return rxc;
1170 
1171 	/* Configures the phy to enable RX/TX delay
1172 	 * RGMII        - TX & RX delays are either added by MAC or not needed,
1173 	 *                phy should not add
1174 	 * RGMII_ID     - Configures phy to enable TX & RX delays, MAC shouldn't add
1175 	 * RGMII_RX_ID  - Configures the PHY to enable the RX delay.
1176 	 *                The MAC shouldn't add the RX delay
1177 	 * RGMII_TX_ID  - Configures the PHY to enable the TX delay.
1178 	 *                The MAC shouldn't add the TX delay in this case
1179 	 */
1180 	switch (phydev->interface) {
1181 	case PHY_INTERFACE_MODE_RGMII:
1182 		txc &= ~LAN887X_MIS_DLL_CONF;
1183 		rxc &= ~LAN887X_MIS_DLL_CONF;
1184 		break;
1185 	case PHY_INTERFACE_MODE_RGMII_ID:
1186 		txc |= LAN887X_MIS_DLL_CONF;
1187 		rxc |= LAN887X_MIS_DLL_CONF;
1188 		break;
1189 	case PHY_INTERFACE_MODE_RGMII_RXID:
1190 		txc &= ~LAN887X_MIS_DLL_CONF;
1191 		rxc |= LAN887X_MIS_DLL_CONF;
1192 		break;
1193 	case PHY_INTERFACE_MODE_RGMII_TXID:
1194 		txc |= LAN887X_MIS_DLL_CONF;
1195 		rxc &= ~LAN887X_MIS_DLL_CONF;
1196 		break;
1197 	default:
1198 		WARN_ONCE(1, "Invalid phydev interface %d\n", phydev->interface);
1199 		return 0;
1200 	}
1201 
1202 	/* Configures the PHY to enable/disable RX delay in signal path */
1203 	ret = phy_modify_mmd(phydev, MDIO_MMD_VEND1, LAN887X_MIS_DLL_CFG_REG1,
1204 			     LAN887X_MIS_DLL_CONF, rxc);
1205 	if (ret < 0)
1206 		return ret;
1207 
1208 	/* Configures the PHY to enable/disable the TX delay in signal path */
1209 	return phy_modify_mmd(phydev, MDIO_MMD_VEND1, LAN887X_MIS_DLL_CFG_REG0,
1210 			      LAN887X_MIS_DLL_CONF, txc);
1211 }
1212 
1213 static int lan887x_config_phy_interface(struct phy_device *phydev)
1214 {
1215 	int interface_mode;
1216 	int sgmii_dis;
1217 	int ret;
1218 
1219 	/* Read sku efuse data for interfaces supported by sku */
1220 	ret = phy_read_mmd(phydev, MDIO_MMD_VEND1, LAN887X_EFUSE_READ_DAT9);
1221 	if (ret < 0)
1222 		return ret;
1223 
1224 	/* If interface_mode is 1 then efuse sets RGMII operations.
1225 	 * If interface mode is 3 then efuse sets SGMII operations.
1226 	 */
1227 	interface_mode = ret & LAN887X_EFUSE_READ_DAT9_MAC_MODE;
1228 	/* SGMII disable is set for RGMII operations */
1229 	sgmii_dis = ret & LAN887X_EFUSE_READ_DAT9_SGMII_DIS;
1230 
1231 	switch (phydev->interface) {
1232 	case PHY_INTERFACE_MODE_RGMII:
1233 	case PHY_INTERFACE_MODE_RGMII_ID:
1234 	case PHY_INTERFACE_MODE_RGMII_RXID:
1235 	case PHY_INTERFACE_MODE_RGMII_TXID:
1236 		/* Reject RGMII settings for SGMII only sku */
1237 		ret = -EOPNOTSUPP;
1238 
1239 		if (!((interface_mode & LAN887X_MAC_MODE_SGMII) ==
1240 		    LAN887X_MAC_MODE_SGMII))
1241 			ret = lan887x_config_rgmii_en(phydev);
1242 		break;
1243 	case PHY_INTERFACE_MODE_SGMII:
1244 		/* Reject SGMII setting for RGMII only sku */
1245 		ret = -EOPNOTSUPP;
1246 
1247 		if (!sgmii_dis)
1248 			ret = lan887x_sgmii_init(phydev);
1249 		break;
1250 	default:
1251 		/* Reject setting for unsupported interfaces */
1252 		ret = -EOPNOTSUPP;
1253 	}
1254 
1255 	return ret;
1256 }
1257 
1258 static int lan887x_get_features(struct phy_device *phydev)
1259 {
1260 	int ret;
1261 
1262 	ret = genphy_c45_pma_read_abilities(phydev);
1263 	if (ret < 0)
1264 		return ret;
1265 
1266 	/* Enable twisted pair */
1267 	linkmode_set_bit(ETHTOOL_LINK_MODE_TP_BIT, phydev->supported);
1268 
1269 	/* First patch only supports 100Mbps and 1000Mbps force-mode.
1270 	 * T1 Auto-Negotiation (Clause 98 of IEEE 802.3) will be added later.
1271 	 */
1272 	linkmode_clear_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, phydev->supported);
1273 
1274 	return 0;
1275 }
1276 
1277 static int lan887x_phy_init(struct phy_device *phydev)
1278 {
1279 	struct lan887x_priv *priv = phydev->priv;
1280 	int ret;
1281 
1282 	if (!priv->init_done && phy_interrupt_is_valid(phydev)) {
1283 		priv->clock = mchp_rds_ptp_probe(phydev, MDIO_MMD_VEND1,
1284 						 MCHP_RDS_PTP_LTC_BASE_ADDR,
1285 						 MCHP_RDS_PTP_PORT_BASE_ADDR);
1286 		if (IS_ERR(priv->clock))
1287 			return PTR_ERR(priv->clock);
1288 
1289 		priv->init_done = true;
1290 	}
1291 
1292 	/* Clear loopback */
1293 	ret = phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1,
1294 				 LAN887X_MIS_CFG_REG2,
1295 				 LAN887X_MIS_CFG_REG2_FE_LPBK_EN);
1296 	if (ret < 0)
1297 		return ret;
1298 
1299 	/* Configure default behavior of led to link and activity for any
1300 	 * speed
1301 	 */
1302 	ret = phy_modify_mmd(phydev, MDIO_MMD_VEND1,
1303 			     LAN887X_COMMON_LED3_LED2,
1304 			     LAN887X_COMMON_LED2_MODE_SEL_MASK,
1305 			     LAN887X_LED_LINK_ACT_ANY_SPEED);
1306 	if (ret < 0)
1307 		return ret;
1308 
1309 	/* PHY interface setup */
1310 	return lan887x_config_phy_interface(phydev);
1311 }
1312 
1313 static int lan887x_phy_config(struct phy_device *phydev,
1314 			      const struct lan887x_regwr_map *reg_map, int cnt)
1315 {
1316 	int ret;
1317 
1318 	for (int i = 0; i < cnt; i++) {
1319 		ret = phy_write_mmd(phydev, reg_map[i].mmd,
1320 				    reg_map[i].reg, reg_map[i].val);
1321 		if (ret < 0)
1322 			return ret;
1323 	}
1324 
1325 	return 0;
1326 }
1327 
1328 static int lan887x_phy_setup(struct phy_device *phydev)
1329 {
1330 	static const struct lan887x_regwr_map phy_cfg[] = {
1331 		/* PORT_AFE writes */
1332 		{MDIO_MMD_PMAPMD, LAN887X_ZQCAL_CONTROL_1, 0x4008},
1333 		{MDIO_MMD_PMAPMD, LAN887X_AFE_PORT_TESTBUS_CTRL2, 0x0000},
1334 		{MDIO_MMD_PMAPMD, LAN887X_AFE_PORT_TESTBUS_CTRL6, 0x0040},
1335 		/* 100T1_PCS_VENDOR writes */
1336 		{MDIO_MMD_PCS,	  LAN887X_IDLE_ERR_CNT_THRESH, 0x0008},
1337 		{MDIO_MMD_PCS,	  LAN887X_IDLE_ERR_TIMER_WIN, 0x800d},
1338 		/* 100T1 DSP writes */
1339 		{MDIO_MMD_VEND1,  LAN887x_CDR_CONFIG1_100, 0x0ab1},
1340 		{MDIO_MMD_VEND1,  LAN887x_LOCK1_EQLSR_CONFIG_100, 0x5274},
1341 		{MDIO_MMD_VEND1,  LAN887x_SLV_HD_MUFAC_CONFIG_100, 0x0d74},
1342 		{MDIO_MMD_VEND1,  LAN887x_PLOCK_MUFAC_CONFIG_100, 0x0aea},
1343 		{MDIO_MMD_VEND1,  LAN887x_PROT_DISABLE_100, 0x0360},
1344 		{MDIO_MMD_VEND1,  LAN887x_KF_LOOP_SAT_CONFIG_100, 0x0c30},
1345 		/* 1000T1 DSP writes */
1346 		{MDIO_MMD_VEND1,  LAN887X_LOCK1_EQLSR_CONFIG, 0x2a78},
1347 		{MDIO_MMD_VEND1,  LAN887X_LOCK3_EQLSR_CONFIG, 0x1368},
1348 		{MDIO_MMD_VEND1,  LAN887X_PROT_DISABLE, 0x1354},
1349 		{MDIO_MMD_VEND1,  LAN887X_FFE_GAIN6, 0x3C84},
1350 		{MDIO_MMD_VEND1,  LAN887X_FFE_GAIN7, 0x3ca5},
1351 		{MDIO_MMD_VEND1,  LAN887X_FFE_GAIN8, 0x3ca5},
1352 		{MDIO_MMD_VEND1,  LAN887X_FFE_GAIN9, 0x3ca5},
1353 		{MDIO_MMD_VEND1,  LAN887X_ECHO_DELAY_CONFIG, 0x0024},
1354 		{MDIO_MMD_VEND1,  LAN887X_FFE_MAX_CONFIG, 0x227f},
1355 		/* 1000T1 PCS writes */
1356 		{MDIO_MMD_PCS,    LAN887X_SCR_CONFIG_3, 0x1e00},
1357 		{MDIO_MMD_PCS,    LAN887X_INFO_FLD_CONFIG_5, 0x0fa1},
1358 	};
1359 
1360 	return lan887x_phy_config(phydev, phy_cfg, ARRAY_SIZE(phy_cfg));
1361 }
1362 
1363 static int lan887x_100M_setup(struct phy_device *phydev)
1364 {
1365 	int ret;
1366 
1367 	/* (Re)configure the speed/mode dependent T1 settings */
1368 	if (phydev->master_slave_set == MASTER_SLAVE_CFG_MASTER_FORCE ||
1369 	    phydev->master_slave_set == MASTER_SLAVE_CFG_MASTER_PREFERRED){
1370 		static const struct lan887x_regwr_map phy_cfg[] = {
1371 			{MDIO_MMD_PMAPMD, LAN887X_AFE_PORT_TESTBUS_CTRL4, 0x00b8},
1372 			{MDIO_MMD_PMAPMD, LAN887X_TX_AMPLT_1000T1_REG, 0x0038},
1373 			{MDIO_MMD_VEND1,  LAN887X_INIT_COEFF_DFE1_100, 0x000f},
1374 		};
1375 
1376 		ret = lan887x_phy_config(phydev, phy_cfg, ARRAY_SIZE(phy_cfg));
1377 	} else {
1378 		static const struct lan887x_regwr_map phy_cfg[] = {
1379 			{MDIO_MMD_PMAPMD, LAN887X_AFE_PORT_TESTBUS_CTRL4, 0x0038},
1380 			{MDIO_MMD_VEND1, LAN887X_INIT_COEFF_DFE1_100, 0x0014},
1381 		};
1382 
1383 		ret = lan887x_phy_config(phydev, phy_cfg, ARRAY_SIZE(phy_cfg));
1384 	}
1385 	if (ret < 0)
1386 		return ret;
1387 
1388 	return phy_set_bits_mmd(phydev, MDIO_MMD_VEND1, LAN887X_REG_REG26,
1389 				LAN887X_REG_REG26_HW_INIT_SEQ_EN);
1390 }
1391 
1392 static int lan887x_1000M_setup(struct phy_device *phydev)
1393 {
1394 	static const struct lan887x_regwr_map phy_cfg[] = {
1395 		{MDIO_MMD_PMAPMD, LAN887X_TX_AMPLT_1000T1_REG, 0x003f},
1396 		{MDIO_MMD_PMAPMD, LAN887X_AFE_PORT_TESTBUS_CTRL4, 0x00b8},
1397 	};
1398 	int ret;
1399 
1400 	/* (Re)configure the speed/mode dependent T1 settings */
1401 	ret = lan887x_phy_config(phydev, phy_cfg, ARRAY_SIZE(phy_cfg));
1402 	if (ret < 0)
1403 		return ret;
1404 
1405 	return phy_set_bits_mmd(phydev, MDIO_MMD_PMAPMD, LAN887X_DSP_PMA_CONTROL,
1406 				LAN887X_DSP_PMA_CONTROL_LNK_SYNC);
1407 }
1408 
1409 static int lan887x_link_setup(struct phy_device *phydev)
1410 {
1411 	int ret = -EINVAL;
1412 
1413 	if (phydev->speed == SPEED_1000)
1414 		ret = lan887x_1000M_setup(phydev);
1415 	else if (phydev->speed == SPEED_100)
1416 		ret = lan887x_100M_setup(phydev);
1417 
1418 	return ret;
1419 }
1420 
1421 /* LAN887x Errata: speed configuration changes require soft reset
1422  * and chip soft reset
1423  */
1424 static int lan887x_phy_reset(struct phy_device *phydev)
1425 {
1426 	int ret, val;
1427 
1428 	/* Clear 1000M link sync */
1429 	ret = phy_clear_bits_mmd(phydev, MDIO_MMD_PMAPMD, LAN887X_DSP_PMA_CONTROL,
1430 				 LAN887X_DSP_PMA_CONTROL_LNK_SYNC);
1431 	if (ret < 0)
1432 		return ret;
1433 
1434 	/* Clear 100M link sync */
1435 	ret = phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, LAN887X_REG_REG26,
1436 				 LAN887X_REG_REG26_HW_INIT_SEQ_EN);
1437 	if (ret < 0)
1438 		return ret;
1439 
1440 	/* Chiptop soft-reset to allow the speed/mode change */
1441 	ret = phy_write_mmd(phydev, MDIO_MMD_VEND1, LAN887X_CHIP_SOFT_RST,
1442 			    LAN887X_CHIP_SOFT_RST_RESET);
1443 	if (ret < 0)
1444 		return ret;
1445 
1446 	/* CL22 soft-reset to let the link re-train */
1447 	ret = phy_modify(phydev, MII_BMCR, BMCR_RESET, BMCR_RESET);
1448 	if (ret < 0)
1449 		return ret;
1450 
1451 	/* Wait for reset complete or timeout if > 10ms */
1452 	return phy_read_poll_timeout(phydev, MII_BMCR, val, !(val & BMCR_RESET),
1453 				    5000, 10000, true);
1454 }
1455 
1456 static int lan887x_phy_reconfig(struct phy_device *phydev)
1457 {
1458 	int ret;
1459 
1460 	linkmode_zero(phydev->advertising);
1461 
1462 	ret = genphy_c45_pma_setup_forced(phydev);
1463 	if (ret < 0)
1464 		return ret;
1465 
1466 	return lan887x_link_setup(phydev);
1467 }
1468 
1469 static int lan887x_config_aneg(struct phy_device *phydev)
1470 {
1471 	int ret;
1472 
1473 	/* LAN887x Errata: speed configuration changes require soft reset
1474 	 * and chip soft reset
1475 	 */
1476 	ret = lan887x_phy_reset(phydev);
1477 	if (ret < 0)
1478 		return ret;
1479 
1480 	return lan887x_phy_reconfig(phydev);
1481 }
1482 
1483 static int lan887x_probe(struct phy_device *phydev)
1484 {
1485 	struct lan887x_priv *priv;
1486 
1487 	priv = devm_kzalloc(&phydev->mdio.dev, sizeof(*priv), GFP_KERNEL);
1488 	if (!priv)
1489 		return -ENOMEM;
1490 
1491 	priv->init_done = false;
1492 	phydev->priv = priv;
1493 
1494 	return lan887x_phy_setup(phydev);
1495 }
1496 
1497 static u64 lan887x_get_stat(struct phy_device *phydev, int i)
1498 {
1499 	struct lan887x_hw_stat stat = lan887x_hw_stats[i];
1500 	struct lan887x_priv *priv = phydev->priv;
1501 	int val;
1502 	u64 ret;
1503 
1504 	if (stat.mmd)
1505 		val = phy_read_mmd(phydev, stat.mmd, stat.reg);
1506 	else
1507 		val = phy_read(phydev, stat.reg);
1508 
1509 	if (val < 0) {
1510 		ret = U64_MAX;
1511 	} else {
1512 		val = val & ((1 << stat.bits) - 1);
1513 		priv->stats[i] += val;
1514 		ret = priv->stats[i];
1515 	}
1516 
1517 	return ret;
1518 }
1519 
1520 static void lan887x_get_stats(struct phy_device *phydev,
1521 			      struct ethtool_stats *stats, u64 *data)
1522 {
1523 	for (int i = 0; i < ARRAY_SIZE(lan887x_hw_stats); i++)
1524 		data[i] = lan887x_get_stat(phydev, i);
1525 }
1526 
1527 static int lan887x_get_sset_count(struct phy_device *phydev)
1528 {
1529 	return ARRAY_SIZE(lan887x_hw_stats);
1530 }
1531 
1532 static void lan887x_get_strings(struct phy_device *phydev, u8 *data)
1533 {
1534 	for (int i = 0; i < ARRAY_SIZE(lan887x_hw_stats); i++)
1535 		ethtool_puts(&data, lan887x_hw_stats[i].string);
1536 }
1537 
1538 static int lan887x_config_intr(struct phy_device *phydev)
1539 {
1540 	struct lan887x_priv *priv = phydev->priv;
1541 	int rc;
1542 
1543 	if (phydev->interrupts == PHY_INTERRUPT_ENABLED) {
1544 		/* Clear the interrupt status before enabling interrupts */
1545 		rc = phy_read_mmd(phydev, MDIO_MMD_VEND1, LAN887X_INT_STS);
1546 		if (rc < 0)
1547 			return rc;
1548 
1549 		/* Unmask for enabling interrupt */
1550 		rc = phy_write_mmd(phydev, MDIO_MMD_VEND1, LAN887X_INT_MSK,
1551 				   (u16)~LAN887X_MX_CHIP_TOP_ALL_MSK);
1552 	} else {
1553 		rc = phy_write_mmd(phydev, MDIO_MMD_VEND1, LAN887X_INT_MSK,
1554 				   GENMASK(15, 0));
1555 		if (rc < 0)
1556 			return rc;
1557 
1558 		rc = phy_read_mmd(phydev, MDIO_MMD_VEND1, LAN887X_INT_STS);
1559 	}
1560 	if (rc < 0)
1561 		return rc;
1562 
1563 	if (phy_is_default_hwtstamp(phydev)) {
1564 		return mchp_rds_ptp_top_config_intr(priv->clock,
1565 					LAN887X_INT_MSK,
1566 					LAN887X_INT_MSK_P1588_MOD_INT_MSK,
1567 					(phydev->interrupts ==
1568 					 PHY_INTERRUPT_ENABLED));
1569 	}
1570 
1571 	return 0;
1572 }
1573 
1574 static irqreturn_t lan887x_handle_interrupt(struct phy_device *phydev)
1575 {
1576 	struct lan887x_priv *priv = phydev->priv;
1577 	int rc = IRQ_NONE;
1578 	int irq_status;
1579 
1580 	irq_status = phy_read_mmd(phydev, MDIO_MMD_VEND1, LAN887X_INT_STS);
1581 	if (irq_status < 0) {
1582 		phy_error(phydev);
1583 		return IRQ_NONE;
1584 	}
1585 
1586 	if (irq_status & LAN887X_MX_CHIP_TOP_LINK_MSK) {
1587 		phy_trigger_machine(phydev);
1588 		rc = IRQ_HANDLED;
1589 	}
1590 
1591 	if (irq_status & LAN887X_INT_MSK_P1588_MOD_INT_MSK)
1592 		rc = mchp_rds_ptp_handle_interrupt(priv->clock);
1593 
1594 	return rc;
1595 }
1596 
1597 static int lan887x_cd_reset(struct phy_device *phydev,
1598 			    enum cable_diag_state cd_done)
1599 {
1600 	u16 val;
1601 	int rc;
1602 
1603 	/* Chip hard-reset */
1604 	rc = phy_write_mmd(phydev, MDIO_MMD_VEND1, LAN887X_CHIP_HARD_RST,
1605 			   LAN887X_CHIP_HARD_RST_RESET);
1606 	if (rc < 0)
1607 		return rc;
1608 
1609 	/* Wait for reset to complete */
1610 	rc = phy_read_poll_timeout(phydev, MII_PHYSID2, val,
1611 				   ((val & GENMASK(15, 4)) ==
1612 				    (PHY_ID_LAN887X & GENMASK(15, 4))),
1613 				   5000, 50000, true);
1614 	if (rc < 0)
1615 		return rc;
1616 
1617 	if (cd_done == CD_TEST_DONE) {
1618 		/* Cable diagnostics complete. Restore PHY. */
1619 		rc = lan887x_phy_setup(phydev);
1620 		if (rc < 0)
1621 			return rc;
1622 
1623 		rc = lan887x_phy_init(phydev);
1624 		if (rc < 0)
1625 			return rc;
1626 
1627 		rc = lan887x_config_intr(phydev);
1628 		if (rc < 0)
1629 			return rc;
1630 
1631 		rc = lan887x_phy_reconfig(phydev);
1632 		if (rc < 0)
1633 			return rc;
1634 	}
1635 
1636 	return 0;
1637 }
1638 
1639 static int lan887x_cable_test_prep(struct phy_device *phydev,
1640 				   enum cable_diag_mode mode)
1641 {
1642 	static const struct lan887x_regwr_map values[] = {
1643 		{MDIO_MMD_VEND1, LAN887X_MAX_PGA_GAIN_100, 0x1f},
1644 		{MDIO_MMD_VEND1, LAN887X_MIN_PGA_GAIN_100, 0x0},
1645 		{MDIO_MMD_VEND1, LAN887X_CBL_DIAG_TDR_THRESH_100, 0x1},
1646 		{MDIO_MMD_VEND1, LAN887X_CBL_DIAG_AGC_THRESH_100, 0x3c},
1647 		{MDIO_MMD_VEND1, LAN887X_CBL_DIAG_MIN_WAIT_CONFIG_100, 0x0},
1648 		{MDIO_MMD_VEND1, LAN887X_CBL_DIAG_MAX_WAIT_CONFIG_100, 0x46},
1649 		{MDIO_MMD_VEND1, LAN887X_CBL_DIAG_CYC_CONFIG_100, 0x5a},
1650 		{MDIO_MMD_VEND1, LAN887X_CBL_DIAG_TX_PULSE_CONFIG_100, 0x44d5},
1651 		{MDIO_MMD_VEND1, LAN887X_CBL_DIAG_MIN_PGA_GAIN_100, 0x0},
1652 
1653 	};
1654 	int rc;
1655 
1656 	rc = lan887x_cd_reset(phydev, CD_TEST_INIT);
1657 	if (rc < 0)
1658 		return rc;
1659 
1660 	/* Forcing DUT to master mode, as we don't care about
1661 	 * mode during diagnostics
1662 	 */
1663 	rc = phy_write_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_PMA_PMD_BT1_CTRL,
1664 			   MDIO_PMA_PMD_BT1_CTRL_CFG_MST);
1665 	if (rc < 0)
1666 		return rc;
1667 
1668 	rc = phy_write_mmd(phydev, MDIO_MMD_PMAPMD, 0x80b0, 0x0038);
1669 	if (rc < 0)
1670 		return rc;
1671 
1672 	rc = phy_modify_mmd(phydev, MDIO_MMD_VEND1,
1673 			    LAN887X_CALIB_CONFIG_100, 0,
1674 			    LAN887X_CALIB_CONFIG_100_VAL);
1675 	if (rc < 0)
1676 		return rc;
1677 
1678 	for (int i = 0; i < ARRAY_SIZE(values); i++) {
1679 		rc = phy_write_mmd(phydev, values[i].mmd, values[i].reg,
1680 				   values[i].val);
1681 		if (rc < 0)
1682 			return rc;
1683 
1684 		if (mode &&
1685 		    values[i].reg == LAN887X_CBL_DIAG_MAX_WAIT_CONFIG_100) {
1686 			rc = phy_write_mmd(phydev, values[i].mmd,
1687 					   values[i].reg, 0xa);
1688 			if (rc < 0)
1689 				return rc;
1690 		}
1691 	}
1692 
1693 	if (mode == TEST_MODE_HYBRID) {
1694 		rc = phy_modify_mmd(phydev, MDIO_MMD_PMAPMD,
1695 				    LAN887X_AFE_PORT_TESTBUS_CTRL4,
1696 				    BIT(0), BIT(0));
1697 		if (rc < 0)
1698 			return rc;
1699 	}
1700 
1701 	/* HW_INIT 100T1, Get DUT running in 100T1 mode */
1702 	rc = phy_modify_mmd(phydev, MDIO_MMD_VEND1, LAN887X_REG_REG26,
1703 			    LAN887X_REG_REG26_HW_INIT_SEQ_EN,
1704 			    LAN887X_REG_REG26_HW_INIT_SEQ_EN);
1705 	if (rc < 0)
1706 		return rc;
1707 
1708 	/* Cable diag requires hard reset and is sensitive regarding the delays.
1709 	 * Hard reset is expected into and out of cable diag.
1710 	 * Wait for 50ms
1711 	 */
1712 	msleep(50);
1713 
1714 	/* Start cable diag */
1715 	return phy_write_mmd(phydev, MDIO_MMD_VEND1,
1716 			   LAN887X_START_CBL_DIAG_100,
1717 			   LAN887X_CBL_DIAG_START);
1718 }
1719 
1720 static int lan887x_cable_test_chk(struct phy_device *phydev,
1721 				  enum cable_diag_mode mode)
1722 {
1723 	int val;
1724 	int rc;
1725 
1726 	if (mode == TEST_MODE_HYBRID) {
1727 		/* Cable diag requires hard reset and is sensitive regarding the delays.
1728 		 * Hard reset is expected into and out of cable diag.
1729 		 * Wait for cable diag to complete.
1730 		 * Minimum wait time is 50ms if the condition is not a match.
1731 		 */
1732 		rc = phy_read_mmd_poll_timeout(phydev, MDIO_MMD_VEND1,
1733 					       LAN887X_START_CBL_DIAG_100, val,
1734 					       ((val & LAN887X_CBL_DIAG_DONE) ==
1735 						LAN887X_CBL_DIAG_DONE),
1736 					       50000, 500000, false);
1737 		if (rc < 0)
1738 			return rc;
1739 	} else {
1740 		rc = phy_read_mmd(phydev, MDIO_MMD_VEND1,
1741 				  LAN887X_START_CBL_DIAG_100);
1742 		if (rc < 0)
1743 			return rc;
1744 
1745 		if ((rc & LAN887X_CBL_DIAG_DONE) != LAN887X_CBL_DIAG_DONE)
1746 			return -EAGAIN;
1747 	}
1748 
1749 	/* Stop cable diag */
1750 	return phy_write_mmd(phydev, MDIO_MMD_VEND1,
1751 			     LAN887X_START_CBL_DIAG_100,
1752 			     LAN887X_CBL_DIAG_STOP);
1753 }
1754 
1755 static int lan887x_cable_test_start(struct phy_device *phydev)
1756 {
1757 	int rc, ret;
1758 
1759 	rc = lan887x_cable_test_prep(phydev, TEST_MODE_NORMAL);
1760 	if (rc < 0) {
1761 		ret = lan887x_cd_reset(phydev, CD_TEST_DONE);
1762 		if (ret < 0)
1763 			return ret;
1764 
1765 		return rc;
1766 	}
1767 
1768 	return 0;
1769 }
1770 
1771 static int lan887x_cable_test_report(struct phy_device *phydev)
1772 {
1773 	int pos_peak_cycle, pos_peak_cycle_hybrid, pos_peak_in_phases;
1774 	int pos_peak_time, pos_peak_time_hybrid, neg_peak_time;
1775 	int neg_peak_cycle, neg_peak_in_phases;
1776 	int pos_peak_in_phases_hybrid;
1777 	int gain_idx, gain_idx_hybrid;
1778 	int pos_peak_phase_hybrid;
1779 	int pos_peak, neg_peak;
1780 	int distance;
1781 	int detect;
1782 	int length;
1783 	int ret;
1784 	int rc;
1785 
1786 	/* Read non-hybrid results */
1787 	gain_idx = phy_read_mmd(phydev, MDIO_MMD_VEND1,
1788 				LAN887X_CBL_DIAG_AGC_GAIN_100);
1789 	if (gain_idx < 0) {
1790 		rc = gain_idx;
1791 		goto error;
1792 	}
1793 
1794 	pos_peak = phy_read_mmd(phydev, MDIO_MMD_VEND1,
1795 				LAN887X_CBL_DIAG_POS_PEAK_VALUE_100);
1796 	if (pos_peak < 0) {
1797 		rc = pos_peak;
1798 		goto error;
1799 	}
1800 
1801 	neg_peak = phy_read_mmd(phydev, MDIO_MMD_VEND1,
1802 				LAN887X_CBL_DIAG_NEG_PEAK_VALUE_100);
1803 	if (neg_peak < 0) {
1804 		rc = neg_peak;
1805 		goto error;
1806 	}
1807 
1808 	pos_peak_time = phy_read_mmd(phydev, MDIO_MMD_VEND1,
1809 				     LAN887X_CBL_DIAG_POS_PEAK_TIME_100);
1810 	if (pos_peak_time < 0) {
1811 		rc = pos_peak_time;
1812 		goto error;
1813 	}
1814 
1815 	neg_peak_time = phy_read_mmd(phydev, MDIO_MMD_VEND1,
1816 				     LAN887X_CBL_DIAG_NEG_PEAK_TIME_100);
1817 	if (neg_peak_time < 0) {
1818 		rc = neg_peak_time;
1819 		goto error;
1820 	}
1821 
1822 	/* Calculate non-hybrid values */
1823 	pos_peak_cycle = (pos_peak_time >> 7) & 0x7f;
1824 	pos_peak_in_phases = (pos_peak_cycle * 96) + (pos_peak_time & 0x7f);
1825 	neg_peak_cycle = (neg_peak_time >> 7) & 0x7f;
1826 	neg_peak_in_phases = (neg_peak_cycle * 96) + (neg_peak_time & 0x7f);
1827 
1828 	/* Deriving the status of cable */
1829 	if (pos_peak > MICROCHIP_CABLE_NOISE_MARGIN &&
1830 	    neg_peak > MICROCHIP_CABLE_NOISE_MARGIN && gain_idx >= 0) {
1831 		if (pos_peak_in_phases > neg_peak_in_phases &&
1832 		    ((pos_peak_in_phases - neg_peak_in_phases) >=
1833 		     MICROCHIP_CABLE_MIN_TIME_DIFF) &&
1834 		    ((pos_peak_in_phases - neg_peak_in_phases) <
1835 		     MICROCHIP_CABLE_MAX_TIME_DIFF) &&
1836 		    pos_peak_in_phases > 0) {
1837 			detect = LAN87XX_CABLE_TEST_SAME_SHORT;
1838 		} else if (neg_peak_in_phases > pos_peak_in_phases &&
1839 			   ((neg_peak_in_phases - pos_peak_in_phases) >=
1840 			    MICROCHIP_CABLE_MIN_TIME_DIFF) &&
1841 			   ((neg_peak_in_phases - pos_peak_in_phases) <
1842 			    MICROCHIP_CABLE_MAX_TIME_DIFF) &&
1843 			   neg_peak_in_phases > 0) {
1844 			detect = LAN87XX_CABLE_TEST_OPEN;
1845 		} else {
1846 			detect = LAN87XX_CABLE_TEST_OK;
1847 		}
1848 	} else {
1849 		detect = LAN87XX_CABLE_TEST_OK;
1850 	}
1851 
1852 	if (detect == LAN87XX_CABLE_TEST_OK) {
1853 		distance = 0;
1854 		goto get_len;
1855 	}
1856 
1857 	/* Re-initialize PHY and start cable diag test */
1858 	rc = lan887x_cable_test_prep(phydev, TEST_MODE_HYBRID);
1859 	if (rc < 0)
1860 		goto cd_stop;
1861 
1862 	/* Wait for cable diag test completion */
1863 	rc = lan887x_cable_test_chk(phydev, TEST_MODE_HYBRID);
1864 	if (rc < 0)
1865 		goto cd_stop;
1866 
1867 	/* Read hybrid results */
1868 	gain_idx_hybrid = phy_read_mmd(phydev, MDIO_MMD_VEND1,
1869 				       LAN887X_CBL_DIAG_AGC_GAIN_100);
1870 	if (gain_idx_hybrid < 0) {
1871 		rc = gain_idx_hybrid;
1872 		goto error;
1873 	}
1874 
1875 	pos_peak_time_hybrid = phy_read_mmd(phydev, MDIO_MMD_VEND1,
1876 					    LAN887X_CBL_DIAG_POS_PEAK_TIME_100);
1877 	if (pos_peak_time_hybrid < 0) {
1878 		rc = pos_peak_time_hybrid;
1879 		goto error;
1880 	}
1881 
1882 	/* Calculate hybrid values to derive cable length to fault */
1883 	pos_peak_cycle_hybrid = (pos_peak_time_hybrid >> 7) & 0x7f;
1884 	pos_peak_phase_hybrid = pos_peak_time_hybrid & 0x7f;
1885 	pos_peak_in_phases_hybrid = pos_peak_cycle_hybrid * 96 +
1886 				    pos_peak_phase_hybrid;
1887 
1888 	/* Distance to fault calculation.
1889 	 * distance = (peak_in_phases - peak_in_phases_hybrid) *
1890 	 *             propagationconstant.
1891 	 * constant to convert number of phases to meters
1892 	 * propagationconstant = 0.015953
1893 	 *                       (0.6811 * 2.9979 * 156.2499 * 0.0001 * 0.5)
1894 	 * Applying constant 1.5953 as ethtool further devides by 100 to
1895 	 * convert to meters.
1896 	 */
1897 	if (detect == LAN87XX_CABLE_TEST_OPEN) {
1898 		distance = (((pos_peak_in_phases - pos_peak_in_phases_hybrid)
1899 			     * 15953) / 10000);
1900 	} else if (detect == LAN87XX_CABLE_TEST_SAME_SHORT) {
1901 		distance = (((neg_peak_in_phases - pos_peak_in_phases_hybrid)
1902 			     * 15953) / 10000);
1903 	} else {
1904 		distance = 0;
1905 	}
1906 
1907 get_len:
1908 	rc = lan887x_cd_reset(phydev, CD_TEST_DONE);
1909 	if (rc < 0)
1910 		return rc;
1911 
1912 	length = ((u32)distance & GENMASK(15, 0));
1913 	ethnl_cable_test_result(phydev, ETHTOOL_A_CABLE_PAIR_A,
1914 				lan87xx_cable_test_report_trans(detect));
1915 	ethnl_cable_test_fault_length(phydev, ETHTOOL_A_CABLE_PAIR_A, length);
1916 
1917 	return 0;
1918 
1919 cd_stop:
1920 	/* Stop cable diag */
1921 	ret = phy_write_mmd(phydev, MDIO_MMD_VEND1,
1922 			    LAN887X_START_CBL_DIAG_100,
1923 			    LAN887X_CBL_DIAG_STOP);
1924 	if (ret < 0)
1925 		return ret;
1926 
1927 error:
1928 	/* Cable diag test failed */
1929 	ret = lan887x_cd_reset(phydev, CD_TEST_DONE);
1930 	if (ret < 0)
1931 		return ret;
1932 
1933 	/* Return error in failure case */
1934 	return rc;
1935 }
1936 
1937 static int lan887x_cable_test_get_status(struct phy_device *phydev,
1938 					 bool *finished)
1939 {
1940 	int rc;
1941 
1942 	rc = lan887x_cable_test_chk(phydev, TEST_MODE_NORMAL);
1943 	if (rc < 0) {
1944 		/* Let PHY statemachine poll again */
1945 		if (rc == -EAGAIN)
1946 			return 0;
1947 		return rc;
1948 	}
1949 
1950 	/* Cable diag test complete */
1951 	*finished = true;
1952 
1953 	/* Retrieve test status and cable length to fault */
1954 	return lan887x_cable_test_report(phydev);
1955 }
1956 
1957 /* Compare block to sort in ascending order */
1958 static int sqi_compare(const void *a, const void *b)
1959 {
1960 	return  *(u16 *)a - *(u16 *)b;
1961 }
1962 
1963 static int lan887x_get_sqi_100M(struct phy_device *phydev)
1964 {
1965 	u16 rawtable[SQI_SAMPLES];
1966 	u32 sqiavg = 0;
1967 	u8 sqinum = 0;
1968 	int rc, i;
1969 
1970 	/* Configuration of SQI 100M */
1971 	rc = phy_write_mmd(phydev, MDIO_MMD_VEND1,
1972 			   LAN887X_COEFF_PWR_DN_CONFIG_100,
1973 			   LAN887X_COEFF_PWR_DN_CONFIG_100_V);
1974 	if (rc < 0)
1975 		return rc;
1976 
1977 	rc = phy_write_mmd(phydev, MDIO_MMD_VEND1, LAN887X_SQI_CONFIG_100,
1978 			   LAN887X_SQI_CONFIG_100_V);
1979 	if (rc < 0)
1980 		return rc;
1981 
1982 	rc = phy_read_mmd(phydev, MDIO_MMD_VEND1, LAN887X_SQI_CONFIG_100);
1983 	if (rc != LAN887X_SQI_CONFIG_100_V)
1984 		return -EINVAL;
1985 
1986 	rc = phy_modify_mmd(phydev, MDIO_MMD_VEND1, LAN887X_POKE_PEEK_100,
1987 			    LAN887X_POKE_PEEK_100_EN,
1988 			    LAN887X_POKE_PEEK_100_EN);
1989 	if (rc < 0)
1990 		return rc;
1991 
1992 	/* Required before reading register
1993 	 * otherwise it will return high value
1994 	 */
1995 	msleep(50);
1996 
1997 	/* Link check before raw readings */
1998 	rc = genphy_c45_read_link(phydev);
1999 	if (rc < 0)
2000 		return rc;
2001 
2002 	if (!phydev->link)
2003 		return -ENETDOWN;
2004 
2005 	/* Get 200 SQI raw readings */
2006 	for (i = 0; i < SQI_SAMPLES; i++) {
2007 		rc = phy_write_mmd(phydev, MDIO_MMD_VEND1,
2008 				   LAN887X_POKE_PEEK_100,
2009 				   LAN887X_POKE_PEEK_100_EN);
2010 		if (rc < 0)
2011 			return rc;
2012 
2013 		rc = phy_read_mmd(phydev, MDIO_MMD_VEND1,
2014 				  LAN887X_SQI_MSE_100);
2015 		if (rc < 0)
2016 			return rc;
2017 
2018 		rawtable[i] = (u16)rc;
2019 	}
2020 
2021 	/* Link check after raw readings */
2022 	rc = genphy_c45_read_link(phydev);
2023 	if (rc < 0)
2024 		return rc;
2025 
2026 	if (!phydev->link)
2027 		return -ENETDOWN;
2028 
2029 	/* Sort SQI raw readings in ascending order */
2030 	sort(rawtable, SQI_SAMPLES, sizeof(u16), sqi_compare, NULL);
2031 
2032 	/* Keep inliers and discard outliers */
2033 	for (i = SQI_INLIERS_START; i < SQI_INLIERS_END; i++)
2034 		sqiavg += rawtable[i];
2035 
2036 	/* Handle invalid samples */
2037 	if (sqiavg != 0) {
2038 		/* Get SQI average */
2039 		sqiavg /= SQI_INLIERS_NUM;
2040 
2041 		if (sqiavg < 75)
2042 			sqinum = 7;
2043 		else if (sqiavg < 94)
2044 			sqinum = 6;
2045 		else if (sqiavg < 119)
2046 			sqinum = 5;
2047 		else if (sqiavg < 150)
2048 			sqinum = 4;
2049 		else if (sqiavg < 189)
2050 			sqinum = 3;
2051 		else if (sqiavg < 237)
2052 			sqinum = 2;
2053 		else if (sqiavg < 299)
2054 			sqinum = 1;
2055 		else
2056 			sqinum = 0;
2057 	}
2058 
2059 	return sqinum;
2060 }
2061 
2062 static int lan887x_get_sqi(struct phy_device *phydev)
2063 {
2064 	int rc, val;
2065 
2066 	if (phydev->speed != SPEED_1000 &&
2067 	    phydev->speed != SPEED_100)
2068 		return -ENETDOWN;
2069 
2070 	if (phydev->speed == SPEED_100)
2071 		return lan887x_get_sqi_100M(phydev);
2072 
2073 	/* Writing DCQ_COEFF_EN to trigger a SQI read */
2074 	rc = phy_set_bits_mmd(phydev, MDIO_MMD_VEND1,
2075 			      LAN887X_COEFF_MOD_CONFIG,
2076 			      LAN887X_COEFF_MOD_CONFIG_DCQ_COEFF_EN);
2077 	if (rc < 0)
2078 		return rc;
2079 
2080 	/* Wait for DCQ done */
2081 	rc = phy_read_mmd_poll_timeout(phydev, MDIO_MMD_VEND1,
2082 				       LAN887X_COEFF_MOD_CONFIG, val, ((val &
2083 				       LAN887X_COEFF_MOD_CONFIG_DCQ_COEFF_EN) !=
2084 				       LAN887X_COEFF_MOD_CONFIG_DCQ_COEFF_EN),
2085 				       10, 200, true);
2086 	if (rc < 0)
2087 		return rc;
2088 
2089 	rc = phy_read_mmd(phydev, MDIO_MMD_VEND1, LAN887X_DCQ_SQI_STATUS);
2090 	if (rc < 0)
2091 		return rc;
2092 
2093 	return FIELD_GET(T1_DCQ_SQI_MSK, rc);
2094 }
2095 
2096 static struct phy_driver microchip_t1_phy_driver[] = {
2097 	{
2098 		PHY_ID_MATCH_MODEL(PHY_ID_LAN87XX),
2099 		.name           = "Microchip LAN87xx T1",
2100 		.flags          = PHY_POLL_CABLE_TEST,
2101 		.features       = PHY_BASIC_T1_FEATURES,
2102 		.config_init	= lan87xx_config_init,
2103 		.config_intr    = lan87xx_phy_config_intr,
2104 		.handle_interrupt = lan87xx_handle_interrupt,
2105 		.suspend        = genphy_suspend,
2106 		.resume         = genphy_resume,
2107 		.config_aneg    = lan87xx_config_aneg,
2108 		.read_status	= lan87xx_read_status,
2109 		.get_sqi	= lan87xx_get_sqi,
2110 		.get_sqi_max	= lan87xx_get_sqi_max,
2111 		.cable_test_start = lan87xx_cable_test_start,
2112 		.cable_test_get_status = lan87xx_cable_test_get_status,
2113 	},
2114 	{
2115 		PHY_ID_MATCH_MODEL(PHY_ID_LAN937X),
2116 		.name		= "Microchip LAN937x T1",
2117 		.flags          = PHY_POLL_CABLE_TEST,
2118 		.features	= PHY_BASIC_T1_FEATURES,
2119 		.config_init	= lan87xx_config_init,
2120 		.config_intr    = lan87xx_phy_config_intr,
2121 		.handle_interrupt = lan87xx_handle_interrupt,
2122 		.suspend	= genphy_suspend,
2123 		.resume		= genphy_resume,
2124 		.config_aneg    = lan87xx_config_aneg,
2125 		.read_status	= lan87xx_read_status,
2126 		.get_sqi	= lan87xx_get_sqi,
2127 		.get_sqi_max	= lan87xx_get_sqi_max,
2128 		.cable_test_start = lan87xx_cable_test_start,
2129 		.cable_test_get_status = lan87xx_cable_test_get_status,
2130 	},
2131 	{
2132 		PHY_ID_MATCH_MODEL(PHY_ID_LAN887X),
2133 		.name		= "Microchip LAN887x T1 PHY",
2134 		.flags          = PHY_POLL_CABLE_TEST,
2135 		.probe		= lan887x_probe,
2136 		.get_features	= lan887x_get_features,
2137 		.config_init    = lan887x_phy_init,
2138 		.config_aneg    = lan887x_config_aneg,
2139 		.get_stats      = lan887x_get_stats,
2140 		.get_sset_count = lan887x_get_sset_count,
2141 		.get_strings    = lan887x_get_strings,
2142 		.suspend	= genphy_suspend,
2143 		.resume		= genphy_resume,
2144 		.read_status	= genphy_c45_read_status,
2145 		.cable_test_start = lan887x_cable_test_start,
2146 		.cable_test_get_status = lan887x_cable_test_get_status,
2147 		.config_intr    = lan887x_config_intr,
2148 		.handle_interrupt = lan887x_handle_interrupt,
2149 		.get_sqi	= lan887x_get_sqi,
2150 		.get_sqi_max	= lan87xx_get_sqi_max,
2151 		.set_loopback	= genphy_c45_loopback,
2152 	}
2153 };
2154 
2155 module_phy_driver(microchip_t1_phy_driver);
2156 
2157 static const struct mdio_device_id __maybe_unused microchip_t1_tbl[] = {
2158 	{ PHY_ID_MATCH_MODEL(PHY_ID_LAN87XX) },
2159 	{ PHY_ID_MATCH_MODEL(PHY_ID_LAN937X) },
2160 	{ PHY_ID_MATCH_MODEL(PHY_ID_LAN887X) },
2161 	{ }
2162 };
2163 
2164 MODULE_DEVICE_TABLE(mdio, microchip_t1_tbl);
2165 
2166 MODULE_AUTHOR(DRIVER_AUTHOR);
2167 MODULE_DESCRIPTION(DRIVER_DESC);
2168 MODULE_LICENSE("GPL");
2169