val = phy_read(phydev, MII_VSC73XX_PHY_BYPASS_CTRL);
switch (mdix) { case ETH_TP_MDI:
val |= MII_VSC73XX_PBC_FOR_SPD_AUTO_MDIX_DIS |
MII_VSC73XX_PBC_PAIR_SWAP_DIS |
MII_VSC73XX_PBC_POL_INV_DIS; break; case ETH_TP_MDI_X: /* When MDI-X auto configuration is disabled, is possible * to force only MDI mode. Let's use autoconfig for forced * MDIX mode.
*/ case ETH_TP_MDI_AUTO:
val &= ~(MII_VSC73XX_PBC_FOR_SPD_AUTO_MDIX_DIS |
MII_VSC73XX_PBC_PAIR_SWAP_DIS |
MII_VSC73XX_PBC_POL_INV_DIS); break; default: return -EINVAL;
}
ret = phy_write(phydev, MII_VSC73XX_PHY_BYPASS_CTRL, val); if (ret) return ret;
return genphy_restart_aneg(phydev);
}
staticint vsc73xx_config_aneg(struct phy_device *phydev)
{ int ret;
ret = vsc73xx_mdix_set(phydev, phydev->mdix_ctrl); if (ret) return ret;
staticint vsc73xx_read_status(struct phy_device *phydev)
{ int ret;
ret = vsc73xx_mdix_get(phydev, &phydev->mdix); if (ret < 0) return ret;
return genphy_read_status(phydev);
}
/* This adds a skew for both TX and RX clocks, so the skew should only be * applied to "rgmii-id" interfaces. It may not work as expected * on "rgmii-txid", "rgmii-rxid" or "rgmii" interfaces.
*/ staticint vsc8601_add_skew(struct phy_device *phydev)
{ int ret;
ret = phy_read(phydev, MII_VSC8601_EPHY_CTL); if (ret < 0) return ret;
ret |= MII_VSC8601_EPHY_CTL_RGMII_SKEW; return phy_write(phydev, MII_VSC8601_EPHY_CTL, ret);
}
staticint vsc8601_config_init(struct phy_device *phydev)
{ int ret = 0;
if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID)
ret = vsc8601_add_skew(phydev);
if (ret < 0) return ret;
return 0;
}
staticint vsc82xx_config_intr(struct phy_device *phydev)
{ int err;
if (phydev->interrupts == PHY_INTERRUPT_ENABLED) /* Don't bother to ACK the interrupts since the 824x cannot * clear the interrupts if they are disabled.
*/
err = phy_write(phydev, MII_VSC8244_IMASK,
(phydev->drv->phy_id == PHY_ID_VSC8234 ||
phydev->drv->phy_id == PHY_ID_VSC8244 ||
phydev->drv->phy_id == PHY_ID_VSC8572 ||
phydev->drv->phy_id == PHY_ID_VSC8601) ?
MII_VSC8244_IMASK_MASK :
MII_VSC8221_IMASK_MASK); else { /* The Vitesse PHY cannot clear the interrupt * once it has disabled them, so we clear them first
*/
err = phy_read(phydev, MII_VSC8244_ISTAT);
if (err < 0) return err;
err = phy_write(phydev, MII_VSC8244_IMASK, 0);
}
return err;
}
static irqreturn_t vsc82xx_handle_interrupt(struct phy_device *phydev)
{ int irq_status, irq_mask;
/* Perhaps we should set EXT_CON1 based on the interface? * Options are 802.3Z SerDes or SGMII
*/
}
/* vsc82x4_config_autocross_enable - Enable auto MDI/MDI-X for forced links * @phydev: target phy_device struct * * Enable auto MDI/MDI-X when in 10/100 forced link speeds by writing * special values in the VSC8234/VSC8244 extended reserved registers
*/ staticint vsc82x4_config_autocross_enable(struct phy_device *phydev)
{ int ret;
if (phydev->autoneg == AUTONEG_ENABLE || phydev->speed > SPEED_100) return 0;
/* map extended registers set 0x10 - 0x1e */
ret = phy_write(phydev, MII_VSC82X4_EXT_PAGE_ACCESS, 0x52b5); if (ret >= 0)
ret = phy_write(phydev, MII_VSC82X4_EXT_PAGE_18E, 0x0012); if (ret >= 0)
ret = phy_write(phydev, MII_VSC82X4_EXT_PAGE_17E, 0x2803); if (ret >= 0)
ret = phy_write(phydev, MII_VSC82X4_EXT_PAGE_16E, 0x87fa); /* map standard registers set 0x10 - 0x1e */ if (ret >= 0)
ret = phy_write(phydev, MII_VSC82X4_EXT_PAGE_ACCESS, 0x0000); else
phy_write(phydev, MII_VSC82X4_EXT_PAGE_ACCESS, 0x0000);
return ret;
}
/* vsc82x4_config_aneg - restart auto-negotiation or write BMCR * @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 write the BMCR and also start the auto * MDI/MDI-X feature
*/ staticint vsc82x4_config_aneg(struct phy_device *phydev)
{ int ret;
/* Enable auto MDI/MDI-X when in 10/100 forced link speeds by * writing special values in the VSC8234 extended reserved registers
*/ if (phydev->autoneg != AUTONEG_ENABLE && phydev->speed <= SPEED_100) {
ret = genphy_setup_forced(phydev);
¤ 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.0.13Bemerkung:
(vorverarbeitet am 2026-04-28)
¤
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.