diff options
| author | Jakub Kicinski <kuba@kernel.org> | 2025-09-24 17:40:29 -0700 | 
|---|---|---|
| committer | Jakub Kicinski <kuba@kernel.org> | 2025-09-24 17:40:29 -0700 | 
| commit | 74eecb7c62d10f1feeb0a0d56bed605b7804a51a (patch) | |
| tree | 5881f7fe82a4a6aa11bfc70d50857fdb5ee2b3d9 | |
| parent | 1d7e08325090045b6b08ecda6f9eaa471d309880 (diff) | |
| parent | 50acea3662bf54f3ea2cb6ca2db66ca3b1a0a0ee (diff) | |
Merge branch 'net-stmmac-yet-more-cleanups'
Russell King says:
====================
net: stmmac: yet more cleanups
Building on the previous cleanup series, this cleans up yet more stmmac
code.
- Move stmmac_bus_clks_config() into stmmac_platform() which is where
  its onlny user is.
- Move the xpcs Clause 73 test into stmmac_init_phy(), resulting in
  simpler code in __stmmac_open().
- Move "can't attach PHY" error message into stmmac_init_phy().
We then start moving stuff out of __stmac_open() into stmmac_open()
(and correspondingly __stmmac_release() into stmmac_release()) which
is not necessary when re-initialising the interface on e.g. MTU change.
- Move initialisation of tx_lpi_timer
- Move PHY attachment/detachment
- Move PHY error message into stmmac_init_phy()
Finally, simplfy the paths in stmmac_init_phy().
====================
Link: https://patch.msgid.link/aNKDqqI7aLsuDD52@shell.armlinux.org.uk
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
| -rw-r--r-- | drivers/net/ethernet/stmicro/stmmac/stmmac.h | 1 | ||||
| -rw-r--r-- | drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 111 | ||||
| -rw-r--r-- | drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c | 32 | 
3 files changed, 73 insertions, 71 deletions
| diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac.h b/drivers/net/ethernet/stmicro/stmmac/stmmac.h index 151f08e5e85d..7ca5477be390 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac.h +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac.h @@ -404,7 +404,6 @@ int stmmac_dvr_probe(struct device *device,  		     struct stmmac_resources *res);  int stmmac_reinit_queues(struct net_device *dev, u32 rx_cnt, u32 tx_cnt);  int stmmac_reinit_ringparam(struct net_device *dev, u32 rx_size, u32 tx_size); -int stmmac_bus_clks_config(struct stmmac_priv *priv, bool enabled);  int stmmac_set_clk_tx_rate(void *bsp_priv, struct clk *clk_tx_i,  			   phy_interface_t interface, int speed); diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c index d17820d9e7f1..be064f240895 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c @@ -147,39 +147,6 @@ static void stmmac_exit_fs(struct net_device *dev);  #define STMMAC_COAL_TIMER(x) (ns_to_ktime((x) * NSEC_PER_USEC)) -int stmmac_bus_clks_config(struct stmmac_priv *priv, bool enabled) -{ -	struct plat_stmmacenet_data *plat_dat = priv->plat; -	int ret; - -	if (enabled) { -		ret = clk_prepare_enable(plat_dat->stmmac_clk); -		if (ret) -			return ret; -		ret = clk_prepare_enable(plat_dat->pclk); -		if (ret) { -			clk_disable_unprepare(plat_dat->stmmac_clk); -			return ret; -		} -		if (plat_dat->clks_config) { -			ret = plat_dat->clks_config(plat_dat->bsp_priv, enabled); -			if (ret) { -				clk_disable_unprepare(plat_dat->stmmac_clk); -				clk_disable_unprepare(plat_dat->pclk); -				return ret; -			} -		} -	} else { -		clk_disable_unprepare(plat_dat->stmmac_clk); -		clk_disable_unprepare(plat_dat->pclk); -		if (plat_dat->clks_config) -			plat_dat->clks_config(plat_dat->bsp_priv, enabled); -	} - -	return 0; -} -EXPORT_SYMBOL_GPL(stmmac_bus_clks_config); -  /**   * stmmac_set_clk_tx_rate() - set the clock rate for the MAC transmit clock   * @bsp_priv: BSP private data structure (unused) @@ -1145,13 +1112,19 @@ static void stmmac_check_pcs_mode(struct stmmac_priv *priv)  static int stmmac_init_phy(struct net_device *dev)  {  	struct stmmac_priv *priv = netdev_priv(dev); +	int mode = priv->plat->phy_interface;  	struct fwnode_handle *phy_fwnode;  	struct fwnode_handle *fwnode; +	struct ethtool_keee eee;  	int ret;  	if (!phylink_expects_phy(priv->phylink))  		return 0; +	if (priv->hw->xpcs && +	    xpcs_get_an_mode(priv->hw->xpcs, mode) == DW_AN_C73) +		return 0; +  	fwnode = priv->plat->port_node;  	if (!fwnode)  		fwnode = dev_fwnode(priv->device); @@ -1185,19 +1158,20 @@ static int stmmac_init_phy(struct net_device *dev)  		ret = phylink_fwnode_phy_connect(priv->phylink, fwnode, 0);  	} -	if (ret == 0) { -		struct ethtool_keee eee; +	if (ret) { +		netdev_err(priv->dev, "cannot attach to PHY (error: %pe)\n", +			   ERR_PTR(ret)); +		return ret; +	} -		/* Configure phylib's copy of the LPI timer. Normally, -		 * phylink_config.lpi_timer_default would do this, but there is -		 * a chance that userspace could change the eee_timer setting -		 * via sysfs before the first open. Thus, preserve existing -		 * behaviour. -		 */ -		if (!phylink_ethtool_get_eee(priv->phylink, &eee)) { -			eee.tx_lpi_timer = priv->tx_lpi_timer; -			phylink_ethtool_set_eee(priv->phylink, &eee); -		} +	/* Configure phylib's copy of the LPI timer. Normally, +	 * phylink_config.lpi_timer_default would do this, but there is a +	 * chance that userspace could change the eee_timer setting via sysfs +	 * before the first open. Thus, preserve existing behaviour. +	 */ +	if (!phylink_ethtool_get_eee(priv->phylink, &eee)) { +		eee.tx_lpi_timer = priv->tx_lpi_timer; +		phylink_ethtool_set_eee(priv->phylink, &eee);  	}  	if (!priv->plat->pmt) { @@ -1208,7 +1182,7 @@ static int stmmac_init_phy(struct net_device *dev)  		device_set_wakeup_enable(priv->device, !!wol.wolopts);  	} -	return ret; +	return 0;  }  static int stmmac_phy_setup(struct stmmac_priv *priv) @@ -3959,25 +3933,9 @@ static int __stmmac_open(struct net_device *dev,  			 struct stmmac_dma_conf *dma_conf)  {  	struct stmmac_priv *priv = netdev_priv(dev); -	int mode = priv->plat->phy_interface;  	u32 chan;  	int ret; -	/* Initialise the tx lpi timer, converting from msec to usec */ -	if (!priv->tx_lpi_timer) -		priv->tx_lpi_timer = eee_timer * 1000; - -	if ((!priv->hw->xpcs || -	     xpcs_get_an_mode(priv->hw->xpcs, mode) != DW_AN_C73)) { -		ret = stmmac_init_phy(dev); -		if (ret) { -			netdev_err(priv->dev, -				   "%s: Cannot attach to PHY (error: %d)\n", -				   __func__, ret); -			return ret; -		} -	} -  	for (int i = 0; i < MTL_MAX_TX_QUEUES; i++)  		if (priv->dma_conf.tx_queue[i].tbs & STMMAC_TBS_EN)  			dma_conf->tx_queue[i].tbs = priv->dma_conf.tx_queue[i].tbs; @@ -4027,7 +3985,6 @@ irq_error:  	stmmac_release_ptp(priv);  init_error: -	phylink_disconnect_phy(priv->phylink);  	return ret;  } @@ -4037,24 +3994,38 @@ static int stmmac_open(struct net_device *dev)  	struct stmmac_dma_conf *dma_conf;  	int ret; +	/* Initialise the tx lpi timer, converting from msec to usec */ +	if (!priv->tx_lpi_timer) +		priv->tx_lpi_timer = eee_timer * 1000; +  	dma_conf = stmmac_setup_dma_desc(priv, dev->mtu);  	if (IS_ERR(dma_conf))  		return PTR_ERR(dma_conf);  	ret = pm_runtime_resume_and_get(priv->device);  	if (ret < 0) -		goto err; +		goto err_dma_resources; + +	ret = stmmac_init_phy(dev); +	if (ret) +		goto err_runtime_pm;  	ret = __stmmac_open(dev, dma_conf); -	if (ret) { -		pm_runtime_put(priv->device); -err: -		free_dma_desc_resources(priv, dma_conf); -	} +	if (ret) +		goto err_disconnect_phy;  	kfree(dma_conf);  	return ret; + +err_disconnect_phy: +	phylink_disconnect_phy(priv->phylink); +err_runtime_pm: +	pm_runtime_put(priv->device); +err_dma_resources: +	free_dma_desc_resources(priv, dma_conf); +	kfree(dma_conf); +	return ret;  }  static void __stmmac_release(struct net_device *dev) @@ -4071,7 +4042,6 @@ static void __stmmac_release(struct net_device *dev)  	/* Stop and disconnect the PHY */  	phylink_stop(priv->phylink); -	phylink_disconnect_phy(priv->phylink);  	stmmac_disable_all_queues(priv); @@ -4111,6 +4081,7 @@ static int stmmac_release(struct net_device *dev)  	__stmmac_release(dev); +	phylink_disconnect_phy(priv->phylink);  	pm_runtime_put(priv->device);  	return 0; diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c index 712ef235f0f4..27bcaae07a7f 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c @@ -911,6 +911,38 @@ void stmmac_pltfr_remove(struct platform_device *pdev)  }  EXPORT_SYMBOL_GPL(stmmac_pltfr_remove); +static int stmmac_bus_clks_config(struct stmmac_priv *priv, bool enabled) +{ +	struct plat_stmmacenet_data *plat_dat = priv->plat; +	int ret; + +	if (enabled) { +		ret = clk_prepare_enable(plat_dat->stmmac_clk); +		if (ret) +			return ret; +		ret = clk_prepare_enable(plat_dat->pclk); +		if (ret) { +			clk_disable_unprepare(plat_dat->stmmac_clk); +			return ret; +		} +		if (plat_dat->clks_config) { +			ret = plat_dat->clks_config(plat_dat->bsp_priv, enabled); +			if (ret) { +				clk_disable_unprepare(plat_dat->stmmac_clk); +				clk_disable_unprepare(plat_dat->pclk); +				return ret; +			} +		} +	} else { +		clk_disable_unprepare(plat_dat->stmmac_clk); +		clk_disable_unprepare(plat_dat->pclk); +		if (plat_dat->clks_config) +			plat_dat->clks_config(plat_dat->bsp_priv, enabled); +	} + +	return 0; +} +  static int __maybe_unused stmmac_runtime_suspend(struct device *dev)  {  	struct net_device *ndev = dev_get_drvdata(dev); | 
