/* Write magic number to safely stall MCU */
phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_HOST_CMD1, 0x1100);
phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_HOST_CMD2, 0x00df);
for (i = 0; i < MT7988_2P5GE_PMB_FW_SIZE - 1; i += 4)
writel(*((uint32_t *)(fw->data + i)), pmb_addr + i);
writew(reg & ~MD32_EN, mcu_csr_base + MD32_EN_CFG);
writew(reg | MD32_EN, mcu_csr_base + MD32_EN_CFG);
phy_set_bits(phydev, MII_BMCR, BMCR_RESET); /* We need a delay here to stabilize initialization of MCU */
usleep_range(7000, 8000);
staticint mt798x_2p5ge_phy_config_init(struct phy_device *phydev)
{ /* Check if PHY interface type is compatible */ if (phydev->interface != PHY_INTERFACE_MODE_INTERNAL) return -ENODEV;
staticint mt798x_2p5ge_phy_get_features(struct phy_device *phydev)
{ int ret;
ret = genphy_c45_pma_read_abilities(phydev); if (ret) return ret;
/* This phy can't handle collision, and neither can (XFI)MAC it's * connected to. Although it can do HDX handshake, it doesn't support * CSMA/CD that HDX requires.
*/
linkmode_clear_bit(ETHTOOL_LINK_MODE_100baseT_Half_BIT,
phydev->supported);
return 0;
}
staticint mt798x_2p5ge_phy_read_status(struct phy_device *phydev)
{ int ret;
/* When MDIO_STAT1_LSTATUS is raised genphy_c45_read_link(), this phy * actually hasn't finished AN. So use CL22's link update function * instead.
*/
ret = genphy_update_link(phydev); if (ret) return ret;
/* We'll read link speed through vendor specific registers down below. * So remove phy_resolve_aneg_linkmode (AN on) & genphy_c45_read_pma * (AN off).
*/ if (phydev->autoneg == AUTONEG_ENABLE && phydev->autoneg_complete) {
ret = genphy_c45_read_lpa(phydev); if (ret < 0) return ret;
/* Clause 45 doesn't define 1000BaseT support. Read the link * partner's 1G advertisement via Clause 22.
*/
ret = phy_read(phydev, MII_STAT1000); if (ret < 0) return ret;
mii_stat1000_mod_linkmode_lpa_t(phydev->lp_advertising, ret);
} elseif (phydev->autoneg == AUTONEG_DISABLE) {
linkmode_zero(phydev->lp_advertising);
}
if (phydev->link) {
ret = phy_read(phydev, PHY_AUX_CTRL_STATUS); if (ret < 0) return ret;
switch (FIELD_GET(PHY_AUX_SPEED_MASK, ret)) { case PHY_AUX_SPD_10:
phydev->speed = SPEED_10; break; case PHY_AUX_SPD_100:
phydev->speed = SPEED_100; break; case PHY_AUX_SPD_1000:
phydev->speed = SPEED_1000; break; case PHY_AUX_SPD_2500:
phydev->speed = SPEED_2500; break;
}
/* Switch pinctrl after setting polarity to avoid bogus blinking */
pinctrl = devm_pinctrl_get_select(&phydev->mdio.dev, "i2p5gbe-led"); if (IS_ERR(pinctrl))
dev_err(&phydev->mdio.dev, "Fail to set LED pins!\n");
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.