Commit f0417e0e authored by Paolo Abeni's avatar Paolo Abeni
Browse files

Merge branch 'support-loopback-mode-speed-selection'

Gerhard Engleder says:

====================
Support loopback mode speed selection

Previously to commit 6ff3cddc ("net: phylib: do not disable autoneg
for fixed speeds >= 1G") it was possible to select the speed of the
loopback mode by configuring a fixed speed before enabling the loopback
mode. Now autoneg is always enabled for >= 1G and a fixed speed of >= 1G
requires successful autoneg. Thus, the speed of the loopback mode depends
on the link partner for >= 1G. There is no technical reason to depend on
the link partner for loopback mode. With this behavior the loopback mode
is less useful for testing.

Allow PHYs to support optional speed selection for the loopback mode.
This support is implemented for the generic loopback support and for PHY
drivers, which obviously support speed selection for loopback mode.
Additionally, loopback support according to the data sheet is added to
the KSZ9031 PHY.

Extend phy_loopback() to signal link up and down if speed changes,
because a new link speed requires link up signalling.

Use this loopback speed selection in the tsnep driver to select the
loopback mode speed depending the previously active speed. User space
tests with 100 Mbps and 1 Gbps loopback are possible again.
====================

Link: https://patch.msgid.link/20250312203010.47429-1-gerhard@engleder-embedded.com


Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parents 3d97da0e 163d744d
Loading
Loading
Loading
Loading
+10 −11
Original line number Diff line number Diff line
@@ -221,20 +221,19 @@ static void tsnep_phy_link_status_change(struct net_device *netdev)

static int tsnep_phy_loopback(struct tsnep_adapter *adapter, bool enable)
{
	int retval;

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

	/* PHY link state change is not signaled if loopback is enabled, it
	 * would delay a working loopback anyway, let's ensure that loopback
	 * is working immediately by setting link mode directly
	 */
	if (!retval && enable) {
		netif_carrier_on(adapter->netdev);
		tsnep_set_link_mode(adapter);
	if (enable) {
		if (adapter->phydev->autoneg == AUTONEG_DISABLE &&
		    adapter->phydev->speed == SPEED_100)
			speed = SPEED_100;
		else
			speed = SPEED_1000;
	} else {
		speed = 0;
	}

	return retval;
	return phy_loopback(adapter->phydev, enable, speed);
}

static int tsnep_phy_open(struct tsnep_adapter *adapter)
+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