static int mv3310_config_aneg(struct phy_device *phydev) { bool changed = false; u32 advertising; int ret; /* We don't support manual MDI control */ phydev->mdix_ctrl = ETH_TP_MDI_AUTO; if (phydev->autoneg == AUTONEG_DISABLE) { ret = genphy_c45_pma_setup_forced(phydev); if (ret < 0) return ret; return genphy_c45_an_disable_aneg(phydev); } phydev->advertising &= phydev->supported; advertising = phydev->advertising; ret = mv3310_modify(phydev, MDIO_MMD_AN, MDIO_AN_ADVERTISE, ADVERTISE_ALL | ADVERTISE_100BASE4 | ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM, ethtool_adv_to_mii_adv_t(advertising)); if (ret < 0) return ret; if (ret > 0) changed = true; ret = mv3310_modify(phydev, MDIO_MMD_AN, MV_AN_CTRL1000, ADVERTISE_1000FULL | ADVERTISE_1000HALF, ethtool_adv_to_mii_ctrl1000_t(advertising)); if (ret < 0) return ret; if (ret > 0) changed = true; /* 10G control register */ ret = mv3310_modify(phydev, MDIO_MMD_AN, MDIO_AN_10GBT_CTRL, MDIO_AN_10GBT_CTRL_ADV10G, advertising & ADVERTISED_10000baseT_Full ? MDIO_AN_10GBT_CTRL_ADV10G : 0); if (ret < 0) return ret; if (ret > 0) changed = true; if (changed) ret = genphy_c45_restart_aneg(phydev); return ret; }
static int aqr_config_aneg(struct phy_device *phydev) { bool changed = false; u16 reg; int ret; if (phydev->autoneg == AUTONEG_DISABLE) return genphy_c45_pma_setup_forced(phydev); ret = genphy_c45_an_config_aneg(phydev); if (ret < 0) return ret; if (ret > 0) changed = true; /* Clause 45 has no standardized support for 1000BaseT, therefore * use vendor registers for this mode. */ reg = 0; if (linkmode_test_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT, phydev->advertising)) reg |= MDIO_AN_VEND_PROV_1000BASET_FULL; if (linkmode_test_bit(ETHTOOL_LINK_MODE_1000baseT_Half_BIT, phydev->advertising)) reg |= MDIO_AN_VEND_PROV_1000BASET_HALF; ret = phy_modify_mmd_changed(phydev, MDIO_MMD_AN, MDIO_AN_VEND_PROV, MDIO_AN_VEND_PROV_1000BASET_HALF | MDIO_AN_VEND_PROV_1000BASET_FULL, reg); if (ret < 0) return ret; if (ret > 0) changed = true; return genphy_c45_check_and_restart_aneg(phydev, changed); }