xref: /openbmc/linux/drivers/net/phy/mscc/mscc_ptp.c (revision bb84bc51)
1 // SPDX-License-Identifier: (GPL-2.0 OR MIT)
2 /*
3  * Driver for Microsemi VSC85xx PHYs - timestamping and PHC support
4  *
5  * Authors: Quentin Schulz & Antoine Tenart
6  * License: Dual MIT/GPL
7  * Copyright (c) 2020 Microsemi Corporation
8  */
9 
10 #include <linux/gpio/consumer.h>
11 #include <linux/ip.h>
12 #include <linux/net_tstamp.h>
13 #include <linux/mii.h>
14 #include <linux/phy.h>
15 #include <linux/ptp_classify.h>
16 #include <linux/ptp_clock_kernel.h>
17 #include <linux/udp.h>
18 #include <asm/unaligned.h>
19 
20 #include "mscc.h"
21 #include "mscc_ptp.h"
22 
23 /* Two PHYs share the same 1588 processor and it's to be entirely configured
24  * through the base PHY of this processor.
25  */
26 /* phydev->bus->mdio_lock should be locked when using this function */
27 static int phy_ts_base_write(struct phy_device *phydev, u32 regnum, u16 val)
28 {
29 	struct vsc8531_private *priv = phydev->priv;
30 
31 	WARN_ON_ONCE(!mutex_is_locked(&phydev->mdio.bus->mdio_lock));
32 	return __mdiobus_write(phydev->mdio.bus, priv->ts_base_addr, regnum,
33 			       val);
34 }
35 
36 /* phydev->bus->mdio_lock should be locked when using this function */
37 static int phy_ts_base_read(struct phy_device *phydev, u32 regnum)
38 {
39 	struct vsc8531_private *priv = phydev->priv;
40 
41 	WARN_ON_ONCE(!mutex_is_locked(&phydev->mdio.bus->mdio_lock));
42 	return __mdiobus_read(phydev->mdio.bus, priv->ts_base_addr, regnum);
43 }
44 
45 enum ts_blk_hw {
46 	INGRESS_ENGINE_0,
47 	EGRESS_ENGINE_0,
48 	INGRESS_ENGINE_1,
49 	EGRESS_ENGINE_1,
50 	INGRESS_ENGINE_2,
51 	EGRESS_ENGINE_2,
52 	PROCESSOR_0,
53 	PROCESSOR_1,
54 };
55 
56 enum ts_blk {
57 	INGRESS,
58 	EGRESS,
59 	PROCESSOR,
60 };
61 
62 static u32 vsc85xx_ts_read_csr(struct phy_device *phydev, enum ts_blk blk,
63 			       u16 addr)
64 {
65 	struct vsc8531_private *priv = phydev->priv;
66 	bool base_port = phydev->mdio.addr == priv->ts_base_addr;
67 	u32 val, cnt = 0;
68 	enum ts_blk_hw blk_hw;
69 
70 	switch (blk) {
71 	case INGRESS:
72 		blk_hw = base_port ? INGRESS_ENGINE_0 : INGRESS_ENGINE_1;
73 		break;
74 	case EGRESS:
75 		blk_hw = base_port ? EGRESS_ENGINE_0 : EGRESS_ENGINE_1;
76 		break;
77 	case PROCESSOR:
78 	default:
79 		blk_hw = base_port ? PROCESSOR_0 : PROCESSOR_1;
80 		break;
81 	}
82 
83 	phy_lock_mdio_bus(phydev);
84 
85 	phy_ts_base_write(phydev, MSCC_EXT_PAGE_ACCESS, MSCC_PHY_PAGE_1588);
86 
87 	phy_ts_base_write(phydev, MSCC_PHY_TS_BIU_ADDR_CNTL, BIU_ADDR_EXE |
88 			  BIU_ADDR_READ | BIU_BLK_ID(blk_hw) |
89 			  BIU_CSR_ADDR(addr));
90 
91 	do {
92 		val = phy_ts_base_read(phydev, MSCC_PHY_TS_BIU_ADDR_CNTL);
93 	} while (!(val & BIU_ADDR_EXE) && cnt++ < BIU_ADDR_CNT_MAX);
94 
95 	val = phy_ts_base_read(phydev, MSCC_PHY_TS_CSR_DATA_MSB);
96 	val <<= 16;
97 	val |= phy_ts_base_read(phydev, MSCC_PHY_TS_CSR_DATA_LSB);
98 
99 	phy_ts_base_write(phydev, MSCC_EXT_PAGE_ACCESS, MSCC_PHY_PAGE_STANDARD);
100 
101 	phy_unlock_mdio_bus(phydev);
102 
103 	return val;
104 }
105 
106 static void vsc85xx_ts_write_csr(struct phy_device *phydev, enum ts_blk blk,
107 				 u16 addr, u32 val)
108 {
109 	struct vsc8531_private *priv = phydev->priv;
110 	bool base_port = phydev->mdio.addr == priv->ts_base_addr;
111 	u32 reg, bypass, cnt = 0, lower = val & 0xffff, upper = val >> 16;
112 	bool cond = (addr == MSCC_PHY_PTP_LTC_CTRL ||
113 		     addr == MSCC_PHY_1588_INGR_VSC85XX_INT_MASK ||
114 		     addr == MSCC_PHY_1588_VSC85XX_INT_MASK ||
115 		     addr == MSCC_PHY_1588_INGR_VSC85XX_INT_STATUS ||
116 		     addr == MSCC_PHY_1588_VSC85XX_INT_STATUS) &&
117 		    blk == PROCESSOR;
118 	enum ts_blk_hw blk_hw;
119 
120 	switch (blk) {
121 	case INGRESS:
122 		blk_hw = base_port ? INGRESS_ENGINE_0 : INGRESS_ENGINE_1;
123 		break;
124 	case EGRESS:
125 		blk_hw = base_port ? EGRESS_ENGINE_0 : EGRESS_ENGINE_1;
126 		break;
127 	case PROCESSOR:
128 	default:
129 		blk_hw = base_port ? PROCESSOR_0 : PROCESSOR_1;
130 		break;
131 	}
132 
133 	phy_lock_mdio_bus(phydev);
134 
135 	bypass = phy_ts_base_read(phydev, MSCC_PHY_BYPASS_CONTROL);
136 
137 	phy_ts_base_write(phydev, MSCC_EXT_PAGE_ACCESS, MSCC_PHY_PAGE_1588);
138 
139 	if (!cond || (cond && upper))
140 		phy_ts_base_write(phydev, MSCC_PHY_TS_CSR_DATA_MSB, upper);
141 
142 	phy_ts_base_write(phydev, MSCC_PHY_TS_CSR_DATA_LSB, lower);
143 
144 	phy_ts_base_write(phydev, MSCC_PHY_TS_BIU_ADDR_CNTL, BIU_ADDR_EXE |
145 			  BIU_ADDR_WRITE | BIU_BLK_ID(blk_hw) |
146 			  BIU_CSR_ADDR(addr));
147 
148 	do {
149 		reg = phy_ts_base_read(phydev, MSCC_PHY_TS_BIU_ADDR_CNTL);
150 	} while (!(reg & BIU_ADDR_EXE) && cnt++ < BIU_ADDR_CNT_MAX);
151 
152 	phy_ts_base_write(phydev, MSCC_EXT_PAGE_ACCESS, MSCC_PHY_PAGE_STANDARD);
153 
154 	if (cond && upper)
155 		phy_ts_base_write(phydev, MSCC_PHY_BYPASS_CONTROL, bypass);
156 
157 	phy_unlock_mdio_bus(phydev);
158 }
159 
160 /* Pick bytes from PTP header */
161 #define PTP_HEADER_TRNSP_MSG		26
162 #define PTP_HEADER_DOMAIN_NUM		25
163 #define PTP_HEADER_BYTE_8_31(x)		(31 - (x))
164 #define MAC_ADDRESS_BYTE(x)		((x) + (35 - ETH_ALEN + 1))
165 
166 static int vsc85xx_ts_fsb_init(struct phy_device *phydev)
167 {
168 	u8 sig_sel[16] = {};
169 	signed char i, pos = 0;
170 
171 	/* Seq ID is 2B long and starts at 30th byte */
172 	for (i = 1; i >= 0; i--)
173 		sig_sel[pos++] = PTP_HEADER_BYTE_8_31(30 + i);
174 
175 	/* DomainNum */
176 	sig_sel[pos++] = PTP_HEADER_DOMAIN_NUM;
177 
178 	/* MsgType */
179 	sig_sel[pos++] = PTP_HEADER_TRNSP_MSG;
180 
181 	/* MAC address is 6B long */
182 	for (i = ETH_ALEN - 1; i >= 0; i--)
183 		sig_sel[pos++] = MAC_ADDRESS_BYTE(i);
184 
185 	/* Fill the last bytes of the signature to reach a 16B signature */
186 	for (; pos < ARRAY_SIZE(sig_sel); pos++)
187 		sig_sel[pos] = PTP_HEADER_TRNSP_MSG;
188 
189 	for (i = 0; i <= 2; i++) {
190 		u32 val = 0;
191 
192 		for (pos = i * 5 + 4; pos >= i * 5; pos--)
193 			val = (val << 6) | sig_sel[pos];
194 
195 		vsc85xx_ts_write_csr(phydev, EGRESS, MSCC_PHY_ANA_FSB_REG(i),
196 				     val);
197 	}
198 
199 	vsc85xx_ts_write_csr(phydev, EGRESS, MSCC_PHY_ANA_FSB_REG(3),
200 			     sig_sel[15]);
201 
202 	return 0;
203 }
204 
205 static const u32 vsc85xx_egr_latency[] = {
206 	/* Copper Egress */
207 	1272, /* 1000Mbps */
208 	12516, /* 100Mbps */
209 	125444, /* 10Mbps */
210 	/* Fiber Egress */
211 	1277, /* 1000Mbps */
212 	12537, /* 100Mbps */
213 };
214 
215 static const u32 vsc85xx_egr_latency_macsec[] = {
216 	/* Copper Egress ON */
217 	3496, /* 1000Mbps */
218 	34760, /* 100Mbps */
219 	347844, /* 10Mbps */
220 	/* Fiber Egress ON */
221 	3502, /* 1000Mbps */
222 	34780, /* 100Mbps */
223 };
224 
225 static const u32 vsc85xx_ingr_latency[] = {
226 	/* Copper Ingress */
227 	208, /* 1000Mbps */
228 	304, /* 100Mbps */
229 	2023, /* 10Mbps */
230 	/* Fiber Ingress */
231 	98, /* 1000Mbps */
232 	197, /* 100Mbps */
233 };
234 
235 static const u32 vsc85xx_ingr_latency_macsec[] = {
236 	/* Copper Ingress */
237 	2408, /* 1000Mbps */
238 	22300, /* 100Mbps */
239 	222009, /* 10Mbps */
240 	/* Fiber Ingress */
241 	2299, /* 1000Mbps */
242 	22192, /* 100Mbps */
243 };
244 
245 static void vsc85xx_ts_set_latencies(struct phy_device *phydev)
246 {
247 	u32 val, ingr_latency, egr_latency;
248 	u8 idx;
249 
250 	/* No need to set latencies of packets if the PHY is not connected */
251 	if (!phydev->link)
252 		return;
253 
254 	vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_EGR_STALL_LATENCY,
255 			     STALL_EGR_LATENCY(phydev->speed));
256 
257 	switch (phydev->speed) {
258 	case SPEED_100:
259 		idx = 1;
260 		break;
261 	case SPEED_1000:
262 		idx = 0;
263 		break;
264 	default:
265 		idx = 2;
266 		break;
267 	}
268 
269 	ingr_latency = IS_ENABLED(CONFIG_MACSEC) ?
270 		vsc85xx_ingr_latency_macsec[idx] : vsc85xx_ingr_latency[idx];
271 	egr_latency = IS_ENABLED(CONFIG_MACSEC) ?
272 		vsc85xx_egr_latency_macsec[idx] : vsc85xx_egr_latency[idx];
273 
274 	vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_INGR_LOCAL_LATENCY,
275 			     PTP_INGR_LOCAL_LATENCY(ingr_latency));
276 
277 	val = vsc85xx_ts_read_csr(phydev, PROCESSOR,
278 				  MSCC_PHY_PTP_INGR_TSP_CTRL);
279 	val |= PHY_PTP_INGR_TSP_CTRL_LOAD_DELAYS;
280 	vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_INGR_TSP_CTRL,
281 			     val);
282 
283 	vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_EGR_LOCAL_LATENCY,
284 			     PTP_EGR_LOCAL_LATENCY(egr_latency));
285 
286 	val = vsc85xx_ts_read_csr(phydev, PROCESSOR, MSCC_PHY_PTP_EGR_TSP_CTRL);
287 	val |= PHY_PTP_EGR_TSP_CTRL_LOAD_DELAYS;
288 	vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_EGR_TSP_CTRL, val);
289 }
290 
291 static int vsc85xx_ts_disable_flows(struct phy_device *phydev, enum ts_blk blk)
292 {
293 	u8 i;
294 
295 	vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_IP1_NXT_PROT_NXT_COMP, 0);
296 	vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_IP1_NXT_PROT_UDP_CHKSUM,
297 			     IP1_NXT_PROT_UDP_CHKSUM_WIDTH(2));
298 	vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_IP2_NXT_PROT_NXT_COMP, 0);
299 	vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_IP2_NXT_PROT_UDP_CHKSUM,
300 			     IP2_NXT_PROT_UDP_CHKSUM_WIDTH(2));
301 	vsc85xx_ts_write_csr(phydev, blk, MSCC_PHY_ANA_MPLS_COMP_NXT_COMP, 0);
302 	vsc85xx_ts_write_csr(phydev, blk, MSCC_PHY_ANA_ETH1_NTX_PROT, 0);
303 	vsc85xx_ts_write_csr(phydev, blk, MSCC_PHY_ANA_ETH2_NTX_PROT, 0);
304 
305 	for (i = 0; i < COMP_MAX_FLOWS; i++) {
306 		vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_IP1_FLOW_ENA(i),
307 				     IP1_FLOW_VALID_CH0 | IP1_FLOW_VALID_CH1);
308 		vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_IP2_FLOW_ENA(i),
309 				     IP2_FLOW_VALID_CH0 | IP2_FLOW_VALID_CH1);
310 		vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_ETH1_FLOW_ENA(i),
311 				     ETH1_FLOW_VALID_CH0 | ETH1_FLOW_VALID_CH1);
312 		vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_ETH2_FLOW_ENA(i),
313 				     ETH2_FLOW_VALID_CH0 | ETH2_FLOW_VALID_CH1);
314 		vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_MPLS_FLOW_CTRL(i),
315 				     MPLS_FLOW_VALID_CH0 | MPLS_FLOW_VALID_CH1);
316 
317 		if (i >= PTP_COMP_MAX_FLOWS)
318 			continue;
319 
320 		vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_PTP_FLOW_ENA(i), 0);
321 		vsc85xx_ts_write_csr(phydev, blk,
322 				     MSCC_ANA_PTP_FLOW_DOMAIN_RANGE(i), 0);
323 		vsc85xx_ts_write_csr(phydev, blk,
324 				     MSCC_ANA_PTP_FLOW_MASK_UPPER(i), 0);
325 		vsc85xx_ts_write_csr(phydev, blk,
326 				     MSCC_ANA_PTP_FLOW_MASK_LOWER(i), 0);
327 		vsc85xx_ts_write_csr(phydev, blk,
328 				     MSCC_ANA_PTP_FLOW_MATCH_UPPER(i), 0);
329 		vsc85xx_ts_write_csr(phydev, blk,
330 				     MSCC_ANA_PTP_FLOW_MATCH_LOWER(i), 0);
331 		vsc85xx_ts_write_csr(phydev, blk,
332 				     MSCC_ANA_PTP_FLOW_PTP_ACTION(i), 0);
333 		vsc85xx_ts_write_csr(phydev, blk,
334 				     MSCC_ANA_PTP_FLOW_PTP_ACTION2(i), 0);
335 		vsc85xx_ts_write_csr(phydev, blk,
336 				     MSCC_ANA_PTP_FLOW_PTP_0_FIELD(i), 0);
337 		vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_OAM_PTP_FLOW_ENA(i),
338 				     0);
339 	}
340 
341 	return 0;
342 }
343 
344 static int vsc85xx_ts_eth_cmp1_sig(struct phy_device *phydev)
345 {
346 	u32 val;
347 
348 	val = vsc85xx_ts_read_csr(phydev, EGRESS, MSCC_PHY_ANA_ETH1_NTX_PROT);
349 	val &= ~ANA_ETH1_NTX_PROT_SIG_OFF_MASK;
350 	val |= ANA_ETH1_NTX_PROT_SIG_OFF(0);
351 	vsc85xx_ts_write_csr(phydev, EGRESS, MSCC_PHY_ANA_ETH1_NTX_PROT, val);
352 
353 	val = vsc85xx_ts_read_csr(phydev, EGRESS, MSCC_PHY_ANA_FSB_CFG);
354 	val &= ~ANA_FSB_ADDR_FROM_BLOCK_SEL_MASK;
355 	val |= ANA_FSB_ADDR_FROM_ETH1;
356 	vsc85xx_ts_write_csr(phydev, EGRESS, MSCC_PHY_ANA_FSB_CFG, val);
357 
358 	return 0;
359 }
360 
361 static struct vsc85xx_ptphdr *get_ptp_header_l4(struct sk_buff *skb,
362 						struct iphdr *iphdr,
363 						struct udphdr *udphdr)
364 {
365 	if (iphdr->version != 4 || iphdr->protocol != IPPROTO_UDP)
366 		return NULL;
367 
368 	return (struct vsc85xx_ptphdr *)(((unsigned char *)udphdr) + UDP_HLEN);
369 }
370 
371 static struct vsc85xx_ptphdr *get_ptp_header_tx(struct sk_buff *skb)
372 {
373 	struct ethhdr *ethhdr = eth_hdr(skb);
374 	struct udphdr *udphdr;
375 	struct iphdr *iphdr;
376 
377 	if (ethhdr->h_proto == htons(ETH_P_1588))
378 		return (struct vsc85xx_ptphdr *)(((unsigned char *)ethhdr) +
379 						 skb_mac_header_len(skb));
380 
381 	if (ethhdr->h_proto != htons(ETH_P_IP))
382 		return NULL;
383 
384 	iphdr = ip_hdr(skb);
385 	udphdr = udp_hdr(skb);
386 
387 	return get_ptp_header_l4(skb, iphdr, udphdr);
388 }
389 
390 static struct vsc85xx_ptphdr *get_ptp_header_rx(struct sk_buff *skb,
391 						enum hwtstamp_rx_filters rx_filter)
392 {
393 	struct udphdr *udphdr;
394 	struct iphdr *iphdr;
395 
396 	if (rx_filter == HWTSTAMP_FILTER_PTP_V2_L2_EVENT)
397 		return (struct vsc85xx_ptphdr *)skb->data;
398 
399 	iphdr = (struct iphdr *)skb->data;
400 	udphdr = (struct udphdr *)(skb->data + iphdr->ihl * 4);
401 
402 	return get_ptp_header_l4(skb, iphdr, udphdr);
403 }
404 
405 static int get_sig(struct sk_buff *skb, u8 *sig)
406 {
407 	struct vsc85xx_ptphdr *ptphdr = get_ptp_header_tx(skb);
408 	struct ethhdr *ethhdr = eth_hdr(skb);
409 	unsigned int i;
410 
411 	if (!ptphdr)
412 		return -EOPNOTSUPP;
413 
414 	sig[0] = (__force u16)ptphdr->seq_id >> 8;
415 	sig[1] = (__force u16)ptphdr->seq_id & GENMASK(7, 0);
416 	sig[2] = ptphdr->domain;
417 	sig[3] = ptphdr->tsmt & GENMASK(3, 0);
418 
419 	memcpy(&sig[4], ethhdr->h_dest, ETH_ALEN);
420 
421 	/* Fill the last bytes of the signature to reach a 16B signature */
422 	for (i = 10; i < 16; i++)
423 		sig[i] = ptphdr->tsmt & GENMASK(3, 0);
424 
425 	return 0;
426 }
427 
428 static void vsc85xx_dequeue_skb(struct vsc85xx_ptp *ptp)
429 {
430 	struct skb_shared_hwtstamps shhwtstamps;
431 	struct vsc85xx_ts_fifo fifo;
432 	struct sk_buff *skb;
433 	u8 skb_sig[16], *p;
434 	int i, len;
435 	u32 reg;
436 
437 	memset(&fifo, 0, sizeof(fifo));
438 	p = (u8 *)&fifo;
439 
440 	reg = vsc85xx_ts_read_csr(ptp->phydev, PROCESSOR,
441 				  MSCC_PHY_PTP_EGR_TS_FIFO(0));
442 	if (reg & PTP_EGR_TS_FIFO_EMPTY)
443 		return;
444 
445 	*p++ = reg & 0xff;
446 	*p++ = (reg >> 8) & 0xff;
447 
448 	/* Read the current FIFO item. Reading FIFO6 pops the next one. */
449 	for (i = 1; i < 7; i++) {
450 		reg = vsc85xx_ts_read_csr(ptp->phydev, PROCESSOR,
451 					  MSCC_PHY_PTP_EGR_TS_FIFO(i));
452 		*p++ = reg & 0xff;
453 		*p++ = (reg >> 8) & 0xff;
454 		*p++ = (reg >> 16) & 0xff;
455 		*p++ = (reg >> 24) & 0xff;
456 	}
457 
458 	len = skb_queue_len(&ptp->tx_queue);
459 	if (len < 1)
460 		return;
461 
462 	while (len--) {
463 		skb = __skb_dequeue(&ptp->tx_queue);
464 		if (!skb)
465 			return;
466 
467 		/* Can't get the signature of the packet, won't ever
468 		 * be able to have one so let's dequeue the packet.
469 		 */
470 		if (get_sig(skb, skb_sig) < 0) {
471 			kfree_skb(skb);
472 			continue;
473 		}
474 
475 		/* Check if we found the signature we were looking for. */
476 		if (!memcmp(skb_sig, fifo.sig, sizeof(fifo.sig))) {
477 			memset(&shhwtstamps, 0, sizeof(shhwtstamps));
478 			shhwtstamps.hwtstamp = ktime_set(fifo.secs, fifo.ns);
479 			skb_complete_tx_timestamp(skb, &shhwtstamps);
480 
481 			return;
482 		}
483 
484 		/* Valid signature but does not match the one of the
485 		 * packet in the FIFO right now, reschedule it for later
486 		 * packets.
487 		 */
488 		__skb_queue_tail(&ptp->tx_queue, skb);
489 	}
490 }
491 
492 static void vsc85xx_get_tx_ts(struct vsc85xx_ptp *ptp)
493 {
494 	u32 reg;
495 
496 	do {
497 		vsc85xx_dequeue_skb(ptp);
498 
499 		/* If other timestamps are available in the FIFO, process them. */
500 		reg = vsc85xx_ts_read_csr(ptp->phydev, PROCESSOR,
501 					  MSCC_PHY_PTP_EGR_TS_FIFO_CTRL);
502 	} while (PTP_EGR_FIFO_LEVEL_LAST_READ(reg) > 1);
503 }
504 
505 static int vsc85xx_ptp_cmp_init(struct phy_device *phydev, enum ts_blk blk)
506 {
507 	struct vsc8531_private *vsc8531 = phydev->priv;
508 	bool base = phydev->mdio.addr == vsc8531->ts_base_addr;
509 	enum vsc85xx_ptp_msg_type msgs[] = {
510 		PTP_MSG_TYPE_SYNC,
511 		PTP_MSG_TYPE_DELAY_REQ
512 	};
513 	u32 val;
514 	u8 i;
515 
516 	for (i = 0; i < ARRAY_SIZE(msgs); i++) {
517 		vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_PTP_FLOW_ENA(i),
518 				     base ? PTP_FLOW_VALID_CH0 :
519 				     PTP_FLOW_VALID_CH1);
520 
521 		val = vsc85xx_ts_read_csr(phydev, blk,
522 					  MSCC_ANA_PTP_FLOW_DOMAIN_RANGE(i));
523 		val &= ~PTP_FLOW_DOMAIN_RANGE_ENA;
524 		vsc85xx_ts_write_csr(phydev, blk,
525 				     MSCC_ANA_PTP_FLOW_DOMAIN_RANGE(i), val);
526 
527 		vsc85xx_ts_write_csr(phydev, blk,
528 				     MSCC_ANA_PTP_FLOW_MATCH_UPPER(i),
529 				     msgs[i] << 24);
530 
531 		vsc85xx_ts_write_csr(phydev, blk,
532 				     MSCC_ANA_PTP_FLOW_MASK_UPPER(i),
533 				     PTP_FLOW_MSG_TYPE_MASK);
534 	}
535 
536 	return 0;
537 }
538 
539 static int vsc85xx_eth_cmp1_init(struct phy_device *phydev, enum ts_blk blk)
540 {
541 	struct vsc8531_private *vsc8531 = phydev->priv;
542 	bool base = phydev->mdio.addr == vsc8531->ts_base_addr;
543 	u32 val;
544 
545 	vsc85xx_ts_write_csr(phydev, blk, MSCC_PHY_ANA_ETH1_NXT_PROT_TAG, 0);
546 	vsc85xx_ts_write_csr(phydev, blk, MSCC_PHY_ANA_ETH1_NTX_PROT_VLAN_TPID,
547 			     ANA_ETH1_NTX_PROT_VLAN_TPID(ETH_P_8021AD));
548 
549 	vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_ETH1_FLOW_ENA(0),
550 			     base ? ETH1_FLOW_VALID_CH0 : ETH1_FLOW_VALID_CH1);
551 	vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_ETH1_FLOW_MATCH_MODE(0),
552 			     ANA_ETH1_FLOW_MATCH_VLAN_TAG2);
553 	vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_ETH1_FLOW_ADDR_MATCH1(0), 0);
554 	vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_ETH1_FLOW_ADDR_MATCH2(0), 0);
555 	vsc85xx_ts_write_csr(phydev, blk,
556 			     MSCC_ANA_ETH1_FLOW_VLAN_RANGE_I_TAG(0), 0);
557 	vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_ETH1_FLOW_VLAN_TAG1(0), 0);
558 	vsc85xx_ts_write_csr(phydev, blk,
559 			     MSCC_ANA_ETH1_FLOW_VLAN_TAG2_I_TAG(0), 0);
560 
561 	val = vsc85xx_ts_read_csr(phydev, blk,
562 				  MSCC_ANA_ETH1_FLOW_MATCH_MODE(0));
563 	val &= ~ANA_ETH1_FLOW_MATCH_VLAN_TAG_MASK;
564 	val |= ANA_ETH1_FLOW_MATCH_VLAN_VERIFY;
565 	vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_ETH1_FLOW_MATCH_MODE(0),
566 			     val);
567 
568 	return 0;
569 }
570 
571 static int vsc85xx_ip_cmp1_init(struct phy_device *phydev, enum ts_blk blk)
572 {
573 	struct vsc8531_private *vsc8531 = phydev->priv;
574 	bool base = phydev->mdio.addr == vsc8531->ts_base_addr;
575 	u32 val;
576 
577 	vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_IP1_NXT_PROT_MATCH2_UPPER,
578 			     PTP_EV_PORT);
579 	/* Match on dest port only, ignore src */
580 	vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_IP1_NXT_PROT_MASK2_UPPER,
581 			     0xffff);
582 	vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_IP1_NXT_PROT_MATCH2_LOWER,
583 			     0);
584 	vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_IP1_NXT_PROT_MASK2_LOWER, 0);
585 
586 	val = vsc85xx_ts_read_csr(phydev, blk, MSCC_ANA_IP1_FLOW_ENA(0));
587 	val &= ~IP1_FLOW_ENA_CHANNEL_MASK_MASK;
588 	val |= base ? IP1_FLOW_VALID_CH0 : IP1_FLOW_VALID_CH1;
589 	vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_IP1_FLOW_ENA(0), val);
590 
591 	/* Match all IPs */
592 	vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_IP1_FLOW_MATCH_UPPER(0), 0);
593 	vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_IP1_FLOW_MASK_UPPER(0), 0);
594 	vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_IP1_FLOW_MATCH_UPPER_MID(0),
595 			     0);
596 	vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_IP1_FLOW_MASK_UPPER_MID(0),
597 			     0);
598 	vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_IP1_FLOW_MATCH_LOWER_MID(0),
599 			     0);
600 	vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_IP1_FLOW_MASK_LOWER_MID(0),
601 			     0);
602 	vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_IP1_FLOW_MATCH_LOWER(0), 0);
603 	vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_IP1_FLOW_MASK_LOWER(0), 0);
604 
605 	vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_PTP_IP_CHKSUM_SEL, 0);
606 
607 	return 0;
608 }
609 
610 static int vsc85xx_adjfine(struct ptp_clock_info *info, long scaled_ppm)
611 {
612 	struct vsc85xx_ptp *ptp = container_of(info, struct vsc85xx_ptp, caps);
613 	struct phy_device *phydev = ptp->phydev;
614 	struct vsc8531_private *priv = phydev->priv;
615 	u64 adj = 0;
616 	u32 val;
617 
618 	if (abs(scaled_ppm) < 66 || abs(scaled_ppm) > 65536UL * 1000000UL)
619 		return 0;
620 
621 	adj = div64_u64(1000000ULL * 65536ULL, abs(scaled_ppm));
622 	if (adj > 1000000000L)
623 		adj = 1000000000L;
624 
625 	val = PTP_AUTO_ADJ_NS_ROLLOVER(adj);
626 	val |= scaled_ppm > 0 ? PTP_AUTO_ADJ_ADD_1NS : PTP_AUTO_ADJ_SUB_1NS;
627 
628 	mutex_lock(&priv->phc_lock);
629 
630 	/* Update the ppb val in nano seconds to the auto adjust reg. */
631 	vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_LTC_AUTO_ADJ,
632 			     val);
633 
634 	/* The auto adjust update val is set to 0 after write operation. */
635 	val = vsc85xx_ts_read_csr(phydev, PROCESSOR, MSCC_PHY_PTP_LTC_CTRL);
636 	val |= PTP_LTC_CTRL_AUTO_ADJ_UPDATE;
637 	vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_LTC_CTRL, val);
638 
639 	mutex_unlock(&priv->phc_lock);
640 
641 	return 0;
642 }
643 
644 static int __vsc85xx_gettime(struct ptp_clock_info *info, struct timespec64 *ts)
645 {
646 	struct vsc85xx_ptp *ptp = container_of(info, struct vsc85xx_ptp, caps);
647 	struct phy_device *phydev = ptp->phydev;
648 	struct vsc85xx_shared_private *shared =
649 		(struct vsc85xx_shared_private *)phydev->shared->priv;
650 	struct vsc8531_private *priv = phydev->priv;
651 	u32 val;
652 
653 	val = vsc85xx_ts_read_csr(phydev, PROCESSOR, MSCC_PHY_PTP_LTC_CTRL);
654 	val |= PTP_LTC_CTRL_SAVE_ENA;
655 	vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_LTC_CTRL, val);
656 
657 	/* Local Time Counter (LTC) is put in SAVE* regs on rising edge of
658 	 * LOAD_SAVE pin.
659 	 */
660 	mutex_lock(&shared->gpio_lock);
661 	gpiod_set_value(priv->load_save, 1);
662 
663 	val = vsc85xx_ts_read_csr(phydev, PROCESSOR,
664 				  MSCC_PHY_PTP_LTC_SAVED_SEC_MSB);
665 
666 	ts->tv_sec = ((time64_t)val) << 32;
667 
668 	val = vsc85xx_ts_read_csr(phydev, PROCESSOR,
669 				  MSCC_PHY_PTP_LTC_SAVED_SEC_LSB);
670 	ts->tv_sec += val;
671 
672 	ts->tv_nsec = vsc85xx_ts_read_csr(phydev, PROCESSOR,
673 					  MSCC_PHY_PTP_LTC_SAVED_NS);
674 
675 	gpiod_set_value(priv->load_save, 0);
676 	mutex_unlock(&shared->gpio_lock);
677 
678 	return 0;
679 }
680 
681 static int vsc85xx_gettime(struct ptp_clock_info *info, struct timespec64 *ts)
682 {
683 	struct vsc85xx_ptp *ptp = container_of(info, struct vsc85xx_ptp, caps);
684 	struct phy_device *phydev = ptp->phydev;
685 	struct vsc8531_private *priv = phydev->priv;
686 
687 	mutex_lock(&priv->phc_lock);
688 	__vsc85xx_gettime(info, ts);
689 	mutex_unlock(&priv->phc_lock);
690 
691 	return 0;
692 }
693 
694 static int __vsc85xx_settime(struct ptp_clock_info *info,
695 			     const struct timespec64 *ts)
696 {
697 	struct vsc85xx_ptp *ptp = container_of(info, struct vsc85xx_ptp, caps);
698 	struct phy_device *phydev = ptp->phydev;
699 	struct vsc85xx_shared_private *shared =
700 		(struct vsc85xx_shared_private *)phydev->shared->priv;
701 	struct vsc8531_private *priv = phydev->priv;
702 	u32 val;
703 
704 	vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_LTC_LOAD_SEC_MSB,
705 			     PTP_LTC_LOAD_SEC_MSB(ts->tv_sec));
706 	vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_LTC_LOAD_SEC_LSB,
707 			     PTP_LTC_LOAD_SEC_LSB(ts->tv_sec));
708 	vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_LTC_LOAD_NS,
709 			     PTP_LTC_LOAD_NS(ts->tv_nsec));
710 
711 	val = vsc85xx_ts_read_csr(phydev, PROCESSOR, MSCC_PHY_PTP_LTC_CTRL);
712 	val |= PTP_LTC_CTRL_LOAD_ENA;
713 	vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_LTC_CTRL, val);
714 
715 	/* Local Time Counter (LTC) is set from LOAD* regs on rising edge of
716 	 * LOAD_SAVE pin.
717 	 */
718 	mutex_lock(&shared->gpio_lock);
719 	gpiod_set_value(priv->load_save, 1);
720 
721 	val &= ~PTP_LTC_CTRL_LOAD_ENA;
722 	vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_LTC_CTRL, val);
723 
724 	gpiod_set_value(priv->load_save, 0);
725 	mutex_unlock(&shared->gpio_lock);
726 
727 	return 0;
728 }
729 
730 static int vsc85xx_settime(struct ptp_clock_info *info,
731 			   const struct timespec64 *ts)
732 {
733 	struct vsc85xx_ptp *ptp = container_of(info, struct vsc85xx_ptp, caps);
734 	struct phy_device *phydev = ptp->phydev;
735 	struct vsc8531_private *priv = phydev->priv;
736 
737 	mutex_lock(&priv->phc_lock);
738 	__vsc85xx_settime(info, ts);
739 	mutex_unlock(&priv->phc_lock);
740 
741 	return 0;
742 }
743 
744 static int vsc85xx_adjtime(struct ptp_clock_info *info, s64 delta)
745 {
746 	struct vsc85xx_ptp *ptp = container_of(info, struct vsc85xx_ptp, caps);
747 	struct phy_device *phydev = ptp->phydev;
748 	struct vsc8531_private *priv = phydev->priv;
749 	u32 val;
750 
751 	/* Can't recover that big of an offset. Let's set the time directly. */
752 	if (abs(delta) >= NSEC_PER_SEC) {
753 		struct timespec64 ts;
754 		u64 now;
755 
756 		mutex_lock(&priv->phc_lock);
757 
758 		__vsc85xx_gettime(info, &ts);
759 		now = ktime_to_ns(timespec64_to_ktime(ts));
760 		ts = ns_to_timespec64(now + delta);
761 		__vsc85xx_settime(info, &ts);
762 
763 		mutex_unlock(&priv->phc_lock);
764 
765 		return 0;
766 	}
767 
768 	mutex_lock(&priv->phc_lock);
769 
770 	val = PTP_LTC_OFFSET_VAL(abs(delta)) | PTP_LTC_OFFSET_ADJ;
771 	if (delta > 0)
772 		val |= PTP_LTC_OFFSET_ADD;
773 	vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_LTC_OFFSET, val);
774 
775 	mutex_unlock(&priv->phc_lock);
776 
777 	return 0;
778 }
779 
780 static int vsc85xx_eth1_next_comp(struct phy_device *phydev, enum ts_blk blk,
781 				  u32 next_comp, u32 etype)
782 {
783 	u32 val;
784 
785 	val = vsc85xx_ts_read_csr(phydev, blk, MSCC_PHY_ANA_ETH1_NTX_PROT);
786 	val &= ~ANA_ETH1_NTX_PROT_COMPARATOR_MASK;
787 	val |= next_comp;
788 	vsc85xx_ts_write_csr(phydev, blk, MSCC_PHY_ANA_ETH1_NTX_PROT, val);
789 
790 	val = ANA_ETH1_NXT_PROT_ETYPE_MATCH(etype) |
791 		ANA_ETH1_NXT_PROT_ETYPE_MATCH_ENA;
792 	vsc85xx_ts_write_csr(phydev, blk,
793 			     MSCC_PHY_ANA_ETH1_NXT_PROT_ETYPE_MATCH, val);
794 
795 	return 0;
796 }
797 
798 static int vsc85xx_ip1_next_comp(struct phy_device *phydev, enum ts_blk blk,
799 				 u32 next_comp, u32 header)
800 {
801 	vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_IP1_NXT_PROT_NXT_COMP,
802 			     ANA_IP1_NXT_PROT_NXT_COMP_BYTES_HDR(header) |
803 			     next_comp);
804 
805 	return 0;
806 }
807 
808 static int vsc85xx_ts_ptp_action_flow(struct phy_device *phydev, enum ts_blk blk, u8 flow, enum ptp_cmd cmd)
809 {
810 	u32 val;
811 
812 	/* Check non-zero reserved field */
813 	val = PTP_FLOW_PTP_0_FIELD_PTP_FRAME | PTP_FLOW_PTP_0_FIELD_RSVRD_CHECK;
814 	vsc85xx_ts_write_csr(phydev, blk,
815 			     MSCC_ANA_PTP_FLOW_PTP_0_FIELD(flow), val);
816 
817 	val = PTP_FLOW_PTP_ACTION_CORR_OFFSET(8) |
818 	      PTP_FLOW_PTP_ACTION_TIME_OFFSET(8) |
819 	      PTP_FLOW_PTP_ACTION_PTP_CMD(cmd == PTP_SAVE_IN_TS_FIFO ?
820 					  PTP_NOP : cmd);
821 	if (cmd == PTP_SAVE_IN_TS_FIFO)
822 		val |= PTP_FLOW_PTP_ACTION_SAVE_LOCAL_TIME;
823 	else if (cmd == PTP_WRITE_NS)
824 		val |= PTP_FLOW_PTP_ACTION_MOD_FRAME_STATUS_UPDATE |
825 		       PTP_FLOW_PTP_ACTION_MOD_FRAME_STATUS_BYTE_OFFSET(6);
826 	vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_PTP_FLOW_PTP_ACTION(flow),
827 			     val);
828 
829 	if (cmd == PTP_WRITE_1588)
830 		/* Rewrite timestamp directly in frame */
831 		val = PTP_FLOW_PTP_ACTION2_REWRITE_OFFSET(34) |
832 		      PTP_FLOW_PTP_ACTION2_REWRITE_BYTES(10);
833 	else if (cmd == PTP_SAVE_IN_TS_FIFO)
834 		/* no rewrite */
835 		val = PTP_FLOW_PTP_ACTION2_REWRITE_OFFSET(0) |
836 		      PTP_FLOW_PTP_ACTION2_REWRITE_BYTES(0);
837 	else
838 		/* Write in reserved field */
839 		val = PTP_FLOW_PTP_ACTION2_REWRITE_OFFSET(16) |
840 		      PTP_FLOW_PTP_ACTION2_REWRITE_BYTES(4);
841 	vsc85xx_ts_write_csr(phydev, blk,
842 			     MSCC_ANA_PTP_FLOW_PTP_ACTION2(flow), val);
843 
844 	return 0;
845 }
846 
847 static int vsc85xx_ptp_conf(struct phy_device *phydev, enum ts_blk blk,
848 			    bool one_step, bool enable)
849 {
850 	enum vsc85xx_ptp_msg_type msgs[] = {
851 		PTP_MSG_TYPE_SYNC,
852 		PTP_MSG_TYPE_DELAY_REQ
853 	};
854 	u32 val;
855 	u8 i;
856 
857 	for (i = 0; i < ARRAY_SIZE(msgs); i++) {
858 		if (blk == INGRESS)
859 			vsc85xx_ts_ptp_action_flow(phydev, blk, msgs[i],
860 						   PTP_WRITE_NS);
861 		else if (msgs[i] == PTP_MSG_TYPE_SYNC && one_step)
862 			/* no need to know Sync t when sending in one_step */
863 			vsc85xx_ts_ptp_action_flow(phydev, blk, msgs[i],
864 						   PTP_WRITE_1588);
865 		else
866 			vsc85xx_ts_ptp_action_flow(phydev, blk, msgs[i],
867 						   PTP_SAVE_IN_TS_FIFO);
868 
869 		val = vsc85xx_ts_read_csr(phydev, blk,
870 					  MSCC_ANA_PTP_FLOW_ENA(i));
871 		val &= ~PTP_FLOW_ENA;
872 		if (enable)
873 			val |= PTP_FLOW_ENA;
874 		vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_PTP_FLOW_ENA(i),
875 				     val);
876 	}
877 
878 	return 0;
879 }
880 
881 static int vsc85xx_eth1_conf(struct phy_device *phydev, enum ts_blk blk,
882 			     bool enable)
883 {
884 	struct vsc8531_private *vsc8531 = phydev->priv;
885 	u32 val = ANA_ETH1_FLOW_ADDR_MATCH2_DEST;
886 
887 	if (vsc8531->ptp->rx_filter == HWTSTAMP_FILTER_PTP_V2_L2_EVENT) {
888 		/* PTP over Ethernet multicast address for SYNC and DELAY msg */
889 		u8 ptp_multicast[6] = {0x01, 0x1b, 0x19, 0x00, 0x00, 0x00};
890 
891 		val |= ANA_ETH1_FLOW_ADDR_MATCH2_FULL_ADDR |
892 		       get_unaligned_be16(&ptp_multicast[4]);
893 		vsc85xx_ts_write_csr(phydev, blk,
894 				     MSCC_ANA_ETH1_FLOW_ADDR_MATCH2(0), val);
895 		vsc85xx_ts_write_csr(phydev, blk,
896 				     MSCC_ANA_ETH1_FLOW_ADDR_MATCH1(0),
897 				     get_unaligned_be32(ptp_multicast));
898 	} else {
899 		val |= ANA_ETH1_FLOW_ADDR_MATCH2_ANY_MULTICAST;
900 		vsc85xx_ts_write_csr(phydev, blk,
901 				     MSCC_ANA_ETH1_FLOW_ADDR_MATCH2(0), val);
902 		vsc85xx_ts_write_csr(phydev, blk,
903 				     MSCC_ANA_ETH1_FLOW_ADDR_MATCH1(0), 0);
904 	}
905 
906 	val = vsc85xx_ts_read_csr(phydev, blk, MSCC_ANA_ETH1_FLOW_ENA(0));
907 	val &= ~ETH1_FLOW_ENA;
908 	if (enable)
909 		val |= ETH1_FLOW_ENA;
910 	vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_ETH1_FLOW_ENA(0), val);
911 
912 	return 0;
913 }
914 
915 static int vsc85xx_ip1_conf(struct phy_device *phydev, enum ts_blk blk,
916 			    bool enable)
917 {
918 	u32 val;
919 
920 	vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_IP1_NXT_PROT_IP1_MODE,
921 			     ANA_IP1_NXT_PROT_IPV4 |
922 			     ANA_IP1_NXT_PROT_FLOW_OFFSET_IPV4);
923 
924 	/* Matching UDP protocol number */
925 	val = ANA_IP1_NXT_PROT_IP_MATCH1_PROT_MASK(0xff) |
926 	      ANA_IP1_NXT_PROT_IP_MATCH1_PROT_MATCH(IPPROTO_UDP) |
927 	      ANA_IP1_NXT_PROT_IP_MATCH1_PROT_OFF(9);
928 	vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_IP1_NXT_PROT_IP_MATCH1,
929 			     val);
930 
931 	/* End of IP protocol, start of next protocol (UDP) */
932 	vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_IP1_NXT_PROT_OFFSET2,
933 			     ANA_IP1_NXT_PROT_OFFSET2(20));
934 
935 	val = vsc85xx_ts_read_csr(phydev, blk,
936 				  MSCC_ANA_IP1_NXT_PROT_UDP_CHKSUM);
937 	val &= ~(IP1_NXT_PROT_UDP_CHKSUM_OFF_MASK |
938 		 IP1_NXT_PROT_UDP_CHKSUM_WIDTH_MASK);
939 	val |= IP1_NXT_PROT_UDP_CHKSUM_WIDTH(2);
940 
941 	val &= ~(IP1_NXT_PROT_UDP_CHKSUM_UPDATE |
942 		 IP1_NXT_PROT_UDP_CHKSUM_CLEAR);
943 	/* UDP checksum offset in IPv4 packet
944 	 * according to: https://tools.ietf.org/html/rfc768
945 	 */
946 	val |= IP1_NXT_PROT_UDP_CHKSUM_OFF(26) | IP1_NXT_PROT_UDP_CHKSUM_CLEAR;
947 	vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_IP1_NXT_PROT_UDP_CHKSUM,
948 			     val);
949 
950 	val = vsc85xx_ts_read_csr(phydev, blk, MSCC_ANA_IP1_FLOW_ENA(0));
951 	val &= ~(IP1_FLOW_MATCH_ADDR_MASK | IP1_FLOW_ENA);
952 	val |= IP1_FLOW_MATCH_DEST_SRC_ADDR;
953 	if (enable)
954 		val |= IP1_FLOW_ENA;
955 	vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_IP1_FLOW_ENA(0), val);
956 
957 	return 0;
958 }
959 
960 static int vsc85xx_ts_engine_init(struct phy_device *phydev, bool one_step)
961 {
962 	struct vsc8531_private *vsc8531 = phydev->priv;
963 	bool ptp_l4, base = phydev->mdio.addr == vsc8531->ts_base_addr;
964 	u8 eng_id = base ? 0 : 1;
965 	u32 val;
966 
967 	ptp_l4 = vsc8531->ptp->rx_filter == HWTSTAMP_FILTER_PTP_V2_L4_EVENT;
968 
969 	val = vsc85xx_ts_read_csr(phydev, PROCESSOR,
970 				  MSCC_PHY_PTP_ANALYZER_MODE);
971 	/* Disable INGRESS and EGRESS so engine eng_id can be reconfigured */
972 	val &= ~(PTP_ANALYZER_MODE_EGR_ENA(BIT(eng_id)) |
973 		 PTP_ANALYZER_MODE_INGR_ENA(BIT(eng_id)));
974 	vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_ANALYZER_MODE,
975 			     val);
976 
977 	if (vsc8531->ptp->rx_filter == HWTSTAMP_FILTER_PTP_V2_L2_EVENT) {
978 		vsc85xx_eth1_next_comp(phydev, INGRESS,
979 				       ANA_ETH1_NTX_PROT_PTP_OAM, ETH_P_1588);
980 		vsc85xx_eth1_next_comp(phydev, EGRESS,
981 				       ANA_ETH1_NTX_PROT_PTP_OAM, ETH_P_1588);
982 	} else {
983 		vsc85xx_eth1_next_comp(phydev, INGRESS,
984 				       ANA_ETH1_NTX_PROT_IP_UDP_ACH_1,
985 				       ETH_P_IP);
986 		vsc85xx_eth1_next_comp(phydev, EGRESS,
987 				       ANA_ETH1_NTX_PROT_IP_UDP_ACH_1,
988 				       ETH_P_IP);
989 		/* Header length of IPv[4/6] + UDP */
990 		vsc85xx_ip1_next_comp(phydev, INGRESS,
991 				      ANA_ETH1_NTX_PROT_PTP_OAM, 28);
992 		vsc85xx_ip1_next_comp(phydev, EGRESS,
993 				      ANA_ETH1_NTX_PROT_PTP_OAM, 28);
994 	}
995 
996 	vsc85xx_eth1_conf(phydev, INGRESS,
997 			  vsc8531->ptp->rx_filter != HWTSTAMP_FILTER_NONE);
998 	vsc85xx_ip1_conf(phydev, INGRESS,
999 			 ptp_l4 && vsc8531->ptp->rx_filter != HWTSTAMP_FILTER_NONE);
1000 	vsc85xx_ptp_conf(phydev, INGRESS, one_step,
1001 			 vsc8531->ptp->rx_filter != HWTSTAMP_FILTER_NONE);
1002 
1003 	vsc85xx_eth1_conf(phydev, EGRESS,
1004 			  vsc8531->ptp->tx_type != HWTSTAMP_TX_OFF);
1005 	vsc85xx_ip1_conf(phydev, EGRESS,
1006 			 ptp_l4 && vsc8531->ptp->tx_type != HWTSTAMP_TX_OFF);
1007 	vsc85xx_ptp_conf(phydev, EGRESS, one_step,
1008 			 vsc8531->ptp->tx_type != HWTSTAMP_TX_OFF);
1009 
1010 	val &= ~PTP_ANALYZER_MODE_EGR_ENA(BIT(eng_id));
1011 	if (vsc8531->ptp->tx_type != HWTSTAMP_TX_OFF)
1012 		val |= PTP_ANALYZER_MODE_EGR_ENA(BIT(eng_id));
1013 
1014 	val &= ~PTP_ANALYZER_MODE_INGR_ENA(BIT(eng_id));
1015 	if (vsc8531->ptp->rx_filter != HWTSTAMP_FILTER_NONE)
1016 		val |= PTP_ANALYZER_MODE_INGR_ENA(BIT(eng_id));
1017 
1018 	vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_ANALYZER_MODE,
1019 			     val);
1020 
1021 	return 0;
1022 }
1023 
1024 void vsc85xx_link_change_notify(struct phy_device *phydev)
1025 {
1026 	struct vsc8531_private *priv = phydev->priv;
1027 
1028 	mutex_lock(&priv->ts_lock);
1029 	vsc85xx_ts_set_latencies(phydev);
1030 	mutex_unlock(&priv->ts_lock);
1031 }
1032 
1033 static void vsc85xx_ts_reset_fifo(struct phy_device *phydev)
1034 {
1035 	u32 val;
1036 
1037 	val = vsc85xx_ts_read_csr(phydev, PROCESSOR,
1038 				  MSCC_PHY_PTP_EGR_TS_FIFO_CTRL);
1039 	val |= PTP_EGR_TS_FIFO_RESET;
1040 	vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_EGR_TS_FIFO_CTRL,
1041 			     val);
1042 
1043 	val &= ~PTP_EGR_TS_FIFO_RESET;
1044 	vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_EGR_TS_FIFO_CTRL,
1045 			     val);
1046 }
1047 
1048 static int vsc85xx_hwtstamp(struct mii_timestamper *mii_ts, struct ifreq *ifr)
1049 {
1050 	struct vsc8531_private *vsc8531 =
1051 		container_of(mii_ts, struct vsc8531_private, mii_ts);
1052 	struct phy_device *phydev = vsc8531->ptp->phydev;
1053 	struct hwtstamp_config cfg;
1054 	bool one_step = false;
1055 	u32 val;
1056 
1057 	if (copy_from_user(&cfg, ifr->ifr_data, sizeof(cfg)))
1058 		return -EFAULT;
1059 
1060 	if (cfg.flags)
1061 		return -EINVAL;
1062 
1063 	switch (cfg.tx_type) {
1064 	case HWTSTAMP_TX_ONESTEP_SYNC:
1065 		one_step = true;
1066 		break;
1067 	case HWTSTAMP_TX_ON:
1068 		break;
1069 	case HWTSTAMP_TX_OFF:
1070 		break;
1071 	default:
1072 		return -ERANGE;
1073 	}
1074 
1075 	vsc8531->ptp->tx_type = cfg.tx_type;
1076 
1077 	switch (cfg.rx_filter) {
1078 	case HWTSTAMP_FILTER_NONE:
1079 		break;
1080 	case HWTSTAMP_FILTER_PTP_V2_L4_EVENT:
1081 		/* ETH->IP->UDP->PTP */
1082 		break;
1083 	case HWTSTAMP_FILTER_PTP_V2_L2_EVENT:
1084 		/* ETH->PTP */
1085 		break;
1086 	default:
1087 		return -ERANGE;
1088 	}
1089 
1090 	vsc8531->ptp->rx_filter = cfg.rx_filter;
1091 
1092 	mutex_lock(&vsc8531->ts_lock);
1093 
1094 	__skb_queue_purge(&vsc8531->ptp->tx_queue);
1095 	__skb_queue_head_init(&vsc8531->ptp->tx_queue);
1096 
1097 	/* Disable predictor while configuring the 1588 block */
1098 	val = vsc85xx_ts_read_csr(phydev, PROCESSOR,
1099 				  MSCC_PHY_PTP_INGR_PREDICTOR);
1100 	val &= ~PTP_INGR_PREDICTOR_EN;
1101 	vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_INGR_PREDICTOR,
1102 			     val);
1103 	val = vsc85xx_ts_read_csr(phydev, PROCESSOR,
1104 				  MSCC_PHY_PTP_EGR_PREDICTOR);
1105 	val &= ~PTP_EGR_PREDICTOR_EN;
1106 	vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_EGR_PREDICTOR,
1107 			     val);
1108 
1109 	/* Bypass egress or ingress blocks if timestamping isn't used */
1110 	val = vsc85xx_ts_read_csr(phydev, PROCESSOR, MSCC_PHY_PTP_IFACE_CTRL);
1111 	val &= ~(PTP_IFACE_CTRL_EGR_BYPASS | PTP_IFACE_CTRL_INGR_BYPASS);
1112 	if (vsc8531->ptp->tx_type == HWTSTAMP_TX_OFF)
1113 		val |= PTP_IFACE_CTRL_EGR_BYPASS;
1114 	if (vsc8531->ptp->rx_filter == HWTSTAMP_FILTER_NONE)
1115 		val |= PTP_IFACE_CTRL_INGR_BYPASS;
1116 	vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_IFACE_CTRL, val);
1117 
1118 	/* Resetting FIFO so that it's empty after reconfiguration */
1119 	vsc85xx_ts_reset_fifo(phydev);
1120 
1121 	vsc85xx_ts_engine_init(phydev, one_step);
1122 
1123 	/* Re-enable predictors now */
1124 	val = vsc85xx_ts_read_csr(phydev, PROCESSOR,
1125 				  MSCC_PHY_PTP_INGR_PREDICTOR);
1126 	val |= PTP_INGR_PREDICTOR_EN;
1127 	vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_INGR_PREDICTOR,
1128 			     val);
1129 	val = vsc85xx_ts_read_csr(phydev, PROCESSOR,
1130 				  MSCC_PHY_PTP_EGR_PREDICTOR);
1131 	val |= PTP_EGR_PREDICTOR_EN;
1132 	vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_EGR_PREDICTOR,
1133 			     val);
1134 
1135 	vsc8531->ptp->configured = 1;
1136 	mutex_unlock(&vsc8531->ts_lock);
1137 
1138 	return copy_to_user(ifr->ifr_data, &cfg, sizeof(cfg)) ? -EFAULT : 0;
1139 }
1140 
1141 static int vsc85xx_ts_info(struct mii_timestamper *mii_ts,
1142 			   struct ethtool_ts_info *info)
1143 {
1144 	struct vsc8531_private *vsc8531 =
1145 		container_of(mii_ts, struct vsc8531_private, mii_ts);
1146 
1147 	info->phc_index = ptp_clock_index(vsc8531->ptp->ptp_clock);
1148 	info->so_timestamping =
1149 		SOF_TIMESTAMPING_TX_HARDWARE |
1150 		SOF_TIMESTAMPING_RX_HARDWARE |
1151 		SOF_TIMESTAMPING_RAW_HARDWARE;
1152 	info->tx_types =
1153 		(1 << HWTSTAMP_TX_OFF) |
1154 		(1 << HWTSTAMP_TX_ON) |
1155 		(1 << HWTSTAMP_TX_ONESTEP_SYNC);
1156 	info->rx_filters =
1157 		(1 << HWTSTAMP_FILTER_NONE) |
1158 		(1 << HWTSTAMP_FILTER_PTP_V2_L2_EVENT) |
1159 		(1 << HWTSTAMP_FILTER_PTP_V2_L4_EVENT);
1160 
1161 	return 0;
1162 }
1163 
1164 static void vsc85xx_txtstamp(struct mii_timestamper *mii_ts,
1165 			     struct sk_buff *skb, int type)
1166 {
1167 	struct vsc8531_private *vsc8531 =
1168 		container_of(mii_ts, struct vsc8531_private, mii_ts);
1169 
1170 	if (!vsc8531->ptp->configured)
1171 		return;
1172 
1173 	if (vsc8531->ptp->tx_type == HWTSTAMP_TX_OFF) {
1174 		kfree_skb(skb);
1175 		return;
1176 	}
1177 
1178 	skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS;
1179 
1180 	mutex_lock(&vsc8531->ts_lock);
1181 	__skb_queue_tail(&vsc8531->ptp->tx_queue, skb);
1182 	mutex_unlock(&vsc8531->ts_lock);
1183 }
1184 
1185 static bool vsc85xx_rxtstamp(struct mii_timestamper *mii_ts,
1186 			     struct sk_buff *skb, int type)
1187 {
1188 	struct vsc8531_private *vsc8531 =
1189 		container_of(mii_ts, struct vsc8531_private, mii_ts);
1190 	struct skb_shared_hwtstamps *shhwtstamps = NULL;
1191 	struct vsc85xx_ptphdr *ptphdr;
1192 	struct timespec64 ts;
1193 	unsigned long ns;
1194 
1195 	if (!vsc8531->ptp->configured)
1196 		return false;
1197 
1198 	if (vsc8531->ptp->rx_filter == HWTSTAMP_FILTER_NONE ||
1199 	    type == PTP_CLASS_NONE)
1200 		return false;
1201 
1202 	vsc85xx_gettime(&vsc8531->ptp->caps, &ts);
1203 
1204 	ptphdr = get_ptp_header_rx(skb, vsc8531->ptp->rx_filter);
1205 	if (!ptphdr)
1206 		return false;
1207 
1208 	shhwtstamps = skb_hwtstamps(skb);
1209 	memset(shhwtstamps, 0, sizeof(struct skb_shared_hwtstamps));
1210 
1211 	ns = ntohl(ptphdr->rsrvd2);
1212 
1213 	/* nsec is in reserved field */
1214 	if (ts.tv_nsec < ns)
1215 		ts.tv_sec--;
1216 
1217 	shhwtstamps->hwtstamp = ktime_set(ts.tv_sec, ns);
1218 	netif_rx_ni(skb);
1219 
1220 	return true;
1221 }
1222 
1223 static const struct ptp_clock_info vsc85xx_clk_caps = {
1224 	.owner		= THIS_MODULE,
1225 	.name		= "VSC85xx timer",
1226 	.max_adj	= S32_MAX,
1227 	.n_alarm	= 0,
1228 	.n_pins		= 0,
1229 	.n_ext_ts	= 0,
1230 	.n_per_out	= 0,
1231 	.pps		= 0,
1232 	.adjtime        = &vsc85xx_adjtime,
1233 	.adjfine	= &vsc85xx_adjfine,
1234 	.gettime64	= &vsc85xx_gettime,
1235 	.settime64	= &vsc85xx_settime,
1236 };
1237 
1238 static struct vsc8531_private *vsc8584_base_priv(struct phy_device *phydev)
1239 {
1240 	struct vsc8531_private *vsc8531 = phydev->priv;
1241 
1242 	if (vsc8531->ts_base_addr != phydev->mdio.addr) {
1243 		struct mdio_device *dev;
1244 
1245 		dev = phydev->mdio.bus->mdio_map[vsc8531->ts_base_addr];
1246 		phydev = container_of(dev, struct phy_device, mdio);
1247 
1248 		return phydev->priv;
1249 	}
1250 
1251 	return vsc8531;
1252 }
1253 
1254 static bool vsc8584_is_1588_input_clk_configured(struct phy_device *phydev)
1255 {
1256 	struct vsc8531_private *vsc8531 = vsc8584_base_priv(phydev);
1257 
1258 	return vsc8531->input_clk_init;
1259 }
1260 
1261 static void vsc8584_set_input_clk_configured(struct phy_device *phydev)
1262 {
1263 	struct vsc8531_private *vsc8531 = vsc8584_base_priv(phydev);
1264 
1265 	vsc8531->input_clk_init = true;
1266 }
1267 
1268 static int __vsc8584_init_ptp(struct phy_device *phydev)
1269 {
1270 	struct vsc8531_private *vsc8531 = phydev->priv;
1271 	u32 ltc_seq_e[] = { 0, 400000, 0, 0, 0 };
1272 	u8  ltc_seq_a[] = { 8, 6, 5, 4, 2 };
1273 	u32 val;
1274 
1275 	if (!vsc8584_is_1588_input_clk_configured(phydev)) {
1276 		phy_lock_mdio_bus(phydev);
1277 
1278 		/* 1588_DIFF_INPUT_CLK configuration: Use an external clock for
1279 		 * the LTC, as per 3.13.29 in the VSC8584 datasheet.
1280 		 */
1281 		phy_ts_base_write(phydev, MSCC_EXT_PAGE_ACCESS,
1282 				  MSCC_PHY_PAGE_1588);
1283 		phy_ts_base_write(phydev, 29, 0x7ae0);
1284 		phy_ts_base_write(phydev, 30, 0xb71c);
1285 		phy_ts_base_write(phydev, MSCC_EXT_PAGE_ACCESS,
1286 				  MSCC_PHY_PAGE_STANDARD);
1287 
1288 		phy_unlock_mdio_bus(phydev);
1289 
1290 		vsc8584_set_input_clk_configured(phydev);
1291 	}
1292 
1293 	/* Disable predictor before configuring the 1588 block */
1294 	val = vsc85xx_ts_read_csr(phydev, PROCESSOR,
1295 				  MSCC_PHY_PTP_INGR_PREDICTOR);
1296 	val &= ~PTP_INGR_PREDICTOR_EN;
1297 	vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_INGR_PREDICTOR,
1298 			     val);
1299 	val = vsc85xx_ts_read_csr(phydev, PROCESSOR,
1300 				  MSCC_PHY_PTP_EGR_PREDICTOR);
1301 	val &= ~PTP_EGR_PREDICTOR_EN;
1302 	vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_EGR_PREDICTOR,
1303 			     val);
1304 
1305 	/* By default, the internal clock of fixed rate 250MHz is used */
1306 	val = vsc85xx_ts_read_csr(phydev, PROCESSOR, MSCC_PHY_PTP_LTC_CTRL);
1307 	val &= ~PTP_LTC_CTRL_CLK_SEL_MASK;
1308 	val |= PTP_LTC_CTRL_CLK_SEL_INTERNAL_250;
1309 	vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_LTC_CTRL, val);
1310 
1311 	val = vsc85xx_ts_read_csr(phydev, PROCESSOR, MSCC_PHY_PTP_LTC_SEQUENCE);
1312 	val &= ~PTP_LTC_SEQUENCE_A_MASK;
1313 	val |= PTP_LTC_SEQUENCE_A(ltc_seq_a[PHC_CLK_250MHZ]);
1314 	vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_LTC_SEQUENCE, val);
1315 
1316 	val = vsc85xx_ts_read_csr(phydev, PROCESSOR, MSCC_PHY_PTP_LTC_SEQ);
1317 	val &= ~(PTP_LTC_SEQ_ERR_MASK | PTP_LTC_SEQ_ADD_SUB);
1318 	if (ltc_seq_e[PHC_CLK_250MHZ])
1319 		val |= PTP_LTC_SEQ_ADD_SUB;
1320 	val |= PTP_LTC_SEQ_ERR(ltc_seq_e[PHC_CLK_250MHZ]);
1321 	vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_LTC_SEQ, val);
1322 
1323 	vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_LTC_1PPS_WIDTH_ADJ,
1324 			     PPS_WIDTH_ADJ);
1325 
1326 	vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_INGR_DELAY_FIFO,
1327 			     IS_ENABLED(CONFIG_MACSEC) ?
1328 			     PTP_INGR_DELAY_FIFO_DEPTH_MACSEC :
1329 			     PTP_INGR_DELAY_FIFO_DEPTH_DEFAULT);
1330 
1331 	vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_EGR_DELAY_FIFO,
1332 			     IS_ENABLED(CONFIG_MACSEC) ?
1333 			     PTP_EGR_DELAY_FIFO_DEPTH_MACSEC :
1334 			     PTP_EGR_DELAY_FIFO_DEPTH_DEFAULT);
1335 
1336 	/* Enable n-phase sampler for Viper Rev-B */
1337 	val = vsc85xx_ts_read_csr(phydev, PROCESSOR,
1338 				  MSCC_PHY_PTP_ACCUR_CFG_STATUS);
1339 	val &= ~(PTP_ACCUR_PPS_OUT_BYPASS | PTP_ACCUR_PPS_IN_BYPASS |
1340 		 PTP_ACCUR_EGR_SOF_BYPASS | PTP_ACCUR_INGR_SOF_BYPASS |
1341 		 PTP_ACCUR_LOAD_SAVE_BYPASS);
1342 	val |= PTP_ACCUR_PPS_OUT_CALIB_ERR | PTP_ACCUR_PPS_OUT_CALIB_DONE |
1343 	       PTP_ACCUR_PPS_IN_CALIB_ERR | PTP_ACCUR_PPS_IN_CALIB_DONE |
1344 	       PTP_ACCUR_EGR_SOF_CALIB_ERR | PTP_ACCUR_EGR_SOF_CALIB_DONE |
1345 	       PTP_ACCUR_INGR_SOF_CALIB_ERR | PTP_ACCUR_INGR_SOF_CALIB_DONE |
1346 	       PTP_ACCUR_LOAD_SAVE_CALIB_ERR | PTP_ACCUR_LOAD_SAVE_CALIB_DONE;
1347 	vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_ACCUR_CFG_STATUS,
1348 			     val);
1349 
1350 	val = vsc85xx_ts_read_csr(phydev, PROCESSOR,
1351 				  MSCC_PHY_PTP_ACCUR_CFG_STATUS);
1352 	val |= PTP_ACCUR_CALIB_TRIGG;
1353 	vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_ACCUR_CFG_STATUS,
1354 			     val);
1355 
1356 	val = vsc85xx_ts_read_csr(phydev, PROCESSOR,
1357 				  MSCC_PHY_PTP_ACCUR_CFG_STATUS);
1358 	val &= ~PTP_ACCUR_CALIB_TRIGG;
1359 	val |= PTP_ACCUR_PPS_OUT_CALIB_ERR | PTP_ACCUR_PPS_OUT_CALIB_DONE |
1360 	       PTP_ACCUR_PPS_IN_CALIB_ERR | PTP_ACCUR_PPS_IN_CALIB_DONE |
1361 	       PTP_ACCUR_EGR_SOF_CALIB_ERR | PTP_ACCUR_EGR_SOF_CALIB_DONE |
1362 	       PTP_ACCUR_INGR_SOF_CALIB_ERR | PTP_ACCUR_INGR_SOF_CALIB_DONE |
1363 	       PTP_ACCUR_LOAD_SAVE_CALIB_ERR | PTP_ACCUR_LOAD_SAVE_CALIB_DONE;
1364 	vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_ACCUR_CFG_STATUS,
1365 			     val);
1366 
1367 	val = vsc85xx_ts_read_csr(phydev, PROCESSOR,
1368 				  MSCC_PHY_PTP_ACCUR_CFG_STATUS);
1369 	val |= PTP_ACCUR_CALIB_TRIGG;
1370 	vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_ACCUR_CFG_STATUS,
1371 			     val);
1372 
1373 	val = vsc85xx_ts_read_csr(phydev, PROCESSOR,
1374 				  MSCC_PHY_PTP_ACCUR_CFG_STATUS);
1375 	val &= ~PTP_ACCUR_CALIB_TRIGG;
1376 	vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_ACCUR_CFG_STATUS,
1377 			     val);
1378 
1379 	/* Do not access FIFO via SI */
1380 	val = vsc85xx_ts_read_csr(phydev, PROCESSOR,
1381 				  MSCC_PHY_PTP_TSTAMP_FIFO_SI);
1382 	val &= ~PTP_TSTAMP_FIFO_SI_EN;
1383 	vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_TSTAMP_FIFO_SI,
1384 			     val);
1385 
1386 	val = vsc85xx_ts_read_csr(phydev, PROCESSOR,
1387 				  MSCC_PHY_PTP_INGR_REWRITER_CTRL);
1388 	val &= ~PTP_INGR_REWRITER_REDUCE_PREAMBLE;
1389 	vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_INGR_REWRITER_CTRL,
1390 			     val);
1391 	val = vsc85xx_ts_read_csr(phydev, PROCESSOR,
1392 				  MSCC_PHY_PTP_EGR_REWRITER_CTRL);
1393 	val &= ~PTP_EGR_REWRITER_REDUCE_PREAMBLE;
1394 	vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_EGR_REWRITER_CTRL,
1395 			     val);
1396 
1397 	/* Put the flag that indicates the frame has been modified to bit 7 */
1398 	val = vsc85xx_ts_read_csr(phydev, PROCESSOR,
1399 				  MSCC_PHY_PTP_INGR_REWRITER_CTRL);
1400 	val |= PTP_INGR_REWRITER_FLAG_BIT_OFF(7) | PTP_INGR_REWRITER_FLAG_VAL;
1401 	vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_INGR_REWRITER_CTRL,
1402 			     val);
1403 	val = vsc85xx_ts_read_csr(phydev, PROCESSOR,
1404 				  MSCC_PHY_PTP_EGR_REWRITER_CTRL);
1405 	val |= PTP_EGR_REWRITER_FLAG_BIT_OFF(7);
1406 	val &= ~PTP_EGR_REWRITER_FLAG_VAL;
1407 	vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_EGR_REWRITER_CTRL,
1408 			     val);
1409 
1410 	/* 30bit mode for RX timestamp, only the nanoseconds are kept in
1411 	 * reserved field.
1412 	 */
1413 	val = vsc85xx_ts_read_csr(phydev, PROCESSOR,
1414 				  MSCC_PHY_PTP_INGR_TSP_CTRL);
1415 	val |= PHY_PTP_INGR_TSP_CTRL_FRACT_NS;
1416 	vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_INGR_TSP_CTRL,
1417 			     val);
1418 
1419 	val = vsc85xx_ts_read_csr(phydev, PROCESSOR, MSCC_PHY_PTP_EGR_TSP_CTRL);
1420 	val |= PHY_PTP_EGR_TSP_CTRL_FRACT_NS;
1421 	vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_EGR_TSP_CTRL, val);
1422 
1423 	val = vsc85xx_ts_read_csr(phydev, PROCESSOR,
1424 				  MSCC_PHY_PTP_SERIAL_TOD_IFACE);
1425 	val |= PTP_SERIAL_TOD_IFACE_LS_AUTO_CLR;
1426 	vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_SERIAL_TOD_IFACE,
1427 			     val);
1428 
1429 	vsc85xx_ts_fsb_init(phydev);
1430 
1431 	/* Set the Egress timestamp FIFO configuration and status register */
1432 	val = vsc85xx_ts_read_csr(phydev, PROCESSOR,
1433 				  MSCC_PHY_PTP_EGR_TS_FIFO_CTRL);
1434 	val &= ~(PTP_EGR_TS_FIFO_SIG_BYTES_MASK | PTP_EGR_TS_FIFO_THRESH_MASK);
1435 	/* 16 bytes for the signature, 10 for the timestamp in the TS FIFO */
1436 	val |= PTP_EGR_TS_FIFO_SIG_BYTES(16) | PTP_EGR_TS_FIFO_THRESH(7);
1437 	vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_EGR_TS_FIFO_CTRL,
1438 			     val);
1439 
1440 	vsc85xx_ts_reset_fifo(phydev);
1441 
1442 	val = PTP_IFACE_CTRL_CLK_ENA;
1443 	if (!IS_ENABLED(CONFIG_MACSEC))
1444 		val |= PTP_IFACE_CTRL_GMII_PROT;
1445 	vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_IFACE_CTRL, val);
1446 
1447 	vsc85xx_ts_set_latencies(phydev);
1448 
1449 	val = vsc85xx_ts_read_csr(phydev, PROCESSOR, MSCC_PHY_PTP_VERSION_CODE);
1450 
1451 	val = vsc85xx_ts_read_csr(phydev, PROCESSOR, MSCC_PHY_PTP_IFACE_CTRL);
1452 	val |= PTP_IFACE_CTRL_EGR_BYPASS;
1453 	vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_IFACE_CTRL, val);
1454 
1455 	vsc85xx_ts_disable_flows(phydev, EGRESS);
1456 	vsc85xx_ts_disable_flows(phydev, INGRESS);
1457 
1458 	val = vsc85xx_ts_read_csr(phydev, PROCESSOR,
1459 				  MSCC_PHY_PTP_ANALYZER_MODE);
1460 	/* Disable INGRESS and EGRESS so engine eng_id can be reconfigured */
1461 	val &= ~(PTP_ANALYZER_MODE_EGR_ENA_MASK |
1462 		 PTP_ANALYZER_MODE_INGR_ENA_MASK |
1463 		 PTP_ANA_INGR_ENCAP_FLOW_MODE_MASK |
1464 		 PTP_ANA_EGR_ENCAP_FLOW_MODE_MASK);
1465 	/* Strict matching in flow (packets should match flows from the same
1466 	 * index in all enabled comparators (except PTP)).
1467 	 */
1468 	val |= PTP_ANA_SPLIT_ENCAP_FLOW | PTP_ANA_INGR_ENCAP_FLOW_MODE(0x7) |
1469 	       PTP_ANA_EGR_ENCAP_FLOW_MODE(0x7);
1470 	vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_ANALYZER_MODE,
1471 			     val);
1472 
1473 	/* Initialized for ingress and egress flows:
1474 	 * - The Ethernet comparator.
1475 	 * - The IP comparator.
1476 	 * - The PTP comparator.
1477 	 */
1478 	vsc85xx_eth_cmp1_init(phydev, INGRESS);
1479 	vsc85xx_ip_cmp1_init(phydev, INGRESS);
1480 	vsc85xx_ptp_cmp_init(phydev, INGRESS);
1481 	vsc85xx_eth_cmp1_init(phydev, EGRESS);
1482 	vsc85xx_ip_cmp1_init(phydev, EGRESS);
1483 	vsc85xx_ptp_cmp_init(phydev, EGRESS);
1484 
1485 	vsc85xx_ts_eth_cmp1_sig(phydev);
1486 
1487 	vsc8531->mii_ts.rxtstamp = vsc85xx_rxtstamp;
1488 	vsc8531->mii_ts.txtstamp = vsc85xx_txtstamp;
1489 	vsc8531->mii_ts.hwtstamp = vsc85xx_hwtstamp;
1490 	vsc8531->mii_ts.ts_info  = vsc85xx_ts_info;
1491 	phydev->mii_ts = &vsc8531->mii_ts;
1492 
1493 	memcpy(&vsc8531->ptp->caps, &vsc85xx_clk_caps, sizeof(vsc85xx_clk_caps));
1494 
1495 	vsc8531->ptp->ptp_clock = ptp_clock_register(&vsc8531->ptp->caps,
1496 						     &phydev->mdio.dev);
1497 	return PTR_ERR_OR_ZERO(vsc8531->ptp->ptp_clock);
1498 }
1499 
1500 void vsc8584_config_ts_intr(struct phy_device *phydev)
1501 {
1502 	struct vsc8531_private *priv = phydev->priv;
1503 
1504 	mutex_lock(&priv->ts_lock);
1505 	vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_1588_VSC85XX_INT_MASK,
1506 			     VSC85XX_1588_INT_MASK_MASK);
1507 	mutex_unlock(&priv->ts_lock);
1508 }
1509 
1510 int vsc8584_ptp_init(struct phy_device *phydev)
1511 {
1512 	switch (phydev->phy_id & phydev->drv->phy_id_mask) {
1513 	case PHY_ID_VSC8575:
1514 	case PHY_ID_VSC8582:
1515 	case PHY_ID_VSC8584:
1516 		return __vsc8584_init_ptp(phydev);
1517 	}
1518 
1519 	return 0;
1520 }
1521 
1522 irqreturn_t vsc8584_handle_ts_interrupt(struct phy_device *phydev)
1523 {
1524 	struct vsc8531_private *priv = phydev->priv;
1525 	int rc;
1526 
1527 	mutex_lock(&priv->ts_lock);
1528 	rc = vsc85xx_ts_read_csr(phydev, PROCESSOR,
1529 				 MSCC_PHY_1588_VSC85XX_INT_STATUS);
1530 	/* Ack the PTP interrupt */
1531 	vsc85xx_ts_write_csr(phydev, PROCESSOR,
1532 			     MSCC_PHY_1588_VSC85XX_INT_STATUS, rc);
1533 
1534 	if (!(rc & VSC85XX_1588_INT_MASK_MASK)) {
1535 		mutex_unlock(&priv->ts_lock);
1536 		return IRQ_NONE;
1537 	}
1538 
1539 	if (rc & VSC85XX_1588_INT_FIFO_ADD) {
1540 		vsc85xx_get_tx_ts(priv->ptp);
1541 	} else if (rc & VSC85XX_1588_INT_FIFO_OVERFLOW) {
1542 		__skb_queue_purge(&priv->ptp->tx_queue);
1543 		vsc85xx_ts_reset_fifo(phydev);
1544 	}
1545 
1546 	mutex_unlock(&priv->ts_lock);
1547 	return IRQ_HANDLED;
1548 }
1549 
1550 int vsc8584_ptp_probe(struct phy_device *phydev)
1551 {
1552 	struct vsc8531_private *vsc8531 = phydev->priv;
1553 
1554 	vsc8531->ptp = devm_kzalloc(&phydev->mdio.dev, sizeof(*vsc8531->ptp),
1555 				    GFP_KERNEL);
1556 	if (!vsc8531->ptp)
1557 		return -ENOMEM;
1558 
1559 	mutex_init(&vsc8531->phc_lock);
1560 	mutex_init(&vsc8531->ts_lock);
1561 
1562 	/* Retrieve the shared load/save GPIO. Request it as non exclusive as
1563 	 * the same GPIO can be requested by all the PHYs of the same package.
1564 	 * This GPIO must be used with the gpio_lock taken (the lock is shared
1565 	 * between all PHYs).
1566 	 */
1567 	vsc8531->load_save = devm_gpiod_get_optional(&phydev->mdio.dev, "load-save",
1568 						     GPIOD_FLAGS_BIT_NONEXCLUSIVE |
1569 						     GPIOD_OUT_LOW);
1570 	if (IS_ERR(vsc8531->load_save)) {
1571 		phydev_err(phydev, "Can't get load-save GPIO (%ld)\n",
1572 			   PTR_ERR(vsc8531->load_save));
1573 		return PTR_ERR(vsc8531->load_save);
1574 	}
1575 
1576 	vsc8531->ptp->phydev = phydev;
1577 
1578 	return 0;
1579 }
1580 
1581 int vsc8584_ptp_probe_once(struct phy_device *phydev)
1582 {
1583 	struct vsc85xx_shared_private *shared =
1584 		(struct vsc85xx_shared_private *)phydev->shared->priv;
1585 
1586 	/* Initialize shared GPIO lock */
1587 	mutex_init(&shared->gpio_lock);
1588 
1589 	return 0;
1590 }
1591