mirror of
https://github.com/torvalds/linux.git
synced 2026-05-31 02:24:24 +02:00
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>
This commit is contained in:
commit
74eecb7c62
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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 @@ static int __stmmac_open(struct net_device *dev,
|
|||
|
||||
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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user