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