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