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