]> Git Repo - linux.git/blob - drivers/net/phy/micrel.c
Merge tag 'char-misc-5.18-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregk...
[linux.git] / drivers / net / phy / micrel.c
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 <[email protected]>
11  *
12  * Support : Micrel Phys:
13  *              Giga phys: ksz9021, ksz9031, ksz9131
14  *              100/10 Phys : ksz8001, ksz8721, ksz8737, ksz8041
15  *                         ksz8021, ksz8031, ksz8051,
16  *                         ksz8081, ksz8091,
17  *                         ksz8061,
18  *              Switch : ksz8873, ksz886x
19  *                       ksz9477
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
36 /* Operation Mode Strap Override */
37 #define MII_KSZPHY_OMSO                         0x16
38 #define KSZPHY_OMSO_FACTORY_TEST                BIT(15)
39 #define KSZPHY_OMSO_B_CAST_OFF                  BIT(9)
40 #define KSZPHY_OMSO_NAND_TREE_ON                BIT(5)
41 #define KSZPHY_OMSO_RMII_OVERRIDE               BIT(1)
42 #define KSZPHY_OMSO_MII_OVERRIDE                BIT(0)
43
44 /* general Interrupt control/status reg in vendor specific block. */
45 #define MII_KSZPHY_INTCS                        0x1B
46 #define KSZPHY_INTCS_JABBER                     BIT(15)
47 #define KSZPHY_INTCS_RECEIVE_ERR                BIT(14)
48 #define KSZPHY_INTCS_PAGE_RECEIVE               BIT(13)
49 #define KSZPHY_INTCS_PARELLEL                   BIT(12)
50 #define KSZPHY_INTCS_LINK_PARTNER_ACK           BIT(11)
51 #define KSZPHY_INTCS_LINK_DOWN                  BIT(10)
52 #define KSZPHY_INTCS_REMOTE_FAULT               BIT(9)
53 #define KSZPHY_INTCS_LINK_UP                    BIT(8)
54 #define KSZPHY_INTCS_ALL                        (KSZPHY_INTCS_LINK_UP |\
55                                                 KSZPHY_INTCS_LINK_DOWN)
56 #define KSZPHY_INTCS_LINK_DOWN_STATUS           BIT(2)
57 #define KSZPHY_INTCS_LINK_UP_STATUS             BIT(0)
58 #define KSZPHY_INTCS_STATUS                     (KSZPHY_INTCS_LINK_DOWN_STATUS |\
59                                                  KSZPHY_INTCS_LINK_UP_STATUS)
60
61 /* LinkMD Control/Status */
62 #define KSZ8081_LMD                             0x1d
63 #define KSZ8081_LMD_ENABLE_TEST                 BIT(15)
64 #define KSZ8081_LMD_STAT_NORMAL                 0
65 #define KSZ8081_LMD_STAT_OPEN                   1
66 #define KSZ8081_LMD_STAT_SHORT                  2
67 #define KSZ8081_LMD_STAT_FAIL                   3
68 #define KSZ8081_LMD_STAT_MASK                   GENMASK(14, 13)
69 /* Short cable (<10 meter) has been detected by LinkMD */
70 #define KSZ8081_LMD_SHORT_INDICATOR             BIT(12)
71 #define KSZ8081_LMD_DELTA_TIME_MASK             GENMASK(8, 0)
72
73 /* Lan8814 general Interrupt control/status reg in GPHY specific block. */
74 #define LAN8814_INTC                            0x18
75 #define LAN8814_INTS                            0x1B
76
77 #define LAN8814_INT_LINK_DOWN                   BIT(2)
78 #define LAN8814_INT_LINK_UP                     BIT(0)
79 #define LAN8814_INT_LINK                        (LAN8814_INT_LINK_UP |\
80                                                  LAN8814_INT_LINK_DOWN)
81
82 #define LAN8814_INTR_CTRL_REG                   0x34
83 #define LAN8814_INTR_CTRL_REG_POLARITY          BIT(1)
84 #define LAN8814_INTR_CTRL_REG_INTR_ENABLE       BIT(0)
85
86 /* Represents 1ppm adjustment in 2^32 format with
87  * each nsec contains 4 clock cycles.
88  * The value is calculated as following: (1/1000000)/((2^-32)/4)
89  */
90 #define LAN8814_1PPM_FORMAT                     17179
91
92 #define PTP_RX_MOD                              0x024F
93 #define PTP_RX_MOD_BAD_UDPV4_CHKSUM_FORCE_FCS_DIS_ BIT(3)
94 #define PTP_RX_TIMESTAMP_EN                     0x024D
95 #define PTP_TX_TIMESTAMP_EN                     0x028D
96
97 #define PTP_TIMESTAMP_EN_SYNC_                  BIT(0)
98 #define PTP_TIMESTAMP_EN_DREQ_                  BIT(1)
99 #define PTP_TIMESTAMP_EN_PDREQ_                 BIT(2)
100 #define PTP_TIMESTAMP_EN_PDRES_                 BIT(3)
101
102 #define PTP_RX_LATENCY_1000                     0x0224
103 #define PTP_TX_LATENCY_1000                     0x0225
104
105 #define PTP_RX_LATENCY_100                      0x0222
106 #define PTP_TX_LATENCY_100                      0x0223
107
108 #define PTP_RX_LATENCY_10                       0x0220
109 #define PTP_TX_LATENCY_10                       0x0221
110
111 #define PTP_TX_PARSE_L2_ADDR_EN                 0x0284
112 #define PTP_RX_PARSE_L2_ADDR_EN                 0x0244
113
114 #define PTP_TX_PARSE_IP_ADDR_EN                 0x0285
115 #define PTP_RX_PARSE_IP_ADDR_EN                 0x0245
116 #define LTC_HARD_RESET                          0x023F
117 #define LTC_HARD_RESET_                         BIT(0)
118
119 #define TSU_HARD_RESET                          0x02C1
120 #define TSU_HARD_RESET_                         BIT(0)
121
122 #define PTP_CMD_CTL                             0x0200
123 #define PTP_CMD_CTL_PTP_DISABLE_                BIT(0)
124 #define PTP_CMD_CTL_PTP_ENABLE_                 BIT(1)
125 #define PTP_CMD_CTL_PTP_CLOCK_READ_             BIT(3)
126 #define PTP_CMD_CTL_PTP_CLOCK_LOAD_             BIT(4)
127 #define PTP_CMD_CTL_PTP_LTC_STEP_SEC_           BIT(5)
128 #define PTP_CMD_CTL_PTP_LTC_STEP_NSEC_          BIT(6)
129
130 #define PTP_CLOCK_SET_SEC_MID                   0x0206
131 #define PTP_CLOCK_SET_SEC_LO                    0x0207
132 #define PTP_CLOCK_SET_NS_HI                     0x0208
133 #define PTP_CLOCK_SET_NS_LO                     0x0209
134
135 #define PTP_CLOCK_READ_SEC_MID                  0x022A
136 #define PTP_CLOCK_READ_SEC_LO                   0x022B
137 #define PTP_CLOCK_READ_NS_HI                    0x022C
138 #define PTP_CLOCK_READ_NS_LO                    0x022D
139
140 #define PTP_OPERATING_MODE                      0x0241
141 #define PTP_OPERATING_MODE_STANDALONE_          BIT(0)
142
143 #define PTP_TX_MOD                              0x028F
144 #define PTP_TX_MOD_TX_PTP_SYNC_TS_INSERT_       BIT(12)
145 #define PTP_TX_MOD_BAD_UDPV4_CHKSUM_FORCE_FCS_DIS_ BIT(3)
146
147 #define PTP_RX_PARSE_CONFIG                     0x0242
148 #define PTP_RX_PARSE_CONFIG_LAYER2_EN_          BIT(0)
149 #define PTP_RX_PARSE_CONFIG_IPV4_EN_            BIT(1)
150 #define PTP_RX_PARSE_CONFIG_IPV6_EN_            BIT(2)
151
152 #define PTP_TX_PARSE_CONFIG                     0x0282
153 #define PTP_TX_PARSE_CONFIG_LAYER2_EN_          BIT(0)
154 #define PTP_TX_PARSE_CONFIG_IPV4_EN_            BIT(1)
155 #define PTP_TX_PARSE_CONFIG_IPV6_EN_            BIT(2)
156
157 #define PTP_CLOCK_RATE_ADJ_HI                   0x020C
158 #define PTP_CLOCK_RATE_ADJ_LO                   0x020D
159 #define PTP_CLOCK_RATE_ADJ_DIR_                 BIT(15)
160
161 #define PTP_LTC_STEP_ADJ_HI                     0x0212
162 #define PTP_LTC_STEP_ADJ_LO                     0x0213
163 #define PTP_LTC_STEP_ADJ_DIR_                   BIT(15)
164
165 #define LAN8814_INTR_STS_REG                    0x0033
166 #define LAN8814_INTR_STS_REG_1588_TSU0_         BIT(0)
167 #define LAN8814_INTR_STS_REG_1588_TSU1_         BIT(1)
168 #define LAN8814_INTR_STS_REG_1588_TSU2_         BIT(2)
169 #define LAN8814_INTR_STS_REG_1588_TSU3_         BIT(3)
170
171 #define PTP_CAP_INFO                            0x022A
172 #define PTP_CAP_INFO_TX_TS_CNT_GET_(reg_val)    (((reg_val) & 0x0f00) >> 8)
173 #define PTP_CAP_INFO_RX_TS_CNT_GET_(reg_val)    ((reg_val) & 0x000f)
174
175 #define PTP_TX_EGRESS_SEC_HI                    0x0296
176 #define PTP_TX_EGRESS_SEC_LO                    0x0297
177 #define PTP_TX_EGRESS_NS_HI                     0x0294
178 #define PTP_TX_EGRESS_NS_LO                     0x0295
179 #define PTP_TX_MSG_HEADER2                      0x0299
180
181 #define PTP_RX_INGRESS_SEC_HI                   0x0256
182 #define PTP_RX_INGRESS_SEC_LO                   0x0257
183 #define PTP_RX_INGRESS_NS_HI                    0x0254
184 #define PTP_RX_INGRESS_NS_LO                    0x0255
185 #define PTP_RX_MSG_HEADER2                      0x0259
186
187 #define PTP_TSU_INT_EN                          0x0200
188 #define PTP_TSU_INT_EN_PTP_TX_TS_OVRFL_EN_      BIT(3)
189 #define PTP_TSU_INT_EN_PTP_TX_TS_EN_            BIT(2)
190 #define PTP_TSU_INT_EN_PTP_RX_TS_OVRFL_EN_      BIT(1)
191 #define PTP_TSU_INT_EN_PTP_RX_TS_EN_            BIT(0)
192
193 #define PTP_TSU_INT_STS                         0x0201
194 #define PTP_TSU_INT_STS_PTP_TX_TS_OVRFL_INT_    BIT(3)
195 #define PTP_TSU_INT_STS_PTP_TX_TS_EN_           BIT(2)
196 #define PTP_TSU_INT_STS_PTP_RX_TS_OVRFL_INT_    BIT(1)
197 #define PTP_TSU_INT_STS_PTP_RX_TS_EN_           BIT(0)
198
199 /* PHY Control 1 */
200 #define MII_KSZPHY_CTRL_1                       0x1e
201 #define KSZ8081_CTRL1_MDIX_STAT                 BIT(4)
202
203 /* PHY Control 2 / PHY Control (if no PHY Control 1) */
204 #define MII_KSZPHY_CTRL_2                       0x1f
205 #define MII_KSZPHY_CTRL                         MII_KSZPHY_CTRL_2
206 /* bitmap of PHY register to set interrupt mode */
207 #define KSZ8081_CTRL2_HP_MDIX                   BIT(15)
208 #define KSZ8081_CTRL2_MDI_MDI_X_SELECT          BIT(14)
209 #define KSZ8081_CTRL2_DISABLE_AUTO_MDIX         BIT(13)
210 #define KSZ8081_CTRL2_FORCE_LINK                BIT(11)
211 #define KSZ8081_CTRL2_POWER_SAVING              BIT(10)
212 #define KSZPHY_CTRL_INT_ACTIVE_HIGH             BIT(9)
213 #define KSZPHY_RMII_REF_CLK_SEL                 BIT(7)
214
215 /* Write/read to/from extended registers */
216 #define MII_KSZPHY_EXTREG                       0x0b
217 #define KSZPHY_EXTREG_WRITE                     0x8000
218
219 #define MII_KSZPHY_EXTREG_WRITE                 0x0c
220 #define MII_KSZPHY_EXTREG_READ                  0x0d
221
222 /* Extended registers */
223 #define MII_KSZPHY_CLK_CONTROL_PAD_SKEW         0x104
224 #define MII_KSZPHY_RX_DATA_PAD_SKEW             0x105
225 #define MII_KSZPHY_TX_DATA_PAD_SKEW             0x106
226
227 #define PS_TO_REG                               200
228 #define FIFO_SIZE                               8
229
230 struct kszphy_hw_stat {
231         const char *string;
232         u8 reg;
233         u8 bits;
234 };
235
236 static struct kszphy_hw_stat kszphy_hw_stats[] = {
237         { "phy_receive_errors", 21, 16},
238         { "phy_idle_errors", 10, 8 },
239 };
240
241 struct kszphy_type {
242         u32 led_mode_reg;
243         u16 interrupt_level_mask;
244         bool has_broadcast_disable;
245         bool has_nand_tree_disable;
246         bool has_rmii_ref_clk_sel;
247 };
248
249 /* Shared structure between the PHYs of the same package. */
250 struct lan8814_shared_priv {
251         struct phy_device *phydev;
252         struct ptp_clock *ptp_clock;
253         struct ptp_clock_info ptp_clock_info;
254
255         /* Reference counter to how many ports in the package are enabling the
256          * timestamping
257          */
258         u8 ref;
259
260         /* Lock for ptp_clock and ref */
261         struct mutex shared_lock;
262 };
263
264 struct lan8814_ptp_rx_ts {
265         struct list_head list;
266         u32 seconds;
267         u32 nsec;
268         u16 seq_id;
269 };
270
271 struct kszphy_latencies {
272         u16 rx_10;
273         u16 tx_10;
274         u16 rx_100;
275         u16 tx_100;
276         u16 rx_1000;
277         u16 tx_1000;
278 };
279
280 struct kszphy_ptp_priv {
281         struct mii_timestamper mii_ts;
282         struct phy_device *phydev;
283
284         struct sk_buff_head tx_queue;
285         struct sk_buff_head rx_queue;
286
287         struct list_head rx_ts_list;
288         /* Lock for Rx ts fifo */
289         spinlock_t rx_ts_lock;
290
291         int hwts_tx_type;
292         enum hwtstamp_rx_filters rx_filter;
293         int layer;
294         int version;
295 };
296
297 struct kszphy_priv {
298         struct kszphy_ptp_priv ptp_priv;
299         struct kszphy_latencies latencies;
300         const struct kszphy_type *type;
301         int led_mode;
302         bool rmii_ref_clk_sel;
303         bool rmii_ref_clk_sel_val;
304         u64 stats[ARRAY_SIZE(kszphy_hw_stats)];
305 };
306
307 static struct kszphy_latencies lan8814_latencies = {
308         .rx_10          = 0x22AA,
309         .tx_10          = 0x2E4A,
310         .rx_100         = 0x092A,
311         .tx_100         = 0x02C1,
312         .rx_1000        = 0x01AD,
313         .tx_1000        = 0x00C9,
314 };
315 static const struct kszphy_type ksz8021_type = {
316         .led_mode_reg           = MII_KSZPHY_CTRL_2,
317         .has_broadcast_disable  = true,
318         .has_nand_tree_disable  = true,
319         .has_rmii_ref_clk_sel   = true,
320 };
321
322 static const struct kszphy_type ksz8041_type = {
323         .led_mode_reg           = MII_KSZPHY_CTRL_1,
324 };
325
326 static const struct kszphy_type ksz8051_type = {
327         .led_mode_reg           = MII_KSZPHY_CTRL_2,
328         .has_nand_tree_disable  = true,
329 };
330
331 static const struct kszphy_type ksz8081_type = {
332         .led_mode_reg           = MII_KSZPHY_CTRL_2,
333         .has_broadcast_disable  = true,
334         .has_nand_tree_disable  = true,
335         .has_rmii_ref_clk_sel   = true,
336 };
337
338 static const struct kszphy_type ks8737_type = {
339         .interrupt_level_mask   = BIT(14),
340 };
341
342 static const struct kszphy_type ksz9021_type = {
343         .interrupt_level_mask   = BIT(14),
344 };
345
346 static int kszphy_extended_write(struct phy_device *phydev,
347                                 u32 regnum, u16 val)
348 {
349         phy_write(phydev, MII_KSZPHY_EXTREG, KSZPHY_EXTREG_WRITE | regnum);
350         return phy_write(phydev, MII_KSZPHY_EXTREG_WRITE, val);
351 }
352
353 static int kszphy_extended_read(struct phy_device *phydev,
354                                 u32 regnum)
355 {
356         phy_write(phydev, MII_KSZPHY_EXTREG, regnum);
357         return phy_read(phydev, MII_KSZPHY_EXTREG_READ);
358 }
359
360 static int kszphy_ack_interrupt(struct phy_device *phydev)
361 {
362         /* bit[7..0] int status, which is a read and clear register. */
363         int rc;
364
365         rc = phy_read(phydev, MII_KSZPHY_INTCS);
366
367         return (rc < 0) ? rc : 0;
368 }
369
370 static int kszphy_config_intr(struct phy_device *phydev)
371 {
372         const struct kszphy_type *type = phydev->drv->driver_data;
373         int temp, err;
374         u16 mask;
375
376         if (type && type->interrupt_level_mask)
377                 mask = type->interrupt_level_mask;
378         else
379                 mask = KSZPHY_CTRL_INT_ACTIVE_HIGH;
380
381         /* set the interrupt pin active low */
382         temp = phy_read(phydev, MII_KSZPHY_CTRL);
383         if (temp < 0)
384                 return temp;
385         temp &= ~mask;
386         phy_write(phydev, MII_KSZPHY_CTRL, temp);
387
388         /* enable / disable interrupts */
389         if (phydev->interrupts == PHY_INTERRUPT_ENABLED) {
390                 err = kszphy_ack_interrupt(phydev);
391                 if (err)
392                         return err;
393
394                 temp = KSZPHY_INTCS_ALL;
395                 err = phy_write(phydev, MII_KSZPHY_INTCS, temp);
396         } else {
397                 temp = 0;
398                 err = phy_write(phydev, MII_KSZPHY_INTCS, temp);
399                 if (err)
400                         return err;
401
402                 err = kszphy_ack_interrupt(phydev);
403         }
404
405         return err;
406 }
407
408 static irqreturn_t kszphy_handle_interrupt(struct phy_device *phydev)
409 {
410         int irq_status;
411
412         irq_status = phy_read(phydev, MII_KSZPHY_INTCS);
413         if (irq_status < 0) {
414                 phy_error(phydev);
415                 return IRQ_NONE;
416         }
417
418         if (!(irq_status & KSZPHY_INTCS_STATUS))
419                 return IRQ_NONE;
420
421         phy_trigger_machine(phydev);
422
423         return IRQ_HANDLED;
424 }
425
426 static int kszphy_rmii_clk_sel(struct phy_device *phydev, bool val)
427 {
428         int ctrl;
429
430         ctrl = phy_read(phydev, MII_KSZPHY_CTRL);
431         if (ctrl < 0)
432                 return ctrl;
433
434         if (val)
435                 ctrl |= KSZPHY_RMII_REF_CLK_SEL;
436         else
437                 ctrl &= ~KSZPHY_RMII_REF_CLK_SEL;
438
439         return phy_write(phydev, MII_KSZPHY_CTRL, ctrl);
440 }
441
442 static int kszphy_setup_led(struct phy_device *phydev, u32 reg, int val)
443 {
444         int rc, temp, shift;
445
446         switch (reg) {
447         case MII_KSZPHY_CTRL_1:
448                 shift = 14;
449                 break;
450         case MII_KSZPHY_CTRL_2:
451                 shift = 4;
452                 break;
453         default:
454                 return -EINVAL;
455         }
456
457         temp = phy_read(phydev, reg);
458         if (temp < 0) {
459                 rc = temp;
460                 goto out;
461         }
462
463         temp &= ~(3 << shift);
464         temp |= val << shift;
465         rc = phy_write(phydev, reg, temp);
466 out:
467         if (rc < 0)
468                 phydev_err(phydev, "failed to set led mode\n");
469
470         return rc;
471 }
472
473 /* Disable PHY address 0 as the broadcast address, so that it can be used as a
474  * unique (non-broadcast) address on a shared bus.
475  */
476 static int kszphy_broadcast_disable(struct phy_device *phydev)
477 {
478         int ret;
479
480         ret = phy_read(phydev, MII_KSZPHY_OMSO);
481         if (ret < 0)
482                 goto out;
483
484         ret = phy_write(phydev, MII_KSZPHY_OMSO, ret | KSZPHY_OMSO_B_CAST_OFF);
485 out:
486         if (ret)
487                 phydev_err(phydev, "failed to disable broadcast address\n");
488
489         return ret;
490 }
491
492 static int kszphy_nand_tree_disable(struct phy_device *phydev)
493 {
494         int ret;
495
496         ret = phy_read(phydev, MII_KSZPHY_OMSO);
497         if (ret < 0)
498                 goto out;
499
500         if (!(ret & KSZPHY_OMSO_NAND_TREE_ON))
501                 return 0;
502
503         ret = phy_write(phydev, MII_KSZPHY_OMSO,
504                         ret & ~KSZPHY_OMSO_NAND_TREE_ON);
505 out:
506         if (ret)
507                 phydev_err(phydev, "failed to disable NAND tree mode\n");
508
509         return ret;
510 }
511
512 /* Some config bits need to be set again on resume, handle them here. */
513 static int kszphy_config_reset(struct phy_device *phydev)
514 {
515         struct kszphy_priv *priv = phydev->priv;
516         int ret;
517
518         if (priv->rmii_ref_clk_sel) {
519                 ret = kszphy_rmii_clk_sel(phydev, priv->rmii_ref_clk_sel_val);
520                 if (ret) {
521                         phydev_err(phydev,
522                                    "failed to set rmii reference clock\n");
523                         return ret;
524                 }
525         }
526
527         if (priv->led_mode >= 0)
528                 kszphy_setup_led(phydev, priv->type->led_mode_reg, priv->led_mode);
529
530         return 0;
531 }
532
533 static int kszphy_config_init(struct phy_device *phydev)
534 {
535         struct kszphy_priv *priv = phydev->priv;
536         const struct kszphy_type *type;
537
538         if (!priv)
539                 return 0;
540
541         type = priv->type;
542
543         if (type->has_broadcast_disable)
544                 kszphy_broadcast_disable(phydev);
545
546         if (type->has_nand_tree_disable)
547                 kszphy_nand_tree_disable(phydev);
548
549         return kszphy_config_reset(phydev);
550 }
551
552 static int ksz8041_fiber_mode(struct phy_device *phydev)
553 {
554         struct device_node *of_node = phydev->mdio.dev.of_node;
555
556         return of_property_read_bool(of_node, "micrel,fiber-mode");
557 }
558
559 static int ksz8041_config_init(struct phy_device *phydev)
560 {
561         __ETHTOOL_DECLARE_LINK_MODE_MASK(mask) = { 0, };
562
563         /* Limit supported and advertised modes in fiber mode */
564         if (ksz8041_fiber_mode(phydev)) {
565                 phydev->dev_flags |= MICREL_PHY_FXEN;
566                 linkmode_set_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT, mask);
567                 linkmode_set_bit(ETHTOOL_LINK_MODE_100baseT_Half_BIT, mask);
568
569                 linkmode_and(phydev->supported, phydev->supported, mask);
570                 linkmode_set_bit(ETHTOOL_LINK_MODE_FIBRE_BIT,
571                                  phydev->supported);
572                 linkmode_and(phydev->advertising, phydev->advertising, mask);
573                 linkmode_set_bit(ETHTOOL_LINK_MODE_FIBRE_BIT,
574                                  phydev->advertising);
575                 phydev->autoneg = AUTONEG_DISABLE;
576         }
577
578         return kszphy_config_init(phydev);
579 }
580
581 static int ksz8041_config_aneg(struct phy_device *phydev)
582 {
583         /* Skip auto-negotiation in fiber mode */
584         if (phydev->dev_flags & MICREL_PHY_FXEN) {
585                 phydev->speed = SPEED_100;
586                 return 0;
587         }
588
589         return genphy_config_aneg(phydev);
590 }
591
592 static int ksz8051_ksz8795_match_phy_device(struct phy_device *phydev,
593                                             const bool ksz_8051)
594 {
595         int ret;
596
597         if ((phydev->phy_id & MICREL_PHY_ID_MASK) != PHY_ID_KSZ8051)
598                 return 0;
599
600         ret = phy_read(phydev, MII_BMSR);
601         if (ret < 0)
602                 return ret;
603
604         /* KSZ8051 PHY and KSZ8794/KSZ8795/KSZ8765 switch share the same
605          * exact PHY ID. However, they can be told apart by the extended
606          * capability registers presence. The KSZ8051 PHY has them while
607          * the switch does not.
608          */
609         ret &= BMSR_ERCAP;
610         if (ksz_8051)
611                 return ret;
612         else
613                 return !ret;
614 }
615
616 static int ksz8051_match_phy_device(struct phy_device *phydev)
617 {
618         return ksz8051_ksz8795_match_phy_device(phydev, true);
619 }
620
621 static int ksz8081_config_init(struct phy_device *phydev)
622 {
623         /* KSZPHY_OMSO_FACTORY_TEST is set at de-assertion of the reset line
624          * based on the RXER (KSZ8081RNA/RND) or TXC (KSZ8081MNX/RNB) pin. If a
625          * pull-down is missing, the factory test mode should be cleared by
626          * manually writing a 0.
627          */
628         phy_clear_bits(phydev, MII_KSZPHY_OMSO, KSZPHY_OMSO_FACTORY_TEST);
629
630         return kszphy_config_init(phydev);
631 }
632
633 static int ksz8081_config_mdix(struct phy_device *phydev, u8 ctrl)
634 {
635         u16 val;
636
637         switch (ctrl) {
638         case ETH_TP_MDI:
639                 val = KSZ8081_CTRL2_DISABLE_AUTO_MDIX;
640                 break;
641         case ETH_TP_MDI_X:
642                 val = KSZ8081_CTRL2_DISABLE_AUTO_MDIX |
643                         KSZ8081_CTRL2_MDI_MDI_X_SELECT;
644                 break;
645         case ETH_TP_MDI_AUTO:
646                 val = 0;
647                 break;
648         default:
649                 return 0;
650         }
651
652         return phy_modify(phydev, MII_KSZPHY_CTRL_2,
653                           KSZ8081_CTRL2_HP_MDIX |
654                           KSZ8081_CTRL2_MDI_MDI_X_SELECT |
655                           KSZ8081_CTRL2_DISABLE_AUTO_MDIX,
656                           KSZ8081_CTRL2_HP_MDIX | val);
657 }
658
659 static int ksz8081_config_aneg(struct phy_device *phydev)
660 {
661         int ret;
662
663         ret = genphy_config_aneg(phydev);
664         if (ret)
665                 return ret;
666
667         /* The MDI-X configuration is automatically changed by the PHY after
668          * switching from autoneg off to on. So, take MDI-X configuration under
669          * own control and set it after autoneg configuration was done.
670          */
671         return ksz8081_config_mdix(phydev, phydev->mdix_ctrl);
672 }
673
674 static int ksz8081_mdix_update(struct phy_device *phydev)
675 {
676         int ret;
677
678         ret = phy_read(phydev, MII_KSZPHY_CTRL_2);
679         if (ret < 0)
680                 return ret;
681
682         if (ret & KSZ8081_CTRL2_DISABLE_AUTO_MDIX) {
683                 if (ret & KSZ8081_CTRL2_MDI_MDI_X_SELECT)
684                         phydev->mdix_ctrl = ETH_TP_MDI_X;
685                 else
686                         phydev->mdix_ctrl = ETH_TP_MDI;
687         } else {
688                 phydev->mdix_ctrl = ETH_TP_MDI_AUTO;
689         }
690
691         ret = phy_read(phydev, MII_KSZPHY_CTRL_1);
692         if (ret < 0)
693                 return ret;
694
695         if (ret & KSZ8081_CTRL1_MDIX_STAT)
696                 phydev->mdix = ETH_TP_MDI;
697         else
698                 phydev->mdix = ETH_TP_MDI_X;
699
700         return 0;
701 }
702
703 static int ksz8081_read_status(struct phy_device *phydev)
704 {
705         int ret;
706
707         ret = ksz8081_mdix_update(phydev);
708         if (ret < 0)
709                 return ret;
710
711         return genphy_read_status(phydev);
712 }
713
714 static int ksz8061_config_init(struct phy_device *phydev)
715 {
716         int ret;
717
718         ret = phy_write_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_DEVID1, 0xB61A);
719         if (ret)
720                 return ret;
721
722         return kszphy_config_init(phydev);
723 }
724
725 static int ksz8795_match_phy_device(struct phy_device *phydev)
726 {
727         return ksz8051_ksz8795_match_phy_device(phydev, false);
728 }
729
730 static int ksz9021_load_values_from_of(struct phy_device *phydev,
731                                        const struct device_node *of_node,
732                                        u16 reg,
733                                        const char *field1, const char *field2,
734                                        const char *field3, const char *field4)
735 {
736         int val1 = -1;
737         int val2 = -2;
738         int val3 = -3;
739         int val4 = -4;
740         int newval;
741         int matches = 0;
742
743         if (!of_property_read_u32(of_node, field1, &val1))
744                 matches++;
745
746         if (!of_property_read_u32(of_node, field2, &val2))
747                 matches++;
748
749         if (!of_property_read_u32(of_node, field3, &val3))
750                 matches++;
751
752         if (!of_property_read_u32(of_node, field4, &val4))
753                 matches++;
754
755         if (!matches)
756                 return 0;
757
758         if (matches < 4)
759                 newval = kszphy_extended_read(phydev, reg);
760         else
761                 newval = 0;
762
763         if (val1 != -1)
764                 newval = ((newval & 0xfff0) | ((val1 / PS_TO_REG) & 0xf) << 0);
765
766         if (val2 != -2)
767                 newval = ((newval & 0xff0f) | ((val2 / PS_TO_REG) & 0xf) << 4);
768
769         if (val3 != -3)
770                 newval = ((newval & 0xf0ff) | ((val3 / PS_TO_REG) & 0xf) << 8);
771
772         if (val4 != -4)
773                 newval = ((newval & 0x0fff) | ((val4 / PS_TO_REG) & 0xf) << 12);
774
775         return kszphy_extended_write(phydev, reg, newval);
776 }
777
778 static int ksz9021_config_init(struct phy_device *phydev)
779 {
780         const struct device_node *of_node;
781         const struct device *dev_walker;
782
783         /* The Micrel driver has a deprecated option to place phy OF
784          * properties in the MAC node. Walk up the tree of devices to
785          * find a device with an OF node.
786          */
787         dev_walker = &phydev->mdio.dev;
788         do {
789                 of_node = dev_walker->of_node;
790                 dev_walker = dev_walker->parent;
791
792         } while (!of_node && dev_walker);
793
794         if (of_node) {
795                 ksz9021_load_values_from_of(phydev, of_node,
796                                     MII_KSZPHY_CLK_CONTROL_PAD_SKEW,
797                                     "txen-skew-ps", "txc-skew-ps",
798                                     "rxdv-skew-ps", "rxc-skew-ps");
799                 ksz9021_load_values_from_of(phydev, of_node,
800                                     MII_KSZPHY_RX_DATA_PAD_SKEW,
801                                     "rxd0-skew-ps", "rxd1-skew-ps",
802                                     "rxd2-skew-ps", "rxd3-skew-ps");
803                 ksz9021_load_values_from_of(phydev, of_node,
804                                     MII_KSZPHY_TX_DATA_PAD_SKEW,
805                                     "txd0-skew-ps", "txd1-skew-ps",
806                                     "txd2-skew-ps", "txd3-skew-ps");
807         }
808         return 0;
809 }
810
811 #define KSZ9031_PS_TO_REG               60
812
813 /* Extended registers */
814 /* MMD Address 0x0 */
815 #define MII_KSZ9031RN_FLP_BURST_TX_LO   3
816 #define MII_KSZ9031RN_FLP_BURST_TX_HI   4
817
818 /* MMD Address 0x2 */
819 #define MII_KSZ9031RN_CONTROL_PAD_SKEW  4
820 #define MII_KSZ9031RN_RX_CTL_M          GENMASK(7, 4)
821 #define MII_KSZ9031RN_TX_CTL_M          GENMASK(3, 0)
822
823 #define MII_KSZ9031RN_RX_DATA_PAD_SKEW  5
824 #define MII_KSZ9031RN_RXD3              GENMASK(15, 12)
825 #define MII_KSZ9031RN_RXD2              GENMASK(11, 8)
826 #define MII_KSZ9031RN_RXD1              GENMASK(7, 4)
827 #define MII_KSZ9031RN_RXD0              GENMASK(3, 0)
828
829 #define MII_KSZ9031RN_TX_DATA_PAD_SKEW  6
830 #define MII_KSZ9031RN_TXD3              GENMASK(15, 12)
831 #define MII_KSZ9031RN_TXD2              GENMASK(11, 8)
832 #define MII_KSZ9031RN_TXD1              GENMASK(7, 4)
833 #define MII_KSZ9031RN_TXD0              GENMASK(3, 0)
834
835 #define MII_KSZ9031RN_CLK_PAD_SKEW      8
836 #define MII_KSZ9031RN_GTX_CLK           GENMASK(9, 5)
837 #define MII_KSZ9031RN_RX_CLK            GENMASK(4, 0)
838
839 /* KSZ9031 has internal RGMII_IDRX = 1.2ns and RGMII_IDTX = 0ns. To
840  * provide different RGMII options we need to configure delay offset
841  * for each pad relative to build in delay.
842  */
843 /* keep rx as "No delay adjustment" and set rx_clk to +0.60ns to get delays of
844  * 1.80ns
845  */
846 #define RX_ID                           0x7
847 #define RX_CLK_ID                       0x19
848
849 /* set rx to +0.30ns and rx_clk to -0.90ns to compensate the
850  * internal 1.2ns delay.
851  */
852 #define RX_ND                           0xc
853 #define RX_CLK_ND                       0x0
854
855 /* set tx to -0.42ns and tx_clk to +0.96ns to get 1.38ns delay */
856 #define TX_ID                           0x0
857 #define TX_CLK_ID                       0x1f
858
859 /* set tx and tx_clk to "No delay adjustment" to keep 0ns
860  * dealy
861  */
862 #define TX_ND                           0x7
863 #define TX_CLK_ND                       0xf
864
865 /* MMD Address 0x1C */
866 #define MII_KSZ9031RN_EDPD              0x23
867 #define MII_KSZ9031RN_EDPD_ENABLE       BIT(0)
868
869 static int ksz9031_of_load_skew_values(struct phy_device *phydev,
870                                        const struct device_node *of_node,
871                                        u16 reg, size_t field_sz,
872                                        const char *field[], u8 numfields,
873                                        bool *update)
874 {
875         int val[4] = {-1, -2, -3, -4};
876         int matches = 0;
877         u16 mask;
878         u16 maxval;
879         u16 newval;
880         int i;
881
882         for (i = 0; i < numfields; i++)
883                 if (!of_property_read_u32(of_node, field[i], val + i))
884                         matches++;
885
886         if (!matches)
887                 return 0;
888
889         *update |= true;
890
891         if (matches < numfields)
892                 newval = phy_read_mmd(phydev, 2, reg);
893         else
894                 newval = 0;
895
896         maxval = (field_sz == 4) ? 0xf : 0x1f;
897         for (i = 0; i < numfields; i++)
898                 if (val[i] != -(i + 1)) {
899                         mask = 0xffff;
900                         mask ^= maxval << (field_sz * i);
901                         newval = (newval & mask) |
902                                 (((val[i] / KSZ9031_PS_TO_REG) & maxval)
903                                         << (field_sz * i));
904                 }
905
906         return phy_write_mmd(phydev, 2, reg, newval);
907 }
908
909 /* Center KSZ9031RNX FLP timing at 16ms. */
910 static int ksz9031_center_flp_timing(struct phy_device *phydev)
911 {
912         int result;
913
914         result = phy_write_mmd(phydev, 0, MII_KSZ9031RN_FLP_BURST_TX_HI,
915                                0x0006);
916         if (result)
917                 return result;
918
919         result = phy_write_mmd(phydev, 0, MII_KSZ9031RN_FLP_BURST_TX_LO,
920                                0x1A80);
921         if (result)
922                 return result;
923
924         return genphy_restart_aneg(phydev);
925 }
926
927 /* Enable energy-detect power-down mode */
928 static int ksz9031_enable_edpd(struct phy_device *phydev)
929 {
930         int reg;
931
932         reg = phy_read_mmd(phydev, 0x1C, MII_KSZ9031RN_EDPD);
933         if (reg < 0)
934                 return reg;
935         return phy_write_mmd(phydev, 0x1C, MII_KSZ9031RN_EDPD,
936                              reg | MII_KSZ9031RN_EDPD_ENABLE);
937 }
938
939 static int ksz9031_config_rgmii_delay(struct phy_device *phydev)
940 {
941         u16 rx, tx, rx_clk, tx_clk;
942         int ret;
943
944         switch (phydev->interface) {
945         case PHY_INTERFACE_MODE_RGMII:
946                 tx = TX_ND;
947                 tx_clk = TX_CLK_ND;
948                 rx = RX_ND;
949                 rx_clk = RX_CLK_ND;
950                 break;
951         case PHY_INTERFACE_MODE_RGMII_ID:
952                 tx = TX_ID;
953                 tx_clk = TX_CLK_ID;
954                 rx = RX_ID;
955                 rx_clk = RX_CLK_ID;
956                 break;
957         case PHY_INTERFACE_MODE_RGMII_RXID:
958                 tx = TX_ND;
959                 tx_clk = TX_CLK_ND;
960                 rx = RX_ID;
961                 rx_clk = RX_CLK_ID;
962                 break;
963         case PHY_INTERFACE_MODE_RGMII_TXID:
964                 tx = TX_ID;
965                 tx_clk = TX_CLK_ID;
966                 rx = RX_ND;
967                 rx_clk = RX_CLK_ND;
968                 break;
969         default:
970                 return 0;
971         }
972
973         ret = phy_write_mmd(phydev, 2, MII_KSZ9031RN_CONTROL_PAD_SKEW,
974                             FIELD_PREP(MII_KSZ9031RN_RX_CTL_M, rx) |
975                             FIELD_PREP(MII_KSZ9031RN_TX_CTL_M, tx));
976         if (ret < 0)
977                 return ret;
978
979         ret = phy_write_mmd(phydev, 2, MII_KSZ9031RN_RX_DATA_PAD_SKEW,
980                             FIELD_PREP(MII_KSZ9031RN_RXD3, rx) |
981                             FIELD_PREP(MII_KSZ9031RN_RXD2, rx) |
982                             FIELD_PREP(MII_KSZ9031RN_RXD1, rx) |
983                             FIELD_PREP(MII_KSZ9031RN_RXD0, rx));
984         if (ret < 0)
985                 return ret;
986
987         ret = phy_write_mmd(phydev, 2, MII_KSZ9031RN_TX_DATA_PAD_SKEW,
988                             FIELD_PREP(MII_KSZ9031RN_TXD3, tx) |
989                             FIELD_PREP(MII_KSZ9031RN_TXD2, tx) |
990                             FIELD_PREP(MII_KSZ9031RN_TXD1, tx) |
991                             FIELD_PREP(MII_KSZ9031RN_TXD0, tx));
992         if (ret < 0)
993                 return ret;
994
995         return phy_write_mmd(phydev, 2, MII_KSZ9031RN_CLK_PAD_SKEW,
996                              FIELD_PREP(MII_KSZ9031RN_GTX_CLK, tx_clk) |
997                              FIELD_PREP(MII_KSZ9031RN_RX_CLK, rx_clk));
998 }
999
1000 static int ksz9031_config_init(struct phy_device *phydev)
1001 {
1002         const struct device_node *of_node;
1003         static const char *clk_skews[2] = {"rxc-skew-ps", "txc-skew-ps"};
1004         static const char *rx_data_skews[4] = {
1005                 "rxd0-skew-ps", "rxd1-skew-ps",
1006                 "rxd2-skew-ps", "rxd3-skew-ps"
1007         };
1008         static const char *tx_data_skews[4] = {
1009                 "txd0-skew-ps", "txd1-skew-ps",
1010                 "txd2-skew-ps", "txd3-skew-ps"
1011         };
1012         static const char *control_skews[2] = {"txen-skew-ps", "rxdv-skew-ps"};
1013         const struct device *dev_walker;
1014         int result;
1015
1016         result = ksz9031_enable_edpd(phydev);
1017         if (result < 0)
1018                 return result;
1019
1020         /* The Micrel driver has a deprecated option to place phy OF
1021          * properties in the MAC node. Walk up the tree of devices to
1022          * find a device with an OF node.
1023          */
1024         dev_walker = &phydev->mdio.dev;
1025         do {
1026                 of_node = dev_walker->of_node;
1027                 dev_walker = dev_walker->parent;
1028         } while (!of_node && dev_walker);
1029
1030         if (of_node) {
1031                 bool update = false;
1032
1033                 if (phy_interface_is_rgmii(phydev)) {
1034                         result = ksz9031_config_rgmii_delay(phydev);
1035                         if (result < 0)
1036                                 return result;
1037                 }
1038
1039                 ksz9031_of_load_skew_values(phydev, of_node,
1040                                 MII_KSZ9031RN_CLK_PAD_SKEW, 5,
1041                                 clk_skews, 2, &update);
1042
1043                 ksz9031_of_load_skew_values(phydev, of_node,
1044                                 MII_KSZ9031RN_CONTROL_PAD_SKEW, 4,
1045                                 control_skews, 2, &update);
1046
1047                 ksz9031_of_load_skew_values(phydev, of_node,
1048                                 MII_KSZ9031RN_RX_DATA_PAD_SKEW, 4,
1049                                 rx_data_skews, 4, &update);
1050
1051                 ksz9031_of_load_skew_values(phydev, of_node,
1052                                 MII_KSZ9031RN_TX_DATA_PAD_SKEW, 4,
1053                                 tx_data_skews, 4, &update);
1054
1055                 if (update && !phy_interface_is_rgmii(phydev))
1056                         phydev_warn(phydev,
1057                                     "*-skew-ps values should be used only with RGMII PHY modes\n");
1058
1059                 /* Silicon Errata Sheet (DS80000691D or DS80000692D):
1060                  * When the device links in the 1000BASE-T slave mode only,
1061                  * the optional 125MHz reference output clock (CLK125_NDO)
1062                  * has wide duty cycle variation.
1063                  *
1064                  * The optional CLK125_NDO clock does not meet the RGMII
1065                  * 45/55 percent (min/max) duty cycle requirement and therefore
1066                  * cannot be used directly by the MAC side for clocking
1067                  * applications that have setup/hold time requirements on
1068                  * rising and falling clock edges.
1069                  *
1070                  * Workaround:
1071                  * Force the phy to be the master to receive a stable clock
1072                  * which meets the duty cycle requirement.
1073                  */
1074                 if (of_property_read_bool(of_node, "micrel,force-master")) {
1075                         result = phy_read(phydev, MII_CTRL1000);
1076                         if (result < 0)
1077                                 goto err_force_master;
1078
1079                         /* enable master mode, config & prefer master */
1080                         result |= CTL1000_ENABLE_MASTER | CTL1000_AS_MASTER;
1081                         result = phy_write(phydev, MII_CTRL1000, result);
1082                         if (result < 0)
1083                                 goto err_force_master;
1084                 }
1085         }
1086
1087         return ksz9031_center_flp_timing(phydev);
1088
1089 err_force_master:
1090         phydev_err(phydev, "failed to force the phy to master mode\n");
1091         return result;
1092 }
1093
1094 #define KSZ9131_SKEW_5BIT_MAX   2400
1095 #define KSZ9131_SKEW_4BIT_MAX   800
1096 #define KSZ9131_OFFSET          700
1097 #define KSZ9131_STEP            100
1098
1099 static int ksz9131_of_load_skew_values(struct phy_device *phydev,
1100                                        struct device_node *of_node,
1101                                        u16 reg, size_t field_sz,
1102                                        char *field[], u8 numfields)
1103 {
1104         int val[4] = {-(1 + KSZ9131_OFFSET), -(2 + KSZ9131_OFFSET),
1105                       -(3 + KSZ9131_OFFSET), -(4 + KSZ9131_OFFSET)};
1106         int skewval, skewmax = 0;
1107         int matches = 0;
1108         u16 maxval;
1109         u16 newval;
1110         u16 mask;
1111         int i;
1112
1113         /* psec properties in dts should mean x pico seconds */
1114         if (field_sz == 5)
1115                 skewmax = KSZ9131_SKEW_5BIT_MAX;
1116         else
1117                 skewmax = KSZ9131_SKEW_4BIT_MAX;
1118
1119         for (i = 0; i < numfields; i++)
1120                 if (!of_property_read_s32(of_node, field[i], &skewval)) {
1121                         if (skewval < -KSZ9131_OFFSET)
1122                                 skewval = -KSZ9131_OFFSET;
1123                         else if (skewval > skewmax)
1124                                 skewval = skewmax;
1125
1126                         val[i] = skewval + KSZ9131_OFFSET;
1127                         matches++;
1128                 }
1129
1130         if (!matches)
1131                 return 0;
1132
1133         if (matches < numfields)
1134                 newval = phy_read_mmd(phydev, 2, reg);
1135         else
1136                 newval = 0;
1137
1138         maxval = (field_sz == 4) ? 0xf : 0x1f;
1139         for (i = 0; i < numfields; i++)
1140                 if (val[i] != -(i + 1 + KSZ9131_OFFSET)) {
1141                         mask = 0xffff;
1142                         mask ^= maxval << (field_sz * i);
1143                         newval = (newval & mask) |
1144                                 (((val[i] / KSZ9131_STEP) & maxval)
1145                                         << (field_sz * i));
1146                 }
1147
1148         return phy_write_mmd(phydev, 2, reg, newval);
1149 }
1150
1151 #define KSZ9131RN_MMD_COMMON_CTRL_REG   2
1152 #define KSZ9131RN_RXC_DLL_CTRL          76
1153 #define KSZ9131RN_TXC_DLL_CTRL          77
1154 #define KSZ9131RN_DLL_CTRL_BYPASS       BIT_MASK(12)
1155 #define KSZ9131RN_DLL_ENABLE_DELAY      0
1156 #define KSZ9131RN_DLL_DISABLE_DELAY     BIT(12)
1157
1158 static int ksz9131_config_rgmii_delay(struct phy_device *phydev)
1159 {
1160         u16 rxcdll_val, txcdll_val;
1161         int ret;
1162
1163         switch (phydev->interface) {
1164         case PHY_INTERFACE_MODE_RGMII:
1165                 rxcdll_val = KSZ9131RN_DLL_DISABLE_DELAY;
1166                 txcdll_val = KSZ9131RN_DLL_DISABLE_DELAY;
1167                 break;
1168         case PHY_INTERFACE_MODE_RGMII_ID:
1169                 rxcdll_val = KSZ9131RN_DLL_ENABLE_DELAY;
1170                 txcdll_val = KSZ9131RN_DLL_ENABLE_DELAY;
1171                 break;
1172         case PHY_INTERFACE_MODE_RGMII_RXID:
1173                 rxcdll_val = KSZ9131RN_DLL_ENABLE_DELAY;
1174                 txcdll_val = KSZ9131RN_DLL_DISABLE_DELAY;
1175                 break;
1176         case PHY_INTERFACE_MODE_RGMII_TXID:
1177                 rxcdll_val = KSZ9131RN_DLL_DISABLE_DELAY;
1178                 txcdll_val = KSZ9131RN_DLL_ENABLE_DELAY;
1179                 break;
1180         default:
1181                 return 0;
1182         }
1183
1184         ret = phy_modify_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG,
1185                              KSZ9131RN_RXC_DLL_CTRL, KSZ9131RN_DLL_CTRL_BYPASS,
1186                              rxcdll_val);
1187         if (ret < 0)
1188                 return ret;
1189
1190         return phy_modify_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG,
1191                               KSZ9131RN_TXC_DLL_CTRL, KSZ9131RN_DLL_CTRL_BYPASS,
1192                               txcdll_val);
1193 }
1194
1195 /* Silicon Errata DS80000693B
1196  *
1197  * When LEDs are configured in Individual Mode, LED1 is ON in a no-link
1198  * condition. Workaround is to set register 0x1e, bit 9, this way LED1 behaves
1199  * according to the datasheet (off if there is no link).
1200  */
1201 static int ksz9131_led_errata(struct phy_device *phydev)
1202 {
1203         int reg;
1204
1205         reg = phy_read_mmd(phydev, 2, 0);
1206         if (reg < 0)
1207                 return reg;
1208
1209         if (!(reg & BIT(4)))
1210                 return 0;
1211
1212         return phy_set_bits(phydev, 0x1e, BIT(9));
1213 }
1214
1215 static int ksz9131_config_init(struct phy_device *phydev)
1216 {
1217         struct device_node *of_node;
1218         char *clk_skews[2] = {"rxc-skew-psec", "txc-skew-psec"};
1219         char *rx_data_skews[4] = {
1220                 "rxd0-skew-psec", "rxd1-skew-psec",
1221                 "rxd2-skew-psec", "rxd3-skew-psec"
1222         };
1223         char *tx_data_skews[4] = {
1224                 "txd0-skew-psec", "txd1-skew-psec",
1225                 "txd2-skew-psec", "txd3-skew-psec"
1226         };
1227         char *control_skews[2] = {"txen-skew-psec", "rxdv-skew-psec"};
1228         const struct device *dev_walker;
1229         int ret;
1230
1231         dev_walker = &phydev->mdio.dev;
1232         do {
1233                 of_node = dev_walker->of_node;
1234                 dev_walker = dev_walker->parent;
1235         } while (!of_node && dev_walker);
1236
1237         if (!of_node)
1238                 return 0;
1239
1240         if (phy_interface_is_rgmii(phydev)) {
1241                 ret = ksz9131_config_rgmii_delay(phydev);
1242                 if (ret < 0)
1243                         return ret;
1244         }
1245
1246         ret = ksz9131_of_load_skew_values(phydev, of_node,
1247                                           MII_KSZ9031RN_CLK_PAD_SKEW, 5,
1248                                           clk_skews, 2);
1249         if (ret < 0)
1250                 return ret;
1251
1252         ret = ksz9131_of_load_skew_values(phydev, of_node,
1253                                           MII_KSZ9031RN_CONTROL_PAD_SKEW, 4,
1254                                           control_skews, 2);
1255         if (ret < 0)
1256                 return ret;
1257
1258         ret = ksz9131_of_load_skew_values(phydev, of_node,
1259                                           MII_KSZ9031RN_RX_DATA_PAD_SKEW, 4,
1260                                           rx_data_skews, 4);
1261         if (ret < 0)
1262                 return ret;
1263
1264         ret = ksz9131_of_load_skew_values(phydev, of_node,
1265                                           MII_KSZ9031RN_TX_DATA_PAD_SKEW, 4,
1266                                           tx_data_skews, 4);
1267         if (ret < 0)
1268                 return ret;
1269
1270         ret = ksz9131_led_errata(phydev);
1271         if (ret < 0)
1272                 return ret;
1273
1274         return 0;
1275 }
1276
1277 #define KSZ8873MLL_GLOBAL_CONTROL_4     0x06
1278 #define KSZ8873MLL_GLOBAL_CONTROL_4_DUPLEX      BIT(6)
1279 #define KSZ8873MLL_GLOBAL_CONTROL_4_SPEED       BIT(4)
1280 static int ksz8873mll_read_status(struct phy_device *phydev)
1281 {
1282         int regval;
1283
1284         /* dummy read */
1285         regval = phy_read(phydev, KSZ8873MLL_GLOBAL_CONTROL_4);
1286
1287         regval = phy_read(phydev, KSZ8873MLL_GLOBAL_CONTROL_4);
1288
1289         if (regval & KSZ8873MLL_GLOBAL_CONTROL_4_DUPLEX)
1290                 phydev->duplex = DUPLEX_HALF;
1291         else
1292                 phydev->duplex = DUPLEX_FULL;
1293
1294         if (regval & KSZ8873MLL_GLOBAL_CONTROL_4_SPEED)
1295                 phydev->speed = SPEED_10;
1296         else
1297                 phydev->speed = SPEED_100;
1298
1299         phydev->link = 1;
1300         phydev->pause = phydev->asym_pause = 0;
1301
1302         return 0;
1303 }
1304
1305 static int ksz9031_get_features(struct phy_device *phydev)
1306 {
1307         int ret;
1308
1309         ret = genphy_read_abilities(phydev);
1310         if (ret < 0)
1311                 return ret;
1312
1313         /* Silicon Errata Sheet (DS80000691D or DS80000692D):
1314          * Whenever the device's Asymmetric Pause capability is set to 1,
1315          * link-up may fail after a link-up to link-down transition.
1316          *
1317          * The Errata Sheet is for ksz9031, but ksz9021 has the same issue
1318          *
1319          * Workaround:
1320          * Do not enable the Asymmetric Pause capability bit.
1321          */
1322         linkmode_clear_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, phydev->supported);
1323
1324         /* We force setting the Pause capability as the core will force the
1325          * Asymmetric Pause capability to 1 otherwise.
1326          */
1327         linkmode_set_bit(ETHTOOL_LINK_MODE_Pause_BIT, phydev->supported);
1328
1329         return 0;
1330 }
1331
1332 static int ksz9031_read_status(struct phy_device *phydev)
1333 {
1334         int err;
1335         int regval;
1336
1337         err = genphy_read_status(phydev);
1338         if (err)
1339                 return err;
1340
1341         /* Make sure the PHY is not broken. Read idle error count,
1342          * and reset the PHY if it is maxed out.
1343          */
1344         regval = phy_read(phydev, MII_STAT1000);
1345         if ((regval & 0xFF) == 0xFF) {
1346                 phy_init_hw(phydev);
1347                 phydev->link = 0;
1348                 if (phydev->drv->config_intr && phy_interrupt_is_valid(phydev))
1349                         phydev->drv->config_intr(phydev);
1350                 return genphy_config_aneg(phydev);
1351         }
1352
1353         return 0;
1354 }
1355
1356 static int ksz8873mll_config_aneg(struct phy_device *phydev)
1357 {
1358         return 0;
1359 }
1360
1361 static int ksz886x_config_mdix(struct phy_device *phydev, u8 ctrl)
1362 {
1363         u16 val;
1364
1365         switch (ctrl) {
1366         case ETH_TP_MDI:
1367                 val = KSZ886X_BMCR_DISABLE_AUTO_MDIX;
1368                 break;
1369         case ETH_TP_MDI_X:
1370                 /* Note: The naming of the bit KSZ886X_BMCR_FORCE_MDI is bit
1371                  * counter intuitive, the "-X" in "1 = Force MDI" in the data
1372                  * sheet seems to be missing:
1373                  * 1 = Force MDI (sic!) (transmit on RX+/RX- pins)
1374                  * 0 = Normal operation (transmit on TX+/TX- pins)
1375                  */
1376                 val = KSZ886X_BMCR_DISABLE_AUTO_MDIX | KSZ886X_BMCR_FORCE_MDI;
1377                 break;
1378         case ETH_TP_MDI_AUTO:
1379                 val = 0;
1380                 break;
1381         default:
1382                 return 0;
1383         }
1384
1385         return phy_modify(phydev, MII_BMCR,
1386                           KSZ886X_BMCR_HP_MDIX | KSZ886X_BMCR_FORCE_MDI |
1387                           KSZ886X_BMCR_DISABLE_AUTO_MDIX,
1388                           KSZ886X_BMCR_HP_MDIX | val);
1389 }
1390
1391 static int ksz886x_config_aneg(struct phy_device *phydev)
1392 {
1393         int ret;
1394
1395         ret = genphy_config_aneg(phydev);
1396         if (ret)
1397                 return ret;
1398
1399         /* The MDI-X configuration is automatically changed by the PHY after
1400          * switching from autoneg off to on. So, take MDI-X configuration under
1401          * own control and set it after autoneg configuration was done.
1402          */
1403         return ksz886x_config_mdix(phydev, phydev->mdix_ctrl);
1404 }
1405
1406 static int ksz886x_mdix_update(struct phy_device *phydev)
1407 {
1408         int ret;
1409
1410         ret = phy_read(phydev, MII_BMCR);
1411         if (ret < 0)
1412                 return ret;
1413
1414         if (ret & KSZ886X_BMCR_DISABLE_AUTO_MDIX) {
1415                 if (ret & KSZ886X_BMCR_FORCE_MDI)
1416                         phydev->mdix_ctrl = ETH_TP_MDI_X;
1417                 else
1418                         phydev->mdix_ctrl = ETH_TP_MDI;
1419         } else {
1420                 phydev->mdix_ctrl = ETH_TP_MDI_AUTO;
1421         }
1422
1423         ret = phy_read(phydev, MII_KSZPHY_CTRL);
1424         if (ret < 0)
1425                 return ret;
1426
1427         /* Same reverse logic as KSZ886X_BMCR_FORCE_MDI */
1428         if (ret & KSZ886X_CTRL_MDIX_STAT)
1429                 phydev->mdix = ETH_TP_MDI_X;
1430         else
1431                 phydev->mdix = ETH_TP_MDI;
1432
1433         return 0;
1434 }
1435
1436 static int ksz886x_read_status(struct phy_device *phydev)
1437 {
1438         int ret;
1439
1440         ret = ksz886x_mdix_update(phydev);
1441         if (ret < 0)
1442                 return ret;
1443
1444         return genphy_read_status(phydev);
1445 }
1446
1447 static int kszphy_get_sset_count(struct phy_device *phydev)
1448 {
1449         return ARRAY_SIZE(kszphy_hw_stats);
1450 }
1451
1452 static void kszphy_get_strings(struct phy_device *phydev, u8 *data)
1453 {
1454         int i;
1455
1456         for (i = 0; i < ARRAY_SIZE(kszphy_hw_stats); i++) {
1457                 strlcpy(data + i * ETH_GSTRING_LEN,
1458                         kszphy_hw_stats[i].string, ETH_GSTRING_LEN);
1459         }
1460 }
1461
1462 static u64 kszphy_get_stat(struct phy_device *phydev, int i)
1463 {
1464         struct kszphy_hw_stat stat = kszphy_hw_stats[i];
1465         struct kszphy_priv *priv = phydev->priv;
1466         int val;
1467         u64 ret;
1468
1469         val = phy_read(phydev, stat.reg);
1470         if (val < 0) {
1471                 ret = U64_MAX;
1472         } else {
1473                 val = val & ((1 << stat.bits) - 1);
1474                 priv->stats[i] += val;
1475                 ret = priv->stats[i];
1476         }
1477
1478         return ret;
1479 }
1480
1481 static void kszphy_get_stats(struct phy_device *phydev,
1482                              struct ethtool_stats *stats, u64 *data)
1483 {
1484         int i;
1485
1486         for (i = 0; i < ARRAY_SIZE(kszphy_hw_stats); i++)
1487                 data[i] = kszphy_get_stat(phydev, i);
1488 }
1489
1490 static int kszphy_suspend(struct phy_device *phydev)
1491 {
1492         /* Disable PHY Interrupts */
1493         if (phy_interrupt_is_valid(phydev)) {
1494                 phydev->interrupts = PHY_INTERRUPT_DISABLED;
1495                 if (phydev->drv->config_intr)
1496                         phydev->drv->config_intr(phydev);
1497         }
1498
1499         return genphy_suspend(phydev);
1500 }
1501
1502 static int kszphy_resume(struct phy_device *phydev)
1503 {
1504         int ret;
1505
1506         genphy_resume(phydev);
1507
1508         /* After switching from power-down to normal mode, an internal global
1509          * reset is automatically generated. Wait a minimum of 1 ms before
1510          * read/write access to the PHY registers.
1511          */
1512         usleep_range(1000, 2000);
1513
1514         ret = kszphy_config_reset(phydev);
1515         if (ret)
1516                 return ret;
1517
1518         /* Enable PHY Interrupts */
1519         if (phy_interrupt_is_valid(phydev)) {
1520                 phydev->interrupts = PHY_INTERRUPT_ENABLED;
1521                 if (phydev->drv->config_intr)
1522                         phydev->drv->config_intr(phydev);
1523         }
1524
1525         return 0;
1526 }
1527
1528 static int kszphy_probe(struct phy_device *phydev)
1529 {
1530         const struct kszphy_type *type = phydev->drv->driver_data;
1531         const struct device_node *np = phydev->mdio.dev.of_node;
1532         struct kszphy_priv *priv;
1533         struct clk *clk;
1534         int ret;
1535
1536         priv = devm_kzalloc(&phydev->mdio.dev, sizeof(*priv), GFP_KERNEL);
1537         if (!priv)
1538                 return -ENOMEM;
1539
1540         phydev->priv = priv;
1541
1542         priv->type = type;
1543
1544         if (type->led_mode_reg) {
1545                 ret = of_property_read_u32(np, "micrel,led-mode",
1546                                 &priv->led_mode);
1547                 if (ret)
1548                         priv->led_mode = -1;
1549
1550                 if (priv->led_mode > 3) {
1551                         phydev_err(phydev, "invalid led mode: 0x%02x\n",
1552                                    priv->led_mode);
1553                         priv->led_mode = -1;
1554                 }
1555         } else {
1556                 priv->led_mode = -1;
1557         }
1558
1559         clk = devm_clk_get(&phydev->mdio.dev, "rmii-ref");
1560         /* NOTE: clk may be NULL if building without CONFIG_HAVE_CLK */
1561         if (!IS_ERR_OR_NULL(clk)) {
1562                 unsigned long rate = clk_get_rate(clk);
1563                 bool rmii_ref_clk_sel_25_mhz;
1564
1565                 priv->rmii_ref_clk_sel = type->has_rmii_ref_clk_sel;
1566                 rmii_ref_clk_sel_25_mhz = of_property_read_bool(np,
1567                                 "micrel,rmii-reference-clock-select-25-mhz");
1568
1569                 if (rate > 24500000 && rate < 25500000) {
1570                         priv->rmii_ref_clk_sel_val = rmii_ref_clk_sel_25_mhz;
1571                 } else if (rate > 49500000 && rate < 50500000) {
1572                         priv->rmii_ref_clk_sel_val = !rmii_ref_clk_sel_25_mhz;
1573                 } else {
1574                         phydev_err(phydev, "Clock rate out of range: %ld\n",
1575                                    rate);
1576                         return -EINVAL;
1577                 }
1578         }
1579
1580         if (ksz8041_fiber_mode(phydev))
1581                 phydev->port = PORT_FIBRE;
1582
1583         /* Support legacy board-file configuration */
1584         if (phydev->dev_flags & MICREL_PHY_50MHZ_CLK) {
1585                 priv->rmii_ref_clk_sel = true;
1586                 priv->rmii_ref_clk_sel_val = true;
1587         }
1588
1589         return 0;
1590 }
1591
1592 static int ksz886x_cable_test_start(struct phy_device *phydev)
1593 {
1594         if (phydev->dev_flags & MICREL_KSZ8_P1_ERRATA)
1595                 return -EOPNOTSUPP;
1596
1597         /* If autoneg is enabled, we won't be able to test cross pair
1598          * short. In this case, the PHY will "detect" a link and
1599          * confuse the internal state machine - disable auto neg here.
1600          * If autoneg is disabled, we should set the speed to 10mbit.
1601          */
1602         return phy_clear_bits(phydev, MII_BMCR, BMCR_ANENABLE | BMCR_SPEED100);
1603 }
1604
1605 static int ksz886x_cable_test_result_trans(u16 status)
1606 {
1607         switch (FIELD_GET(KSZ8081_LMD_STAT_MASK, status)) {
1608         case KSZ8081_LMD_STAT_NORMAL:
1609                 return ETHTOOL_A_CABLE_RESULT_CODE_OK;
1610         case KSZ8081_LMD_STAT_SHORT:
1611                 return ETHTOOL_A_CABLE_RESULT_CODE_SAME_SHORT;
1612         case KSZ8081_LMD_STAT_OPEN:
1613                 return ETHTOOL_A_CABLE_RESULT_CODE_OPEN;
1614         case KSZ8081_LMD_STAT_FAIL:
1615                 fallthrough;
1616         default:
1617                 return ETHTOOL_A_CABLE_RESULT_CODE_UNSPEC;
1618         }
1619 }
1620
1621 static bool ksz886x_cable_test_failed(u16 status)
1622 {
1623         return FIELD_GET(KSZ8081_LMD_STAT_MASK, status) ==
1624                 KSZ8081_LMD_STAT_FAIL;
1625 }
1626
1627 static bool ksz886x_cable_test_fault_length_valid(u16 status)
1628 {
1629         switch (FIELD_GET(KSZ8081_LMD_STAT_MASK, status)) {
1630         case KSZ8081_LMD_STAT_OPEN:
1631                 fallthrough;
1632         case KSZ8081_LMD_STAT_SHORT:
1633                 return true;
1634         }
1635         return false;
1636 }
1637
1638 static int ksz886x_cable_test_fault_length(u16 status)
1639 {
1640         int dt;
1641
1642         /* According to the data sheet the distance to the fault is
1643          * DELTA_TIME * 0.4 meters.
1644          */
1645         dt = FIELD_GET(KSZ8081_LMD_DELTA_TIME_MASK, status);
1646
1647         return (dt * 400) / 10;
1648 }
1649
1650 static int ksz886x_cable_test_wait_for_completion(struct phy_device *phydev)
1651 {
1652         int val, ret;
1653
1654         ret = phy_read_poll_timeout(phydev, KSZ8081_LMD, val,
1655                                     !(val & KSZ8081_LMD_ENABLE_TEST),
1656                                     30000, 100000, true);
1657
1658         return ret < 0 ? ret : 0;
1659 }
1660
1661 static int ksz886x_cable_test_one_pair(struct phy_device *phydev, int pair)
1662 {
1663         static const int ethtool_pair[] = {
1664                 ETHTOOL_A_CABLE_PAIR_A,
1665                 ETHTOOL_A_CABLE_PAIR_B,
1666         };
1667         int ret, val, mdix;
1668
1669         /* There is no way to choice the pair, like we do one ksz9031.
1670          * We can workaround this limitation by using the MDI-X functionality.
1671          */
1672         if (pair == 0)
1673                 mdix = ETH_TP_MDI;
1674         else
1675                 mdix = ETH_TP_MDI_X;
1676
1677         switch (phydev->phy_id & MICREL_PHY_ID_MASK) {
1678         case PHY_ID_KSZ8081:
1679                 ret = ksz8081_config_mdix(phydev, mdix);
1680                 break;
1681         case PHY_ID_KSZ886X:
1682                 ret = ksz886x_config_mdix(phydev, mdix);
1683                 break;
1684         default:
1685                 ret = -ENODEV;
1686         }
1687
1688         if (ret)
1689                 return ret;
1690
1691         /* Now we are ready to fire. This command will send a 100ns pulse
1692          * to the pair.
1693          */
1694         ret = phy_write(phydev, KSZ8081_LMD, KSZ8081_LMD_ENABLE_TEST);
1695         if (ret)
1696                 return ret;
1697
1698         ret = ksz886x_cable_test_wait_for_completion(phydev);
1699         if (ret)
1700                 return ret;
1701
1702         val = phy_read(phydev, KSZ8081_LMD);
1703         if (val < 0)
1704                 return val;
1705
1706         if (ksz886x_cable_test_failed(val))
1707                 return -EAGAIN;
1708
1709         ret = ethnl_cable_test_result(phydev, ethtool_pair[pair],
1710                                       ksz886x_cable_test_result_trans(val));
1711         if (ret)
1712                 return ret;
1713
1714         if (!ksz886x_cable_test_fault_length_valid(val))
1715                 return 0;
1716
1717         return ethnl_cable_test_fault_length(phydev, ethtool_pair[pair],
1718                                              ksz886x_cable_test_fault_length(val));
1719 }
1720
1721 static int ksz886x_cable_test_get_status(struct phy_device *phydev,
1722                                          bool *finished)
1723 {
1724         unsigned long pair_mask = 0x3;
1725         int retries = 20;
1726         int pair, ret;
1727
1728         *finished = false;
1729
1730         /* Try harder if link partner is active */
1731         while (pair_mask && retries--) {
1732                 for_each_set_bit(pair, &pair_mask, 4) {
1733                         ret = ksz886x_cable_test_one_pair(phydev, pair);
1734                         if (ret == -EAGAIN)
1735                                 continue;
1736                         if (ret < 0)
1737                                 return ret;
1738                         clear_bit(pair, &pair_mask);
1739                 }
1740                 /* If link partner is in autonegotiation mode it will send 2ms
1741                  * of FLPs with at least 6ms of silence.
1742                  * Add 2ms sleep to have better chances to hit this silence.
1743                  */
1744                 if (pair_mask)
1745                         msleep(2);
1746         }
1747
1748         *finished = true;
1749
1750         return ret;
1751 }
1752
1753 #define LAN_EXT_PAGE_ACCESS_CONTROL                     0x16
1754 #define LAN_EXT_PAGE_ACCESS_ADDRESS_DATA                0x17
1755 #define LAN_EXT_PAGE_ACCESS_CTRL_EP_FUNC                0x4000
1756
1757 #define LAN8814_QSGMII_SOFT_RESET                       0x43
1758 #define LAN8814_QSGMII_SOFT_RESET_BIT                   BIT(0)
1759 #define LAN8814_QSGMII_PCS1G_ANEG_CONFIG                0x13
1760 #define LAN8814_QSGMII_PCS1G_ANEG_CONFIG_ANEG_ENA       BIT(3)
1761 #define LAN8814_ALIGN_SWAP                              0x4a
1762 #define LAN8814_ALIGN_TX_A_B_SWAP                       0x1
1763 #define LAN8814_ALIGN_TX_A_B_SWAP_MASK                  GENMASK(2, 0)
1764
1765 #define LAN8804_ALIGN_SWAP                              0x4a
1766 #define LAN8804_ALIGN_TX_A_B_SWAP                       0x1
1767 #define LAN8804_ALIGN_TX_A_B_SWAP_MASK                  GENMASK(2, 0)
1768 #define LAN8814_CLOCK_MANAGEMENT                        0xd
1769 #define LAN8814_LINK_QUALITY                            0x8e
1770
1771 static int lanphy_read_page_reg(struct phy_device *phydev, int page, u32 addr)
1772 {
1773         u32 data;
1774
1775         phy_lock_mdio_bus(phydev);
1776         __phy_write(phydev, LAN_EXT_PAGE_ACCESS_CONTROL, page);
1777         __phy_write(phydev, LAN_EXT_PAGE_ACCESS_ADDRESS_DATA, addr);
1778         __phy_write(phydev, LAN_EXT_PAGE_ACCESS_CONTROL,
1779                     (page | LAN_EXT_PAGE_ACCESS_CTRL_EP_FUNC));
1780         data = __phy_read(phydev, LAN_EXT_PAGE_ACCESS_ADDRESS_DATA);
1781         phy_unlock_mdio_bus(phydev);
1782
1783         return data;
1784 }
1785
1786 static int lanphy_write_page_reg(struct phy_device *phydev, int page, u16 addr,
1787                                  u16 val)
1788 {
1789         phy_lock_mdio_bus(phydev);
1790         __phy_write(phydev, LAN_EXT_PAGE_ACCESS_CONTROL, page);
1791         __phy_write(phydev, LAN_EXT_PAGE_ACCESS_ADDRESS_DATA, addr);
1792         __phy_write(phydev, LAN_EXT_PAGE_ACCESS_CONTROL,
1793                     page | LAN_EXT_PAGE_ACCESS_CTRL_EP_FUNC);
1794
1795         val = __phy_write(phydev, LAN_EXT_PAGE_ACCESS_ADDRESS_DATA, val);
1796         if (val != 0)
1797                 phydev_err(phydev, "Error: phy_write has returned error %d\n",
1798                            val);
1799         phy_unlock_mdio_bus(phydev);
1800         return val;
1801 }
1802
1803 static int lan8814_config_ts_intr(struct phy_device *phydev, bool enable)
1804 {
1805         u16 val = 0;
1806
1807         if (enable)
1808                 val = PTP_TSU_INT_EN_PTP_TX_TS_EN_ |
1809                       PTP_TSU_INT_EN_PTP_TX_TS_OVRFL_EN_ |
1810                       PTP_TSU_INT_EN_PTP_RX_TS_EN_ |
1811                       PTP_TSU_INT_EN_PTP_RX_TS_OVRFL_EN_;
1812
1813         return lanphy_write_page_reg(phydev, 5, PTP_TSU_INT_EN, val);
1814 }
1815
1816 static void lan8814_ptp_rx_ts_get(struct phy_device *phydev,
1817                                   u32 *seconds, u32 *nano_seconds, u16 *seq_id)
1818 {
1819         *seconds = lanphy_read_page_reg(phydev, 5, PTP_RX_INGRESS_SEC_HI);
1820         *seconds = (*seconds << 16) |
1821                    lanphy_read_page_reg(phydev, 5, PTP_RX_INGRESS_SEC_LO);
1822
1823         *nano_seconds = lanphy_read_page_reg(phydev, 5, PTP_RX_INGRESS_NS_HI);
1824         *nano_seconds = ((*nano_seconds & 0x3fff) << 16) |
1825                         lanphy_read_page_reg(phydev, 5, PTP_RX_INGRESS_NS_LO);
1826
1827         *seq_id = lanphy_read_page_reg(phydev, 5, PTP_RX_MSG_HEADER2);
1828 }
1829
1830 static void lan8814_ptp_tx_ts_get(struct phy_device *phydev,
1831                                   u32 *seconds, u32 *nano_seconds, u16 *seq_id)
1832 {
1833         *seconds = lanphy_read_page_reg(phydev, 5, PTP_TX_EGRESS_SEC_HI);
1834         *seconds = *seconds << 16 |
1835                    lanphy_read_page_reg(phydev, 5, PTP_TX_EGRESS_SEC_LO);
1836
1837         *nano_seconds = lanphy_read_page_reg(phydev, 5, PTP_TX_EGRESS_NS_HI);
1838         *nano_seconds = ((*nano_seconds & 0x3fff) << 16) |
1839                         lanphy_read_page_reg(phydev, 5, PTP_TX_EGRESS_NS_LO);
1840
1841         *seq_id = lanphy_read_page_reg(phydev, 5, PTP_TX_MSG_HEADER2);
1842 }
1843
1844 static int lan8814_ts_info(struct mii_timestamper *mii_ts, struct ethtool_ts_info *info)
1845 {
1846         struct kszphy_ptp_priv *ptp_priv = container_of(mii_ts, struct kszphy_ptp_priv, mii_ts);
1847         struct phy_device *phydev = ptp_priv->phydev;
1848         struct lan8814_shared_priv *shared = phydev->shared->priv;
1849
1850         info->so_timestamping = SOF_TIMESTAMPING_TX_HARDWARE |
1851                                 SOF_TIMESTAMPING_RX_HARDWARE |
1852                                 SOF_TIMESTAMPING_RAW_HARDWARE;
1853
1854         info->phc_index = ptp_clock_index(shared->ptp_clock);
1855
1856         info->tx_types =
1857                 (1 << HWTSTAMP_TX_OFF) |
1858                 (1 << HWTSTAMP_TX_ON) |
1859                 (1 << HWTSTAMP_TX_ONESTEP_SYNC);
1860
1861         info->rx_filters =
1862                 (1 << HWTSTAMP_FILTER_NONE) |
1863                 (1 << HWTSTAMP_FILTER_PTP_V1_L4_EVENT) |
1864                 (1 << HWTSTAMP_FILTER_PTP_V2_L4_EVENT) |
1865                 (1 << HWTSTAMP_FILTER_PTP_V2_L2_EVENT) |
1866                 (1 << HWTSTAMP_FILTER_PTP_V2_EVENT);
1867
1868         return 0;
1869 }
1870
1871 static void lan8814_flush_fifo(struct phy_device *phydev, bool egress)
1872 {
1873         int i;
1874
1875         for (i = 0; i < FIFO_SIZE; ++i)
1876                 lanphy_read_page_reg(phydev, 5,
1877                                      egress ? PTP_TX_MSG_HEADER2 : PTP_RX_MSG_HEADER2);
1878
1879         /* Read to clear overflow status bit */
1880         lanphy_read_page_reg(phydev, 5, PTP_TSU_INT_STS);
1881 }
1882
1883 static int lan8814_hwtstamp(struct mii_timestamper *mii_ts, struct ifreq *ifr)
1884 {
1885         struct kszphy_ptp_priv *ptp_priv =
1886                           container_of(mii_ts, struct kszphy_ptp_priv, mii_ts);
1887         struct phy_device *phydev = ptp_priv->phydev;
1888         struct lan8814_shared_priv *shared = phydev->shared->priv;
1889         struct lan8814_ptp_rx_ts *rx_ts, *tmp;
1890         struct hwtstamp_config config;
1891         int txcfg = 0, rxcfg = 0;
1892         int pkt_ts_enable;
1893
1894         if (copy_from_user(&config, ifr->ifr_data, sizeof(config)))
1895                 return -EFAULT;
1896
1897         ptp_priv->hwts_tx_type = config.tx_type;
1898         ptp_priv->rx_filter = config.rx_filter;
1899
1900         switch (config.rx_filter) {
1901         case HWTSTAMP_FILTER_NONE:
1902                 ptp_priv->layer = 0;
1903                 ptp_priv->version = 0;
1904                 break;
1905         case HWTSTAMP_FILTER_PTP_V2_L4_EVENT:
1906         case HWTSTAMP_FILTER_PTP_V2_L4_SYNC:
1907         case HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ:
1908                 ptp_priv->layer = PTP_CLASS_L4;
1909                 ptp_priv->version = PTP_CLASS_V2;
1910                 break;
1911         case HWTSTAMP_FILTER_PTP_V2_L2_EVENT:
1912         case HWTSTAMP_FILTER_PTP_V2_L2_SYNC:
1913         case HWTSTAMP_FILTER_PTP_V2_L2_DELAY_REQ:
1914                 ptp_priv->layer = PTP_CLASS_L2;
1915                 ptp_priv->version = PTP_CLASS_V2;
1916                 break;
1917         case HWTSTAMP_FILTER_PTP_V2_EVENT:
1918         case HWTSTAMP_FILTER_PTP_V2_SYNC:
1919         case HWTSTAMP_FILTER_PTP_V2_DELAY_REQ:
1920                 ptp_priv->layer = PTP_CLASS_L4 | PTP_CLASS_L2;
1921                 ptp_priv->version = PTP_CLASS_V2;
1922                 break;
1923         default:
1924                 return -ERANGE;
1925         }
1926
1927         if (ptp_priv->layer & PTP_CLASS_L2) {
1928                 rxcfg = PTP_RX_PARSE_CONFIG_LAYER2_EN_;
1929                 txcfg = PTP_TX_PARSE_CONFIG_LAYER2_EN_;
1930         } else if (ptp_priv->layer & PTP_CLASS_L4) {
1931                 rxcfg |= PTP_RX_PARSE_CONFIG_IPV4_EN_ | PTP_RX_PARSE_CONFIG_IPV6_EN_;
1932                 txcfg |= PTP_TX_PARSE_CONFIG_IPV4_EN_ | PTP_TX_PARSE_CONFIG_IPV6_EN_;
1933         }
1934         lanphy_write_page_reg(ptp_priv->phydev, 5, PTP_RX_PARSE_CONFIG, rxcfg);
1935         lanphy_write_page_reg(ptp_priv->phydev, 5, PTP_TX_PARSE_CONFIG, txcfg);
1936
1937         pkt_ts_enable = PTP_TIMESTAMP_EN_SYNC_ | PTP_TIMESTAMP_EN_DREQ_ |
1938                         PTP_TIMESTAMP_EN_PDREQ_ | PTP_TIMESTAMP_EN_PDRES_;
1939         lanphy_write_page_reg(ptp_priv->phydev, 5, PTP_RX_TIMESTAMP_EN, pkt_ts_enable);
1940         lanphy_write_page_reg(ptp_priv->phydev, 5, PTP_TX_TIMESTAMP_EN, pkt_ts_enable);
1941
1942         if (ptp_priv->hwts_tx_type == HWTSTAMP_TX_ONESTEP_SYNC)
1943                 lanphy_write_page_reg(ptp_priv->phydev, 5, PTP_TX_MOD,
1944                                       PTP_TX_MOD_TX_PTP_SYNC_TS_INSERT_);
1945
1946         if (config.rx_filter != HWTSTAMP_FILTER_NONE)
1947                 lan8814_config_ts_intr(ptp_priv->phydev, true);
1948         else
1949                 lan8814_config_ts_intr(ptp_priv->phydev, false);
1950
1951         mutex_lock(&shared->shared_lock);
1952         if (config.rx_filter != HWTSTAMP_FILTER_NONE)
1953                 shared->ref++;
1954         else
1955                 shared->ref--;
1956
1957         if (shared->ref)
1958                 lanphy_write_page_reg(ptp_priv->phydev, 4, PTP_CMD_CTL,
1959                                       PTP_CMD_CTL_PTP_ENABLE_);
1960         else
1961                 lanphy_write_page_reg(ptp_priv->phydev, 4, PTP_CMD_CTL,
1962                                       PTP_CMD_CTL_PTP_DISABLE_);
1963         mutex_unlock(&shared->shared_lock);
1964
1965         /* In case of multiple starts and stops, these needs to be cleared */
1966         list_for_each_entry_safe(rx_ts, tmp, &ptp_priv->rx_ts_list, list) {
1967                 list_del(&rx_ts->list);
1968                 kfree(rx_ts);
1969         }
1970         skb_queue_purge(&ptp_priv->rx_queue);
1971         skb_queue_purge(&ptp_priv->tx_queue);
1972
1973         lan8814_flush_fifo(ptp_priv->phydev, false);
1974         lan8814_flush_fifo(ptp_priv->phydev, true);
1975
1976         return copy_to_user(ifr->ifr_data, &config, sizeof(config)) ? -EFAULT : 0;
1977 }
1978
1979 static void lan8814_txtstamp(struct mii_timestamper *mii_ts,
1980                              struct sk_buff *skb, int type)
1981 {
1982         struct kszphy_ptp_priv *ptp_priv = container_of(mii_ts, struct kszphy_ptp_priv, mii_ts);
1983
1984         switch (ptp_priv->hwts_tx_type) {
1985         case HWTSTAMP_TX_ONESTEP_SYNC:
1986                 if (ptp_msg_is_sync(skb, type)) {
1987                         kfree_skb(skb);
1988                         return;
1989                 }
1990                 fallthrough;
1991         case HWTSTAMP_TX_ON:
1992                 skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS;
1993                 skb_queue_tail(&ptp_priv->tx_queue, skb);
1994                 break;
1995         case HWTSTAMP_TX_OFF:
1996         default:
1997                 kfree_skb(skb);
1998                 break;
1999         }
2000 }
2001
2002 static void lan8814_get_sig_rx(struct sk_buff *skb, u16 *sig)
2003 {
2004         struct ptp_header *ptp_header;
2005         u32 type;
2006
2007         skb_push(skb, ETH_HLEN);
2008         type = ptp_classify_raw(skb);
2009         ptp_header = ptp_parse_header(skb, type);
2010         skb_pull_inline(skb, ETH_HLEN);
2011
2012         *sig = (__force u16)(ntohs(ptp_header->sequence_id));
2013 }
2014
2015 static bool lan8814_match_rx_ts(struct kszphy_ptp_priv *ptp_priv,
2016                                 struct sk_buff *skb)
2017 {
2018         struct skb_shared_hwtstamps *shhwtstamps;
2019         struct lan8814_ptp_rx_ts *rx_ts, *tmp;
2020         unsigned long flags;
2021         bool ret = false;
2022         u16 skb_sig;
2023
2024         lan8814_get_sig_rx(skb, &skb_sig);
2025
2026         /* Iterate over all RX timestamps and match it with the received skbs */
2027         spin_lock_irqsave(&ptp_priv->rx_ts_lock, flags);
2028         list_for_each_entry_safe(rx_ts, tmp, &ptp_priv->rx_ts_list, list) {
2029                 /* Check if we found the signature we were looking for. */
2030                 if (memcmp(&skb_sig, &rx_ts->seq_id, sizeof(rx_ts->seq_id)))
2031                         continue;
2032
2033                 shhwtstamps = skb_hwtstamps(skb);
2034                 memset(shhwtstamps, 0, sizeof(*shhwtstamps));
2035                 shhwtstamps->hwtstamp = ktime_set(rx_ts->seconds,
2036                                                   rx_ts->nsec);
2037                 list_del(&rx_ts->list);
2038                 kfree(rx_ts);
2039
2040                 ret = true;
2041                 break;
2042         }
2043         spin_unlock_irqrestore(&ptp_priv->rx_ts_lock, flags);
2044
2045         if (ret)
2046                 netif_rx(skb);
2047         return ret;
2048 }
2049
2050 static bool lan8814_rxtstamp(struct mii_timestamper *mii_ts, struct sk_buff *skb, int type)
2051 {
2052         struct kszphy_ptp_priv *ptp_priv =
2053                         container_of(mii_ts, struct kszphy_ptp_priv, mii_ts);
2054
2055         if (ptp_priv->rx_filter == HWTSTAMP_FILTER_NONE ||
2056             type == PTP_CLASS_NONE)
2057                 return false;
2058
2059         if ((type & ptp_priv->version) == 0 || (type & ptp_priv->layer) == 0)
2060                 return false;
2061
2062         /* If we failed to match then add it to the queue for when the timestamp
2063          * will come
2064          */
2065         if (!lan8814_match_rx_ts(ptp_priv, skb))
2066                 skb_queue_tail(&ptp_priv->rx_queue, skb);
2067
2068         return true;
2069 }
2070
2071 static void lan8814_ptp_clock_set(struct phy_device *phydev,
2072                                   u32 seconds, u32 nano_seconds)
2073 {
2074         u32 sec_low, sec_high, nsec_low, nsec_high;
2075
2076         sec_low = seconds & 0xffff;
2077         sec_high = (seconds >> 16) & 0xffff;
2078         nsec_low = nano_seconds & 0xffff;
2079         nsec_high = (nano_seconds >> 16) & 0x3fff;
2080
2081         lanphy_write_page_reg(phydev, 4, PTP_CLOCK_SET_SEC_LO, sec_low);
2082         lanphy_write_page_reg(phydev, 4, PTP_CLOCK_SET_SEC_MID, sec_high);
2083         lanphy_write_page_reg(phydev, 4, PTP_CLOCK_SET_NS_LO, nsec_low);
2084         lanphy_write_page_reg(phydev, 4, PTP_CLOCK_SET_NS_HI, nsec_high);
2085
2086         lanphy_write_page_reg(phydev, 4, PTP_CMD_CTL, PTP_CMD_CTL_PTP_CLOCK_LOAD_);
2087 }
2088
2089 static void lan8814_ptp_clock_get(struct phy_device *phydev,
2090                                   u32 *seconds, u32 *nano_seconds)
2091 {
2092         lanphy_write_page_reg(phydev, 4, PTP_CMD_CTL, PTP_CMD_CTL_PTP_CLOCK_READ_);
2093
2094         *seconds = lanphy_read_page_reg(phydev, 4, PTP_CLOCK_READ_SEC_MID);
2095         *seconds = (*seconds << 16) |
2096                    lanphy_read_page_reg(phydev, 4, PTP_CLOCK_READ_SEC_LO);
2097
2098         *nano_seconds = lanphy_read_page_reg(phydev, 4, PTP_CLOCK_READ_NS_HI);
2099         *nano_seconds = ((*nano_seconds & 0x3fff) << 16) |
2100                         lanphy_read_page_reg(phydev, 4, PTP_CLOCK_READ_NS_LO);
2101 }
2102
2103 static int lan8814_ptpci_gettime64(struct ptp_clock_info *ptpci,
2104                                    struct timespec64 *ts)
2105 {
2106         struct lan8814_shared_priv *shared = container_of(ptpci, struct lan8814_shared_priv,
2107                                                           ptp_clock_info);
2108         struct phy_device *phydev = shared->phydev;
2109         u32 nano_seconds;
2110         u32 seconds;
2111
2112         mutex_lock(&shared->shared_lock);
2113         lan8814_ptp_clock_get(phydev, &seconds, &nano_seconds);
2114         mutex_unlock(&shared->shared_lock);
2115         ts->tv_sec = seconds;
2116         ts->tv_nsec = nano_seconds;
2117
2118         return 0;
2119 }
2120
2121 static int lan8814_ptpci_settime64(struct ptp_clock_info *ptpci,
2122                                    const struct timespec64 *ts)
2123 {
2124         struct lan8814_shared_priv *shared = container_of(ptpci, struct lan8814_shared_priv,
2125                                                           ptp_clock_info);
2126         struct phy_device *phydev = shared->phydev;
2127
2128         mutex_lock(&shared->shared_lock);
2129         lan8814_ptp_clock_set(phydev, ts->tv_sec, ts->tv_nsec);
2130         mutex_unlock(&shared->shared_lock);
2131
2132         return 0;
2133 }
2134
2135 static void lan8814_ptp_clock_step(struct phy_device *phydev,
2136                                    s64 time_step_ns)
2137 {
2138         u32 nano_seconds_step;
2139         u64 abs_time_step_ns;
2140         u32 unsigned_seconds;
2141         u32 nano_seconds;
2142         u32 remainder;
2143         s32 seconds;
2144
2145         if (time_step_ns >  15000000000LL) {
2146                 /* convert to clock set */
2147                 lan8814_ptp_clock_get(phydev, &unsigned_seconds, &nano_seconds);
2148                 unsigned_seconds += div_u64_rem(time_step_ns, 1000000000LL,
2149                                                 &remainder);
2150                 nano_seconds += remainder;
2151                 if (nano_seconds >= 1000000000) {
2152                         unsigned_seconds++;
2153                         nano_seconds -= 1000000000;
2154                 }
2155                 lan8814_ptp_clock_set(phydev, unsigned_seconds, nano_seconds);
2156                 return;
2157         } else if (time_step_ns < -15000000000LL) {
2158                 /* convert to clock set */
2159                 time_step_ns = -time_step_ns;
2160
2161                 lan8814_ptp_clock_get(phydev, &unsigned_seconds, &nano_seconds);
2162                 unsigned_seconds -= div_u64_rem(time_step_ns, 1000000000LL,
2163                                                 &remainder);
2164                 nano_seconds_step = remainder;
2165                 if (nano_seconds < nano_seconds_step) {
2166                         unsigned_seconds--;
2167                         nano_seconds += 1000000000;
2168                 }
2169                 nano_seconds -= nano_seconds_step;
2170                 lan8814_ptp_clock_set(phydev, unsigned_seconds,
2171                                       nano_seconds);
2172                 return;
2173         }
2174
2175         /* do clock step */
2176         if (time_step_ns >= 0) {
2177                 abs_time_step_ns = (u64)time_step_ns;
2178                 seconds = (s32)div_u64_rem(abs_time_step_ns, 1000000000,
2179                                            &remainder);
2180                 nano_seconds = remainder;
2181         } else {
2182                 abs_time_step_ns = (u64)(-time_step_ns);
2183                 seconds = -((s32)div_u64_rem(abs_time_step_ns, 1000000000,
2184                             &remainder));
2185                 nano_seconds = remainder;
2186                 if (nano_seconds > 0) {
2187                         /* subtracting nano seconds is not allowed
2188                          * convert to subtracting from seconds,
2189                          * and adding to nanoseconds
2190                          */
2191                         seconds--;
2192                         nano_seconds = (1000000000 - nano_seconds);
2193                 }
2194         }
2195
2196         if (nano_seconds > 0) {
2197                 /* add 8 ns to cover the likely normal increment */
2198                 nano_seconds += 8;
2199         }
2200
2201         if (nano_seconds >= 1000000000) {
2202                 /* carry into seconds */
2203                 seconds++;
2204                 nano_seconds -= 1000000000;
2205         }
2206
2207         while (seconds) {
2208                 if (seconds > 0) {
2209                         u32 adjustment_value = (u32)seconds;
2210                         u16 adjustment_value_lo, adjustment_value_hi;
2211
2212                         if (adjustment_value > 0xF)
2213                                 adjustment_value = 0xF;
2214
2215                         adjustment_value_lo = adjustment_value & 0xffff;
2216                         adjustment_value_hi = (adjustment_value >> 16) & 0x3fff;
2217
2218                         lanphy_write_page_reg(phydev, 4, PTP_LTC_STEP_ADJ_LO,
2219                                               adjustment_value_lo);
2220                         lanphy_write_page_reg(phydev, 4, PTP_LTC_STEP_ADJ_HI,
2221                                               PTP_LTC_STEP_ADJ_DIR_ |
2222                                               adjustment_value_hi);
2223                         seconds -= ((s32)adjustment_value);
2224                 } else {
2225                         u32 adjustment_value = (u32)(-seconds);
2226                         u16 adjustment_value_lo, adjustment_value_hi;
2227
2228                         if (adjustment_value > 0xF)
2229                                 adjustment_value = 0xF;
2230
2231                         adjustment_value_lo = adjustment_value & 0xffff;
2232                         adjustment_value_hi = (adjustment_value >> 16) & 0x3fff;
2233
2234                         lanphy_write_page_reg(phydev, 4, PTP_LTC_STEP_ADJ_LO,
2235                                               adjustment_value_lo);
2236                         lanphy_write_page_reg(phydev, 4, PTP_LTC_STEP_ADJ_HI,
2237                                               adjustment_value_hi);
2238                         seconds += ((s32)adjustment_value);
2239                 }
2240                 lanphy_write_page_reg(phydev, 4, PTP_CMD_CTL,
2241                                       PTP_CMD_CTL_PTP_LTC_STEP_SEC_);
2242         }
2243         if (nano_seconds) {
2244                 u16 nano_seconds_lo;
2245                 u16 nano_seconds_hi;
2246
2247                 nano_seconds_lo = nano_seconds & 0xffff;
2248                 nano_seconds_hi = (nano_seconds >> 16) & 0x3fff;
2249
2250                 lanphy_write_page_reg(phydev, 4, PTP_LTC_STEP_ADJ_LO,
2251                                       nano_seconds_lo);
2252                 lanphy_write_page_reg(phydev, 4, PTP_LTC_STEP_ADJ_HI,
2253                                       PTP_LTC_STEP_ADJ_DIR_ |
2254                                       nano_seconds_hi);
2255                 lanphy_write_page_reg(phydev, 4, PTP_CMD_CTL,
2256                                       PTP_CMD_CTL_PTP_LTC_STEP_NSEC_);
2257         }
2258 }
2259
2260 static int lan8814_ptpci_adjtime(struct ptp_clock_info *ptpci, s64 delta)
2261 {
2262         struct lan8814_shared_priv *shared = container_of(ptpci, struct lan8814_shared_priv,
2263                                                           ptp_clock_info);
2264         struct phy_device *phydev = shared->phydev;
2265
2266         mutex_lock(&shared->shared_lock);
2267         lan8814_ptp_clock_step(phydev, delta);
2268         mutex_unlock(&shared->shared_lock);
2269
2270         return 0;
2271 }
2272
2273 static int lan8814_ptpci_adjfine(struct ptp_clock_info *ptpci, long scaled_ppm)
2274 {
2275         struct lan8814_shared_priv *shared = container_of(ptpci, struct lan8814_shared_priv,
2276                                                           ptp_clock_info);
2277         struct phy_device *phydev = shared->phydev;
2278         u16 kszphy_rate_adj_lo, kszphy_rate_adj_hi;
2279         bool positive = true;
2280         u32 kszphy_rate_adj;
2281
2282         if (scaled_ppm < 0) {
2283                 scaled_ppm = -scaled_ppm;
2284                 positive = false;
2285         }
2286
2287         kszphy_rate_adj = LAN8814_1PPM_FORMAT * (scaled_ppm >> 16);
2288         kszphy_rate_adj += (LAN8814_1PPM_FORMAT * (0xffff & scaled_ppm)) >> 16;
2289
2290         kszphy_rate_adj_lo = kszphy_rate_adj & 0xffff;
2291         kszphy_rate_adj_hi = (kszphy_rate_adj >> 16) & 0x3fff;
2292
2293         if (positive)
2294                 kszphy_rate_adj_hi |= PTP_CLOCK_RATE_ADJ_DIR_;
2295
2296         mutex_lock(&shared->shared_lock);
2297         lanphy_write_page_reg(phydev, 4, PTP_CLOCK_RATE_ADJ_HI, kszphy_rate_adj_hi);
2298         lanphy_write_page_reg(phydev, 4, PTP_CLOCK_RATE_ADJ_LO, kszphy_rate_adj_lo);
2299         mutex_unlock(&shared->shared_lock);
2300
2301         return 0;
2302 }
2303
2304 static void lan8814_get_sig_tx(struct sk_buff *skb, u16 *sig)
2305 {
2306         struct ptp_header *ptp_header;
2307         u32 type;
2308
2309         type = ptp_classify_raw(skb);
2310         ptp_header = ptp_parse_header(skb, type);
2311
2312         *sig = (__force u16)(ntohs(ptp_header->sequence_id));
2313 }
2314
2315 static void lan8814_dequeue_tx_skb(struct kszphy_ptp_priv *ptp_priv)
2316 {
2317         struct phy_device *phydev = ptp_priv->phydev;
2318         struct skb_shared_hwtstamps shhwtstamps;
2319         struct sk_buff *skb, *skb_tmp;
2320         unsigned long flags;
2321         u32 seconds, nsec;
2322         bool ret = false;
2323         u16 skb_sig;
2324         u16 seq_id;
2325
2326         lan8814_ptp_tx_ts_get(phydev, &seconds, &nsec, &seq_id);
2327
2328         spin_lock_irqsave(&ptp_priv->tx_queue.lock, flags);
2329         skb_queue_walk_safe(&ptp_priv->tx_queue, skb, skb_tmp) {
2330                 lan8814_get_sig_tx(skb, &skb_sig);
2331
2332                 if (memcmp(&skb_sig, &seq_id, sizeof(seq_id)))
2333                         continue;
2334
2335                 __skb_unlink(skb, &ptp_priv->tx_queue);
2336                 ret = true;
2337                 break;
2338         }
2339         spin_unlock_irqrestore(&ptp_priv->tx_queue.lock, flags);
2340
2341         if (ret) {
2342                 memset(&shhwtstamps, 0, sizeof(shhwtstamps));
2343                 shhwtstamps.hwtstamp = ktime_set(seconds, nsec);
2344                 skb_complete_tx_timestamp(skb, &shhwtstamps);
2345         }
2346 }
2347
2348 static void lan8814_get_tx_ts(struct kszphy_ptp_priv *ptp_priv)
2349 {
2350         struct phy_device *phydev = ptp_priv->phydev;
2351         u32 reg;
2352
2353         do {
2354                 lan8814_dequeue_tx_skb(ptp_priv);
2355
2356                 /* If other timestamps are available in the FIFO,
2357                  * process them.
2358                  */
2359                 reg = lanphy_read_page_reg(phydev, 5, PTP_CAP_INFO);
2360         } while (PTP_CAP_INFO_TX_TS_CNT_GET_(reg) > 0);
2361 }
2362
2363 static bool lan8814_match_skb(struct kszphy_ptp_priv *ptp_priv,
2364                               struct lan8814_ptp_rx_ts *rx_ts)
2365 {
2366         struct skb_shared_hwtstamps *shhwtstamps;
2367         struct sk_buff *skb, *skb_tmp;
2368         unsigned long flags;
2369         bool ret = false;
2370         u16 skb_sig;
2371
2372         spin_lock_irqsave(&ptp_priv->rx_queue.lock, flags);
2373         skb_queue_walk_safe(&ptp_priv->rx_queue, skb, skb_tmp) {
2374                 lan8814_get_sig_rx(skb, &skb_sig);
2375
2376                 if (memcmp(&skb_sig, &rx_ts->seq_id, sizeof(rx_ts->seq_id)))
2377                         continue;
2378
2379                 __skb_unlink(skb, &ptp_priv->rx_queue);
2380
2381                 ret = true;
2382                 break;
2383         }
2384         spin_unlock_irqrestore(&ptp_priv->rx_queue.lock, flags);
2385
2386         if (ret) {
2387                 shhwtstamps = skb_hwtstamps(skb);
2388                 memset(shhwtstamps, 0, sizeof(*shhwtstamps));
2389                 shhwtstamps->hwtstamp = ktime_set(rx_ts->seconds, rx_ts->nsec);
2390                 netif_rx(skb);
2391         }
2392
2393         return ret;
2394 }
2395
2396 static void lan8814_get_rx_ts(struct kszphy_ptp_priv *ptp_priv)
2397 {
2398         struct phy_device *phydev = ptp_priv->phydev;
2399         struct lan8814_ptp_rx_ts *rx_ts;
2400         unsigned long flags;
2401         u32 reg;
2402
2403         do {
2404                 rx_ts = kzalloc(sizeof(*rx_ts), GFP_KERNEL);
2405                 if (!rx_ts)
2406                         return;
2407
2408                 lan8814_ptp_rx_ts_get(phydev, &rx_ts->seconds, &rx_ts->nsec,
2409                                       &rx_ts->seq_id);
2410
2411                 /* If we failed to match the skb add it to the queue for when
2412                  * the frame will come
2413                  */
2414                 if (!lan8814_match_skb(ptp_priv, rx_ts)) {
2415                         spin_lock_irqsave(&ptp_priv->rx_ts_lock, flags);
2416                         list_add(&rx_ts->list, &ptp_priv->rx_ts_list);
2417                         spin_unlock_irqrestore(&ptp_priv->rx_ts_lock, flags);
2418                 } else {
2419                         kfree(rx_ts);
2420                 }
2421
2422                 /* If other timestamps are available in the FIFO,
2423                  * process them.
2424                  */
2425                 reg = lanphy_read_page_reg(phydev, 5, PTP_CAP_INFO);
2426         } while (PTP_CAP_INFO_RX_TS_CNT_GET_(reg) > 0);
2427 }
2428
2429 static void lan8814_handle_ptp_interrupt(struct phy_device *phydev)
2430 {
2431         struct kszphy_priv *priv = phydev->priv;
2432         struct kszphy_ptp_priv *ptp_priv = &priv->ptp_priv;
2433         u16 status;
2434
2435         status = lanphy_read_page_reg(phydev, 5, PTP_TSU_INT_STS);
2436         if (status & PTP_TSU_INT_STS_PTP_TX_TS_EN_)
2437                 lan8814_get_tx_ts(ptp_priv);
2438
2439         if (status & PTP_TSU_INT_STS_PTP_RX_TS_EN_)
2440                 lan8814_get_rx_ts(ptp_priv);
2441
2442         if (status & PTP_TSU_INT_STS_PTP_TX_TS_OVRFL_INT_) {
2443                 lan8814_flush_fifo(phydev, true);
2444                 skb_queue_purge(&ptp_priv->tx_queue);
2445         }
2446
2447         if (status & PTP_TSU_INT_STS_PTP_RX_TS_OVRFL_INT_) {
2448                 lan8814_flush_fifo(phydev, false);
2449                 skb_queue_purge(&ptp_priv->rx_queue);
2450         }
2451 }
2452
2453 static int lan8804_config_init(struct phy_device *phydev)
2454 {
2455         int val;
2456
2457         /* MDI-X setting for swap A,B transmit */
2458         val = lanphy_read_page_reg(phydev, 2, LAN8804_ALIGN_SWAP);
2459         val &= ~LAN8804_ALIGN_TX_A_B_SWAP_MASK;
2460         val |= LAN8804_ALIGN_TX_A_B_SWAP;
2461         lanphy_write_page_reg(phydev, 2, LAN8804_ALIGN_SWAP, val);
2462
2463         /* Make sure that the PHY will not stop generating the clock when the
2464          * link partner goes down
2465          */
2466         lanphy_write_page_reg(phydev, 31, LAN8814_CLOCK_MANAGEMENT, 0x27e);
2467         lanphy_read_page_reg(phydev, 1, LAN8814_LINK_QUALITY);
2468
2469         return 0;
2470 }
2471
2472 static irqreturn_t lan8814_handle_interrupt(struct phy_device *phydev)
2473 {
2474         u16 tsu_irq_status;
2475         int irq_status;
2476
2477         irq_status = phy_read(phydev, LAN8814_INTS);
2478         if (irq_status > 0 && (irq_status & LAN8814_INT_LINK))
2479                 phy_trigger_machine(phydev);
2480
2481         if (irq_status < 0) {
2482                 phy_error(phydev);
2483                 return IRQ_NONE;
2484         }
2485
2486         while (1) {
2487                 tsu_irq_status = lanphy_read_page_reg(phydev, 4,
2488                                                       LAN8814_INTR_STS_REG);
2489
2490                 if (tsu_irq_status > 0 &&
2491                     (tsu_irq_status & (LAN8814_INTR_STS_REG_1588_TSU0_ |
2492                                        LAN8814_INTR_STS_REG_1588_TSU1_ |
2493                                        LAN8814_INTR_STS_REG_1588_TSU2_ |
2494                                        LAN8814_INTR_STS_REG_1588_TSU3_)))
2495                         lan8814_handle_ptp_interrupt(phydev);
2496                 else
2497                         break;
2498         }
2499         return IRQ_HANDLED;
2500 }
2501
2502 static int lan8814_ack_interrupt(struct phy_device *phydev)
2503 {
2504         /* bit[12..0] int status, which is a read and clear register. */
2505         int rc;
2506
2507         rc = phy_read(phydev, LAN8814_INTS);
2508
2509         return (rc < 0) ? rc : 0;
2510 }
2511
2512 static int lan8814_config_intr(struct phy_device *phydev)
2513 {
2514         int err;
2515
2516         lanphy_write_page_reg(phydev, 4, LAN8814_INTR_CTRL_REG,
2517                               LAN8814_INTR_CTRL_REG_POLARITY |
2518                               LAN8814_INTR_CTRL_REG_INTR_ENABLE);
2519
2520         /* enable / disable interrupts */
2521         if (phydev->interrupts == PHY_INTERRUPT_ENABLED) {
2522                 err = lan8814_ack_interrupt(phydev);
2523                 if (err)
2524                         return err;
2525
2526                 err =  phy_write(phydev, LAN8814_INTC, LAN8814_INT_LINK);
2527         } else {
2528                 err =  phy_write(phydev, LAN8814_INTC, 0);
2529                 if (err)
2530                         return err;
2531
2532                 err = lan8814_ack_interrupt(phydev);
2533         }
2534
2535         return err;
2536 }
2537
2538 static void lan8814_ptp_init(struct phy_device *phydev)
2539 {
2540         struct kszphy_priv *priv = phydev->priv;
2541         struct kszphy_ptp_priv *ptp_priv = &priv->ptp_priv;
2542         u32 temp;
2543
2544         lanphy_write_page_reg(phydev, 5, TSU_HARD_RESET, TSU_HARD_RESET_);
2545
2546         temp = lanphy_read_page_reg(phydev, 5, PTP_TX_MOD);
2547         temp |= PTP_TX_MOD_BAD_UDPV4_CHKSUM_FORCE_FCS_DIS_;
2548         lanphy_write_page_reg(phydev, 5, PTP_TX_MOD, temp);
2549
2550         temp = lanphy_read_page_reg(phydev, 5, PTP_RX_MOD);
2551         temp |= PTP_RX_MOD_BAD_UDPV4_CHKSUM_FORCE_FCS_DIS_;
2552         lanphy_write_page_reg(phydev, 5, PTP_RX_MOD, temp);
2553
2554         lanphy_write_page_reg(phydev, 5, PTP_RX_PARSE_CONFIG, 0);
2555         lanphy_write_page_reg(phydev, 5, PTP_TX_PARSE_CONFIG, 0);
2556
2557         /* Removing default registers configs related to L2 and IP */
2558         lanphy_write_page_reg(phydev, 5, PTP_TX_PARSE_L2_ADDR_EN, 0);
2559         lanphy_write_page_reg(phydev, 5, PTP_RX_PARSE_L2_ADDR_EN, 0);
2560         lanphy_write_page_reg(phydev, 5, PTP_TX_PARSE_IP_ADDR_EN, 0);
2561         lanphy_write_page_reg(phydev, 5, PTP_RX_PARSE_IP_ADDR_EN, 0);
2562
2563         skb_queue_head_init(&ptp_priv->tx_queue);
2564         skb_queue_head_init(&ptp_priv->rx_queue);
2565         INIT_LIST_HEAD(&ptp_priv->rx_ts_list);
2566         spin_lock_init(&ptp_priv->rx_ts_lock);
2567
2568         ptp_priv->phydev = phydev;
2569
2570         ptp_priv->mii_ts.rxtstamp = lan8814_rxtstamp;
2571         ptp_priv->mii_ts.txtstamp = lan8814_txtstamp;
2572         ptp_priv->mii_ts.hwtstamp = lan8814_hwtstamp;
2573         ptp_priv->mii_ts.ts_info  = lan8814_ts_info;
2574
2575         phydev->mii_ts = &ptp_priv->mii_ts;
2576 }
2577
2578 static int lan8814_ptp_probe_once(struct phy_device *phydev)
2579 {
2580         struct lan8814_shared_priv *shared = phydev->shared->priv;
2581
2582         /* Initialise shared lock for clock*/
2583         mutex_init(&shared->shared_lock);
2584
2585         shared->ptp_clock_info.owner = THIS_MODULE;
2586         snprintf(shared->ptp_clock_info.name, 30, "%s", phydev->drv->name);
2587         shared->ptp_clock_info.max_adj = 31249999;
2588         shared->ptp_clock_info.n_alarm = 0;
2589         shared->ptp_clock_info.n_ext_ts = 0;
2590         shared->ptp_clock_info.n_pins = 0;
2591         shared->ptp_clock_info.pps = 0;
2592         shared->ptp_clock_info.pin_config = NULL;
2593         shared->ptp_clock_info.adjfine = lan8814_ptpci_adjfine;
2594         shared->ptp_clock_info.adjtime = lan8814_ptpci_adjtime;
2595         shared->ptp_clock_info.gettime64 = lan8814_ptpci_gettime64;
2596         shared->ptp_clock_info.settime64 = lan8814_ptpci_settime64;
2597         shared->ptp_clock_info.getcrosststamp = NULL;
2598
2599         shared->ptp_clock = ptp_clock_register(&shared->ptp_clock_info,
2600                                                &phydev->mdio.dev);
2601         if (IS_ERR_OR_NULL(shared->ptp_clock)) {
2602                 phydev_err(phydev, "ptp_clock_register failed %lu\n",
2603                            PTR_ERR(shared->ptp_clock));
2604                 return -EINVAL;
2605         }
2606
2607         phydev_dbg(phydev, "successfully registered ptp clock\n");
2608
2609         shared->phydev = phydev;
2610
2611         /* The EP.4 is shared between all the PHYs in the package and also it
2612          * can be accessed by any of the PHYs
2613          */
2614         lanphy_write_page_reg(phydev, 4, LTC_HARD_RESET, LTC_HARD_RESET_);
2615         lanphy_write_page_reg(phydev, 4, PTP_OPERATING_MODE,
2616                               PTP_OPERATING_MODE_STANDALONE_);
2617
2618         return 0;
2619 }
2620
2621 static int lan8814_read_status(struct phy_device *phydev)
2622 {
2623         struct kszphy_priv *priv = phydev->priv;
2624         struct kszphy_latencies *latencies = &priv->latencies;
2625         int err;
2626         int regval;
2627
2628         err = genphy_read_status(phydev);
2629         if (err)
2630                 return err;
2631
2632         switch (phydev->speed) {
2633         case SPEED_1000:
2634                 lanphy_write_page_reg(phydev, 5, PTP_RX_LATENCY_1000,
2635                                       latencies->rx_1000);
2636                 lanphy_write_page_reg(phydev, 5, PTP_TX_LATENCY_1000,
2637                                       latencies->tx_1000);
2638                 break;
2639         case SPEED_100:
2640                 lanphy_write_page_reg(phydev, 5, PTP_RX_LATENCY_100,
2641                                       latencies->rx_100);
2642                 lanphy_write_page_reg(phydev, 5, PTP_TX_LATENCY_100,
2643                                       latencies->tx_100);
2644                 break;
2645         case SPEED_10:
2646                 lanphy_write_page_reg(phydev, 5, PTP_RX_LATENCY_10,
2647                                       latencies->rx_10);
2648                 lanphy_write_page_reg(phydev, 5, PTP_TX_LATENCY_10,
2649                                       latencies->tx_10);
2650                 break;
2651         default:
2652                 break;
2653         }
2654
2655         /* Make sure the PHY is not broken. Read idle error count,
2656          * and reset the PHY if it is maxed out.
2657          */
2658         regval = phy_read(phydev, MII_STAT1000);
2659         if ((regval & 0xFF) == 0xFF) {
2660                 phy_init_hw(phydev);
2661                 phydev->link = 0;
2662                 if (phydev->drv->config_intr && phy_interrupt_is_valid(phydev))
2663                         phydev->drv->config_intr(phydev);
2664                 return genphy_config_aneg(phydev);
2665         }
2666
2667         return 0;
2668 }
2669
2670 static int lan8814_config_init(struct phy_device *phydev)
2671 {
2672         int val;
2673
2674         /* Reset the PHY */
2675         val = lanphy_read_page_reg(phydev, 4, LAN8814_QSGMII_SOFT_RESET);
2676         val |= LAN8814_QSGMII_SOFT_RESET_BIT;
2677         lanphy_write_page_reg(phydev, 4, LAN8814_QSGMII_SOFT_RESET, val);
2678
2679         /* Disable ANEG with QSGMII PCS Host side */
2680         val = lanphy_read_page_reg(phydev, 5, LAN8814_QSGMII_PCS1G_ANEG_CONFIG);
2681         val &= ~LAN8814_QSGMII_PCS1G_ANEG_CONFIG_ANEG_ENA;
2682         lanphy_write_page_reg(phydev, 5, LAN8814_QSGMII_PCS1G_ANEG_CONFIG, val);
2683
2684         /* MDI-X setting for swap A,B transmit */
2685         val = lanphy_read_page_reg(phydev, 2, LAN8814_ALIGN_SWAP);
2686         val &= ~LAN8814_ALIGN_TX_A_B_SWAP_MASK;
2687         val |= LAN8814_ALIGN_TX_A_B_SWAP;
2688         lanphy_write_page_reg(phydev, 2, LAN8814_ALIGN_SWAP, val);
2689
2690         return 0;
2691 }
2692
2693 static void lan8814_parse_latency(struct phy_device *phydev)
2694 {
2695         const struct device_node *np = phydev->mdio.dev.of_node;
2696         struct kszphy_priv *priv = phydev->priv;
2697         struct kszphy_latencies *latency = &priv->latencies;
2698         u32 val;
2699
2700         if (!of_property_read_u32(np, "lan8814,latency_rx_10", &val))
2701                 latency->rx_10 = val;
2702         if (!of_property_read_u32(np, "lan8814,latency_tx_10", &val))
2703                 latency->tx_10 = val;
2704         if (!of_property_read_u32(np, "lan8814,latency_rx_100", &val))
2705                 latency->rx_100 = val;
2706         if (!of_property_read_u32(np, "lan8814,latency_tx_100", &val))
2707                 latency->tx_100 = val;
2708         if (!of_property_read_u32(np, "lan8814,latency_rx_1000", &val))
2709                 latency->rx_1000 = val;
2710         if (!of_property_read_u32(np, "lan8814,latency_tx_1000", &val))
2711                 latency->tx_1000 = val;
2712 }
2713
2714 static int lan8814_probe(struct phy_device *phydev)
2715 {
2716         const struct device_node *np = phydev->mdio.dev.of_node;
2717         struct kszphy_priv *priv;
2718         u16 addr;
2719         int err;
2720
2721         priv = devm_kzalloc(&phydev->mdio.dev, sizeof(*priv), GFP_KERNEL);
2722         if (!priv)
2723                 return -ENOMEM;
2724
2725         priv->led_mode = -1;
2726
2727         priv->latencies = lan8814_latencies;
2728
2729         phydev->priv = priv;
2730
2731         if (!IS_ENABLED(CONFIG_PTP_1588_CLOCK) ||
2732             !IS_ENABLED(CONFIG_NETWORK_PHY_TIMESTAMPING) ||
2733             of_property_read_bool(np, "lan8814,ignore-ts"))
2734                 return 0;
2735
2736         /* Strap-in value for PHY address, below register read gives starting
2737          * phy address value
2738          */
2739         addr = lanphy_read_page_reg(phydev, 4, 0) & 0x1F;
2740         devm_phy_package_join(&phydev->mdio.dev, phydev,
2741                               addr, sizeof(struct lan8814_shared_priv));
2742
2743         if (phy_package_init_once(phydev)) {
2744                 err = lan8814_ptp_probe_once(phydev);
2745                 if (err)
2746                         return err;
2747         }
2748
2749         lan8814_parse_latency(phydev);
2750         lan8814_ptp_init(phydev);
2751
2752         return 0;
2753 }
2754
2755 static struct phy_driver ksphy_driver[] = {
2756 {
2757         .phy_id         = PHY_ID_KS8737,
2758         .phy_id_mask    = MICREL_PHY_ID_MASK,
2759         .name           = "Micrel KS8737",
2760         /* PHY_BASIC_FEATURES */
2761         .driver_data    = &ks8737_type,
2762         .config_init    = kszphy_config_init,
2763         .config_intr    = kszphy_config_intr,
2764         .handle_interrupt = kszphy_handle_interrupt,
2765         .suspend        = kszphy_suspend,
2766         .resume         = kszphy_resume,
2767 }, {
2768         .phy_id         = PHY_ID_KSZ8021,
2769         .phy_id_mask    = 0x00ffffff,
2770         .name           = "Micrel KSZ8021 or KSZ8031",
2771         /* PHY_BASIC_FEATURES */
2772         .driver_data    = &ksz8021_type,
2773         .probe          = kszphy_probe,
2774         .config_init    = kszphy_config_init,
2775         .config_intr    = kszphy_config_intr,
2776         .handle_interrupt = kszphy_handle_interrupt,
2777         .get_sset_count = kszphy_get_sset_count,
2778         .get_strings    = kszphy_get_strings,
2779         .get_stats      = kszphy_get_stats,
2780         .suspend        = kszphy_suspend,
2781         .resume         = kszphy_resume,
2782 }, {
2783         .phy_id         = PHY_ID_KSZ8031,
2784         .phy_id_mask    = 0x00ffffff,
2785         .name           = "Micrel KSZ8031",
2786         /* PHY_BASIC_FEATURES */
2787         .driver_data    = &ksz8021_type,
2788         .probe          = kszphy_probe,
2789         .config_init    = kszphy_config_init,
2790         .config_intr    = kszphy_config_intr,
2791         .handle_interrupt = kszphy_handle_interrupt,
2792         .get_sset_count = kszphy_get_sset_count,
2793         .get_strings    = kszphy_get_strings,
2794         .get_stats      = kszphy_get_stats,
2795         .suspend        = kszphy_suspend,
2796         .resume         = kszphy_resume,
2797 }, {
2798         .phy_id         = PHY_ID_KSZ8041,
2799         .phy_id_mask    = MICREL_PHY_ID_MASK,
2800         .name           = "Micrel KSZ8041",
2801         /* PHY_BASIC_FEATURES */
2802         .driver_data    = &ksz8041_type,
2803         .probe          = kszphy_probe,
2804         .config_init    = ksz8041_config_init,
2805         .config_aneg    = ksz8041_config_aneg,
2806         .config_intr    = kszphy_config_intr,
2807         .handle_interrupt = kszphy_handle_interrupt,
2808         .get_sset_count = kszphy_get_sset_count,
2809         .get_strings    = kszphy_get_strings,
2810         .get_stats      = kszphy_get_stats,
2811         /* No suspend/resume callbacks because of errata DS80000700A,
2812          * receiver error following software power down.
2813          */
2814 }, {
2815         .phy_id         = PHY_ID_KSZ8041RNLI,
2816         .phy_id_mask    = MICREL_PHY_ID_MASK,
2817         .name           = "Micrel KSZ8041RNLI",
2818         /* PHY_BASIC_FEATURES */
2819         .driver_data    = &ksz8041_type,
2820         .probe          = kszphy_probe,
2821         .config_init    = kszphy_config_init,
2822         .config_intr    = kszphy_config_intr,
2823         .handle_interrupt = kszphy_handle_interrupt,
2824         .get_sset_count = kszphy_get_sset_count,
2825         .get_strings    = kszphy_get_strings,
2826         .get_stats      = kszphy_get_stats,
2827         .suspend        = kszphy_suspend,
2828         .resume         = kszphy_resume,
2829 }, {
2830         .name           = "Micrel KSZ8051",
2831         /* PHY_BASIC_FEATURES */
2832         .driver_data    = &ksz8051_type,
2833         .probe          = kszphy_probe,
2834         .config_init    = kszphy_config_init,
2835         .config_intr    = kszphy_config_intr,
2836         .handle_interrupt = kszphy_handle_interrupt,
2837         .get_sset_count = kszphy_get_sset_count,
2838         .get_strings    = kszphy_get_strings,
2839         .get_stats      = kszphy_get_stats,
2840         .match_phy_device = ksz8051_match_phy_device,
2841         .suspend        = kszphy_suspend,
2842         .resume         = kszphy_resume,
2843 }, {
2844         .phy_id         = PHY_ID_KSZ8001,
2845         .name           = "Micrel KSZ8001 or KS8721",
2846         .phy_id_mask    = 0x00fffffc,
2847         /* PHY_BASIC_FEATURES */
2848         .driver_data    = &ksz8041_type,
2849         .probe          = kszphy_probe,
2850         .config_init    = kszphy_config_init,
2851         .config_intr    = kszphy_config_intr,
2852         .handle_interrupt = kszphy_handle_interrupt,
2853         .get_sset_count = kszphy_get_sset_count,
2854         .get_strings    = kszphy_get_strings,
2855         .get_stats      = kszphy_get_stats,
2856         .suspend        = kszphy_suspend,
2857         .resume         = kszphy_resume,
2858 }, {
2859         .phy_id         = PHY_ID_KSZ8081,
2860         .name           = "Micrel KSZ8081 or KSZ8091",
2861         .phy_id_mask    = MICREL_PHY_ID_MASK,
2862         .flags          = PHY_POLL_CABLE_TEST,
2863         /* PHY_BASIC_FEATURES */
2864         .driver_data    = &ksz8081_type,
2865         .probe          = kszphy_probe,
2866         .config_init    = ksz8081_config_init,
2867         .soft_reset     = genphy_soft_reset,
2868         .config_aneg    = ksz8081_config_aneg,
2869         .read_status    = ksz8081_read_status,
2870         .config_intr    = kszphy_config_intr,
2871         .handle_interrupt = kszphy_handle_interrupt,
2872         .get_sset_count = kszphy_get_sset_count,
2873         .get_strings    = kszphy_get_strings,
2874         .get_stats      = kszphy_get_stats,
2875         .suspend        = kszphy_suspend,
2876         .resume         = kszphy_resume,
2877         .cable_test_start       = ksz886x_cable_test_start,
2878         .cable_test_get_status  = ksz886x_cable_test_get_status,
2879 }, {
2880         .phy_id         = PHY_ID_KSZ8061,
2881         .name           = "Micrel KSZ8061",
2882         .phy_id_mask    = MICREL_PHY_ID_MASK,
2883         /* PHY_BASIC_FEATURES */
2884         .config_init    = ksz8061_config_init,
2885         .config_intr    = kszphy_config_intr,
2886         .handle_interrupt = kszphy_handle_interrupt,
2887         .suspend        = kszphy_suspend,
2888         .resume         = kszphy_resume,
2889 }, {
2890         .phy_id         = PHY_ID_KSZ9021,
2891         .phy_id_mask    = 0x000ffffe,
2892         .name           = "Micrel KSZ9021 Gigabit PHY",
2893         /* PHY_GBIT_FEATURES */
2894         .driver_data    = &ksz9021_type,
2895         .probe          = kszphy_probe,
2896         .get_features   = ksz9031_get_features,
2897         .config_init    = ksz9021_config_init,
2898         .config_intr    = kszphy_config_intr,
2899         .handle_interrupt = kszphy_handle_interrupt,
2900         .get_sset_count = kszphy_get_sset_count,
2901         .get_strings    = kszphy_get_strings,
2902         .get_stats      = kszphy_get_stats,
2903         .suspend        = kszphy_suspend,
2904         .resume         = kszphy_resume,
2905         .read_mmd       = genphy_read_mmd_unsupported,
2906         .write_mmd      = genphy_write_mmd_unsupported,
2907 }, {
2908         .phy_id         = PHY_ID_KSZ9031,
2909         .phy_id_mask    = MICREL_PHY_ID_MASK,
2910         .name           = "Micrel KSZ9031 Gigabit PHY",
2911         .driver_data    = &ksz9021_type,
2912         .probe          = kszphy_probe,
2913         .get_features   = ksz9031_get_features,
2914         .config_init    = ksz9031_config_init,
2915         .soft_reset     = genphy_soft_reset,
2916         .read_status    = ksz9031_read_status,
2917         .config_intr    = kszphy_config_intr,
2918         .handle_interrupt = kszphy_handle_interrupt,
2919         .get_sset_count = kszphy_get_sset_count,
2920         .get_strings    = kszphy_get_strings,
2921         .get_stats      = kszphy_get_stats,
2922         .suspend        = kszphy_suspend,
2923         .resume         = kszphy_resume,
2924 }, {
2925         .phy_id         = PHY_ID_LAN8814,
2926         .phy_id_mask    = MICREL_PHY_ID_MASK,
2927         .name           = "Microchip INDY Gigabit Quad PHY",
2928         .config_init    = lan8814_config_init,
2929         .probe          = lan8814_probe,
2930         .soft_reset     = genphy_soft_reset,
2931         .read_status    = lan8814_read_status,
2932         .get_sset_count = kszphy_get_sset_count,
2933         .get_strings    = kszphy_get_strings,
2934         .get_stats      = kszphy_get_stats,
2935         .suspend        = genphy_suspend,
2936         .resume         = kszphy_resume,
2937         .config_intr    = lan8814_config_intr,
2938         .handle_interrupt = lan8814_handle_interrupt,
2939 }, {
2940         .phy_id         = PHY_ID_LAN8804,
2941         .phy_id_mask    = MICREL_PHY_ID_MASK,
2942         .name           = "Microchip LAN966X Gigabit PHY",
2943         .config_init    = lan8804_config_init,
2944         .driver_data    = &ksz9021_type,
2945         .probe          = kszphy_probe,
2946         .soft_reset     = genphy_soft_reset,
2947         .read_status    = ksz9031_read_status,
2948         .get_sset_count = kszphy_get_sset_count,
2949         .get_strings    = kszphy_get_strings,
2950         .get_stats      = kszphy_get_stats,
2951         .suspend        = genphy_suspend,
2952         .resume         = kszphy_resume,
2953 }, {
2954         .phy_id         = PHY_ID_KSZ9131,
2955         .phy_id_mask    = MICREL_PHY_ID_MASK,
2956         .name           = "Microchip KSZ9131 Gigabit PHY",
2957         /* PHY_GBIT_FEATURES */
2958         .driver_data    = &ksz9021_type,
2959         .probe          = kszphy_probe,
2960         .config_init    = ksz9131_config_init,
2961         .config_intr    = kszphy_config_intr,
2962         .handle_interrupt = kszphy_handle_interrupt,
2963         .get_sset_count = kszphy_get_sset_count,
2964         .get_strings    = kszphy_get_strings,
2965         .get_stats      = kszphy_get_stats,
2966         .suspend        = kszphy_suspend,
2967         .resume         = kszphy_resume,
2968 }, {
2969         .phy_id         = PHY_ID_KSZ8873MLL,
2970         .phy_id_mask    = MICREL_PHY_ID_MASK,
2971         .name           = "Micrel KSZ8873MLL Switch",
2972         /* PHY_BASIC_FEATURES */
2973         .config_init    = kszphy_config_init,
2974         .config_aneg    = ksz8873mll_config_aneg,
2975         .read_status    = ksz8873mll_read_status,
2976         .suspend        = genphy_suspend,
2977         .resume         = genphy_resume,
2978 }, {
2979         .phy_id         = PHY_ID_KSZ886X,
2980         .phy_id_mask    = MICREL_PHY_ID_MASK,
2981         .name           = "Micrel KSZ8851 Ethernet MAC or KSZ886X Switch",
2982         /* PHY_BASIC_FEATURES */
2983         .flags          = PHY_POLL_CABLE_TEST,
2984         .config_init    = kszphy_config_init,
2985         .config_aneg    = ksz886x_config_aneg,
2986         .read_status    = ksz886x_read_status,
2987         .suspend        = genphy_suspend,
2988         .resume         = genphy_resume,
2989         .cable_test_start       = ksz886x_cable_test_start,
2990         .cable_test_get_status  = ksz886x_cable_test_get_status,
2991 }, {
2992         .name           = "Micrel KSZ87XX Switch",
2993         /* PHY_BASIC_FEATURES */
2994         .config_init    = kszphy_config_init,
2995         .match_phy_device = ksz8795_match_phy_device,
2996         .suspend        = genphy_suspend,
2997         .resume         = genphy_resume,
2998 }, {
2999         .phy_id         = PHY_ID_KSZ9477,
3000         .phy_id_mask    = MICREL_PHY_ID_MASK,
3001         .name           = "Microchip KSZ9477",
3002         /* PHY_GBIT_FEATURES */
3003         .config_init    = kszphy_config_init,
3004         .suspend        = genphy_suspend,
3005         .resume         = genphy_resume,
3006 } };
3007
3008 module_phy_driver(ksphy_driver);
3009
3010 MODULE_DESCRIPTION("Micrel PHY driver");
3011 MODULE_AUTHOR("David J. Choi");
3012 MODULE_LICENSE("GPL");
3013
3014 static struct mdio_device_id __maybe_unused micrel_tbl[] = {
3015         { PHY_ID_KSZ9021, 0x000ffffe },
3016         { PHY_ID_KSZ9031, MICREL_PHY_ID_MASK },
3017         { PHY_ID_KSZ9131, MICREL_PHY_ID_MASK },
3018         { PHY_ID_KSZ8001, 0x00fffffc },
3019         { PHY_ID_KS8737, MICREL_PHY_ID_MASK },
3020         { PHY_ID_KSZ8021, 0x00ffffff },
3021         { PHY_ID_KSZ8031, 0x00ffffff },
3022         { PHY_ID_KSZ8041, MICREL_PHY_ID_MASK },
3023         { PHY_ID_KSZ8051, MICREL_PHY_ID_MASK },
3024         { PHY_ID_KSZ8061, MICREL_PHY_ID_MASK },
3025         { PHY_ID_KSZ8081, MICREL_PHY_ID_MASK },
3026         { PHY_ID_KSZ8873MLL, MICREL_PHY_ID_MASK },
3027         { PHY_ID_KSZ886X, MICREL_PHY_ID_MASK },
3028         { PHY_ID_LAN8814, MICREL_PHY_ID_MASK },
3029         { PHY_ID_LAN8804, MICREL_PHY_ID_MASK },
3030         { }
3031 };
3032
3033 MODULE_DEVICE_TABLE(mdio, micrel_tbl);
This page took 0.210938 seconds and 4 git commands to generate.