net: phy: vitesse: add inband caps and configuration

Add support for VSC8662 reporting its inband capabilities, and also
hook to configure the PHY's inband mode.

This fixes a regression in the macb driver caused by commit
1338cfef1f ("net: macb: fix SGMII with inband aneg disabled")

Cc: stable+noautosel@kernel.org # neither this nor commit under fixes should be backported
Reported-by: Conor Dooley <conor@kernel.org>
Link: https://lore.kernel.org/r/20260304-nebulizer-rounding-40fbc81a2ba1@spud
Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
Tested-by: Conor Dooley <conor.dooley@microchip.com>
Tested-by: Geert Uytterhoeven <geert+renesas@glider.be>
Fixes: 1338cfef1f ("net: macb: fix SGMII with inband aneg disabled")
Link: https://patch.msgid.link/E1w082O-0000000ChNc-1wDz@rmk-PC.armlinux.org.uk
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
Russell King (Oracle)
2026-03-11 01:07:00 +00:00
committed by Jakub Kicinski
parent 7c52f407f2
commit 6e263aadba

View File

@@ -62,6 +62,13 @@
/* Vitesse Extended Page Access Register */
#define MII_VSC82X4_EXT_PAGE_ACCESS 0x1f
/* Vitesse VSC8662 extended control register */
#define VSC8662_EXT_CON1 0x17
#define VSC8662_EXT_CON_MAC_AN BIT(13)
#define VSC8662_MAC_AN 0x1b
#define VSC8662_MAC_AN_BYPASS BIT(13)
/* Vitesse VSC73XX Extended Control Register */
#define MII_VSC73XX_PHY_CTRL_EXT3 0x14
@@ -140,6 +147,38 @@ static int vsc824x_config_init(struct phy_device *phydev)
return err;
}
static unsigned int vsc8662_inband_caps(struct phy_device *phydev,
phy_interface_t interface)
{
if (interface == PHY_INTERFACE_MODE_SGMII)
return LINK_INBAND_DISABLE | LINK_INBAND_ENABLE |
LINK_INBAND_BYPASS;
return 0;
}
static int vsc8662_config_inband(struct phy_device *phydev, unsigned int modes)
{
u16 mask, set;
int ret;
mask = VSC8662_MAC_AN_BYPASS;
set = modes & LINK_INBAND_BYPASS ? mask : 0;
ret = phy_modify(phydev, VSC8662_MAC_AN, mask, set);
if (ret < 0)
return ret;
mask = VSC8662_EXT_CON_MAC_AN;
set = modes & (LINK_INBAND_ENABLE | LINK_INBAND_BYPASS) ? mask : 0;
ret = phy_modify_changed(phydev, VSC8662_EXT_CON1, mask, set);
if (ret <= 0)
return ret;
/* We need to soft-reset the PHY when changing VSC8662_EXT_CON_MAC_AN */
return genphy_soft_reset(phydev);
}
#define VSC73XX_EXT_PAGE_ACCESS 0x1f
static int vsc73xx_read_page(struct phy_device *phydev)
@@ -649,6 +688,8 @@ static struct phy_driver vsc82xx_driver[] = {
.phy_id_mask = 0x000ffff0,
/* PHY_GBIT_FEATURES */
.config_init = &vsc824x_config_init,
.inband_caps = vsc8662_inband_caps,
.config_inband = vsc8662_config_inband,
.config_aneg = &vsc82x4_config_aneg,
.config_intr = &vsc82xx_config_intr,
.handle_interrupt = &vsc82xx_handle_interrupt,