[net-next v1 6/6] net: stmmac: ethtool: Do NOT call phylink function in NCSI mode.

From: Minda Chen

Date: Wed Jun 10 2026 - 04:02:51 EST


stmmac ethtool module do not call phylink function
while GMAC NCSI mode.
stmmac_ethtool_get_link_ksettings() return NCSI defaut
speed and duplex setting, except that most cases return
-EOPNOTSUPP error code.

Signed-off-by: Minda Chen <minda.chen@xxxxxxxxxxxxxxxx>
---
.../ethernet/stmicro/stmmac/stmmac_ethtool.c | 32 ++++++++++++++++++-
1 file changed, 31 insertions(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c
index 92585d27ab88..149d3b9536ce 100644
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c
@@ -322,6 +322,12 @@ static int stmmac_ethtool_get_link_ksettings(struct net_device *dev,
{
struct stmmac_priv *priv = netdev_priv(dev);

+ if (priv->plat->use_ncsi) {
+ cmd->base.speed = SPEED_100;
+ cmd->base.duplex = DUPLEX_FULL;
+ return 0;
+ }
+
return phylink_ethtool_ksettings_get(priv->phylink, cmd);
}

@@ -331,6 +337,9 @@ stmmac_ethtool_set_link_ksettings(struct net_device *dev,
{
struct stmmac_priv *priv = netdev_priv(dev);

+ if (priv->plat->use_ncsi)
+ return -EOPNOTSUPP;
+
return phylink_ethtool_ksettings_set(priv->phylink, cmd);
}

@@ -384,6 +393,9 @@ static int stmmac_nway_reset(struct net_device *dev)
{
struct stmmac_priv *priv = netdev_priv(dev);

+ if (priv->plat->use_ncsi)
+ return -EOPNOTSUPP;
+
return phylink_ethtool_nway_reset(priv->phylink);
}

@@ -424,6 +436,9 @@ stmmac_get_pauseparam(struct net_device *netdev,
{
struct stmmac_priv *priv = netdev_priv(netdev);

+ if (priv->plat->use_ncsi)
+ return;
+
phylink_ethtool_get_pauseparam(priv->phylink, pause);
}

@@ -433,6 +448,9 @@ stmmac_set_pauseparam(struct net_device *netdev,
{
struct stmmac_priv *priv = netdev_priv(netdev);

+ if (priv->plat->use_ncsi)
+ return -EOPNOTSUPP;
+
return phylink_ethtool_set_pauseparam(priv->phylink, pause);
}

@@ -547,7 +565,7 @@ static void stmmac_get_ethtool_stats(struct net_device *dev,
(*(u32 *)p);
}
}
- if (priv->dma_cap.eee) {
+ if (priv->dma_cap.eee && !priv->plat->use_ncsi) {
int val = phylink_get_eee_err(priv->phylink);
if (val)
priv->xstats.phy_eee_wakeup_error_n = val;
@@ -723,6 +741,9 @@ static void stmmac_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
{
struct stmmac_priv *priv = netdev_priv(dev);

+ if (priv->plat->use_ncsi)
+ return;
+
return phylink_ethtool_get_wol(priv->phylink, wol);
}

@@ -730,6 +751,9 @@ static int stmmac_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
{
struct stmmac_priv *priv = netdev_priv(dev);

+ if (priv->plat->use_ncsi)
+ return -EOPNOTSUPP;
+
return phylink_ethtool_set_wol(priv->phylink, wol);
}

@@ -738,6 +762,9 @@ static int stmmac_ethtool_op_get_eee(struct net_device *dev,
{
struct stmmac_priv *priv = netdev_priv(dev);

+ if (priv->plat->use_ncsi)
+ return -EOPNOTSUPP;
+
return phylink_ethtool_get_eee(priv->phylink, edata);
}

@@ -746,6 +773,9 @@ static int stmmac_ethtool_op_set_eee(struct net_device *dev,
{
struct stmmac_priv *priv = netdev_priv(dev);

+ if (priv->plat->use_ncsi)
+ return -EOPNOTSUPP;
+
return phylink_ethtool_set_eee(priv->phylink, edata);
}

--
2.17.1