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