1 // SPDX-License-Identifier: GPL-2.0-only
3 * Clause 45 PHY support
5 #include <linux/ethtool.h>
6 #include <linux/export.h>
7 #include <linux/mdio.h>
12 * genphy_c45_setup_forced - configures a forced speed
13 * @phydev: target phy_device struct
15 int genphy_c45_pma_setup_forced(struct phy_device
*phydev
)
17 int ctrl1
, ctrl2
, ret
;
19 /* Half duplex is not supported */
20 if (phydev
->duplex
!= DUPLEX_FULL
)
23 ctrl1
= phy_read_mmd(phydev
, MDIO_MMD_PMAPMD
, MDIO_CTRL1
);
27 ctrl2
= phy_read_mmd(phydev
, MDIO_MMD_PMAPMD
, MDIO_CTRL2
);
31 ctrl1
&= ~MDIO_CTRL1_SPEEDSEL
;
33 * PMA/PMD type selection is 1.7.5:0 not 1.7.3:0. See 45.2.1.6.1
34 * in 802.3-2012 and 802.3-2015.
36 ctrl2
&= ~(MDIO_PMA_CTRL2_TYPE
| 0x30);
38 switch (phydev
->speed
) {
40 ctrl2
|= MDIO_PMA_CTRL2_10BT
;
43 ctrl1
|= MDIO_PMA_CTRL1_SPEED100
;
44 ctrl2
|= MDIO_PMA_CTRL2_100BTX
;
47 ctrl1
|= MDIO_PMA_CTRL1_SPEED1000
;
48 /* Assume 1000base-T */
49 ctrl2
|= MDIO_PMA_CTRL2_1000BT
;
52 ctrl1
|= MDIO_CTRL1_SPEED2_5G
;
53 /* Assume 2.5Gbase-T */
54 ctrl2
|= MDIO_PMA_CTRL2_2_5GBT
;
57 ctrl1
|= MDIO_CTRL1_SPEED5G
;
59 ctrl2
|= MDIO_PMA_CTRL2_5GBT
;
62 ctrl1
|= MDIO_CTRL1_SPEED10G
;
63 /* Assume 10Gbase-T */
64 ctrl2
|= MDIO_PMA_CTRL2_10GBT
;
70 ret
= phy_write_mmd(phydev
, MDIO_MMD_PMAPMD
, MDIO_CTRL1
, ctrl1
);
74 ret
= phy_write_mmd(phydev
, MDIO_MMD_PMAPMD
, MDIO_CTRL2
, ctrl2
);
78 return genphy_c45_an_disable_aneg(phydev
);
80 EXPORT_SYMBOL_GPL(genphy_c45_pma_setup_forced
);
83 * genphy_c45_an_config_aneg - configure advertisement registers
84 * @phydev: target phy_device struct
86 * Configure advertisement registers based on modes set in phydev->advertising
88 * Returns negative errno code on failure, 0 if advertisement didn't change,
89 * or 1 if advertised modes changed.
91 int genphy_c45_an_config_aneg(struct phy_device
*phydev
)
96 linkmode_and(phydev
->advertising
, phydev
->advertising
,
99 changed
= genphy_config_eee_advert(phydev
);
101 adv
= linkmode_adv_to_mii_adv_t(phydev
->advertising
);
103 ret
= phy_modify_mmd_changed(phydev
, MDIO_MMD_AN
, MDIO_AN_ADVERTISE
,
104 ADVERTISE_ALL
| ADVERTISE_100BASE4
|
105 ADVERTISE_PAUSE_CAP
| ADVERTISE_PAUSE_ASYM
,
112 adv
= linkmode_adv_to_mii_10gbt_adv_t(phydev
->advertising
);
114 ret
= phy_modify_mmd_changed(phydev
, MDIO_MMD_AN
, MDIO_AN_10GBT_CTRL
,
115 MDIO_AN_10GBT_CTRL_ADV10G
|
116 MDIO_AN_10GBT_CTRL_ADV5G
|
117 MDIO_AN_10GBT_CTRL_ADV2_5G
, adv
);
125 EXPORT_SYMBOL_GPL(genphy_c45_an_config_aneg
);
128 * genphy_c45_an_disable_aneg - disable auto-negotiation
129 * @phydev: target phy_device struct
131 * Disable auto-negotiation in the Clause 45 PHY. The link parameters
132 * parameters are controlled through the PMA/PMD MMD registers.
134 * Returns zero on success, negative errno code on failure.
136 int genphy_c45_an_disable_aneg(struct phy_device
*phydev
)
139 return phy_clear_bits_mmd(phydev
, MDIO_MMD_AN
, MDIO_CTRL1
,
140 MDIO_AN_CTRL1_ENABLE
| MDIO_AN_CTRL1_RESTART
);
142 EXPORT_SYMBOL_GPL(genphy_c45_an_disable_aneg
);
145 * genphy_c45_restart_aneg - Enable and restart auto-negotiation
146 * @phydev: target phy_device struct
148 * This assumes that the auto-negotiation MMD is present.
150 * Enable and restart auto-negotiation.
152 int genphy_c45_restart_aneg(struct phy_device
*phydev
)
154 return phy_set_bits_mmd(phydev
, MDIO_MMD_AN
, MDIO_CTRL1
,
155 MDIO_AN_CTRL1_ENABLE
| MDIO_AN_CTRL1_RESTART
);
157 EXPORT_SYMBOL_GPL(genphy_c45_restart_aneg
);
160 * genphy_c45_check_and_restart_aneg - Enable and restart auto-negotiation
161 * @phydev: target phy_device struct
162 * @restart: whether aneg restart is requested
164 * This assumes that the auto-negotiation MMD is present.
166 * Check, and restart auto-negotiation if needed.
168 int genphy_c45_check_and_restart_aneg(struct phy_device
*phydev
, bool restart
)
173 /* Configure and restart aneg if it wasn't set before */
174 ret
= phy_read_mmd(phydev
, MDIO_MMD_AN
, MDIO_CTRL1
);
178 if (!(ret
& MDIO_AN_CTRL1_ENABLE
))
183 ret
= genphy_c45_restart_aneg(phydev
);
187 EXPORT_SYMBOL_GPL(genphy_c45_check_and_restart_aneg
);
190 * genphy_c45_aneg_done - return auto-negotiation complete status
191 * @phydev: target phy_device struct
193 * This assumes that the auto-negotiation MMD is present.
195 * Reads the status register from the auto-negotiation MMD, returning:
196 * - positive if auto-negotiation is complete
197 * - negative errno code on error
200 int genphy_c45_aneg_done(struct phy_device
*phydev
)
202 int val
= phy_read_mmd(phydev
, MDIO_MMD_AN
, MDIO_STAT1
);
204 return val
< 0 ? val
: val
& MDIO_AN_STAT1_COMPLETE
? 1 : 0;
206 EXPORT_SYMBOL_GPL(genphy_c45_aneg_done
);
209 * genphy_c45_read_link - read the overall link status from the MMDs
210 * @phydev: target phy_device struct
212 * Read the link status from the specified MMDs, and if they all indicate
213 * that the link is up, set phydev->link to 1. If an error is encountered,
214 * a negative errno will be returned, otherwise zero.
216 int genphy_c45_read_link(struct phy_device
*phydev
)
218 u32 mmd_mask
= MDIO_DEVS_PMAPMD
;
222 if (phydev
->c45_ids
.devices_in_package
& MDIO_DEVS_AN
) {
223 val
= phy_read_mmd(phydev
, MDIO_MMD_AN
, MDIO_CTRL1
);
227 /* Autoneg is being started, therefore disregard current
228 * link status and report link as down.
230 if (val
& MDIO_AN_CTRL1_RESTART
) {
236 while (mmd_mask
&& link
) {
237 devad
= __ffs(mmd_mask
);
238 mmd_mask
&= ~BIT(devad
);
240 /* The link state is latched low so that momentary link
241 * drops can be detected. Do not double-read the status
242 * in polling mode to detect such short link drops.
244 if (!phy_polling_mode(phydev
)) {
245 val
= phy_read_mmd(phydev
, devad
, MDIO_STAT1
);
248 else if (val
& MDIO_STAT1_LSTATUS
)
252 val
= phy_read_mmd(phydev
, devad
, MDIO_STAT1
);
256 if (!(val
& MDIO_STAT1_LSTATUS
))
264 EXPORT_SYMBOL_GPL(genphy_c45_read_link
);
267 * genphy_c45_read_lpa - read the link partner advertisement and pause
268 * @phydev: target phy_device struct
270 * Read the Clause 45 defined base (7.19) and 10G (7.33) status registers,
271 * filling in the link partner advertisement, pause and asym_pause members
272 * in @phydev. This assumes that the auto-negotiation MMD is present, and
273 * the backplane bit (7.48.0) is clear. Clause 45 PHY drivers are expected
274 * to fill in the remainder of the link partner advert from vendor registers.
276 int genphy_c45_read_lpa(struct phy_device
*phydev
)
280 val
= phy_read_mmd(phydev
, MDIO_MMD_AN
, MDIO_STAT1
);
284 if (!(val
& MDIO_AN_STAT1_COMPLETE
)) {
285 linkmode_clear_bit(ETHTOOL_LINK_MODE_Autoneg_BIT
,
286 phydev
->lp_advertising
);
287 mii_10gbt_stat_mod_linkmode_lpa_t(phydev
->lp_advertising
, 0);
288 mii_adv_mod_linkmode_adv_t(phydev
->lp_advertising
, 0);
290 phydev
->asym_pause
= 0;
295 linkmode_mod_bit(ETHTOOL_LINK_MODE_Autoneg_BIT
, phydev
->lp_advertising
,
296 val
& MDIO_AN_STAT1_LPABLE
);
298 /* Read the link partner's base page advertisement */
299 val
= phy_read_mmd(phydev
, MDIO_MMD_AN
, MDIO_AN_LPA
);
303 mii_adv_mod_linkmode_adv_t(phydev
->lp_advertising
, val
);
304 phydev
->pause
= val
& LPA_PAUSE_CAP
? 1 : 0;
305 phydev
->asym_pause
= val
& LPA_PAUSE_ASYM
? 1 : 0;
307 /* Read the link partner's 10G advertisement */
308 val
= phy_read_mmd(phydev
, MDIO_MMD_AN
, MDIO_AN_10GBT_STAT
);
312 mii_10gbt_stat_mod_linkmode_lpa_t(phydev
->lp_advertising
, val
);
316 EXPORT_SYMBOL_GPL(genphy_c45_read_lpa
);
319 * genphy_c45_read_pma - read link speed etc from PMA
320 * @phydev: target phy_device struct
322 int genphy_c45_read_pma(struct phy_device
*phydev
)
326 linkmode_zero(phydev
->lp_advertising
);
328 val
= phy_read_mmd(phydev
, MDIO_MMD_PMAPMD
, MDIO_CTRL1
);
332 switch (val
& MDIO_CTRL1_SPEEDSEL
) {
334 phydev
->speed
= SPEED_10
;
336 case MDIO_PMA_CTRL1_SPEED100
:
337 phydev
->speed
= SPEED_100
;
339 case MDIO_PMA_CTRL1_SPEED1000
:
340 phydev
->speed
= SPEED_1000
;
342 case MDIO_CTRL1_SPEED2_5G
:
343 phydev
->speed
= SPEED_2500
;
345 case MDIO_CTRL1_SPEED5G
:
346 phydev
->speed
= SPEED_5000
;
348 case MDIO_CTRL1_SPEED10G
:
349 phydev
->speed
= SPEED_10000
;
352 phydev
->speed
= SPEED_UNKNOWN
;
356 phydev
->duplex
= DUPLEX_FULL
;
360 EXPORT_SYMBOL_GPL(genphy_c45_read_pma
);
363 * genphy_c45_read_mdix - read mdix status from PMA
364 * @phydev: target phy_device struct
366 int genphy_c45_read_mdix(struct phy_device
*phydev
)
370 if (phydev
->speed
== SPEED_10000
) {
371 val
= phy_read_mmd(phydev
, MDIO_MMD_PMAPMD
,
372 MDIO_PMA_10GBT_SWAPPOL
);
377 case MDIO_PMA_10GBT_SWAPPOL_ABNX
| MDIO_PMA_10GBT_SWAPPOL_CDNX
:
378 phydev
->mdix
= ETH_TP_MDI
;
382 phydev
->mdix
= ETH_TP_MDI_X
;
386 phydev
->mdix
= ETH_TP_MDI_INVALID
;
393 EXPORT_SYMBOL_GPL(genphy_c45_read_mdix
);
396 * genphy_c45_pma_read_abilities - read supported link modes from PMA
397 * @phydev: target phy_device struct
399 * Read the supported link modes from the PMA Status 2 (1.8) register. If bit
400 * 1.8.9 is set, the list of supported modes is build using the values in the
401 * PMA Extended Abilities (1.11) register, indicating 1000BASET an 10G related
402 * modes. If bit 1.11.14 is set, then the list is also extended with the modes
403 * in the 2.5G/5G PMA Extended register (1.21), indicating if 2.5GBASET and
404 * 5GBASET are supported.
406 int genphy_c45_pma_read_abilities(struct phy_device
*phydev
)
410 linkmode_clear_bit(ETHTOOL_LINK_MODE_Autoneg_BIT
, phydev
->supported
);
411 if (phydev
->c45_ids
.devices_in_package
& MDIO_DEVS_AN
) {
412 val
= phy_read_mmd(phydev
, MDIO_MMD_AN
, MDIO_STAT1
);
416 if (val
& MDIO_AN_STAT1_ABLE
)
417 linkmode_set_bit(ETHTOOL_LINK_MODE_Autoneg_BIT
,
421 val
= phy_read_mmd(phydev
, MDIO_MMD_PMAPMD
, MDIO_STAT2
);
425 linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseSR_Full_BIT
,
427 val
& MDIO_PMA_STAT2_10GBSR
);
429 linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseLR_Full_BIT
,
431 val
& MDIO_PMA_STAT2_10GBLR
);
433 linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseER_Full_BIT
,
435 val
& MDIO_PMA_STAT2_10GBER
);
437 if (val
& MDIO_PMA_STAT2_EXTABLE
) {
438 val
= phy_read_mmd(phydev
, MDIO_MMD_PMAPMD
, MDIO_PMA_EXTABLE
);
442 linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseLRM_Full_BIT
,
444 val
& MDIO_PMA_EXTABLE_10GBLRM
);
445 linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseT_Full_BIT
,
447 val
& MDIO_PMA_EXTABLE_10GBT
);
448 linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseKX4_Full_BIT
,
450 val
& MDIO_PMA_EXTABLE_10GBKX4
);
451 linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseKR_Full_BIT
,
453 val
& MDIO_PMA_EXTABLE_10GBKR
);
454 linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT
,
456 val
& MDIO_PMA_EXTABLE_1000BT
);
457 linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseKX_Full_BIT
,
459 val
& MDIO_PMA_EXTABLE_1000BKX
);
461 linkmode_mod_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT
,
463 val
& MDIO_PMA_EXTABLE_100BTX
);
464 linkmode_mod_bit(ETHTOOL_LINK_MODE_100baseT_Half_BIT
,
466 val
& MDIO_PMA_EXTABLE_100BTX
);
468 linkmode_mod_bit(ETHTOOL_LINK_MODE_10baseT_Full_BIT
,
470 val
& MDIO_PMA_EXTABLE_10BT
);
471 linkmode_mod_bit(ETHTOOL_LINK_MODE_10baseT_Half_BIT
,
473 val
& MDIO_PMA_EXTABLE_10BT
);
475 if (val
& MDIO_PMA_EXTABLE_NBT
) {
476 val
= phy_read_mmd(phydev
, MDIO_MMD_PMAPMD
,
477 MDIO_PMA_NG_EXTABLE
);
481 linkmode_mod_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT
,
483 val
& MDIO_PMA_NG_EXTABLE_2_5GBT
);
485 linkmode_mod_bit(ETHTOOL_LINK_MODE_5000baseT_Full_BIT
,
487 val
& MDIO_PMA_NG_EXTABLE_5GBT
);
493 EXPORT_SYMBOL_GPL(genphy_c45_pma_read_abilities
);
496 * genphy_c45_read_status - read PHY status
497 * @phydev: target phy_device struct
499 * Reads status from PHY and sets phy_device members accordingly.
501 int genphy_c45_read_status(struct phy_device
*phydev
)
505 ret
= genphy_c45_read_link(phydev
);
509 phydev
->speed
= SPEED_UNKNOWN
;
510 phydev
->duplex
= DUPLEX_UNKNOWN
;
512 phydev
->asym_pause
= 0;
514 if (phydev
->autoneg
== AUTONEG_ENABLE
) {
515 ret
= genphy_c45_read_lpa(phydev
);
519 phy_resolve_aneg_linkmode(phydev
);
521 ret
= genphy_c45_read_pma(phydev
);
526 EXPORT_SYMBOL_GPL(genphy_c45_read_status
);
529 * genphy_c45_config_aneg - restart auto-negotiation or forced setup
530 * @phydev: target phy_device struct
532 * Description: If auto-negotiation is enabled, we configure the
533 * advertising, and then restart auto-negotiation. If it is not
534 * enabled, then we force a configuration.
536 int genphy_c45_config_aneg(struct phy_device
*phydev
)
538 bool changed
= false;
541 if (phydev
->autoneg
== AUTONEG_DISABLE
)
542 return genphy_c45_pma_setup_forced(phydev
);
544 ret
= genphy_c45_an_config_aneg(phydev
);
550 return genphy_c45_check_and_restart_aneg(phydev
, changed
);
552 EXPORT_SYMBOL_GPL(genphy_c45_config_aneg
);
554 /* The gen10g_* functions are the old Clause 45 stub */
556 int gen10g_config_aneg(struct phy_device
*phydev
)
560 EXPORT_SYMBOL_GPL(gen10g_config_aneg
);
562 struct phy_driver genphy_c45_driver
= {
563 .phy_id
= 0xffffffff,
564 .phy_id_mask
= 0xffffffff,
565 .name
= "Generic Clause 45 PHY",
566 .soft_reset
= genphy_no_soft_reset
,
567 .read_status
= genphy_c45_read_status
,