With generic SerDes support, stmmac will need to do more work to ensure that clk_rx_i is running in all configurations. Rather than turn each site that calls phylink_rx_clk_stop_xxx() into a list of functions, move these to their own pair of functions so that they can be augmented at a single location. Reviewed-by: Maxime Chevallier Signed-off-by: Russell King (Oracle) --- .../net/ethernet/stmicro/stmmac/stmmac_main.c | 32 ++++++++++++------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c index c2589f02ff7e..24a2555ca329 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c @@ -3547,6 +3547,16 @@ static void stmmac_safety_feat_configuration(struct stmmac_priv *priv) } } +static void stmmac_clk_rx_i_require(struct stmmac_priv *priv) +{ + phylink_rx_clk_stop_block(priv->phylink); +} + +static void stmmac_clk_rx_i_release(struct stmmac_priv *priv) +{ + phylink_rx_clk_stop_unblock(priv->phylink); +} + /** * stmmac_hw_setup - setup mac in a usable state. * @dev : pointer to the device structure. @@ -3578,12 +3588,12 @@ static int stmmac_hw_setup(struct net_device *dev) * Block the receive clock stop for LPI mode at the PHY in case * the link is established with EEE mode active. */ - phylink_rx_clk_stop_block(priv->phylink); + stmmac_clk_rx_i_require(priv); /* DMA initialization and SW reset */ ret = stmmac_init_dma_engine(priv); if (ret < 0) { - phylink_rx_clk_stop_unblock(priv->phylink); + stmmac_clk_rx_i_release(priv); netdev_err(priv->dev, "%s: DMA engine initialization failed\n", __func__); return ret; @@ -3591,7 +3601,7 @@ static int stmmac_hw_setup(struct net_device *dev) /* Copy the MAC addr into the HW */ stmmac_set_umac_addr(priv, priv->hw, dev->dev_addr, 0); - phylink_rx_clk_stop_unblock(priv->phylink); + stmmac_clk_rx_i_release(priv); /* Initialize the MAC Core */ stmmac_core_init(priv, priv->hw, dev); @@ -3670,9 +3680,9 @@ static int stmmac_hw_setup(struct net_device *dev) /* Start the ball rolling... */ stmmac_start_all_dma(priv); - phylink_rx_clk_stop_block(priv->phylink); + stmmac_clk_rx_i_require(priv); stmmac_set_hw_vlan_mode(priv, priv->hw); - phylink_rx_clk_stop_unblock(priv->phylink); + stmmac_clk_rx_i_release(priv); return 0; } @@ -6107,9 +6117,9 @@ static int stmmac_set_features(struct net_device *netdev, else priv->hw->hw_vlan_en = false; - phylink_rx_clk_stop_block(priv->phylink); + stmmac_clk_rx_i_require(priv); stmmac_set_hw_vlan_mode(priv, priv->hw); - phylink_rx_clk_stop_unblock(priv->phylink); + stmmac_clk_rx_i_release(priv); return 0; } @@ -6378,9 +6388,9 @@ static int stmmac_set_mac_address(struct net_device *ndev, void *addr) if (ret) goto set_mac_error; - phylink_rx_clk_stop_block(priv->phylink); + stmmac_clk_rx_i_require(priv); stmmac_set_umac_addr(priv, priv->hw, ndev->dev_addr, 0); - phylink_rx_clk_stop_unblock(priv->phylink); + stmmac_clk_rx_i_release(priv); set_mac_error: pm_runtime_put(priv->device); @@ -8192,11 +8202,11 @@ int stmmac_resume(struct device *dev) stmmac_init_timestamping(priv); stmmac_init_coalesce(priv); - phylink_rx_clk_stop_block(priv->phylink); + stmmac_clk_rx_i_require(priv); stmmac_set_rx_mode(ndev); stmmac_restore_hw_vlan_rx_fltr(priv, ndev, priv->hw); - phylink_rx_clk_stop_unblock(priv->phylink); + stmmac_clk_rx_i_release(priv); stmmac_enable_all_queues(priv); stmmac_enable_all_dma_irq(priv); -- 2.47.3