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