xref: /openbmc/linux/drivers/net/phy/realtek.c (revision 901181b7)
1 // SPDX-License-Identifier: GPL-2.0+
2 /* drivers/net/phy/realtek.c
3  *
4  * Driver for Realtek PHYs
5  *
6  * Author: Johnson Leung <r58129@freescale.com>
7  *
8  * Copyright (c) 2004 Freescale Semiconductor, Inc.
9  */
10 #include <linux/bitops.h>
11 #include <linux/of.h>
12 #include <linux/phy.h>
13 #include <linux/module.h>
14 #include <linux/delay.h>
15 
16 #define RTL821x_PHYSR				0x11
17 #define RTL821x_PHYSR_DUPLEX			BIT(13)
18 #define RTL821x_PHYSR_SPEED			GENMASK(15, 14)
19 
20 #define RTL821x_INER				0x12
21 #define RTL8211B_INER_INIT			0x6400
22 #define RTL8211E_INER_LINK_STATUS		BIT(10)
23 #define RTL8211F_INER_LINK_STATUS		BIT(4)
24 
25 #define RTL821x_INSR				0x13
26 
27 #define RTL821x_EXT_PAGE_SELECT			0x1e
28 #define RTL821x_PAGE_SELECT			0x1f
29 
30 #define RTL8211F_PHYCR1				0x18
31 #define RTL8211F_PHYCR2				0x19
32 #define RTL8211F_INSR				0x1d
33 
34 #define RTL8211F_TX_DELAY			BIT(8)
35 #define RTL8211F_RX_DELAY			BIT(3)
36 
37 #define RTL8211F_ALDPS_PLL_OFF			BIT(1)
38 #define RTL8211F_ALDPS_ENABLE			BIT(2)
39 #define RTL8211F_ALDPS_XTAL_OFF			BIT(12)
40 
41 #define RTL8211E_CTRL_DELAY			BIT(13)
42 #define RTL8211E_TX_DELAY			BIT(12)
43 #define RTL8211E_RX_DELAY			BIT(11)
44 
45 #define RTL8211F_CLKOUT_EN			BIT(0)
46 
47 #define RTL8201F_ISR				0x1e
48 #define RTL8201F_ISR_ANERR			BIT(15)
49 #define RTL8201F_ISR_DUPLEX			BIT(13)
50 #define RTL8201F_ISR_LINK			BIT(11)
51 #define RTL8201F_ISR_MASK			(RTL8201F_ISR_ANERR | \
52 						 RTL8201F_ISR_DUPLEX | \
53 						 RTL8201F_ISR_LINK)
54 #define RTL8201F_IER				0x13
55 
56 #define RTL8366RB_POWER_SAVE			0x15
57 #define RTL8366RB_POWER_SAVE_ON			BIT(12)
58 
59 #define RTL_SUPPORTS_5000FULL			BIT(14)
60 #define RTL_SUPPORTS_2500FULL			BIT(13)
61 #define RTL_SUPPORTS_10000FULL			BIT(0)
62 #define RTL_ADV_2500FULL			BIT(7)
63 #define RTL_LPADV_10000FULL			BIT(11)
64 #define RTL_LPADV_5000FULL			BIT(6)
65 #define RTL_LPADV_2500FULL			BIT(5)
66 
67 #define RTL9000A_GINMR				0x14
68 #define RTL9000A_GINMR_LINK_STATUS		BIT(4)
69 
70 #define RTLGEN_SPEED_MASK			0x0630
71 
72 #define RTL_GENERIC_PHYID			0x001cc800
73 
74 MODULE_DESCRIPTION("Realtek PHY driver");
75 MODULE_AUTHOR("Johnson Leung");
76 MODULE_LICENSE("GPL");
77 
78 struct rtl821x_priv {
79 	u16 phycr1;
80 	u16 phycr2;
81 };
82 
83 static int rtl821x_read_page(struct phy_device *phydev)
84 {
85 	return __phy_read(phydev, RTL821x_PAGE_SELECT);
86 }
87 
88 static int rtl821x_write_page(struct phy_device *phydev, int page)
89 {
90 	return __phy_write(phydev, RTL821x_PAGE_SELECT, page);
91 }
92 
93 static int rtl821x_probe(struct phy_device *phydev)
94 {
95 	struct device *dev = &phydev->mdio.dev;
96 	struct rtl821x_priv *priv;
97 	int ret;
98 
99 	priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
100 	if (!priv)
101 		return -ENOMEM;
102 
103 	ret = phy_read_paged(phydev, 0xa43, RTL8211F_PHYCR1);
104 	if (ret < 0)
105 		return ret;
106 
107 	priv->phycr1 = ret & (RTL8211F_ALDPS_PLL_OFF | RTL8211F_ALDPS_ENABLE | RTL8211F_ALDPS_XTAL_OFF);
108 	if (of_property_read_bool(dev->of_node, "realtek,aldps-enable"))
109 		priv->phycr1 |= RTL8211F_ALDPS_PLL_OFF | RTL8211F_ALDPS_ENABLE | RTL8211F_ALDPS_XTAL_OFF;
110 
111 	ret = phy_read_paged(phydev, 0xa43, RTL8211F_PHYCR2);
112 	if (ret < 0)
113 		return ret;
114 
115 	priv->phycr2 = ret & RTL8211F_CLKOUT_EN;
116 	if (of_property_read_bool(dev->of_node, "realtek,clkout-disable"))
117 		priv->phycr2 &= ~RTL8211F_CLKOUT_EN;
118 
119 	phydev->priv = priv;
120 
121 	return 0;
122 }
123 
124 static int rtl8201_ack_interrupt(struct phy_device *phydev)
125 {
126 	int err;
127 
128 	err = phy_read(phydev, RTL8201F_ISR);
129 
130 	return (err < 0) ? err : 0;
131 }
132 
133 static int rtl821x_ack_interrupt(struct phy_device *phydev)
134 {
135 	int err;
136 
137 	err = phy_read(phydev, RTL821x_INSR);
138 
139 	return (err < 0) ? err : 0;
140 }
141 
142 static int rtl8211f_ack_interrupt(struct phy_device *phydev)
143 {
144 	int err;
145 
146 	err = phy_read_paged(phydev, 0xa43, RTL8211F_INSR);
147 
148 	return (err < 0) ? err : 0;
149 }
150 
151 static int rtl8201_config_intr(struct phy_device *phydev)
152 {
153 	u16 val;
154 	int err;
155 
156 	if (phydev->interrupts == PHY_INTERRUPT_ENABLED) {
157 		err = rtl8201_ack_interrupt(phydev);
158 		if (err)
159 			return err;
160 
161 		val = BIT(13) | BIT(12) | BIT(11);
162 		err = phy_write_paged(phydev, 0x7, RTL8201F_IER, val);
163 	} else {
164 		val = 0;
165 		err = phy_write_paged(phydev, 0x7, RTL8201F_IER, val);
166 		if (err)
167 			return err;
168 
169 		err = rtl8201_ack_interrupt(phydev);
170 	}
171 
172 	return err;
173 }
174 
175 static int rtl8211b_config_intr(struct phy_device *phydev)
176 {
177 	int err;
178 
179 	if (phydev->interrupts == PHY_INTERRUPT_ENABLED) {
180 		err = rtl821x_ack_interrupt(phydev);
181 		if (err)
182 			return err;
183 
184 		err = phy_write(phydev, RTL821x_INER,
185 				RTL8211B_INER_INIT);
186 	} else {
187 		err = phy_write(phydev, RTL821x_INER, 0);
188 		if (err)
189 			return err;
190 
191 		err = rtl821x_ack_interrupt(phydev);
192 	}
193 
194 	return err;
195 }
196 
197 static int rtl8211e_config_intr(struct phy_device *phydev)
198 {
199 	int err;
200 
201 	if (phydev->interrupts == PHY_INTERRUPT_ENABLED) {
202 		err = rtl821x_ack_interrupt(phydev);
203 		if (err)
204 			return err;
205 
206 		err = phy_write(phydev, RTL821x_INER,
207 				RTL8211E_INER_LINK_STATUS);
208 	} else {
209 		err = phy_write(phydev, RTL821x_INER, 0);
210 		if (err)
211 			return err;
212 
213 		err = rtl821x_ack_interrupt(phydev);
214 	}
215 
216 	return err;
217 }
218 
219 static int rtl8211f_config_intr(struct phy_device *phydev)
220 {
221 	u16 val;
222 	int err;
223 
224 	if (phydev->interrupts == PHY_INTERRUPT_ENABLED) {
225 		err = rtl8211f_ack_interrupt(phydev);
226 		if (err)
227 			return err;
228 
229 		val = RTL8211F_INER_LINK_STATUS;
230 		err = phy_write_paged(phydev, 0xa42, RTL821x_INER, val);
231 	} else {
232 		val = 0;
233 		err = phy_write_paged(phydev, 0xa42, RTL821x_INER, val);
234 		if (err)
235 			return err;
236 
237 		err = rtl8211f_ack_interrupt(phydev);
238 	}
239 
240 	return err;
241 }
242 
243 static irqreturn_t rtl8201_handle_interrupt(struct phy_device *phydev)
244 {
245 	int irq_status;
246 
247 	irq_status = phy_read(phydev, RTL8201F_ISR);
248 	if (irq_status < 0) {
249 		phy_error(phydev);
250 		return IRQ_NONE;
251 	}
252 
253 	if (!(irq_status & RTL8201F_ISR_MASK))
254 		return IRQ_NONE;
255 
256 	phy_trigger_machine(phydev);
257 
258 	return IRQ_HANDLED;
259 }
260 
261 static irqreturn_t rtl821x_handle_interrupt(struct phy_device *phydev)
262 {
263 	int irq_status, irq_enabled;
264 
265 	irq_status = phy_read(phydev, RTL821x_INSR);
266 	if (irq_status < 0) {
267 		phy_error(phydev);
268 		return IRQ_NONE;
269 	}
270 
271 	irq_enabled = phy_read(phydev, RTL821x_INER);
272 	if (irq_enabled < 0) {
273 		phy_error(phydev);
274 		return IRQ_NONE;
275 	}
276 
277 	if (!(irq_status & irq_enabled))
278 		return IRQ_NONE;
279 
280 	phy_trigger_machine(phydev);
281 
282 	return IRQ_HANDLED;
283 }
284 
285 static irqreturn_t rtl8211f_handle_interrupt(struct phy_device *phydev)
286 {
287 	int irq_status;
288 
289 	irq_status = phy_read_paged(phydev, 0xa43, RTL8211F_INSR);
290 	if (irq_status < 0) {
291 		phy_error(phydev);
292 		return IRQ_NONE;
293 	}
294 
295 	if (!(irq_status & RTL8211F_INER_LINK_STATUS))
296 		return IRQ_NONE;
297 
298 	phy_trigger_machine(phydev);
299 
300 	return IRQ_HANDLED;
301 }
302 
303 static int rtl8211_config_aneg(struct phy_device *phydev)
304 {
305 	int ret;
306 
307 	ret = genphy_config_aneg(phydev);
308 	if (ret < 0)
309 		return ret;
310 
311 	/* Quirk was copied from vendor driver. Unfortunately it includes no
312 	 * description of the magic numbers.
313 	 */
314 	if (phydev->speed == SPEED_100 && phydev->autoneg == AUTONEG_DISABLE) {
315 		phy_write(phydev, 0x17, 0x2138);
316 		phy_write(phydev, 0x0e, 0x0260);
317 	} else {
318 		phy_write(phydev, 0x17, 0x2108);
319 		phy_write(phydev, 0x0e, 0x0000);
320 	}
321 
322 	return 0;
323 }
324 
325 static int rtl8211c_config_init(struct phy_device *phydev)
326 {
327 	/* RTL8211C has an issue when operating in Gigabit slave mode */
328 	return phy_set_bits(phydev, MII_CTRL1000,
329 			    CTL1000_ENABLE_MASTER | CTL1000_AS_MASTER);
330 }
331 
332 static int rtl8211f_config_init(struct phy_device *phydev)
333 {
334 	struct rtl821x_priv *priv = phydev->priv;
335 	struct device *dev = &phydev->mdio.dev;
336 	u16 val_txdly, val_rxdly;
337 	int ret;
338 
339 	ret = phy_modify_paged_changed(phydev, 0xa43, RTL8211F_PHYCR1,
340 				       RTL8211F_ALDPS_PLL_OFF | RTL8211F_ALDPS_ENABLE | RTL8211F_ALDPS_XTAL_OFF,
341 				       priv->phycr1);
342 	if (ret < 0) {
343 		dev_err(dev, "aldps mode  configuration failed: %pe\n",
344 			ERR_PTR(ret));
345 		return ret;
346 	}
347 
348 	switch (phydev->interface) {
349 	case PHY_INTERFACE_MODE_RGMII:
350 		val_txdly = 0;
351 		val_rxdly = 0;
352 		break;
353 
354 	case PHY_INTERFACE_MODE_RGMII_RXID:
355 		val_txdly = 0;
356 		val_rxdly = RTL8211F_RX_DELAY;
357 		break;
358 
359 	case PHY_INTERFACE_MODE_RGMII_TXID:
360 		val_txdly = RTL8211F_TX_DELAY;
361 		val_rxdly = 0;
362 		break;
363 
364 	case PHY_INTERFACE_MODE_RGMII_ID:
365 		val_txdly = RTL8211F_TX_DELAY;
366 		val_rxdly = RTL8211F_RX_DELAY;
367 		break;
368 
369 	default: /* the rest of the modes imply leaving delay as is. */
370 		return 0;
371 	}
372 
373 	ret = phy_modify_paged_changed(phydev, 0xd08, 0x11, RTL8211F_TX_DELAY,
374 				       val_txdly);
375 	if (ret < 0) {
376 		dev_err(dev, "Failed to update the TX delay register\n");
377 		return ret;
378 	} else if (ret) {
379 		dev_dbg(dev,
380 			"%s 2ns TX delay (and changing the value from pin-strapping RXD1 or the bootloader)\n",
381 			val_txdly ? "Enabling" : "Disabling");
382 	} else {
383 		dev_dbg(dev,
384 			"2ns TX delay was already %s (by pin-strapping RXD1 or bootloader configuration)\n",
385 			val_txdly ? "enabled" : "disabled");
386 	}
387 
388 	ret = phy_modify_paged_changed(phydev, 0xd08, 0x15, RTL8211F_RX_DELAY,
389 				       val_rxdly);
390 	if (ret < 0) {
391 		dev_err(dev, "Failed to update the RX delay register\n");
392 		return ret;
393 	} else if (ret) {
394 		dev_dbg(dev,
395 			"%s 2ns RX delay (and changing the value from pin-strapping RXD0 or the bootloader)\n",
396 			val_rxdly ? "Enabling" : "Disabling");
397 	} else {
398 		dev_dbg(dev,
399 			"2ns RX delay was already %s (by pin-strapping RXD0 or bootloader configuration)\n",
400 			val_rxdly ? "enabled" : "disabled");
401 	}
402 
403 	ret = phy_modify_paged(phydev, 0xa43, RTL8211F_PHYCR2,
404 			       RTL8211F_CLKOUT_EN, priv->phycr2);
405 	if (ret < 0) {
406 		dev_err(dev, "clkout configuration failed: %pe\n",
407 			ERR_PTR(ret));
408 		return ret;
409 	}
410 
411 	return genphy_soft_reset(phydev);
412 }
413 
414 static int rtl821x_resume(struct phy_device *phydev)
415 {
416 	int ret;
417 
418 	ret = genphy_resume(phydev);
419 	if (ret < 0)
420 		return ret;
421 
422 	msleep(20);
423 
424 	return 0;
425 }
426 
427 static int rtl8211e_config_init(struct phy_device *phydev)
428 {
429 	int ret = 0, oldpage;
430 	u16 val;
431 
432 	/* enable TX/RX delay for rgmii-* modes, and disable them for rgmii. */
433 	switch (phydev->interface) {
434 	case PHY_INTERFACE_MODE_RGMII:
435 		val = RTL8211E_CTRL_DELAY | 0;
436 		break;
437 	case PHY_INTERFACE_MODE_RGMII_ID:
438 		val = RTL8211E_CTRL_DELAY | RTL8211E_TX_DELAY | RTL8211E_RX_DELAY;
439 		break;
440 	case PHY_INTERFACE_MODE_RGMII_RXID:
441 		val = RTL8211E_CTRL_DELAY | RTL8211E_RX_DELAY;
442 		break;
443 	case PHY_INTERFACE_MODE_RGMII_TXID:
444 		val = RTL8211E_CTRL_DELAY | RTL8211E_TX_DELAY;
445 		break;
446 	default: /* the rest of the modes imply leaving delays as is. */
447 		return 0;
448 	}
449 
450 	/* According to a sample driver there is a 0x1c config register on the
451 	 * 0xa4 extension page (0x7) layout. It can be used to disable/enable
452 	 * the RX/TX delays otherwise controlled by RXDLY/TXDLY pins.
453 	 * The configuration register definition:
454 	 * 14 = reserved
455 	 * 13 = Force Tx RX Delay controlled by bit12 bit11,
456 	 * 12 = RX Delay, 11 = TX Delay
457 	 * 10:0 = Test && debug settings reserved by realtek
458 	 */
459 	oldpage = phy_select_page(phydev, 0x7);
460 	if (oldpage < 0)
461 		goto err_restore_page;
462 
463 	ret = __phy_write(phydev, RTL821x_EXT_PAGE_SELECT, 0xa4);
464 	if (ret)
465 		goto err_restore_page;
466 
467 	ret = __phy_modify(phydev, 0x1c, RTL8211E_CTRL_DELAY
468 			   | RTL8211E_TX_DELAY | RTL8211E_RX_DELAY,
469 			   val);
470 
471 err_restore_page:
472 	return phy_restore_page(phydev, oldpage, ret);
473 }
474 
475 static int rtl8211b_suspend(struct phy_device *phydev)
476 {
477 	phy_write(phydev, MII_MMD_DATA, BIT(9));
478 
479 	return genphy_suspend(phydev);
480 }
481 
482 static int rtl8211b_resume(struct phy_device *phydev)
483 {
484 	phy_write(phydev, MII_MMD_DATA, 0);
485 
486 	return genphy_resume(phydev);
487 }
488 
489 static int rtl8366rb_config_init(struct phy_device *phydev)
490 {
491 	int ret;
492 
493 	ret = phy_set_bits(phydev, RTL8366RB_POWER_SAVE,
494 			   RTL8366RB_POWER_SAVE_ON);
495 	if (ret) {
496 		dev_err(&phydev->mdio.dev,
497 			"error enabling power management\n");
498 	}
499 
500 	return ret;
501 }
502 
503 /* get actual speed to cover the downshift case */
504 static int rtlgen_get_speed(struct phy_device *phydev)
505 {
506 	int val;
507 
508 	if (!phydev->link)
509 		return 0;
510 
511 	val = phy_read_paged(phydev, 0xa43, 0x12);
512 	if (val < 0)
513 		return val;
514 
515 	switch (val & RTLGEN_SPEED_MASK) {
516 	case 0x0000:
517 		phydev->speed = SPEED_10;
518 		break;
519 	case 0x0010:
520 		phydev->speed = SPEED_100;
521 		break;
522 	case 0x0020:
523 		phydev->speed = SPEED_1000;
524 		break;
525 	case 0x0200:
526 		phydev->speed = SPEED_10000;
527 		break;
528 	case 0x0210:
529 		phydev->speed = SPEED_2500;
530 		break;
531 	case 0x0220:
532 		phydev->speed = SPEED_5000;
533 		break;
534 	default:
535 		break;
536 	}
537 
538 	return 0;
539 }
540 
541 static int rtlgen_read_status(struct phy_device *phydev)
542 {
543 	int ret;
544 
545 	ret = genphy_read_status(phydev);
546 	if (ret < 0)
547 		return ret;
548 
549 	return rtlgen_get_speed(phydev);
550 }
551 
552 static int rtlgen_read_mmd(struct phy_device *phydev, int devnum, u16 regnum)
553 {
554 	int ret;
555 
556 	if (devnum == MDIO_MMD_PCS && regnum == MDIO_PCS_EEE_ABLE) {
557 		rtl821x_write_page(phydev, 0xa5c);
558 		ret = __phy_read(phydev, 0x12);
559 		rtl821x_write_page(phydev, 0);
560 	} else if (devnum == MDIO_MMD_AN && regnum == MDIO_AN_EEE_ADV) {
561 		rtl821x_write_page(phydev, 0xa5d);
562 		ret = __phy_read(phydev, 0x10);
563 		rtl821x_write_page(phydev, 0);
564 	} else if (devnum == MDIO_MMD_AN && regnum == MDIO_AN_EEE_LPABLE) {
565 		rtl821x_write_page(phydev, 0xa5d);
566 		ret = __phy_read(phydev, 0x11);
567 		rtl821x_write_page(phydev, 0);
568 	} else {
569 		ret = -EOPNOTSUPP;
570 	}
571 
572 	return ret;
573 }
574 
575 static int rtlgen_write_mmd(struct phy_device *phydev, int devnum, u16 regnum,
576 			    u16 val)
577 {
578 	int ret;
579 
580 	if (devnum == MDIO_MMD_AN && regnum == MDIO_AN_EEE_ADV) {
581 		rtl821x_write_page(phydev, 0xa5d);
582 		ret = __phy_write(phydev, 0x10, val);
583 		rtl821x_write_page(phydev, 0);
584 	} else {
585 		ret = -EOPNOTSUPP;
586 	}
587 
588 	return ret;
589 }
590 
591 static int rtl822x_read_mmd(struct phy_device *phydev, int devnum, u16 regnum)
592 {
593 	int ret = rtlgen_read_mmd(phydev, devnum, regnum);
594 
595 	if (ret != -EOPNOTSUPP)
596 		return ret;
597 
598 	if (devnum == MDIO_MMD_PCS && regnum == MDIO_PCS_EEE_ABLE2) {
599 		rtl821x_write_page(phydev, 0xa6e);
600 		ret = __phy_read(phydev, 0x16);
601 		rtl821x_write_page(phydev, 0);
602 	} else if (devnum == MDIO_MMD_AN && regnum == MDIO_AN_EEE_ADV2) {
603 		rtl821x_write_page(phydev, 0xa6d);
604 		ret = __phy_read(phydev, 0x12);
605 		rtl821x_write_page(phydev, 0);
606 	} else if (devnum == MDIO_MMD_AN && regnum == MDIO_AN_EEE_LPABLE2) {
607 		rtl821x_write_page(phydev, 0xa6d);
608 		ret = __phy_read(phydev, 0x10);
609 		rtl821x_write_page(phydev, 0);
610 	}
611 
612 	return ret;
613 }
614 
615 static int rtl822x_write_mmd(struct phy_device *phydev, int devnum, u16 regnum,
616 			     u16 val)
617 {
618 	int ret = rtlgen_write_mmd(phydev, devnum, regnum, val);
619 
620 	if (ret != -EOPNOTSUPP)
621 		return ret;
622 
623 	if (devnum == MDIO_MMD_AN && regnum == MDIO_AN_EEE_ADV2) {
624 		rtl821x_write_page(phydev, 0xa6d);
625 		ret = __phy_write(phydev, 0x12, val);
626 		rtl821x_write_page(phydev, 0);
627 	}
628 
629 	return ret;
630 }
631 
632 static int rtl822x_get_features(struct phy_device *phydev)
633 {
634 	int val;
635 
636 	val = phy_read_paged(phydev, 0xa61, 0x13);
637 	if (val < 0)
638 		return val;
639 
640 	linkmode_mod_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT,
641 			 phydev->supported, val & RTL_SUPPORTS_2500FULL);
642 	linkmode_mod_bit(ETHTOOL_LINK_MODE_5000baseT_Full_BIT,
643 			 phydev->supported, val & RTL_SUPPORTS_5000FULL);
644 	linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseT_Full_BIT,
645 			 phydev->supported, val & RTL_SUPPORTS_10000FULL);
646 
647 	return genphy_read_abilities(phydev);
648 }
649 
650 static int rtl822x_config_aneg(struct phy_device *phydev)
651 {
652 	int ret = 0;
653 
654 	if (phydev->autoneg == AUTONEG_ENABLE) {
655 		u16 adv2500 = 0;
656 
657 		if (linkmode_test_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT,
658 				      phydev->advertising))
659 			adv2500 = RTL_ADV_2500FULL;
660 
661 		ret = phy_modify_paged_changed(phydev, 0xa5d, 0x12,
662 					       RTL_ADV_2500FULL, adv2500);
663 		if (ret < 0)
664 			return ret;
665 	}
666 
667 	return __genphy_config_aneg(phydev, ret);
668 }
669 
670 static int rtl822x_read_status(struct phy_device *phydev)
671 {
672 	int ret;
673 
674 	if (phydev->autoneg == AUTONEG_ENABLE) {
675 		int lpadv = phy_read_paged(phydev, 0xa5d, 0x13);
676 
677 		if (lpadv < 0)
678 			return lpadv;
679 
680 		linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseT_Full_BIT,
681 			phydev->lp_advertising, lpadv & RTL_LPADV_10000FULL);
682 		linkmode_mod_bit(ETHTOOL_LINK_MODE_5000baseT_Full_BIT,
683 			phydev->lp_advertising, lpadv & RTL_LPADV_5000FULL);
684 		linkmode_mod_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT,
685 			phydev->lp_advertising, lpadv & RTL_LPADV_2500FULL);
686 	}
687 
688 	ret = genphy_read_status(phydev);
689 	if (ret < 0)
690 		return ret;
691 
692 	return rtlgen_get_speed(phydev);
693 }
694 
695 static bool rtlgen_supports_2_5gbps(struct phy_device *phydev)
696 {
697 	int val;
698 
699 	phy_write(phydev, RTL821x_PAGE_SELECT, 0xa61);
700 	val = phy_read(phydev, 0x13);
701 	phy_write(phydev, RTL821x_PAGE_SELECT, 0);
702 
703 	return val >= 0 && val & RTL_SUPPORTS_2500FULL;
704 }
705 
706 static int rtlgen_match_phy_device(struct phy_device *phydev)
707 {
708 	return phydev->phy_id == RTL_GENERIC_PHYID &&
709 	       !rtlgen_supports_2_5gbps(phydev);
710 }
711 
712 static int rtl8226_match_phy_device(struct phy_device *phydev)
713 {
714 	return phydev->phy_id == RTL_GENERIC_PHYID &&
715 	       rtlgen_supports_2_5gbps(phydev);
716 }
717 
718 static int rtlgen_resume(struct phy_device *phydev)
719 {
720 	int ret = genphy_resume(phydev);
721 
722 	/* Internal PHY's from RTL8168h up may not be instantly ready */
723 	msleep(20);
724 
725 	return ret;
726 }
727 
728 static int rtl9000a_config_init(struct phy_device *phydev)
729 {
730 	phydev->autoneg = AUTONEG_DISABLE;
731 	phydev->speed = SPEED_100;
732 	phydev->duplex = DUPLEX_FULL;
733 
734 	return 0;
735 }
736 
737 static int rtl9000a_config_aneg(struct phy_device *phydev)
738 {
739 	int ret;
740 	u16 ctl = 0;
741 
742 	switch (phydev->master_slave_set) {
743 	case MASTER_SLAVE_CFG_MASTER_FORCE:
744 		ctl |= CTL1000_AS_MASTER;
745 		break;
746 	case MASTER_SLAVE_CFG_SLAVE_FORCE:
747 		break;
748 	case MASTER_SLAVE_CFG_UNKNOWN:
749 	case MASTER_SLAVE_CFG_UNSUPPORTED:
750 		return 0;
751 	default:
752 		phydev_warn(phydev, "Unsupported Master/Slave mode\n");
753 		return -EOPNOTSUPP;
754 	}
755 
756 	ret = phy_modify_changed(phydev, MII_CTRL1000, CTL1000_AS_MASTER, ctl);
757 	if (ret == 1)
758 		ret = genphy_soft_reset(phydev);
759 
760 	return ret;
761 }
762 
763 static int rtl9000a_read_status(struct phy_device *phydev)
764 {
765 	int ret;
766 
767 	phydev->master_slave_get = MASTER_SLAVE_CFG_UNKNOWN;
768 	phydev->master_slave_state = MASTER_SLAVE_STATE_UNKNOWN;
769 
770 	ret = genphy_update_link(phydev);
771 	if (ret)
772 		return ret;
773 
774 	ret = phy_read(phydev, MII_CTRL1000);
775 	if (ret < 0)
776 		return ret;
777 	if (ret & CTL1000_AS_MASTER)
778 		phydev->master_slave_get = MASTER_SLAVE_CFG_MASTER_FORCE;
779 	else
780 		phydev->master_slave_get = MASTER_SLAVE_CFG_SLAVE_FORCE;
781 
782 	ret = phy_read(phydev, MII_STAT1000);
783 	if (ret < 0)
784 		return ret;
785 	if (ret & LPA_1000MSRES)
786 		phydev->master_slave_state = MASTER_SLAVE_STATE_MASTER;
787 	else
788 		phydev->master_slave_state = MASTER_SLAVE_STATE_SLAVE;
789 
790 	return 0;
791 }
792 
793 static int rtl9000a_ack_interrupt(struct phy_device *phydev)
794 {
795 	int err;
796 
797 	err = phy_read(phydev, RTL8211F_INSR);
798 
799 	return (err < 0) ? err : 0;
800 }
801 
802 static int rtl9000a_config_intr(struct phy_device *phydev)
803 {
804 	u16 val;
805 	int err;
806 
807 	if (phydev->interrupts == PHY_INTERRUPT_ENABLED) {
808 		err = rtl9000a_ack_interrupt(phydev);
809 		if (err)
810 			return err;
811 
812 		val = (u16)~RTL9000A_GINMR_LINK_STATUS;
813 		err = phy_write_paged(phydev, 0xa42, RTL9000A_GINMR, val);
814 	} else {
815 		val = ~0;
816 		err = phy_write_paged(phydev, 0xa42, RTL9000A_GINMR, val);
817 		if (err)
818 			return err;
819 
820 		err = rtl9000a_ack_interrupt(phydev);
821 	}
822 
823 	return phy_write_paged(phydev, 0xa42, RTL9000A_GINMR, val);
824 }
825 
826 static irqreturn_t rtl9000a_handle_interrupt(struct phy_device *phydev)
827 {
828 	int irq_status;
829 
830 	irq_status = phy_read(phydev, RTL8211F_INSR);
831 	if (irq_status < 0) {
832 		phy_error(phydev);
833 		return IRQ_NONE;
834 	}
835 
836 	if (!(irq_status & RTL8211F_INER_LINK_STATUS))
837 		return IRQ_NONE;
838 
839 	phy_trigger_machine(phydev);
840 
841 	return IRQ_HANDLED;
842 }
843 
844 static struct phy_driver realtek_drvs[] = {
845 	{
846 		PHY_ID_MATCH_EXACT(0x00008201),
847 		.name           = "RTL8201CP Ethernet",
848 		.read_page	= rtl821x_read_page,
849 		.write_page	= rtl821x_write_page,
850 	}, {
851 		PHY_ID_MATCH_EXACT(0x001cc816),
852 		.name		= "RTL8201F Fast Ethernet",
853 		.config_intr	= &rtl8201_config_intr,
854 		.handle_interrupt = rtl8201_handle_interrupt,
855 		.suspend	= genphy_suspend,
856 		.resume		= genphy_resume,
857 		.read_page	= rtl821x_read_page,
858 		.write_page	= rtl821x_write_page,
859 	}, {
860 		PHY_ID_MATCH_MODEL(0x001cc880),
861 		.name		= "RTL8208 Fast Ethernet",
862 		.read_mmd	= genphy_read_mmd_unsupported,
863 		.write_mmd	= genphy_write_mmd_unsupported,
864 		.suspend	= genphy_suspend,
865 		.resume		= genphy_resume,
866 		.read_page	= rtl821x_read_page,
867 		.write_page	= rtl821x_write_page,
868 	}, {
869 		PHY_ID_MATCH_EXACT(0x001cc910),
870 		.name		= "RTL8211 Gigabit Ethernet",
871 		.config_aneg	= rtl8211_config_aneg,
872 		.read_mmd	= &genphy_read_mmd_unsupported,
873 		.write_mmd	= &genphy_write_mmd_unsupported,
874 		.read_page	= rtl821x_read_page,
875 		.write_page	= rtl821x_write_page,
876 	}, {
877 		PHY_ID_MATCH_EXACT(0x001cc912),
878 		.name		= "RTL8211B Gigabit Ethernet",
879 		.config_intr	= &rtl8211b_config_intr,
880 		.handle_interrupt = rtl821x_handle_interrupt,
881 		.read_mmd	= &genphy_read_mmd_unsupported,
882 		.write_mmd	= &genphy_write_mmd_unsupported,
883 		.suspend	= rtl8211b_suspend,
884 		.resume		= rtl8211b_resume,
885 		.read_page	= rtl821x_read_page,
886 		.write_page	= rtl821x_write_page,
887 	}, {
888 		PHY_ID_MATCH_EXACT(0x001cc913),
889 		.name		= "RTL8211C Gigabit Ethernet",
890 		.config_init	= rtl8211c_config_init,
891 		.read_mmd	= &genphy_read_mmd_unsupported,
892 		.write_mmd	= &genphy_write_mmd_unsupported,
893 		.read_page	= rtl821x_read_page,
894 		.write_page	= rtl821x_write_page,
895 	}, {
896 		PHY_ID_MATCH_EXACT(0x001cc914),
897 		.name		= "RTL8211DN Gigabit Ethernet",
898 		.config_intr	= rtl8211e_config_intr,
899 		.handle_interrupt = rtl821x_handle_interrupt,
900 		.suspend	= genphy_suspend,
901 		.resume		= genphy_resume,
902 		.read_page	= rtl821x_read_page,
903 		.write_page	= rtl821x_write_page,
904 	}, {
905 		PHY_ID_MATCH_EXACT(0x001cc915),
906 		.name		= "RTL8211E Gigabit Ethernet",
907 		.config_init	= &rtl8211e_config_init,
908 		.config_intr	= &rtl8211e_config_intr,
909 		.handle_interrupt = rtl821x_handle_interrupt,
910 		.suspend	= genphy_suspend,
911 		.resume		= genphy_resume,
912 		.read_page	= rtl821x_read_page,
913 		.write_page	= rtl821x_write_page,
914 	}, {
915 		PHY_ID_MATCH_EXACT(0x001cc916),
916 		.name		= "RTL8211F Gigabit Ethernet",
917 		.probe		= rtl821x_probe,
918 		.config_init	= &rtl8211f_config_init,
919 		.read_status	= rtlgen_read_status,
920 		.config_intr	= &rtl8211f_config_intr,
921 		.handle_interrupt = rtl8211f_handle_interrupt,
922 		.suspend	= genphy_suspend,
923 		.resume		= rtl821x_resume,
924 		.read_page	= rtl821x_read_page,
925 		.write_page	= rtl821x_write_page,
926 	}, {
927 		.name		= "Generic FE-GE Realtek PHY",
928 		.match_phy_device = rtlgen_match_phy_device,
929 		.read_status	= rtlgen_read_status,
930 		.suspend	= genphy_suspend,
931 		.resume		= rtlgen_resume,
932 		.read_page	= rtl821x_read_page,
933 		.write_page	= rtl821x_write_page,
934 		.read_mmd	= rtlgen_read_mmd,
935 		.write_mmd	= rtlgen_write_mmd,
936 	}, {
937 		.name		= "RTL8226 2.5Gbps PHY",
938 		.match_phy_device = rtl8226_match_phy_device,
939 		.get_features	= rtl822x_get_features,
940 		.config_aneg	= rtl822x_config_aneg,
941 		.read_status	= rtl822x_read_status,
942 		.suspend	= genphy_suspend,
943 		.resume		= rtlgen_resume,
944 		.read_page	= rtl821x_read_page,
945 		.write_page	= rtl821x_write_page,
946 		.read_mmd	= rtl822x_read_mmd,
947 		.write_mmd	= rtl822x_write_mmd,
948 	}, {
949 		PHY_ID_MATCH_EXACT(0x001cc840),
950 		.name		= "RTL8226B_RTL8221B 2.5Gbps PHY",
951 		.get_features	= rtl822x_get_features,
952 		.config_aneg	= rtl822x_config_aneg,
953 		.read_status	= rtl822x_read_status,
954 		.suspend	= genphy_suspend,
955 		.resume		= rtlgen_resume,
956 		.read_page	= rtl821x_read_page,
957 		.write_page	= rtl821x_write_page,
958 		.read_mmd	= rtl822x_read_mmd,
959 		.write_mmd	= rtl822x_write_mmd,
960 	}, {
961 		PHY_ID_MATCH_EXACT(0x001cc838),
962 		.name           = "RTL8226-CG 2.5Gbps PHY",
963 		.get_features   = rtl822x_get_features,
964 		.config_aneg    = rtl822x_config_aneg,
965 		.read_status    = rtl822x_read_status,
966 		.suspend        = genphy_suspend,
967 		.resume         = rtlgen_resume,
968 		.read_page      = rtl821x_read_page,
969 		.write_page     = rtl821x_write_page,
970 	}, {
971 		PHY_ID_MATCH_EXACT(0x001cc848),
972 		.name           = "RTL8226B-CG_RTL8221B-CG 2.5Gbps PHY",
973 		.get_features   = rtl822x_get_features,
974 		.config_aneg    = rtl822x_config_aneg,
975 		.read_status    = rtl822x_read_status,
976 		.suspend        = genphy_suspend,
977 		.resume         = rtlgen_resume,
978 		.read_page      = rtl821x_read_page,
979 		.write_page     = rtl821x_write_page,
980 	}, {
981 		PHY_ID_MATCH_EXACT(0x001cc849),
982 		.name           = "RTL8221B-VB-CG 2.5Gbps PHY",
983 		.get_features   = rtl822x_get_features,
984 		.config_aneg    = rtl822x_config_aneg,
985 		.read_status    = rtl822x_read_status,
986 		.suspend        = genphy_suspend,
987 		.resume         = rtlgen_resume,
988 		.read_page      = rtl821x_read_page,
989 		.write_page     = rtl821x_write_page,
990 	}, {
991 		PHY_ID_MATCH_EXACT(0x001cc84a),
992 		.name           = "RTL8221B-VM-CG 2.5Gbps PHY",
993 		.get_features   = rtl822x_get_features,
994 		.config_aneg    = rtl822x_config_aneg,
995 		.read_status    = rtl822x_read_status,
996 		.suspend        = genphy_suspend,
997 		.resume         = rtlgen_resume,
998 		.read_page      = rtl821x_read_page,
999 		.write_page     = rtl821x_write_page,
1000 	}, {
1001 		PHY_ID_MATCH_EXACT(0x001cc961),
1002 		.name		= "RTL8366RB Gigabit Ethernet",
1003 		.config_init	= &rtl8366rb_config_init,
1004 		/* These interrupts are handled by the irq controller
1005 		 * embedded inside the RTL8366RB, they get unmasked when the
1006 		 * irq is requested and ACKed by reading the status register,
1007 		 * which is done by the irqchip code.
1008 		 */
1009 		.config_intr	= genphy_no_config_intr,
1010 		.handle_interrupt = genphy_handle_interrupt_no_ack,
1011 		.suspend	= genphy_suspend,
1012 		.resume		= genphy_resume,
1013 	}, {
1014 		PHY_ID_MATCH_EXACT(0x001ccb00),
1015 		.name		= "RTL9000AA_RTL9000AN Ethernet",
1016 		.features       = PHY_BASIC_T1_FEATURES,
1017 		.config_init	= rtl9000a_config_init,
1018 		.config_aneg	= rtl9000a_config_aneg,
1019 		.read_status	= rtl9000a_read_status,
1020 		.config_intr	= rtl9000a_config_intr,
1021 		.handle_interrupt = rtl9000a_handle_interrupt,
1022 		.suspend	= genphy_suspend,
1023 		.resume		= genphy_resume,
1024 		.read_page	= rtl821x_read_page,
1025 		.write_page	= rtl821x_write_page,
1026 	}, {
1027 		PHY_ID_MATCH_EXACT(0x001cc942),
1028 		.name		= "RTL8365MB-VC Gigabit Ethernet",
1029 		/* Interrupt handling analogous to RTL8366RB */
1030 		.config_intr	= genphy_no_config_intr,
1031 		.handle_interrupt = genphy_handle_interrupt_no_ack,
1032 		.suspend	= genphy_suspend,
1033 		.resume		= genphy_resume,
1034 	},
1035 };
1036 
1037 module_phy_driver(realtek_drvs);
1038 
1039 static const struct mdio_device_id __maybe_unused realtek_tbl[] = {
1040 	{ PHY_ID_MATCH_VENDOR(0x001cc800) },
1041 	{ }
1042 };
1043 
1044 MODULE_DEVICE_TABLE(mdio, realtek_tbl);
1045