net: phy: Support speed selection for PHY loopback

phy_loopback() leaves it to the PHY driver to select the speed of the
loopback mode. Thus, the speed of the loopback mode depends on the PHY
driver in use.

Add support for speed selection to phy_loopback() to enable loopback
with defined speeds. Ensure that link up is signaled if speed changes
as speed is not allowed to change during link up. Link down and up is
necessary for a new speed.

Signed-off-by: Gerhard Engleder <gerhard@engleder-embedded.com>
Link: https://patch.msgid.link/20250312203010.47429-3-gerhard@engleder-embedded.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
Gerhard Engleder
2025-03-12 21:30:07 +01:00
committed by Paolo Abeni
parent 45456e38c4
commit 0d60fd5032
9 changed files with 100 additions and 48 deletions

View File

@@ -1818,41 +1818,6 @@ int phy_resume(struct phy_device *phydev)
}
EXPORT_SYMBOL(phy_resume);
int phy_loopback(struct phy_device *phydev, bool enable)
{
int ret = 0;
if (!phydev->drv)
return -EIO;
mutex_lock(&phydev->lock);
if (enable && phydev->loopback_enabled) {
ret = -EBUSY;
goto out;
}
if (!enable && !phydev->loopback_enabled) {
ret = -EINVAL;
goto out;
}
if (phydev->drv->set_loopback)
ret = phydev->drv->set_loopback(phydev, enable, 0);
else
ret = genphy_loopback(phydev, enable, 0);
if (ret)
goto out;
phydev->loopback_enabled = enable;
out:
mutex_unlock(&phydev->lock);
return ret;
}
EXPORT_SYMBOL(phy_loopback);
/**
* phy_reset_after_clk_enable - perform a PHY reset if needed
* @phydev: target phy_device struct