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 while (mmd_mask
&& link
) {
223 devad
= __ffs(mmd_mask
);
224 mmd_mask
&= ~BIT(devad
);
226 /* The link state is latched low so that momentary link
227 * drops can be detected. Do not double-read the status
228 * in polling mode to detect such short link drops.
230 if (!phy_polling_mode(phydev
)) {
231 val
= phy_read_mmd(phydev
, devad
, MDIO_STAT1
);
234 else if (val
& MDIO_STAT1_LSTATUS
)
238 val
= phy_read_mmd(phydev
, devad
, MDIO_STAT1
);
242 if (!(val
& MDIO_STAT1_LSTATUS
))
250 EXPORT_SYMBOL_GPL(genphy_c45_read_link
);
253 * genphy_c45_read_lpa - read the link partner advertisement and pause
254 * @phydev: target phy_device struct
256 * Read the Clause 45 defined base (7.19) and 10G (7.33) status registers,
257 * filling in the link partner advertisement, pause and asym_pause members
258 * in @phydev. This assumes that the auto-negotiation MMD is present, and
259 * the backplane bit (7.48.0) is clear. Clause 45 PHY drivers are expected
260 * to fill in the remainder of the link partner advert from vendor registers.
262 int genphy_c45_read_lpa(struct phy_device
*phydev
)
266 val
= phy_read_mmd(phydev
, MDIO_MMD_AN
, MDIO_STAT1
);
270 if (!(val
& MDIO_AN_STAT1_COMPLETE
)) {
271 linkmode_clear_bit(ETHTOOL_LINK_MODE_Autoneg_BIT
,
272 phydev
->lp_advertising
);
273 mii_10gbt_stat_mod_linkmode_lpa_t(phydev
->lp_advertising
, 0);
274 mii_adv_mod_linkmode_adv_t(phydev
->lp_advertising
, 0);
276 phydev
->asym_pause
= 0;
281 linkmode_mod_bit(ETHTOOL_LINK_MODE_Autoneg_BIT
, phydev
->lp_advertising
,
282 val
& MDIO_AN_STAT1_LPABLE
);
284 /* Read the link partner's base page advertisement */
285 val
= phy_read_mmd(phydev
, MDIO_MMD_AN
, MDIO_AN_LPA
);
289 mii_adv_mod_linkmode_adv_t(phydev
->lp_advertising
, val
);
290 phydev
->pause
= val
& LPA_PAUSE_CAP
? 1 : 0;
291 phydev
->asym_pause
= val
& LPA_PAUSE_ASYM
? 1 : 0;
293 /* Read the link partner's 10G advertisement */
294 val
= phy_read_mmd(phydev
, MDIO_MMD_AN
, MDIO_AN_10GBT_STAT
);
298 mii_10gbt_stat_mod_linkmode_lpa_t(phydev
->lp_advertising
, val
);
302 EXPORT_SYMBOL_GPL(genphy_c45_read_lpa
);
305 * genphy_c45_read_pma - read link speed etc from PMA
306 * @phydev: target phy_device struct
308 int genphy_c45_read_pma(struct phy_device
*phydev
)
312 val
= phy_read_mmd(phydev
, MDIO_MMD_PMAPMD
, MDIO_CTRL1
);
316 switch (val
& MDIO_CTRL1_SPEEDSEL
) {
318 phydev
->speed
= SPEED_10
;
320 case MDIO_PMA_CTRL1_SPEED100
:
321 phydev
->speed
= SPEED_100
;
323 case MDIO_PMA_CTRL1_SPEED1000
:
324 phydev
->speed
= SPEED_1000
;
326 case MDIO_CTRL1_SPEED2_5G
:
327 phydev
->speed
= SPEED_2500
;
329 case MDIO_CTRL1_SPEED5G
:
330 phydev
->speed
= SPEED_5000
;
332 case MDIO_CTRL1_SPEED10G
:
333 phydev
->speed
= SPEED_10000
;
336 phydev
->speed
= SPEED_UNKNOWN
;
340 phydev
->duplex
= DUPLEX_FULL
;
344 EXPORT_SYMBOL_GPL(genphy_c45_read_pma
);
347 * genphy_c45_read_mdix - read mdix status from PMA
348 * @phydev: target phy_device struct
350 int genphy_c45_read_mdix(struct phy_device
*phydev
)
354 if (phydev
->speed
== SPEED_10000
) {
355 val
= phy_read_mmd(phydev
, MDIO_MMD_PMAPMD
,
356 MDIO_PMA_10GBT_SWAPPOL
);
361 case MDIO_PMA_10GBT_SWAPPOL_ABNX
| MDIO_PMA_10GBT_SWAPPOL_CDNX
:
362 phydev
->mdix
= ETH_TP_MDI
;
366 phydev
->mdix
= ETH_TP_MDI_X
;
370 phydev
->mdix
= ETH_TP_MDI_INVALID
;
377 EXPORT_SYMBOL_GPL(genphy_c45_read_mdix
);
380 * genphy_c45_pma_read_abilities - read supported link modes from PMA
381 * @phydev: target phy_device struct
383 * Read the supported link modes from the PMA Status 2 (1.8) register. If bit
384 * 1.8.9 is set, the list of supported modes is build using the values in the
385 * PMA Extended Abilities (1.11) register, indicating 1000BASET an 10G related
386 * modes. If bit 1.11.14 is set, then the list is also extended with the modes
387 * in the 2.5G/5G PMA Extended register (1.21), indicating if 2.5GBASET and
388 * 5GBASET are supported.
390 int genphy_c45_pma_read_abilities(struct phy_device
*phydev
)
394 linkmode_clear_bit(ETHTOOL_LINK_MODE_Autoneg_BIT
, phydev
->supported
);
395 if (phydev
->c45_ids
.devices_in_package
& MDIO_DEVS_AN
) {
396 val
= phy_read_mmd(phydev
, MDIO_MMD_AN
, MDIO_STAT1
);
400 if (val
& MDIO_AN_STAT1_ABLE
)
401 linkmode_set_bit(ETHTOOL_LINK_MODE_Autoneg_BIT
,
405 val
= phy_read_mmd(phydev
, MDIO_MMD_PMAPMD
, MDIO_STAT2
);
409 linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseSR_Full_BIT
,
411 val
& MDIO_PMA_STAT2_10GBSR
);
413 linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseLR_Full_BIT
,
415 val
& MDIO_PMA_STAT2_10GBLR
);
417 linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseER_Full_BIT
,
419 val
& MDIO_PMA_STAT2_10GBER
);
421 if (val
& MDIO_PMA_STAT2_EXTABLE
) {
422 val
= phy_read_mmd(phydev
, MDIO_MMD_PMAPMD
, MDIO_PMA_EXTABLE
);
426 linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseLRM_Full_BIT
,
428 val
& MDIO_PMA_EXTABLE_10GBLRM
);
429 linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseT_Full_BIT
,
431 val
& MDIO_PMA_EXTABLE_10GBT
);
432 linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseKX4_Full_BIT
,
434 val
& MDIO_PMA_EXTABLE_10GBKX4
);
435 linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseKR_Full_BIT
,
437 val
& MDIO_PMA_EXTABLE_10GBKR
);
438 linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT
,
440 val
& MDIO_PMA_EXTABLE_1000BT
);
441 linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseKX_Full_BIT
,
443 val
& MDIO_PMA_EXTABLE_1000BKX
);
445 linkmode_mod_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT
,
447 val
& MDIO_PMA_EXTABLE_100BTX
);
448 linkmode_mod_bit(ETHTOOL_LINK_MODE_100baseT_Half_BIT
,
450 val
& MDIO_PMA_EXTABLE_100BTX
);
452 linkmode_mod_bit(ETHTOOL_LINK_MODE_10baseT_Full_BIT
,
454 val
& MDIO_PMA_EXTABLE_10BT
);
455 linkmode_mod_bit(ETHTOOL_LINK_MODE_10baseT_Half_BIT
,
457 val
& MDIO_PMA_EXTABLE_10BT
);
459 if (val
& MDIO_PMA_EXTABLE_NBT
) {
460 val
= phy_read_mmd(phydev
, MDIO_MMD_PMAPMD
,
461 MDIO_PMA_NG_EXTABLE
);
465 linkmode_mod_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT
,
467 val
& MDIO_PMA_NG_EXTABLE_2_5GBT
);
469 linkmode_mod_bit(ETHTOOL_LINK_MODE_5000baseT_Full_BIT
,
471 val
& MDIO_PMA_NG_EXTABLE_5GBT
);
477 EXPORT_SYMBOL_GPL(genphy_c45_pma_read_abilities
);
480 * genphy_c45_read_status - read PHY status
481 * @phydev: target phy_device struct
483 * Reads status from PHY and sets phy_device members accordingly.
485 int genphy_c45_read_status(struct phy_device
*phydev
)
489 ret
= genphy_c45_read_link(phydev
);
493 phydev
->speed
= SPEED_UNKNOWN
;
494 phydev
->duplex
= DUPLEX_UNKNOWN
;
496 phydev
->asym_pause
= 0;
498 if (phydev
->autoneg
== AUTONEG_ENABLE
) {
499 ret
= genphy_c45_read_lpa(phydev
);
503 phy_resolve_aneg_linkmode(phydev
);
505 ret
= genphy_c45_read_pma(phydev
);
510 EXPORT_SYMBOL_GPL(genphy_c45_read_status
);
512 /* The gen10g_* functions are the old Clause 45 stub */
514 int gen10g_config_aneg(struct phy_device
*phydev
)
518 EXPORT_SYMBOL_GPL(gen10g_config_aneg
);
520 struct phy_driver genphy_c45_driver
= {
521 .phy_id
= 0xffffffff,
522 .phy_id_mask
= 0xffffffff,
523 .name
= "Generic Clause 45 PHY",
524 .soft_reset
= genphy_no_soft_reset
,
525 .read_status
= genphy_c45_read_status
,