]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
net: stmmac: add support for configuring the phy_intf_sel inputs
authorRussell King (Oracle) <rmk+kernel@armlinux.org.uk>
Mon, 3 Nov 2025 11:50:15 +0000 (11:50 +0000)
committerJakub Kicinski <kuba@kernel.org>
Wed, 5 Nov 2025 00:21:25 +0000 (16:21 -0800)
When dwmac is synthesised with support for multiple PHY interfaces, the
core provides phy_intf_sel inputs, sampled on reset, to configure the
PHY facing interface. Use stmmac_get_phy_intf_sel() in core code to
determine the dwmac phy_intf_sel input value, and provide a new
platform method called with this value just before we issue a soft
reset to the dwmac core.

Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
Link: https://patch.msgid.link/E1vFt4h-0000000Chos-3wxX@rmk-PC.armlinux.org.uk
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
include/linux/stmmac.h

index 6d4323d04573292dae0eaf043eee72ac9e2907f0..ccf383b355e7579ed2ef0115e5919dc609919f1a 100644 (file)
@@ -3102,6 +3102,36 @@ int stmmac_get_phy_intf_sel(phy_interface_t interface)
 }
 EXPORT_SYMBOL_GPL(stmmac_get_phy_intf_sel);
 
+static int stmmac_prereset_configure(struct stmmac_priv *priv)
+{
+       struct plat_stmmacenet_data *plat_dat = priv->plat;
+       phy_interface_t interface;
+       int phy_intf_sel, ret;
+
+       if (!plat_dat->set_phy_intf_sel)
+               return 0;
+
+       interface = plat_dat->phy_interface;
+       phy_intf_sel = stmmac_get_phy_intf_sel(interface);
+       if (phy_intf_sel < 0) {
+               netdev_err(priv->dev,
+                          "failed to get phy_intf_sel for %s: %pe\n",
+                          phy_modes(interface), ERR_PTR(phy_intf_sel));
+               return phy_intf_sel;
+       }
+
+       ret = plat_dat->set_phy_intf_sel(plat_dat->bsp_priv, phy_intf_sel);
+       if (ret == -EINVAL)
+               netdev_err(priv->dev, "platform does not support %s\n",
+                          phy_modes(interface));
+       else if (ret < 0)
+               netdev_err(priv->dev,
+                          "platform failed to set interface %s: %pe\n",
+                          phy_modes(interface), ERR_PTR(ret));
+
+       return ret;
+}
+
 /**
  * stmmac_init_dma_engine - DMA init.
  * @priv: driver private structure
@@ -3128,6 +3158,10 @@ static int stmmac_init_dma_engine(struct stmmac_priv *priv)
        if (priv->extend_desc && (priv->mode == STMMAC_RING_MODE))
                priv->plat->dma_cfg->atds = 1;
 
+       ret = stmmac_prereset_configure(priv);
+       if (ret)
+               return ret;
+
        ret = stmmac_reset(priv, priv->ioaddr);
        if (ret) {
                netdev_err(priv->dev, "Failed to reset the dma\n");
index 151c81c560c8c448adab6ea95cf6f18b11d9f162..48e9f1d4e17e86f919710251dc9d463b7bf50b34 100644 (file)
@@ -250,6 +250,7 @@ struct plat_stmmacenet_data {
        struct stmmac_txq_cfg tx_queues_cfg[MTL_MAX_TX_QUEUES];
        void (*get_interfaces)(struct stmmac_priv *priv, void *bsp_priv,
                               unsigned long *interfaces);
+       int (*set_phy_intf_sel)(void *priv, u8 phy_intf_sel);
        int (*set_clk_tx_rate)(void *priv, struct clk *clk_tx_i,
                               phy_interface_t interface, int speed);
        void (*fix_mac_speed)(void *priv, int speed, unsigned int mode);