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