Commit 0d60fd50 authored by Gerhard Engleder's avatar Gerhard Engleder Committed by Paolo Abeni
Browse files

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: default avatarGerhard Engleder <gerhard@engleder-embedded.com>
Link: https://patch.msgid.link/20250312203010.47429-3-gerhard@engleder-embedded.com


Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parent 45456e38
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -223,7 +223,7 @@ static int tsnep_phy_loopback(struct tsnep_adapter *adapter, bool enable)
{
	int retval;

	retval = phy_loopback(adapter->phydev, enable);
	retval = phy_loopback(adapter->phydev, enable, 0);

	/* PHY link state change is not signaled if loopback is enabled, it
	 * would delay a working loopback anyway, let's ensure that loopback
+2 −2
Original line number Diff line number Diff line
@@ -266,9 +266,9 @@ static int hns_nic_config_phy_loopback(struct phy_device *phy_dev, u8 en)
		if (err)
			goto out;

		err = phy_loopback(phy_dev, true);
		err = phy_loopback(phy_dev, true, 0);
	} else {
		err = phy_loopback(phy_dev, false);
		err = phy_loopback(phy_dev, false, 0);
		if (err)
			goto out;

+2 −2
Original line number Diff line number Diff line
@@ -7875,7 +7875,7 @@ static int hclge_enable_phy_loopback(struct hclge_dev *hdev,
	if (ret)
		return ret;

	return phy_loopback(phydev, true);
	return phy_loopback(phydev, true, 0);
}

static int hclge_disable_phy_loopback(struct hclge_dev *hdev,
@@ -7883,7 +7883,7 @@ static int hclge_disable_phy_loopback(struct hclge_dev *hdev,
{
	int ret;

	ret = phy_loopback(phydev, false);
	ret = phy_loopback(phydev, false, 0);
	if (ret)
		return ret;

+1 −1
Original line number Diff line number Diff line
@@ -258,7 +258,7 @@ void hclge_mac_start_phy(struct hclge_dev *hdev)
	if (!phydev)
		return;

	phy_loopback(phydev, false);
	phy_loopback(phydev, false, 0);

	phy_start(phydev);
}
+4 −4
Original line number Diff line number Diff line
@@ -382,14 +382,14 @@ static int stmmac_test_phy_loopback(struct stmmac_priv *priv)
	if (!priv->dev->phydev)
		return -EOPNOTSUPP;

	ret = phy_loopback(priv->dev->phydev, true);
	ret = phy_loopback(priv->dev->phydev, true, 0);
	if (ret)
		return ret;

	attr.dst = priv->dev->dev_addr;
	ret = __stmmac_test_loopback(priv, &attr);

	phy_loopback(priv->dev->phydev, false);
	phy_loopback(priv->dev->phydev, false, 0);
	return ret;
}

@@ -1985,7 +1985,7 @@ void stmmac_selftest_run(struct net_device *dev,
		case STMMAC_LOOPBACK_PHY:
			ret = -EOPNOTSUPP;
			if (dev->phydev)
				ret = phy_loopback(dev->phydev, true);
				ret = phy_loopback(dev->phydev, true, 0);
			if (!ret)
				break;
			fallthrough;
@@ -2018,7 +2018,7 @@ void stmmac_selftest_run(struct net_device *dev,
		case STMMAC_LOOPBACK_PHY:
			ret = -EOPNOTSUPP;
			if (dev->phydev)
				ret = phy_loopback(dev->phydev, false);
				ret = phy_loopback(dev->phydev, false, 0);
			if (!ret)
				break;
			fallthrough;
Loading