xref: /linux/drivers/net/phy/micrel.c (revision 0364ca33097da247ef6539c765405657324f243e)
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * drivers/net/phy/micrel.c
4  *
5  * Driver for Micrel PHYs
6  *
7  * Author: David J. Choi
8  *
9  * Copyright (c) 2010-2013 Micrel, Inc.
10  * Copyright (c) 2014 Johan Hovold <johan@kernel.org>
11  *
12  * Support : Micrel Phys:
13  *		Giga phys: ksz9021, ksz9031, ksz9131, lan8841, lan8814
14  *		100/10 Phys : ksz8001, ksz8721, ksz8737, ksz8041
15  *			   ksz8021, ksz8031, ksz8051,
16  *			   ksz8081, ksz8091,
17  *			   ksz8061,
18  *		Switch : ksz8873, ksz886x
19  *			 ksz9477, lan8804
20  */
21 
22 #include <linux/bitfield.h>
23 #include <linux/ethtool_netlink.h>
24 #include <linux/kernel.h>
25 #include <linux/module.h>
26 #include <linux/phy.h>
27 #include <linux/micrel_phy.h>
28 #include <linux/of.h>
29 #include <linux/clk.h>
30 #include <linux/delay.h>
31 #include <linux/ptp_clock_kernel.h>
32 #include <linux/ptp_clock.h>
33 #include <linux/ptp_classify.h>
34 #include <linux/net_tstamp.h>
35 #include <linux/gpio/consumer.h>
36 
37 #include "phylib.h"
38 
39 /* Operation Mode Strap Override */
40 #define MII_KSZPHY_OMSO				0x16
41 #define KSZPHY_OMSO_FACTORY_TEST		BIT(15)
42 #define KSZPHY_OMSO_B_CAST_OFF			BIT(9)
43 #define KSZPHY_OMSO_NAND_TREE_ON		BIT(5)
44 #define KSZPHY_OMSO_RMII_OVERRIDE		BIT(1)
45 #define KSZPHY_OMSO_MII_OVERRIDE		BIT(0)
46 
47 /* general Interrupt control/status reg in vendor specific block. */
48 #define MII_KSZPHY_INTCS			0x1B
49 #define KSZPHY_INTCS_JABBER			BIT(15)
50 #define KSZPHY_INTCS_RECEIVE_ERR		BIT(14)
51 #define KSZPHY_INTCS_PAGE_RECEIVE		BIT(13)
52 #define KSZPHY_INTCS_PARELLEL			BIT(12)
53 #define KSZPHY_INTCS_LINK_PARTNER_ACK		BIT(11)
54 #define KSZPHY_INTCS_LINK_DOWN			BIT(10)
55 #define KSZPHY_INTCS_REMOTE_FAULT		BIT(9)
56 #define KSZPHY_INTCS_LINK_UP			BIT(8)
57 #define KSZPHY_INTCS_ALL			(KSZPHY_INTCS_LINK_UP |\
58 						KSZPHY_INTCS_LINK_DOWN)
59 #define KSZPHY_INTCS_LINK_DOWN_STATUS		BIT(2)
60 #define KSZPHY_INTCS_LINK_UP_STATUS		BIT(0)
61 #define KSZPHY_INTCS_STATUS			(KSZPHY_INTCS_LINK_DOWN_STATUS |\
62 						 KSZPHY_INTCS_LINK_UP_STATUS)
63 
64 /* LinkMD Control/Status */
65 #define KSZ8081_LMD				0x1d
66 #define KSZ8081_LMD_ENABLE_TEST			BIT(15)
67 #define KSZ8081_LMD_STAT_NORMAL			0
68 #define KSZ8081_LMD_STAT_OPEN			1
69 #define KSZ8081_LMD_STAT_SHORT			2
70 #define KSZ8081_LMD_STAT_FAIL			3
71 #define KSZ8081_LMD_STAT_MASK			GENMASK(14, 13)
72 /* Short cable (<10 meter) has been detected by LinkMD */
73 #define KSZ8081_LMD_SHORT_INDICATOR		BIT(12)
74 #define KSZ8081_LMD_DELTA_TIME_MASK		GENMASK(8, 0)
75 
76 #define KSZ9x31_LMD				0x12
77 #define KSZ9x31_LMD_VCT_EN			BIT(15)
78 #define KSZ9x31_LMD_VCT_DIS_TX			BIT(14)
79 #define KSZ9x31_LMD_VCT_PAIR(n)			(((n) & 0x3) << 12)
80 #define KSZ9x31_LMD_VCT_SEL_RESULT		0
81 #define KSZ9x31_LMD_VCT_SEL_THRES_HI		BIT(10)
82 #define KSZ9x31_LMD_VCT_SEL_THRES_LO		BIT(11)
83 #define KSZ9x31_LMD_VCT_SEL_MASK		GENMASK(11, 10)
84 #define KSZ9x31_LMD_VCT_ST_NORMAL		0
85 #define KSZ9x31_LMD_VCT_ST_OPEN			1
86 #define KSZ9x31_LMD_VCT_ST_SHORT		2
87 #define KSZ9x31_LMD_VCT_ST_FAIL			3
88 #define KSZ9x31_LMD_VCT_ST_MASK			GENMASK(9, 8)
89 #define KSZ9x31_LMD_VCT_DATA_REFLECTED_INVALID	BIT(7)
90 #define KSZ9x31_LMD_VCT_DATA_SIG_WAIT_TOO_LONG	BIT(6)
91 #define KSZ9x31_LMD_VCT_DATA_MASK100		BIT(5)
92 #define KSZ9x31_LMD_VCT_DATA_NLP_FLP		BIT(4)
93 #define KSZ9x31_LMD_VCT_DATA_LO_PULSE_MASK	GENMASK(3, 2)
94 #define KSZ9x31_LMD_VCT_DATA_HI_PULSE_MASK	GENMASK(1, 0)
95 #define KSZ9x31_LMD_VCT_DATA_MASK		GENMASK(7, 0)
96 
97 #define KSZPHY_WIRE_PAIR_MASK			0x3
98 
99 #define LAN8814_CABLE_DIAG			0x12
100 #define LAN8814_CABLE_DIAG_STAT_MASK		GENMASK(9, 8)
101 #define LAN8814_CABLE_DIAG_VCT_DATA_MASK	GENMASK(7, 0)
102 #define LAN8814_PAIR_BIT_SHIFT			12
103 
104 #define LAN8814_WIRE_PAIR_MASK			0xF
105 
106 /* Lan8814 general Interrupt control/status reg in GPHY specific block. */
107 #define LAN8814_INTC				0x18
108 #define LAN8814_INTS				0x1B
109 
110 #define LAN8814_INT_FLF				BIT(15)
111 #define LAN8814_INT_LINK_DOWN			BIT(2)
112 #define LAN8814_INT_LINK_UP			BIT(0)
113 #define LAN8814_INT_LINK			(LAN8814_INT_LINK_UP |\
114 						 LAN8814_INT_LINK_DOWN)
115 
116 #define LAN8814_INTR_CTRL_REG			0x34
117 #define LAN8814_INTR_CTRL_REG_POLARITY		BIT(1)
118 #define LAN8814_INTR_CTRL_REG_INTR_ENABLE	BIT(0)
119 
120 #define LAN8814_EEE_STATE			0x38
121 #define LAN8814_EEE_STATE_MASK2P5P		BIT(10)
122 
123 #define LAN8814_PD_CONTROLS			0x9d
124 #define LAN8814_PD_CONTROLS_PD_MEAS_TIME_MASK	GENMASK(3, 0)
125 #define LAN8814_PD_CONTROLS_PD_MEAS_TIME_VAL	0xb
126 
127 /* Represents 1ppm adjustment in 2^32 format with
128  * each nsec contains 4 clock cycles.
129  * The value is calculated as following: (1/1000000)/((2^-32)/4)
130  */
131 #define LAN8814_1PPM_FORMAT			17179
132 
133 /* Represents 1ppm adjustment in 2^32 format with
134  * each nsec contains 8 clock cycles.
135  * The value is calculated as following: (1/1000000)/((2^-32)/8)
136  */
137 #define LAN8841_1PPM_FORMAT			34360
138 
139 #define PTP_RX_VERSION				0x0248
140 #define PTP_TX_VERSION				0x0288
141 #define PTP_MAX_VERSION(x)			(((x) & GENMASK(7, 0)) << 8)
142 #define PTP_MIN_VERSION(x)			((x) & GENMASK(7, 0))
143 
144 #define PTP_RX_MOD				0x024F
145 #define PTP_RX_MOD_BAD_UDPV4_CHKSUM_FORCE_FCS_DIS_ BIT(3)
146 #define PTP_RX_TIMESTAMP_EN			0x024D
147 #define PTP_TX_TIMESTAMP_EN			0x028D
148 
149 #define PTP_TIMESTAMP_EN_SYNC_			BIT(0)
150 #define PTP_TIMESTAMP_EN_DREQ_			BIT(1)
151 #define PTP_TIMESTAMP_EN_PDREQ_			BIT(2)
152 #define PTP_TIMESTAMP_EN_PDRES_			BIT(3)
153 
154 #define PTP_TX_PARSE_L2_ADDR_EN			0x0284
155 #define PTP_RX_PARSE_L2_ADDR_EN			0x0244
156 
157 #define PTP_TX_PARSE_IP_ADDR_EN			0x0285
158 #define PTP_RX_PARSE_IP_ADDR_EN			0x0245
159 #define LTC_HARD_RESET				0x023F
160 #define LTC_HARD_RESET_				BIT(0)
161 
162 #define TSU_HARD_RESET				0x02C1
163 #define TSU_HARD_RESET_				BIT(0)
164 
165 #define PTP_CMD_CTL				0x0200
166 #define PTP_CMD_CTL_PTP_DISABLE_		BIT(0)
167 #define PTP_CMD_CTL_PTP_ENABLE_			BIT(1)
168 #define PTP_CMD_CTL_PTP_CLOCK_READ_		BIT(3)
169 #define PTP_CMD_CTL_PTP_CLOCK_LOAD_		BIT(4)
170 #define PTP_CMD_CTL_PTP_LTC_STEP_SEC_		BIT(5)
171 #define PTP_CMD_CTL_PTP_LTC_STEP_NSEC_		BIT(6)
172 
173 #define PTP_COMMON_INT_ENA			0x0204
174 #define PTP_COMMON_INT_ENA_GPIO_CAP_EN		BIT(2)
175 
176 #define PTP_CLOCK_SET_SEC_HI			0x0205
177 #define PTP_CLOCK_SET_SEC_MID			0x0206
178 #define PTP_CLOCK_SET_SEC_LO			0x0207
179 #define PTP_CLOCK_SET_NS_HI			0x0208
180 #define PTP_CLOCK_SET_NS_LO			0x0209
181 
182 #define PTP_CLOCK_READ_SEC_HI			0x0229
183 #define PTP_CLOCK_READ_SEC_MID			0x022A
184 #define PTP_CLOCK_READ_SEC_LO			0x022B
185 #define PTP_CLOCK_READ_NS_HI			0x022C
186 #define PTP_CLOCK_READ_NS_LO			0x022D
187 
188 #define PTP_GPIO_SEL				0x0230
189 #define PTP_GPIO_SEL_GPIO_SEL(pin)		((pin) << 8)
190 #define PTP_GPIO_CAP_MAP_LO			0x0232
191 
192 #define PTP_GPIO_CAP_EN				0x0233
193 #define PTP_GPIO_CAP_EN_GPIO_RE_CAPTURE_ENABLE(gpio)	BIT(gpio)
194 #define PTP_GPIO_CAP_EN_GPIO_FE_CAPTURE_ENABLE(gpio)	(BIT(gpio) << 8)
195 
196 #define PTP_GPIO_RE_LTC_SEC_HI_CAP		0x0235
197 #define PTP_GPIO_RE_LTC_SEC_LO_CAP		0x0236
198 #define PTP_GPIO_RE_LTC_NS_HI_CAP		0x0237
199 #define PTP_GPIO_RE_LTC_NS_LO_CAP		0x0238
200 #define PTP_GPIO_FE_LTC_SEC_HI_CAP		0x0239
201 #define PTP_GPIO_FE_LTC_SEC_LO_CAP		0x023A
202 #define PTP_GPIO_FE_LTC_NS_HI_CAP		0x023B
203 #define PTP_GPIO_FE_LTC_NS_LO_CAP		0x023C
204 
205 #define PTP_GPIO_CAP_STS			0x023D
206 #define PTP_GPIO_CAP_STS_PTP_GPIO_RE_STS(gpio)	BIT(gpio)
207 #define PTP_GPIO_CAP_STS_PTP_GPIO_FE_STS(gpio)	(BIT(gpio) << 8)
208 
209 #define PTP_OPERATING_MODE			0x0241
210 #define PTP_OPERATING_MODE_STANDALONE_		BIT(0)
211 
212 #define PTP_TX_MOD				0x028F
213 #define PTP_TX_MOD_TX_PTP_SYNC_TS_INSERT_	BIT(12)
214 #define PTP_TX_MOD_BAD_UDPV4_CHKSUM_FORCE_FCS_DIS_ BIT(3)
215 
216 #define PTP_RX_PARSE_CONFIG			0x0242
217 #define PTP_RX_PARSE_CONFIG_LAYER2_EN_		BIT(0)
218 #define PTP_RX_PARSE_CONFIG_IPV4_EN_		BIT(1)
219 #define PTP_RX_PARSE_CONFIG_IPV6_EN_		BIT(2)
220 
221 #define PTP_TX_PARSE_CONFIG			0x0282
222 #define PTP_TX_PARSE_CONFIG_LAYER2_EN_		BIT(0)
223 #define PTP_TX_PARSE_CONFIG_IPV4_EN_		BIT(1)
224 #define PTP_TX_PARSE_CONFIG_IPV6_EN_		BIT(2)
225 
226 #define PTP_CLOCK_RATE_ADJ_HI			0x020C
227 #define PTP_CLOCK_RATE_ADJ_LO			0x020D
228 #define PTP_CLOCK_RATE_ADJ_DIR_			BIT(15)
229 
230 #define PTP_LTC_STEP_ADJ_HI			0x0212
231 #define PTP_LTC_STEP_ADJ_LO			0x0213
232 #define PTP_LTC_STEP_ADJ_DIR_			BIT(15)
233 
234 #define LAN8814_INTR_STS_REG			0x0033
235 #define LAN8814_INTR_STS_REG_1588_TSU0_		BIT(0)
236 #define LAN8814_INTR_STS_REG_1588_TSU1_		BIT(1)
237 #define LAN8814_INTR_STS_REG_1588_TSU2_		BIT(2)
238 #define LAN8814_INTR_STS_REG_1588_TSU3_		BIT(3)
239 
240 #define PTP_CAP_INFO				0x022A
241 #define PTP_CAP_INFO_TX_TS_CNT_GET_(reg_val)	(((reg_val) & 0x0f00) >> 8)
242 #define PTP_CAP_INFO_RX_TS_CNT_GET_(reg_val)	((reg_val) & 0x000f)
243 
244 #define PTP_TX_EGRESS_SEC_HI			0x0296
245 #define PTP_TX_EGRESS_SEC_LO			0x0297
246 #define PTP_TX_EGRESS_NS_HI			0x0294
247 #define PTP_TX_EGRESS_NS_LO			0x0295
248 #define PTP_TX_MSG_HEADER2			0x0299
249 
250 #define PTP_RX_INGRESS_SEC_HI			0x0256
251 #define PTP_RX_INGRESS_SEC_LO			0x0257
252 #define PTP_RX_INGRESS_NS_HI			0x0254
253 #define PTP_RX_INGRESS_NS_LO			0x0255
254 #define PTP_RX_MSG_HEADER2			0x0259
255 
256 #define PTP_TSU_INT_EN				0x0200
257 #define PTP_TSU_INT_EN_PTP_TX_TS_OVRFL_EN_	BIT(3)
258 #define PTP_TSU_INT_EN_PTP_TX_TS_EN_		BIT(2)
259 #define PTP_TSU_INT_EN_PTP_RX_TS_OVRFL_EN_	BIT(1)
260 #define PTP_TSU_INT_EN_PTP_RX_TS_EN_		BIT(0)
261 
262 #define PTP_TSU_INT_STS				0x0201
263 #define PTP_TSU_INT_STS_PTP_TX_TS_OVRFL_INT_	BIT(3)
264 #define PTP_TSU_INT_STS_PTP_TX_TS_EN_		BIT(2)
265 #define PTP_TSU_INT_STS_PTP_RX_TS_OVRFL_INT_	BIT(1)
266 #define PTP_TSU_INT_STS_PTP_RX_TS_EN_		BIT(0)
267 
268 #define LAN8814_LED_CTRL_1			0x0
269 #define LAN8814_LED_CTRL_1_KSZ9031_LED_MODE_	BIT(6)
270 #define LAN8814_LED_CTRL_2			0x1
271 #define LAN8814_LED_CTRL_2_LED1_COM_DIS		BIT(8)
272 
273 /* PHY Control 1 */
274 #define MII_KSZPHY_CTRL_1			0x1e
275 #define KSZ8081_CTRL1_MDIX_STAT			BIT(4)
276 
277 /* PHY Control 2 / PHY Control (if no PHY Control 1) */
278 #define MII_KSZPHY_CTRL_2			0x1f
279 #define MII_KSZPHY_CTRL				MII_KSZPHY_CTRL_2
280 /* bitmap of PHY register to set interrupt mode */
281 #define KSZ8081_CTRL2_HP_MDIX			BIT(15)
282 #define KSZ8081_CTRL2_MDI_MDI_X_SELECT		BIT(14)
283 #define KSZ8081_CTRL2_DISABLE_AUTO_MDIX		BIT(13)
284 #define KSZ8081_CTRL2_FORCE_LINK		BIT(11)
285 #define KSZ8081_CTRL2_POWER_SAVING		BIT(10)
286 #define KSZPHY_CTRL_INT_ACTIVE_HIGH		BIT(9)
287 #define KSZPHY_RMII_REF_CLK_SEL			BIT(7)
288 
289 /* Write/read to/from extended registers */
290 #define MII_KSZPHY_EXTREG			0x0b
291 #define KSZPHY_EXTREG_WRITE			0x8000
292 
293 #define MII_KSZPHY_EXTREG_WRITE			0x0c
294 #define MII_KSZPHY_EXTREG_READ			0x0d
295 
296 /* Extended registers */
297 #define MII_KSZPHY_CLK_CONTROL_PAD_SKEW		0x104
298 #define MII_KSZPHY_RX_DATA_PAD_SKEW		0x105
299 #define MII_KSZPHY_TX_DATA_PAD_SKEW		0x106
300 
301 #define PS_TO_REG				200
302 #define FIFO_SIZE				8
303 
304 #define LAN8814_PTP_GPIO_NUM			24
305 #define LAN8814_PTP_PEROUT_NUM			2
306 #define LAN8814_PTP_EXTTS_NUM			3
307 
308 #define LAN8814_BUFFER_TIME			2
309 
310 #define LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_200MS	13
311 #define LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_100MS	12
312 #define LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_50MS	11
313 #define LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_10MS	10
314 #define LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_5MS	9
315 #define LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_1MS	8
316 #define LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_500US	7
317 #define LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_100US	6
318 #define LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_50US	5
319 #define LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_10US	4
320 #define LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_5US	3
321 #define LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_1US	2
322 #define LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_500NS	1
323 #define LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_100NS	0
324 
325 #define LAN8814_GPIO_EN1			0x20
326 #define LAN8814_GPIO_EN2			0x21
327 #define LAN8814_GPIO_DIR1			0x22
328 #define LAN8814_GPIO_DIR2			0x23
329 #define LAN8814_GPIO_BUF1			0x24
330 #define LAN8814_GPIO_BUF2			0x25
331 
332 #define LAN8814_GPIO_EN_ADDR(pin) \
333 	((pin) > 15 ? LAN8814_GPIO_EN1 : LAN8814_GPIO_EN2)
334 #define LAN8814_GPIO_EN_BIT(pin)		BIT(pin)
335 #define LAN8814_GPIO_DIR_ADDR(pin) \
336 	((pin) > 15 ? LAN8814_GPIO_DIR1 : LAN8814_GPIO_DIR2)
337 #define LAN8814_GPIO_DIR_BIT(pin)		BIT(pin)
338 #define LAN8814_GPIO_BUF_ADDR(pin) \
339 	((pin) > 15 ? LAN8814_GPIO_BUF1 : LAN8814_GPIO_BUF2)
340 #define LAN8814_GPIO_BUF_BIT(pin)		BIT(pin)
341 
342 #define LAN8814_EVENT_A				0
343 #define LAN8814_EVENT_B				1
344 
345 #define LAN8814_PTP_GENERAL_CONFIG		0x0201
346 #define LAN8814_PTP_GENERAL_CONFIG_LTC_EVENT_MASK(event) \
347 	((event) ? GENMASK(11, 8) : GENMASK(7, 4))
348 #define LAN8814_PTP_GENERAL_CONFIG_LTC_EVENT_SET(event, value) \
349 	(((value) & GENMASK(3, 0)) << (4 + ((event) << 2)))
350 #define LAN8814_PTP_GENERAL_CONFIG_RELOAD_ADD_X(event) \
351 	((event) ? BIT(2) : BIT(0))
352 #define LAN8814_PTP_GENERAL_CONFIG_POLARITY_X(event) \
353 	((event) ? BIT(3) : BIT(1))
354 
355 #define LAN8814_PTP_CLOCK_TARGET_SEC_HI(event)	((event) ? 0x21F : 0x215)
356 #define LAN8814_PTP_CLOCK_TARGET_SEC_LO(event)	((event) ? 0x220 : 0x216)
357 #define LAN8814_PTP_CLOCK_TARGET_NS_HI(event)	((event) ? 0x221 : 0x217)
358 #define LAN8814_PTP_CLOCK_TARGET_NS_LO(event)	((event) ? 0x222 : 0x218)
359 
360 #define LAN8814_PTP_CLOCK_TARGET_RELOAD_SEC_HI(event)	((event) ? 0x223 : 0x219)
361 #define LAN8814_PTP_CLOCK_TARGET_RELOAD_SEC_LO(event)	((event) ? 0x224 : 0x21A)
362 #define LAN8814_PTP_CLOCK_TARGET_RELOAD_NS_HI(event)	((event) ? 0x225 : 0x21B)
363 #define LAN8814_PTP_CLOCK_TARGET_RELOAD_NS_LO(event)	((event) ? 0x226 : 0x21C)
364 
365 /* Delay used to get the second part from the LTC */
366 #define LAN8841_GET_SEC_LTC_DELAY		(500 * NSEC_PER_MSEC)
367 
368 #define LAN8842_REV_8832			0x8832
369 
370 struct kszphy_hw_stat {
371 	const char *string;
372 	u8 reg;
373 	u8 bits;
374 };
375 
376 static struct kszphy_hw_stat kszphy_hw_stats[] = {
377 	{ "phy_receive_errors", 21, 16},
378 	{ "phy_idle_errors", 10, 8 },
379 };
380 
381 struct kszphy_type {
382 	u32 led_mode_reg;
383 	u16 interrupt_level_mask;
384 	u16 cable_diag_reg;
385 	unsigned long pair_mask;
386 	u16 disable_dll_tx_bit;
387 	u16 disable_dll_rx_bit;
388 	u16 disable_dll_mask;
389 	bool has_broadcast_disable;
390 	bool has_nand_tree_disable;
391 	bool has_rmii_ref_clk_sel;
392 };
393 
394 /* Shared structure between the PHYs of the same package. */
395 struct lan8814_shared_priv {
396 	struct phy_device *phydev;
397 	struct ptp_clock *ptp_clock;
398 	struct ptp_clock_info ptp_clock_info;
399 	struct ptp_pin_desc *pin_config;
400 
401 	/* Lock for ptp_clock */
402 	struct mutex shared_lock;
403 };
404 
405 struct lan8814_ptp_rx_ts {
406 	struct list_head list;
407 	u32 seconds;
408 	u32 nsec;
409 	u16 seq_id;
410 };
411 
412 struct kszphy_ptp_priv {
413 	struct mii_timestamper mii_ts;
414 	struct phy_device *phydev;
415 
416 	struct sk_buff_head tx_queue;
417 	struct sk_buff_head rx_queue;
418 
419 	struct list_head rx_ts_list;
420 	/* Lock for Rx ts fifo */
421 	spinlock_t rx_ts_lock;
422 
423 	int hwts_tx_type;
424 	enum hwtstamp_rx_filters rx_filter;
425 	int layer;
426 	int version;
427 
428 	struct ptp_clock *ptp_clock;
429 	struct ptp_clock_info ptp_clock_info;
430 	/* Lock for ptp_clock */
431 	struct mutex ptp_lock;
432 	struct ptp_pin_desc *pin_config;
433 
434 	s64 seconds;
435 	/* Lock for accessing seconds */
436 	spinlock_t seconds_lock;
437 };
438 
439 struct kszphy_phy_stats {
440 	u64 rx_err_pkt_cnt;
441 };
442 
443 struct kszphy_priv {
444 	struct kszphy_ptp_priv ptp_priv;
445 	const struct kszphy_type *type;
446 	struct clk *clk;
447 	int led_mode;
448 	u16 vct_ctrl1000;
449 	bool rmii_ref_clk_sel;
450 	bool rmii_ref_clk_sel_val;
451 	bool clk_enable;
452 	u64 stats[ARRAY_SIZE(kszphy_hw_stats)];
453 	struct kszphy_phy_stats phy_stats;
454 };
455 
456 struct lan8842_phy_stats {
457 	u64 rx_packets;
458 	u64 rx_errors;
459 	u64 tx_packets;
460 	u64 tx_errors;
461 };
462 
463 struct lan8842_priv {
464 	struct lan8842_phy_stats phy_stats;
465 	struct kszphy_ptp_priv ptp_priv;
466 	u16 rev;
467 };
468 
469 static const struct kszphy_type lan8814_type = {
470 	.led_mode_reg		= ~LAN8814_LED_CTRL_1,
471 	.cable_diag_reg		= LAN8814_CABLE_DIAG,
472 	.pair_mask		= LAN8814_WIRE_PAIR_MASK,
473 };
474 
475 static const struct kszphy_type ksz886x_type = {
476 	.cable_diag_reg		= KSZ8081_LMD,
477 	.pair_mask		= KSZPHY_WIRE_PAIR_MASK,
478 };
479 
480 static const struct kszphy_type ksz8021_type = {
481 	.led_mode_reg		= MII_KSZPHY_CTRL_2,
482 	.has_broadcast_disable	= true,
483 	.has_nand_tree_disable	= true,
484 	.has_rmii_ref_clk_sel	= true,
485 };
486 
487 static const struct kszphy_type ksz8041_type = {
488 	.led_mode_reg		= MII_KSZPHY_CTRL_1,
489 };
490 
491 static const struct kszphy_type ksz8051_type = {
492 	.led_mode_reg		= MII_KSZPHY_CTRL_2,
493 	.has_nand_tree_disable	= true,
494 };
495 
496 static const struct kszphy_type ksz8081_type = {
497 	.led_mode_reg		= MII_KSZPHY_CTRL_2,
498 	.cable_diag_reg		= KSZ8081_LMD,
499 	.pair_mask		= KSZPHY_WIRE_PAIR_MASK,
500 	.has_broadcast_disable	= true,
501 	.has_nand_tree_disable	= true,
502 	.has_rmii_ref_clk_sel	= true,
503 };
504 
505 static const struct kszphy_type ks8737_type = {
506 	.interrupt_level_mask	= BIT(14),
507 };
508 
509 static const struct kszphy_type ksz9021_type = {
510 	.interrupt_level_mask	= BIT(14),
511 };
512 
513 static const struct kszphy_type ksz9131_type = {
514 	.interrupt_level_mask	= BIT(14),
515 	.disable_dll_tx_bit	= BIT(12),
516 	.disable_dll_rx_bit	= BIT(12),
517 	.disable_dll_mask	= BIT_MASK(12),
518 };
519 
520 static const struct kszphy_type lan8841_type = {
521 	.disable_dll_tx_bit	= BIT(14),
522 	.disable_dll_rx_bit	= BIT(14),
523 	.disable_dll_mask	= BIT_MASK(14),
524 	.cable_diag_reg		= LAN8814_CABLE_DIAG,
525 	.pair_mask		= LAN8814_WIRE_PAIR_MASK,
526 };
527 
528 static int kszphy_extended_write(struct phy_device *phydev,
529 				u32 regnum, u16 val)
530 {
531 	phy_write(phydev, MII_KSZPHY_EXTREG, KSZPHY_EXTREG_WRITE | regnum);
532 	return phy_write(phydev, MII_KSZPHY_EXTREG_WRITE, val);
533 }
534 
535 static int kszphy_extended_read(struct phy_device *phydev,
536 				u32 regnum)
537 {
538 	phy_write(phydev, MII_KSZPHY_EXTREG, regnum);
539 	return phy_read(phydev, MII_KSZPHY_EXTREG_READ);
540 }
541 
542 static int kszphy_ack_interrupt(struct phy_device *phydev)
543 {
544 	/* bit[7..0] int status, which is a read and clear register. */
545 	int rc;
546 
547 	rc = phy_read(phydev, MII_KSZPHY_INTCS);
548 
549 	return (rc < 0) ? rc : 0;
550 }
551 
552 static int kszphy_config_intr(struct phy_device *phydev)
553 {
554 	const struct kszphy_type *type = phydev->drv->driver_data;
555 	int temp, err;
556 	u16 mask;
557 
558 	if (type && type->interrupt_level_mask)
559 		mask = type->interrupt_level_mask;
560 	else
561 		mask = KSZPHY_CTRL_INT_ACTIVE_HIGH;
562 
563 	/* set the interrupt pin active low */
564 	temp = phy_read(phydev, MII_KSZPHY_CTRL);
565 	if (temp < 0)
566 		return temp;
567 	temp &= ~mask;
568 	phy_write(phydev, MII_KSZPHY_CTRL, temp);
569 
570 	/* enable / disable interrupts */
571 	if (phydev->interrupts == PHY_INTERRUPT_ENABLED) {
572 		err = kszphy_ack_interrupt(phydev);
573 		if (err)
574 			return err;
575 
576 		err = phy_write(phydev, MII_KSZPHY_INTCS, KSZPHY_INTCS_ALL);
577 	} else {
578 		err = phy_write(phydev, MII_KSZPHY_INTCS, 0);
579 		if (err)
580 			return err;
581 
582 		err = kszphy_ack_interrupt(phydev);
583 	}
584 
585 	return err;
586 }
587 
588 static irqreturn_t kszphy_handle_interrupt(struct phy_device *phydev)
589 {
590 	int irq_status;
591 
592 	irq_status = phy_read(phydev, MII_KSZPHY_INTCS);
593 	if (irq_status < 0) {
594 		phy_error(phydev);
595 		return IRQ_NONE;
596 	}
597 
598 	if (!(irq_status & KSZPHY_INTCS_STATUS))
599 		return IRQ_NONE;
600 
601 	phy_trigger_machine(phydev);
602 
603 	return IRQ_HANDLED;
604 }
605 
606 static int kszphy_rmii_clk_sel(struct phy_device *phydev, bool val)
607 {
608 	int ctrl;
609 
610 	ctrl = phy_read(phydev, MII_KSZPHY_CTRL);
611 	if (ctrl < 0)
612 		return ctrl;
613 
614 	if (val)
615 		ctrl |= KSZPHY_RMII_REF_CLK_SEL;
616 	else
617 		ctrl &= ~KSZPHY_RMII_REF_CLK_SEL;
618 
619 	return phy_write(phydev, MII_KSZPHY_CTRL, ctrl);
620 }
621 
622 static int kszphy_setup_led(struct phy_device *phydev, u32 reg, int val)
623 {
624 	int rc, temp, shift;
625 
626 	switch (reg) {
627 	case MII_KSZPHY_CTRL_1:
628 		shift = 14;
629 		break;
630 	case MII_KSZPHY_CTRL_2:
631 		shift = 4;
632 		break;
633 	default:
634 		return -EINVAL;
635 	}
636 
637 	temp = phy_read(phydev, reg);
638 	if (temp < 0) {
639 		rc = temp;
640 		goto out;
641 	}
642 
643 	temp &= ~(3 << shift);
644 	temp |= val << shift;
645 	rc = phy_write(phydev, reg, temp);
646 out:
647 	if (rc < 0)
648 		phydev_err(phydev, "failed to set led mode\n");
649 
650 	return rc;
651 }
652 
653 /* Disable PHY address 0 as the broadcast address, so that it can be used as a
654  * unique (non-broadcast) address on a shared bus.
655  */
656 static int kszphy_broadcast_disable(struct phy_device *phydev)
657 {
658 	int ret;
659 
660 	ret = phy_read(phydev, MII_KSZPHY_OMSO);
661 	if (ret < 0)
662 		goto out;
663 
664 	ret = phy_write(phydev, MII_KSZPHY_OMSO, ret | KSZPHY_OMSO_B_CAST_OFF);
665 out:
666 	if (ret)
667 		phydev_err(phydev, "failed to disable broadcast address\n");
668 
669 	return ret;
670 }
671 
672 static int kszphy_nand_tree_disable(struct phy_device *phydev)
673 {
674 	int ret;
675 
676 	ret = phy_read(phydev, MII_KSZPHY_OMSO);
677 	if (ret < 0)
678 		goto out;
679 
680 	if (!(ret & KSZPHY_OMSO_NAND_TREE_ON))
681 		return 0;
682 
683 	ret = phy_write(phydev, MII_KSZPHY_OMSO,
684 			ret & ~KSZPHY_OMSO_NAND_TREE_ON);
685 out:
686 	if (ret)
687 		phydev_err(phydev, "failed to disable NAND tree mode\n");
688 
689 	return ret;
690 }
691 
692 /* Some config bits need to be set again on resume, handle them here. */
693 static int kszphy_config_reset(struct phy_device *phydev)
694 {
695 	struct kszphy_priv *priv = phydev->priv;
696 	int ret;
697 
698 	if (priv->rmii_ref_clk_sel) {
699 		ret = kszphy_rmii_clk_sel(phydev, priv->rmii_ref_clk_sel_val);
700 		if (ret) {
701 			phydev_err(phydev,
702 				   "failed to set rmii reference clock\n");
703 			return ret;
704 		}
705 	}
706 
707 	if (priv->type && priv->led_mode >= 0)
708 		kszphy_setup_led(phydev, priv->type->led_mode_reg, priv->led_mode);
709 
710 	return 0;
711 }
712 
713 static int kszphy_config_init(struct phy_device *phydev)
714 {
715 	struct kszphy_priv *priv = phydev->priv;
716 	const struct kszphy_type *type;
717 
718 	if (!priv)
719 		return 0;
720 
721 	type = priv->type;
722 
723 	if (type && type->has_broadcast_disable)
724 		kszphy_broadcast_disable(phydev);
725 
726 	if (type && type->has_nand_tree_disable)
727 		kszphy_nand_tree_disable(phydev);
728 
729 	return kszphy_config_reset(phydev);
730 }
731 
732 static int ksz8041_fiber_mode(struct phy_device *phydev)
733 {
734 	struct device_node *of_node = phydev->mdio.dev.of_node;
735 
736 	return of_property_read_bool(of_node, "micrel,fiber-mode");
737 }
738 
739 static int ksz8041_config_init(struct phy_device *phydev)
740 {
741 	__ETHTOOL_DECLARE_LINK_MODE_MASK(mask) = { 0, };
742 
743 	/* Limit supported and advertised modes in fiber mode */
744 	if (ksz8041_fiber_mode(phydev)) {
745 		phydev->dev_flags |= MICREL_PHY_FXEN;
746 		linkmode_set_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT, mask);
747 		linkmode_set_bit(ETHTOOL_LINK_MODE_100baseT_Half_BIT, mask);
748 
749 		linkmode_and(phydev->supported, phydev->supported, mask);
750 		linkmode_set_bit(ETHTOOL_LINK_MODE_FIBRE_BIT,
751 				 phydev->supported);
752 		linkmode_and(phydev->advertising, phydev->advertising, mask);
753 		linkmode_set_bit(ETHTOOL_LINK_MODE_FIBRE_BIT,
754 				 phydev->advertising);
755 		phydev->autoneg = AUTONEG_DISABLE;
756 	}
757 
758 	return kszphy_config_init(phydev);
759 }
760 
761 static int ksz8041_config_aneg(struct phy_device *phydev)
762 {
763 	/* Skip auto-negotiation in fiber mode */
764 	if (phydev->dev_flags & MICREL_PHY_FXEN) {
765 		phydev->speed = SPEED_100;
766 		return 0;
767 	}
768 
769 	return genphy_config_aneg(phydev);
770 }
771 
772 static int ksz8051_ksz8795_match_phy_device(struct phy_device *phydev,
773 					    const bool ksz_8051)
774 {
775 	int ret;
776 
777 	if (!phy_id_compare(phydev->phy_id, PHY_ID_KSZ8051, MICREL_PHY_ID_MASK))
778 		return 0;
779 
780 	ret = phy_read(phydev, MII_BMSR);
781 	if (ret < 0)
782 		return ret;
783 
784 	/* KSZ8051 PHY and KSZ8794/KSZ8795/KSZ8765 switch share the same
785 	 * exact PHY ID. However, they can be told apart by the extended
786 	 * capability registers presence. The KSZ8051 PHY has them while
787 	 * the switch does not.
788 	 */
789 	ret &= BMSR_ERCAP;
790 	if (ksz_8051)
791 		return ret;
792 	else
793 		return !ret;
794 }
795 
796 static int ksz8051_match_phy_device(struct phy_device *phydev,
797 				    const struct phy_driver *phydrv)
798 {
799 	return ksz8051_ksz8795_match_phy_device(phydev, true);
800 }
801 
802 static int ksz8081_config_init(struct phy_device *phydev)
803 {
804 	/* KSZPHY_OMSO_FACTORY_TEST is set at de-assertion of the reset line
805 	 * based on the RXER (KSZ8081RNA/RND) or TXC (KSZ8081MNX/RNB) pin. If a
806 	 * pull-down is missing, the factory test mode should be cleared by
807 	 * manually writing a 0.
808 	 */
809 	phy_clear_bits(phydev, MII_KSZPHY_OMSO, KSZPHY_OMSO_FACTORY_TEST);
810 
811 	return kszphy_config_init(phydev);
812 }
813 
814 static int ksz8081_config_mdix(struct phy_device *phydev, u8 ctrl)
815 {
816 	u16 val;
817 
818 	switch (ctrl) {
819 	case ETH_TP_MDI:
820 		val = KSZ8081_CTRL2_DISABLE_AUTO_MDIX;
821 		break;
822 	case ETH_TP_MDI_X:
823 		val = KSZ8081_CTRL2_DISABLE_AUTO_MDIX |
824 			KSZ8081_CTRL2_MDI_MDI_X_SELECT;
825 		break;
826 	case ETH_TP_MDI_AUTO:
827 		val = 0;
828 		break;
829 	default:
830 		return 0;
831 	}
832 
833 	return phy_modify(phydev, MII_KSZPHY_CTRL_2,
834 			  KSZ8081_CTRL2_HP_MDIX |
835 			  KSZ8081_CTRL2_MDI_MDI_X_SELECT |
836 			  KSZ8081_CTRL2_DISABLE_AUTO_MDIX,
837 			  KSZ8081_CTRL2_HP_MDIX | val);
838 }
839 
840 static int ksz8081_config_aneg(struct phy_device *phydev)
841 {
842 	int ret;
843 
844 	ret = genphy_config_aneg(phydev);
845 	if (ret)
846 		return ret;
847 
848 	/* The MDI-X configuration is automatically changed by the PHY after
849 	 * switching from autoneg off to on. So, take MDI-X configuration under
850 	 * own control and set it after autoneg configuration was done.
851 	 */
852 	return ksz8081_config_mdix(phydev, phydev->mdix_ctrl);
853 }
854 
855 static int ksz8081_mdix_update(struct phy_device *phydev)
856 {
857 	int ret;
858 
859 	ret = phy_read(phydev, MII_KSZPHY_CTRL_2);
860 	if (ret < 0)
861 		return ret;
862 
863 	if (ret & KSZ8081_CTRL2_DISABLE_AUTO_MDIX) {
864 		if (ret & KSZ8081_CTRL2_MDI_MDI_X_SELECT)
865 			phydev->mdix_ctrl = ETH_TP_MDI_X;
866 		else
867 			phydev->mdix_ctrl = ETH_TP_MDI;
868 	} else {
869 		phydev->mdix_ctrl = ETH_TP_MDI_AUTO;
870 	}
871 
872 	ret = phy_read(phydev, MII_KSZPHY_CTRL_1);
873 	if (ret < 0)
874 		return ret;
875 
876 	if (ret & KSZ8081_CTRL1_MDIX_STAT)
877 		phydev->mdix = ETH_TP_MDI;
878 	else
879 		phydev->mdix = ETH_TP_MDI_X;
880 
881 	return 0;
882 }
883 
884 static int ksz8081_read_status(struct phy_device *phydev)
885 {
886 	int ret;
887 
888 	ret = ksz8081_mdix_update(phydev);
889 	if (ret < 0)
890 		return ret;
891 
892 	return genphy_read_status(phydev);
893 }
894 
895 static int ksz8061_config_init(struct phy_device *phydev)
896 {
897 	int ret;
898 
899 	/* Chip can be powered down by the bootstrap code. */
900 	ret = phy_read(phydev, MII_BMCR);
901 	if (ret < 0)
902 		return ret;
903 	if (ret & BMCR_PDOWN) {
904 		ret = phy_write(phydev, MII_BMCR, ret & ~BMCR_PDOWN);
905 		if (ret < 0)
906 			return ret;
907 		usleep_range(1000, 2000);
908 	}
909 
910 	ret = phy_write_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_DEVID1, 0xB61A);
911 	if (ret)
912 		return ret;
913 
914 	return kszphy_config_init(phydev);
915 }
916 
917 static int ksz8795_match_phy_device(struct phy_device *phydev,
918 				    const struct phy_driver *phydrv)
919 {
920 	return ksz8051_ksz8795_match_phy_device(phydev, false);
921 }
922 
923 static int ksz9021_load_values_from_of(struct phy_device *phydev,
924 				       const struct device_node *of_node,
925 				       u16 reg,
926 				       const char *field1, const char *field2,
927 				       const char *field3, const char *field4)
928 {
929 	int val1 = -1;
930 	int val2 = -2;
931 	int val3 = -3;
932 	int val4 = -4;
933 	int newval;
934 	int matches = 0;
935 
936 	if (!of_property_read_u32(of_node, field1, &val1))
937 		matches++;
938 
939 	if (!of_property_read_u32(of_node, field2, &val2))
940 		matches++;
941 
942 	if (!of_property_read_u32(of_node, field3, &val3))
943 		matches++;
944 
945 	if (!of_property_read_u32(of_node, field4, &val4))
946 		matches++;
947 
948 	if (!matches)
949 		return 0;
950 
951 	if (matches < 4)
952 		newval = kszphy_extended_read(phydev, reg);
953 	else
954 		newval = 0;
955 
956 	if (val1 != -1)
957 		newval = ((newval & 0xfff0) | ((val1 / PS_TO_REG) & 0xf) << 0);
958 
959 	if (val2 != -2)
960 		newval = ((newval & 0xff0f) | ((val2 / PS_TO_REG) & 0xf) << 4);
961 
962 	if (val3 != -3)
963 		newval = ((newval & 0xf0ff) | ((val3 / PS_TO_REG) & 0xf) << 8);
964 
965 	if (val4 != -4)
966 		newval = ((newval & 0x0fff) | ((val4 / PS_TO_REG) & 0xf) << 12);
967 
968 	return kszphy_extended_write(phydev, reg, newval);
969 }
970 
971 static int ksz9021_config_init(struct phy_device *phydev)
972 {
973 	const struct device_node *of_node;
974 	const struct device *dev_walker;
975 
976 	/* The Micrel driver has a deprecated option to place phy OF
977 	 * properties in the MAC node. Walk up the tree of devices to
978 	 * find a device with an OF node.
979 	 */
980 	dev_walker = &phydev->mdio.dev;
981 	do {
982 		of_node = dev_walker->of_node;
983 		dev_walker = dev_walker->parent;
984 
985 	} while (!of_node && dev_walker);
986 
987 	if (of_node) {
988 		ksz9021_load_values_from_of(phydev, of_node,
989 				    MII_KSZPHY_CLK_CONTROL_PAD_SKEW,
990 				    "txen-skew-ps", "txc-skew-ps",
991 				    "rxdv-skew-ps", "rxc-skew-ps");
992 		ksz9021_load_values_from_of(phydev, of_node,
993 				    MII_KSZPHY_RX_DATA_PAD_SKEW,
994 				    "rxd0-skew-ps", "rxd1-skew-ps",
995 				    "rxd2-skew-ps", "rxd3-skew-ps");
996 		ksz9021_load_values_from_of(phydev, of_node,
997 				    MII_KSZPHY_TX_DATA_PAD_SKEW,
998 				    "txd0-skew-ps", "txd1-skew-ps",
999 				    "txd2-skew-ps", "txd3-skew-ps");
1000 	}
1001 	return 0;
1002 }
1003 
1004 #define KSZ9031_PS_TO_REG		60
1005 
1006 /* Extended registers */
1007 /* MMD Address 0x0 */
1008 #define MII_KSZ9031RN_FLP_BURST_TX_LO	3
1009 #define MII_KSZ9031RN_FLP_BURST_TX_HI	4
1010 
1011 /* MMD Address 0x2 */
1012 #define MII_KSZ9031RN_CONTROL_PAD_SKEW	4
1013 #define MII_KSZ9031RN_RX_CTL_M		GENMASK(7, 4)
1014 #define MII_KSZ9031RN_TX_CTL_M		GENMASK(3, 0)
1015 
1016 #define MII_KSZ9031RN_RX_DATA_PAD_SKEW	5
1017 #define MII_KSZ9031RN_RXD3		GENMASK(15, 12)
1018 #define MII_KSZ9031RN_RXD2		GENMASK(11, 8)
1019 #define MII_KSZ9031RN_RXD1		GENMASK(7, 4)
1020 #define MII_KSZ9031RN_RXD0		GENMASK(3, 0)
1021 
1022 #define MII_KSZ9031RN_TX_DATA_PAD_SKEW	6
1023 #define MII_KSZ9031RN_TXD3		GENMASK(15, 12)
1024 #define MII_KSZ9031RN_TXD2		GENMASK(11, 8)
1025 #define MII_KSZ9031RN_TXD1		GENMASK(7, 4)
1026 #define MII_KSZ9031RN_TXD0		GENMASK(3, 0)
1027 
1028 #define MII_KSZ9031RN_CLK_PAD_SKEW	8
1029 #define MII_KSZ9031RN_GTX_CLK		GENMASK(9, 5)
1030 #define MII_KSZ9031RN_RX_CLK		GENMASK(4, 0)
1031 
1032 /* KSZ9031 has internal RGMII_IDRX = 1.2ns and RGMII_IDTX = 0ns. To
1033  * provide different RGMII options we need to configure delay offset
1034  * for each pad relative to build in delay.
1035  */
1036 /* keep rx as "No delay adjustment" and set rx_clk to +0.60ns to get delays of
1037  * 1.80ns
1038  */
1039 #define RX_ID				0x7
1040 #define RX_CLK_ID			0x19
1041 
1042 /* set rx to +0.30ns and rx_clk to -0.90ns to compensate the
1043  * internal 1.2ns delay.
1044  */
1045 #define RX_ND				0xc
1046 #define RX_CLK_ND			0x0
1047 
1048 /* set tx to -0.42ns and tx_clk to +0.96ns to get 1.38ns delay */
1049 #define TX_ID				0x0
1050 #define TX_CLK_ID			0x1f
1051 
1052 /* set tx and tx_clk to "No delay adjustment" to keep 0ns
1053  * delay
1054  */
1055 #define TX_ND				0x7
1056 #define TX_CLK_ND			0xf
1057 
1058 /* MMD Address 0x1C */
1059 #define MII_KSZ9031RN_EDPD		0x23
1060 #define MII_KSZ9031RN_EDPD_ENABLE	BIT(0)
1061 
1062 static int ksz9031_set_loopback(struct phy_device *phydev, bool enable,
1063 				int speed)
1064 {
1065 	u16 ctl = BMCR_LOOPBACK;
1066 	int val;
1067 
1068 	if (!enable)
1069 		return genphy_loopback(phydev, enable, 0);
1070 
1071 	if (speed == SPEED_10 || speed == SPEED_100 || speed == SPEED_1000)
1072 		phydev->speed = speed;
1073 	else if (speed)
1074 		return -EINVAL;
1075 	phydev->duplex = DUPLEX_FULL;
1076 
1077 	ctl |= mii_bmcr_encode_fixed(phydev->speed, phydev->duplex);
1078 
1079 	phy_write(phydev, MII_BMCR, ctl);
1080 
1081 	return phy_read_poll_timeout(phydev, MII_BMSR, val, val & BMSR_LSTATUS,
1082 				     5000, 500000, true);
1083 }
1084 
1085 static int ksz9031_of_load_skew_values(struct phy_device *phydev,
1086 				       const struct device_node *of_node,
1087 				       u16 reg, size_t field_sz,
1088 				       const char *field[], u8 numfields,
1089 				       bool *update)
1090 {
1091 	int val[4] = {-1, -2, -3, -4};
1092 	int matches = 0;
1093 	u16 mask;
1094 	u16 maxval;
1095 	u16 newval;
1096 	int i;
1097 
1098 	for (i = 0; i < numfields; i++)
1099 		if (!of_property_read_u32(of_node, field[i], val + i))
1100 			matches++;
1101 
1102 	if (!matches)
1103 		return 0;
1104 
1105 	*update |= true;
1106 
1107 	if (matches < numfields)
1108 		newval = phy_read_mmd(phydev, 2, reg);
1109 	else
1110 		newval = 0;
1111 
1112 	maxval = (field_sz == 4) ? 0xf : 0x1f;
1113 	for (i = 0; i < numfields; i++)
1114 		if (val[i] != -(i + 1)) {
1115 			mask = 0xffff;
1116 			mask ^= maxval << (field_sz * i);
1117 			newval = (newval & mask) |
1118 				(((val[i] / KSZ9031_PS_TO_REG) & maxval)
1119 					<< (field_sz * i));
1120 		}
1121 
1122 	return phy_write_mmd(phydev, 2, reg, newval);
1123 }
1124 
1125 /* Center KSZ9031RNX FLP timing at 16ms. */
1126 static int ksz9031_center_flp_timing(struct phy_device *phydev)
1127 {
1128 	int result;
1129 
1130 	result = phy_write_mmd(phydev, 0, MII_KSZ9031RN_FLP_BURST_TX_HI,
1131 			       0x0006);
1132 	if (result)
1133 		return result;
1134 
1135 	result = phy_write_mmd(phydev, 0, MII_KSZ9031RN_FLP_BURST_TX_LO,
1136 			       0x1A80);
1137 	if (result)
1138 		return result;
1139 
1140 	return genphy_restart_aneg(phydev);
1141 }
1142 
1143 /* Enable energy-detect power-down mode */
1144 static int ksz9031_enable_edpd(struct phy_device *phydev)
1145 {
1146 	int reg;
1147 
1148 	reg = phy_read_mmd(phydev, 0x1C, MII_KSZ9031RN_EDPD);
1149 	if (reg < 0)
1150 		return reg;
1151 	return phy_write_mmd(phydev, 0x1C, MII_KSZ9031RN_EDPD,
1152 			     reg | MII_KSZ9031RN_EDPD_ENABLE);
1153 }
1154 
1155 static int ksz9031_config_rgmii_delay(struct phy_device *phydev)
1156 {
1157 	u16 rx, tx, rx_clk, tx_clk;
1158 	int ret;
1159 
1160 	switch (phydev->interface) {
1161 	case PHY_INTERFACE_MODE_RGMII:
1162 		tx = TX_ND;
1163 		tx_clk = TX_CLK_ND;
1164 		rx = RX_ND;
1165 		rx_clk = RX_CLK_ND;
1166 		break;
1167 	case PHY_INTERFACE_MODE_RGMII_ID:
1168 		tx = TX_ID;
1169 		tx_clk = TX_CLK_ID;
1170 		rx = RX_ID;
1171 		rx_clk = RX_CLK_ID;
1172 		break;
1173 	case PHY_INTERFACE_MODE_RGMII_RXID:
1174 		tx = TX_ND;
1175 		tx_clk = TX_CLK_ND;
1176 		rx = RX_ID;
1177 		rx_clk = RX_CLK_ID;
1178 		break;
1179 	case PHY_INTERFACE_MODE_RGMII_TXID:
1180 		tx = TX_ID;
1181 		tx_clk = TX_CLK_ID;
1182 		rx = RX_ND;
1183 		rx_clk = RX_CLK_ND;
1184 		break;
1185 	default:
1186 		return 0;
1187 	}
1188 
1189 	ret = phy_write_mmd(phydev, 2, MII_KSZ9031RN_CONTROL_PAD_SKEW,
1190 			    FIELD_PREP(MII_KSZ9031RN_RX_CTL_M, rx) |
1191 			    FIELD_PREP(MII_KSZ9031RN_TX_CTL_M, tx));
1192 	if (ret < 0)
1193 		return ret;
1194 
1195 	ret = phy_write_mmd(phydev, 2, MII_KSZ9031RN_RX_DATA_PAD_SKEW,
1196 			    FIELD_PREP(MII_KSZ9031RN_RXD3, rx) |
1197 			    FIELD_PREP(MII_KSZ9031RN_RXD2, rx) |
1198 			    FIELD_PREP(MII_KSZ9031RN_RXD1, rx) |
1199 			    FIELD_PREP(MII_KSZ9031RN_RXD0, rx));
1200 	if (ret < 0)
1201 		return ret;
1202 
1203 	ret = phy_write_mmd(phydev, 2, MII_KSZ9031RN_TX_DATA_PAD_SKEW,
1204 			    FIELD_PREP(MII_KSZ9031RN_TXD3, tx) |
1205 			    FIELD_PREP(MII_KSZ9031RN_TXD2, tx) |
1206 			    FIELD_PREP(MII_KSZ9031RN_TXD1, tx) |
1207 			    FIELD_PREP(MII_KSZ9031RN_TXD0, tx));
1208 	if (ret < 0)
1209 		return ret;
1210 
1211 	return phy_write_mmd(phydev, 2, MII_KSZ9031RN_CLK_PAD_SKEW,
1212 			     FIELD_PREP(MII_KSZ9031RN_GTX_CLK, tx_clk) |
1213 			     FIELD_PREP(MII_KSZ9031RN_RX_CLK, rx_clk));
1214 }
1215 
1216 static int ksz9031_config_init(struct phy_device *phydev)
1217 {
1218 	const struct device_node *of_node;
1219 	static const char *clk_skews[2] = {"rxc-skew-ps", "txc-skew-ps"};
1220 	static const char *rx_data_skews[4] = {
1221 		"rxd0-skew-ps", "rxd1-skew-ps",
1222 		"rxd2-skew-ps", "rxd3-skew-ps"
1223 	};
1224 	static const char *tx_data_skews[4] = {
1225 		"txd0-skew-ps", "txd1-skew-ps",
1226 		"txd2-skew-ps", "txd3-skew-ps"
1227 	};
1228 	static const char *control_skews[2] = {"txen-skew-ps", "rxdv-skew-ps"};
1229 	const struct device *dev_walker;
1230 	int result;
1231 
1232 	result = ksz9031_enable_edpd(phydev);
1233 	if (result < 0)
1234 		return result;
1235 
1236 	/* The Micrel driver has a deprecated option to place phy OF
1237 	 * properties in the MAC node. Walk up the tree of devices to
1238 	 * find a device with an OF node.
1239 	 */
1240 	dev_walker = &phydev->mdio.dev;
1241 	do {
1242 		of_node = dev_walker->of_node;
1243 		dev_walker = dev_walker->parent;
1244 	} while (!of_node && dev_walker);
1245 
1246 	if (of_node) {
1247 		bool update = false;
1248 
1249 		if (phy_interface_is_rgmii(phydev)) {
1250 			result = ksz9031_config_rgmii_delay(phydev);
1251 			if (result < 0)
1252 				return result;
1253 		}
1254 
1255 		ksz9031_of_load_skew_values(phydev, of_node,
1256 				MII_KSZ9031RN_CLK_PAD_SKEW, 5,
1257 				clk_skews, 2, &update);
1258 
1259 		ksz9031_of_load_skew_values(phydev, of_node,
1260 				MII_KSZ9031RN_CONTROL_PAD_SKEW, 4,
1261 				control_skews, 2, &update);
1262 
1263 		ksz9031_of_load_skew_values(phydev, of_node,
1264 				MII_KSZ9031RN_RX_DATA_PAD_SKEW, 4,
1265 				rx_data_skews, 4, &update);
1266 
1267 		ksz9031_of_load_skew_values(phydev, of_node,
1268 				MII_KSZ9031RN_TX_DATA_PAD_SKEW, 4,
1269 				tx_data_skews, 4, &update);
1270 
1271 		if (update && !phy_interface_is_rgmii(phydev))
1272 			phydev_warn(phydev,
1273 				    "*-skew-ps values should be used only with RGMII PHY modes\n");
1274 
1275 		/* Silicon Errata Sheet (DS80000691D or DS80000692D):
1276 		 * When the device links in the 1000BASE-T slave mode only,
1277 		 * the optional 125MHz reference output clock (CLK125_NDO)
1278 		 * has wide duty cycle variation.
1279 		 *
1280 		 * The optional CLK125_NDO clock does not meet the RGMII
1281 		 * 45/55 percent (min/max) duty cycle requirement and therefore
1282 		 * cannot be used directly by the MAC side for clocking
1283 		 * applications that have setup/hold time requirements on
1284 		 * rising and falling clock edges.
1285 		 *
1286 		 * Workaround:
1287 		 * Force the phy to be the master to receive a stable clock
1288 		 * which meets the duty cycle requirement.
1289 		 */
1290 		if (of_property_read_bool(of_node, "micrel,force-master")) {
1291 			result = phy_read(phydev, MII_CTRL1000);
1292 			if (result < 0)
1293 				goto err_force_master;
1294 
1295 			/* enable master mode, config & prefer master */
1296 			result |= CTL1000_ENABLE_MASTER | CTL1000_AS_MASTER;
1297 			result = phy_write(phydev, MII_CTRL1000, result);
1298 			if (result < 0)
1299 				goto err_force_master;
1300 		}
1301 	}
1302 
1303 	return ksz9031_center_flp_timing(phydev);
1304 
1305 err_force_master:
1306 	phydev_err(phydev, "failed to force the phy to master mode\n");
1307 	return result;
1308 }
1309 
1310 #define KSZ9131_SKEW_5BIT_MAX	2400
1311 #define KSZ9131_SKEW_4BIT_MAX	800
1312 #define KSZ9131_OFFSET		700
1313 #define KSZ9131_STEP		100
1314 
1315 static int ksz9131_of_load_skew_values(struct phy_device *phydev,
1316 				       struct device_node *of_node,
1317 				       u16 reg, size_t field_sz,
1318 				       char *field[], u8 numfields)
1319 {
1320 	int val[4] = {-(1 + KSZ9131_OFFSET), -(2 + KSZ9131_OFFSET),
1321 		      -(3 + KSZ9131_OFFSET), -(4 + KSZ9131_OFFSET)};
1322 	int skewval, skewmax = 0;
1323 	int matches = 0;
1324 	u16 maxval;
1325 	u16 newval;
1326 	u16 mask;
1327 	int i;
1328 
1329 	/* psec properties in dts should mean x pico seconds */
1330 	if (field_sz == 5)
1331 		skewmax = KSZ9131_SKEW_5BIT_MAX;
1332 	else
1333 		skewmax = KSZ9131_SKEW_4BIT_MAX;
1334 
1335 	for (i = 0; i < numfields; i++)
1336 		if (!of_property_read_s32(of_node, field[i], &skewval)) {
1337 			if (skewval < -KSZ9131_OFFSET)
1338 				skewval = -KSZ9131_OFFSET;
1339 			else if (skewval > skewmax)
1340 				skewval = skewmax;
1341 
1342 			val[i] = skewval + KSZ9131_OFFSET;
1343 			matches++;
1344 		}
1345 
1346 	if (!matches)
1347 		return 0;
1348 
1349 	if (matches < numfields)
1350 		newval = phy_read_mmd(phydev, 2, reg);
1351 	else
1352 		newval = 0;
1353 
1354 	maxval = (field_sz == 4) ? 0xf : 0x1f;
1355 	for (i = 0; i < numfields; i++)
1356 		if (val[i] != -(i + 1 + KSZ9131_OFFSET)) {
1357 			mask = 0xffff;
1358 			mask ^= maxval << (field_sz * i);
1359 			newval = (newval & mask) |
1360 				(((val[i] / KSZ9131_STEP) & maxval)
1361 					<< (field_sz * i));
1362 		}
1363 
1364 	return phy_write_mmd(phydev, 2, reg, newval);
1365 }
1366 
1367 #define KSZ9131RN_MMD_COMMON_CTRL_REG	2
1368 #define KSZ9131RN_RXC_DLL_CTRL		76
1369 #define KSZ9131RN_TXC_DLL_CTRL		77
1370 #define KSZ9131RN_DLL_ENABLE_DELAY	0
1371 
1372 static int ksz9131_config_rgmii_delay(struct phy_device *phydev)
1373 {
1374 	const struct kszphy_type *type = phydev->drv->driver_data;
1375 	u16 rxcdll_val, txcdll_val;
1376 	int ret;
1377 
1378 	switch (phydev->interface) {
1379 	case PHY_INTERFACE_MODE_RGMII:
1380 		rxcdll_val = type->disable_dll_rx_bit;
1381 		txcdll_val = type->disable_dll_tx_bit;
1382 		break;
1383 	case PHY_INTERFACE_MODE_RGMII_ID:
1384 		rxcdll_val = KSZ9131RN_DLL_ENABLE_DELAY;
1385 		txcdll_val = KSZ9131RN_DLL_ENABLE_DELAY;
1386 		break;
1387 	case PHY_INTERFACE_MODE_RGMII_RXID:
1388 		rxcdll_val = KSZ9131RN_DLL_ENABLE_DELAY;
1389 		txcdll_val = type->disable_dll_tx_bit;
1390 		break;
1391 	case PHY_INTERFACE_MODE_RGMII_TXID:
1392 		rxcdll_val = type->disable_dll_rx_bit;
1393 		txcdll_val = KSZ9131RN_DLL_ENABLE_DELAY;
1394 		break;
1395 	default:
1396 		return 0;
1397 	}
1398 
1399 	ret = phy_modify_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG,
1400 			     KSZ9131RN_RXC_DLL_CTRL, type->disable_dll_mask,
1401 			     rxcdll_val);
1402 	if (ret < 0)
1403 		return ret;
1404 
1405 	return phy_modify_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG,
1406 			      KSZ9131RN_TXC_DLL_CTRL, type->disable_dll_mask,
1407 			      txcdll_val);
1408 }
1409 
1410 /* Silicon Errata DS80000693B
1411  *
1412  * When LEDs are configured in Individual Mode, LED1 is ON in a no-link
1413  * condition. Workaround is to set register 0x1e, bit 9, this way LED1 behaves
1414  * according to the datasheet (off if there is no link).
1415  */
1416 static int ksz9131_led_errata(struct phy_device *phydev)
1417 {
1418 	int reg;
1419 
1420 	reg = phy_read_mmd(phydev, 2, 0);
1421 	if (reg < 0)
1422 		return reg;
1423 
1424 	if (!(reg & BIT(4)))
1425 		return 0;
1426 
1427 	return phy_set_bits(phydev, 0x1e, BIT(9));
1428 }
1429 
1430 static int ksz9131_config_init(struct phy_device *phydev)
1431 {
1432 	struct device_node *of_node;
1433 	char *clk_skews[2] = {"rxc-skew-psec", "txc-skew-psec"};
1434 	char *rx_data_skews[4] = {
1435 		"rxd0-skew-psec", "rxd1-skew-psec",
1436 		"rxd2-skew-psec", "rxd3-skew-psec"
1437 	};
1438 	char *tx_data_skews[4] = {
1439 		"txd0-skew-psec", "txd1-skew-psec",
1440 		"txd2-skew-psec", "txd3-skew-psec"
1441 	};
1442 	char *control_skews[2] = {"txen-skew-psec", "rxdv-skew-psec"};
1443 	const struct device *dev_walker;
1444 	int ret;
1445 
1446 	phydev->mdix_ctrl = ETH_TP_MDI_AUTO;
1447 
1448 	dev_walker = &phydev->mdio.dev;
1449 	do {
1450 		of_node = dev_walker->of_node;
1451 		dev_walker = dev_walker->parent;
1452 	} while (!of_node && dev_walker);
1453 
1454 	if (!of_node)
1455 		return 0;
1456 
1457 	if (phy_interface_is_rgmii(phydev)) {
1458 		ret = ksz9131_config_rgmii_delay(phydev);
1459 		if (ret < 0)
1460 			return ret;
1461 	}
1462 
1463 	ret = ksz9131_of_load_skew_values(phydev, of_node,
1464 					  MII_KSZ9031RN_CLK_PAD_SKEW, 5,
1465 					  clk_skews, 2);
1466 	if (ret < 0)
1467 		return ret;
1468 
1469 	ret = ksz9131_of_load_skew_values(phydev, of_node,
1470 					  MII_KSZ9031RN_CONTROL_PAD_SKEW, 4,
1471 					  control_skews, 2);
1472 	if (ret < 0)
1473 		return ret;
1474 
1475 	ret = ksz9131_of_load_skew_values(phydev, of_node,
1476 					  MII_KSZ9031RN_RX_DATA_PAD_SKEW, 4,
1477 					  rx_data_skews, 4);
1478 	if (ret < 0)
1479 		return ret;
1480 
1481 	ret = ksz9131_of_load_skew_values(phydev, of_node,
1482 					  MII_KSZ9031RN_TX_DATA_PAD_SKEW, 4,
1483 					  tx_data_skews, 4);
1484 	if (ret < 0)
1485 		return ret;
1486 
1487 	ret = ksz9131_led_errata(phydev);
1488 	if (ret < 0)
1489 		return ret;
1490 
1491 	return 0;
1492 }
1493 
1494 #define MII_KSZ9131_AUTO_MDIX		0x1C
1495 #define MII_KSZ9131_AUTO_MDI_SET	BIT(7)
1496 #define MII_KSZ9131_AUTO_MDIX_SWAP_OFF	BIT(6)
1497 #define MII_KSZ9131_DIG_AXAN_STS	0x14
1498 #define MII_KSZ9131_DIG_AXAN_STS_LINK_DET	BIT(14)
1499 #define MII_KSZ9131_DIG_AXAN_STS_A_SELECT	BIT(12)
1500 
1501 static int ksz9131_mdix_update(struct phy_device *phydev)
1502 {
1503 	int ret;
1504 
1505 	if (phydev->mdix_ctrl != ETH_TP_MDI_AUTO) {
1506 		phydev->mdix = phydev->mdix_ctrl;
1507 	} else {
1508 		ret = phy_read(phydev, MII_KSZ9131_DIG_AXAN_STS);
1509 		if (ret < 0)
1510 			return ret;
1511 
1512 		if (ret & MII_KSZ9131_DIG_AXAN_STS_LINK_DET) {
1513 			if (ret & MII_KSZ9131_DIG_AXAN_STS_A_SELECT)
1514 				phydev->mdix = ETH_TP_MDI;
1515 			else
1516 				phydev->mdix = ETH_TP_MDI_X;
1517 		} else {
1518 			phydev->mdix = ETH_TP_MDI_INVALID;
1519 		}
1520 	}
1521 
1522 	return 0;
1523 }
1524 
1525 static int ksz9131_config_mdix(struct phy_device *phydev, u8 ctrl)
1526 {
1527 	u16 val;
1528 
1529 	switch (ctrl) {
1530 	case ETH_TP_MDI:
1531 		val = MII_KSZ9131_AUTO_MDIX_SWAP_OFF |
1532 		      MII_KSZ9131_AUTO_MDI_SET;
1533 		break;
1534 	case ETH_TP_MDI_X:
1535 		val = MII_KSZ9131_AUTO_MDIX_SWAP_OFF;
1536 		break;
1537 	case ETH_TP_MDI_AUTO:
1538 		val = 0;
1539 		break;
1540 	default:
1541 		return 0;
1542 	}
1543 
1544 	return phy_modify(phydev, MII_KSZ9131_AUTO_MDIX,
1545 			  MII_KSZ9131_AUTO_MDIX_SWAP_OFF |
1546 			  MII_KSZ9131_AUTO_MDI_SET, val);
1547 }
1548 
1549 static int ksz9131_read_status(struct phy_device *phydev)
1550 {
1551 	int ret;
1552 
1553 	ret = ksz9131_mdix_update(phydev);
1554 	if (ret < 0)
1555 		return ret;
1556 
1557 	return genphy_read_status(phydev);
1558 }
1559 
1560 static int ksz9131_config_aneg(struct phy_device *phydev)
1561 {
1562 	int ret;
1563 
1564 	ret = ksz9131_config_mdix(phydev, phydev->mdix_ctrl);
1565 	if (ret)
1566 		return ret;
1567 
1568 	return genphy_config_aneg(phydev);
1569 }
1570 
1571 static int ksz9477_get_features(struct phy_device *phydev)
1572 {
1573 	int ret;
1574 
1575 	ret = genphy_read_abilities(phydev);
1576 	if (ret)
1577 		return ret;
1578 
1579 	/* The "EEE control and capability 1" (Register 3.20) seems to be
1580 	 * influenced by the "EEE advertisement 1" (Register 7.60). Changes
1581 	 * on the 7.60 will affect 3.20. So, we need to construct our own list
1582 	 * of caps.
1583 	 * KSZ8563R should have 100BaseTX/Full only.
1584 	 */
1585 	linkmode_and(phydev->supported_eee, phydev->supported,
1586 		     PHY_EEE_CAP1_FEATURES);
1587 
1588 	return 0;
1589 }
1590 
1591 #define KSZ8873MLL_GLOBAL_CONTROL_4	0x06
1592 #define KSZ8873MLL_GLOBAL_CONTROL_4_DUPLEX	BIT(6)
1593 #define KSZ8873MLL_GLOBAL_CONTROL_4_SPEED	BIT(4)
1594 static int ksz8873mll_read_status(struct phy_device *phydev)
1595 {
1596 	int regval;
1597 
1598 	/* dummy read */
1599 	regval = phy_read(phydev, KSZ8873MLL_GLOBAL_CONTROL_4);
1600 
1601 	regval = phy_read(phydev, KSZ8873MLL_GLOBAL_CONTROL_4);
1602 
1603 	if (regval & KSZ8873MLL_GLOBAL_CONTROL_4_DUPLEX)
1604 		phydev->duplex = DUPLEX_HALF;
1605 	else
1606 		phydev->duplex = DUPLEX_FULL;
1607 
1608 	if (regval & KSZ8873MLL_GLOBAL_CONTROL_4_SPEED)
1609 		phydev->speed = SPEED_10;
1610 	else
1611 		phydev->speed = SPEED_100;
1612 
1613 	phydev->link = 1;
1614 	phydev->pause = phydev->asym_pause = 0;
1615 
1616 	return 0;
1617 }
1618 
1619 static int ksz9031_get_features(struct phy_device *phydev)
1620 {
1621 	int ret;
1622 
1623 	ret = genphy_read_abilities(phydev);
1624 	if (ret < 0)
1625 		return ret;
1626 
1627 	/* Silicon Errata Sheet (DS80000691D or DS80000692D):
1628 	 * Whenever the device's Asymmetric Pause capability is set to 1,
1629 	 * link-up may fail after a link-up to link-down transition.
1630 	 *
1631 	 * The Errata Sheet is for ksz9031, but ksz9021 has the same issue
1632 	 *
1633 	 * Workaround:
1634 	 * Do not enable the Asymmetric Pause capability bit.
1635 	 */
1636 	linkmode_clear_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, phydev->supported);
1637 
1638 	/* We force setting the Pause capability as the core will force the
1639 	 * Asymmetric Pause capability to 1 otherwise.
1640 	 */
1641 	linkmode_set_bit(ETHTOOL_LINK_MODE_Pause_BIT, phydev->supported);
1642 
1643 	return 0;
1644 }
1645 
1646 static int ksz9031_read_status(struct phy_device *phydev)
1647 {
1648 	int err;
1649 	int regval;
1650 
1651 	err = genphy_read_status(phydev);
1652 	if (err)
1653 		return err;
1654 
1655 	/* Make sure the PHY is not broken. Read idle error count,
1656 	 * and reset the PHY if it is maxed out.
1657 	 */
1658 	regval = phy_read(phydev, MII_STAT1000);
1659 	if ((regval & 0xFF) == 0xFF) {
1660 		phy_init_hw(phydev);
1661 		phydev->link = 0;
1662 		if (phydev->drv->config_intr && phy_interrupt_is_valid(phydev))
1663 			phydev->drv->config_intr(phydev);
1664 		return genphy_config_aneg(phydev);
1665 	}
1666 
1667 	return 0;
1668 }
1669 
1670 static int ksz9x31_cable_test_start(struct phy_device *phydev)
1671 {
1672 	struct kszphy_priv *priv = phydev->priv;
1673 	int ret;
1674 
1675 	/* KSZ9131RNX, DS00002841B-page 38, 4.14 LinkMD (R) Cable Diagnostic
1676 	 * Prior to running the cable diagnostics, Auto-negotiation should
1677 	 * be disabled, full duplex set and the link speed set to 1000Mbps
1678 	 * via the Basic Control Register.
1679 	 */
1680 	ret = phy_modify(phydev, MII_BMCR,
1681 			 BMCR_SPEED1000 | BMCR_FULLDPLX |
1682 			 BMCR_ANENABLE | BMCR_SPEED100,
1683 			 BMCR_SPEED1000 | BMCR_FULLDPLX);
1684 	if (ret)
1685 		return ret;
1686 
1687 	/* KSZ9131RNX, DS00002841B-page 38, 4.14 LinkMD (R) Cable Diagnostic
1688 	 * The Master-Slave configuration should be set to Slave by writing
1689 	 * a value of 0x1000 to the Auto-Negotiation Master Slave Control
1690 	 * Register.
1691 	 */
1692 	ret = phy_read(phydev, MII_CTRL1000);
1693 	if (ret < 0)
1694 		return ret;
1695 
1696 	/* Cache these bits, they need to be restored once LinkMD finishes. */
1697 	priv->vct_ctrl1000 = ret & (CTL1000_ENABLE_MASTER | CTL1000_AS_MASTER);
1698 	ret &= ~(CTL1000_ENABLE_MASTER | CTL1000_AS_MASTER);
1699 	ret |= CTL1000_ENABLE_MASTER;
1700 
1701 	return phy_write(phydev, MII_CTRL1000, ret);
1702 }
1703 
1704 static int ksz9x31_cable_test_result_trans(u16 status)
1705 {
1706 	switch (FIELD_GET(KSZ9x31_LMD_VCT_ST_MASK, status)) {
1707 	case KSZ9x31_LMD_VCT_ST_NORMAL:
1708 		return ETHTOOL_A_CABLE_RESULT_CODE_OK;
1709 	case KSZ9x31_LMD_VCT_ST_OPEN:
1710 		return ETHTOOL_A_CABLE_RESULT_CODE_OPEN;
1711 	case KSZ9x31_LMD_VCT_ST_SHORT:
1712 		return ETHTOOL_A_CABLE_RESULT_CODE_SAME_SHORT;
1713 	case KSZ9x31_LMD_VCT_ST_FAIL:
1714 		fallthrough;
1715 	default:
1716 		return ETHTOOL_A_CABLE_RESULT_CODE_UNSPEC;
1717 	}
1718 }
1719 
1720 static bool ksz9x31_cable_test_failed(u16 status)
1721 {
1722 	int stat = FIELD_GET(KSZ9x31_LMD_VCT_ST_MASK, status);
1723 
1724 	return stat == KSZ9x31_LMD_VCT_ST_FAIL;
1725 }
1726 
1727 static bool ksz9x31_cable_test_fault_length_valid(u16 status)
1728 {
1729 	switch (FIELD_GET(KSZ9x31_LMD_VCT_ST_MASK, status)) {
1730 	case KSZ9x31_LMD_VCT_ST_OPEN:
1731 		fallthrough;
1732 	case KSZ9x31_LMD_VCT_ST_SHORT:
1733 		return true;
1734 	}
1735 	return false;
1736 }
1737 
1738 static int ksz9x31_cable_test_fault_length(struct phy_device *phydev, u16 stat)
1739 {
1740 	int dt = FIELD_GET(KSZ9x31_LMD_VCT_DATA_MASK, stat);
1741 
1742 	/* KSZ9131RNX, DS00002841B-page 38, 4.14 LinkMD (R) Cable Diagnostic
1743 	 *
1744 	 * distance to fault = (VCT_DATA - 22) * 4 / cable propagation velocity
1745 	 */
1746 	if (phydev_id_compare(phydev, PHY_ID_KSZ9131) ||
1747 	    phydev_id_compare(phydev, PHY_ID_KSZ9477))
1748 		dt = clamp(dt - 22, 0, 255);
1749 
1750 	return (dt * 400) / 10;
1751 }
1752 
1753 static int ksz9x31_cable_test_wait_for_completion(struct phy_device *phydev)
1754 {
1755 	int val, ret;
1756 
1757 	ret = phy_read_poll_timeout(phydev, KSZ9x31_LMD, val,
1758 				    !(val & KSZ9x31_LMD_VCT_EN),
1759 				    30000, 100000, true);
1760 
1761 	return ret < 0 ? ret : 0;
1762 }
1763 
1764 static int ksz9x31_cable_test_get_pair(int pair)
1765 {
1766 	static const int ethtool_pair[] = {
1767 		ETHTOOL_A_CABLE_PAIR_A,
1768 		ETHTOOL_A_CABLE_PAIR_B,
1769 		ETHTOOL_A_CABLE_PAIR_C,
1770 		ETHTOOL_A_CABLE_PAIR_D,
1771 	};
1772 
1773 	return ethtool_pair[pair];
1774 }
1775 
1776 static int ksz9x31_cable_test_one_pair(struct phy_device *phydev, int pair)
1777 {
1778 	int ret, val;
1779 
1780 	/* KSZ9131RNX, DS00002841B-page 38, 4.14 LinkMD (R) Cable Diagnostic
1781 	 * To test each individual cable pair, set the cable pair in the Cable
1782 	 * Diagnostics Test Pair (VCT_PAIR[1:0]) field of the LinkMD Cable
1783 	 * Diagnostic Register, along with setting the Cable Diagnostics Test
1784 	 * Enable (VCT_EN) bit. The Cable Diagnostics Test Enable (VCT_EN) bit
1785 	 * will self clear when the test is concluded.
1786 	 */
1787 	ret = phy_write(phydev, KSZ9x31_LMD,
1788 			KSZ9x31_LMD_VCT_EN | KSZ9x31_LMD_VCT_PAIR(pair));
1789 	if (ret)
1790 		return ret;
1791 
1792 	ret = ksz9x31_cable_test_wait_for_completion(phydev);
1793 	if (ret)
1794 		return ret;
1795 
1796 	val = phy_read(phydev, KSZ9x31_LMD);
1797 	if (val < 0)
1798 		return val;
1799 
1800 	if (ksz9x31_cable_test_failed(val))
1801 		return -EAGAIN;
1802 
1803 	ret = ethnl_cable_test_result(phydev,
1804 				      ksz9x31_cable_test_get_pair(pair),
1805 				      ksz9x31_cable_test_result_trans(val));
1806 	if (ret)
1807 		return ret;
1808 
1809 	if (!ksz9x31_cable_test_fault_length_valid(val))
1810 		return 0;
1811 
1812 	return ethnl_cable_test_fault_length(phydev,
1813 					     ksz9x31_cable_test_get_pair(pair),
1814 					     ksz9x31_cable_test_fault_length(phydev, val));
1815 }
1816 
1817 static int ksz9x31_cable_test_get_status(struct phy_device *phydev,
1818 					 bool *finished)
1819 {
1820 	struct kszphy_priv *priv = phydev->priv;
1821 	unsigned long pair_mask;
1822 	int retries = 20;
1823 	int pair, ret, rv;
1824 
1825 	*finished = false;
1826 
1827 	if (linkmode_test_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT,
1828 			      phydev->supported) ||
1829 	    linkmode_test_bit(ETHTOOL_LINK_MODE_1000baseT_Half_BIT,
1830 			      phydev->supported))
1831 		pair_mask = 0xf; /* All pairs */
1832 	else
1833 		pair_mask = 0x3; /* Pairs A and B only */
1834 
1835 	/* Try harder if link partner is active */
1836 	while (pair_mask && retries--) {
1837 		for_each_set_bit(pair, &pair_mask, 4) {
1838 			ret = ksz9x31_cable_test_one_pair(phydev, pair);
1839 			if (ret == -EAGAIN)
1840 				continue;
1841 			if (ret < 0)
1842 				return ret;
1843 			clear_bit(pair, &pair_mask);
1844 		}
1845 		/* If link partner is in autonegotiation mode it will send 2ms
1846 		 * of FLPs with at least 6ms of silence.
1847 		 * Add 2ms sleep to have better chances to hit this silence.
1848 		 */
1849 		if (pair_mask)
1850 			usleep_range(2000, 3000);
1851 	}
1852 
1853 	/* Report remaining unfinished pair result as unknown. */
1854 	for_each_set_bit(pair, &pair_mask, 4) {
1855 		ret = ethnl_cable_test_result(phydev,
1856 					      ksz9x31_cable_test_get_pair(pair),
1857 					      ETHTOOL_A_CABLE_RESULT_CODE_UNSPEC);
1858 	}
1859 
1860 	*finished = true;
1861 
1862 	/* Restore cached bits from before LinkMD got started. */
1863 	rv = phy_modify(phydev, MII_CTRL1000,
1864 			CTL1000_ENABLE_MASTER | CTL1000_AS_MASTER,
1865 			priv->vct_ctrl1000);
1866 	if (rv)
1867 		return rv;
1868 
1869 	return ret;
1870 }
1871 
1872 static int ksz8873mll_config_aneg(struct phy_device *phydev)
1873 {
1874 	return 0;
1875 }
1876 
1877 static int ksz886x_config_mdix(struct phy_device *phydev, u8 ctrl)
1878 {
1879 	u16 val;
1880 
1881 	switch (ctrl) {
1882 	case ETH_TP_MDI:
1883 		val = KSZ886X_BMCR_DISABLE_AUTO_MDIX;
1884 		break;
1885 	case ETH_TP_MDI_X:
1886 		/* Note: The naming of the bit KSZ886X_BMCR_FORCE_MDI is bit
1887 		 * counter intuitive, the "-X" in "1 = Force MDI" in the data
1888 		 * sheet seems to be missing:
1889 		 * 1 = Force MDI (sic!) (transmit on RX+/RX- pins)
1890 		 * 0 = Normal operation (transmit on TX+/TX- pins)
1891 		 */
1892 		val = KSZ886X_BMCR_DISABLE_AUTO_MDIX | KSZ886X_BMCR_FORCE_MDI;
1893 		break;
1894 	case ETH_TP_MDI_AUTO:
1895 		val = 0;
1896 		break;
1897 	default:
1898 		return 0;
1899 	}
1900 
1901 	return phy_modify(phydev, MII_BMCR,
1902 			  KSZ886X_BMCR_HP_MDIX | KSZ886X_BMCR_FORCE_MDI |
1903 			  KSZ886X_BMCR_DISABLE_AUTO_MDIX,
1904 			  KSZ886X_BMCR_HP_MDIX | val);
1905 }
1906 
1907 static int ksz886x_config_aneg(struct phy_device *phydev)
1908 {
1909 	int ret;
1910 
1911 	ret = genphy_config_aneg(phydev);
1912 	if (ret)
1913 		return ret;
1914 
1915 	if (phydev->autoneg != AUTONEG_ENABLE) {
1916 		/* When autonegotiation is disabled, we need to manually force
1917 		 * the link state. If we don't do this, the PHY will keep
1918 		 * sending Fast Link Pulses (FLPs) which are part of the
1919 		 * autonegotiation process. This is not desired when
1920 		 * autonegotiation is off.
1921 		 */
1922 		ret = phy_set_bits(phydev, MII_KSZPHY_CTRL,
1923 				   KSZ886X_CTRL_FORCE_LINK);
1924 		if (ret)
1925 			return ret;
1926 	} else {
1927 		/* If we had previously forced the link state, we need to
1928 		 * clear KSZ886X_CTRL_FORCE_LINK bit now. Otherwise, the PHY
1929 		 * will not perform autonegotiation.
1930 		 */
1931 		ret = phy_clear_bits(phydev, MII_KSZPHY_CTRL,
1932 				     KSZ886X_CTRL_FORCE_LINK);
1933 		if (ret)
1934 			return ret;
1935 	}
1936 
1937 	/* The MDI-X configuration is automatically changed by the PHY after
1938 	 * switching from autoneg off to on. So, take MDI-X configuration under
1939 	 * own control and set it after autoneg configuration was done.
1940 	 */
1941 	return ksz886x_config_mdix(phydev, phydev->mdix_ctrl);
1942 }
1943 
1944 static int ksz886x_mdix_update(struct phy_device *phydev)
1945 {
1946 	int ret;
1947 
1948 	ret = phy_read(phydev, MII_BMCR);
1949 	if (ret < 0)
1950 		return ret;
1951 
1952 	if (ret & KSZ886X_BMCR_DISABLE_AUTO_MDIX) {
1953 		if (ret & KSZ886X_BMCR_FORCE_MDI)
1954 			phydev->mdix_ctrl = ETH_TP_MDI_X;
1955 		else
1956 			phydev->mdix_ctrl = ETH_TP_MDI;
1957 	} else {
1958 		phydev->mdix_ctrl = ETH_TP_MDI_AUTO;
1959 	}
1960 
1961 	ret = phy_read(phydev, MII_KSZPHY_CTRL);
1962 	if (ret < 0)
1963 		return ret;
1964 
1965 	/* Same reverse logic as KSZ886X_BMCR_FORCE_MDI */
1966 	if (ret & KSZ886X_CTRL_MDIX_STAT)
1967 		phydev->mdix = ETH_TP_MDI_X;
1968 	else
1969 		phydev->mdix = ETH_TP_MDI;
1970 
1971 	return 0;
1972 }
1973 
1974 static int ksz886x_read_status(struct phy_device *phydev)
1975 {
1976 	int ret;
1977 
1978 	ret = ksz886x_mdix_update(phydev);
1979 	if (ret < 0)
1980 		return ret;
1981 
1982 	return genphy_read_status(phydev);
1983 }
1984 
1985 static int ksz9477_mdix_update(struct phy_device *phydev)
1986 {
1987 	if (phydev->mdix_ctrl != ETH_TP_MDI_AUTO)
1988 		phydev->mdix = phydev->mdix_ctrl;
1989 	else
1990 		phydev->mdix = ETH_TP_MDI_INVALID;
1991 
1992 	return 0;
1993 }
1994 
1995 static int ksz9477_read_mdix_ctrl(struct phy_device *phydev)
1996 {
1997 	int val;
1998 
1999 	val = phy_read(phydev, MII_KSZ9131_AUTO_MDIX);
2000 	if (val < 0)
2001 		return val;
2002 
2003 	if (!(val & MII_KSZ9131_AUTO_MDIX_SWAP_OFF))
2004 		phydev->mdix_ctrl = ETH_TP_MDI_AUTO;
2005 	else if (val & MII_KSZ9131_AUTO_MDI_SET)
2006 		phydev->mdix_ctrl = ETH_TP_MDI;
2007 	else
2008 		phydev->mdix_ctrl = ETH_TP_MDI_X;
2009 
2010 	return 0;
2011 }
2012 
2013 static int ksz9477_read_status(struct phy_device *phydev)
2014 {
2015 	int ret;
2016 
2017 	ret = ksz9477_mdix_update(phydev);
2018 	if (ret)
2019 		return ret;
2020 
2021 	return genphy_read_status(phydev);
2022 }
2023 
2024 static int ksz9477_config_aneg(struct phy_device *phydev)
2025 {
2026 	int ret;
2027 
2028 	ret = ksz9131_config_mdix(phydev, phydev->mdix_ctrl);
2029 	if (ret)
2030 		return ret;
2031 
2032 	return genphy_config_aneg(phydev);
2033 }
2034 
2035 struct ksz9477_errata_write {
2036 	u8 dev_addr;
2037 	u8 reg_addr;
2038 	u16 val;
2039 };
2040 
2041 static const struct ksz9477_errata_write ksz9477_errata_writes[] = {
2042 	 /* Register settings are needed to improve PHY receive performance */
2043 	{0x01, 0x6f, 0xdd0b},
2044 	{0x01, 0x8f, 0x6032},
2045 	{0x01, 0x9d, 0x248c},
2046 	{0x01, 0x75, 0x0060},
2047 	{0x01, 0xd3, 0x7777},
2048 	{0x1c, 0x06, 0x3008},
2049 	{0x1c, 0x08, 0x2000},
2050 
2051 	/* Transmit waveform amplitude can be improved (1000BASE-T, 100BASE-TX, 10BASE-Te) */
2052 	{0x1c, 0x04, 0x00d0},
2053 
2054 	/* Register settings are required to meet data sheet supply current specifications */
2055 	{0x1c, 0x13, 0x6eff},
2056 	{0x1c, 0x14, 0xe6ff},
2057 	{0x1c, 0x15, 0x6eff},
2058 	{0x1c, 0x16, 0xe6ff},
2059 	{0x1c, 0x17, 0x00ff},
2060 	{0x1c, 0x18, 0x43ff},
2061 	{0x1c, 0x19, 0xc3ff},
2062 	{0x1c, 0x1a, 0x6fff},
2063 	{0x1c, 0x1b, 0x07ff},
2064 	{0x1c, 0x1c, 0x0fff},
2065 	{0x1c, 0x1d, 0xe7ff},
2066 	{0x1c, 0x1e, 0xefff},
2067 	{0x1c, 0x20, 0xeeee},
2068 };
2069 
2070 static int ksz9477_phy_errata(struct phy_device *phydev)
2071 {
2072 	int err;
2073 	int i;
2074 
2075 	/* Apply PHY settings to address errata listed in
2076 	 * KSZ9477, KSZ9897, KSZ9896, KSZ9567, KSZ8565
2077 	 * Silicon Errata and Data Sheet Clarification documents.
2078 	 *
2079 	 * Document notes: Before configuring the PHY MMD registers, it is
2080 	 * necessary to set the PHY to 100 Mbps speed with auto-negotiation
2081 	 * disabled by writing to register 0xN100-0xN101. After writing the
2082 	 * MMD registers, and after all errata workarounds that involve PHY
2083 	 * register settings, write register 0xN100-0xN101 again to enable
2084 	 * and restart auto-negotiation.
2085 	 */
2086 	err = phy_write(phydev, MII_BMCR, BMCR_SPEED100 | BMCR_FULLDPLX);
2087 	if (err)
2088 		return err;
2089 
2090 	for (i = 0; i < ARRAY_SIZE(ksz9477_errata_writes); ++i) {
2091 		const struct ksz9477_errata_write *errata = &ksz9477_errata_writes[i];
2092 
2093 		err = phy_write_mmd(phydev, errata->dev_addr, errata->reg_addr, errata->val);
2094 		if (err)
2095 			return err;
2096 	}
2097 
2098 	return genphy_restart_aneg(phydev);
2099 }
2100 
2101 static int ksz9477_config_init(struct phy_device *phydev)
2102 {
2103 	int err;
2104 
2105 	/* Only KSZ9897 family of switches needs this fix. */
2106 	if ((phydev->phy_id & 0xf) == 1) {
2107 		err = ksz9477_phy_errata(phydev);
2108 		if (err)
2109 			return err;
2110 	}
2111 
2112 	/* Read initial MDI-X config state. So, we do not need to poll it
2113 	 * later on.
2114 	 */
2115 	err = ksz9477_read_mdix_ctrl(phydev);
2116 	if (err)
2117 		return err;
2118 
2119 	return kszphy_config_init(phydev);
2120 }
2121 
2122 static int kszphy_get_sset_count(struct phy_device *phydev)
2123 {
2124 	return ARRAY_SIZE(kszphy_hw_stats);
2125 }
2126 
2127 static void kszphy_get_strings(struct phy_device *phydev, u8 *data)
2128 {
2129 	int i;
2130 
2131 	for (i = 0; i < ARRAY_SIZE(kszphy_hw_stats); i++)
2132 		ethtool_puts(&data, kszphy_hw_stats[i].string);
2133 }
2134 
2135 static u64 kszphy_get_stat(struct phy_device *phydev, int i)
2136 {
2137 	struct kszphy_hw_stat stat = kszphy_hw_stats[i];
2138 	struct kszphy_priv *priv = phydev->priv;
2139 	int val;
2140 	u64 ret;
2141 
2142 	val = phy_read(phydev, stat.reg);
2143 	if (val < 0) {
2144 		ret = U64_MAX;
2145 	} else {
2146 		val = val & ((1 << stat.bits) - 1);
2147 		priv->stats[i] += val;
2148 		ret = priv->stats[i];
2149 	}
2150 
2151 	return ret;
2152 }
2153 
2154 static void kszphy_get_stats(struct phy_device *phydev,
2155 			     struct ethtool_stats *stats, u64 *data)
2156 {
2157 	int i;
2158 
2159 	for (i = 0; i < ARRAY_SIZE(kszphy_hw_stats); i++)
2160 		data[i] = kszphy_get_stat(phydev, i);
2161 }
2162 
2163 /* KSZ9477 PHY RXER Counter. Probably supported by other PHYs like KSZ9313,
2164  * etc. The counter is incremented when the PHY receives a frame with one or
2165  * more symbol errors. The counter is cleared when the register is read.
2166  */
2167 #define MII_KSZ9477_PHY_RXER_COUNTER	0x15
2168 
2169 static int kszphy_update_stats(struct phy_device *phydev)
2170 {
2171 	struct kszphy_priv *priv = phydev->priv;
2172 	int ret;
2173 
2174 	ret = phy_read(phydev, MII_KSZ9477_PHY_RXER_COUNTER);
2175 	if (ret < 0)
2176 		return ret;
2177 
2178 	priv->phy_stats.rx_err_pkt_cnt += ret;
2179 
2180 	return 0;
2181 }
2182 
2183 static void kszphy_get_phy_stats(struct phy_device *phydev,
2184 				 struct ethtool_eth_phy_stats *eth_stats,
2185 				 struct ethtool_phy_stats *stats)
2186 {
2187 	struct kszphy_priv *priv = phydev->priv;
2188 
2189 	stats->rx_errors = priv->phy_stats.rx_err_pkt_cnt;
2190 }
2191 
2192 /* Base register for Signal Quality Indicator (SQI) - Channel A
2193  *
2194  * MMD Address: MDIO_MMD_PMAPMD (0x01)
2195  * Register:    0xAC (Channel A)
2196  * Each channel (pair) has its own register:
2197  *   Channel A: 0xAC
2198  *   Channel B: 0xAD
2199  *   Channel C: 0xAE
2200  *   Channel D: 0xAF
2201  */
2202 #define KSZ9477_MMD_SIGNAL_QUALITY_CHAN_A	0xac
2203 
2204 /* SQI field mask for bits [14:8]
2205  *
2206  * SQI indicates relative quality of the signal.
2207  * A lower value indicates better signal quality.
2208  */
2209 #define KSZ9477_MMD_SQI_MASK			GENMASK(14, 8)
2210 
2211 #define KSZ9477_MAX_CHANNELS			4
2212 #define KSZ9477_SQI_MAX				7
2213 
2214 /* Number of SQI samples to average for a stable result.
2215  *
2216  * Reference: KSZ9477S Datasheet DS00002392C, Section 4.1.11 (page 26)
2217  * For noisy environments, a minimum of 30–50 readings is recommended.
2218  */
2219 #define KSZ9477_SQI_SAMPLE_COUNT		40
2220 
2221 /* The hardware SQI register provides a raw value from 0-127, where a lower
2222  * value indicates better signal quality. However, empirical testing has
2223  * shown that only the 0-7 range is relevant for a functional link. A raw
2224  * value of 8 or higher was measured directly before link drop. This aligns
2225  * with the OPEN Alliance recommendation that SQI=0 should represent the
2226  * pre-failure state.
2227  *
2228  * This table provides a non-linear mapping from the useful raw hardware
2229  * values (0-7) to the standard 0-7 SQI scale, where higher is better.
2230  */
2231 static const u8 ksz_sqi_mapping[] = {
2232 	7, /* raw 0 -> SQI 7 */
2233 	7, /* raw 1 -> SQI 7 */
2234 	6, /* raw 2 -> SQI 6 */
2235 	5, /* raw 3 -> SQI 5 */
2236 	4, /* raw 4 -> SQI 4 */
2237 	3, /* raw 5 -> SQI 3 */
2238 	2, /* raw 6 -> SQI 2 */
2239 	1, /* raw 7 -> SQI 1 */
2240 };
2241 
2242 /**
2243  * kszphy_get_sqi - Read, average, and map Signal Quality Index (SQI)
2244  * @phydev: the PHY device
2245  *
2246  * This function reads and processes the raw Signal Quality Index from the
2247  * PHY. Based on empirical testing, a raw value of 8 or higher indicates a
2248  * pre-failure state and is mapped to SQI 0. Raw values from 0-7 are
2249  * mapped to the standard 0-7 SQI scale via a lookup table.
2250  *
2251  * Return: SQI value (0–7), or a negative errno on failure.
2252  */
2253 static int kszphy_get_sqi(struct phy_device *phydev)
2254 {
2255 	int sum[KSZ9477_MAX_CHANNELS] = { 0 };
2256 	int worst_sqi = KSZ9477_SQI_MAX;
2257 	int i, val, raw_sqi, ch;
2258 	u8 channels;
2259 
2260 	/* Determine applicable channels based on link speed */
2261 	if (phydev->speed == SPEED_1000)
2262 		channels = 4;
2263 	else if (phydev->speed == SPEED_100)
2264 		channels = 1;
2265 	else
2266 		return -EOPNOTSUPP;
2267 
2268 	/* Sample and accumulate SQI readings for each pair (currently only one).
2269 	 *
2270 	 * Reference: KSZ9477S Datasheet DS00002392C, Section 4.1.11 (page 26)
2271 	 * - The SQI register is updated every 2 µs.
2272 	 * - Values may fluctuate significantly, even in low-noise environments.
2273 	 * - For reliable estimation, average a minimum of 30–50 samples
2274 	 *   (recommended for noisy environments)
2275 	 * - In noisy environments, individual readings are highly unreliable.
2276 	 *
2277 	 * We use 40 samples per pair with a delay of 3 µs between each
2278 	 * read to ensure new values are captured (2 µs update interval).
2279 	 */
2280 	for (i = 0; i < KSZ9477_SQI_SAMPLE_COUNT; i++) {
2281 		for (ch = 0; ch < channels; ch++) {
2282 			val = phy_read_mmd(phydev, MDIO_MMD_PMAPMD,
2283 					   KSZ9477_MMD_SIGNAL_QUALITY_CHAN_A + ch);
2284 			if (val < 0)
2285 				return val;
2286 
2287 			raw_sqi = FIELD_GET(KSZ9477_MMD_SQI_MASK, val);
2288 			sum[ch] += raw_sqi;
2289 
2290 			/* We communicate with the PHY via MDIO via SPI or
2291 			 * I2C, which is relatively slow. At least slower than
2292 			 * the update interval of the SQI register.
2293 			 * So, we can skip the delay between reads.
2294 			 */
2295 		}
2296 	}
2297 
2298 	/* Calculate average for each channel and find the worst SQI */
2299 	for (ch = 0; ch < channels; ch++) {
2300 		int avg_raw_sqi = sum[ch] / KSZ9477_SQI_SAMPLE_COUNT;
2301 		int mapped_sqi;
2302 
2303 		/* Handle the pre-fail/failed state first. */
2304 		if (avg_raw_sqi >= ARRAY_SIZE(ksz_sqi_mapping))
2305 			mapped_sqi = 0;
2306 		else
2307 			/* Use the lookup table for the good signal range. */
2308 			mapped_sqi = ksz_sqi_mapping[avg_raw_sqi];
2309 
2310 		if (mapped_sqi < worst_sqi)
2311 			worst_sqi = mapped_sqi;
2312 	}
2313 
2314 	return worst_sqi;
2315 }
2316 
2317 static int kszphy_get_sqi_max(struct phy_device *phydev)
2318 {
2319 	return KSZ9477_SQI_MAX;
2320 }
2321 
2322 static void kszphy_enable_clk(struct phy_device *phydev)
2323 {
2324 	struct kszphy_priv *priv = phydev->priv;
2325 
2326 	if (!priv->clk_enable && priv->clk) {
2327 		clk_prepare_enable(priv->clk);
2328 		priv->clk_enable = true;
2329 	}
2330 }
2331 
2332 static void kszphy_disable_clk(struct phy_device *phydev)
2333 {
2334 	struct kszphy_priv *priv = phydev->priv;
2335 
2336 	if (priv->clk_enable && priv->clk) {
2337 		clk_disable_unprepare(priv->clk);
2338 		priv->clk_enable = false;
2339 	}
2340 }
2341 
2342 static int kszphy_generic_resume(struct phy_device *phydev)
2343 {
2344 	kszphy_enable_clk(phydev);
2345 
2346 	return genphy_resume(phydev);
2347 }
2348 
2349 static int kszphy_generic_suspend(struct phy_device *phydev)
2350 {
2351 	int ret;
2352 
2353 	ret = genphy_suspend(phydev);
2354 	if (ret)
2355 		return ret;
2356 
2357 	kszphy_disable_clk(phydev);
2358 
2359 	return 0;
2360 }
2361 
2362 static int kszphy_suspend(struct phy_device *phydev)
2363 {
2364 	/* Disable PHY Interrupts */
2365 	if (phy_interrupt_is_valid(phydev)) {
2366 		phydev->interrupts = PHY_INTERRUPT_DISABLED;
2367 		if (phydev->drv->config_intr)
2368 			phydev->drv->config_intr(phydev);
2369 	}
2370 
2371 	return kszphy_generic_suspend(phydev);
2372 }
2373 
2374 static void kszphy_parse_led_mode(struct phy_device *phydev)
2375 {
2376 	const struct kszphy_type *type = phydev->drv->driver_data;
2377 	const struct device_node *np = phydev->mdio.dev.of_node;
2378 	struct kszphy_priv *priv = phydev->priv;
2379 	int ret;
2380 
2381 	if (type && type->led_mode_reg) {
2382 		ret = of_property_read_u32(np, "micrel,led-mode",
2383 					   &priv->led_mode);
2384 
2385 		if (ret)
2386 			priv->led_mode = -1;
2387 
2388 		if (priv->led_mode > 3) {
2389 			phydev_err(phydev, "invalid led mode: 0x%02x\n",
2390 				   priv->led_mode);
2391 			priv->led_mode = -1;
2392 		}
2393 	} else {
2394 		priv->led_mode = -1;
2395 	}
2396 }
2397 
2398 static int kszphy_resume(struct phy_device *phydev)
2399 {
2400 	int ret;
2401 
2402 	ret = kszphy_generic_resume(phydev);
2403 	if (ret)
2404 		return ret;
2405 
2406 	/* After switching from power-down to normal mode, an internal global
2407 	 * reset is automatically generated. Wait a minimum of 1 ms before
2408 	 * read/write access to the PHY registers.
2409 	 */
2410 	usleep_range(1000, 2000);
2411 
2412 	ret = kszphy_config_reset(phydev);
2413 	if (ret)
2414 		return ret;
2415 
2416 	/* Enable PHY Interrupts */
2417 	if (phy_interrupt_is_valid(phydev)) {
2418 		phydev->interrupts = PHY_INTERRUPT_ENABLED;
2419 		if (phydev->drv->config_intr)
2420 			phydev->drv->config_intr(phydev);
2421 	}
2422 
2423 	return 0;
2424 }
2425 
2426 /* Because of errata DS80000700A, receiver error following software
2427  * power down. Suspend and resume callbacks only disable and enable
2428  * external rmii reference clock.
2429  */
2430 static int ksz8041_resume(struct phy_device *phydev)
2431 {
2432 	kszphy_enable_clk(phydev);
2433 
2434 	return 0;
2435 }
2436 
2437 static int ksz8041_suspend(struct phy_device *phydev)
2438 {
2439 	kszphy_disable_clk(phydev);
2440 
2441 	return 0;
2442 }
2443 
2444 static int ksz9477_resume(struct phy_device *phydev)
2445 {
2446 	int ret;
2447 
2448 	/* No need to initialize registers if not powered down. */
2449 	ret = phy_read(phydev, MII_BMCR);
2450 	if (ret < 0)
2451 		return ret;
2452 	if (!(ret & BMCR_PDOWN))
2453 		return 0;
2454 
2455 	genphy_resume(phydev);
2456 
2457 	/* After switching from power-down to normal mode, an internal global
2458 	 * reset is automatically generated. Wait a minimum of 1 ms before
2459 	 * read/write access to the PHY registers.
2460 	 */
2461 	usleep_range(1000, 2000);
2462 
2463 	/* Only KSZ9897 family of switches needs this fix. */
2464 	if ((phydev->phy_id & 0xf) == 1) {
2465 		ret = ksz9477_phy_errata(phydev);
2466 		if (ret)
2467 			return ret;
2468 	}
2469 
2470 	/* Enable PHY Interrupts */
2471 	if (phy_interrupt_is_valid(phydev)) {
2472 		phydev->interrupts = PHY_INTERRUPT_ENABLED;
2473 		if (phydev->drv->config_intr)
2474 			phydev->drv->config_intr(phydev);
2475 	}
2476 
2477 	return 0;
2478 }
2479 
2480 static int ksz8061_resume(struct phy_device *phydev)
2481 {
2482 	int ret;
2483 
2484 	/* This function can be called twice when the Ethernet device is on. */
2485 	ret = phy_read(phydev, MII_BMCR);
2486 	if (ret < 0)
2487 		return ret;
2488 	if (!(ret & BMCR_PDOWN))
2489 		return 0;
2490 
2491 	ret = kszphy_generic_resume(phydev);
2492 	if (ret)
2493 		return ret;
2494 
2495 	usleep_range(1000, 2000);
2496 
2497 	/* Re-program the value after chip is reset. */
2498 	ret = phy_write_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_DEVID1, 0xB61A);
2499 	if (ret)
2500 		return ret;
2501 
2502 	/* Enable PHY Interrupts */
2503 	if (phy_interrupt_is_valid(phydev)) {
2504 		phydev->interrupts = PHY_INTERRUPT_ENABLED;
2505 		if (phydev->drv->config_intr)
2506 			phydev->drv->config_intr(phydev);
2507 	}
2508 
2509 	return 0;
2510 }
2511 
2512 static int ksz8061_suspend(struct phy_device *phydev)
2513 {
2514 	return kszphy_suspend(phydev);
2515 }
2516 
2517 static int kszphy_probe(struct phy_device *phydev)
2518 {
2519 	const struct kszphy_type *type = phydev->drv->driver_data;
2520 	const struct device_node *np = phydev->mdio.dev.of_node;
2521 	struct kszphy_priv *priv;
2522 	struct clk *clk;
2523 
2524 	priv = devm_kzalloc(&phydev->mdio.dev, sizeof(*priv), GFP_KERNEL);
2525 	if (!priv)
2526 		return -ENOMEM;
2527 
2528 	phydev->priv = priv;
2529 
2530 	priv->type = type;
2531 
2532 	kszphy_parse_led_mode(phydev);
2533 
2534 	clk = devm_clk_get_optional_enabled(&phydev->mdio.dev, "rmii-ref");
2535 	/* NOTE: clk may be NULL if building without CONFIG_HAVE_CLK */
2536 	if (!IS_ERR_OR_NULL(clk)) {
2537 		unsigned long rate = clk_get_rate(clk);
2538 		bool rmii_ref_clk_sel_25_mhz;
2539 
2540 		if (type)
2541 			priv->rmii_ref_clk_sel = type->has_rmii_ref_clk_sel;
2542 		rmii_ref_clk_sel_25_mhz = of_property_read_bool(np,
2543 				"micrel,rmii-reference-clock-select-25-mhz");
2544 
2545 		if (rate > 24500000 && rate < 25500000) {
2546 			priv->rmii_ref_clk_sel_val = rmii_ref_clk_sel_25_mhz;
2547 		} else if (rate > 49500000 && rate < 50500000) {
2548 			priv->rmii_ref_clk_sel_val = !rmii_ref_clk_sel_25_mhz;
2549 		} else {
2550 			phydev_err(phydev, "Clock rate out of range: %ld\n",
2551 				   rate);
2552 			return -EINVAL;
2553 		}
2554 	} else if (!clk) {
2555 		/* unnamed clock from the generic ethernet-phy binding */
2556 		clk = devm_clk_get_optional_enabled(&phydev->mdio.dev, NULL);
2557 	}
2558 
2559 	if (IS_ERR(clk))
2560 		return PTR_ERR(clk);
2561 
2562 	clk_disable_unprepare(clk);
2563 	priv->clk = clk;
2564 
2565 	if (ksz8041_fiber_mode(phydev))
2566 		phydev->port = PORT_FIBRE;
2567 
2568 	/* Support legacy board-file configuration */
2569 	if (phydev->dev_flags & MICREL_PHY_50MHZ_CLK) {
2570 		priv->rmii_ref_clk_sel = true;
2571 		priv->rmii_ref_clk_sel_val = true;
2572 	}
2573 
2574 	return 0;
2575 }
2576 
2577 static int lan8814_cable_test_start(struct phy_device *phydev)
2578 {
2579 	/* If autoneg is enabled, we won't be able to test cross pair
2580 	 * short. In this case, the PHY will "detect" a link and
2581 	 * confuse the internal state machine - disable auto neg here.
2582 	 * Set the speed to 1000mbit and full duplex.
2583 	 */
2584 	return phy_modify(phydev, MII_BMCR, BMCR_ANENABLE | BMCR_SPEED100,
2585 			  BMCR_SPEED1000 | BMCR_FULLDPLX);
2586 }
2587 
2588 static int ksz886x_cable_test_start(struct phy_device *phydev)
2589 {
2590 	if (phydev->dev_flags & MICREL_KSZ8_P1_ERRATA)
2591 		return -EOPNOTSUPP;
2592 
2593 	/* If autoneg is enabled, we won't be able to test cross pair
2594 	 * short. In this case, the PHY will "detect" a link and
2595 	 * confuse the internal state machine - disable auto neg here.
2596 	 * If autoneg is disabled, we should set the speed to 10mbit.
2597 	 */
2598 	return phy_clear_bits(phydev, MII_BMCR, BMCR_ANENABLE | BMCR_SPEED100);
2599 }
2600 
2601 static __always_inline int ksz886x_cable_test_result_trans(u16 status, u16 mask)
2602 {
2603 	switch (FIELD_GET(mask, status)) {
2604 	case KSZ8081_LMD_STAT_NORMAL:
2605 		return ETHTOOL_A_CABLE_RESULT_CODE_OK;
2606 	case KSZ8081_LMD_STAT_SHORT:
2607 		return ETHTOOL_A_CABLE_RESULT_CODE_SAME_SHORT;
2608 	case KSZ8081_LMD_STAT_OPEN:
2609 		return ETHTOOL_A_CABLE_RESULT_CODE_OPEN;
2610 	case KSZ8081_LMD_STAT_FAIL:
2611 		fallthrough;
2612 	default:
2613 		return ETHTOOL_A_CABLE_RESULT_CODE_UNSPEC;
2614 	}
2615 }
2616 
2617 static __always_inline bool ksz886x_cable_test_failed(u16 status, u16 mask)
2618 {
2619 	return FIELD_GET(mask, status) ==
2620 		KSZ8081_LMD_STAT_FAIL;
2621 }
2622 
2623 static __always_inline bool ksz886x_cable_test_fault_length_valid(u16 status, u16 mask)
2624 {
2625 	switch (FIELD_GET(mask, status)) {
2626 	case KSZ8081_LMD_STAT_OPEN:
2627 		fallthrough;
2628 	case KSZ8081_LMD_STAT_SHORT:
2629 		return true;
2630 	}
2631 	return false;
2632 }
2633 
2634 static __always_inline int ksz886x_cable_test_fault_length(struct phy_device *phydev,
2635 							   u16 status, u16 data_mask)
2636 {
2637 	int dt;
2638 
2639 	/* According to the data sheet the distance to the fault is
2640 	 * DELTA_TIME * 0.4 meters for ksz phys.
2641 	 * (DELTA_TIME - 22) * 0.8 for lan8814 phy.
2642 	 */
2643 	dt = FIELD_GET(data_mask, status);
2644 
2645 	if (phydev_id_compare(phydev, PHY_ID_LAN8814))
2646 		return ((dt - 22) * 800) / 10;
2647 	else
2648 		return (dt * 400) / 10;
2649 }
2650 
2651 static int ksz886x_cable_test_wait_for_completion(struct phy_device *phydev)
2652 {
2653 	const struct kszphy_type *type = phydev->drv->driver_data;
2654 	int val, ret;
2655 
2656 	ret = phy_read_poll_timeout(phydev, type->cable_diag_reg, val,
2657 				    !(val & KSZ8081_LMD_ENABLE_TEST),
2658 				    30000, 100000, true);
2659 
2660 	return ret < 0 ? ret : 0;
2661 }
2662 
2663 static int lan8814_cable_test_one_pair(struct phy_device *phydev, int pair)
2664 {
2665 	static const int ethtool_pair[] = { ETHTOOL_A_CABLE_PAIR_A,
2666 					    ETHTOOL_A_CABLE_PAIR_B,
2667 					    ETHTOOL_A_CABLE_PAIR_C,
2668 					    ETHTOOL_A_CABLE_PAIR_D,
2669 					  };
2670 	u32 fault_length;
2671 	int ret;
2672 	int val;
2673 
2674 	val = KSZ8081_LMD_ENABLE_TEST;
2675 	val = val | (pair << LAN8814_PAIR_BIT_SHIFT);
2676 
2677 	ret = phy_write(phydev, LAN8814_CABLE_DIAG, val);
2678 	if (ret < 0)
2679 		return ret;
2680 
2681 	ret = ksz886x_cable_test_wait_for_completion(phydev);
2682 	if (ret)
2683 		return ret;
2684 
2685 	val = phy_read(phydev, LAN8814_CABLE_DIAG);
2686 	if (val < 0)
2687 		return val;
2688 
2689 	if (ksz886x_cable_test_failed(val, LAN8814_CABLE_DIAG_STAT_MASK))
2690 		return -EAGAIN;
2691 
2692 	ret = ethnl_cable_test_result(phydev, ethtool_pair[pair],
2693 				      ksz886x_cable_test_result_trans(val,
2694 								      LAN8814_CABLE_DIAG_STAT_MASK
2695 								      ));
2696 	if (ret)
2697 		return ret;
2698 
2699 	if (!ksz886x_cable_test_fault_length_valid(val, LAN8814_CABLE_DIAG_STAT_MASK))
2700 		return 0;
2701 
2702 	fault_length = ksz886x_cable_test_fault_length(phydev, val,
2703 						       LAN8814_CABLE_DIAG_VCT_DATA_MASK);
2704 
2705 	return ethnl_cable_test_fault_length(phydev, ethtool_pair[pair], fault_length);
2706 }
2707 
2708 static int ksz886x_cable_test_one_pair(struct phy_device *phydev, int pair)
2709 {
2710 	static const int ethtool_pair[] = {
2711 		ETHTOOL_A_CABLE_PAIR_A,
2712 		ETHTOOL_A_CABLE_PAIR_B,
2713 	};
2714 	int ret, val, mdix;
2715 	u32 fault_length;
2716 
2717 	/* There is no way to choice the pair, like we do one ksz9031.
2718 	 * We can workaround this limitation by using the MDI-X functionality.
2719 	 */
2720 	if (pair == 0)
2721 		mdix = ETH_TP_MDI;
2722 	else
2723 		mdix = ETH_TP_MDI_X;
2724 
2725 	switch (phydev->phy_id & MICREL_PHY_ID_MASK) {
2726 	case PHY_ID_KSZ8081:
2727 		ret = ksz8081_config_mdix(phydev, mdix);
2728 		break;
2729 	case PHY_ID_KSZ886X:
2730 		ret = ksz886x_config_mdix(phydev, mdix);
2731 		break;
2732 	default:
2733 		ret = -ENODEV;
2734 	}
2735 
2736 	if (ret)
2737 		return ret;
2738 
2739 	/* Now we are ready to fire. This command will send a 100ns pulse
2740 	 * to the pair.
2741 	 */
2742 	ret = phy_write(phydev, KSZ8081_LMD, KSZ8081_LMD_ENABLE_TEST);
2743 	if (ret)
2744 		return ret;
2745 
2746 	ret = ksz886x_cable_test_wait_for_completion(phydev);
2747 	if (ret)
2748 		return ret;
2749 
2750 	val = phy_read(phydev, KSZ8081_LMD);
2751 	if (val < 0)
2752 		return val;
2753 
2754 	if (ksz886x_cable_test_failed(val, KSZ8081_LMD_STAT_MASK))
2755 		return -EAGAIN;
2756 
2757 	ret = ethnl_cable_test_result(phydev, ethtool_pair[pair],
2758 				      ksz886x_cable_test_result_trans(val, KSZ8081_LMD_STAT_MASK));
2759 	if (ret)
2760 		return ret;
2761 
2762 	if (!ksz886x_cable_test_fault_length_valid(val, KSZ8081_LMD_STAT_MASK))
2763 		return 0;
2764 
2765 	fault_length = ksz886x_cable_test_fault_length(phydev, val, KSZ8081_LMD_DELTA_TIME_MASK);
2766 
2767 	return ethnl_cable_test_fault_length(phydev, ethtool_pair[pair], fault_length);
2768 }
2769 
2770 static int ksz886x_cable_test_get_status(struct phy_device *phydev,
2771 					 bool *finished)
2772 {
2773 	const struct kszphy_type *type = phydev->drv->driver_data;
2774 	unsigned long pair_mask = type->pair_mask;
2775 	int retries = 20;
2776 	int ret = 0;
2777 	int pair;
2778 
2779 	*finished = false;
2780 
2781 	/* Try harder if link partner is active */
2782 	while (pair_mask && retries--) {
2783 		for_each_set_bit(pair, &pair_mask, 4) {
2784 			if (type->cable_diag_reg == LAN8814_CABLE_DIAG)
2785 				ret = lan8814_cable_test_one_pair(phydev, pair);
2786 			else
2787 				ret = ksz886x_cable_test_one_pair(phydev, pair);
2788 			if (ret == -EAGAIN)
2789 				continue;
2790 			if (ret < 0)
2791 				return ret;
2792 			clear_bit(pair, &pair_mask);
2793 		}
2794 		/* If link partner is in autonegotiation mode it will send 2ms
2795 		 * of FLPs with at least 6ms of silence.
2796 		 * Add 2ms sleep to have better chances to hit this silence.
2797 		 */
2798 		if (pair_mask)
2799 			msleep(2);
2800 	}
2801 
2802 	*finished = true;
2803 
2804 	return ret;
2805 }
2806 
2807 /**
2808  * LAN8814_PAGE_PCS - Selects Extended Page 0.
2809  *
2810  * This page contains timers used for auto-negotiation, debug registers and
2811  * register to configure fast link failure.
2812  */
2813 #define LAN8814_PAGE_PCS 0
2814 
2815 /**
2816  * LAN8814_PAGE_AFE_PMA - Selects Extended Page 1.
2817  *
2818  * This page appears to control the Analog Front-End (AFE) and Physical
2819  * Medium Attachment (PMA) layers. It is used to access registers like
2820  * LAN8814_PD_CONTROLS and LAN8814_LINK_QUALITY.
2821  */
2822 #define LAN8814_PAGE_AFE_PMA 1
2823 
2824 /**
2825  * LAN8814_PAGE_PCS_DIGITAL - Selects Extended Page 2.
2826  *
2827  * This page seems dedicated to the Physical Coding Sublayer (PCS) and other
2828  * digital logic. It is used for MDI-X alignment (LAN8814_ALIGN_SWAP) and EEE
2829  * state (LAN8814_EEE_STATE) in the LAN8814, and is repurposed for statistics
2830  * and self-test counters in the LAN8842.
2831  */
2832 #define LAN8814_PAGE_PCS_DIGITAL 2
2833 
2834 /**
2835  * LAN8814_PAGE_COMMON_REGS - Selects Extended Page 4.
2836  *
2837  * This page contains device-common registers that affect the entire chip.
2838  * It includes controls for chip-level resets, strap status, GPIO,
2839  * QSGMII, the shared 1588 PTP block, and the PVT monitor.
2840  */
2841 #define LAN8814_PAGE_COMMON_REGS 4
2842 
2843 /**
2844  * LAN8814_PAGE_PORT_REGS - Selects Extended Page 5.
2845  *
2846  * This page contains port-specific registers that must be accessed
2847  * on a per-port basis. It includes controls for port LEDs, QSGMII PCS,
2848  * rate adaptation FIFOs, and the per-port 1588 TSU block.
2849  */
2850 #define LAN8814_PAGE_PORT_REGS 5
2851 
2852 /**
2853  * LAN8814_PAGE_SYSTEM_CTRL - Selects Extended Page 31.
2854  *
2855  * This page appears to hold fundamental system or global controls. In the
2856  * driver, it is used by the related LAN8804 to access the
2857  * LAN8814_CLOCK_MANAGEMENT register.
2858  */
2859 #define LAN8814_PAGE_SYSTEM_CTRL 31
2860 
2861 #define LAN_EXT_PAGE_ACCESS_CONTROL			0x16
2862 #define LAN_EXT_PAGE_ACCESS_ADDRESS_DATA		0x17
2863 #define LAN_EXT_PAGE_ACCESS_CTRL_EP_FUNC		0x4000
2864 
2865 #define LAN8814_QSGMII_SOFT_RESET			0x43
2866 #define LAN8814_QSGMII_SOFT_RESET_BIT			BIT(0)
2867 #define LAN8814_QSGMII_PCS1G_ANEG_CONFIG		0x13
2868 #define LAN8814_QSGMII_PCS1G_ANEG_CONFIG_ANEG_ENA	BIT(3)
2869 #define LAN8814_ALIGN_SWAP				0x4a
2870 #define LAN8814_ALIGN_TX_A_B_SWAP			0x1
2871 #define LAN8814_ALIGN_TX_A_B_SWAP_MASK			GENMASK(2, 0)
2872 
2873 #define LAN8804_ALIGN_SWAP				0x4a
2874 #define LAN8804_ALIGN_TX_A_B_SWAP			0x1
2875 #define LAN8804_ALIGN_TX_A_B_SWAP_MASK			GENMASK(2, 0)
2876 #define LAN8814_CLOCK_MANAGEMENT			0xd
2877 #define LAN8814_LINK_QUALITY				0x8e
2878 
2879 static int lanphy_read_page_reg(struct phy_device *phydev, int page, u32 addr)
2880 {
2881 	int data;
2882 
2883 	phy_lock_mdio_bus(phydev);
2884 	__phy_write(phydev, LAN_EXT_PAGE_ACCESS_CONTROL, page);
2885 	__phy_write(phydev, LAN_EXT_PAGE_ACCESS_ADDRESS_DATA, addr);
2886 	__phy_write(phydev, LAN_EXT_PAGE_ACCESS_CONTROL,
2887 		    (page | LAN_EXT_PAGE_ACCESS_CTRL_EP_FUNC));
2888 	data = __phy_read(phydev, LAN_EXT_PAGE_ACCESS_ADDRESS_DATA);
2889 	phy_unlock_mdio_bus(phydev);
2890 
2891 	return data;
2892 }
2893 
2894 static int lanphy_write_page_reg(struct phy_device *phydev, int page, u16 addr,
2895 				 u16 val)
2896 {
2897 	phy_lock_mdio_bus(phydev);
2898 	__phy_write(phydev, LAN_EXT_PAGE_ACCESS_CONTROL, page);
2899 	__phy_write(phydev, LAN_EXT_PAGE_ACCESS_ADDRESS_DATA, addr);
2900 	__phy_write(phydev, LAN_EXT_PAGE_ACCESS_CONTROL,
2901 		    page | LAN_EXT_PAGE_ACCESS_CTRL_EP_FUNC);
2902 
2903 	val = __phy_write(phydev, LAN_EXT_PAGE_ACCESS_ADDRESS_DATA, val);
2904 	if (val != 0)
2905 		phydev_err(phydev, "Error: phy_write has returned error %d\n",
2906 			   val);
2907 	phy_unlock_mdio_bus(phydev);
2908 	return val;
2909 }
2910 
2911 static int lanphy_modify_page_reg(struct phy_device *phydev, int page, u16 addr,
2912 				  u16 mask, u16 set)
2913 {
2914 	int ret;
2915 
2916 	phy_lock_mdio_bus(phydev);
2917 	__phy_write(phydev, LAN_EXT_PAGE_ACCESS_CONTROL, page);
2918 	__phy_write(phydev, LAN_EXT_PAGE_ACCESS_ADDRESS_DATA, addr);
2919 	__phy_write(phydev, LAN_EXT_PAGE_ACCESS_CONTROL,
2920 		    (page | LAN_EXT_PAGE_ACCESS_CTRL_EP_FUNC));
2921 	ret = __phy_modify_changed(phydev, LAN_EXT_PAGE_ACCESS_ADDRESS_DATA,
2922 				   mask, set);
2923 	phy_unlock_mdio_bus(phydev);
2924 
2925 	if (ret < 0)
2926 		phydev_err(phydev, "__phy_modify_changed() failed: %pe\n",
2927 			   ERR_PTR(ret));
2928 
2929 	return ret;
2930 }
2931 
2932 static int lan8814_config_ts_intr(struct phy_device *phydev, bool enable)
2933 {
2934 	u16 val = 0;
2935 
2936 	if (enable)
2937 		val = PTP_TSU_INT_EN_PTP_TX_TS_EN_ |
2938 		      PTP_TSU_INT_EN_PTP_TX_TS_OVRFL_EN_ |
2939 		      PTP_TSU_INT_EN_PTP_RX_TS_EN_ |
2940 		      PTP_TSU_INT_EN_PTP_RX_TS_OVRFL_EN_;
2941 
2942 	return lanphy_write_page_reg(phydev, LAN8814_PAGE_PORT_REGS,
2943 				     PTP_TSU_INT_EN, val);
2944 }
2945 
2946 static void lan8814_ptp_rx_ts_get(struct phy_device *phydev,
2947 				  u32 *seconds, u32 *nano_seconds, u16 *seq_id)
2948 {
2949 	*seconds = lanphy_read_page_reg(phydev, LAN8814_PAGE_PORT_REGS,
2950 					PTP_RX_INGRESS_SEC_HI);
2951 	*seconds = (*seconds << 16) |
2952 		   lanphy_read_page_reg(phydev, LAN8814_PAGE_PORT_REGS,
2953 					PTP_RX_INGRESS_SEC_LO);
2954 
2955 	*nano_seconds = lanphy_read_page_reg(phydev, LAN8814_PAGE_PORT_REGS,
2956 					     PTP_RX_INGRESS_NS_HI);
2957 	*nano_seconds = ((*nano_seconds & 0x3fff) << 16) |
2958 			lanphy_read_page_reg(phydev, LAN8814_PAGE_PORT_REGS,
2959 					     PTP_RX_INGRESS_NS_LO);
2960 
2961 	*seq_id = lanphy_read_page_reg(phydev, LAN8814_PAGE_PORT_REGS,
2962 				       PTP_RX_MSG_HEADER2);
2963 }
2964 
2965 static void lan8814_ptp_tx_ts_get(struct phy_device *phydev,
2966 				  u32 *seconds, u32 *nano_seconds, u16 *seq_id)
2967 {
2968 	*seconds = lanphy_read_page_reg(phydev, LAN8814_PAGE_PORT_REGS,
2969 					PTP_TX_EGRESS_SEC_HI);
2970 	*seconds = *seconds << 16 |
2971 		   lanphy_read_page_reg(phydev, LAN8814_PAGE_PORT_REGS,
2972 					PTP_TX_EGRESS_SEC_LO);
2973 
2974 	*nano_seconds = lanphy_read_page_reg(phydev, LAN8814_PAGE_PORT_REGS,
2975 					     PTP_TX_EGRESS_NS_HI);
2976 	*nano_seconds = ((*nano_seconds & 0x3fff) << 16) |
2977 			lanphy_read_page_reg(phydev, LAN8814_PAGE_PORT_REGS,
2978 					     PTP_TX_EGRESS_NS_LO);
2979 
2980 	*seq_id = lanphy_read_page_reg(phydev, LAN8814_PAGE_PORT_REGS,
2981 				       PTP_TX_MSG_HEADER2);
2982 }
2983 
2984 static int lan8814_ts_info(struct mii_timestamper *mii_ts, struct kernel_ethtool_ts_info *info)
2985 {
2986 	struct kszphy_ptp_priv *ptp_priv = container_of(mii_ts, struct kszphy_ptp_priv, mii_ts);
2987 	struct lan8814_shared_priv *shared = phy_package_get_priv(ptp_priv->phydev);
2988 
2989 	info->so_timestamping = SOF_TIMESTAMPING_TX_HARDWARE |
2990 				SOF_TIMESTAMPING_RX_HARDWARE |
2991 				SOF_TIMESTAMPING_RAW_HARDWARE;
2992 
2993 	info->phc_index = ptp_clock_index(shared->ptp_clock);
2994 
2995 	info->tx_types =
2996 		(1 << HWTSTAMP_TX_OFF) |
2997 		(1 << HWTSTAMP_TX_ON) |
2998 		(1 << HWTSTAMP_TX_ONESTEP_SYNC);
2999 
3000 	info->rx_filters =
3001 		(1 << HWTSTAMP_FILTER_NONE) |
3002 		(1 << HWTSTAMP_FILTER_PTP_V1_L4_EVENT) |
3003 		(1 << HWTSTAMP_FILTER_PTP_V2_L4_EVENT) |
3004 		(1 << HWTSTAMP_FILTER_PTP_V2_L2_EVENT) |
3005 		(1 << HWTSTAMP_FILTER_PTP_V2_EVENT);
3006 
3007 	return 0;
3008 }
3009 
3010 static void lan8814_flush_fifo(struct phy_device *phydev, bool egress)
3011 {
3012 	int i;
3013 
3014 	for (i = 0; i < FIFO_SIZE; ++i)
3015 		lanphy_read_page_reg(phydev, LAN8814_PAGE_PORT_REGS,
3016 				     egress ? PTP_TX_MSG_HEADER2 : PTP_RX_MSG_HEADER2);
3017 
3018 	/* Read to clear overflow status bit */
3019 	lanphy_read_page_reg(phydev, LAN8814_PAGE_PORT_REGS, PTP_TSU_INT_STS);
3020 }
3021 
3022 static int lan8814_hwtstamp(struct mii_timestamper *mii_ts,
3023 			    struct kernel_hwtstamp_config *config,
3024 			    struct netlink_ext_ack *extack)
3025 {
3026 	struct kszphy_ptp_priv *ptp_priv =
3027 			  container_of(mii_ts, struct kszphy_ptp_priv, mii_ts);
3028 	struct lan8814_ptp_rx_ts *rx_ts, *tmp;
3029 	int txcfg = 0, rxcfg = 0;
3030 	int pkt_ts_enable;
3031 
3032 	ptp_priv->hwts_tx_type = config->tx_type;
3033 	ptp_priv->rx_filter = config->rx_filter;
3034 
3035 	switch (config->rx_filter) {
3036 	case HWTSTAMP_FILTER_NONE:
3037 		ptp_priv->layer = 0;
3038 		ptp_priv->version = 0;
3039 		break;
3040 	case HWTSTAMP_FILTER_PTP_V2_L4_EVENT:
3041 	case HWTSTAMP_FILTER_PTP_V2_L4_SYNC:
3042 	case HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ:
3043 		ptp_priv->layer = PTP_CLASS_L4;
3044 		ptp_priv->version = PTP_CLASS_V2;
3045 		break;
3046 	case HWTSTAMP_FILTER_PTP_V2_L2_EVENT:
3047 	case HWTSTAMP_FILTER_PTP_V2_L2_SYNC:
3048 	case HWTSTAMP_FILTER_PTP_V2_L2_DELAY_REQ:
3049 		ptp_priv->layer = PTP_CLASS_L2;
3050 		ptp_priv->version = PTP_CLASS_V2;
3051 		break;
3052 	case HWTSTAMP_FILTER_PTP_V2_EVENT:
3053 	case HWTSTAMP_FILTER_PTP_V2_SYNC:
3054 	case HWTSTAMP_FILTER_PTP_V2_DELAY_REQ:
3055 		ptp_priv->layer = PTP_CLASS_L4 | PTP_CLASS_L2;
3056 		ptp_priv->version = PTP_CLASS_V2;
3057 		break;
3058 	default:
3059 		return -ERANGE;
3060 	}
3061 
3062 	if (ptp_priv->layer & PTP_CLASS_L2) {
3063 		rxcfg = PTP_RX_PARSE_CONFIG_LAYER2_EN_;
3064 		txcfg = PTP_TX_PARSE_CONFIG_LAYER2_EN_;
3065 	} else if (ptp_priv->layer & PTP_CLASS_L4) {
3066 		rxcfg |= PTP_RX_PARSE_CONFIG_IPV4_EN_ | PTP_RX_PARSE_CONFIG_IPV6_EN_;
3067 		txcfg |= PTP_TX_PARSE_CONFIG_IPV4_EN_ | PTP_TX_PARSE_CONFIG_IPV6_EN_;
3068 	}
3069 	lanphy_write_page_reg(ptp_priv->phydev, LAN8814_PAGE_PORT_REGS,
3070 			      PTP_RX_PARSE_CONFIG, rxcfg);
3071 	lanphy_write_page_reg(ptp_priv->phydev, LAN8814_PAGE_PORT_REGS,
3072 			      PTP_TX_PARSE_CONFIG, txcfg);
3073 
3074 	pkt_ts_enable = PTP_TIMESTAMP_EN_SYNC_ | PTP_TIMESTAMP_EN_DREQ_ |
3075 			PTP_TIMESTAMP_EN_PDREQ_ | PTP_TIMESTAMP_EN_PDRES_;
3076 	lanphy_write_page_reg(ptp_priv->phydev, LAN8814_PAGE_PORT_REGS,
3077 			      PTP_RX_TIMESTAMP_EN, pkt_ts_enable);
3078 	lanphy_write_page_reg(ptp_priv->phydev, LAN8814_PAGE_PORT_REGS,
3079 			      PTP_TX_TIMESTAMP_EN, pkt_ts_enable);
3080 
3081 	if (ptp_priv->hwts_tx_type == HWTSTAMP_TX_ONESTEP_SYNC) {
3082 		lanphy_modify_page_reg(ptp_priv->phydev, LAN8814_PAGE_PORT_REGS,
3083 				       PTP_TX_MOD,
3084 				       PTP_TX_MOD_TX_PTP_SYNC_TS_INSERT_,
3085 				       PTP_TX_MOD_TX_PTP_SYNC_TS_INSERT_);
3086 	} else if (ptp_priv->hwts_tx_type == HWTSTAMP_TX_ON) {
3087 		lanphy_modify_page_reg(ptp_priv->phydev, LAN8814_PAGE_PORT_REGS,
3088 				       PTP_TX_MOD,
3089 				       PTP_TX_MOD_TX_PTP_SYNC_TS_INSERT_,
3090 				       0);
3091 	}
3092 
3093 	if (config->rx_filter != HWTSTAMP_FILTER_NONE)
3094 		lan8814_config_ts_intr(ptp_priv->phydev, true);
3095 	else
3096 		lan8814_config_ts_intr(ptp_priv->phydev, false);
3097 
3098 	/* In case of multiple starts and stops, these needs to be cleared */
3099 	list_for_each_entry_safe(rx_ts, tmp, &ptp_priv->rx_ts_list, list) {
3100 		list_del(&rx_ts->list);
3101 		kfree(rx_ts);
3102 	}
3103 	skb_queue_purge(&ptp_priv->rx_queue);
3104 	skb_queue_purge(&ptp_priv->tx_queue);
3105 
3106 	lan8814_flush_fifo(ptp_priv->phydev, false);
3107 	lan8814_flush_fifo(ptp_priv->phydev, true);
3108 
3109 	return 0;
3110 }
3111 
3112 static void lan8814_txtstamp(struct mii_timestamper *mii_ts,
3113 			     struct sk_buff *skb, int type)
3114 {
3115 	struct kszphy_ptp_priv *ptp_priv = container_of(mii_ts, struct kszphy_ptp_priv, mii_ts);
3116 
3117 	switch (ptp_priv->hwts_tx_type) {
3118 	case HWTSTAMP_TX_ONESTEP_SYNC:
3119 		if (ptp_msg_is_sync(skb, type)) {
3120 			kfree_skb(skb);
3121 			return;
3122 		}
3123 		fallthrough;
3124 	case HWTSTAMP_TX_ON:
3125 		skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS;
3126 		skb_queue_tail(&ptp_priv->tx_queue, skb);
3127 		break;
3128 	case HWTSTAMP_TX_OFF:
3129 	default:
3130 		kfree_skb(skb);
3131 		break;
3132 	}
3133 }
3134 
3135 static bool lan8814_get_sig_rx(struct sk_buff *skb, u16 *sig)
3136 {
3137 	struct ptp_header *ptp_header;
3138 	u32 type;
3139 
3140 	skb_push(skb, ETH_HLEN);
3141 	type = ptp_classify_raw(skb);
3142 	ptp_header = ptp_parse_header(skb, type);
3143 	skb_pull_inline(skb, ETH_HLEN);
3144 
3145 	if (!ptp_header)
3146 		return false;
3147 
3148 	*sig = (__force u16)(ntohs(ptp_header->sequence_id));
3149 	return true;
3150 }
3151 
3152 static bool lan8814_match_rx_skb(struct kszphy_ptp_priv *ptp_priv,
3153 				 struct sk_buff *skb)
3154 {
3155 	struct skb_shared_hwtstamps *shhwtstamps;
3156 	struct lan8814_ptp_rx_ts *rx_ts, *tmp;
3157 	unsigned long flags;
3158 	bool ret = false;
3159 	u16 skb_sig;
3160 
3161 	if (!lan8814_get_sig_rx(skb, &skb_sig))
3162 		return ret;
3163 
3164 	/* Iterate over all RX timestamps and match it with the received skbs */
3165 	spin_lock_irqsave(&ptp_priv->rx_ts_lock, flags);
3166 	list_for_each_entry_safe(rx_ts, tmp, &ptp_priv->rx_ts_list, list) {
3167 		/* Check if we found the signature we were looking for. */
3168 		if (memcmp(&skb_sig, &rx_ts->seq_id, sizeof(rx_ts->seq_id)))
3169 			continue;
3170 
3171 		shhwtstamps = skb_hwtstamps(skb);
3172 		memset(shhwtstamps, 0, sizeof(*shhwtstamps));
3173 		shhwtstamps->hwtstamp = ktime_set(rx_ts->seconds,
3174 						  rx_ts->nsec);
3175 		list_del(&rx_ts->list);
3176 		kfree(rx_ts);
3177 
3178 		ret = true;
3179 		break;
3180 	}
3181 	spin_unlock_irqrestore(&ptp_priv->rx_ts_lock, flags);
3182 
3183 	if (ret)
3184 		netif_rx(skb);
3185 	return ret;
3186 }
3187 
3188 static bool lan8814_rxtstamp(struct mii_timestamper *mii_ts, struct sk_buff *skb, int type)
3189 {
3190 	struct kszphy_ptp_priv *ptp_priv =
3191 			container_of(mii_ts, struct kszphy_ptp_priv, mii_ts);
3192 
3193 	if (ptp_priv->rx_filter == HWTSTAMP_FILTER_NONE ||
3194 	    type == PTP_CLASS_NONE)
3195 		return false;
3196 
3197 	if ((type & ptp_priv->version) == 0 || (type & ptp_priv->layer) == 0)
3198 		return false;
3199 
3200 	/* If we failed to match then add it to the queue for when the timestamp
3201 	 * will come
3202 	 */
3203 	if (!lan8814_match_rx_skb(ptp_priv, skb))
3204 		skb_queue_tail(&ptp_priv->rx_queue, skb);
3205 
3206 	return true;
3207 }
3208 
3209 static void lan8814_ptp_clock_set(struct phy_device *phydev,
3210 				  time64_t sec, u32 nsec)
3211 {
3212 	lanphy_write_page_reg(phydev, LAN8814_PAGE_COMMON_REGS,
3213 			      PTP_CLOCK_SET_SEC_LO, lower_16_bits(sec));
3214 	lanphy_write_page_reg(phydev, LAN8814_PAGE_COMMON_REGS,
3215 			      PTP_CLOCK_SET_SEC_MID, upper_16_bits(sec));
3216 	lanphy_write_page_reg(phydev, LAN8814_PAGE_COMMON_REGS,
3217 			      PTP_CLOCK_SET_SEC_HI, upper_32_bits(sec));
3218 	lanphy_write_page_reg(phydev, LAN8814_PAGE_COMMON_REGS,
3219 			      PTP_CLOCK_SET_NS_LO, lower_16_bits(nsec));
3220 	lanphy_write_page_reg(phydev, LAN8814_PAGE_COMMON_REGS,
3221 			      PTP_CLOCK_SET_NS_HI, upper_16_bits(nsec));
3222 
3223 	lanphy_write_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, PTP_CMD_CTL,
3224 			      PTP_CMD_CTL_PTP_CLOCK_LOAD_);
3225 }
3226 
3227 static void lan8814_ptp_clock_get(struct phy_device *phydev,
3228 				  time64_t *sec, u32 *nsec)
3229 {
3230 	lanphy_write_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, PTP_CMD_CTL,
3231 			      PTP_CMD_CTL_PTP_CLOCK_READ_);
3232 
3233 	*sec = lanphy_read_page_reg(phydev, LAN8814_PAGE_COMMON_REGS,
3234 				    PTP_CLOCK_READ_SEC_HI);
3235 	*sec <<= 16;
3236 	*sec |= lanphy_read_page_reg(phydev, LAN8814_PAGE_COMMON_REGS,
3237 				     PTP_CLOCK_READ_SEC_MID);
3238 	*sec <<= 16;
3239 	*sec |= lanphy_read_page_reg(phydev, LAN8814_PAGE_COMMON_REGS,
3240 				     PTP_CLOCK_READ_SEC_LO);
3241 
3242 	*nsec = lanphy_read_page_reg(phydev, LAN8814_PAGE_COMMON_REGS,
3243 				     PTP_CLOCK_READ_NS_HI);
3244 	*nsec <<= 16;
3245 	*nsec |= lanphy_read_page_reg(phydev, LAN8814_PAGE_COMMON_REGS,
3246 				      PTP_CLOCK_READ_NS_LO);
3247 }
3248 
3249 static int lan8814_ptpci_gettime64(struct ptp_clock_info *ptpci,
3250 				   struct timespec64 *ts)
3251 {
3252 	struct lan8814_shared_priv *shared = container_of(ptpci, struct lan8814_shared_priv,
3253 							  ptp_clock_info);
3254 	struct phy_device *phydev = shared->phydev;
3255 	u32 nano_seconds;
3256 	time64_t seconds;
3257 
3258 	mutex_lock(&shared->shared_lock);
3259 	lan8814_ptp_clock_get(phydev, &seconds, &nano_seconds);
3260 	mutex_unlock(&shared->shared_lock);
3261 	ts->tv_sec = seconds;
3262 	ts->tv_nsec = nano_seconds;
3263 
3264 	return 0;
3265 }
3266 
3267 static int lan8814_ptpci_settime64(struct ptp_clock_info *ptpci,
3268 				   const struct timespec64 *ts)
3269 {
3270 	struct lan8814_shared_priv *shared = container_of(ptpci, struct lan8814_shared_priv,
3271 							  ptp_clock_info);
3272 	struct phy_device *phydev = shared->phydev;
3273 
3274 	mutex_lock(&shared->shared_lock);
3275 	lan8814_ptp_clock_set(phydev, ts->tv_sec, ts->tv_nsec);
3276 	mutex_unlock(&shared->shared_lock);
3277 
3278 	return 0;
3279 }
3280 
3281 static void lan8814_ptp_set_target(struct phy_device *phydev, int event,
3282 				   s64 start_sec, u32 start_nsec)
3283 {
3284 	/* Set the start time */
3285 	lanphy_write_page_reg(phydev, LAN8814_PAGE_COMMON_REGS,
3286 			      LAN8814_PTP_CLOCK_TARGET_SEC_LO(event),
3287 			      lower_16_bits(start_sec));
3288 	lanphy_write_page_reg(phydev, LAN8814_PAGE_COMMON_REGS,
3289 			      LAN8814_PTP_CLOCK_TARGET_SEC_HI(event),
3290 			      upper_16_bits(start_sec));
3291 
3292 	lanphy_write_page_reg(phydev, LAN8814_PAGE_COMMON_REGS,
3293 			      LAN8814_PTP_CLOCK_TARGET_NS_LO(event),
3294 			      lower_16_bits(start_nsec));
3295 	lanphy_write_page_reg(phydev, LAN8814_PAGE_COMMON_REGS,
3296 			      LAN8814_PTP_CLOCK_TARGET_NS_HI(event),
3297 			      upper_16_bits(start_nsec) & 0x3fff);
3298 }
3299 
3300 static void lan8814_ptp_update_target(struct phy_device *phydev, time64_t sec)
3301 {
3302 	lan8814_ptp_set_target(phydev, LAN8814_EVENT_A,
3303 			       sec + LAN8814_BUFFER_TIME, 0);
3304 	lan8814_ptp_set_target(phydev, LAN8814_EVENT_B,
3305 			       sec + LAN8814_BUFFER_TIME, 0);
3306 }
3307 
3308 static void lan8814_ptp_clock_step(struct phy_device *phydev,
3309 				   s64 time_step_ns)
3310 {
3311 	u32 nano_seconds_step;
3312 	u64 abs_time_step_ns;
3313 	time64_t set_seconds;
3314 	u32 nano_seconds;
3315 	u32 remainder;
3316 	s32 seconds;
3317 
3318 	if (time_step_ns >  15000000000LL) {
3319 		/* convert to clock set */
3320 		lan8814_ptp_clock_get(phydev, &set_seconds, &nano_seconds);
3321 		set_seconds += div_u64_rem(time_step_ns, 1000000000LL,
3322 					   &remainder);
3323 		nano_seconds += remainder;
3324 		if (nano_seconds >= 1000000000) {
3325 			set_seconds++;
3326 			nano_seconds -= 1000000000;
3327 		}
3328 		lan8814_ptp_clock_set(phydev, set_seconds, nano_seconds);
3329 		lan8814_ptp_update_target(phydev, set_seconds);
3330 		return;
3331 	} else if (time_step_ns < -15000000000LL) {
3332 		/* convert to clock set */
3333 		time_step_ns = -time_step_ns;
3334 
3335 		lan8814_ptp_clock_get(phydev, &set_seconds, &nano_seconds);
3336 		set_seconds -= div_u64_rem(time_step_ns, 1000000000LL,
3337 					   &remainder);
3338 		nano_seconds_step = remainder;
3339 		if (nano_seconds < nano_seconds_step) {
3340 			set_seconds--;
3341 			nano_seconds += 1000000000;
3342 		}
3343 		nano_seconds -= nano_seconds_step;
3344 		lan8814_ptp_clock_set(phydev, set_seconds, nano_seconds);
3345 		lan8814_ptp_update_target(phydev, set_seconds);
3346 		return;
3347 	}
3348 
3349 	/* do clock step */
3350 	if (time_step_ns >= 0) {
3351 		abs_time_step_ns = (u64)time_step_ns;
3352 		seconds = (s32)div_u64_rem(abs_time_step_ns, 1000000000,
3353 					   &remainder);
3354 		nano_seconds = remainder;
3355 	} else {
3356 		abs_time_step_ns = (u64)(-time_step_ns);
3357 		seconds = -((s32)div_u64_rem(abs_time_step_ns, 1000000000,
3358 			    &remainder));
3359 		nano_seconds = remainder;
3360 		if (nano_seconds > 0) {
3361 			/* subtracting nano seconds is not allowed
3362 			 * convert to subtracting from seconds,
3363 			 * and adding to nanoseconds
3364 			 */
3365 			seconds--;
3366 			nano_seconds = (1000000000 - nano_seconds);
3367 		}
3368 	}
3369 
3370 	if (nano_seconds > 0) {
3371 		/* add 8 ns to cover the likely normal increment */
3372 		nano_seconds += 8;
3373 	}
3374 
3375 	if (nano_seconds >= 1000000000) {
3376 		/* carry into seconds */
3377 		seconds++;
3378 		nano_seconds -= 1000000000;
3379 	}
3380 
3381 	while (seconds) {
3382 		u32 nsec;
3383 
3384 		if (seconds > 0) {
3385 			u32 adjustment_value = (u32)seconds;
3386 			u16 adjustment_value_lo, adjustment_value_hi;
3387 
3388 			if (adjustment_value > 0xF)
3389 				adjustment_value = 0xF;
3390 
3391 			adjustment_value_lo = adjustment_value & 0xffff;
3392 			adjustment_value_hi = (adjustment_value >> 16) & 0x3fff;
3393 
3394 			lanphy_write_page_reg(phydev, LAN8814_PAGE_COMMON_REGS,
3395 					      PTP_LTC_STEP_ADJ_LO,
3396 					      adjustment_value_lo);
3397 			lanphy_write_page_reg(phydev, LAN8814_PAGE_COMMON_REGS,
3398 					      PTP_LTC_STEP_ADJ_HI,
3399 					      PTP_LTC_STEP_ADJ_DIR_ |
3400 					      adjustment_value_hi);
3401 			seconds -= ((s32)adjustment_value);
3402 
3403 			lan8814_ptp_clock_get(phydev, &set_seconds, &nsec);
3404 			set_seconds -= adjustment_value;
3405 			lan8814_ptp_update_target(phydev, set_seconds);
3406 		} else {
3407 			u32 adjustment_value = (u32)(-seconds);
3408 			u16 adjustment_value_lo, adjustment_value_hi;
3409 
3410 			if (adjustment_value > 0xF)
3411 				adjustment_value = 0xF;
3412 
3413 			adjustment_value_lo = adjustment_value & 0xffff;
3414 			adjustment_value_hi = (adjustment_value >> 16) & 0x3fff;
3415 
3416 			lanphy_write_page_reg(phydev, LAN8814_PAGE_COMMON_REGS,
3417 					      PTP_LTC_STEP_ADJ_LO,
3418 					      adjustment_value_lo);
3419 			lanphy_write_page_reg(phydev, LAN8814_PAGE_COMMON_REGS,
3420 					      PTP_LTC_STEP_ADJ_HI,
3421 					      adjustment_value_hi);
3422 			seconds += ((s32)adjustment_value);
3423 
3424 			lan8814_ptp_clock_get(phydev, &set_seconds, &nsec);
3425 			set_seconds += adjustment_value;
3426 			lan8814_ptp_update_target(phydev, set_seconds);
3427 		}
3428 		lanphy_write_page_reg(phydev, LAN8814_PAGE_COMMON_REGS,
3429 				      PTP_CMD_CTL, PTP_CMD_CTL_PTP_LTC_STEP_SEC_);
3430 	}
3431 	if (nano_seconds) {
3432 		u16 nano_seconds_lo;
3433 		u16 nano_seconds_hi;
3434 
3435 		nano_seconds_lo = nano_seconds & 0xffff;
3436 		nano_seconds_hi = (nano_seconds >> 16) & 0x3fff;
3437 
3438 		lanphy_write_page_reg(phydev, LAN8814_PAGE_COMMON_REGS,
3439 				      PTP_LTC_STEP_ADJ_LO,
3440 				      nano_seconds_lo);
3441 		lanphy_write_page_reg(phydev, LAN8814_PAGE_COMMON_REGS,
3442 				      PTP_LTC_STEP_ADJ_HI,
3443 				      PTP_LTC_STEP_ADJ_DIR_ |
3444 				      nano_seconds_hi);
3445 		lanphy_write_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, PTP_CMD_CTL,
3446 				      PTP_CMD_CTL_PTP_LTC_STEP_NSEC_);
3447 	}
3448 }
3449 
3450 static int lan8814_ptpci_adjtime(struct ptp_clock_info *ptpci, s64 delta)
3451 {
3452 	struct lan8814_shared_priv *shared = container_of(ptpci, struct lan8814_shared_priv,
3453 							  ptp_clock_info);
3454 	struct phy_device *phydev = shared->phydev;
3455 
3456 	mutex_lock(&shared->shared_lock);
3457 	lan8814_ptp_clock_step(phydev, delta);
3458 	mutex_unlock(&shared->shared_lock);
3459 
3460 	return 0;
3461 }
3462 
3463 static int lan8814_ptpci_adjfine(struct ptp_clock_info *ptpci, long scaled_ppm)
3464 {
3465 	struct lan8814_shared_priv *shared = container_of(ptpci, struct lan8814_shared_priv,
3466 							  ptp_clock_info);
3467 	struct phy_device *phydev = shared->phydev;
3468 	u16 kszphy_rate_adj_lo, kszphy_rate_adj_hi;
3469 	bool positive = true;
3470 	u32 kszphy_rate_adj;
3471 
3472 	if (scaled_ppm < 0) {
3473 		scaled_ppm = -scaled_ppm;
3474 		positive = false;
3475 	}
3476 
3477 	kszphy_rate_adj = LAN8814_1PPM_FORMAT * (scaled_ppm >> 16);
3478 	kszphy_rate_adj += (LAN8814_1PPM_FORMAT * (0xffff & scaled_ppm)) >> 16;
3479 
3480 	kszphy_rate_adj_lo = kszphy_rate_adj & 0xffff;
3481 	kszphy_rate_adj_hi = (kszphy_rate_adj >> 16) & 0x3fff;
3482 
3483 	if (positive)
3484 		kszphy_rate_adj_hi |= PTP_CLOCK_RATE_ADJ_DIR_;
3485 
3486 	mutex_lock(&shared->shared_lock);
3487 	lanphy_write_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, PTP_CLOCK_RATE_ADJ_HI,
3488 			      kszphy_rate_adj_hi);
3489 	lanphy_write_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, PTP_CLOCK_RATE_ADJ_LO,
3490 			      kszphy_rate_adj_lo);
3491 	mutex_unlock(&shared->shared_lock);
3492 
3493 	return 0;
3494 }
3495 
3496 static void lan8814_ptp_set_reload(struct phy_device *phydev, int event,
3497 				   s64 period_sec, u32 period_nsec)
3498 {
3499 	lanphy_write_page_reg(phydev, LAN8814_PAGE_COMMON_REGS,
3500 			      LAN8814_PTP_CLOCK_TARGET_RELOAD_SEC_LO(event),
3501 			      lower_16_bits(period_sec));
3502 	lanphy_write_page_reg(phydev, LAN8814_PAGE_COMMON_REGS,
3503 			      LAN8814_PTP_CLOCK_TARGET_RELOAD_SEC_HI(event),
3504 			      upper_16_bits(period_sec));
3505 
3506 	lanphy_write_page_reg(phydev, LAN8814_PAGE_COMMON_REGS,
3507 			      LAN8814_PTP_CLOCK_TARGET_RELOAD_NS_LO(event),
3508 			      lower_16_bits(period_nsec));
3509 	lanphy_write_page_reg(phydev, LAN8814_PAGE_COMMON_REGS,
3510 			      LAN8814_PTP_CLOCK_TARGET_RELOAD_NS_HI(event),
3511 			      upper_16_bits(period_nsec) & 0x3fff);
3512 }
3513 
3514 static void lan8814_ptp_enable_event(struct phy_device *phydev, int event,
3515 				     int pulse_width)
3516 {
3517 	/* Set the pulse width of the event,
3518 	 * Make sure that the target clock will be incremented each time when
3519 	 * local time reaches or pass it
3520 	 * Set the polarity high
3521 	 */
3522 	lanphy_modify_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, LAN8814_PTP_GENERAL_CONFIG,
3523 			       LAN8814_PTP_GENERAL_CONFIG_LTC_EVENT_MASK(event) |
3524 			       LAN8814_PTP_GENERAL_CONFIG_LTC_EVENT_SET(event, pulse_width) |
3525 			       LAN8814_PTP_GENERAL_CONFIG_RELOAD_ADD_X(event) |
3526 			       LAN8814_PTP_GENERAL_CONFIG_POLARITY_X(event),
3527 			       LAN8814_PTP_GENERAL_CONFIG_LTC_EVENT_SET(event, pulse_width) |
3528 			       LAN8814_PTP_GENERAL_CONFIG_POLARITY_X(event));
3529 }
3530 
3531 static void lan8814_ptp_disable_event(struct phy_device *phydev, int event)
3532 {
3533 	/* Set target to too far in the future, effectively disabling it */
3534 	lan8814_ptp_set_target(phydev, event, 0xFFFFFFFF, 0);
3535 
3536 	/* And then reload once it reaches the target */
3537 	lanphy_modify_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, LAN8814_PTP_GENERAL_CONFIG,
3538 			       LAN8814_PTP_GENERAL_CONFIG_RELOAD_ADD_X(event),
3539 			       LAN8814_PTP_GENERAL_CONFIG_RELOAD_ADD_X(event));
3540 }
3541 
3542 static void lan8814_ptp_perout_off(struct phy_device *phydev, int pin)
3543 {
3544 	/* Disable gpio alternate function,
3545 	 * 1: select as gpio,
3546 	 * 0: select alt func
3547 	 */
3548 	lanphy_modify_page_reg(phydev, LAN8814_PAGE_COMMON_REGS,
3549 			       LAN8814_GPIO_EN_ADDR(pin),
3550 			       LAN8814_GPIO_EN_BIT(pin),
3551 			       LAN8814_GPIO_EN_BIT(pin));
3552 
3553 	lanphy_modify_page_reg(phydev, LAN8814_PAGE_COMMON_REGS,
3554 			       LAN8814_GPIO_DIR_ADDR(pin),
3555 			       LAN8814_GPIO_DIR_BIT(pin),
3556 			       0);
3557 
3558 	lanphy_modify_page_reg(phydev, LAN8814_PAGE_COMMON_REGS,
3559 			       LAN8814_GPIO_BUF_ADDR(pin),
3560 			       LAN8814_GPIO_BUF_BIT(pin),
3561 			       0);
3562 }
3563 
3564 static void lan8814_ptp_perout_on(struct phy_device *phydev, int pin)
3565 {
3566 	/* Set as gpio output */
3567 	lanphy_modify_page_reg(phydev, LAN8814_PAGE_COMMON_REGS,
3568 			       LAN8814_GPIO_DIR_ADDR(pin),
3569 			       LAN8814_GPIO_DIR_BIT(pin),
3570 			       LAN8814_GPIO_DIR_BIT(pin));
3571 
3572 	/* Enable gpio 0:for alternate function, 1:gpio */
3573 	lanphy_modify_page_reg(phydev, LAN8814_PAGE_COMMON_REGS,
3574 			       LAN8814_GPIO_EN_ADDR(pin),
3575 			       LAN8814_GPIO_EN_BIT(pin),
3576 			       0);
3577 
3578 	/* Set buffer type to push pull */
3579 	lanphy_modify_page_reg(phydev, LAN8814_PAGE_COMMON_REGS,
3580 			       LAN8814_GPIO_BUF_ADDR(pin),
3581 			       LAN8814_GPIO_BUF_BIT(pin),
3582 			       LAN8814_GPIO_BUF_BIT(pin));
3583 }
3584 
3585 static int lan8814_ptp_perout(struct ptp_clock_info *ptpci,
3586 			      struct ptp_clock_request *rq, int on)
3587 {
3588 	struct lan8814_shared_priv *shared = container_of(ptpci, struct lan8814_shared_priv,
3589 							  ptp_clock_info);
3590 	struct phy_device *phydev = shared->phydev;
3591 	struct timespec64 ts_on, ts_period;
3592 	s64 on_nsec, period_nsec;
3593 	int pulse_width;
3594 	int pin, event;
3595 
3596 	mutex_lock(&shared->shared_lock);
3597 	event = rq->perout.index;
3598 	pin = ptp_find_pin(shared->ptp_clock, PTP_PF_PEROUT, event);
3599 	if (pin < 0 || pin >= LAN8814_PTP_PEROUT_NUM) {
3600 		mutex_unlock(&shared->shared_lock);
3601 		return -EBUSY;
3602 	}
3603 
3604 	if (!on) {
3605 		lan8814_ptp_perout_off(phydev, pin);
3606 		lan8814_ptp_disable_event(phydev, event);
3607 		mutex_unlock(&shared->shared_lock);
3608 		return 0;
3609 	}
3610 
3611 	ts_on.tv_sec = rq->perout.on.sec;
3612 	ts_on.tv_nsec = rq->perout.on.nsec;
3613 	on_nsec = timespec64_to_ns(&ts_on);
3614 
3615 	ts_period.tv_sec = rq->perout.period.sec;
3616 	ts_period.tv_nsec = rq->perout.period.nsec;
3617 	period_nsec = timespec64_to_ns(&ts_period);
3618 
3619 	if (period_nsec < 200) {
3620 		pr_warn_ratelimited("%s: perout period too small, minimum is 200 nsec\n",
3621 				    phydev_name(phydev));
3622 		mutex_unlock(&shared->shared_lock);
3623 		return -EOPNOTSUPP;
3624 	}
3625 
3626 	if (on_nsec >= period_nsec) {
3627 		pr_warn_ratelimited("%s: pulse width must be smaller than period\n",
3628 				    phydev_name(phydev));
3629 		mutex_unlock(&shared->shared_lock);
3630 		return -EINVAL;
3631 	}
3632 
3633 	switch (on_nsec) {
3634 	case 200000000:
3635 		pulse_width = LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_200MS;
3636 		break;
3637 	case 100000000:
3638 		pulse_width = LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_100MS;
3639 		break;
3640 	case 50000000:
3641 		pulse_width = LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_50MS;
3642 		break;
3643 	case 10000000:
3644 		pulse_width = LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_10MS;
3645 		break;
3646 	case 5000000:
3647 		pulse_width = LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_5MS;
3648 		break;
3649 	case 1000000:
3650 		pulse_width = LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_1MS;
3651 		break;
3652 	case 500000:
3653 		pulse_width = LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_500US;
3654 		break;
3655 	case 100000:
3656 		pulse_width = LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_100US;
3657 		break;
3658 	case 50000:
3659 		pulse_width = LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_50US;
3660 		break;
3661 	case 10000:
3662 		pulse_width = LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_10US;
3663 		break;
3664 	case 5000:
3665 		pulse_width = LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_5US;
3666 		break;
3667 	case 1000:
3668 		pulse_width = LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_1US;
3669 		break;
3670 	case 500:
3671 		pulse_width = LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_500NS;
3672 		break;
3673 	case 100:
3674 		pulse_width = LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_100NS;
3675 		break;
3676 	default:
3677 		pr_warn_ratelimited("%s: Use default duty cycle of 100ns\n",
3678 				    phydev_name(phydev));
3679 		pulse_width = LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_100NS;
3680 		break;
3681 	}
3682 
3683 	/* Configure to pulse every period */
3684 	lan8814_ptp_enable_event(phydev, event, pulse_width);
3685 	lan8814_ptp_set_target(phydev, event, rq->perout.start.sec,
3686 			       rq->perout.start.nsec);
3687 	lan8814_ptp_set_reload(phydev, event, rq->perout.period.sec,
3688 			       rq->perout.period.nsec);
3689 	lan8814_ptp_perout_on(phydev, pin);
3690 	mutex_unlock(&shared->shared_lock);
3691 
3692 	return 0;
3693 }
3694 
3695 static void lan8814_ptp_extts_on(struct phy_device *phydev, int pin, u32 flags)
3696 {
3697 	/* Set as gpio input */
3698 	lanphy_modify_page_reg(phydev, LAN8814_PAGE_COMMON_REGS,
3699 			       LAN8814_GPIO_DIR_ADDR(pin),
3700 			       LAN8814_GPIO_DIR_BIT(pin),
3701 			       0);
3702 
3703 	/* Map the pin to ltc pin 0 of the capture map registers */
3704 	lanphy_modify_page_reg(phydev, LAN8814_PAGE_COMMON_REGS,
3705 			       PTP_GPIO_CAP_MAP_LO, pin, pin);
3706 
3707 	/* Enable capture on the edges of the ltc pin */
3708 	if (flags & PTP_RISING_EDGE)
3709 		lanphy_modify_page_reg(phydev, LAN8814_PAGE_COMMON_REGS,
3710 				       PTP_GPIO_CAP_EN,
3711 				       PTP_GPIO_CAP_EN_GPIO_RE_CAPTURE_ENABLE(0),
3712 				       PTP_GPIO_CAP_EN_GPIO_RE_CAPTURE_ENABLE(0));
3713 	if (flags & PTP_FALLING_EDGE)
3714 		lanphy_modify_page_reg(phydev, LAN8814_PAGE_COMMON_REGS,
3715 				       PTP_GPIO_CAP_EN,
3716 				       PTP_GPIO_CAP_EN_GPIO_FE_CAPTURE_ENABLE(0),
3717 				       PTP_GPIO_CAP_EN_GPIO_FE_CAPTURE_ENABLE(0));
3718 
3719 	/* Enable interrupt top interrupt */
3720 	lanphy_modify_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, PTP_COMMON_INT_ENA,
3721 			       PTP_COMMON_INT_ENA_GPIO_CAP_EN,
3722 			       PTP_COMMON_INT_ENA_GPIO_CAP_EN);
3723 }
3724 
3725 static void lan8814_ptp_extts_off(struct phy_device *phydev, int pin)
3726 {
3727 	/* Set as gpio out */
3728 	lanphy_modify_page_reg(phydev, LAN8814_PAGE_COMMON_REGS,
3729 			       LAN8814_GPIO_DIR_ADDR(pin),
3730 			       LAN8814_GPIO_DIR_BIT(pin),
3731 			       LAN8814_GPIO_DIR_BIT(pin));
3732 
3733 	/* Enable alternate, 0:for alternate function, 1:gpio */
3734 	lanphy_modify_page_reg(phydev, LAN8814_PAGE_COMMON_REGS,
3735 			       LAN8814_GPIO_EN_ADDR(pin),
3736 			       LAN8814_GPIO_EN_BIT(pin),
3737 			       0);
3738 
3739 	/* Clear the mapping of pin to registers 0 of the capture registers */
3740 	lanphy_modify_page_reg(phydev, LAN8814_PAGE_COMMON_REGS,
3741 			       PTP_GPIO_CAP_MAP_LO,
3742 			       GENMASK(3, 0),
3743 			       0);
3744 
3745 	/* Disable capture on both of the edges */
3746 	lanphy_modify_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, PTP_GPIO_CAP_EN,
3747 			       PTP_GPIO_CAP_EN_GPIO_RE_CAPTURE_ENABLE(pin) |
3748 			       PTP_GPIO_CAP_EN_GPIO_FE_CAPTURE_ENABLE(pin),
3749 			       0);
3750 
3751 	/* Disable interrupt top interrupt */
3752 	lanphy_modify_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, PTP_COMMON_INT_ENA,
3753 			       PTP_COMMON_INT_ENA_GPIO_CAP_EN,
3754 			       0);
3755 }
3756 
3757 static int lan8814_ptp_extts(struct ptp_clock_info *ptpci,
3758 			     struct ptp_clock_request *rq, int on)
3759 {
3760 	struct lan8814_shared_priv *shared = container_of(ptpci, struct lan8814_shared_priv,
3761 							  ptp_clock_info);
3762 	struct phy_device *phydev = shared->phydev;
3763 	int pin;
3764 
3765 	pin = ptp_find_pin(shared->ptp_clock, PTP_PF_EXTTS,
3766 			   rq->extts.index);
3767 	if (pin == -1 || pin != LAN8814_PTP_EXTTS_NUM)
3768 		return -EINVAL;
3769 
3770 	mutex_lock(&shared->shared_lock);
3771 	if (on)
3772 		lan8814_ptp_extts_on(phydev, pin, rq->extts.flags);
3773 	else
3774 		lan8814_ptp_extts_off(phydev, pin);
3775 
3776 	mutex_unlock(&shared->shared_lock);
3777 
3778 	return 0;
3779 }
3780 
3781 static int lan8814_ptpci_enable(struct ptp_clock_info *ptpci,
3782 				struct ptp_clock_request *rq, int on)
3783 {
3784 	switch (rq->type) {
3785 	case PTP_CLK_REQ_PEROUT:
3786 		return lan8814_ptp_perout(ptpci, rq, on);
3787 	case PTP_CLK_REQ_EXTTS:
3788 		return lan8814_ptp_extts(ptpci, rq, on);
3789 	default:
3790 		return -EINVAL;
3791 	}
3792 }
3793 
3794 static int lan8814_ptpci_verify(struct ptp_clock_info *ptp, unsigned int pin,
3795 				enum ptp_pin_function func, unsigned int chan)
3796 {
3797 	switch (func) {
3798 	case PTP_PF_NONE:
3799 	case PTP_PF_PEROUT:
3800 		/* Only pins 0 and 1 can generate perout signals. And for pin 0
3801 		 * there is only chan 0 (event A) and for pin 1 there is only
3802 		 * chan 1 (event B)
3803 		 */
3804 		if (pin >= LAN8814_PTP_PEROUT_NUM || pin != chan)
3805 			return -1;
3806 		break;
3807 	case PTP_PF_EXTTS:
3808 		if (pin != LAN8814_PTP_EXTTS_NUM)
3809 			return -1;
3810 		break;
3811 	default:
3812 		return -1;
3813 	}
3814 
3815 	return 0;
3816 }
3817 
3818 static bool lan8814_get_sig_tx(struct sk_buff *skb, u16 *sig)
3819 {
3820 	struct ptp_header *ptp_header;
3821 	u32 type;
3822 
3823 	type = ptp_classify_raw(skb);
3824 	ptp_header = ptp_parse_header(skb, type);
3825 
3826 	if (!ptp_header)
3827 		return false;
3828 
3829 	*sig = (__force u16)(ntohs(ptp_header->sequence_id));
3830 	return true;
3831 }
3832 
3833 static void lan8814_match_tx_skb(struct kszphy_ptp_priv *ptp_priv,
3834 				 u32 seconds, u32 nsec, u16 seq_id)
3835 {
3836 	struct skb_shared_hwtstamps shhwtstamps;
3837 	struct sk_buff *skb, *skb_tmp;
3838 	unsigned long flags;
3839 	bool ret = false;
3840 	u16 skb_sig;
3841 
3842 	spin_lock_irqsave(&ptp_priv->tx_queue.lock, flags);
3843 	skb_queue_walk_safe(&ptp_priv->tx_queue, skb, skb_tmp) {
3844 		if (!lan8814_get_sig_tx(skb, &skb_sig))
3845 			continue;
3846 
3847 		if (memcmp(&skb_sig, &seq_id, sizeof(seq_id)))
3848 			continue;
3849 
3850 		__skb_unlink(skb, &ptp_priv->tx_queue);
3851 		ret = true;
3852 		break;
3853 	}
3854 	spin_unlock_irqrestore(&ptp_priv->tx_queue.lock, flags);
3855 
3856 	if (ret) {
3857 		memset(&shhwtstamps, 0, sizeof(shhwtstamps));
3858 		shhwtstamps.hwtstamp = ktime_set(seconds, nsec);
3859 		skb_complete_tx_timestamp(skb, &shhwtstamps);
3860 	}
3861 }
3862 
3863 static void lan8814_dequeue_tx_skb(struct kszphy_ptp_priv *ptp_priv)
3864 {
3865 	struct phy_device *phydev = ptp_priv->phydev;
3866 	u32 seconds, nsec;
3867 	u16 seq_id;
3868 
3869 	lan8814_ptp_tx_ts_get(phydev, &seconds, &nsec, &seq_id);
3870 	lan8814_match_tx_skb(ptp_priv, seconds, nsec, seq_id);
3871 }
3872 
3873 static void lan8814_get_tx_ts(struct kszphy_ptp_priv *ptp_priv)
3874 {
3875 	struct phy_device *phydev = ptp_priv->phydev;
3876 	u32 reg;
3877 
3878 	do {
3879 		lan8814_dequeue_tx_skb(ptp_priv);
3880 
3881 		/* If other timestamps are available in the FIFO,
3882 		 * process them.
3883 		 */
3884 		reg = lanphy_read_page_reg(phydev, LAN8814_PAGE_PORT_REGS,
3885 					   PTP_CAP_INFO);
3886 	} while (PTP_CAP_INFO_TX_TS_CNT_GET_(reg) > 0);
3887 }
3888 
3889 static bool lan8814_match_skb(struct kszphy_ptp_priv *ptp_priv,
3890 			      struct lan8814_ptp_rx_ts *rx_ts)
3891 {
3892 	struct skb_shared_hwtstamps *shhwtstamps;
3893 	struct sk_buff *skb, *skb_tmp;
3894 	unsigned long flags;
3895 	bool ret = false;
3896 	u16 skb_sig;
3897 
3898 	spin_lock_irqsave(&ptp_priv->rx_queue.lock, flags);
3899 	skb_queue_walk_safe(&ptp_priv->rx_queue, skb, skb_tmp) {
3900 		if (!lan8814_get_sig_rx(skb, &skb_sig))
3901 			continue;
3902 
3903 		if (memcmp(&skb_sig, &rx_ts->seq_id, sizeof(rx_ts->seq_id)))
3904 			continue;
3905 
3906 		__skb_unlink(skb, &ptp_priv->rx_queue);
3907 
3908 		ret = true;
3909 		break;
3910 	}
3911 	spin_unlock_irqrestore(&ptp_priv->rx_queue.lock, flags);
3912 
3913 	if (ret) {
3914 		shhwtstamps = skb_hwtstamps(skb);
3915 		memset(shhwtstamps, 0, sizeof(*shhwtstamps));
3916 		shhwtstamps->hwtstamp = ktime_set(rx_ts->seconds, rx_ts->nsec);
3917 		netif_rx(skb);
3918 	}
3919 
3920 	return ret;
3921 }
3922 
3923 static void lan8814_match_rx_ts(struct kszphy_ptp_priv *ptp_priv,
3924 				struct lan8814_ptp_rx_ts *rx_ts)
3925 {
3926 	unsigned long flags;
3927 
3928 	/* If we failed to match the skb add it to the queue for when
3929 	 * the frame will come
3930 	 */
3931 	if (!lan8814_match_skb(ptp_priv, rx_ts)) {
3932 		spin_lock_irqsave(&ptp_priv->rx_ts_lock, flags);
3933 		list_add(&rx_ts->list, &ptp_priv->rx_ts_list);
3934 		spin_unlock_irqrestore(&ptp_priv->rx_ts_lock, flags);
3935 	} else {
3936 		kfree(rx_ts);
3937 	}
3938 }
3939 
3940 static void lan8814_get_rx_ts(struct kszphy_ptp_priv *ptp_priv)
3941 {
3942 	struct phy_device *phydev = ptp_priv->phydev;
3943 	struct lan8814_ptp_rx_ts *rx_ts;
3944 	u32 reg;
3945 
3946 	do {
3947 		rx_ts = kzalloc(sizeof(*rx_ts), GFP_KERNEL);
3948 		if (!rx_ts)
3949 			return;
3950 
3951 		lan8814_ptp_rx_ts_get(phydev, &rx_ts->seconds, &rx_ts->nsec,
3952 				      &rx_ts->seq_id);
3953 		lan8814_match_rx_ts(ptp_priv, rx_ts);
3954 
3955 		/* If other timestamps are available in the FIFO,
3956 		 * process them.
3957 		 */
3958 		reg = lanphy_read_page_reg(phydev, LAN8814_PAGE_PORT_REGS,
3959 					   PTP_CAP_INFO);
3960 	} while (PTP_CAP_INFO_RX_TS_CNT_GET_(reg) > 0);
3961 }
3962 
3963 static void lan8814_handle_ptp_interrupt(struct phy_device *phydev, u16 status)
3964 {
3965 	struct kszphy_priv *priv = phydev->priv;
3966 	struct kszphy_ptp_priv *ptp_priv = &priv->ptp_priv;
3967 
3968 	if (status & PTP_TSU_INT_STS_PTP_TX_TS_EN_)
3969 		lan8814_get_tx_ts(ptp_priv);
3970 
3971 	if (status & PTP_TSU_INT_STS_PTP_RX_TS_EN_)
3972 		lan8814_get_rx_ts(ptp_priv);
3973 
3974 	if (status & PTP_TSU_INT_STS_PTP_TX_TS_OVRFL_INT_) {
3975 		lan8814_flush_fifo(phydev, true);
3976 		skb_queue_purge(&ptp_priv->tx_queue);
3977 	}
3978 
3979 	if (status & PTP_TSU_INT_STS_PTP_RX_TS_OVRFL_INT_) {
3980 		lan8814_flush_fifo(phydev, false);
3981 		skb_queue_purge(&ptp_priv->rx_queue);
3982 	}
3983 }
3984 
3985 static int lan8814_gpio_process_cap(struct lan8814_shared_priv *shared)
3986 {
3987 	struct phy_device *phydev = shared->phydev;
3988 	struct ptp_clock_event ptp_event = {0};
3989 	unsigned long nsec;
3990 	s64 sec;
3991 	u16 tmp;
3992 
3993 	/* This is 0 because whatever was the input pin it was mapped it to
3994 	 * ltc gpio pin 0
3995 	 */
3996 	lanphy_modify_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, PTP_GPIO_SEL,
3997 			       PTP_GPIO_SEL_GPIO_SEL(0),
3998 			       PTP_GPIO_SEL_GPIO_SEL(0));
3999 
4000 	tmp = lanphy_read_page_reg(phydev, LAN8814_PAGE_COMMON_REGS,
4001 				   PTP_GPIO_CAP_STS);
4002 	if (!(tmp & PTP_GPIO_CAP_STS_PTP_GPIO_RE_STS(0)) &&
4003 	    !(tmp & PTP_GPIO_CAP_STS_PTP_GPIO_FE_STS(0)))
4004 		return -1;
4005 
4006 	if (tmp & BIT(0)) {
4007 		sec = lanphy_read_page_reg(phydev, LAN8814_PAGE_COMMON_REGS,
4008 					   PTP_GPIO_RE_LTC_SEC_HI_CAP);
4009 		sec <<= 16;
4010 		sec |= lanphy_read_page_reg(phydev, LAN8814_PAGE_COMMON_REGS,
4011 					    PTP_GPIO_RE_LTC_SEC_LO_CAP);
4012 
4013 		nsec = lanphy_read_page_reg(phydev, LAN8814_PAGE_COMMON_REGS,
4014 					    PTP_GPIO_RE_LTC_NS_HI_CAP) & 0x3fff;
4015 		nsec <<= 16;
4016 		nsec |= lanphy_read_page_reg(phydev, LAN8814_PAGE_COMMON_REGS,
4017 					     PTP_GPIO_RE_LTC_NS_LO_CAP);
4018 	} else {
4019 		sec = lanphy_read_page_reg(phydev, LAN8814_PAGE_COMMON_REGS,
4020 					   PTP_GPIO_FE_LTC_SEC_HI_CAP);
4021 		sec <<= 16;
4022 		sec |= lanphy_read_page_reg(phydev, LAN8814_PAGE_COMMON_REGS,
4023 					    PTP_GPIO_FE_LTC_SEC_LO_CAP);
4024 
4025 		nsec = lanphy_read_page_reg(phydev, LAN8814_PAGE_COMMON_REGS,
4026 					    PTP_GPIO_FE_LTC_NS_HI_CAP) & 0x3fff;
4027 		nsec <<= 16;
4028 		nsec |= lanphy_read_page_reg(phydev, LAN8814_PAGE_COMMON_REGS,
4029 					     PTP_GPIO_RE_LTC_NS_LO_CAP);
4030 	}
4031 
4032 	ptp_event.index = 0;
4033 	ptp_event.timestamp = ktime_set(sec, nsec);
4034 	ptp_event.type = PTP_CLOCK_EXTTS;
4035 	ptp_clock_event(shared->ptp_clock, &ptp_event);
4036 
4037 	return 0;
4038 }
4039 
4040 static int lan8814_handle_gpio_interrupt(struct phy_device *phydev, u16 status)
4041 {
4042 	struct lan8814_shared_priv *shared = phy_package_get_priv(phydev);
4043 	int ret;
4044 
4045 	mutex_lock(&shared->shared_lock);
4046 	ret = lan8814_gpio_process_cap(shared);
4047 	mutex_unlock(&shared->shared_lock);
4048 
4049 	return ret;
4050 }
4051 
4052 static int lan8804_config_init(struct phy_device *phydev)
4053 {
4054 	/* MDI-X setting for swap A,B transmit */
4055 	lanphy_modify_page_reg(phydev, LAN8814_PAGE_PCS_DIGITAL, LAN8804_ALIGN_SWAP,
4056 			       LAN8804_ALIGN_TX_A_B_SWAP_MASK,
4057 			       LAN8804_ALIGN_TX_A_B_SWAP);
4058 
4059 	/* Make sure that the PHY will not stop generating the clock when the
4060 	 * link partner goes down
4061 	 */
4062 	lanphy_write_page_reg(phydev, LAN8814_PAGE_SYSTEM_CTRL,
4063 			      LAN8814_CLOCK_MANAGEMENT, 0x27e);
4064 	lanphy_read_page_reg(phydev, LAN8814_PAGE_AFE_PMA, LAN8814_LINK_QUALITY);
4065 
4066 	return 0;
4067 }
4068 
4069 static irqreturn_t lan8804_handle_interrupt(struct phy_device *phydev)
4070 {
4071 	int status;
4072 
4073 	status = phy_read(phydev, LAN8814_INTS);
4074 	if (status < 0) {
4075 		phy_error(phydev);
4076 		return IRQ_NONE;
4077 	}
4078 
4079 	if (status > 0)
4080 		phy_trigger_machine(phydev);
4081 
4082 	return IRQ_HANDLED;
4083 }
4084 
4085 #define LAN8804_OUTPUT_CONTROL			25
4086 #define LAN8804_OUTPUT_CONTROL_INTR_BUFFER	BIT(14)
4087 #define LAN8804_CONTROL				31
4088 #define LAN8804_CONTROL_INTR_POLARITY		BIT(14)
4089 
4090 static int lan8804_config_intr(struct phy_device *phydev)
4091 {
4092 	int err;
4093 
4094 	/* This is an internal PHY of lan966x and is not possible to change the
4095 	 * polarity on the GIC found in lan966x, therefore change the polarity
4096 	 * of the interrupt in the PHY from being active low instead of active
4097 	 * high.
4098 	 */
4099 	phy_write(phydev, LAN8804_CONTROL, LAN8804_CONTROL_INTR_POLARITY);
4100 
4101 	/* By default interrupt buffer is open-drain in which case the interrupt
4102 	 * can be active only low. Therefore change the interrupt buffer to be
4103 	 * push-pull to be able to change interrupt polarity
4104 	 */
4105 	phy_write(phydev, LAN8804_OUTPUT_CONTROL,
4106 		  LAN8804_OUTPUT_CONTROL_INTR_BUFFER);
4107 
4108 	if (phydev->interrupts == PHY_INTERRUPT_ENABLED) {
4109 		err = phy_read(phydev, LAN8814_INTS);
4110 		if (err < 0)
4111 			return err;
4112 
4113 		err = phy_write(phydev, LAN8814_INTC, LAN8814_INT_LINK);
4114 		if (err)
4115 			return err;
4116 	} else {
4117 		err = phy_write(phydev, LAN8814_INTC, 0);
4118 		if (err)
4119 			return err;
4120 
4121 		err = phy_read(phydev, LAN8814_INTS);
4122 		if (err < 0)
4123 			return err;
4124 	}
4125 
4126 	return 0;
4127 }
4128 
4129 static irqreturn_t lan8814_handle_interrupt(struct phy_device *phydev)
4130 {
4131 	int ret = IRQ_NONE;
4132 	int irq_status;
4133 
4134 	irq_status = phy_read(phydev, LAN8814_INTS);
4135 	if (irq_status < 0) {
4136 		phy_error(phydev);
4137 		return IRQ_NONE;
4138 	}
4139 
4140 	if (irq_status & LAN8814_INT_LINK) {
4141 		phy_trigger_machine(phydev);
4142 		ret = IRQ_HANDLED;
4143 	}
4144 
4145 	while (true) {
4146 		irq_status = lanphy_read_page_reg(phydev, LAN8814_PAGE_PORT_REGS,
4147 						  PTP_TSU_INT_STS);
4148 		if (!irq_status)
4149 			break;
4150 
4151 		lan8814_handle_ptp_interrupt(phydev, irq_status);
4152 		ret = IRQ_HANDLED;
4153 	}
4154 
4155 	if (!lan8814_handle_gpio_interrupt(phydev, irq_status))
4156 		ret = IRQ_HANDLED;
4157 
4158 	return ret;
4159 }
4160 
4161 static int lan8814_ack_interrupt(struct phy_device *phydev)
4162 {
4163 	/* bit[12..0] int status, which is a read and clear register. */
4164 	int rc;
4165 
4166 	rc = phy_read(phydev, LAN8814_INTS);
4167 
4168 	return (rc < 0) ? rc : 0;
4169 }
4170 
4171 static int lan8814_config_intr(struct phy_device *phydev)
4172 {
4173 	int err;
4174 
4175 	lanphy_write_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, LAN8814_INTR_CTRL_REG,
4176 			      LAN8814_INTR_CTRL_REG_POLARITY |
4177 			      LAN8814_INTR_CTRL_REG_INTR_ENABLE);
4178 
4179 	/* enable / disable interrupts */
4180 	if (phydev->interrupts == PHY_INTERRUPT_ENABLED) {
4181 		err = lan8814_ack_interrupt(phydev);
4182 		if (err)
4183 			return err;
4184 
4185 		err = phy_write(phydev, LAN8814_INTC, LAN8814_INT_LINK);
4186 	} else {
4187 		err = phy_write(phydev, LAN8814_INTC, 0);
4188 		if (err)
4189 			return err;
4190 
4191 		err = lan8814_ack_interrupt(phydev);
4192 	}
4193 
4194 	return err;
4195 }
4196 
4197 static void lan8814_ptp_init(struct phy_device *phydev)
4198 {
4199 	struct kszphy_priv *priv = phydev->priv;
4200 	struct kszphy_ptp_priv *ptp_priv = &priv->ptp_priv;
4201 
4202 	if (!IS_ENABLED(CONFIG_PTP_1588_CLOCK) ||
4203 	    !IS_ENABLED(CONFIG_NETWORK_PHY_TIMESTAMPING))
4204 		return;
4205 
4206 	lanphy_write_page_reg(phydev, LAN8814_PAGE_PORT_REGS,
4207 			      TSU_HARD_RESET, TSU_HARD_RESET_);
4208 
4209 	lanphy_modify_page_reg(phydev, LAN8814_PAGE_PORT_REGS, PTP_TX_MOD,
4210 			       PTP_TX_MOD_BAD_UDPV4_CHKSUM_FORCE_FCS_DIS_,
4211 			       PTP_TX_MOD_BAD_UDPV4_CHKSUM_FORCE_FCS_DIS_);
4212 
4213 	lanphy_modify_page_reg(phydev, LAN8814_PAGE_PORT_REGS, PTP_RX_MOD,
4214 			       PTP_RX_MOD_BAD_UDPV4_CHKSUM_FORCE_FCS_DIS_,
4215 			       PTP_RX_MOD_BAD_UDPV4_CHKSUM_FORCE_FCS_DIS_);
4216 
4217 	lanphy_write_page_reg(phydev, LAN8814_PAGE_PORT_REGS,
4218 			      PTP_RX_PARSE_CONFIG, 0);
4219 	lanphy_write_page_reg(phydev, LAN8814_PAGE_PORT_REGS,
4220 			      PTP_TX_PARSE_CONFIG, 0);
4221 
4222 	/* Removing default registers configs related to L2 and IP */
4223 	lanphy_write_page_reg(phydev, LAN8814_PAGE_PORT_REGS,
4224 			      PTP_TX_PARSE_L2_ADDR_EN, 0);
4225 	lanphy_write_page_reg(phydev, LAN8814_PAGE_PORT_REGS,
4226 			      PTP_RX_PARSE_L2_ADDR_EN, 0);
4227 	lanphy_write_page_reg(phydev, LAN8814_PAGE_PORT_REGS,
4228 			      PTP_TX_PARSE_IP_ADDR_EN, 0);
4229 	lanphy_write_page_reg(phydev, LAN8814_PAGE_PORT_REGS,
4230 			      PTP_RX_PARSE_IP_ADDR_EN, 0);
4231 
4232 	/* Disable checking for minorVersionPTP field */
4233 	lanphy_write_page_reg(phydev, LAN8814_PAGE_PORT_REGS, PTP_RX_VERSION,
4234 			      PTP_MAX_VERSION(0xff) | PTP_MIN_VERSION(0x0));
4235 	lanphy_write_page_reg(phydev, LAN8814_PAGE_PORT_REGS, PTP_TX_VERSION,
4236 			      PTP_MAX_VERSION(0xff) | PTP_MIN_VERSION(0x0));
4237 
4238 	skb_queue_head_init(&ptp_priv->tx_queue);
4239 	skb_queue_head_init(&ptp_priv->rx_queue);
4240 	INIT_LIST_HEAD(&ptp_priv->rx_ts_list);
4241 	spin_lock_init(&ptp_priv->rx_ts_lock);
4242 
4243 	ptp_priv->phydev = phydev;
4244 
4245 	ptp_priv->mii_ts.rxtstamp = lan8814_rxtstamp;
4246 	ptp_priv->mii_ts.txtstamp = lan8814_txtstamp;
4247 	ptp_priv->mii_ts.hwtstamp = lan8814_hwtstamp;
4248 	ptp_priv->mii_ts.ts_info  = lan8814_ts_info;
4249 
4250 	phydev->mii_ts = &ptp_priv->mii_ts;
4251 
4252 	/* Timestamp selected by default to keep legacy API */
4253 	phydev->default_timestamp = true;
4254 }
4255 
4256 static int __lan8814_ptp_probe_once(struct phy_device *phydev, char *pin_name,
4257 				    int gpios)
4258 {
4259 	struct lan8814_shared_priv *shared = phy_package_get_priv(phydev);
4260 
4261 	/* Initialise shared lock for clock*/
4262 	mutex_init(&shared->shared_lock);
4263 
4264 	shared->pin_config = devm_kmalloc_array(&phydev->mdio.dev,
4265 						gpios,
4266 						sizeof(*shared->pin_config),
4267 						GFP_KERNEL);
4268 	if (!shared->pin_config)
4269 		return -ENOMEM;
4270 
4271 	for (int i = 0; i < gpios; i++) {
4272 		struct ptp_pin_desc *ptp_pin = &shared->pin_config[i];
4273 
4274 		memset(ptp_pin, 0, sizeof(*ptp_pin));
4275 		snprintf(ptp_pin->name,
4276 			 sizeof(ptp_pin->name), "%s_%02d", pin_name, i);
4277 		ptp_pin->index = i;
4278 		ptp_pin->func =  PTP_PF_NONE;
4279 	}
4280 
4281 	shared->ptp_clock_info.owner = THIS_MODULE;
4282 	snprintf(shared->ptp_clock_info.name, 30, "%s", phydev->drv->name);
4283 	shared->ptp_clock_info.max_adj = 31249999;
4284 	shared->ptp_clock_info.n_alarm = 0;
4285 	shared->ptp_clock_info.n_ext_ts = LAN8814_PTP_EXTTS_NUM;
4286 	shared->ptp_clock_info.n_pins = gpios;
4287 	shared->ptp_clock_info.pps = 0;
4288 	shared->ptp_clock_info.supported_extts_flags = PTP_RISING_EDGE |
4289 						       PTP_FALLING_EDGE |
4290 						       PTP_STRICT_FLAGS;
4291 	shared->ptp_clock_info.supported_perout_flags = PTP_PEROUT_DUTY_CYCLE;
4292 	shared->ptp_clock_info.pin_config = shared->pin_config;
4293 	shared->ptp_clock_info.n_per_out = LAN8814_PTP_PEROUT_NUM;
4294 	shared->ptp_clock_info.adjfine = lan8814_ptpci_adjfine;
4295 	shared->ptp_clock_info.adjtime = lan8814_ptpci_adjtime;
4296 	shared->ptp_clock_info.gettime64 = lan8814_ptpci_gettime64;
4297 	shared->ptp_clock_info.settime64 = lan8814_ptpci_settime64;
4298 	shared->ptp_clock_info.getcrosststamp = NULL;
4299 	shared->ptp_clock_info.enable = lan8814_ptpci_enable;
4300 	shared->ptp_clock_info.verify = lan8814_ptpci_verify;
4301 
4302 	shared->ptp_clock = ptp_clock_register(&shared->ptp_clock_info,
4303 					       &phydev->mdio.dev);
4304 	if (IS_ERR(shared->ptp_clock)) {
4305 		phydev_err(phydev, "ptp_clock_register failed %pe\n",
4306 			   shared->ptp_clock);
4307 		return -EINVAL;
4308 	}
4309 
4310 	/* Check if PHC support is missing at the configuration level */
4311 	if (!shared->ptp_clock)
4312 		return 0;
4313 
4314 	phydev_dbg(phydev, "successfully registered ptp clock\n");
4315 
4316 	shared->phydev = phydev;
4317 
4318 	/* The EP.4 is shared between all the PHYs in the package and also it
4319 	 * can be accessed by any of the PHYs
4320 	 */
4321 	lanphy_write_page_reg(phydev, LAN8814_PAGE_COMMON_REGS,
4322 			      LTC_HARD_RESET, LTC_HARD_RESET_);
4323 	lanphy_write_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, PTP_OPERATING_MODE,
4324 			      PTP_OPERATING_MODE_STANDALONE_);
4325 
4326 	/* Enable ptp to run LTC clock for ptp and gpio 1PPS operation */
4327 	lanphy_write_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, PTP_CMD_CTL,
4328 			      PTP_CMD_CTL_PTP_ENABLE_);
4329 
4330 	return 0;
4331 }
4332 
4333 static int lan8814_ptp_probe_once(struct phy_device *phydev)
4334 {
4335 	return __lan8814_ptp_probe_once(phydev, "lan8814_ptp_pin",
4336 					LAN8814_PTP_GPIO_NUM);
4337 }
4338 
4339 static void lan8814_setup_led(struct phy_device *phydev, int val)
4340 {
4341 	int temp;
4342 
4343 	temp = lanphy_read_page_reg(phydev, LAN8814_PAGE_PORT_REGS,
4344 				    LAN8814_LED_CTRL_1);
4345 
4346 	if (val)
4347 		temp |= LAN8814_LED_CTRL_1_KSZ9031_LED_MODE_;
4348 	else
4349 		temp &= ~LAN8814_LED_CTRL_1_KSZ9031_LED_MODE_;
4350 
4351 	lanphy_write_page_reg(phydev, LAN8814_PAGE_PORT_REGS,
4352 			      LAN8814_LED_CTRL_1, temp);
4353 }
4354 
4355 static int lan8814_config_init(struct phy_device *phydev)
4356 {
4357 	struct kszphy_priv *lan8814 = phydev->priv;
4358 
4359 	/* Reset the PHY */
4360 	lanphy_modify_page_reg(phydev, LAN8814_PAGE_COMMON_REGS,
4361 			       LAN8814_QSGMII_SOFT_RESET,
4362 			       LAN8814_QSGMII_SOFT_RESET_BIT,
4363 			       LAN8814_QSGMII_SOFT_RESET_BIT);
4364 
4365 	/* Disable ANEG with QSGMII PCS Host side */
4366 	lanphy_modify_page_reg(phydev, LAN8814_PAGE_PORT_REGS,
4367 			       LAN8814_QSGMII_PCS1G_ANEG_CONFIG,
4368 			       LAN8814_QSGMII_PCS1G_ANEG_CONFIG_ANEG_ENA,
4369 			       0);
4370 
4371 	/* MDI-X setting for swap A,B transmit */
4372 	lanphy_modify_page_reg(phydev, LAN8814_PAGE_PCS_DIGITAL, LAN8814_ALIGN_SWAP,
4373 			       LAN8814_ALIGN_TX_A_B_SWAP_MASK,
4374 			       LAN8814_ALIGN_TX_A_B_SWAP);
4375 
4376 	if (lan8814->led_mode >= 0)
4377 		lan8814_setup_led(phydev, lan8814->led_mode);
4378 
4379 	return 0;
4380 }
4381 
4382 /* It is expected that there will not be any 'lan8814_take_coma_mode'
4383  * function called in suspend. Because the GPIO line can be shared, so if one of
4384  * the phys goes back in coma mode, then all the other PHYs will go, which is
4385  * wrong.
4386  */
4387 static int lan8814_release_coma_mode(struct phy_device *phydev)
4388 {
4389 	struct gpio_desc *gpiod;
4390 
4391 	gpiod = devm_gpiod_get_optional(&phydev->mdio.dev, "coma-mode",
4392 					GPIOD_OUT_HIGH_OPEN_DRAIN |
4393 					GPIOD_FLAGS_BIT_NONEXCLUSIVE);
4394 	if (IS_ERR(gpiod))
4395 		return PTR_ERR(gpiod);
4396 
4397 	gpiod_set_consumer_name(gpiod, "LAN8814 coma mode");
4398 	gpiod_set_value_cansleep(gpiod, 0);
4399 
4400 	return 0;
4401 }
4402 
4403 static void lan8814_clear_2psp_bit(struct phy_device *phydev)
4404 {
4405 	/* It was noticed that when traffic is passing through the PHY and the
4406 	 * cable is removed then the LED was still on even though there is no
4407 	 * link
4408 	 */
4409 	lanphy_modify_page_reg(phydev, LAN8814_PAGE_PCS_DIGITAL, LAN8814_EEE_STATE,
4410 			       LAN8814_EEE_STATE_MASK2P5P,
4411 			       0);
4412 }
4413 
4414 static void lan8814_update_meas_time(struct phy_device *phydev)
4415 {
4416 	/* By setting the measure time to a value of 0xb this will allow cables
4417 	 * longer than 100m to be used. This configuration can be used
4418 	 * regardless of the mode of operation of the PHY
4419 	 */
4420 	lanphy_modify_page_reg(phydev, LAN8814_PAGE_AFE_PMA, LAN8814_PD_CONTROLS,
4421 			       LAN8814_PD_CONTROLS_PD_MEAS_TIME_MASK,
4422 			       LAN8814_PD_CONTROLS_PD_MEAS_TIME_VAL);
4423 }
4424 
4425 static int lan8814_probe(struct phy_device *phydev)
4426 {
4427 	const struct kszphy_type *type = phydev->drv->driver_data;
4428 	struct kszphy_priv *priv;
4429 	u16 addr;
4430 	int err;
4431 
4432 	priv = devm_kzalloc(&phydev->mdio.dev, sizeof(*priv), GFP_KERNEL);
4433 	if (!priv)
4434 		return -ENOMEM;
4435 
4436 	phydev->priv = priv;
4437 
4438 	priv->type = type;
4439 
4440 	kszphy_parse_led_mode(phydev);
4441 
4442 	/* Strap-in value for PHY address, below register read gives starting
4443 	 * phy address value
4444 	 */
4445 	addr = lanphy_read_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, 0) & 0x1F;
4446 	devm_phy_package_join(&phydev->mdio.dev, phydev,
4447 			      addr, sizeof(struct lan8814_shared_priv));
4448 
4449 	if (phy_package_init_once(phydev)) {
4450 		err = lan8814_release_coma_mode(phydev);
4451 		if (err)
4452 			return err;
4453 
4454 		err = lan8814_ptp_probe_once(phydev);
4455 		if (err)
4456 			return err;
4457 	}
4458 
4459 	lan8814_ptp_init(phydev);
4460 
4461 	/* Errata workarounds */
4462 	lan8814_clear_2psp_bit(phydev);
4463 	lan8814_update_meas_time(phydev);
4464 
4465 	return 0;
4466 }
4467 
4468 #define LAN8841_MMD_TIMER_REG			0
4469 #define LAN8841_MMD0_REGISTER_17		17
4470 #define LAN8841_MMD0_REGISTER_17_DROP_OPT(x)	((x) & 0x3)
4471 #define LAN8841_MMD0_REGISTER_17_XMIT_TOG_TX_DIS	BIT(3)
4472 #define LAN8841_OPERATION_MODE_STRAP_OVERRIDE_LOW_REG	2
4473 #define LAN8841_OPERATION_MODE_STRAP_OVERRIDE_LOW_REG_MAGJACK	BIT(14)
4474 #define LAN8841_MMD_ANALOG_REG			28
4475 #define LAN8841_ANALOG_CONTROL_1		1
4476 #define LAN8841_ANALOG_CONTROL_1_PLL_TRIM(x)	(((x) & 0x3) << 5)
4477 #define LAN8841_ANALOG_CONTROL_10		13
4478 #define LAN8841_ANALOG_CONTROL_10_PLL_DIV(x)	((x) & 0x3)
4479 #define LAN8841_ANALOG_CONTROL_11		14
4480 #define LAN8841_ANALOG_CONTROL_11_LDO_REF(x)	(((x) & 0x7) << 12)
4481 #define LAN8841_TX_LOW_I_CH_C_D_POWER_MANAGMENT	69
4482 #define LAN8841_TX_LOW_I_CH_C_D_POWER_MANAGMENT_VAL 0xbffc
4483 #define LAN8841_BTRX_POWER_DOWN			70
4484 #define LAN8841_BTRX_POWER_DOWN_QBIAS_CH_A	BIT(0)
4485 #define LAN8841_BTRX_POWER_DOWN_BTRX_CH_A	BIT(1)
4486 #define LAN8841_BTRX_POWER_DOWN_QBIAS_CH_B	BIT(2)
4487 #define LAN8841_BTRX_POWER_DOWN_BTRX_CH_B	BIT(3)
4488 #define LAN8841_BTRX_POWER_DOWN_BTRX_CH_C	BIT(5)
4489 #define LAN8841_BTRX_POWER_DOWN_BTRX_CH_D	BIT(7)
4490 #define LAN8841_ADC_CHANNEL_MASK		198
4491 #define LAN8841_PTP_RX_PARSE_L2_ADDR_EN		370
4492 #define LAN8841_PTP_RX_PARSE_IP_ADDR_EN		371
4493 #define LAN8841_PTP_RX_VERSION			374
4494 #define LAN8841_PTP_TX_PARSE_L2_ADDR_EN		434
4495 #define LAN8841_PTP_TX_PARSE_IP_ADDR_EN		435
4496 #define LAN8841_PTP_TX_VERSION			438
4497 #define LAN8841_PTP_CMD_CTL			256
4498 #define LAN8841_PTP_CMD_CTL_PTP_ENABLE		BIT(2)
4499 #define LAN8841_PTP_CMD_CTL_PTP_DISABLE		BIT(1)
4500 #define LAN8841_PTP_CMD_CTL_PTP_RESET		BIT(0)
4501 #define LAN8841_PTP_RX_PARSE_CONFIG		368
4502 #define LAN8841_PTP_TX_PARSE_CONFIG		432
4503 #define LAN8841_PTP_RX_MODE			381
4504 #define LAN8841_PTP_INSERT_TS_EN		BIT(0)
4505 #define LAN8841_PTP_INSERT_TS_32BIT		BIT(1)
4506 
4507 static int lan8841_config_init(struct phy_device *phydev)
4508 {
4509 	int ret;
4510 
4511 	ret = ksz9131_config_init(phydev);
4512 	if (ret)
4513 		return ret;
4514 
4515 	/* Initialize the HW by resetting everything */
4516 	phy_modify_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG,
4517 		       LAN8841_PTP_CMD_CTL,
4518 		       LAN8841_PTP_CMD_CTL_PTP_RESET,
4519 		       LAN8841_PTP_CMD_CTL_PTP_RESET);
4520 
4521 	phy_modify_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG,
4522 		       LAN8841_PTP_CMD_CTL,
4523 		       LAN8841_PTP_CMD_CTL_PTP_ENABLE,
4524 		       LAN8841_PTP_CMD_CTL_PTP_ENABLE);
4525 
4526 	/* Don't process any frames */
4527 	phy_write_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG,
4528 		      LAN8841_PTP_RX_PARSE_CONFIG, 0);
4529 	phy_write_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG,
4530 		      LAN8841_PTP_TX_PARSE_CONFIG, 0);
4531 	phy_write_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG,
4532 		      LAN8841_PTP_TX_PARSE_L2_ADDR_EN, 0);
4533 	phy_write_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG,
4534 		      LAN8841_PTP_RX_PARSE_L2_ADDR_EN, 0);
4535 	phy_write_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG,
4536 		      LAN8841_PTP_TX_PARSE_IP_ADDR_EN, 0);
4537 	phy_write_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG,
4538 		      LAN8841_PTP_RX_PARSE_IP_ADDR_EN, 0);
4539 
4540 	/* Disable checking for minorVersionPTP field */
4541 	phy_write_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG,
4542 		      LAN8841_PTP_RX_VERSION, 0xff00);
4543 	phy_write_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG,
4544 		      LAN8841_PTP_TX_VERSION, 0xff00);
4545 
4546 	/* 100BT Clause 40 improvement errata */
4547 	phy_write_mmd(phydev, LAN8841_MMD_ANALOG_REG,
4548 		      LAN8841_ANALOG_CONTROL_1,
4549 		      LAN8841_ANALOG_CONTROL_1_PLL_TRIM(0x2));
4550 	phy_write_mmd(phydev, LAN8841_MMD_ANALOG_REG,
4551 		      LAN8841_ANALOG_CONTROL_10,
4552 		      LAN8841_ANALOG_CONTROL_10_PLL_DIV(0x1));
4553 
4554 	/* 10M/100M Ethernet Signal Tuning Errata for Shorted-Center Tap
4555 	 * Magnetics
4556 	 */
4557 	ret = phy_read_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG,
4558 			   LAN8841_OPERATION_MODE_STRAP_OVERRIDE_LOW_REG);
4559 	if (ret & LAN8841_OPERATION_MODE_STRAP_OVERRIDE_LOW_REG_MAGJACK) {
4560 		phy_write_mmd(phydev, LAN8841_MMD_ANALOG_REG,
4561 			      LAN8841_TX_LOW_I_CH_C_D_POWER_MANAGMENT,
4562 			      LAN8841_TX_LOW_I_CH_C_D_POWER_MANAGMENT_VAL);
4563 		phy_write_mmd(phydev, LAN8841_MMD_ANALOG_REG,
4564 			      LAN8841_BTRX_POWER_DOWN,
4565 			      LAN8841_BTRX_POWER_DOWN_QBIAS_CH_A |
4566 			      LAN8841_BTRX_POWER_DOWN_BTRX_CH_A |
4567 			      LAN8841_BTRX_POWER_DOWN_QBIAS_CH_B |
4568 			      LAN8841_BTRX_POWER_DOWN_BTRX_CH_B |
4569 			      LAN8841_BTRX_POWER_DOWN_BTRX_CH_C |
4570 			      LAN8841_BTRX_POWER_DOWN_BTRX_CH_D);
4571 	}
4572 
4573 	/* LDO Adjustment errata */
4574 	phy_write_mmd(phydev, LAN8841_MMD_ANALOG_REG,
4575 		      LAN8841_ANALOG_CONTROL_11,
4576 		      LAN8841_ANALOG_CONTROL_11_LDO_REF(1));
4577 
4578 	/* 100BT RGMII latency tuning errata */
4579 	phy_write_mmd(phydev, MDIO_MMD_PMAPMD,
4580 		      LAN8841_ADC_CHANNEL_MASK, 0x0);
4581 	phy_write_mmd(phydev, LAN8841_MMD_TIMER_REG,
4582 		      LAN8841_MMD0_REGISTER_17,
4583 		      LAN8841_MMD0_REGISTER_17_DROP_OPT(2) |
4584 		      LAN8841_MMD0_REGISTER_17_XMIT_TOG_TX_DIS);
4585 
4586 	return 0;
4587 }
4588 
4589 #define LAN8841_OUTPUT_CTRL			25
4590 #define LAN8841_OUTPUT_CTRL_INT_BUFFER		BIT(14)
4591 #define LAN8841_INT_PTP				BIT(9)
4592 
4593 static int lan8841_config_intr(struct phy_device *phydev)
4594 {
4595 	int err;
4596 
4597 	phy_modify(phydev, LAN8841_OUTPUT_CTRL,
4598 		   LAN8841_OUTPUT_CTRL_INT_BUFFER, 0);
4599 
4600 	if (phydev->interrupts == PHY_INTERRUPT_ENABLED) {
4601 		err = phy_read(phydev, LAN8814_INTS);
4602 		if (err < 0)
4603 			return err;
4604 
4605 		/* Enable / disable interrupts. It is OK to enable PTP interrupt
4606 		 * even if it PTP is not enabled. Because the underneath blocks
4607 		 * will not enable the PTP so we will never get the PTP
4608 		 * interrupt.
4609 		 */
4610 		err = phy_write(phydev, LAN8814_INTC,
4611 				LAN8814_INT_LINK | LAN8841_INT_PTP);
4612 	} else {
4613 		err = phy_write(phydev, LAN8814_INTC, 0);
4614 		if (err)
4615 			return err;
4616 
4617 		err = phy_read(phydev, LAN8814_INTS);
4618 		if (err < 0)
4619 			return err;
4620 
4621 		/* Getting a positive value doesn't mean that is an error, it
4622 		 * just indicates what was the status. Therefore make sure to
4623 		 * clear the value and say that there is no error.
4624 		 */
4625 		err = 0;
4626 	}
4627 
4628 	return err;
4629 }
4630 
4631 #define LAN8841_PTP_TX_EGRESS_SEC_LO			453
4632 #define LAN8841_PTP_TX_EGRESS_SEC_HI			452
4633 #define LAN8841_PTP_TX_EGRESS_NS_LO			451
4634 #define LAN8841_PTP_TX_EGRESS_NS_HI			450
4635 #define LAN8841_PTP_TX_EGRESS_NSEC_HI_VALID		BIT(15)
4636 #define LAN8841_PTP_TX_MSG_HEADER2			455
4637 
4638 static bool lan8841_ptp_get_tx_ts(struct kszphy_ptp_priv *ptp_priv,
4639 				  u32 *sec, u32 *nsec, u16 *seq)
4640 {
4641 	struct phy_device *phydev = ptp_priv->phydev;
4642 
4643 	*nsec = phy_read_mmd(phydev, 2, LAN8841_PTP_TX_EGRESS_NS_HI);
4644 	if (!(*nsec & LAN8841_PTP_TX_EGRESS_NSEC_HI_VALID))
4645 		return false;
4646 
4647 	*nsec = ((*nsec & 0x3fff) << 16);
4648 	*nsec = *nsec | phy_read_mmd(phydev, 2, LAN8841_PTP_TX_EGRESS_NS_LO);
4649 
4650 	*sec = phy_read_mmd(phydev, 2, LAN8841_PTP_TX_EGRESS_SEC_HI);
4651 	*sec = *sec << 16;
4652 	*sec = *sec | phy_read_mmd(phydev, 2, LAN8841_PTP_TX_EGRESS_SEC_LO);
4653 
4654 	*seq = phy_read_mmd(phydev, 2, LAN8841_PTP_TX_MSG_HEADER2);
4655 
4656 	return true;
4657 }
4658 
4659 static void lan8841_ptp_process_tx_ts(struct kszphy_ptp_priv *ptp_priv)
4660 {
4661 	u32 sec, nsec;
4662 	u16 seq;
4663 
4664 	while (lan8841_ptp_get_tx_ts(ptp_priv, &sec, &nsec, &seq))
4665 		lan8814_match_tx_skb(ptp_priv, sec, nsec, seq);
4666 }
4667 
4668 #define LAN8841_PTP_INT_STS			259
4669 #define LAN8841_PTP_INT_STS_PTP_TX_TS_OVRFL_INT	BIT(13)
4670 #define LAN8841_PTP_INT_STS_PTP_TX_TS_INT	BIT(12)
4671 #define LAN8841_PTP_INT_STS_PTP_GPIO_CAP_INT	BIT(2)
4672 
4673 static void lan8841_ptp_flush_fifo(struct kszphy_ptp_priv *ptp_priv)
4674 {
4675 	struct phy_device *phydev = ptp_priv->phydev;
4676 	int i;
4677 
4678 	for (i = 0; i < FIFO_SIZE; ++i)
4679 		phy_read_mmd(phydev, 2, LAN8841_PTP_TX_MSG_HEADER2);
4680 
4681 	phy_read_mmd(phydev, 2, LAN8841_PTP_INT_STS);
4682 }
4683 
4684 #define LAN8841_PTP_GPIO_CAP_STS			506
4685 #define LAN8841_PTP_GPIO_SEL				327
4686 #define LAN8841_PTP_GPIO_SEL_GPIO_SEL(gpio)		((gpio) << 8)
4687 #define LAN8841_PTP_GPIO_RE_LTC_SEC_HI_CAP		498
4688 #define LAN8841_PTP_GPIO_RE_LTC_SEC_LO_CAP		499
4689 #define LAN8841_PTP_GPIO_RE_LTC_NS_HI_CAP		500
4690 #define LAN8841_PTP_GPIO_RE_LTC_NS_LO_CAP		501
4691 #define LAN8841_PTP_GPIO_FE_LTC_SEC_HI_CAP		502
4692 #define LAN8841_PTP_GPIO_FE_LTC_SEC_LO_CAP		503
4693 #define LAN8841_PTP_GPIO_FE_LTC_NS_HI_CAP		504
4694 #define LAN8841_PTP_GPIO_FE_LTC_NS_LO_CAP		505
4695 
4696 static void lan8841_gpio_process_cap(struct kszphy_ptp_priv *ptp_priv)
4697 {
4698 	struct phy_device *phydev = ptp_priv->phydev;
4699 	struct ptp_clock_event ptp_event = {0};
4700 	int pin, ret, tmp;
4701 	s32 sec, nsec;
4702 
4703 	pin = ptp_find_pin_unlocked(ptp_priv->ptp_clock, PTP_PF_EXTTS, 0);
4704 	if (pin == -1)
4705 		return;
4706 
4707 	tmp = phy_read_mmd(phydev, 2, LAN8841_PTP_GPIO_CAP_STS);
4708 	if (tmp < 0)
4709 		return;
4710 
4711 	ret = phy_write_mmd(phydev, 2, LAN8841_PTP_GPIO_SEL,
4712 			    LAN8841_PTP_GPIO_SEL_GPIO_SEL(pin));
4713 	if (ret)
4714 		return;
4715 
4716 	mutex_lock(&ptp_priv->ptp_lock);
4717 	if (tmp & BIT(pin)) {
4718 		sec = phy_read_mmd(phydev, 2, LAN8841_PTP_GPIO_RE_LTC_SEC_HI_CAP);
4719 		sec <<= 16;
4720 		sec |= phy_read_mmd(phydev, 2, LAN8841_PTP_GPIO_RE_LTC_SEC_LO_CAP);
4721 
4722 		nsec = phy_read_mmd(phydev, 2, LAN8841_PTP_GPIO_RE_LTC_NS_HI_CAP) & 0x3fff;
4723 		nsec <<= 16;
4724 		nsec |= phy_read_mmd(phydev, 2, LAN8841_PTP_GPIO_RE_LTC_NS_LO_CAP);
4725 	} else {
4726 		sec = phy_read_mmd(phydev, 2, LAN8841_PTP_GPIO_FE_LTC_SEC_HI_CAP);
4727 		sec <<= 16;
4728 		sec |= phy_read_mmd(phydev, 2, LAN8841_PTP_GPIO_FE_LTC_SEC_LO_CAP);
4729 
4730 		nsec = phy_read_mmd(phydev, 2, LAN8841_PTP_GPIO_FE_LTC_NS_HI_CAP) & 0x3fff;
4731 		nsec <<= 16;
4732 		nsec |= phy_read_mmd(phydev, 2, LAN8841_PTP_GPIO_FE_LTC_NS_LO_CAP);
4733 	}
4734 	mutex_unlock(&ptp_priv->ptp_lock);
4735 	ret = phy_write_mmd(phydev, 2, LAN8841_PTP_GPIO_SEL, 0);
4736 	if (ret)
4737 		return;
4738 
4739 	ptp_event.index = 0;
4740 	ptp_event.timestamp = ktime_set(sec, nsec);
4741 	ptp_event.type = PTP_CLOCK_EXTTS;
4742 	ptp_clock_event(ptp_priv->ptp_clock, &ptp_event);
4743 }
4744 
4745 static void lan8841_handle_ptp_interrupt(struct phy_device *phydev)
4746 {
4747 	struct kszphy_priv *priv = phydev->priv;
4748 	struct kszphy_ptp_priv *ptp_priv = &priv->ptp_priv;
4749 	u16 status;
4750 
4751 	do {
4752 		status = phy_read_mmd(phydev, 2, LAN8841_PTP_INT_STS);
4753 
4754 		if (status & LAN8841_PTP_INT_STS_PTP_TX_TS_INT)
4755 			lan8841_ptp_process_tx_ts(ptp_priv);
4756 
4757 		if (status & LAN8841_PTP_INT_STS_PTP_GPIO_CAP_INT)
4758 			lan8841_gpio_process_cap(ptp_priv);
4759 
4760 		if (status & LAN8841_PTP_INT_STS_PTP_TX_TS_OVRFL_INT) {
4761 			lan8841_ptp_flush_fifo(ptp_priv);
4762 			skb_queue_purge(&ptp_priv->tx_queue);
4763 		}
4764 
4765 	} while (status & (LAN8841_PTP_INT_STS_PTP_TX_TS_INT |
4766 			   LAN8841_PTP_INT_STS_PTP_GPIO_CAP_INT |
4767 			   LAN8841_PTP_INT_STS_PTP_TX_TS_OVRFL_INT));
4768 }
4769 
4770 #define LAN8841_INTS_PTP		BIT(9)
4771 
4772 static irqreturn_t lan8841_handle_interrupt(struct phy_device *phydev)
4773 {
4774 	irqreturn_t ret = IRQ_NONE;
4775 	int irq_status;
4776 
4777 	irq_status = phy_read(phydev, LAN8814_INTS);
4778 	if (irq_status < 0) {
4779 		phy_error(phydev);
4780 		return IRQ_NONE;
4781 	}
4782 
4783 	if (irq_status & LAN8814_INT_LINK) {
4784 		phy_trigger_machine(phydev);
4785 		ret = IRQ_HANDLED;
4786 	}
4787 
4788 	if (irq_status & LAN8841_INTS_PTP) {
4789 		lan8841_handle_ptp_interrupt(phydev);
4790 		ret = IRQ_HANDLED;
4791 	}
4792 
4793 	return ret;
4794 }
4795 
4796 static int lan8841_ts_info(struct mii_timestamper *mii_ts,
4797 			   struct kernel_ethtool_ts_info *info)
4798 {
4799 	struct kszphy_ptp_priv *ptp_priv;
4800 
4801 	ptp_priv = container_of(mii_ts, struct kszphy_ptp_priv, mii_ts);
4802 
4803 	info->phc_index = ptp_priv->ptp_clock ?
4804 				ptp_clock_index(ptp_priv->ptp_clock) : -1;
4805 	if (info->phc_index == -1)
4806 		return 0;
4807 
4808 	info->so_timestamping = SOF_TIMESTAMPING_TX_HARDWARE |
4809 				SOF_TIMESTAMPING_RX_HARDWARE |
4810 				SOF_TIMESTAMPING_RAW_HARDWARE;
4811 
4812 	info->tx_types = (1 << HWTSTAMP_TX_OFF) |
4813 			 (1 << HWTSTAMP_TX_ON) |
4814 			 (1 << HWTSTAMP_TX_ONESTEP_SYNC);
4815 
4816 	info->rx_filters = (1 << HWTSTAMP_FILTER_NONE) |
4817 			   (1 << HWTSTAMP_FILTER_PTP_V2_L4_EVENT) |
4818 			   (1 << HWTSTAMP_FILTER_PTP_V2_L2_EVENT) |
4819 			   (1 << HWTSTAMP_FILTER_PTP_V2_EVENT);
4820 
4821 	return 0;
4822 }
4823 
4824 #define LAN8841_PTP_INT_EN			260
4825 #define LAN8841_PTP_INT_EN_PTP_TX_TS_OVRFL_EN	BIT(13)
4826 #define LAN8841_PTP_INT_EN_PTP_TX_TS_EN		BIT(12)
4827 
4828 static void lan8841_ptp_enable_processing(struct kszphy_ptp_priv *ptp_priv,
4829 					  bool enable)
4830 {
4831 	struct phy_device *phydev = ptp_priv->phydev;
4832 
4833 	if (enable) {
4834 		/* Enable interrupts on the TX side */
4835 		phy_modify_mmd(phydev, 2, LAN8841_PTP_INT_EN,
4836 			       LAN8841_PTP_INT_EN_PTP_TX_TS_OVRFL_EN |
4837 			       LAN8841_PTP_INT_EN_PTP_TX_TS_EN,
4838 			       LAN8841_PTP_INT_EN_PTP_TX_TS_OVRFL_EN |
4839 			       LAN8841_PTP_INT_EN_PTP_TX_TS_EN);
4840 
4841 		/* Enable the modification of the frame on RX side,
4842 		 * this will add the ns and 2 bits of sec in the reserved field
4843 		 * of the PTP header
4844 		 */
4845 		phy_modify_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG,
4846 			       LAN8841_PTP_RX_MODE,
4847 			       LAN8841_PTP_INSERT_TS_EN |
4848 			       LAN8841_PTP_INSERT_TS_32BIT,
4849 			       LAN8841_PTP_INSERT_TS_EN |
4850 			       LAN8841_PTP_INSERT_TS_32BIT);
4851 
4852 		ptp_schedule_worker(ptp_priv->ptp_clock, 0);
4853 	} else {
4854 		/* Disable interrupts on the TX side */
4855 		phy_modify_mmd(phydev, 2, LAN8841_PTP_INT_EN,
4856 			       LAN8841_PTP_INT_EN_PTP_TX_TS_OVRFL_EN |
4857 			       LAN8841_PTP_INT_EN_PTP_TX_TS_EN, 0);
4858 
4859 		/* Disable modification of the RX frames */
4860 		phy_modify_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG,
4861 			       LAN8841_PTP_RX_MODE,
4862 			       LAN8841_PTP_INSERT_TS_EN |
4863 			       LAN8841_PTP_INSERT_TS_32BIT, 0);
4864 
4865 		ptp_cancel_worker_sync(ptp_priv->ptp_clock);
4866 	}
4867 }
4868 
4869 #define LAN8841_PTP_RX_TIMESTAMP_EN		379
4870 #define LAN8841_PTP_TX_TIMESTAMP_EN		443
4871 #define LAN8841_PTP_TX_MOD			445
4872 
4873 static int lan8841_hwtstamp(struct mii_timestamper *mii_ts,
4874 			    struct kernel_hwtstamp_config *config,
4875 			    struct netlink_ext_ack *extack)
4876 {
4877 	struct kszphy_ptp_priv *ptp_priv = container_of(mii_ts, struct kszphy_ptp_priv, mii_ts);
4878 	struct phy_device *phydev = ptp_priv->phydev;
4879 	int txcfg = 0, rxcfg = 0;
4880 	int pkt_ts_enable;
4881 
4882 	ptp_priv->hwts_tx_type = config->tx_type;
4883 	ptp_priv->rx_filter = config->rx_filter;
4884 
4885 	switch (config->rx_filter) {
4886 	case HWTSTAMP_FILTER_NONE:
4887 		ptp_priv->layer = 0;
4888 		ptp_priv->version = 0;
4889 		break;
4890 	case HWTSTAMP_FILTER_PTP_V2_L4_EVENT:
4891 	case HWTSTAMP_FILTER_PTP_V2_L4_SYNC:
4892 	case HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ:
4893 		ptp_priv->layer = PTP_CLASS_L4;
4894 		ptp_priv->version = PTP_CLASS_V2;
4895 		break;
4896 	case HWTSTAMP_FILTER_PTP_V2_L2_EVENT:
4897 	case HWTSTAMP_FILTER_PTP_V2_L2_SYNC:
4898 	case HWTSTAMP_FILTER_PTP_V2_L2_DELAY_REQ:
4899 		ptp_priv->layer = PTP_CLASS_L2;
4900 		ptp_priv->version = PTP_CLASS_V2;
4901 		break;
4902 	case HWTSTAMP_FILTER_PTP_V2_EVENT:
4903 	case HWTSTAMP_FILTER_PTP_V2_SYNC:
4904 	case HWTSTAMP_FILTER_PTP_V2_DELAY_REQ:
4905 		ptp_priv->layer = PTP_CLASS_L4 | PTP_CLASS_L2;
4906 		ptp_priv->version = PTP_CLASS_V2;
4907 		break;
4908 	default:
4909 		return -ERANGE;
4910 	}
4911 
4912 	/* Setup parsing of the frames and enable the timestamping for ptp
4913 	 * frames
4914 	 */
4915 	if (ptp_priv->layer & PTP_CLASS_L2) {
4916 		rxcfg |= PTP_RX_PARSE_CONFIG_LAYER2_EN_;
4917 		txcfg |= PTP_TX_PARSE_CONFIG_LAYER2_EN_;
4918 	} else if (ptp_priv->layer & PTP_CLASS_L4) {
4919 		rxcfg |= PTP_RX_PARSE_CONFIG_IPV4_EN_ | PTP_RX_PARSE_CONFIG_IPV6_EN_;
4920 		txcfg |= PTP_TX_PARSE_CONFIG_IPV4_EN_ | PTP_TX_PARSE_CONFIG_IPV6_EN_;
4921 	}
4922 
4923 	phy_write_mmd(phydev, 2, LAN8841_PTP_RX_PARSE_CONFIG, rxcfg);
4924 	phy_write_mmd(phydev, 2, LAN8841_PTP_TX_PARSE_CONFIG, txcfg);
4925 
4926 	pkt_ts_enable = PTP_TIMESTAMP_EN_SYNC_ | PTP_TIMESTAMP_EN_DREQ_ |
4927 			PTP_TIMESTAMP_EN_PDREQ_ | PTP_TIMESTAMP_EN_PDRES_;
4928 	phy_write_mmd(phydev, 2, LAN8841_PTP_RX_TIMESTAMP_EN, pkt_ts_enable);
4929 	phy_write_mmd(phydev, 2, LAN8841_PTP_TX_TIMESTAMP_EN, pkt_ts_enable);
4930 
4931 	/* Enable / disable of the TX timestamp in the SYNC frames */
4932 	phy_modify_mmd(phydev, 2, LAN8841_PTP_TX_MOD,
4933 		       PTP_TX_MOD_TX_PTP_SYNC_TS_INSERT_,
4934 		       ptp_priv->hwts_tx_type == HWTSTAMP_TX_ONESTEP_SYNC ?
4935 				PTP_TX_MOD_TX_PTP_SYNC_TS_INSERT_ : 0);
4936 
4937 	/* Now enable/disable the timestamping */
4938 	lan8841_ptp_enable_processing(ptp_priv,
4939 				      config->rx_filter != HWTSTAMP_FILTER_NONE);
4940 
4941 	skb_queue_purge(&ptp_priv->tx_queue);
4942 
4943 	lan8841_ptp_flush_fifo(ptp_priv);
4944 
4945 	return 0;
4946 }
4947 
4948 static bool lan8841_rxtstamp(struct mii_timestamper *mii_ts,
4949 			     struct sk_buff *skb, int type)
4950 {
4951 	struct kszphy_ptp_priv *ptp_priv =
4952 			container_of(mii_ts, struct kszphy_ptp_priv, mii_ts);
4953 	struct ptp_header *header = ptp_parse_header(skb, type);
4954 	struct skb_shared_hwtstamps *shhwtstamps;
4955 	struct timespec64 ts;
4956 	unsigned long flags;
4957 	u32 ts_header;
4958 
4959 	if (!header)
4960 		return false;
4961 
4962 	if (ptp_priv->rx_filter == HWTSTAMP_FILTER_NONE ||
4963 	    type == PTP_CLASS_NONE)
4964 		return false;
4965 
4966 	if ((type & ptp_priv->version) == 0 || (type & ptp_priv->layer) == 0)
4967 		return false;
4968 
4969 	spin_lock_irqsave(&ptp_priv->seconds_lock, flags);
4970 	ts.tv_sec = ptp_priv->seconds;
4971 	spin_unlock_irqrestore(&ptp_priv->seconds_lock, flags);
4972 	ts_header = __be32_to_cpu(header->reserved2);
4973 
4974 	shhwtstamps = skb_hwtstamps(skb);
4975 	memset(shhwtstamps, 0, sizeof(*shhwtstamps));
4976 
4977 	/* Check for any wrap arounds for the second part */
4978 	if ((ts.tv_sec & GENMASK(1, 0)) == 0 && (ts_header >> 30) == 3)
4979 		ts.tv_sec -= GENMASK(1, 0) + 1;
4980 	else if ((ts.tv_sec & GENMASK(1, 0)) == 3 && (ts_header >> 30) == 0)
4981 		ts.tv_sec += 1;
4982 
4983 	shhwtstamps->hwtstamp =
4984 		ktime_set((ts.tv_sec & ~(GENMASK(1, 0))) | ts_header >> 30,
4985 			  ts_header & GENMASK(29, 0));
4986 	header->reserved2 = 0;
4987 
4988 	netif_rx(skb);
4989 
4990 	return true;
4991 }
4992 
4993 #define LAN8841_EVENT_A		0
4994 #define LAN8841_EVENT_B		1
4995 #define LAN8841_PTP_LTC_TARGET_SEC_HI(event)	((event) == LAN8841_EVENT_A ? 278 : 288)
4996 #define LAN8841_PTP_LTC_TARGET_SEC_LO(event)	((event) == LAN8841_EVENT_A ? 279 : 289)
4997 #define LAN8841_PTP_LTC_TARGET_NS_HI(event)	((event) == LAN8841_EVENT_A ? 280 : 290)
4998 #define LAN8841_PTP_LTC_TARGET_NS_LO(event)	((event) == LAN8841_EVENT_A ? 281 : 291)
4999 
5000 static int lan8841_ptp_set_target(struct kszphy_ptp_priv *ptp_priv, u8 event,
5001 				  s64 sec, u32 nsec)
5002 {
5003 	struct phy_device *phydev = ptp_priv->phydev;
5004 	int ret;
5005 
5006 	ret = phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_TARGET_SEC_HI(event),
5007 			    upper_16_bits(sec));
5008 	if (ret)
5009 		return ret;
5010 
5011 	ret = phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_TARGET_SEC_LO(event),
5012 			    lower_16_bits(sec));
5013 	if (ret)
5014 		return ret;
5015 
5016 	ret = phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_TARGET_NS_HI(event) & 0x3fff,
5017 			    upper_16_bits(nsec));
5018 	if (ret)
5019 		return ret;
5020 
5021 	return phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_TARGET_NS_LO(event),
5022 			    lower_16_bits(nsec));
5023 }
5024 
5025 #define LAN8841_BUFFER_TIME	2
5026 
5027 static int lan8841_ptp_update_target(struct kszphy_ptp_priv *ptp_priv,
5028 				     const struct timespec64 *ts)
5029 {
5030 	return lan8841_ptp_set_target(ptp_priv, LAN8841_EVENT_A,
5031 				      ts->tv_sec + LAN8841_BUFFER_TIME, 0);
5032 }
5033 
5034 #define LAN8841_PTP_LTC_TARGET_RELOAD_SEC_HI(event)	((event) == LAN8841_EVENT_A ? 282 : 292)
5035 #define LAN8841_PTP_LTC_TARGET_RELOAD_SEC_LO(event)	((event) == LAN8841_EVENT_A ? 283 : 293)
5036 #define LAN8841_PTP_LTC_TARGET_RELOAD_NS_HI(event)	((event) == LAN8841_EVENT_A ? 284 : 294)
5037 #define LAN8841_PTP_LTC_TARGET_RELOAD_NS_LO(event)	((event) == LAN8841_EVENT_A ? 285 : 295)
5038 
5039 static int lan8841_ptp_set_reload(struct kszphy_ptp_priv *ptp_priv, u8 event,
5040 				  s64 sec, u32 nsec)
5041 {
5042 	struct phy_device *phydev = ptp_priv->phydev;
5043 	int ret;
5044 
5045 	ret = phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_TARGET_RELOAD_SEC_HI(event),
5046 			    upper_16_bits(sec));
5047 	if (ret)
5048 		return ret;
5049 
5050 	ret = phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_TARGET_RELOAD_SEC_LO(event),
5051 			    lower_16_bits(sec));
5052 	if (ret)
5053 		return ret;
5054 
5055 	ret = phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_TARGET_RELOAD_NS_HI(event) & 0x3fff,
5056 			    upper_16_bits(nsec));
5057 	if (ret)
5058 		return ret;
5059 
5060 	return phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_TARGET_RELOAD_NS_LO(event),
5061 			     lower_16_bits(nsec));
5062 }
5063 
5064 #define LAN8841_PTP_LTC_SET_SEC_HI	262
5065 #define LAN8841_PTP_LTC_SET_SEC_MID	263
5066 #define LAN8841_PTP_LTC_SET_SEC_LO	264
5067 #define LAN8841_PTP_LTC_SET_NS_HI	265
5068 #define LAN8841_PTP_LTC_SET_NS_LO	266
5069 #define LAN8841_PTP_CMD_CTL_PTP_LTC_LOAD	BIT(4)
5070 
5071 static int lan8841_ptp_settime64(struct ptp_clock_info *ptp,
5072 				 const struct timespec64 *ts)
5073 {
5074 	struct kszphy_ptp_priv *ptp_priv = container_of(ptp, struct kszphy_ptp_priv,
5075 							ptp_clock_info);
5076 	struct phy_device *phydev = ptp_priv->phydev;
5077 	unsigned long flags;
5078 	int ret;
5079 
5080 	/* Set the value to be stored */
5081 	mutex_lock(&ptp_priv->ptp_lock);
5082 	phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_SET_SEC_LO, lower_16_bits(ts->tv_sec));
5083 	phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_SET_SEC_MID, upper_16_bits(ts->tv_sec));
5084 	phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_SET_SEC_HI, upper_32_bits(ts->tv_sec) & 0xffff);
5085 	phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_SET_NS_LO, lower_16_bits(ts->tv_nsec));
5086 	phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_SET_NS_HI, upper_16_bits(ts->tv_nsec) & 0x3fff);
5087 
5088 	/* Set the command to load the LTC */
5089 	phy_write_mmd(phydev, 2, LAN8841_PTP_CMD_CTL,
5090 		      LAN8841_PTP_CMD_CTL_PTP_LTC_LOAD);
5091 	ret = lan8841_ptp_update_target(ptp_priv, ts);
5092 	mutex_unlock(&ptp_priv->ptp_lock);
5093 
5094 	spin_lock_irqsave(&ptp_priv->seconds_lock, flags);
5095 	ptp_priv->seconds = ts->tv_sec;
5096 	spin_unlock_irqrestore(&ptp_priv->seconds_lock, flags);
5097 
5098 	return ret;
5099 }
5100 
5101 #define LAN8841_PTP_LTC_RD_SEC_HI	358
5102 #define LAN8841_PTP_LTC_RD_SEC_MID	359
5103 #define LAN8841_PTP_LTC_RD_SEC_LO	360
5104 #define LAN8841_PTP_LTC_RD_NS_HI	361
5105 #define LAN8841_PTP_LTC_RD_NS_LO	362
5106 #define LAN8841_PTP_CMD_CTL_PTP_LTC_READ	BIT(3)
5107 
5108 static int lan8841_ptp_gettime64(struct ptp_clock_info *ptp,
5109 				 struct timespec64 *ts)
5110 {
5111 	struct kszphy_ptp_priv *ptp_priv = container_of(ptp, struct kszphy_ptp_priv,
5112 							ptp_clock_info);
5113 	struct phy_device *phydev = ptp_priv->phydev;
5114 	time64_t s;
5115 	s64 ns;
5116 
5117 	mutex_lock(&ptp_priv->ptp_lock);
5118 	/* Issue the command to read the LTC */
5119 	phy_write_mmd(phydev, 2, LAN8841_PTP_CMD_CTL,
5120 		      LAN8841_PTP_CMD_CTL_PTP_LTC_READ);
5121 
5122 	/* Read the LTC */
5123 	s = phy_read_mmd(phydev, 2, LAN8841_PTP_LTC_RD_SEC_HI);
5124 	s <<= 16;
5125 	s |= phy_read_mmd(phydev, 2, LAN8841_PTP_LTC_RD_SEC_MID);
5126 	s <<= 16;
5127 	s |= phy_read_mmd(phydev, 2, LAN8841_PTP_LTC_RD_SEC_LO);
5128 
5129 	ns = phy_read_mmd(phydev, 2, LAN8841_PTP_LTC_RD_NS_HI) & 0x3fff;
5130 	ns <<= 16;
5131 	ns |= phy_read_mmd(phydev, 2, LAN8841_PTP_LTC_RD_NS_LO);
5132 	mutex_unlock(&ptp_priv->ptp_lock);
5133 
5134 	set_normalized_timespec64(ts, s, ns);
5135 	return 0;
5136 }
5137 
5138 static void lan8841_ptp_getseconds(struct ptp_clock_info *ptp,
5139 				   struct timespec64 *ts)
5140 {
5141 	struct kszphy_ptp_priv *ptp_priv = container_of(ptp, struct kszphy_ptp_priv,
5142 							ptp_clock_info);
5143 	struct phy_device *phydev = ptp_priv->phydev;
5144 	time64_t s;
5145 
5146 	mutex_lock(&ptp_priv->ptp_lock);
5147 	/* Issue the command to read the LTC */
5148 	phy_write_mmd(phydev, 2, LAN8841_PTP_CMD_CTL,
5149 		      LAN8841_PTP_CMD_CTL_PTP_LTC_READ);
5150 
5151 	/* Read the LTC */
5152 	s = phy_read_mmd(phydev, 2, LAN8841_PTP_LTC_RD_SEC_HI);
5153 	s <<= 16;
5154 	s |= phy_read_mmd(phydev, 2, LAN8841_PTP_LTC_RD_SEC_MID);
5155 	s <<= 16;
5156 	s |= phy_read_mmd(phydev, 2, LAN8841_PTP_LTC_RD_SEC_LO);
5157 	mutex_unlock(&ptp_priv->ptp_lock);
5158 
5159 	set_normalized_timespec64(ts, s, 0);
5160 }
5161 
5162 #define LAN8841_PTP_LTC_STEP_ADJ_LO			276
5163 #define LAN8841_PTP_LTC_STEP_ADJ_HI			275
5164 #define LAN8841_PTP_LTC_STEP_ADJ_DIR			BIT(15)
5165 #define LAN8841_PTP_CMD_CTL_PTP_LTC_STEP_SECONDS	BIT(5)
5166 #define LAN8841_PTP_CMD_CTL_PTP_LTC_STEP_NANOSECONDS	BIT(6)
5167 
5168 static int lan8841_ptp_adjtime(struct ptp_clock_info *ptp, s64 delta)
5169 {
5170 	struct kszphy_ptp_priv *ptp_priv = container_of(ptp, struct kszphy_ptp_priv,
5171 							ptp_clock_info);
5172 	struct phy_device *phydev = ptp_priv->phydev;
5173 	struct timespec64 ts;
5174 	bool add = true;
5175 	u32 nsec;
5176 	s32 sec;
5177 	int ret;
5178 
5179 	/* The HW allows up to 15 sec to adjust the time, but here we limit to
5180 	 * 10 sec the adjustment. The reason is, in case the adjustment is 14
5181 	 * sec and 999999999 nsec, then we add 8ns to compansate the actual
5182 	 * increment so the value can be bigger than 15 sec. Therefore limit the
5183 	 * possible adjustments so we will not have these corner cases
5184 	 */
5185 	if (delta > 10000000000LL || delta < -10000000000LL) {
5186 		/* The timeadjustment is too big, so fall back using set time */
5187 		u64 now;
5188 
5189 		ptp->gettime64(ptp, &ts);
5190 
5191 		now = ktime_to_ns(timespec64_to_ktime(ts));
5192 		ts = ns_to_timespec64(now + delta);
5193 
5194 		ptp->settime64(ptp, &ts);
5195 		return 0;
5196 	}
5197 
5198 	sec = div_u64_rem(delta < 0 ? -delta : delta, NSEC_PER_SEC, &nsec);
5199 	if (delta < 0 && nsec != 0) {
5200 		/* It is not allowed to adjust low the nsec part, therefore
5201 		 * subtract more from second part and add to nanosecond such
5202 		 * that would roll over, so the second part will increase
5203 		 */
5204 		sec--;
5205 		nsec = NSEC_PER_SEC - nsec;
5206 	}
5207 
5208 	/* Calculate the adjustments and the direction */
5209 	if (delta < 0)
5210 		add = false;
5211 
5212 	if (nsec > 0)
5213 		/* add 8 ns to cover the likely normal increment */
5214 		nsec += 8;
5215 
5216 	if (nsec >= NSEC_PER_SEC) {
5217 		/* carry into seconds */
5218 		sec++;
5219 		nsec -= NSEC_PER_SEC;
5220 	}
5221 
5222 	mutex_lock(&ptp_priv->ptp_lock);
5223 	if (sec) {
5224 		phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_STEP_ADJ_LO, sec);
5225 		phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_STEP_ADJ_HI,
5226 			      add ? LAN8841_PTP_LTC_STEP_ADJ_DIR : 0);
5227 		phy_write_mmd(phydev, 2, LAN8841_PTP_CMD_CTL,
5228 			      LAN8841_PTP_CMD_CTL_PTP_LTC_STEP_SECONDS);
5229 	}
5230 
5231 	if (nsec) {
5232 		phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_STEP_ADJ_LO,
5233 			      nsec & 0xffff);
5234 		phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_STEP_ADJ_HI,
5235 			      (nsec >> 16) & 0x3fff);
5236 		phy_write_mmd(phydev, 2, LAN8841_PTP_CMD_CTL,
5237 			      LAN8841_PTP_CMD_CTL_PTP_LTC_STEP_NANOSECONDS);
5238 	}
5239 	mutex_unlock(&ptp_priv->ptp_lock);
5240 
5241 	/* Update the target clock */
5242 	ptp->gettime64(ptp, &ts);
5243 	mutex_lock(&ptp_priv->ptp_lock);
5244 	ret = lan8841_ptp_update_target(ptp_priv, &ts);
5245 	mutex_unlock(&ptp_priv->ptp_lock);
5246 
5247 	return ret;
5248 }
5249 
5250 #define LAN8841_PTP_LTC_RATE_ADJ_HI		269
5251 #define LAN8841_PTP_LTC_RATE_ADJ_HI_DIR		BIT(15)
5252 #define LAN8841_PTP_LTC_RATE_ADJ_LO		270
5253 
5254 static int lan8841_ptp_adjfine(struct ptp_clock_info *ptp, long scaled_ppm)
5255 {
5256 	struct kszphy_ptp_priv *ptp_priv = container_of(ptp, struct kszphy_ptp_priv,
5257 							ptp_clock_info);
5258 	struct phy_device *phydev = ptp_priv->phydev;
5259 	bool faster = true;
5260 	u32 rate;
5261 
5262 	if (!scaled_ppm)
5263 		return 0;
5264 
5265 	if (scaled_ppm < 0) {
5266 		scaled_ppm = -scaled_ppm;
5267 		faster = false;
5268 	}
5269 
5270 	rate = LAN8841_1PPM_FORMAT * (upper_16_bits(scaled_ppm));
5271 	rate += (LAN8841_1PPM_FORMAT * (lower_16_bits(scaled_ppm))) >> 16;
5272 
5273 	mutex_lock(&ptp_priv->ptp_lock);
5274 	phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_RATE_ADJ_HI,
5275 		      faster ? LAN8841_PTP_LTC_RATE_ADJ_HI_DIR | (upper_16_bits(rate) & 0x3fff)
5276 			     : upper_16_bits(rate) & 0x3fff);
5277 	phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_RATE_ADJ_LO, lower_16_bits(rate));
5278 	mutex_unlock(&ptp_priv->ptp_lock);
5279 
5280 	return 0;
5281 }
5282 
5283 static int lan8841_ptp_verify(struct ptp_clock_info *ptp, unsigned int pin,
5284 			      enum ptp_pin_function func, unsigned int chan)
5285 {
5286 	switch (func) {
5287 	case PTP_PF_NONE:
5288 	case PTP_PF_PEROUT:
5289 	case PTP_PF_EXTTS:
5290 		break;
5291 	default:
5292 		return -1;
5293 	}
5294 
5295 	return 0;
5296 }
5297 
5298 #define LAN8841_PTP_GPIO_NUM	10
5299 #define LAN8841_GPIO_EN		128
5300 #define LAN8841_GPIO_DIR	129
5301 #define LAN8841_GPIO_BUF	130
5302 
5303 static int lan8841_ptp_perout_off(struct kszphy_ptp_priv *ptp_priv, int pin)
5304 {
5305 	struct phy_device *phydev = ptp_priv->phydev;
5306 	int ret;
5307 
5308 	ret = phy_clear_bits_mmd(phydev, 2, LAN8841_GPIO_EN, BIT(pin));
5309 	if (ret)
5310 		return ret;
5311 
5312 	ret = phy_clear_bits_mmd(phydev, 2, LAN8841_GPIO_DIR, BIT(pin));
5313 	if (ret)
5314 		return ret;
5315 
5316 	return phy_clear_bits_mmd(phydev, 2, LAN8841_GPIO_BUF, BIT(pin));
5317 }
5318 
5319 static int lan8841_ptp_perout_on(struct kszphy_ptp_priv *ptp_priv, int pin)
5320 {
5321 	struct phy_device *phydev = ptp_priv->phydev;
5322 	int ret;
5323 
5324 	ret = phy_set_bits_mmd(phydev, 2, LAN8841_GPIO_EN, BIT(pin));
5325 	if (ret)
5326 		return ret;
5327 
5328 	ret = phy_set_bits_mmd(phydev, 2, LAN8841_GPIO_DIR, BIT(pin));
5329 	if (ret)
5330 		return ret;
5331 
5332 	return phy_set_bits_mmd(phydev, 2, LAN8841_GPIO_BUF, BIT(pin));
5333 }
5334 
5335 #define LAN8841_GPIO_DATA_SEL1				131
5336 #define LAN8841_GPIO_DATA_SEL2				132
5337 #define LAN8841_GPIO_DATA_SEL_GPIO_DATA_SEL_EVENT_MASK	GENMASK(2, 0)
5338 #define LAN8841_GPIO_DATA_SEL_GPIO_DATA_SEL_EVENT_A	1
5339 #define LAN8841_GPIO_DATA_SEL_GPIO_DATA_SEL_EVENT_B	2
5340 #define LAN8841_PTP_GENERAL_CONFIG			257
5341 #define LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_POL_A	BIT(1)
5342 #define LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_POL_B	BIT(3)
5343 #define LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_A_MASK	GENMASK(7, 4)
5344 #define LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_B_MASK	GENMASK(11, 8)
5345 #define LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_A		4
5346 #define LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_B		7
5347 
5348 static int lan8841_ptp_remove_event(struct kszphy_ptp_priv *ptp_priv, int pin,
5349 				    u8 event)
5350 {
5351 	struct phy_device *phydev = ptp_priv->phydev;
5352 	u16 tmp;
5353 	int ret;
5354 
5355 	/* Now remove pin from the event. GPIO_DATA_SEL1 contains the GPIO
5356 	 * pins 0-4 while GPIO_DATA_SEL2 contains GPIO pins 5-9, therefore
5357 	 * depending on the pin, it requires to read a different register
5358 	 */
5359 	if (pin < 5) {
5360 		tmp = LAN8841_GPIO_DATA_SEL_GPIO_DATA_SEL_EVENT_MASK << (3 * pin);
5361 		ret = phy_clear_bits_mmd(phydev, 2, LAN8841_GPIO_DATA_SEL1, tmp);
5362 	} else {
5363 		tmp = LAN8841_GPIO_DATA_SEL_GPIO_DATA_SEL_EVENT_MASK << (3 * (pin - 5));
5364 		ret = phy_clear_bits_mmd(phydev, 2, LAN8841_GPIO_DATA_SEL2, tmp);
5365 	}
5366 	if (ret)
5367 		return ret;
5368 
5369 	/* Disable the event */
5370 	if (event == LAN8841_EVENT_A)
5371 		tmp = LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_POL_A |
5372 		      LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_A_MASK;
5373 	else
5374 		tmp = LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_POL_B |
5375 		      LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_B_MASK;
5376 	return phy_clear_bits_mmd(phydev, 2, LAN8841_GPIO_EN, tmp);
5377 }
5378 
5379 static int lan8841_ptp_enable_event(struct kszphy_ptp_priv *ptp_priv, int pin,
5380 				    u8 event, int pulse_width)
5381 {
5382 	struct phy_device *phydev = ptp_priv->phydev;
5383 	u16 tmp;
5384 	int ret;
5385 
5386 	/* Enable the event */
5387 	if (event == LAN8841_EVENT_A)
5388 		ret = phy_modify_mmd(phydev, 2, LAN8841_PTP_GENERAL_CONFIG,
5389 				     LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_POL_A |
5390 				     LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_A_MASK,
5391 				     LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_POL_A |
5392 				     pulse_width << LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_A);
5393 	else
5394 		ret = phy_modify_mmd(phydev, 2, LAN8841_PTP_GENERAL_CONFIG,
5395 				     LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_POL_B |
5396 				     LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_B_MASK,
5397 				     LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_POL_B |
5398 				     pulse_width << LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_B);
5399 	if (ret)
5400 		return ret;
5401 
5402 	/* Now connect the pin to the event. GPIO_DATA_SEL1 contains the GPIO
5403 	 * pins 0-4 while GPIO_DATA_SEL2 contains GPIO pins 5-9, therefore
5404 	 * depending on the pin, it requires to read a different register
5405 	 */
5406 	if (event == LAN8841_EVENT_A)
5407 		tmp = LAN8841_GPIO_DATA_SEL_GPIO_DATA_SEL_EVENT_A;
5408 	else
5409 		tmp = LAN8841_GPIO_DATA_SEL_GPIO_DATA_SEL_EVENT_B;
5410 
5411 	if (pin < 5)
5412 		ret = phy_set_bits_mmd(phydev, 2, LAN8841_GPIO_DATA_SEL1,
5413 				       tmp << (3 * pin));
5414 	else
5415 		ret = phy_set_bits_mmd(phydev, 2, LAN8841_GPIO_DATA_SEL2,
5416 				       tmp << (3 * (pin - 5)));
5417 
5418 	return ret;
5419 }
5420 
5421 #define LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_200MS	13
5422 #define LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_100MS	12
5423 #define LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_50MS	11
5424 #define LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_10MS	10
5425 #define LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_5MS	9
5426 #define LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_1MS	8
5427 #define LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_500US	7
5428 #define LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_100US	6
5429 #define LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_50US	5
5430 #define LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_10US	4
5431 #define LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_5US	3
5432 #define LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_1US	2
5433 #define LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_500NS	1
5434 #define LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_100NS	0
5435 
5436 static int lan8841_ptp_perout(struct ptp_clock_info *ptp,
5437 			      struct ptp_clock_request *rq, int on)
5438 {
5439 	struct kszphy_ptp_priv *ptp_priv = container_of(ptp, struct kszphy_ptp_priv,
5440 							ptp_clock_info);
5441 	struct phy_device *phydev = ptp_priv->phydev;
5442 	struct timespec64 ts_on, ts_period;
5443 	s64 on_nsec, period_nsec;
5444 	int pulse_width;
5445 	int pin;
5446 	int ret;
5447 
5448 	pin = ptp_find_pin(ptp_priv->ptp_clock, PTP_PF_PEROUT, rq->perout.index);
5449 	if (pin == -1 || pin >= LAN8841_PTP_GPIO_NUM)
5450 		return -EINVAL;
5451 
5452 	if (!on) {
5453 		ret = lan8841_ptp_perout_off(ptp_priv, pin);
5454 		if (ret)
5455 			return ret;
5456 
5457 		return lan8841_ptp_remove_event(ptp_priv, LAN8841_EVENT_A, pin);
5458 	}
5459 
5460 	ts_on.tv_sec = rq->perout.on.sec;
5461 	ts_on.tv_nsec = rq->perout.on.nsec;
5462 	on_nsec = timespec64_to_ns(&ts_on);
5463 
5464 	ts_period.tv_sec = rq->perout.period.sec;
5465 	ts_period.tv_nsec = rq->perout.period.nsec;
5466 	period_nsec = timespec64_to_ns(&ts_period);
5467 
5468 	if (period_nsec < 200) {
5469 		pr_warn_ratelimited("%s: perout period too small, minimum is 200 nsec\n",
5470 				    phydev_name(phydev));
5471 		return -EOPNOTSUPP;
5472 	}
5473 
5474 	if (on_nsec >= period_nsec) {
5475 		pr_warn_ratelimited("%s: pulse width must be smaller than period\n",
5476 				    phydev_name(phydev));
5477 		return -EINVAL;
5478 	}
5479 
5480 	switch (on_nsec) {
5481 	case 200000000:
5482 		pulse_width = LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_200MS;
5483 		break;
5484 	case 100000000:
5485 		pulse_width = LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_100MS;
5486 		break;
5487 	case 50000000:
5488 		pulse_width = LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_50MS;
5489 		break;
5490 	case 10000000:
5491 		pulse_width = LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_10MS;
5492 		break;
5493 	case 5000000:
5494 		pulse_width = LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_5MS;
5495 		break;
5496 	case 1000000:
5497 		pulse_width = LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_1MS;
5498 		break;
5499 	case 500000:
5500 		pulse_width = LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_500US;
5501 		break;
5502 	case 100000:
5503 		pulse_width = LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_100US;
5504 		break;
5505 	case 50000:
5506 		pulse_width = LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_50US;
5507 		break;
5508 	case 10000:
5509 		pulse_width = LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_10US;
5510 		break;
5511 	case 5000:
5512 		pulse_width = LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_5US;
5513 		break;
5514 	case 1000:
5515 		pulse_width = LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_1US;
5516 		break;
5517 	case 500:
5518 		pulse_width = LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_500NS;
5519 		break;
5520 	case 100:
5521 		pulse_width = LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_100NS;
5522 		break;
5523 	default:
5524 		pr_warn_ratelimited("%s: Use default duty cycle of 100ns\n",
5525 				    phydev_name(phydev));
5526 		pulse_width = LAN8841_PTP_GENERAL_CONFIG_LTC_EVENT_100NS;
5527 		break;
5528 	}
5529 
5530 	mutex_lock(&ptp_priv->ptp_lock);
5531 	ret = lan8841_ptp_set_target(ptp_priv, LAN8841_EVENT_A, rq->perout.start.sec,
5532 				     rq->perout.start.nsec);
5533 	mutex_unlock(&ptp_priv->ptp_lock);
5534 	if (ret)
5535 		return ret;
5536 
5537 	ret = lan8841_ptp_set_reload(ptp_priv, LAN8841_EVENT_A, rq->perout.period.sec,
5538 				     rq->perout.period.nsec);
5539 	if (ret)
5540 		return ret;
5541 
5542 	ret = lan8841_ptp_enable_event(ptp_priv, pin, LAN8841_EVENT_A,
5543 				       pulse_width);
5544 	if (ret)
5545 		return ret;
5546 
5547 	ret = lan8841_ptp_perout_on(ptp_priv, pin);
5548 	if (ret)
5549 		lan8841_ptp_remove_event(ptp_priv, pin, LAN8841_EVENT_A);
5550 
5551 	return ret;
5552 }
5553 
5554 #define LAN8841_PTP_GPIO_CAP_EN			496
5555 #define LAN8841_PTP_GPIO_CAP_EN_GPIO_RE_CAPTURE_ENABLE(gpio)	(BIT(gpio))
5556 #define LAN8841_PTP_GPIO_CAP_EN_GPIO_FE_CAPTURE_ENABLE(gpio)	(BIT(gpio) << 8)
5557 #define LAN8841_PTP_INT_EN_PTP_GPIO_CAP_EN	BIT(2)
5558 
5559 static int lan8841_ptp_extts_on(struct kszphy_ptp_priv *ptp_priv, int pin,
5560 				u32 flags)
5561 {
5562 	struct phy_device *phydev = ptp_priv->phydev;
5563 	u16 tmp = 0;
5564 	int ret;
5565 
5566 	/* Set GPIO to be input */
5567 	ret = phy_set_bits_mmd(phydev, 2, LAN8841_GPIO_EN, BIT(pin));
5568 	if (ret)
5569 		return ret;
5570 
5571 	ret = phy_clear_bits_mmd(phydev, 2, LAN8841_GPIO_BUF, BIT(pin));
5572 	if (ret)
5573 		return ret;
5574 
5575 	/* Enable capture on the edges of the pin */
5576 	if (flags & PTP_RISING_EDGE)
5577 		tmp |= LAN8841_PTP_GPIO_CAP_EN_GPIO_RE_CAPTURE_ENABLE(pin);
5578 	if (flags & PTP_FALLING_EDGE)
5579 		tmp |= LAN8841_PTP_GPIO_CAP_EN_GPIO_FE_CAPTURE_ENABLE(pin);
5580 	ret = phy_write_mmd(phydev, 2, LAN8841_PTP_GPIO_CAP_EN, tmp);
5581 	if (ret)
5582 		return ret;
5583 
5584 	/* Enable interrupt */
5585 	return phy_modify_mmd(phydev, 2, LAN8841_PTP_INT_EN,
5586 			      LAN8841_PTP_INT_EN_PTP_GPIO_CAP_EN,
5587 			      LAN8841_PTP_INT_EN_PTP_GPIO_CAP_EN);
5588 }
5589 
5590 static int lan8841_ptp_extts_off(struct kszphy_ptp_priv *ptp_priv, int pin)
5591 {
5592 	struct phy_device *phydev = ptp_priv->phydev;
5593 	int ret;
5594 
5595 	/* Set GPIO to be output */
5596 	ret = phy_clear_bits_mmd(phydev, 2, LAN8841_GPIO_EN, BIT(pin));
5597 	if (ret)
5598 		return ret;
5599 
5600 	ret = phy_clear_bits_mmd(phydev, 2, LAN8841_GPIO_BUF, BIT(pin));
5601 	if (ret)
5602 		return ret;
5603 
5604 	/* Disable capture on both of the edges */
5605 	ret = phy_modify_mmd(phydev, 2, LAN8841_PTP_GPIO_CAP_EN,
5606 			     LAN8841_PTP_GPIO_CAP_EN_GPIO_RE_CAPTURE_ENABLE(pin) |
5607 			     LAN8841_PTP_GPIO_CAP_EN_GPIO_FE_CAPTURE_ENABLE(pin),
5608 			     0);
5609 	if (ret)
5610 		return ret;
5611 
5612 	/* Disable interrupt */
5613 	return phy_modify_mmd(phydev, 2, LAN8841_PTP_INT_EN,
5614 			      LAN8841_PTP_INT_EN_PTP_GPIO_CAP_EN,
5615 			      0);
5616 }
5617 
5618 static int lan8841_ptp_extts(struct ptp_clock_info *ptp,
5619 			     struct ptp_clock_request *rq, int on)
5620 {
5621 	struct kszphy_ptp_priv *ptp_priv = container_of(ptp, struct kszphy_ptp_priv,
5622 							ptp_clock_info);
5623 	int pin;
5624 	int ret;
5625 
5626 	/* Reject requests with unsupported flags */
5627 	if (rq->extts.flags & ~(PTP_ENABLE_FEATURE |
5628 				PTP_EXTTS_EDGES |
5629 				PTP_STRICT_FLAGS))
5630 		return -EOPNOTSUPP;
5631 
5632 	pin = ptp_find_pin(ptp_priv->ptp_clock, PTP_PF_EXTTS, rq->extts.index);
5633 	if (pin == -1 || pin >= LAN8841_PTP_GPIO_NUM)
5634 		return -EINVAL;
5635 
5636 	mutex_lock(&ptp_priv->ptp_lock);
5637 	if (on)
5638 		ret = lan8841_ptp_extts_on(ptp_priv, pin, rq->extts.flags);
5639 	else
5640 		ret = lan8841_ptp_extts_off(ptp_priv, pin);
5641 	mutex_unlock(&ptp_priv->ptp_lock);
5642 
5643 	return ret;
5644 }
5645 
5646 static int lan8841_ptp_enable(struct ptp_clock_info *ptp,
5647 			      struct ptp_clock_request *rq, int on)
5648 {
5649 	switch (rq->type) {
5650 	case PTP_CLK_REQ_EXTTS:
5651 		return lan8841_ptp_extts(ptp, rq, on);
5652 	case PTP_CLK_REQ_PEROUT:
5653 		return lan8841_ptp_perout(ptp, rq, on);
5654 	default:
5655 		return -EOPNOTSUPP;
5656 	}
5657 
5658 	return 0;
5659 }
5660 
5661 static long lan8841_ptp_do_aux_work(struct ptp_clock_info *ptp)
5662 {
5663 	struct kszphy_ptp_priv *ptp_priv = container_of(ptp, struct kszphy_ptp_priv,
5664 							ptp_clock_info);
5665 	struct timespec64 ts;
5666 	unsigned long flags;
5667 
5668 	lan8841_ptp_getseconds(&ptp_priv->ptp_clock_info, &ts);
5669 
5670 	spin_lock_irqsave(&ptp_priv->seconds_lock, flags);
5671 	ptp_priv->seconds = ts.tv_sec;
5672 	spin_unlock_irqrestore(&ptp_priv->seconds_lock, flags);
5673 
5674 	return nsecs_to_jiffies(LAN8841_GET_SEC_LTC_DELAY);
5675 }
5676 
5677 static struct ptp_clock_info lan8841_ptp_clock_info = {
5678 	.owner		= THIS_MODULE,
5679 	.name		= "lan8841 ptp",
5680 	.max_adj	= 31249999,
5681 	.gettime64	= lan8841_ptp_gettime64,
5682 	.settime64	= lan8841_ptp_settime64,
5683 	.adjtime	= lan8841_ptp_adjtime,
5684 	.adjfine	= lan8841_ptp_adjfine,
5685 	.verify         = lan8841_ptp_verify,
5686 	.enable         = lan8841_ptp_enable,
5687 	.do_aux_work	= lan8841_ptp_do_aux_work,
5688 	.n_per_out      = LAN8841_PTP_GPIO_NUM,
5689 	.n_ext_ts       = LAN8841_PTP_GPIO_NUM,
5690 	.n_pins         = LAN8841_PTP_GPIO_NUM,
5691 	.supported_perout_flags = PTP_PEROUT_DUTY_CYCLE,
5692 };
5693 
5694 #define LAN8841_OPERATION_MODE_STRAP_LOW_REGISTER 3
5695 #define LAN8841_OPERATION_MODE_STRAP_LOW_REGISTER_STRAP_RGMII_EN BIT(0)
5696 
5697 static int lan8841_probe(struct phy_device *phydev)
5698 {
5699 	struct kszphy_ptp_priv *ptp_priv;
5700 	struct kszphy_priv *priv;
5701 	int err;
5702 
5703 	err = kszphy_probe(phydev);
5704 	if (err)
5705 		return err;
5706 
5707 	if (phy_read_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG,
5708 			 LAN8841_OPERATION_MODE_STRAP_LOW_REGISTER) &
5709 	    LAN8841_OPERATION_MODE_STRAP_LOW_REGISTER_STRAP_RGMII_EN)
5710 		phydev->interface = PHY_INTERFACE_MODE_RGMII_RXID;
5711 
5712 	/* Register the clock */
5713 	if (!IS_ENABLED(CONFIG_NETWORK_PHY_TIMESTAMPING))
5714 		return 0;
5715 
5716 	priv = phydev->priv;
5717 	ptp_priv = &priv->ptp_priv;
5718 
5719 	ptp_priv->pin_config = devm_kcalloc(&phydev->mdio.dev,
5720 					    LAN8841_PTP_GPIO_NUM,
5721 					    sizeof(*ptp_priv->pin_config),
5722 					    GFP_KERNEL);
5723 	if (!ptp_priv->pin_config)
5724 		return -ENOMEM;
5725 
5726 	for (int i = 0; i < LAN8841_PTP_GPIO_NUM; ++i) {
5727 		struct ptp_pin_desc *p = &ptp_priv->pin_config[i];
5728 
5729 		snprintf(p->name, sizeof(p->name), "pin%d", i);
5730 		p->index = i;
5731 		p->func = PTP_PF_NONE;
5732 	}
5733 
5734 	ptp_priv->ptp_clock_info = lan8841_ptp_clock_info;
5735 	ptp_priv->ptp_clock_info.pin_config = ptp_priv->pin_config;
5736 	ptp_priv->ptp_clock = ptp_clock_register(&ptp_priv->ptp_clock_info,
5737 						 &phydev->mdio.dev);
5738 	if (IS_ERR(ptp_priv->ptp_clock)) {
5739 		phydev_err(phydev, "ptp_clock_register failed: %pe\n",
5740 			   ptp_priv->ptp_clock);
5741 		return -EINVAL;
5742 	}
5743 
5744 	if (!ptp_priv->ptp_clock)
5745 		return 0;
5746 
5747 	/* Initialize the SW */
5748 	skb_queue_head_init(&ptp_priv->tx_queue);
5749 	ptp_priv->phydev = phydev;
5750 	mutex_init(&ptp_priv->ptp_lock);
5751 	spin_lock_init(&ptp_priv->seconds_lock);
5752 
5753 	ptp_priv->mii_ts.rxtstamp = lan8841_rxtstamp;
5754 	ptp_priv->mii_ts.txtstamp = lan8814_txtstamp;
5755 	ptp_priv->mii_ts.hwtstamp = lan8841_hwtstamp;
5756 	ptp_priv->mii_ts.ts_info = lan8841_ts_info;
5757 
5758 	phydev->mii_ts = &ptp_priv->mii_ts;
5759 
5760 	/* Timestamp selected by default to keep legacy API */
5761 	phydev->default_timestamp = true;
5762 
5763 	return 0;
5764 }
5765 
5766 static int lan8804_resume(struct phy_device *phydev)
5767 {
5768 	return kszphy_resume(phydev);
5769 }
5770 
5771 static int lan8804_suspend(struct phy_device *phydev)
5772 {
5773 	return kszphy_generic_suspend(phydev);
5774 }
5775 
5776 static int lan8841_resume(struct phy_device *phydev)
5777 {
5778 	return kszphy_generic_resume(phydev);
5779 }
5780 
5781 static int lan8841_suspend(struct phy_device *phydev)
5782 {
5783 	struct kszphy_priv *priv = phydev->priv;
5784 	struct kszphy_ptp_priv *ptp_priv = &priv->ptp_priv;
5785 
5786 	if (ptp_priv->ptp_clock)
5787 		ptp_cancel_worker_sync(ptp_priv->ptp_clock);
5788 
5789 	return kszphy_generic_suspend(phydev);
5790 }
5791 
5792 static int ksz9131_resume(struct phy_device *phydev)
5793 {
5794 	if (phydev->suspended && phy_interface_is_rgmii(phydev))
5795 		ksz9131_config_rgmii_delay(phydev);
5796 
5797 	return kszphy_resume(phydev);
5798 }
5799 
5800 #define LAN8842_PTP_GPIO_NUM 16
5801 
5802 static int lan8842_ptp_probe_once(struct phy_device *phydev)
5803 {
5804 	return __lan8814_ptp_probe_once(phydev, "lan8842_ptp_pin",
5805 					LAN8842_PTP_GPIO_NUM);
5806 }
5807 
5808 #define LAN8842_STRAP_REG			0 /* 0x0 */
5809 #define LAN8842_STRAP_REG_PHYADDR_MASK		GENMASK(4, 0)
5810 #define LAN8842_SKU_REG				11 /* 0x0b */
5811 #define LAN8842_SELF_TEST			14 /* 0x0e */
5812 #define LAN8842_SELF_TEST_RX_CNT_ENA		BIT(8)
5813 #define LAN8842_SELF_TEST_TX_CNT_ENA		BIT(4)
5814 
5815 static int lan8842_probe(struct phy_device *phydev)
5816 {
5817 	struct lan8842_priv *priv;
5818 	int addr;
5819 	int ret;
5820 
5821 	priv = devm_kzalloc(&phydev->mdio.dev, sizeof(*priv), GFP_KERNEL);
5822 	if (!priv)
5823 		return -ENOMEM;
5824 
5825 	phydev->priv = priv;
5826 
5827 	/* Similar to lan8814 this PHY has a pin which needs to be pulled down
5828 	 * to enable to pass any traffic through it. Therefore use the same
5829 	 * function as lan8814
5830 	 */
5831 	ret = lan8814_release_coma_mode(phydev);
5832 	if (ret)
5833 		return ret;
5834 
5835 	/* Enable to count the RX and TX packets */
5836 	ret = lanphy_write_page_reg(phydev, LAN8814_PAGE_PCS_DIGITAL,
5837 				    LAN8842_SELF_TEST,
5838 				    LAN8842_SELF_TEST_RX_CNT_ENA |
5839 				    LAN8842_SELF_TEST_TX_CNT_ENA);
5840 	if (ret < 0)
5841 		return ret;
5842 
5843 	/* Revision lan8832 doesn't have support for PTP, therefore don't add
5844 	 * any PTP clocks
5845 	 */
5846 	ret = lanphy_read_page_reg(phydev, LAN8814_PAGE_COMMON_REGS,
5847 				   LAN8842_SKU_REG);
5848 	if (ret < 0)
5849 		return ret;
5850 
5851 	priv->rev = ret;
5852 	if (priv->rev == LAN8842_REV_8832)
5853 		return 0;
5854 
5855 	/* As the lan8814 and lan8842 has the same IP for the PTP block, the
5856 	 * only difference is the number of the GPIOs, then make sure that the
5857 	 * lan8842 initialized also the shared data pointer as this is used in
5858 	 * all the PTP functions for lan8814. The lan8842 doesn't have multiple
5859 	 * PHYs in the same package.
5860 	 */
5861 	addr = lanphy_read_page_reg(phydev, LAN8814_PAGE_COMMON_REGS,
5862 				    LAN8842_STRAP_REG);
5863 	if (addr < 0)
5864 		return addr;
5865 	addr &= LAN8842_STRAP_REG_PHYADDR_MASK;
5866 
5867 	ret = devm_phy_package_join(&phydev->mdio.dev, phydev, addr,
5868 				    sizeof(struct lan8814_shared_priv));
5869 	if (ret)
5870 		return ret;
5871 
5872 	if (phy_package_init_once(phydev)) {
5873 		ret = lan8842_ptp_probe_once(phydev);
5874 		if (ret)
5875 			return ret;
5876 	}
5877 
5878 	lan8814_ptp_init(phydev);
5879 
5880 	return 0;
5881 }
5882 
5883 static int lan8842_config_init(struct phy_device *phydev)
5884 {
5885 	int ret;
5886 
5887 	/* Reset the PHY */
5888 	ret = lanphy_modify_page_reg(phydev, LAN8814_PAGE_COMMON_REGS,
5889 				     LAN8814_QSGMII_SOFT_RESET,
5890 				     LAN8814_QSGMII_SOFT_RESET_BIT,
5891 				     LAN8814_QSGMII_SOFT_RESET_BIT);
5892 	if (ret < 0)
5893 		return ret;
5894 
5895 	/* Even if the GPIOs are set to control the LEDs the behaviour of the
5896 	 * LEDs is wrong, they are not blinking when there is traffic.
5897 	 * To fix this it is required to set extended LED mode
5898 	 */
5899 	ret = lanphy_modify_page_reg(phydev, LAN8814_PAGE_PORT_REGS,
5900 				     LAN8814_LED_CTRL_1,
5901 				     LAN8814_LED_CTRL_1_KSZ9031_LED_MODE_, 0);
5902 	if (ret < 0)
5903 		return ret;
5904 
5905 	ret = lanphy_modify_page_reg(phydev, LAN8814_PAGE_PORT_REGS,
5906 				     LAN8814_LED_CTRL_2,
5907 				     LAN8814_LED_CTRL_2_LED1_COM_DIS,
5908 				     LAN8814_LED_CTRL_2_LED1_COM_DIS);
5909 	if (ret < 0)
5910 		return ret;
5911 
5912 	/* To allow the PHY to control the LEDs the GPIOs of the PHY should have
5913 	 * a function mode and not the GPIO. Apparently by default the value is
5914 	 * GPIO and not function even though the datasheet it says that it is
5915 	 * function. Therefore set this value.
5916 	 */
5917 	return lanphy_write_page_reg(phydev, LAN8814_PAGE_COMMON_REGS,
5918 				     LAN8814_GPIO_EN2, 0);
5919 }
5920 
5921 #define LAN8842_INTR_CTRL_REG			52 /* 0x34 */
5922 
5923 static int lan8842_config_intr(struct phy_device *phydev)
5924 {
5925 	int err;
5926 
5927 	lanphy_write_page_reg(phydev, LAN8814_PAGE_COMMON_REGS,
5928 			      LAN8842_INTR_CTRL_REG,
5929 			      LAN8814_INTR_CTRL_REG_INTR_ENABLE);
5930 
5931 	/* enable / disable interrupts */
5932 	if (phydev->interrupts == PHY_INTERRUPT_ENABLED) {
5933 		err = lan8814_ack_interrupt(phydev);
5934 		if (err)
5935 			return err;
5936 
5937 		err = phy_write(phydev, LAN8814_INTC,
5938 				LAN8814_INT_LINK | LAN8814_INT_FLF);
5939 	} else {
5940 		err = phy_write(phydev, LAN8814_INTC, 0);
5941 		if (err)
5942 			return err;
5943 
5944 		err = lan8814_ack_interrupt(phydev);
5945 	}
5946 
5947 	return err;
5948 }
5949 
5950 static unsigned int lan8842_inband_caps(struct phy_device *phydev,
5951 					phy_interface_t interface)
5952 {
5953 	/* Inband configuration can be enabled or disabled using the registers
5954 	 * PCS1G_ANEG_CONFIG.
5955 	 */
5956 	return LINK_INBAND_DISABLE | LINK_INBAND_ENABLE;
5957 }
5958 
5959 static int lan8842_config_inband(struct phy_device *phydev, unsigned int modes)
5960 {
5961 	bool enable;
5962 
5963 	if (modes == LINK_INBAND_DISABLE)
5964 		enable = false;
5965 	else
5966 		enable = true;
5967 
5968 	/* Disable or enable in-band autoneg with PCS Host side
5969 	 * It has the same address as lan8814
5970 	 */
5971 	return lanphy_modify_page_reg(phydev, LAN8814_PAGE_PORT_REGS,
5972 				      LAN8814_QSGMII_PCS1G_ANEG_CONFIG,
5973 				      LAN8814_QSGMII_PCS1G_ANEG_CONFIG_ANEG_ENA,
5974 				      enable ? LAN8814_QSGMII_PCS1G_ANEG_CONFIG_ANEG_ENA : 0);
5975 }
5976 
5977 static void lan8842_handle_ptp_interrupt(struct phy_device *phydev, u16 status)
5978 {
5979 	struct kszphy_ptp_priv *ptp_priv;
5980 	struct lan8842_priv *priv;
5981 
5982 	priv = phydev->priv;
5983 	ptp_priv = &priv->ptp_priv;
5984 
5985 	if (status & PTP_TSU_INT_STS_PTP_TX_TS_EN_)
5986 		lan8814_get_tx_ts(ptp_priv);
5987 
5988 	if (status & PTP_TSU_INT_STS_PTP_RX_TS_EN_)
5989 		lan8814_get_rx_ts(ptp_priv);
5990 
5991 	if (status & PTP_TSU_INT_STS_PTP_TX_TS_OVRFL_INT_) {
5992 		lan8814_flush_fifo(phydev, true);
5993 		skb_queue_purge(&ptp_priv->tx_queue);
5994 	}
5995 
5996 	if (status & PTP_TSU_INT_STS_PTP_RX_TS_OVRFL_INT_) {
5997 		lan8814_flush_fifo(phydev, false);
5998 		skb_queue_purge(&ptp_priv->rx_queue);
5999 	}
6000 }
6001 
6002 static irqreturn_t lan8842_handle_interrupt(struct phy_device *phydev)
6003 {
6004 	struct lan8842_priv *priv = phydev->priv;
6005 	int ret = IRQ_NONE;
6006 	int irq_status;
6007 
6008 	irq_status = phy_read(phydev, LAN8814_INTS);
6009 	if (irq_status < 0) {
6010 		phy_error(phydev);
6011 		return IRQ_NONE;
6012 	}
6013 
6014 	if (irq_status & (LAN8814_INT_LINK | LAN8814_INT_FLF)) {
6015 		phy_trigger_machine(phydev);
6016 		ret = IRQ_HANDLED;
6017 	}
6018 
6019 	/* Phy revision lan8832 doesn't have support for PTP therefore there is
6020 	 * not need to check the PTP and GPIO interrupts
6021 	 */
6022 	if (priv->rev == LAN8842_REV_8832)
6023 		goto out;
6024 
6025 	while (true) {
6026 		irq_status = lanphy_read_page_reg(phydev, LAN8814_PAGE_PORT_REGS,
6027 						  PTP_TSU_INT_STS);
6028 		if (!irq_status)
6029 			break;
6030 
6031 		lan8842_handle_ptp_interrupt(phydev, irq_status);
6032 		ret = IRQ_HANDLED;
6033 	}
6034 
6035 	if (!lan8814_handle_gpio_interrupt(phydev, irq_status))
6036 		ret = IRQ_HANDLED;
6037 
6038 out:
6039 	return ret;
6040 }
6041 
6042 static u64 lan8842_get_stat(struct phy_device *phydev, int count, int *regs)
6043 {
6044 	u64 ret = 0;
6045 	int val;
6046 
6047 	for (int j = 0; j < count; ++j) {
6048 		val = lanphy_read_page_reg(phydev, LAN8814_PAGE_PCS_DIGITAL,
6049 					   regs[j]);
6050 		if (val < 0)
6051 			return U64_MAX;
6052 
6053 		ret <<= 16;
6054 		ret += val;
6055 	}
6056 	return ret;
6057 }
6058 
6059 static int lan8842_update_stats(struct phy_device *phydev)
6060 {
6061 	struct lan8842_priv *priv = phydev->priv;
6062 	int rx_packets_regs[] = {88, 61, 60};
6063 	int rx_errors_regs[] = {63, 62};
6064 	int tx_packets_regs[] = {89, 85, 84};
6065 	int tx_errors_regs[] = {87, 86};
6066 
6067 	priv->phy_stats.rx_packets = lan8842_get_stat(phydev,
6068 						      ARRAY_SIZE(rx_packets_regs),
6069 						      rx_packets_regs);
6070 	priv->phy_stats.rx_errors = lan8842_get_stat(phydev,
6071 						     ARRAY_SIZE(rx_errors_regs),
6072 						     rx_errors_regs);
6073 	priv->phy_stats.tx_packets = lan8842_get_stat(phydev,
6074 						      ARRAY_SIZE(tx_packets_regs),
6075 						      tx_packets_regs);
6076 	priv->phy_stats.tx_errors = lan8842_get_stat(phydev,
6077 						     ARRAY_SIZE(tx_errors_regs),
6078 						     tx_errors_regs);
6079 
6080 	return 0;
6081 }
6082 
6083 #define LAN8842_FLF				15 /* 0x0e */
6084 #define LAN8842_FLF_ENA				BIT(1)
6085 #define LAN8842_FLF_ENA_LINK_DOWN		BIT(0)
6086 
6087 static int lan8842_get_fast_down(struct phy_device *phydev, u8 *msecs)
6088 {
6089 	int ret;
6090 
6091 	ret = lanphy_read_page_reg(phydev, LAN8814_PAGE_PCS, LAN8842_FLF);
6092 	if (ret < 0)
6093 		return ret;
6094 
6095 	if (ret & LAN8842_FLF_ENA)
6096 		*msecs = ETHTOOL_PHY_FAST_LINK_DOWN_ON;
6097 	else
6098 		*msecs = ETHTOOL_PHY_FAST_LINK_DOWN_OFF;
6099 
6100 	return 0;
6101 }
6102 
6103 static int lan8842_set_fast_down(struct phy_device *phydev, const u8 *msecs)
6104 {
6105 	u16 flf;
6106 
6107 	switch (*msecs) {
6108 	case ETHTOOL_PHY_FAST_LINK_DOWN_OFF:
6109 		flf = 0;
6110 		break;
6111 	case ETHTOOL_PHY_FAST_LINK_DOWN_ON:
6112 		flf = LAN8842_FLF_ENA | LAN8842_FLF_ENA_LINK_DOWN;
6113 		break;
6114 	default:
6115 		return -EINVAL;
6116 	}
6117 
6118 	return lanphy_modify_page_reg(phydev, LAN8814_PAGE_PCS,
6119 				      LAN8842_FLF,
6120 				      LAN8842_FLF_ENA |
6121 				      LAN8842_FLF_ENA_LINK_DOWN, flf);
6122 }
6123 
6124 static int lan8842_get_tunable(struct phy_device *phydev,
6125 			       struct ethtool_tunable *tuna, void *data)
6126 {
6127 	switch (tuna->id) {
6128 	case ETHTOOL_PHY_FAST_LINK_DOWN:
6129 		return lan8842_get_fast_down(phydev, data);
6130 	default:
6131 		return -EOPNOTSUPP;
6132 	}
6133 }
6134 
6135 static int lan8842_set_tunable(struct phy_device *phydev,
6136 			       struct ethtool_tunable *tuna, const void *data)
6137 {
6138 	switch (tuna->id) {
6139 	case ETHTOOL_PHY_FAST_LINK_DOWN:
6140 		return lan8842_set_fast_down(phydev, data);
6141 	default:
6142 		return -EOPNOTSUPP;
6143 	}
6144 }
6145 
6146 static void lan8842_get_phy_stats(struct phy_device *phydev,
6147 				  struct ethtool_eth_phy_stats *eth_stats,
6148 				  struct ethtool_phy_stats *stats)
6149 {
6150 	struct lan8842_priv *priv = phydev->priv;
6151 
6152 	stats->rx_packets = priv->phy_stats.rx_packets;
6153 	stats->rx_errors = priv->phy_stats.rx_errors;
6154 	stats->tx_packets = priv->phy_stats.tx_packets;
6155 	stats->tx_errors = priv->phy_stats.tx_errors;
6156 }
6157 
6158 static struct phy_driver ksphy_driver[] = {
6159 {
6160 	PHY_ID_MATCH_MODEL(PHY_ID_KS8737),
6161 	.name		= "Micrel KS8737",
6162 	/* PHY_BASIC_FEATURES */
6163 	.driver_data	= &ks8737_type,
6164 	.probe		= kszphy_probe,
6165 	.config_init	= kszphy_config_init,
6166 	.config_intr	= kszphy_config_intr,
6167 	.handle_interrupt = kszphy_handle_interrupt,
6168 	.suspend	= kszphy_suspend,
6169 	.resume		= kszphy_resume,
6170 }, {
6171 	.phy_id		= PHY_ID_KSZ8021,
6172 	.phy_id_mask	= 0x00ffffff,
6173 	.name		= "Micrel KSZ8021 or KSZ8031",
6174 	/* PHY_BASIC_FEATURES */
6175 	.driver_data	= &ksz8021_type,
6176 	.probe		= kszphy_probe,
6177 	.config_init	= kszphy_config_init,
6178 	.config_intr	= kszphy_config_intr,
6179 	.handle_interrupt = kszphy_handle_interrupt,
6180 	.get_sset_count = kszphy_get_sset_count,
6181 	.get_strings	= kszphy_get_strings,
6182 	.get_stats	= kszphy_get_stats,
6183 	.suspend	= kszphy_suspend,
6184 	.resume		= kszphy_resume,
6185 }, {
6186 	.phy_id		= PHY_ID_KSZ8031,
6187 	.phy_id_mask	= 0x00ffffff,
6188 	.name		= "Micrel KSZ8031",
6189 	/* PHY_BASIC_FEATURES */
6190 	.driver_data	= &ksz8021_type,
6191 	.probe		= kszphy_probe,
6192 	.config_init	= kszphy_config_init,
6193 	.config_intr	= kszphy_config_intr,
6194 	.handle_interrupt = kszphy_handle_interrupt,
6195 	.get_sset_count = kszphy_get_sset_count,
6196 	.get_strings	= kszphy_get_strings,
6197 	.get_stats	= kszphy_get_stats,
6198 	.suspend	= kszphy_suspend,
6199 	.resume		= kszphy_resume,
6200 }, {
6201 	PHY_ID_MATCH_MODEL(PHY_ID_KSZ8041),
6202 	.name		= "Micrel KSZ8041",
6203 	/* PHY_BASIC_FEATURES */
6204 	.driver_data	= &ksz8041_type,
6205 	.probe		= kszphy_probe,
6206 	.config_init	= ksz8041_config_init,
6207 	.config_aneg	= ksz8041_config_aneg,
6208 	.config_intr	= kszphy_config_intr,
6209 	.handle_interrupt = kszphy_handle_interrupt,
6210 	.get_sset_count = kszphy_get_sset_count,
6211 	.get_strings	= kszphy_get_strings,
6212 	.get_stats	= kszphy_get_stats,
6213 	.suspend	= ksz8041_suspend,
6214 	.resume		= ksz8041_resume,
6215 }, {
6216 	PHY_ID_MATCH_MODEL(PHY_ID_KSZ8041RNLI),
6217 	.name		= "Micrel KSZ8041RNLI",
6218 	/* PHY_BASIC_FEATURES */
6219 	.driver_data	= &ksz8041_type,
6220 	.probe		= kszphy_probe,
6221 	.config_init	= kszphy_config_init,
6222 	.config_intr	= kszphy_config_intr,
6223 	.handle_interrupt = kszphy_handle_interrupt,
6224 	.get_sset_count = kszphy_get_sset_count,
6225 	.get_strings	= kszphy_get_strings,
6226 	.get_stats	= kszphy_get_stats,
6227 	.suspend	= kszphy_suspend,
6228 	.resume		= kszphy_resume,
6229 }, {
6230 	.name		= "Micrel KSZ8051",
6231 	/* PHY_BASIC_FEATURES */
6232 	.driver_data	= &ksz8051_type,
6233 	.probe		= kszphy_probe,
6234 	.config_init	= kszphy_config_init,
6235 	.config_intr	= kszphy_config_intr,
6236 	.handle_interrupt = kszphy_handle_interrupt,
6237 	.get_sset_count = kszphy_get_sset_count,
6238 	.get_strings	= kszphy_get_strings,
6239 	.get_stats	= kszphy_get_stats,
6240 	.match_phy_device = ksz8051_match_phy_device,
6241 	.suspend	= kszphy_suspend,
6242 	.resume		= kszphy_resume,
6243 }, {
6244 	.phy_id		= PHY_ID_KSZ8001,
6245 	.name		= "Micrel KSZ8001 or KS8721",
6246 	.phy_id_mask	= 0x00fffffc,
6247 	/* PHY_BASIC_FEATURES */
6248 	.driver_data	= &ksz8041_type,
6249 	.probe		= kszphy_probe,
6250 	.config_init	= kszphy_config_init,
6251 	.config_intr	= kszphy_config_intr,
6252 	.handle_interrupt = kszphy_handle_interrupt,
6253 	.get_sset_count = kszphy_get_sset_count,
6254 	.get_strings	= kszphy_get_strings,
6255 	.get_stats	= kszphy_get_stats,
6256 	.suspend	= kszphy_suspend,
6257 	.resume		= kszphy_resume,
6258 }, {
6259 	PHY_ID_MATCH_MODEL(PHY_ID_KSZ8081),
6260 	.name		= "Micrel KSZ8081 or KSZ8091",
6261 	.flags		= PHY_POLL_CABLE_TEST,
6262 	/* PHY_BASIC_FEATURES */
6263 	.driver_data	= &ksz8081_type,
6264 	.probe		= kszphy_probe,
6265 	.config_init	= ksz8081_config_init,
6266 	.soft_reset	= genphy_soft_reset,
6267 	.config_aneg	= ksz8081_config_aneg,
6268 	.read_status	= ksz8081_read_status,
6269 	.config_intr	= kszphy_config_intr,
6270 	.handle_interrupt = kszphy_handle_interrupt,
6271 	.get_sset_count = kszphy_get_sset_count,
6272 	.get_strings	= kszphy_get_strings,
6273 	.get_stats	= kszphy_get_stats,
6274 	.suspend	= kszphy_suspend,
6275 	.resume		= kszphy_resume,
6276 	.cable_test_start	= ksz886x_cable_test_start,
6277 	.cable_test_get_status	= ksz886x_cable_test_get_status,
6278 }, {
6279 	PHY_ID_MATCH_MODEL(PHY_ID_KSZ8061),
6280 	.name		= "Micrel KSZ8061",
6281 	/* PHY_BASIC_FEATURES */
6282 	.probe		= kszphy_probe,
6283 	.config_init	= ksz8061_config_init,
6284 	.soft_reset	= genphy_soft_reset,
6285 	.config_intr	= kszphy_config_intr,
6286 	.handle_interrupt = kszphy_handle_interrupt,
6287 	.suspend	= ksz8061_suspend,
6288 	.resume		= ksz8061_resume,
6289 }, {
6290 	.phy_id		= PHY_ID_KSZ9021,
6291 	.phy_id_mask	= 0x000ffffe,
6292 	.name		= "Micrel KSZ9021 Gigabit PHY",
6293 	/* PHY_GBIT_FEATURES */
6294 	.driver_data	= &ksz9021_type,
6295 	.probe		= kszphy_probe,
6296 	.get_features	= ksz9031_get_features,
6297 	.config_init	= ksz9021_config_init,
6298 	.config_intr	= kszphy_config_intr,
6299 	.handle_interrupt = kszphy_handle_interrupt,
6300 	.get_sset_count = kszphy_get_sset_count,
6301 	.get_strings	= kszphy_get_strings,
6302 	.get_stats	= kszphy_get_stats,
6303 	.suspend	= kszphy_suspend,
6304 	.resume		= kszphy_resume,
6305 	.read_mmd	= genphy_read_mmd_unsupported,
6306 	.write_mmd	= genphy_write_mmd_unsupported,
6307 }, {
6308 	PHY_ID_MATCH_MODEL(PHY_ID_KSZ9031),
6309 	.name		= "Micrel KSZ9031 Gigabit PHY",
6310 	.flags		= PHY_POLL_CABLE_TEST,
6311 	.driver_data	= &ksz9021_type,
6312 	.probe		= kszphy_probe,
6313 	.get_features	= ksz9031_get_features,
6314 	.config_init	= ksz9031_config_init,
6315 	.soft_reset	= genphy_soft_reset,
6316 	.read_status	= ksz9031_read_status,
6317 	.config_intr	= kszphy_config_intr,
6318 	.handle_interrupt = kszphy_handle_interrupt,
6319 	.get_sset_count = kszphy_get_sset_count,
6320 	.get_strings	= kszphy_get_strings,
6321 	.get_stats	= kszphy_get_stats,
6322 	.suspend	= kszphy_suspend,
6323 	.resume		= kszphy_resume,
6324 	.cable_test_start	= ksz9x31_cable_test_start,
6325 	.cable_test_get_status	= ksz9x31_cable_test_get_status,
6326 	.set_loopback	= ksz9031_set_loopback,
6327 }, {
6328 	PHY_ID_MATCH_MODEL(PHY_ID_LAN8814),
6329 	.name		= "Microchip INDY Gigabit Quad PHY",
6330 	.flags          = PHY_POLL_CABLE_TEST,
6331 	.config_init	= lan8814_config_init,
6332 	.driver_data	= &lan8814_type,
6333 	.probe		= lan8814_probe,
6334 	.soft_reset	= genphy_soft_reset,
6335 	.read_status	= ksz9031_read_status,
6336 	.get_sset_count	= kszphy_get_sset_count,
6337 	.get_strings	= kszphy_get_strings,
6338 	.get_stats	= kszphy_get_stats,
6339 	.suspend	= genphy_suspend,
6340 	.resume		= kszphy_resume,
6341 	.config_intr	= lan8814_config_intr,
6342 	.handle_interrupt = lan8814_handle_interrupt,
6343 	.cable_test_start	= lan8814_cable_test_start,
6344 	.cable_test_get_status	= ksz886x_cable_test_get_status,
6345 }, {
6346 	PHY_ID_MATCH_MODEL(PHY_ID_LAN8804),
6347 	.name		= "Microchip LAN966X Gigabit PHY",
6348 	.config_init	= lan8804_config_init,
6349 	.driver_data	= &ksz9021_type,
6350 	.probe		= kszphy_probe,
6351 	.soft_reset	= genphy_soft_reset,
6352 	.read_status	= ksz9031_read_status,
6353 	.get_sset_count	= kszphy_get_sset_count,
6354 	.get_strings	= kszphy_get_strings,
6355 	.get_stats	= kszphy_get_stats,
6356 	.suspend	= lan8804_suspend,
6357 	.resume		= lan8804_resume,
6358 	.config_intr	= lan8804_config_intr,
6359 	.handle_interrupt = lan8804_handle_interrupt,
6360 }, {
6361 	PHY_ID_MATCH_MODEL(PHY_ID_LAN8841),
6362 	.name		= "Microchip LAN8841 Gigabit PHY",
6363 	.flags		= PHY_POLL_CABLE_TEST,
6364 	.driver_data	= &lan8841_type,
6365 	.config_init	= lan8841_config_init,
6366 	.probe		= lan8841_probe,
6367 	.soft_reset	= genphy_soft_reset,
6368 	.config_intr	= lan8841_config_intr,
6369 	.handle_interrupt = lan8841_handle_interrupt,
6370 	.get_sset_count = kszphy_get_sset_count,
6371 	.get_strings	= kszphy_get_strings,
6372 	.get_stats	= kszphy_get_stats,
6373 	.suspend	= lan8841_suspend,
6374 	.resume		= lan8841_resume,
6375 	.cable_test_start	= lan8814_cable_test_start,
6376 	.cable_test_get_status	= ksz886x_cable_test_get_status,
6377 }, {
6378 	PHY_ID_MATCH_MODEL(PHY_ID_LAN8842),
6379 	.name		= "Microchip LAN8842 Gigabit PHY",
6380 	.flags		= PHY_POLL_CABLE_TEST,
6381 	.driver_data	= &lan8814_type,
6382 	.probe		= lan8842_probe,
6383 	.config_init	= lan8842_config_init,
6384 	.config_intr	= lan8842_config_intr,
6385 	.inband_caps	= lan8842_inband_caps,
6386 	.config_inband	= lan8842_config_inband,
6387 	.handle_interrupt = lan8842_handle_interrupt,
6388 	.get_phy_stats	= lan8842_get_phy_stats,
6389 	.update_stats	= lan8842_update_stats,
6390 	.get_tunable	= lan8842_get_tunable,
6391 	.set_tunable	= lan8842_set_tunable,
6392 	.cable_test_start	= lan8814_cable_test_start,
6393 	.cable_test_get_status	= ksz886x_cable_test_get_status,
6394 }, {
6395 	PHY_ID_MATCH_MODEL(PHY_ID_KSZ9131),
6396 	.name		= "Microchip KSZ9131 Gigabit PHY",
6397 	/* PHY_GBIT_FEATURES */
6398 	.flags		= PHY_POLL_CABLE_TEST,
6399 	.driver_data	= &ksz9131_type,
6400 	.probe		= kszphy_probe,
6401 	.soft_reset	= genphy_soft_reset,
6402 	.config_init	= ksz9131_config_init,
6403 	.config_intr	= kszphy_config_intr,
6404 	.config_aneg	= ksz9131_config_aneg,
6405 	.read_status	= ksz9131_read_status,
6406 	.handle_interrupt = kszphy_handle_interrupt,
6407 	.get_sset_count = kszphy_get_sset_count,
6408 	.get_strings	= kszphy_get_strings,
6409 	.get_stats	= kszphy_get_stats,
6410 	.suspend	= kszphy_suspend,
6411 	.resume		= ksz9131_resume,
6412 	.cable_test_start	= ksz9x31_cable_test_start,
6413 	.cable_test_get_status	= ksz9x31_cable_test_get_status,
6414 	.get_features	= ksz9477_get_features,
6415 }, {
6416 	PHY_ID_MATCH_MODEL(PHY_ID_KSZ8873MLL),
6417 	.name		= "Micrel KSZ8873MLL Switch",
6418 	/* PHY_BASIC_FEATURES */
6419 	.config_init	= kszphy_config_init,
6420 	.config_aneg	= ksz8873mll_config_aneg,
6421 	.read_status	= ksz8873mll_read_status,
6422 	.suspend	= genphy_suspend,
6423 	.resume		= genphy_resume,
6424 }, {
6425 	PHY_ID_MATCH_MODEL(PHY_ID_KSZ886X),
6426 	.name		= "Micrel KSZ8851 Ethernet MAC or KSZ886X Switch",
6427 	.driver_data	= &ksz886x_type,
6428 	/* PHY_BASIC_FEATURES */
6429 	.flags		= PHY_POLL_CABLE_TEST,
6430 	.config_init	= kszphy_config_init,
6431 	.config_aneg	= ksz886x_config_aneg,
6432 	.read_status	= ksz886x_read_status,
6433 	.suspend	= genphy_suspend,
6434 	.resume		= genphy_resume,
6435 	.cable_test_start	= ksz886x_cable_test_start,
6436 	.cable_test_get_status	= ksz886x_cable_test_get_status,
6437 }, {
6438 	.name		= "Micrel KSZ87XX Switch",
6439 	/* PHY_BASIC_FEATURES */
6440 	.config_init	= kszphy_config_init,
6441 	.match_phy_device = ksz8795_match_phy_device,
6442 	.suspend	= genphy_suspend,
6443 	.resume		= genphy_resume,
6444 }, {
6445 	PHY_ID_MATCH_MODEL(PHY_ID_KSZ9477),
6446 	.name		= "Microchip KSZ9477",
6447 	.probe		= kszphy_probe,
6448 	/* PHY_GBIT_FEATURES */
6449 	.config_init	= ksz9477_config_init,
6450 	.config_intr	= kszphy_config_intr,
6451 	.config_aneg	= ksz9477_config_aneg,
6452 	.read_status	= ksz9477_read_status,
6453 	.handle_interrupt = kszphy_handle_interrupt,
6454 	.suspend	= genphy_suspend,
6455 	.resume		= ksz9477_resume,
6456 	.get_phy_stats	= kszphy_get_phy_stats,
6457 	.update_stats	= kszphy_update_stats,
6458 	.cable_test_start	= ksz9x31_cable_test_start,
6459 	.cable_test_get_status	= ksz9x31_cable_test_get_status,
6460 	.get_sqi	= kszphy_get_sqi,
6461 	.get_sqi_max	= kszphy_get_sqi_max,
6462 } };
6463 
6464 module_phy_driver(ksphy_driver);
6465 
6466 MODULE_DESCRIPTION("Micrel PHY driver");
6467 MODULE_AUTHOR("David J. Choi");
6468 MODULE_LICENSE("GPL");
6469 
6470 static const struct mdio_device_id __maybe_unused micrel_tbl[] = {
6471 	{ PHY_ID_KSZ9021, 0x000ffffe },
6472 	{ PHY_ID_MATCH_MODEL(PHY_ID_KSZ9031) },
6473 	{ PHY_ID_MATCH_MODEL(PHY_ID_KSZ9131) },
6474 	{ PHY_ID_KSZ8001, 0x00fffffc },
6475 	{ PHY_ID_MATCH_MODEL(PHY_ID_KS8737) },
6476 	{ PHY_ID_KSZ8021, 0x00ffffff },
6477 	{ PHY_ID_KSZ8031, 0x00ffffff },
6478 	{ PHY_ID_MATCH_MODEL(PHY_ID_KSZ8041) },
6479 	{ PHY_ID_MATCH_MODEL(PHY_ID_KSZ8041RNLI) },
6480 	{ PHY_ID_MATCH_MODEL(PHY_ID_KSZ8051) },
6481 	{ PHY_ID_MATCH_MODEL(PHY_ID_KSZ8061) },
6482 	{ PHY_ID_MATCH_MODEL(PHY_ID_KSZ8081) },
6483 	{ PHY_ID_MATCH_MODEL(PHY_ID_KSZ8873MLL) },
6484 	{ PHY_ID_MATCH_MODEL(PHY_ID_KSZ886X) },
6485 	{ PHY_ID_MATCH_MODEL(PHY_ID_KSZ9477) },
6486 	{ PHY_ID_MATCH_MODEL(PHY_ID_LAN8814) },
6487 	{ PHY_ID_MATCH_MODEL(PHY_ID_LAN8804) },
6488 	{ PHY_ID_MATCH_MODEL(PHY_ID_LAN8841) },
6489 	{ PHY_ID_MATCH_MODEL(PHY_ID_LAN8842) },
6490 	{ }
6491 };
6492 
6493 MODULE_DEVICE_TABLE(mdio, micrel_tbl);
6494