xref: /openbmc/linux/drivers/net/phy/phy-c45.c (revision ee7da21a)
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Clause 45 PHY support
4  */
5 #include <linux/ethtool.h>
6 #include <linux/export.h>
7 #include <linux/mdio.h>
8 #include <linux/mii.h>
9 #include <linux/phy.h>
10 
11 /**
12  * genphy_c45_pma_can_sleep - checks if the PMA have sleep support
13  * @phydev: target phy_device struct
14  */
15 static bool genphy_c45_pma_can_sleep(struct phy_device *phydev)
16 {
17 	int stat1;
18 
19 	stat1 = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_STAT1);
20 	if (stat1 < 0)
21 		return false;
22 
23 	return !!(stat1 & MDIO_STAT1_LPOWERABLE);
24 }
25 
26 /**
27  * genphy_c45_pma_resume - wakes up the PMA module
28  * @phydev: target phy_device struct
29  */
30 int genphy_c45_pma_resume(struct phy_device *phydev)
31 {
32 	if (!genphy_c45_pma_can_sleep(phydev))
33 		return -EOPNOTSUPP;
34 
35 	return phy_clear_bits_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_CTRL1,
36 				  MDIO_CTRL1_LPOWER);
37 }
38 EXPORT_SYMBOL_GPL(genphy_c45_pma_resume);
39 
40 /**
41  * genphy_c45_pma_suspend - suspends the PMA module
42  * @phydev: target phy_device struct
43  */
44 int genphy_c45_pma_suspend(struct phy_device *phydev)
45 {
46 	if (!genphy_c45_pma_can_sleep(phydev))
47 		return -EOPNOTSUPP;
48 
49 	return phy_set_bits_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_CTRL1,
50 				MDIO_CTRL1_LPOWER);
51 }
52 EXPORT_SYMBOL_GPL(genphy_c45_pma_suspend);
53 
54 /**
55  * genphy_c45_pma_setup_forced - configures a forced speed
56  * @phydev: target phy_device struct
57  */
58 int genphy_c45_pma_setup_forced(struct phy_device *phydev)
59 {
60 	int ctrl1, ctrl2, ret;
61 
62 	/* Half duplex is not supported */
63 	if (phydev->duplex != DUPLEX_FULL)
64 		return -EINVAL;
65 
66 	ctrl1 = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_CTRL1);
67 	if (ctrl1 < 0)
68 		return ctrl1;
69 
70 	ctrl2 = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_CTRL2);
71 	if (ctrl2 < 0)
72 		return ctrl2;
73 
74 	ctrl1 &= ~MDIO_CTRL1_SPEEDSEL;
75 	/*
76 	 * PMA/PMD type selection is 1.7.5:0 not 1.7.3:0.  See 45.2.1.6.1
77 	 * in 802.3-2012 and 802.3-2015.
78 	 */
79 	ctrl2 &= ~(MDIO_PMA_CTRL2_TYPE | 0x30);
80 
81 	switch (phydev->speed) {
82 	case SPEED_10:
83 		ctrl2 |= MDIO_PMA_CTRL2_10BT;
84 		break;
85 	case SPEED_100:
86 		ctrl1 |= MDIO_PMA_CTRL1_SPEED100;
87 		ctrl2 |= MDIO_PMA_CTRL2_100BTX;
88 		break;
89 	case SPEED_1000:
90 		ctrl1 |= MDIO_PMA_CTRL1_SPEED1000;
91 		/* Assume 1000base-T */
92 		ctrl2 |= MDIO_PMA_CTRL2_1000BT;
93 		break;
94 	case SPEED_2500:
95 		ctrl1 |= MDIO_CTRL1_SPEED2_5G;
96 		/* Assume 2.5Gbase-T */
97 		ctrl2 |= MDIO_PMA_CTRL2_2_5GBT;
98 		break;
99 	case SPEED_5000:
100 		ctrl1 |= MDIO_CTRL1_SPEED5G;
101 		/* Assume 5Gbase-T */
102 		ctrl2 |= MDIO_PMA_CTRL2_5GBT;
103 		break;
104 	case SPEED_10000:
105 		ctrl1 |= MDIO_CTRL1_SPEED10G;
106 		/* Assume 10Gbase-T */
107 		ctrl2 |= MDIO_PMA_CTRL2_10GBT;
108 		break;
109 	default:
110 		return -EINVAL;
111 	}
112 
113 	ret = phy_write_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_CTRL1, ctrl1);
114 	if (ret < 0)
115 		return ret;
116 
117 	ret = phy_write_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_CTRL2, ctrl2);
118 	if (ret < 0)
119 		return ret;
120 
121 	return genphy_c45_an_disable_aneg(phydev);
122 }
123 EXPORT_SYMBOL_GPL(genphy_c45_pma_setup_forced);
124 
125 /**
126  * genphy_c45_an_config_aneg - configure advertisement registers
127  * @phydev: target phy_device struct
128  *
129  * Configure advertisement registers based on modes set in phydev->advertising
130  *
131  * Returns negative errno code on failure, 0 if advertisement didn't change,
132  * or 1 if advertised modes changed.
133  */
134 int genphy_c45_an_config_aneg(struct phy_device *phydev)
135 {
136 	int changed, ret;
137 	u32 adv;
138 
139 	linkmode_and(phydev->advertising, phydev->advertising,
140 		     phydev->supported);
141 
142 	changed = genphy_config_eee_advert(phydev);
143 
144 	adv = linkmode_adv_to_mii_adv_t(phydev->advertising);
145 
146 	ret = phy_modify_mmd_changed(phydev, MDIO_MMD_AN, MDIO_AN_ADVERTISE,
147 				     ADVERTISE_ALL | ADVERTISE_100BASE4 |
148 				     ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM,
149 				     adv);
150 	if (ret < 0)
151 		return ret;
152 	if (ret > 0)
153 		changed = 1;
154 
155 	adv = linkmode_adv_to_mii_10gbt_adv_t(phydev->advertising);
156 
157 	ret = phy_modify_mmd_changed(phydev, MDIO_MMD_AN, MDIO_AN_10GBT_CTRL,
158 				     MDIO_AN_10GBT_CTRL_ADV10G |
159 				     MDIO_AN_10GBT_CTRL_ADV5G |
160 				     MDIO_AN_10GBT_CTRL_ADV2_5G, adv);
161 	if (ret < 0)
162 		return ret;
163 	if (ret > 0)
164 		changed = 1;
165 
166 	return changed;
167 }
168 EXPORT_SYMBOL_GPL(genphy_c45_an_config_aneg);
169 
170 /**
171  * genphy_c45_an_disable_aneg - disable auto-negotiation
172  * @phydev: target phy_device struct
173  *
174  * Disable auto-negotiation in the Clause 45 PHY. The link parameters
175  * are controlled through the PMA/PMD MMD registers.
176  *
177  * Returns zero on success, negative errno code on failure.
178  */
179 int genphy_c45_an_disable_aneg(struct phy_device *phydev)
180 {
181 
182 	return phy_clear_bits_mmd(phydev, MDIO_MMD_AN, MDIO_CTRL1,
183 				  MDIO_AN_CTRL1_ENABLE | MDIO_AN_CTRL1_RESTART);
184 }
185 EXPORT_SYMBOL_GPL(genphy_c45_an_disable_aneg);
186 
187 /**
188  * genphy_c45_restart_aneg - Enable and restart auto-negotiation
189  * @phydev: target phy_device struct
190  *
191  * This assumes that the auto-negotiation MMD is present.
192  *
193  * Enable and restart auto-negotiation.
194  */
195 int genphy_c45_restart_aneg(struct phy_device *phydev)
196 {
197 	return phy_set_bits_mmd(phydev, MDIO_MMD_AN, MDIO_CTRL1,
198 				MDIO_AN_CTRL1_ENABLE | MDIO_AN_CTRL1_RESTART);
199 }
200 EXPORT_SYMBOL_GPL(genphy_c45_restart_aneg);
201 
202 /**
203  * genphy_c45_check_and_restart_aneg - Enable and restart auto-negotiation
204  * @phydev: target phy_device struct
205  * @restart: whether aneg restart is requested
206  *
207  * This assumes that the auto-negotiation MMD is present.
208  *
209  * Check, and restart auto-negotiation if needed.
210  */
211 int genphy_c45_check_and_restart_aneg(struct phy_device *phydev, bool restart)
212 {
213 	int ret;
214 
215 	if (!restart) {
216 		/* Configure and restart aneg if it wasn't set before */
217 		ret = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_CTRL1);
218 		if (ret < 0)
219 			return ret;
220 
221 		if (!(ret & MDIO_AN_CTRL1_ENABLE))
222 			restart = true;
223 	}
224 
225 	if (restart)
226 		return genphy_c45_restart_aneg(phydev);
227 
228 	return 0;
229 }
230 EXPORT_SYMBOL_GPL(genphy_c45_check_and_restart_aneg);
231 
232 /**
233  * genphy_c45_aneg_done - return auto-negotiation complete status
234  * @phydev: target phy_device struct
235  *
236  * This assumes that the auto-negotiation MMD is present.
237  *
238  * Reads the status register from the auto-negotiation MMD, returning:
239  * - positive if auto-negotiation is complete
240  * - negative errno code on error
241  * - zero otherwise
242  */
243 int genphy_c45_aneg_done(struct phy_device *phydev)
244 {
245 	int val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_STAT1);
246 
247 	return val < 0 ? val : val & MDIO_AN_STAT1_COMPLETE ? 1 : 0;
248 }
249 EXPORT_SYMBOL_GPL(genphy_c45_aneg_done);
250 
251 /**
252  * genphy_c45_read_link - read the overall link status from the MMDs
253  * @phydev: target phy_device struct
254  *
255  * Read the link status from the specified MMDs, and if they all indicate
256  * that the link is up, set phydev->link to 1.  If an error is encountered,
257  * a negative errno will be returned, otherwise zero.
258  */
259 int genphy_c45_read_link(struct phy_device *phydev)
260 {
261 	u32 mmd_mask = MDIO_DEVS_PMAPMD;
262 	int val, devad;
263 	bool link = true;
264 
265 	if (phydev->c45_ids.mmds_present & MDIO_DEVS_AN) {
266 		val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_CTRL1);
267 		if (val < 0)
268 			return val;
269 
270 		/* Autoneg is being started, therefore disregard current
271 		 * link status and report link as down.
272 		 */
273 		if (val & MDIO_AN_CTRL1_RESTART) {
274 			phydev->link = 0;
275 			return 0;
276 		}
277 	}
278 
279 	while (mmd_mask && link) {
280 		devad = __ffs(mmd_mask);
281 		mmd_mask &= ~BIT(devad);
282 
283 		/* The link state is latched low so that momentary link
284 		 * drops can be detected. Do not double-read the status
285 		 * in polling mode to detect such short link drops except
286 		 * the link was already down.
287 		 */
288 		if (!phy_polling_mode(phydev) || !phydev->link) {
289 			val = phy_read_mmd(phydev, devad, MDIO_STAT1);
290 			if (val < 0)
291 				return val;
292 			else if (val & MDIO_STAT1_LSTATUS)
293 				continue;
294 		}
295 
296 		val = phy_read_mmd(phydev, devad, MDIO_STAT1);
297 		if (val < 0)
298 			return val;
299 
300 		if (!(val & MDIO_STAT1_LSTATUS))
301 			link = false;
302 	}
303 
304 	phydev->link = link;
305 
306 	return 0;
307 }
308 EXPORT_SYMBOL_GPL(genphy_c45_read_link);
309 
310 /**
311  * genphy_c45_read_lpa - read the link partner advertisement and pause
312  * @phydev: target phy_device struct
313  *
314  * Read the Clause 45 defined base (7.19) and 10G (7.33) status registers,
315  * filling in the link partner advertisement, pause and asym_pause members
316  * in @phydev.  This assumes that the auto-negotiation MMD is present, and
317  * the backplane bit (7.48.0) is clear.  Clause 45 PHY drivers are expected
318  * to fill in the remainder of the link partner advert from vendor registers.
319  */
320 int genphy_c45_read_lpa(struct phy_device *phydev)
321 {
322 	int val;
323 
324 	val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_STAT1);
325 	if (val < 0)
326 		return val;
327 
328 	if (!(val & MDIO_AN_STAT1_COMPLETE)) {
329 		linkmode_clear_bit(ETHTOOL_LINK_MODE_Autoneg_BIT,
330 				   phydev->lp_advertising);
331 		mii_10gbt_stat_mod_linkmode_lpa_t(phydev->lp_advertising, 0);
332 		mii_adv_mod_linkmode_adv_t(phydev->lp_advertising, 0);
333 		phydev->pause = 0;
334 		phydev->asym_pause = 0;
335 
336 		return 0;
337 	}
338 
339 	linkmode_mod_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, phydev->lp_advertising,
340 			 val & MDIO_AN_STAT1_LPABLE);
341 
342 	/* Read the link partner's base page advertisement */
343 	val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_LPA);
344 	if (val < 0)
345 		return val;
346 
347 	mii_adv_mod_linkmode_adv_t(phydev->lp_advertising, val);
348 	phydev->pause = val & LPA_PAUSE_CAP ? 1 : 0;
349 	phydev->asym_pause = val & LPA_PAUSE_ASYM ? 1 : 0;
350 
351 	/* Read the link partner's 10G advertisement */
352 	val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_10GBT_STAT);
353 	if (val < 0)
354 		return val;
355 
356 	mii_10gbt_stat_mod_linkmode_lpa_t(phydev->lp_advertising, val);
357 
358 	return 0;
359 }
360 EXPORT_SYMBOL_GPL(genphy_c45_read_lpa);
361 
362 /**
363  * genphy_c45_read_pma - read link speed etc from PMA
364  * @phydev: target phy_device struct
365  */
366 int genphy_c45_read_pma(struct phy_device *phydev)
367 {
368 	int val;
369 
370 	linkmode_zero(phydev->lp_advertising);
371 
372 	val = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_CTRL1);
373 	if (val < 0)
374 		return val;
375 
376 	switch (val & MDIO_CTRL1_SPEEDSEL) {
377 	case 0:
378 		phydev->speed = SPEED_10;
379 		break;
380 	case MDIO_PMA_CTRL1_SPEED100:
381 		phydev->speed = SPEED_100;
382 		break;
383 	case MDIO_PMA_CTRL1_SPEED1000:
384 		phydev->speed = SPEED_1000;
385 		break;
386 	case MDIO_CTRL1_SPEED2_5G:
387 		phydev->speed = SPEED_2500;
388 		break;
389 	case MDIO_CTRL1_SPEED5G:
390 		phydev->speed = SPEED_5000;
391 		break;
392 	case MDIO_CTRL1_SPEED10G:
393 		phydev->speed = SPEED_10000;
394 		break;
395 	default:
396 		phydev->speed = SPEED_UNKNOWN;
397 		break;
398 	}
399 
400 	phydev->duplex = DUPLEX_FULL;
401 
402 	return 0;
403 }
404 EXPORT_SYMBOL_GPL(genphy_c45_read_pma);
405 
406 /**
407  * genphy_c45_read_mdix - read mdix status from PMA
408  * @phydev: target phy_device struct
409  */
410 int genphy_c45_read_mdix(struct phy_device *phydev)
411 {
412 	int val;
413 
414 	if (phydev->speed == SPEED_10000) {
415 		val = phy_read_mmd(phydev, MDIO_MMD_PMAPMD,
416 				   MDIO_PMA_10GBT_SWAPPOL);
417 		if (val < 0)
418 			return val;
419 
420 		switch (val) {
421 		case MDIO_PMA_10GBT_SWAPPOL_ABNX | MDIO_PMA_10GBT_SWAPPOL_CDNX:
422 			phydev->mdix = ETH_TP_MDI;
423 			break;
424 
425 		case 0:
426 			phydev->mdix = ETH_TP_MDI_X;
427 			break;
428 
429 		default:
430 			phydev->mdix = ETH_TP_MDI_INVALID;
431 			break;
432 		}
433 	}
434 
435 	return 0;
436 }
437 EXPORT_SYMBOL_GPL(genphy_c45_read_mdix);
438 
439 /**
440  * genphy_c45_pma_read_abilities - read supported link modes from PMA
441  * @phydev: target phy_device struct
442  *
443  * Read the supported link modes from the PMA Status 2 (1.8) register. If bit
444  * 1.8.9 is set, the list of supported modes is build using the values in the
445  * PMA Extended Abilities (1.11) register, indicating 1000BASET an 10G related
446  * modes. If bit 1.11.14 is set, then the list is also extended with the modes
447  * in the 2.5G/5G PMA Extended register (1.21), indicating if 2.5GBASET and
448  * 5GBASET are supported.
449  */
450 int genphy_c45_pma_read_abilities(struct phy_device *phydev)
451 {
452 	int val;
453 
454 	linkmode_clear_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, phydev->supported);
455 	if (phydev->c45_ids.mmds_present & MDIO_DEVS_AN) {
456 		val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_STAT1);
457 		if (val < 0)
458 			return val;
459 
460 		if (val & MDIO_AN_STAT1_ABLE)
461 			linkmode_set_bit(ETHTOOL_LINK_MODE_Autoneg_BIT,
462 					 phydev->supported);
463 	}
464 
465 	val = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_STAT2);
466 	if (val < 0)
467 		return val;
468 
469 	linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseSR_Full_BIT,
470 			 phydev->supported,
471 			 val & MDIO_PMA_STAT2_10GBSR);
472 
473 	linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseLR_Full_BIT,
474 			 phydev->supported,
475 			 val & MDIO_PMA_STAT2_10GBLR);
476 
477 	linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseER_Full_BIT,
478 			 phydev->supported,
479 			 val & MDIO_PMA_STAT2_10GBER);
480 
481 	if (val & MDIO_PMA_STAT2_EXTABLE) {
482 		val = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_PMA_EXTABLE);
483 		if (val < 0)
484 			return val;
485 
486 		linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseLRM_Full_BIT,
487 				 phydev->supported,
488 				 val & MDIO_PMA_EXTABLE_10GBLRM);
489 		linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseT_Full_BIT,
490 				 phydev->supported,
491 				 val & MDIO_PMA_EXTABLE_10GBT);
492 		linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseKX4_Full_BIT,
493 				 phydev->supported,
494 				 val & MDIO_PMA_EXTABLE_10GBKX4);
495 		linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseKR_Full_BIT,
496 				 phydev->supported,
497 				 val & MDIO_PMA_EXTABLE_10GBKR);
498 		linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT,
499 				 phydev->supported,
500 				 val & MDIO_PMA_EXTABLE_1000BT);
501 		linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseKX_Full_BIT,
502 				 phydev->supported,
503 				 val & MDIO_PMA_EXTABLE_1000BKX);
504 
505 		linkmode_mod_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT,
506 				 phydev->supported,
507 				 val & MDIO_PMA_EXTABLE_100BTX);
508 		linkmode_mod_bit(ETHTOOL_LINK_MODE_100baseT_Half_BIT,
509 				 phydev->supported,
510 				 val & MDIO_PMA_EXTABLE_100BTX);
511 
512 		linkmode_mod_bit(ETHTOOL_LINK_MODE_10baseT_Full_BIT,
513 				 phydev->supported,
514 				 val & MDIO_PMA_EXTABLE_10BT);
515 		linkmode_mod_bit(ETHTOOL_LINK_MODE_10baseT_Half_BIT,
516 				 phydev->supported,
517 				 val & MDIO_PMA_EXTABLE_10BT);
518 
519 		if (val & MDIO_PMA_EXTABLE_NBT) {
520 			val = phy_read_mmd(phydev, MDIO_MMD_PMAPMD,
521 					   MDIO_PMA_NG_EXTABLE);
522 			if (val < 0)
523 				return val;
524 
525 			linkmode_mod_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT,
526 					 phydev->supported,
527 					 val & MDIO_PMA_NG_EXTABLE_2_5GBT);
528 
529 			linkmode_mod_bit(ETHTOOL_LINK_MODE_5000baseT_Full_BIT,
530 					 phydev->supported,
531 					 val & MDIO_PMA_NG_EXTABLE_5GBT);
532 		}
533 	}
534 
535 	return 0;
536 }
537 EXPORT_SYMBOL_GPL(genphy_c45_pma_read_abilities);
538 
539 /**
540  * genphy_c45_read_status - read PHY status
541  * @phydev: target phy_device struct
542  *
543  * Reads status from PHY and sets phy_device members accordingly.
544  */
545 int genphy_c45_read_status(struct phy_device *phydev)
546 {
547 	int ret;
548 
549 	ret = genphy_c45_read_link(phydev);
550 	if (ret)
551 		return ret;
552 
553 	phydev->speed = SPEED_UNKNOWN;
554 	phydev->duplex = DUPLEX_UNKNOWN;
555 	phydev->pause = 0;
556 	phydev->asym_pause = 0;
557 
558 	if (phydev->autoneg == AUTONEG_ENABLE) {
559 		ret = genphy_c45_read_lpa(phydev);
560 		if (ret)
561 			return ret;
562 
563 		phy_resolve_aneg_linkmode(phydev);
564 	} else {
565 		ret = genphy_c45_read_pma(phydev);
566 	}
567 
568 	return ret;
569 }
570 EXPORT_SYMBOL_GPL(genphy_c45_read_status);
571 
572 /**
573  * genphy_c45_config_aneg - restart auto-negotiation or forced setup
574  * @phydev: target phy_device struct
575  *
576  * Description: If auto-negotiation is enabled, we configure the
577  *   advertising, and then restart auto-negotiation.  If it is not
578  *   enabled, then we force a configuration.
579  */
580 int genphy_c45_config_aneg(struct phy_device *phydev)
581 {
582 	bool changed = false;
583 	int ret;
584 
585 	if (phydev->autoneg == AUTONEG_DISABLE)
586 		return genphy_c45_pma_setup_forced(phydev);
587 
588 	ret = genphy_c45_an_config_aneg(phydev);
589 	if (ret < 0)
590 		return ret;
591 	if (ret > 0)
592 		changed = true;
593 
594 	return genphy_c45_check_and_restart_aneg(phydev, changed);
595 }
596 EXPORT_SYMBOL_GPL(genphy_c45_config_aneg);
597 
598 /* The gen10g_* functions are the old Clause 45 stub */
599 
600 int gen10g_config_aneg(struct phy_device *phydev)
601 {
602 	return 0;
603 }
604 EXPORT_SYMBOL_GPL(gen10g_config_aneg);
605 
606 int genphy_c45_loopback(struct phy_device *phydev, bool enable)
607 {
608 	return phy_modify_mmd(phydev, MDIO_MMD_PCS, MDIO_CTRL1,
609 			      MDIO_PCS_CTRL1_LOOPBACK,
610 			      enable ? MDIO_PCS_CTRL1_LOOPBACK : 0);
611 }
612 EXPORT_SYMBOL_GPL(genphy_c45_loopback);
613 
614 struct phy_driver genphy_c45_driver = {
615 	.phy_id         = 0xffffffff,
616 	.phy_id_mask    = 0xffffffff,
617 	.name           = "Generic Clause 45 PHY",
618 	.read_status    = genphy_c45_read_status,
619 };
620