// SPDX-License-Identifier: GPL-2.0-only /* * Clause 45 PHY support */ #include <linux/ethtool.h> #include <linux/export.h> #include <linux/mdio.h> #include <linux/mii.h> #include <linux/phy.h> #include "mdio-open-alliance.h" /** * genphy_c45_baset1_able - checks if the PMA has BASE-T1 extended abilities * @phydev: target phy_device struct */ static bool genphy_c45_baset1_able(struct phy_device *phydev) { … } /** * genphy_c45_pma_can_sleep - checks if the PMA have sleep support * @phydev: target phy_device struct */ static bool genphy_c45_pma_can_sleep(struct phy_device *phydev) { … } /** * genphy_c45_pma_resume - wakes up the PMA module * @phydev: target phy_device struct */ int genphy_c45_pma_resume(struct phy_device *phydev) { … } EXPORT_SYMBOL_GPL(…); /** * genphy_c45_pma_suspend - suspends the PMA module * @phydev: target phy_device struct */ int genphy_c45_pma_suspend(struct phy_device *phydev) { … } EXPORT_SYMBOL_GPL(…); /** * genphy_c45_pma_baset1_setup_master_slave - configures forced master/slave * role of BaseT1 devices. * @phydev: target phy_device struct */ int genphy_c45_pma_baset1_setup_master_slave(struct phy_device *phydev) { … } EXPORT_SYMBOL_GPL(…); /** * genphy_c45_pma_setup_forced - configures a forced speed * @phydev: target phy_device struct */ int genphy_c45_pma_setup_forced(struct phy_device *phydev) { … } EXPORT_SYMBOL_GPL(…); /* Sets master/slave preference and supported technologies. * The preference is set in the BIT(4) of BASE-T1 AN * advertisement register 7.515 and whether the status * is forced or not, it is set in the BIT(12) of BASE-T1 * AN advertisement register 7.514. * Sets 10BASE-T1L Ability BIT(14) in BASE-T1 autonegotiation * advertisement register [31:16] if supported. */ static int genphy_c45_baset1_an_config_aneg(struct phy_device *phydev) { … } /** * genphy_c45_an_config_aneg - configure advertisement registers * @phydev: target phy_device struct * * Configure advertisement registers based on modes set in phydev->advertising * * Returns negative errno code on failure, 0 if advertisement didn't change, * or 1 if advertised modes changed. */ int genphy_c45_an_config_aneg(struct phy_device *phydev) { … } EXPORT_SYMBOL_GPL(…); /** * genphy_c45_an_disable_aneg - disable auto-negotiation * @phydev: target phy_device struct * * Disable auto-negotiation in the Clause 45 PHY. The link parameters * are controlled through the PMA/PMD MMD registers. * * Returns zero on success, negative errno code on failure. */ int genphy_c45_an_disable_aneg(struct phy_device *phydev) { … } EXPORT_SYMBOL_GPL(…); /** * genphy_c45_restart_aneg - Enable and restart auto-negotiation * @phydev: target phy_device struct * * This assumes that the auto-negotiation MMD is present. * * Enable and restart auto-negotiation. */ int genphy_c45_restart_aneg(struct phy_device *phydev) { … } EXPORT_SYMBOL_GPL(…); /** * genphy_c45_check_and_restart_aneg - Enable and restart auto-negotiation * @phydev: target phy_device struct * @restart: whether aneg restart is requested * * This assumes that the auto-negotiation MMD is present. * * Check, and restart auto-negotiation if needed. */ int genphy_c45_check_and_restart_aneg(struct phy_device *phydev, bool restart) { … } EXPORT_SYMBOL_GPL(…); /** * genphy_c45_aneg_done - return auto-negotiation complete status * @phydev: target phy_device struct * * This assumes that the auto-negotiation MMD is present. * * Reads the status register from the auto-negotiation MMD, returning: * - positive if auto-negotiation is complete * - negative errno code on error * - zero otherwise */ int genphy_c45_aneg_done(struct phy_device *phydev) { … } EXPORT_SYMBOL_GPL(…); /** * genphy_c45_read_link - read the overall link status from the MMDs * @phydev: target phy_device struct * * Read the link status from the specified MMDs, and if they all indicate * that the link is up, set phydev->link to 1. If an error is encountered, * a negative errno will be returned, otherwise zero. */ int genphy_c45_read_link(struct phy_device *phydev) { … } EXPORT_SYMBOL_GPL(…); /* Read the Clause 45 defined BASE-T1 AN (7.513) status register to check * if autoneg is complete. If so read the BASE-T1 Autonegotiation * Advertisement registers filling in the link partner advertisement, * pause and asym_pause members in phydev. */ static int genphy_c45_baset1_read_lpa(struct phy_device *phydev) { … } /** * genphy_c45_read_lpa - read the link partner advertisement and pause * @phydev: target phy_device struct * * Read the Clause 45 defined base (7.19) and 10G (7.33) status registers, * filling in the link partner advertisement, pause and asym_pause members * in @phydev. This assumes that the auto-negotiation MMD is present, and * the backplane bit (7.48.0) is clear. Clause 45 PHY drivers are expected * to fill in the remainder of the link partner advert from vendor registers. */ int genphy_c45_read_lpa(struct phy_device *phydev) { … } EXPORT_SYMBOL_GPL(…); /** * genphy_c45_pma_baset1_read_master_slave - read forced master/slave * configuration * @phydev: target phy_device struct */ int genphy_c45_pma_baset1_read_master_slave(struct phy_device *phydev) { … } EXPORT_SYMBOL_GPL(…); /** * genphy_c45_read_pma - read link speed etc from PMA * @phydev: target phy_device struct */ int genphy_c45_read_pma(struct phy_device *phydev) { … } EXPORT_SYMBOL_GPL(…); /** * genphy_c45_read_mdix - read mdix status from PMA * @phydev: target phy_device struct */ int genphy_c45_read_mdix(struct phy_device *phydev) { … } EXPORT_SYMBOL_GPL(…); /** * genphy_c45_write_eee_adv - write advertised EEE link modes * @phydev: target phy_device struct * @adv: the linkmode advertisement settings */ int genphy_c45_write_eee_adv(struct phy_device *phydev, unsigned long *adv) { … } /** * genphy_c45_read_eee_adv - read advertised EEE link modes * @phydev: target phy_device struct * @adv: the linkmode advertisement status */ int genphy_c45_read_eee_adv(struct phy_device *phydev, unsigned long *adv) { … } /** * genphy_c45_read_eee_lpa - read advertised LP EEE link modes * @phydev: target phy_device struct * @lpa: the linkmode LP advertisement status */ static int genphy_c45_read_eee_lpa(struct phy_device *phydev, unsigned long *lpa) { … } /** * genphy_c45_read_eee_cap1 - read supported EEE link modes from register 3.20 * @phydev: target phy_device struct */ static int genphy_c45_read_eee_cap1(struct phy_device *phydev) { … } /** * genphy_c45_read_eee_cap2 - read supported EEE link modes from register 3.21 * @phydev: target phy_device struct */ static int genphy_c45_read_eee_cap2(struct phy_device *phydev) { … } /** * genphy_c45_read_eee_abilities - read supported EEE link modes * @phydev: target phy_device struct */ int genphy_c45_read_eee_abilities(struct phy_device *phydev) { … } EXPORT_SYMBOL_GPL(…); /** * genphy_c45_an_config_eee_aneg - configure EEE advertisement * @phydev: target phy_device struct */ int genphy_c45_an_config_eee_aneg(struct phy_device *phydev) { … } /** * genphy_c45_pma_baset1_read_abilities - read supported baset1 link modes from PMA * @phydev: target phy_device struct * * Read the supported link modes from the extended BASE-T1 ability register */ int genphy_c45_pma_baset1_read_abilities(struct phy_device *phydev) { … } EXPORT_SYMBOL_GPL(…); /** * genphy_c45_pma_read_ext_abilities - read supported link modes from PMA * @phydev: target phy_device struct * * Read the supported link modes from the PMA/PMD extended ability register * (Register 1.11). */ int genphy_c45_pma_read_ext_abilities(struct phy_device *phydev) { … } EXPORT_SYMBOL_GPL(…); /** * genphy_c45_pma_read_abilities - read supported link modes from PMA * @phydev: target phy_device struct * * Read the supported link modes from the PMA Status 2 (1.8) register. If bit * 1.8.9 is set, the list of supported modes is build using the values in the * PMA Extended Abilities (1.11) register, indicating 1000BASET an 10G related * modes. If bit 1.11.14 is set, then the list is also extended with the modes * in the 2.5G/5G PMA Extended register (1.21), indicating if 2.5GBASET and * 5GBASET are supported. */ int genphy_c45_pma_read_abilities(struct phy_device *phydev) { … } EXPORT_SYMBOL_GPL(…); /* Read master/slave preference from registers. * The preference is read from the BIT(4) of BASE-T1 AN * advertisement register 7.515 and whether the preference * is forced or not, it is read from BASE-T1 AN advertisement * register 7.514. */ int genphy_c45_baset1_read_status(struct phy_device *phydev) { … } EXPORT_SYMBOL_GPL(…); /** * genphy_c45_read_status - read PHY status * @phydev: target phy_device struct * * Reads status from PHY and sets phy_device members accordingly. */ int genphy_c45_read_status(struct phy_device *phydev) { … } EXPORT_SYMBOL_GPL(…); /** * genphy_c45_config_aneg - restart auto-negotiation or forced setup * @phydev: target phy_device struct * * Description: If auto-negotiation is enabled, we configure the * advertising, and then restart auto-negotiation. If it is not * enabled, then we force a configuration. */ int genphy_c45_config_aneg(struct phy_device *phydev) { … } EXPORT_SYMBOL_GPL(…); /* The gen10g_* functions are the old Clause 45 stub */ int gen10g_config_aneg(struct phy_device *phydev) { … } EXPORT_SYMBOL_GPL(…); int genphy_c45_loopback(struct phy_device *phydev, bool enable) { … } EXPORT_SYMBOL_GPL(…); /** * genphy_c45_fast_retrain - configure fast retrain registers * @phydev: target phy_device struct * @enable: enable fast retrain or not * * Description: If fast-retrain is enabled, we configure PHY as * advertising fast retrain capable and THP Bypass Request, then * enable fast retrain. If it is not enabled, we configure fast * retrain disabled. */ int genphy_c45_fast_retrain(struct phy_device *phydev, bool enable) { … } EXPORT_SYMBOL_GPL(…); /** * genphy_c45_plca_get_cfg - get PLCA configuration from standard registers * @phydev: target phy_device struct * @plca_cfg: output structure to store the PLCA configuration * * Description: if the PHY complies to the Open Alliance TC14 10BASE-T1S PLCA * Management Registers specifications, this function can be used to retrieve * the current PLCA configuration from the standard registers in MMD 31. */ int genphy_c45_plca_get_cfg(struct phy_device *phydev, struct phy_plca_cfg *plca_cfg) { … } EXPORT_SYMBOL_GPL(…); /** * genphy_c45_plca_set_cfg - set PLCA configuration using standard registers * @phydev: target phy_device struct * @plca_cfg: structure containing the PLCA configuration. Fields set to -1 are * not to be changed. * * Description: if the PHY complies to the Open Alliance TC14 10BASE-T1S PLCA * Management Registers specifications, this function can be used to modify * the PLCA configuration using the standard registers in MMD 31. */ int genphy_c45_plca_set_cfg(struct phy_device *phydev, const struct phy_plca_cfg *plca_cfg) { … } EXPORT_SYMBOL_GPL(…); /** * genphy_c45_plca_get_status - get PLCA status from standard registers * @phydev: target phy_device struct * @plca_st: output structure to store the PLCA status * * Description: if the PHY complies to the Open Alliance TC14 10BASE-T1S PLCA * Management Registers specifications, this function can be used to retrieve * the current PLCA status information from the standard registers in MMD 31. */ int genphy_c45_plca_get_status(struct phy_device *phydev, struct phy_plca_status *plca_st) { … } EXPORT_SYMBOL_GPL(…); /** * genphy_c45_eee_is_active - get EEE status * @phydev: target phy_device struct * @adv: variable to store advertised linkmodes * @lp: variable to store LP advertised linkmodes * @is_enabled: variable to store EEE enabled/disabled configuration value * * Description: this function will read local and link partner PHY * advertisements. Compare them return current EEE state. */ int genphy_c45_eee_is_active(struct phy_device *phydev, unsigned long *adv, unsigned long *lp, bool *is_enabled) { … } EXPORT_SYMBOL(…); /** * genphy_c45_ethtool_get_eee - get EEE supported and status * @phydev: target phy_device struct * @data: ethtool_keee data * * Description: it reports the Supported/Advertisement/LP Advertisement * capabilities. */ int genphy_c45_ethtool_get_eee(struct phy_device *phydev, struct ethtool_keee *data) { … } EXPORT_SYMBOL(…); /** * genphy_c45_ethtool_set_eee - set EEE supported and status * @phydev: target phy_device struct * @data: ethtool_keee data * * Description: sets the Supported/Advertisement/LP Advertisement * capabilities. If eee_enabled is false, no links modes are * advertised, but the previously advertised link modes are * retained. This allows EEE to be enabled/disabled in a * non-destructive way. * Returns either error code, 0 if there was no change, or positive * value if there was a change which triggered auto-neg. */ int genphy_c45_ethtool_set_eee(struct phy_device *phydev, struct ethtool_keee *data) { … } EXPORT_SYMBOL(…); struct phy_driver genphy_c45_driver = …;