xref: /linux/drivers/net/phy/phy-c45.c (revision 1a9239bb4253f9076b5b4b2a1a4e8d7defd77a95)
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 #include "mdio-open-alliance.h"
12 #include "phylib-internal.h"
13 
14 /**
15  * genphy_c45_baset1_able - checks if the PMA has BASE-T1 extended abilities
16  * @phydev: target phy_device struct
17  */
genphy_c45_baset1_able(struct phy_device * phydev)18 static bool genphy_c45_baset1_able(struct phy_device *phydev)
19 {
20 	int val;
21 
22 	if (phydev->pma_extable == -ENODATA) {
23 		val = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_PMA_EXTABLE);
24 		if (val < 0)
25 			return false;
26 
27 		phydev->pma_extable = val;
28 	}
29 
30 	return !!(phydev->pma_extable & MDIO_PMA_EXTABLE_BT1);
31 }
32 
33 /**
34  * genphy_c45_pma_can_sleep - checks if the PMA have sleep support
35  * @phydev: target phy_device struct
36  */
genphy_c45_pma_can_sleep(struct phy_device * phydev)37 static bool genphy_c45_pma_can_sleep(struct phy_device *phydev)
38 {
39 	int stat1;
40 
41 	stat1 = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_STAT1);
42 	if (stat1 < 0)
43 		return false;
44 
45 	return !!(stat1 & MDIO_STAT1_LPOWERABLE);
46 }
47 
48 /**
49  * genphy_c45_pma_resume - wakes up the PMA module
50  * @phydev: target phy_device struct
51  */
genphy_c45_pma_resume(struct phy_device * phydev)52 int genphy_c45_pma_resume(struct phy_device *phydev)
53 {
54 	if (!genphy_c45_pma_can_sleep(phydev))
55 		return -EOPNOTSUPP;
56 
57 	return phy_clear_bits_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_CTRL1,
58 				  MDIO_CTRL1_LPOWER);
59 }
60 EXPORT_SYMBOL_GPL(genphy_c45_pma_resume);
61 
62 /**
63  * genphy_c45_pma_suspend - suspends the PMA module
64  * @phydev: target phy_device struct
65  */
genphy_c45_pma_suspend(struct phy_device * phydev)66 int genphy_c45_pma_suspend(struct phy_device *phydev)
67 {
68 	if (!genphy_c45_pma_can_sleep(phydev))
69 		return -EOPNOTSUPP;
70 
71 	return phy_set_bits_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_CTRL1,
72 				MDIO_CTRL1_LPOWER);
73 }
74 EXPORT_SYMBOL_GPL(genphy_c45_pma_suspend);
75 
76 /**
77  * genphy_c45_pma_baset1_setup_master_slave - configures forced master/slave
78  * role of BaseT1 devices.
79  * @phydev: target phy_device struct
80  */
genphy_c45_pma_baset1_setup_master_slave(struct phy_device * phydev)81 int genphy_c45_pma_baset1_setup_master_slave(struct phy_device *phydev)
82 {
83 	int ctl = 0;
84 
85 	switch (phydev->master_slave_set) {
86 	case MASTER_SLAVE_CFG_MASTER_PREFERRED:
87 	case MASTER_SLAVE_CFG_MASTER_FORCE:
88 		ctl = MDIO_PMA_PMD_BT1_CTRL_CFG_MST;
89 		break;
90 	case MASTER_SLAVE_CFG_SLAVE_FORCE:
91 	case MASTER_SLAVE_CFG_SLAVE_PREFERRED:
92 		break;
93 	case MASTER_SLAVE_CFG_UNKNOWN:
94 	case MASTER_SLAVE_CFG_UNSUPPORTED:
95 		return 0;
96 	default:
97 		phydev_warn(phydev, "Unsupported Master/Slave mode\n");
98 		return -EOPNOTSUPP;
99 	}
100 
101 	return phy_modify_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_PMA_PMD_BT1_CTRL,
102 			     MDIO_PMA_PMD_BT1_CTRL_CFG_MST, ctl);
103 }
104 EXPORT_SYMBOL_GPL(genphy_c45_pma_baset1_setup_master_slave);
105 
106 /**
107  * genphy_c45_pma_setup_forced - configures a forced speed
108  * @phydev: target phy_device struct
109  */
genphy_c45_pma_setup_forced(struct phy_device * phydev)110 int genphy_c45_pma_setup_forced(struct phy_device *phydev)
111 {
112 	int bt1_ctrl, ctrl1, ctrl2, ret;
113 
114 	/* Half duplex is not supported */
115 	if (phydev->duplex != DUPLEX_FULL)
116 		return -EINVAL;
117 
118 	ctrl1 = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_CTRL1);
119 	if (ctrl1 < 0)
120 		return ctrl1;
121 
122 	ctrl2 = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_CTRL2);
123 	if (ctrl2 < 0)
124 		return ctrl2;
125 
126 	ctrl1 &= ~MDIO_CTRL1_SPEEDSEL;
127 	/*
128 	 * PMA/PMD type selection is 1.7.5:0 not 1.7.3:0.  See 45.2.1.6.1
129 	 * in 802.3-2012 and 802.3-2015.
130 	 */
131 	ctrl2 &= ~(MDIO_PMA_CTRL2_TYPE | 0x30);
132 
133 	switch (phydev->speed) {
134 	case SPEED_10:
135 		if (genphy_c45_baset1_able(phydev))
136 			ctrl2 |= MDIO_PMA_CTRL2_BASET1;
137 		else
138 			ctrl2 |= MDIO_PMA_CTRL2_10BT;
139 		break;
140 	case SPEED_100:
141 		ctrl1 |= MDIO_PMA_CTRL1_SPEED100;
142 		ctrl2 |= MDIO_PMA_CTRL2_100BTX;
143 		break;
144 	case SPEED_1000:
145 		ctrl1 |= MDIO_PMA_CTRL1_SPEED1000;
146 		/* Assume 1000base-T */
147 		ctrl2 |= MDIO_PMA_CTRL2_1000BT;
148 		break;
149 	case SPEED_2500:
150 		ctrl1 |= MDIO_CTRL1_SPEED2_5G;
151 		/* Assume 2.5Gbase-T */
152 		ctrl2 |= MDIO_PMA_CTRL2_2_5GBT;
153 		break;
154 	case SPEED_5000:
155 		ctrl1 |= MDIO_CTRL1_SPEED5G;
156 		/* Assume 5Gbase-T */
157 		ctrl2 |= MDIO_PMA_CTRL2_5GBT;
158 		break;
159 	case SPEED_10000:
160 		ctrl1 |= MDIO_CTRL1_SPEED10G;
161 		/* Assume 10Gbase-T */
162 		ctrl2 |= MDIO_PMA_CTRL2_10GBT;
163 		break;
164 	default:
165 		return -EINVAL;
166 	}
167 
168 	ret = phy_write_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_CTRL1, ctrl1);
169 	if (ret < 0)
170 		return ret;
171 
172 	ret = phy_write_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_CTRL2, ctrl2);
173 	if (ret < 0)
174 		return ret;
175 
176 	if (genphy_c45_baset1_able(phydev)) {
177 		ret = genphy_c45_pma_baset1_setup_master_slave(phydev);
178 		if (ret < 0)
179 			return ret;
180 
181 		bt1_ctrl = 0;
182 		if (phydev->speed == SPEED_1000)
183 			bt1_ctrl = MDIO_PMA_PMD_BT1_CTRL_STRAP_B1000;
184 
185 		ret = phy_modify_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_PMA_PMD_BT1_CTRL,
186 				     MDIO_PMA_PMD_BT1_CTRL_STRAP, bt1_ctrl);
187 		if (ret < 0)
188 			return ret;
189 	}
190 
191 	return genphy_c45_an_disable_aneg(phydev);
192 }
193 EXPORT_SYMBOL_GPL(genphy_c45_pma_setup_forced);
194 
195 /* Sets master/slave preference and supported technologies.
196  * The preference is set in the BIT(4) of BASE-T1 AN
197  * advertisement register 7.515 and whether the status
198  * is forced or not, it is set in the BIT(12) of BASE-T1
199  * AN advertisement register 7.514.
200  * Sets 10BASE-T1L Ability BIT(14) in BASE-T1 autonegotiation
201  * advertisement register [31:16] if supported.
202  */
genphy_c45_baset1_an_config_aneg(struct phy_device * phydev)203 static int genphy_c45_baset1_an_config_aneg(struct phy_device *phydev)
204 {
205 	u16 adv_l_mask, adv_l = 0;
206 	u16 adv_m_mask, adv_m = 0;
207 	int changed = 0;
208 	int ret;
209 
210 	adv_l_mask = MDIO_AN_T1_ADV_L_FORCE_MS | MDIO_AN_T1_ADV_L_PAUSE_CAP |
211 		MDIO_AN_T1_ADV_L_PAUSE_ASYM;
212 	adv_m_mask = MDIO_AN_T1_ADV_M_1000BT1 | MDIO_AN_T1_ADV_M_100BT1 |
213 		MDIO_AN_T1_ADV_M_MST | MDIO_AN_T1_ADV_M_B10L;
214 
215 	switch (phydev->master_slave_set) {
216 	case MASTER_SLAVE_CFG_MASTER_FORCE:
217 		adv_m |= MDIO_AN_T1_ADV_M_MST;
218 		fallthrough;
219 	case MASTER_SLAVE_CFG_SLAVE_FORCE:
220 		adv_l |= MDIO_AN_T1_ADV_L_FORCE_MS;
221 		break;
222 	case MASTER_SLAVE_CFG_MASTER_PREFERRED:
223 		adv_m |= MDIO_AN_T1_ADV_M_MST;
224 		fallthrough;
225 	case MASTER_SLAVE_CFG_SLAVE_PREFERRED:
226 		break;
227 	case MASTER_SLAVE_CFG_UNKNOWN:
228 	case MASTER_SLAVE_CFG_UNSUPPORTED:
229 		/* if master/slave role is not specified, do not overwrite it */
230 		adv_l_mask &= ~MDIO_AN_T1_ADV_L_FORCE_MS;
231 		adv_m_mask &= ~MDIO_AN_T1_ADV_M_MST;
232 		break;
233 	default:
234 		phydev_warn(phydev, "Unsupported Master/Slave mode\n");
235 		return -EOPNOTSUPP;
236 	}
237 
238 	adv_l |= linkmode_adv_to_mii_t1_adv_l_t(phydev->advertising);
239 
240 	ret = phy_modify_mmd_changed(phydev, MDIO_MMD_AN, MDIO_AN_T1_ADV_L,
241 				     adv_l_mask, adv_l);
242 	if (ret < 0)
243 		return ret;
244 	if (ret > 0)
245 		changed = 1;
246 
247 	adv_m |= linkmode_adv_to_mii_t1_adv_m_t(phydev->advertising);
248 
249 	ret = phy_modify_mmd_changed(phydev, MDIO_MMD_AN, MDIO_AN_T1_ADV_M,
250 				     adv_m_mask, adv_m);
251 	if (ret < 0)
252 		return ret;
253 	if (ret > 0)
254 		changed = 1;
255 
256 	return changed;
257 }
258 
259 /**
260  * genphy_c45_an_config_aneg - configure advertisement registers
261  * @phydev: target phy_device struct
262  *
263  * Configure advertisement registers based on modes set in phydev->advertising
264  *
265  * Returns negative errno code on failure, 0 if advertisement didn't change,
266  * or 1 if advertised modes changed.
267  */
genphy_c45_an_config_aneg(struct phy_device * phydev)268 int genphy_c45_an_config_aneg(struct phy_device *phydev)
269 {
270 	int changed = 0, ret;
271 	u32 adv;
272 
273 	linkmode_and(phydev->advertising, phydev->advertising,
274 		     phydev->supported);
275 
276 	ret = genphy_c45_an_config_eee_aneg(phydev);
277 	if (ret < 0)
278 		return ret;
279 	else if (ret)
280 		changed = true;
281 
282 	if (genphy_c45_baset1_able(phydev))
283 		return genphy_c45_baset1_an_config_aneg(phydev);
284 
285 	adv = linkmode_adv_to_mii_adv_t(phydev->advertising);
286 
287 	ret = phy_modify_mmd_changed(phydev, MDIO_MMD_AN, MDIO_AN_ADVERTISE,
288 				     ADVERTISE_ALL | ADVERTISE_100BASE4 |
289 				     ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM,
290 				     adv);
291 	if (ret < 0)
292 		return ret;
293 	if (ret > 0)
294 		changed = 1;
295 
296 	adv = linkmode_adv_to_mii_10gbt_adv_t(phydev->advertising);
297 
298 	ret = phy_modify_mmd_changed(phydev, MDIO_MMD_AN, MDIO_AN_10GBT_CTRL,
299 				     MDIO_AN_10GBT_CTRL_ADV10G |
300 				     MDIO_AN_10GBT_CTRL_ADV5G |
301 				     MDIO_AN_10GBT_CTRL_ADV2_5G, adv);
302 	if (ret < 0)
303 		return ret;
304 	if (ret > 0)
305 		changed = 1;
306 
307 	return changed;
308 }
309 EXPORT_SYMBOL_GPL(genphy_c45_an_config_aneg);
310 
311 /**
312  * genphy_c45_an_disable_aneg - disable auto-negotiation
313  * @phydev: target phy_device struct
314  *
315  * Disable auto-negotiation in the Clause 45 PHY. The link parameters
316  * are controlled through the PMA/PMD MMD registers.
317  *
318  * Returns zero on success, negative errno code on failure.
319  */
genphy_c45_an_disable_aneg(struct phy_device * phydev)320 int genphy_c45_an_disable_aneg(struct phy_device *phydev)
321 {
322 	u16 reg = MDIO_CTRL1;
323 
324 	if (genphy_c45_baset1_able(phydev))
325 		reg = MDIO_AN_T1_CTRL;
326 
327 	return phy_clear_bits_mmd(phydev, MDIO_MMD_AN, reg,
328 				  MDIO_AN_CTRL1_ENABLE | MDIO_AN_CTRL1_RESTART);
329 }
330 EXPORT_SYMBOL_GPL(genphy_c45_an_disable_aneg);
331 
332 /**
333  * genphy_c45_restart_aneg - Enable and restart auto-negotiation
334  * @phydev: target phy_device struct
335  *
336  * This assumes that the auto-negotiation MMD is present.
337  *
338  * Enable and restart auto-negotiation.
339  */
genphy_c45_restart_aneg(struct phy_device * phydev)340 int genphy_c45_restart_aneg(struct phy_device *phydev)
341 {
342 	u16 reg = MDIO_CTRL1;
343 
344 	if (genphy_c45_baset1_able(phydev))
345 		reg = MDIO_AN_T1_CTRL;
346 
347 	return phy_set_bits_mmd(phydev, MDIO_MMD_AN, reg,
348 				MDIO_AN_CTRL1_ENABLE | MDIO_AN_CTRL1_RESTART);
349 }
350 EXPORT_SYMBOL_GPL(genphy_c45_restart_aneg);
351 
352 /**
353  * genphy_c45_check_and_restart_aneg - Enable and restart auto-negotiation
354  * @phydev: target phy_device struct
355  * @restart: whether aneg restart is requested
356  *
357  * This assumes that the auto-negotiation MMD is present.
358  *
359  * Check, and restart auto-negotiation if needed.
360  */
genphy_c45_check_and_restart_aneg(struct phy_device * phydev,bool restart)361 int genphy_c45_check_and_restart_aneg(struct phy_device *phydev, bool restart)
362 {
363 	u16 reg = MDIO_CTRL1;
364 	int ret;
365 
366 	if (genphy_c45_baset1_able(phydev))
367 		reg = MDIO_AN_T1_CTRL;
368 
369 	if (!restart) {
370 		/* Configure and restart aneg if it wasn't set before */
371 		ret = phy_read_mmd(phydev, MDIO_MMD_AN, reg);
372 		if (ret < 0)
373 			return ret;
374 
375 		if (!(ret & MDIO_AN_CTRL1_ENABLE))
376 			restart = true;
377 	}
378 
379 	if (restart)
380 		return genphy_c45_restart_aneg(phydev);
381 
382 	return 0;
383 }
384 EXPORT_SYMBOL_GPL(genphy_c45_check_and_restart_aneg);
385 
386 /**
387  * genphy_c45_aneg_done - return auto-negotiation complete status
388  * @phydev: target phy_device struct
389  *
390  * This assumes that the auto-negotiation MMD is present.
391  *
392  * Reads the status register from the auto-negotiation MMD, returning:
393  * - positive if auto-negotiation is complete
394  * - negative errno code on error
395  * - zero otherwise
396  */
genphy_c45_aneg_done(struct phy_device * phydev)397 int genphy_c45_aneg_done(struct phy_device *phydev)
398 {
399 	int reg = MDIO_STAT1;
400 	int val;
401 
402 	if (genphy_c45_baset1_able(phydev))
403 		reg = MDIO_AN_T1_STAT;
404 
405 	val = phy_read_mmd(phydev, MDIO_MMD_AN, reg);
406 
407 	return val < 0 ? val : val & MDIO_AN_STAT1_COMPLETE ? 1 : 0;
408 }
409 EXPORT_SYMBOL_GPL(genphy_c45_aneg_done);
410 
411 /**
412  * genphy_c45_read_link - read the overall link status from the MMDs
413  * @phydev: target phy_device struct
414  *
415  * Read the link status from the specified MMDs, and if they all indicate
416  * that the link is up, set phydev->link to 1.  If an error is encountered,
417  * a negative errno will be returned, otherwise zero.
418  */
genphy_c45_read_link(struct phy_device * phydev)419 int genphy_c45_read_link(struct phy_device *phydev)
420 {
421 	u32 mmd_mask = MDIO_DEVS_PMAPMD;
422 	int val, devad;
423 	bool link = true;
424 
425 	if (phydev->c45_ids.mmds_present & MDIO_DEVS_AN) {
426 		val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_CTRL1);
427 		if (val < 0)
428 			return val;
429 
430 		/* Autoneg is being started, therefore disregard current
431 		 * link status and report link as down.
432 		 */
433 		if (val & MDIO_AN_CTRL1_RESTART) {
434 			phydev->link = 0;
435 			return 0;
436 		}
437 	}
438 
439 	while (mmd_mask && link) {
440 		devad = __ffs(mmd_mask);
441 		mmd_mask &= ~BIT(devad);
442 
443 		/* The link state is latched low so that momentary link
444 		 * drops can be detected. Do not double-read the status
445 		 * in polling mode to detect such short link drops except
446 		 * the link was already down.
447 		 */
448 		if (!phy_polling_mode(phydev) || !phydev->link) {
449 			val = phy_read_mmd(phydev, devad, MDIO_STAT1);
450 			if (val < 0)
451 				return val;
452 			else if (val & MDIO_STAT1_LSTATUS)
453 				continue;
454 		}
455 
456 		val = phy_read_mmd(phydev, devad, MDIO_STAT1);
457 		if (val < 0)
458 			return val;
459 
460 		if (!(val & MDIO_STAT1_LSTATUS))
461 			link = false;
462 	}
463 
464 	phydev->link = link;
465 
466 	return 0;
467 }
468 EXPORT_SYMBOL_GPL(genphy_c45_read_link);
469 
470 /* Read the Clause 45 defined BASE-T1 AN (7.513) status register to check
471  * if autoneg is complete. If so read the BASE-T1 Autonegotiation
472  * Advertisement registers filling in the link partner advertisement,
473  * pause and asym_pause members in phydev.
474  */
genphy_c45_baset1_read_lpa(struct phy_device * phydev)475 static int genphy_c45_baset1_read_lpa(struct phy_device *phydev)
476 {
477 	int val;
478 
479 	val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_T1_STAT);
480 	if (val < 0)
481 		return val;
482 
483 	if (!(val & MDIO_AN_STAT1_COMPLETE)) {
484 		linkmode_clear_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, phydev->lp_advertising);
485 		mii_t1_adv_l_mod_linkmode_t(phydev->lp_advertising, 0);
486 		mii_t1_adv_m_mod_linkmode_t(phydev->lp_advertising, 0);
487 
488 		phydev->pause = 0;
489 		phydev->asym_pause = 0;
490 
491 		return 0;
492 	}
493 
494 	linkmode_mod_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, phydev->lp_advertising, 1);
495 
496 	val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_T1_LP_L);
497 	if (val < 0)
498 		return val;
499 
500 	mii_t1_adv_l_mod_linkmode_t(phydev->lp_advertising, val);
501 	phydev->pause = val & MDIO_AN_T1_ADV_L_PAUSE_CAP ? 1 : 0;
502 	phydev->asym_pause = val & MDIO_AN_T1_ADV_L_PAUSE_ASYM ? 1 : 0;
503 
504 	val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_T1_LP_M);
505 	if (val < 0)
506 		return val;
507 
508 	mii_t1_adv_m_mod_linkmode_t(phydev->lp_advertising, val);
509 
510 	return 0;
511 }
512 
513 /**
514  * genphy_c45_read_lpa - read the link partner advertisement and pause
515  * @phydev: target phy_device struct
516  *
517  * Read the Clause 45 defined base (7.19) and 10G (7.33) status registers,
518  * filling in the link partner advertisement, pause and asym_pause members
519  * in @phydev.  This assumes that the auto-negotiation MMD is present, and
520  * the backplane bit (7.48.0) is clear.  Clause 45 PHY drivers are expected
521  * to fill in the remainder of the link partner advert from vendor registers.
522  */
genphy_c45_read_lpa(struct phy_device * phydev)523 int genphy_c45_read_lpa(struct phy_device *phydev)
524 {
525 	int val;
526 
527 	if (genphy_c45_baset1_able(phydev))
528 		return genphy_c45_baset1_read_lpa(phydev);
529 
530 	val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_STAT1);
531 	if (val < 0)
532 		return val;
533 
534 	if (!(val & MDIO_AN_STAT1_COMPLETE)) {
535 		linkmode_clear_bit(ETHTOOL_LINK_MODE_Autoneg_BIT,
536 				   phydev->lp_advertising);
537 		mii_10gbt_stat_mod_linkmode_lpa_t(phydev->lp_advertising, 0);
538 		mii_adv_mod_linkmode_adv_t(phydev->lp_advertising, 0);
539 		phydev->pause = 0;
540 		phydev->asym_pause = 0;
541 
542 		return 0;
543 	}
544 
545 	linkmode_mod_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, phydev->lp_advertising,
546 			 val & MDIO_AN_STAT1_LPABLE);
547 
548 	/* Read the link partner's base page advertisement */
549 	val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_LPA);
550 	if (val < 0)
551 		return val;
552 
553 	mii_adv_mod_linkmode_adv_t(phydev->lp_advertising, val);
554 	phydev->pause = val & LPA_PAUSE_CAP ? 1 : 0;
555 	phydev->asym_pause = val & LPA_PAUSE_ASYM ? 1 : 0;
556 
557 	/* Read the link partner's 10G advertisement */
558 	val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_10GBT_STAT);
559 	if (val < 0)
560 		return val;
561 
562 	mii_10gbt_stat_mod_linkmode_lpa_t(phydev->lp_advertising, val);
563 
564 	return 0;
565 }
566 EXPORT_SYMBOL_GPL(genphy_c45_read_lpa);
567 
568 /**
569  * genphy_c45_pma_baset1_read_master_slave - read forced master/slave
570  * configuration
571  * @phydev: target phy_device struct
572  */
genphy_c45_pma_baset1_read_master_slave(struct phy_device * phydev)573 int genphy_c45_pma_baset1_read_master_slave(struct phy_device *phydev)
574 {
575 	int val;
576 
577 	phydev->master_slave_state = MASTER_SLAVE_STATE_UNKNOWN;
578 	phydev->master_slave_get = MASTER_SLAVE_CFG_UNKNOWN;
579 
580 	val = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_PMA_PMD_BT1_CTRL);
581 	if (val < 0)
582 		return val;
583 
584 	if (val & MDIO_PMA_PMD_BT1_CTRL_CFG_MST) {
585 		phydev->master_slave_get = MASTER_SLAVE_CFG_MASTER_FORCE;
586 		phydev->master_slave_state = MASTER_SLAVE_STATE_MASTER;
587 	} else {
588 		phydev->master_slave_get = MASTER_SLAVE_CFG_SLAVE_FORCE;
589 		phydev->master_slave_state = MASTER_SLAVE_STATE_SLAVE;
590 	}
591 
592 	return 0;
593 }
594 EXPORT_SYMBOL_GPL(genphy_c45_pma_baset1_read_master_slave);
595 
596 /**
597  * genphy_c45_read_pma - read link speed etc from PMA
598  * @phydev: target phy_device struct
599  */
genphy_c45_read_pma(struct phy_device * phydev)600 int genphy_c45_read_pma(struct phy_device *phydev)
601 {
602 	int val;
603 
604 	linkmode_zero(phydev->lp_advertising);
605 
606 	val = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_CTRL1);
607 	if (val < 0)
608 		return val;
609 
610 	switch (val & MDIO_CTRL1_SPEEDSEL) {
611 	case 0:
612 		phydev->speed = SPEED_10;
613 		break;
614 	case MDIO_PMA_CTRL1_SPEED100:
615 		phydev->speed = SPEED_100;
616 		break;
617 	case MDIO_PMA_CTRL1_SPEED1000:
618 		phydev->speed = SPEED_1000;
619 		break;
620 	case MDIO_CTRL1_SPEED2_5G:
621 		phydev->speed = SPEED_2500;
622 		break;
623 	case MDIO_CTRL1_SPEED5G:
624 		phydev->speed = SPEED_5000;
625 		break;
626 	case MDIO_CTRL1_SPEED10G:
627 		phydev->speed = SPEED_10000;
628 		break;
629 	default:
630 		phydev->speed = SPEED_UNKNOWN;
631 		break;
632 	}
633 
634 	phydev->duplex = DUPLEX_FULL;
635 
636 	if (genphy_c45_baset1_able(phydev)) {
637 		val = genphy_c45_pma_baset1_read_master_slave(phydev);
638 		if (val < 0)
639 			return val;
640 	}
641 
642 	return 0;
643 }
644 EXPORT_SYMBOL_GPL(genphy_c45_read_pma);
645 
646 /**
647  * genphy_c45_read_mdix - read mdix status from PMA
648  * @phydev: target phy_device struct
649  */
genphy_c45_read_mdix(struct phy_device * phydev)650 int genphy_c45_read_mdix(struct phy_device *phydev)
651 {
652 	int val;
653 
654 	if (phydev->speed == SPEED_10000) {
655 		val = phy_read_mmd(phydev, MDIO_MMD_PMAPMD,
656 				   MDIO_PMA_10GBT_SWAPPOL);
657 		if (val < 0)
658 			return val;
659 
660 		switch (val) {
661 		case MDIO_PMA_10GBT_SWAPPOL_ABNX | MDIO_PMA_10GBT_SWAPPOL_CDNX:
662 			phydev->mdix = ETH_TP_MDI;
663 			break;
664 
665 		case 0:
666 			phydev->mdix = ETH_TP_MDI_X;
667 			break;
668 
669 		default:
670 			phydev->mdix = ETH_TP_MDI_INVALID;
671 			break;
672 		}
673 	}
674 
675 	return 0;
676 }
677 EXPORT_SYMBOL_GPL(genphy_c45_read_mdix);
678 
679 /**
680  * genphy_c45_write_eee_adv - write advertised EEE link modes
681  * @phydev: target phy_device struct
682  * @adv: the linkmode advertisement settings
683  */
genphy_c45_write_eee_adv(struct phy_device * phydev,unsigned long * adv)684 static int genphy_c45_write_eee_adv(struct phy_device *phydev,
685 				    unsigned long *adv)
686 {
687 	int val, changed = 0;
688 
689 	if (linkmode_intersects(phydev->supported_eee, PHY_EEE_CAP1_FEATURES)) {
690 		val = linkmode_to_mii_eee_cap1_t(adv);
691 
692 		/* IEEE 802.3-2018 45.2.7.13 EEE advertisement 1
693 		 * (Register 7.60)
694 		 */
695 		val = phy_modify_mmd_changed(phydev, MDIO_MMD_AN,
696 					     MDIO_AN_EEE_ADV,
697 					     MDIO_EEE_100TX | MDIO_EEE_1000T |
698 					     MDIO_EEE_10GT | MDIO_EEE_1000KX |
699 					     MDIO_EEE_10GKX4 | MDIO_EEE_10GKR,
700 					     val);
701 		if (val < 0)
702 			return val;
703 		if (val > 0)
704 			changed = 1;
705 	}
706 
707 	if (linkmode_intersects(phydev->supported_eee, PHY_EEE_CAP2_FEATURES)) {
708 		val = linkmode_to_mii_eee_cap2_t(adv);
709 
710 		/* IEEE 802.3-2022 45.2.7.16 EEE advertisement 2
711 		 * (Register 7.62)
712 		 */
713 		val = phy_modify_mmd_changed(phydev, MDIO_MMD_AN,
714 					     MDIO_AN_EEE_ADV2,
715 					     MDIO_EEE_2_5GT | MDIO_EEE_5GT,
716 					     val);
717 		if (val < 0)
718 			return val;
719 		if (val > 0)
720 			changed = 1;
721 	}
722 
723 	if (linkmode_test_bit(ETHTOOL_LINK_MODE_10baseT1L_Full_BIT,
724 			      phydev->supported_eee)) {
725 		val = linkmode_adv_to_mii_10base_t1_t(adv);
726 		/* IEEE 802.3cg-2019 45.2.7.25 10BASE-T1 AN control register
727 		 * (Register 7.526)
728 		 */
729 		val = phy_modify_mmd_changed(phydev, MDIO_MMD_AN,
730 					     MDIO_AN_10BT1_AN_CTRL,
731 					     MDIO_AN_10BT1_AN_CTRL_ADV_EEE_T1L,
732 					     val);
733 		if (val < 0)
734 			return val;
735 		if (val > 0)
736 			changed = 1;
737 	}
738 
739 	return changed;
740 }
741 
742 /**
743  * genphy_c45_read_eee_adv - read advertised EEE link modes
744  * @phydev: target phy_device struct
745  * @adv: the linkmode advertisement status
746  */
genphy_c45_read_eee_adv(struct phy_device * phydev,unsigned long * adv)747 int genphy_c45_read_eee_adv(struct phy_device *phydev, unsigned long *adv)
748 {
749 	int val;
750 
751 	if (linkmode_intersects(phydev->supported_eee, PHY_EEE_CAP1_FEATURES)) {
752 		/* IEEE 802.3-2018 45.2.7.13 EEE advertisement 1
753 		 * (Register 7.60)
754 		 */
755 		val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_ADV);
756 		if (val < 0)
757 			return val;
758 
759 		mii_eee_cap1_mod_linkmode_t(adv, val);
760 	}
761 
762 	if (linkmode_intersects(phydev->supported_eee, PHY_EEE_CAP2_FEATURES)) {
763 		/* IEEE 802.3-2022 45.2.7.16 EEE advertisement 2
764 		 * (Register 7.62)
765 		 */
766 		val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_ADV2);
767 		if (val < 0)
768 			return val;
769 
770 		mii_eee_cap2_mod_linkmode_adv_t(adv, val);
771 	}
772 
773 	if (linkmode_test_bit(ETHTOOL_LINK_MODE_10baseT1L_Full_BIT,
774 			      phydev->supported_eee)) {
775 		/* IEEE 802.3cg-2019 45.2.7.25 10BASE-T1 AN control register
776 		 * (Register 7.526)
777 		 */
778 		val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_10BT1_AN_CTRL);
779 		if (val < 0)
780 			return val;
781 
782 		mii_10base_t1_adv_mod_linkmode_t(adv, val);
783 	}
784 
785 	return 0;
786 }
787 
788 /**
789  * genphy_c45_read_eee_lpa - read advertised LP EEE link modes
790  * @phydev: target phy_device struct
791  * @lpa: the linkmode LP advertisement status
792  */
genphy_c45_read_eee_lpa(struct phy_device * phydev,unsigned long * lpa)793 static int genphy_c45_read_eee_lpa(struct phy_device *phydev,
794 				   unsigned long *lpa)
795 {
796 	int val;
797 
798 	if (linkmode_intersects(phydev->supported_eee, PHY_EEE_CAP1_FEATURES)) {
799 		/* IEEE 802.3-2018 45.2.7.14 EEE link partner ability 1
800 		 * (Register 7.61)
801 		 */
802 		val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_LPABLE);
803 		if (val < 0)
804 			return val;
805 
806 		mii_eee_cap1_mod_linkmode_t(lpa, val);
807 	}
808 
809 	if (linkmode_intersects(phydev->supported_eee, PHY_EEE_CAP2_FEATURES)) {
810 		/* IEEE 802.3-2022 45.2.7.17 EEE link partner ability 2
811 		 * (Register 7.63)
812 		 */
813 		val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_LPABLE2);
814 		if (val < 0)
815 			return val;
816 
817 		mii_eee_cap2_mod_linkmode_adv_t(lpa, val);
818 	}
819 
820 	if (linkmode_test_bit(ETHTOOL_LINK_MODE_10baseT1L_Full_BIT,
821 			      phydev->supported_eee)) {
822 		/* IEEE 802.3cg-2019 45.2.7.26 10BASE-T1 AN status register
823 		 * (Register 7.527)
824 		 */
825 		val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_10BT1_AN_STAT);
826 		if (val < 0)
827 			return val;
828 
829 		mii_10base_t1_adv_mod_linkmode_t(lpa, val);
830 	}
831 
832 	return 0;
833 }
834 
835 /**
836  * genphy_c45_read_eee_cap1 - read supported EEE link modes from register 3.20
837  * @phydev: target phy_device struct
838  */
genphy_c45_read_eee_cap1(struct phy_device * phydev)839 static int genphy_c45_read_eee_cap1(struct phy_device *phydev)
840 {
841 	int val;
842 
843 	/* IEEE 802.3-2018 45.2.3.10 EEE control and capability 1
844 	 * (Register 3.20)
845 	 */
846 	val = phy_read_mmd(phydev, MDIO_MMD_PCS, MDIO_PCS_EEE_ABLE);
847 	if (val < 0)
848 		return val;
849 
850 	/* The 802.3 2018 standard says the top 2 bits are reserved and should
851 	 * read as 0. Also, it seems unlikely anybody will build a PHY which
852 	 * supports 100GBASE-R deep sleep all the way down to 100BASE-TX EEE.
853 	 * If MDIO_PCS_EEE_ABLE is 0xffff assume EEE is not supported.
854 	 */
855 	if (val == 0xffff)
856 		return 0;
857 
858 	mii_eee_cap1_mod_linkmode_t(phydev->supported_eee, val);
859 
860 	/* Some buggy devices indicate EEE link modes in MDIO_PCS_EEE_ABLE
861 	 * which they don't support as indicated by BMSR, ESTATUS etc.
862 	 */
863 	linkmode_and(phydev->supported_eee, phydev->supported_eee,
864 		     phydev->supported);
865 
866 	return 0;
867 }
868 
869 /**
870  * genphy_c45_read_eee_cap2 - read supported EEE link modes from register 3.21
871  * @phydev: target phy_device struct
872  */
genphy_c45_read_eee_cap2(struct phy_device * phydev)873 static int genphy_c45_read_eee_cap2(struct phy_device *phydev)
874 {
875 	int val;
876 
877 	/* IEEE 802.3-2022 45.2.3.11 EEE control and capability 2
878 	 * (Register 3.21)
879 	 */
880 	val = phy_read_mmd(phydev, MDIO_MMD_PCS, MDIO_PCS_EEE_ABLE2);
881 	if (val < 0)
882 		return val;
883 
884 	/* IEEE 802.3-2022 45.2.3.11 says 9 bits are reserved. */
885 	if (val == 0xffff)
886 		return 0;
887 
888 	mii_eee_cap2_mod_linkmode_sup_t(phydev->supported_eee, val);
889 
890 	return 0;
891 }
892 
893 /**
894  * genphy_c45_read_eee_abilities - read supported EEE link modes
895  * @phydev: target phy_device struct
896  */
genphy_c45_read_eee_abilities(struct phy_device * phydev)897 int genphy_c45_read_eee_abilities(struct phy_device *phydev)
898 {
899 	int val;
900 
901 	/* There is not indicator whether optional register
902 	 * "EEE control and capability 1" (3.20) is supported. Read it only
903 	 * on devices with appropriate linkmodes.
904 	 */
905 	if (linkmode_intersects(phydev->supported, PHY_EEE_CAP1_FEATURES)) {
906 		val = genphy_c45_read_eee_cap1(phydev);
907 		if (val)
908 			return val;
909 	}
910 
911 	/* Same for cap2 (3.21) */
912 	if (linkmode_intersects(phydev->supported, PHY_EEE_CAP2_FEATURES)) {
913 		val = genphy_c45_read_eee_cap2(phydev);
914 		if (val)
915 			return val;
916 	}
917 
918 	if (linkmode_test_bit(ETHTOOL_LINK_MODE_10baseT1L_Full_BIT,
919 			      phydev->supported)) {
920 		/* IEEE 802.3cg-2019 45.2.1.186b 10BASE-T1L PMA status register
921 		 * (Register 1.2295)
922 		 */
923 		val = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_PMA_10T1L_STAT);
924 		if (val < 0)
925 			return val;
926 
927 		linkmode_mod_bit(ETHTOOL_LINK_MODE_10baseT1L_Full_BIT,
928 				 phydev->supported_eee,
929 				 val & MDIO_PMA_10T1L_STAT_EEE);
930 	}
931 
932 	return 0;
933 }
934 EXPORT_SYMBOL_GPL(genphy_c45_read_eee_abilities);
935 
936 /**
937  * genphy_c45_an_config_eee_aneg - configure EEE advertisement
938  * @phydev: target phy_device struct
939  */
genphy_c45_an_config_eee_aneg(struct phy_device * phydev)940 int genphy_c45_an_config_eee_aneg(struct phy_device *phydev)
941 {
942 	if (!phydev->eee_cfg.eee_enabled) {
943 		__ETHTOOL_DECLARE_LINK_MODE_MASK(adv) = {};
944 
945 		return genphy_c45_write_eee_adv(phydev, adv);
946 	}
947 
948 	return genphy_c45_write_eee_adv(phydev, phydev->advertising_eee);
949 }
950 EXPORT_SYMBOL_GPL(genphy_c45_an_config_eee_aneg);
951 
952 /**
953  * genphy_c45_pma_baset1_read_abilities - read supported baset1 link modes from PMA
954  * @phydev: target phy_device struct
955  *
956  * Read the supported link modes from the extended BASE-T1 ability register
957  */
genphy_c45_pma_baset1_read_abilities(struct phy_device * phydev)958 int genphy_c45_pma_baset1_read_abilities(struct phy_device *phydev)
959 {
960 	int val;
961 
962 	val = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_PMA_PMD_BT1);
963 	if (val < 0)
964 		return val;
965 
966 	linkmode_mod_bit(ETHTOOL_LINK_MODE_10baseT1L_Full_BIT,
967 			 phydev->supported,
968 			 val & MDIO_PMA_PMD_BT1_B10L_ABLE);
969 
970 	linkmode_mod_bit(ETHTOOL_LINK_MODE_100baseT1_Full_BIT,
971 			 phydev->supported,
972 			 val & MDIO_PMA_PMD_BT1_B100_ABLE);
973 
974 	linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseT1_Full_BIT,
975 			 phydev->supported,
976 			 val & MDIO_PMA_PMD_BT1_B1000_ABLE);
977 
978 	val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_T1_STAT);
979 	if (val < 0)
980 		return val;
981 
982 	linkmode_mod_bit(ETHTOOL_LINK_MODE_Autoneg_BIT,
983 			 phydev->supported,
984 			 val & MDIO_AN_STAT1_ABLE);
985 
986 	return 0;
987 }
988 EXPORT_SYMBOL_GPL(genphy_c45_pma_baset1_read_abilities);
989 
990 /**
991  * genphy_c45_pma_read_ext_abilities - read supported link modes from PMA
992  * @phydev: target phy_device struct
993  *
994  * Read the supported link modes from the PMA/PMD extended ability register
995  * (Register 1.11).
996  */
genphy_c45_pma_read_ext_abilities(struct phy_device * phydev)997 int genphy_c45_pma_read_ext_abilities(struct phy_device *phydev)
998 {
999 	int val;
1000 
1001 	val = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_PMA_EXTABLE);
1002 	if (val < 0)
1003 		return val;
1004 
1005 	linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseLRM_Full_BIT,
1006 			 phydev->supported,
1007 			 val & MDIO_PMA_EXTABLE_10GBLRM);
1008 	linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseT_Full_BIT,
1009 			 phydev->supported,
1010 			 val & MDIO_PMA_EXTABLE_10GBT);
1011 	linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseKX4_Full_BIT,
1012 			 phydev->supported,
1013 			 val & MDIO_PMA_EXTABLE_10GBKX4);
1014 	linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseKR_Full_BIT,
1015 			 phydev->supported,
1016 			 val & MDIO_PMA_EXTABLE_10GBKR);
1017 	linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT,
1018 			 phydev->supported,
1019 			 val & MDIO_PMA_EXTABLE_1000BT);
1020 	linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseKX_Full_BIT,
1021 			 phydev->supported,
1022 			 val & MDIO_PMA_EXTABLE_1000BKX);
1023 
1024 	linkmode_mod_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT,
1025 			 phydev->supported,
1026 			 val & MDIO_PMA_EXTABLE_100BTX);
1027 	linkmode_mod_bit(ETHTOOL_LINK_MODE_100baseT_Half_BIT,
1028 			 phydev->supported,
1029 			 val & MDIO_PMA_EXTABLE_100BTX);
1030 
1031 	linkmode_mod_bit(ETHTOOL_LINK_MODE_10baseT_Full_BIT,
1032 			 phydev->supported,
1033 			 val & MDIO_PMA_EXTABLE_10BT);
1034 	linkmode_mod_bit(ETHTOOL_LINK_MODE_10baseT_Half_BIT,
1035 			 phydev->supported,
1036 			 val & MDIO_PMA_EXTABLE_10BT);
1037 
1038 	if (val & MDIO_PMA_EXTABLE_NBT) {
1039 		val = phy_read_mmd(phydev, MDIO_MMD_PMAPMD,
1040 				   MDIO_PMA_NG_EXTABLE);
1041 		if (val < 0)
1042 			return val;
1043 
1044 		linkmode_mod_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT,
1045 				 phydev->supported,
1046 				 val & MDIO_PMA_NG_EXTABLE_2_5GBT);
1047 
1048 		linkmode_mod_bit(ETHTOOL_LINK_MODE_5000baseT_Full_BIT,
1049 				 phydev->supported,
1050 				 val & MDIO_PMA_NG_EXTABLE_5GBT);
1051 	}
1052 
1053 	if (val & MDIO_PMA_EXTABLE_BT1) {
1054 		val = genphy_c45_pma_baset1_read_abilities(phydev);
1055 		if (val < 0)
1056 			return val;
1057 	}
1058 
1059 	return 0;
1060 }
1061 EXPORT_SYMBOL_GPL(genphy_c45_pma_read_ext_abilities);
1062 
1063 /**
1064  * genphy_c45_pma_read_abilities - read supported link modes from PMA
1065  * @phydev: target phy_device struct
1066  *
1067  * Read the supported link modes from the PMA Status 2 (1.8) register. If bit
1068  * 1.8.9 is set, the list of supported modes is build using the values in the
1069  * PMA Extended Abilities (1.11) register, indicating 1000BASET an 10G related
1070  * modes. If bit 1.11.14 is set, then the list is also extended with the modes
1071  * in the 2.5G/5G PMA Extended register (1.21), indicating if 2.5GBASET and
1072  * 5GBASET are supported.
1073  */
genphy_c45_pma_read_abilities(struct phy_device * phydev)1074 int genphy_c45_pma_read_abilities(struct phy_device *phydev)
1075 {
1076 	int val;
1077 
1078 	linkmode_clear_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, phydev->supported);
1079 	if (phydev->c45_ids.mmds_present & MDIO_DEVS_AN) {
1080 		val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_STAT1);
1081 		if (val < 0)
1082 			return val;
1083 
1084 		if (val & MDIO_AN_STAT1_ABLE)
1085 			linkmode_set_bit(ETHTOOL_LINK_MODE_Autoneg_BIT,
1086 					 phydev->supported);
1087 	}
1088 
1089 	val = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_STAT2);
1090 	if (val < 0)
1091 		return val;
1092 
1093 	linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseSR_Full_BIT,
1094 			 phydev->supported,
1095 			 val & MDIO_PMA_STAT2_10GBSR);
1096 
1097 	linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseLR_Full_BIT,
1098 			 phydev->supported,
1099 			 val & MDIO_PMA_STAT2_10GBLR);
1100 
1101 	linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseER_Full_BIT,
1102 			 phydev->supported,
1103 			 val & MDIO_PMA_STAT2_10GBER);
1104 
1105 	if (val & MDIO_PMA_STAT2_EXTABLE) {
1106 		val = genphy_c45_pma_read_ext_abilities(phydev);
1107 		if (val < 0)
1108 			return val;
1109 	}
1110 
1111 	/* This is optional functionality. If not supported, we may get an error
1112 	 * which should be ignored.
1113 	 */
1114 	genphy_c45_read_eee_abilities(phydev);
1115 
1116 	return 0;
1117 }
1118 EXPORT_SYMBOL_GPL(genphy_c45_pma_read_abilities);
1119 
1120 /* Read master/slave preference from registers.
1121  * The preference is read from the BIT(4) of BASE-T1 AN
1122  * advertisement register 7.515 and whether the preference
1123  * is forced or not, it is read from BASE-T1 AN advertisement
1124  * register 7.514.
1125  */
genphy_c45_baset1_read_status(struct phy_device * phydev)1126 int genphy_c45_baset1_read_status(struct phy_device *phydev)
1127 {
1128 	int ret;
1129 	int cfg;
1130 
1131 	phydev->master_slave_get = MASTER_SLAVE_CFG_UNKNOWN;
1132 	phydev->master_slave_state = MASTER_SLAVE_STATE_UNKNOWN;
1133 
1134 	ret = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_T1_ADV_L);
1135 	if (ret < 0)
1136 		return ret;
1137 
1138 	cfg = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_T1_ADV_M);
1139 	if (cfg < 0)
1140 		return cfg;
1141 
1142 	if (ret & MDIO_AN_T1_ADV_L_FORCE_MS) {
1143 		if (cfg & MDIO_AN_T1_ADV_M_MST)
1144 			phydev->master_slave_get = MASTER_SLAVE_CFG_MASTER_FORCE;
1145 		else
1146 			phydev->master_slave_get = MASTER_SLAVE_CFG_SLAVE_FORCE;
1147 	} else {
1148 		if (cfg & MDIO_AN_T1_ADV_M_MST)
1149 			phydev->master_slave_get = MASTER_SLAVE_CFG_MASTER_PREFERRED;
1150 		else
1151 			phydev->master_slave_get = MASTER_SLAVE_CFG_SLAVE_PREFERRED;
1152 	}
1153 
1154 	return 0;
1155 }
1156 EXPORT_SYMBOL_GPL(genphy_c45_baset1_read_status);
1157 
1158 /**
1159  * genphy_c45_read_status - read PHY status
1160  * @phydev: target phy_device struct
1161  *
1162  * Reads status from PHY and sets phy_device members accordingly.
1163  */
genphy_c45_read_status(struct phy_device * phydev)1164 int genphy_c45_read_status(struct phy_device *phydev)
1165 {
1166 	int ret;
1167 
1168 	ret = genphy_c45_read_link(phydev);
1169 	if (ret)
1170 		return ret;
1171 
1172 	phydev->speed = SPEED_UNKNOWN;
1173 	phydev->duplex = DUPLEX_UNKNOWN;
1174 	phydev->pause = 0;
1175 	phydev->asym_pause = 0;
1176 
1177 	if (phydev->autoneg == AUTONEG_ENABLE) {
1178 		ret = genphy_c45_read_lpa(phydev);
1179 		if (ret)
1180 			return ret;
1181 
1182 		if (genphy_c45_baset1_able(phydev)) {
1183 			ret = genphy_c45_baset1_read_status(phydev);
1184 			if (ret < 0)
1185 				return ret;
1186 		}
1187 
1188 		phy_resolve_aneg_linkmode(phydev);
1189 	} else {
1190 		ret = genphy_c45_read_pma(phydev);
1191 	}
1192 
1193 	return ret;
1194 }
1195 EXPORT_SYMBOL_GPL(genphy_c45_read_status);
1196 
1197 /**
1198  * genphy_c45_config_aneg - restart auto-negotiation or forced setup
1199  * @phydev: target phy_device struct
1200  *
1201  * Description: If auto-negotiation is enabled, we configure the
1202  *   advertising, and then restart auto-negotiation.  If it is not
1203  *   enabled, then we force a configuration.
1204  */
genphy_c45_config_aneg(struct phy_device * phydev)1205 int genphy_c45_config_aneg(struct phy_device *phydev)
1206 {
1207 	bool changed = false;
1208 	int ret;
1209 
1210 	if (phydev->autoneg == AUTONEG_DISABLE)
1211 		return genphy_c45_pma_setup_forced(phydev);
1212 
1213 	ret = genphy_c45_an_config_aneg(phydev);
1214 	if (ret < 0)
1215 		return ret;
1216 	if (ret > 0)
1217 		changed = true;
1218 
1219 	return genphy_c45_check_and_restart_aneg(phydev, changed);
1220 }
1221 EXPORT_SYMBOL_GPL(genphy_c45_config_aneg);
1222 
1223 /* The gen10g_* functions are the old Clause 45 stub */
1224 
gen10g_config_aneg(struct phy_device * phydev)1225 int gen10g_config_aneg(struct phy_device *phydev)
1226 {
1227 	return 0;
1228 }
1229 EXPORT_SYMBOL_GPL(gen10g_config_aneg);
1230 
genphy_c45_loopback(struct phy_device * phydev,bool enable,int speed)1231 int genphy_c45_loopback(struct phy_device *phydev, bool enable, int speed)
1232 {
1233 	if (enable && speed)
1234 		return -EOPNOTSUPP;
1235 
1236 	return phy_modify_mmd(phydev, MDIO_MMD_PCS, MDIO_CTRL1,
1237 			      MDIO_PCS_CTRL1_LOOPBACK,
1238 			      enable ? MDIO_PCS_CTRL1_LOOPBACK : 0);
1239 }
1240 EXPORT_SYMBOL_GPL(genphy_c45_loopback);
1241 
1242 /**
1243  * genphy_c45_fast_retrain - configure fast retrain registers
1244  * @phydev: target phy_device struct
1245  * @enable: enable fast retrain or not
1246  *
1247  * Description: If fast-retrain is enabled, we configure PHY as
1248  *   advertising fast retrain capable and THP Bypass Request, then
1249  *   enable fast retrain. If it is not enabled, we configure fast
1250  *   retrain disabled.
1251  */
genphy_c45_fast_retrain(struct phy_device * phydev,bool enable)1252 int genphy_c45_fast_retrain(struct phy_device *phydev, bool enable)
1253 {
1254 	int ret;
1255 
1256 	if (!enable)
1257 		return phy_clear_bits_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_PMA_10GBR_FSRT_CSR,
1258 				MDIO_PMA_10GBR_FSRT_ENABLE);
1259 
1260 	if (linkmode_test_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT, phydev->supported)) {
1261 		ret = phy_set_bits_mmd(phydev, MDIO_MMD_AN, MDIO_AN_10GBT_CTRL,
1262 				MDIO_AN_10GBT_CTRL_ADVFSRT2_5G);
1263 		if (ret)
1264 			return ret;
1265 
1266 		ret = phy_set_bits_mmd(phydev, MDIO_MMD_AN, MDIO_AN_CTRL2,
1267 				MDIO_AN_THP_BP2_5GT);
1268 		if (ret)
1269 			return ret;
1270 	}
1271 
1272 	return phy_set_bits_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_PMA_10GBR_FSRT_CSR,
1273 			MDIO_PMA_10GBR_FSRT_ENABLE);
1274 }
1275 EXPORT_SYMBOL_GPL(genphy_c45_fast_retrain);
1276 
1277 /**
1278  * genphy_c45_plca_get_cfg - get PLCA configuration from standard registers
1279  * @phydev: target phy_device struct
1280  * @plca_cfg: output structure to store the PLCA configuration
1281  *
1282  * Description: if the PHY complies to the Open Alliance TC14 10BASE-T1S PLCA
1283  *   Management Registers specifications, this function can be used to retrieve
1284  *   the current PLCA configuration from the standard registers in MMD 31.
1285  */
genphy_c45_plca_get_cfg(struct phy_device * phydev,struct phy_plca_cfg * plca_cfg)1286 int genphy_c45_plca_get_cfg(struct phy_device *phydev,
1287 			    struct phy_plca_cfg *plca_cfg)
1288 {
1289 	int ret;
1290 
1291 	ret = phy_read_mmd(phydev, MDIO_MMD_VEND2, MDIO_OATC14_PLCA_IDVER);
1292 	if (ret < 0)
1293 		return ret;
1294 
1295 	if ((ret & MDIO_OATC14_PLCA_IDM) != OATC14_IDM)
1296 		return -ENODEV;
1297 
1298 	plca_cfg->version = ret & ~MDIO_OATC14_PLCA_IDM;
1299 
1300 	ret = phy_read_mmd(phydev, MDIO_MMD_VEND2, MDIO_OATC14_PLCA_CTRL0);
1301 	if (ret < 0)
1302 		return ret;
1303 
1304 	plca_cfg->enabled = !!(ret & MDIO_OATC14_PLCA_EN);
1305 
1306 	ret = phy_read_mmd(phydev, MDIO_MMD_VEND2, MDIO_OATC14_PLCA_CTRL1);
1307 	if (ret < 0)
1308 		return ret;
1309 
1310 	plca_cfg->node_cnt = (ret & MDIO_OATC14_PLCA_NCNT) >> 8;
1311 	plca_cfg->node_id = (ret & MDIO_OATC14_PLCA_ID);
1312 
1313 	ret = phy_read_mmd(phydev, MDIO_MMD_VEND2, MDIO_OATC14_PLCA_TOTMR);
1314 	if (ret < 0)
1315 		return ret;
1316 
1317 	plca_cfg->to_tmr = ret & MDIO_OATC14_PLCA_TOT;
1318 
1319 	ret = phy_read_mmd(phydev, MDIO_MMD_VEND2, MDIO_OATC14_PLCA_BURST);
1320 	if (ret < 0)
1321 		return ret;
1322 
1323 	plca_cfg->burst_cnt = (ret & MDIO_OATC14_PLCA_MAXBC) >> 8;
1324 	plca_cfg->burst_tmr = (ret & MDIO_OATC14_PLCA_BTMR);
1325 
1326 	return 0;
1327 }
1328 EXPORT_SYMBOL_GPL(genphy_c45_plca_get_cfg);
1329 
1330 /**
1331  * genphy_c45_plca_set_cfg - set PLCA configuration using standard registers
1332  * @phydev: target phy_device struct
1333  * @plca_cfg: structure containing the PLCA configuration. Fields set to -1 are
1334  * not to be changed.
1335  *
1336  * Description: if the PHY complies to the Open Alliance TC14 10BASE-T1S PLCA
1337  *   Management Registers specifications, this function can be used to modify
1338  *   the PLCA configuration using the standard registers in MMD 31.
1339  */
genphy_c45_plca_set_cfg(struct phy_device * phydev,const struct phy_plca_cfg * plca_cfg)1340 int genphy_c45_plca_set_cfg(struct phy_device *phydev,
1341 			    const struct phy_plca_cfg *plca_cfg)
1342 {
1343 	u16 val = 0;
1344 	int ret;
1345 
1346 	// PLCA IDVER is read-only
1347 	if (plca_cfg->version >= 0)
1348 		return -EINVAL;
1349 
1350 	// first of all, disable PLCA if required
1351 	if (plca_cfg->enabled == 0) {
1352 		ret = phy_clear_bits_mmd(phydev, MDIO_MMD_VEND2,
1353 					 MDIO_OATC14_PLCA_CTRL0,
1354 					 MDIO_OATC14_PLCA_EN);
1355 
1356 		if (ret < 0)
1357 			return ret;
1358 	}
1359 
1360 	// check if we need to set the PLCA node count, node ID, or both
1361 	if (plca_cfg->node_cnt >= 0 || plca_cfg->node_id >= 0) {
1362 		/* if one between node count and node ID is -not- to be
1363 		 * changed, read the register to later perform merge/purge of
1364 		 * the configuration as appropriate
1365 		 */
1366 		if (plca_cfg->node_cnt < 0 || plca_cfg->node_id < 0) {
1367 			ret = phy_read_mmd(phydev, MDIO_MMD_VEND2,
1368 					   MDIO_OATC14_PLCA_CTRL1);
1369 
1370 			if (ret < 0)
1371 				return ret;
1372 
1373 			val = ret;
1374 		}
1375 
1376 		if (plca_cfg->node_cnt >= 0)
1377 			val = (val & ~MDIO_OATC14_PLCA_NCNT) |
1378 			      (plca_cfg->node_cnt << 8);
1379 
1380 		if (plca_cfg->node_id >= 0)
1381 			val = (val & ~MDIO_OATC14_PLCA_ID) |
1382 			      (plca_cfg->node_id);
1383 
1384 		ret = phy_write_mmd(phydev, MDIO_MMD_VEND2,
1385 				    MDIO_OATC14_PLCA_CTRL1, val);
1386 
1387 		if (ret < 0)
1388 			return ret;
1389 	}
1390 
1391 	if (plca_cfg->to_tmr >= 0) {
1392 		ret = phy_write_mmd(phydev, MDIO_MMD_VEND2,
1393 				    MDIO_OATC14_PLCA_TOTMR,
1394 				    plca_cfg->to_tmr);
1395 
1396 		if (ret < 0)
1397 			return ret;
1398 	}
1399 
1400 	// check if we need to set the PLCA burst count, burst timer, or both
1401 	if (plca_cfg->burst_cnt >= 0 || plca_cfg->burst_tmr >= 0) {
1402 		/* if one between burst count and burst timer is -not- to be
1403 		 * changed, read the register to later perform merge/purge of
1404 		 * the configuration as appropriate
1405 		 */
1406 		if (plca_cfg->burst_cnt < 0 || plca_cfg->burst_tmr < 0) {
1407 			ret = phy_read_mmd(phydev, MDIO_MMD_VEND2,
1408 					   MDIO_OATC14_PLCA_BURST);
1409 
1410 			if (ret < 0)
1411 				return ret;
1412 
1413 			val = ret;
1414 		}
1415 
1416 		if (plca_cfg->burst_cnt >= 0)
1417 			val = (val & ~MDIO_OATC14_PLCA_MAXBC) |
1418 			      (plca_cfg->burst_cnt << 8);
1419 
1420 		if (plca_cfg->burst_tmr >= 0)
1421 			val = (val & ~MDIO_OATC14_PLCA_BTMR) |
1422 			      (plca_cfg->burst_tmr);
1423 
1424 		ret = phy_write_mmd(phydev, MDIO_MMD_VEND2,
1425 				    MDIO_OATC14_PLCA_BURST, val);
1426 
1427 		if (ret < 0)
1428 			return ret;
1429 	}
1430 
1431 	// if we need to enable PLCA, do it at the end
1432 	if (plca_cfg->enabled > 0) {
1433 		ret = phy_set_bits_mmd(phydev, MDIO_MMD_VEND2,
1434 				       MDIO_OATC14_PLCA_CTRL0,
1435 				       MDIO_OATC14_PLCA_EN);
1436 
1437 		if (ret < 0)
1438 			return ret;
1439 	}
1440 
1441 	return 0;
1442 }
1443 EXPORT_SYMBOL_GPL(genphy_c45_plca_set_cfg);
1444 
1445 /**
1446  * genphy_c45_plca_get_status - get PLCA status from standard registers
1447  * @phydev: target phy_device struct
1448  * @plca_st: output structure to store the PLCA status
1449  *
1450  * Description: if the PHY complies to the Open Alliance TC14 10BASE-T1S PLCA
1451  *   Management Registers specifications, this function can be used to retrieve
1452  *   the current PLCA status information from the standard registers in MMD 31.
1453  */
genphy_c45_plca_get_status(struct phy_device * phydev,struct phy_plca_status * plca_st)1454 int genphy_c45_plca_get_status(struct phy_device *phydev,
1455 			       struct phy_plca_status *plca_st)
1456 {
1457 	int ret;
1458 
1459 	ret = phy_read_mmd(phydev, MDIO_MMD_VEND2, MDIO_OATC14_PLCA_STATUS);
1460 	if (ret < 0)
1461 		return ret;
1462 
1463 	plca_st->pst = !!(ret & MDIO_OATC14_PLCA_PST);
1464 	return 0;
1465 }
1466 EXPORT_SYMBOL_GPL(genphy_c45_plca_get_status);
1467 
1468 /**
1469  * genphy_c45_eee_is_active - get EEE status
1470  * @phydev: target phy_device struct
1471  * @lp: variable to store LP advertised linkmodes
1472  *
1473  * Description: this function will read link partner PHY advertisement
1474  * and compare it to local advertisement to return current EEE state.
1475  */
genphy_c45_eee_is_active(struct phy_device * phydev,unsigned long * lp)1476 int genphy_c45_eee_is_active(struct phy_device *phydev, unsigned long *lp)
1477 {
1478 	__ETHTOOL_DECLARE_LINK_MODE_MASK(tmp_lp) = {};
1479 	__ETHTOOL_DECLARE_LINK_MODE_MASK(common);
1480 	int ret;
1481 
1482 	if (!phydev->eee_cfg.eee_enabled)
1483 		return 0;
1484 
1485 	ret = genphy_c45_read_eee_lpa(phydev, tmp_lp);
1486 	if (ret)
1487 		return ret;
1488 
1489 	if (lp)
1490 		linkmode_copy(lp, tmp_lp);
1491 
1492 	linkmode_and(common, phydev->advertising_eee, tmp_lp);
1493 	if (linkmode_empty(common))
1494 		return 0;
1495 
1496 	return phy_check_valid(phydev->speed, phydev->duplex, common);
1497 }
1498 EXPORT_SYMBOL(genphy_c45_eee_is_active);
1499 
1500 /**
1501  * genphy_c45_ethtool_get_eee - get EEE supported and status
1502  * @phydev: target phy_device struct
1503  * @data: ethtool_keee data
1504  *
1505  * Description: it reports the Supported/Advertisement/LP Advertisement
1506  * capabilities.
1507  */
genphy_c45_ethtool_get_eee(struct phy_device * phydev,struct ethtool_keee * data)1508 int genphy_c45_ethtool_get_eee(struct phy_device *phydev,
1509 			       struct ethtool_keee *data)
1510 {
1511 	int ret;
1512 
1513 	ret = genphy_c45_eee_is_active(phydev, data->lp_advertised);
1514 	if (ret < 0)
1515 		return ret;
1516 
1517 	data->eee_active = phydev->eee_active;
1518 	linkmode_andnot(data->supported, phydev->supported_eee,
1519 			phydev->eee_disabled_modes);
1520 	linkmode_copy(data->advertised, phydev->advertising_eee);
1521 	return 0;
1522 }
1523 EXPORT_SYMBOL(genphy_c45_ethtool_get_eee);
1524 
1525 /**
1526  * genphy_c45_ethtool_set_eee - set EEE supported and status
1527  * @phydev: target phy_device struct
1528  * @data: ethtool_keee data
1529  *
1530  * Description: sets the Supported/Advertisement/LP Advertisement
1531  * capabilities. If eee_enabled is false, no links modes are
1532  * advertised, but the previously advertised link modes are
1533  * retained. This allows EEE to be enabled/disabled in a
1534  * non-destructive way.
1535  * Returns either error code, 0 if there was no change, or positive
1536  * value if there was a change which triggered auto-neg.
1537  */
genphy_c45_ethtool_set_eee(struct phy_device * phydev,struct ethtool_keee * data)1538 int genphy_c45_ethtool_set_eee(struct phy_device *phydev,
1539 			       struct ethtool_keee *data)
1540 {
1541 	int ret;
1542 
1543 	if (data->eee_enabled) {
1544 		unsigned long *adv = data->advertised;
1545 
1546 		if (!linkmode_empty(adv)) {
1547 			__ETHTOOL_DECLARE_LINK_MODE_MASK(tmp);
1548 
1549 			if (linkmode_andnot(tmp, adv, phydev->supported_eee)) {
1550 				phydev_warn(phydev, "At least some EEE link modes are not supported.\n");
1551 				return -EINVAL;
1552 			}
1553 
1554 			linkmode_andnot(phydev->advertising_eee, adv,
1555 					phydev->eee_disabled_modes);
1556 		} else if (linkmode_empty(phydev->advertising_eee)) {
1557 			phy_advertise_eee_all(phydev);
1558 		}
1559 	}
1560 
1561 	ret = genphy_c45_an_config_eee_aneg(phydev);
1562 	if (ret > 0) {
1563 		ret = phy_restart_aneg(phydev);
1564 		if (ret < 0)
1565 			return ret;
1566 
1567 		/* explicitly return 1, otherwise (ret > 0) value will be
1568 		 * overwritten by phy_restart_aneg().
1569 		 */
1570 		return 1;
1571 	}
1572 
1573 	return ret;
1574 }
1575 EXPORT_SYMBOL(genphy_c45_ethtool_set_eee);
1576 
1577 struct phy_driver genphy_c45_driver = {
1578 	.phy_id         = 0xffffffff,
1579 	.phy_id_mask    = 0xffffffff,
1580 	.name           = "Generic Clause 45 PHY",
1581 	.read_status    = genphy_c45_read_status,
1582 };
1583