net: stmmac: Use mutex instead of spinlock

fix_speed, clk_set_rate functions need to sleep under a lock.
So there is no need for spinlock. Replaced spinlock with mutex.

Change-Id: Icf0c7d15585bbd2ce370df0c2ff32e1fc5a5d384
Signed-off-by: Sneh Shah <snehshah@codeaurora.org>
tirimbino
Sneh Shah 6 years ago
parent 8f930152e0
commit aa338cd0f1
  1. 4
      drivers/net/ethernet/stmicro/stmmac/stmmac.h
  2. 12
      drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c
  3. 27
      drivers/net/ethernet/stmicro/stmmac/stmmac_main.c

@ -96,7 +96,9 @@ struct stmmac_priv {
struct net_device *dev;
struct device *device;
struct mac_device_info *hw;
spinlock_t lock;
/* Mutex lock */
struct mutex lock;
/* RX Queue */
struct stmmac_rx_queue rx_queue[MTL_MAX_RX_QUEUES];

@ -392,13 +392,13 @@ stmmac_ethtool_set_link_ksettings(struct net_device *dev,
ADVERTISED_10baseT_Half |
ADVERTISED_10baseT_Full);
spin_lock(&priv->lock);
mutex_lock(&priv->lock);
if (priv->hw->mac->pcs_ctrl_ane)
priv->hw->mac->pcs_ctrl_ane(priv->ioaddr, 1,
priv->hw->ps, 0);
spin_unlock(&priv->lock);
mutex_unlock(&priv->lock);
return 0;
}
@ -615,12 +615,12 @@ static void stmmac_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
{
struct stmmac_priv *priv = netdev_priv(dev);
spin_lock_irq(&priv->lock);
mutex_lock(&priv->lock);
if (device_can_wakeup(priv->device)) {
wol->supported = WAKE_MAGIC | WAKE_UCAST;
wol->wolopts = priv->wolopts;
}
spin_unlock_irq(&priv->lock);
mutex_unlock(&priv->lock);
}
static int stmmac_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
@ -649,9 +649,9 @@ static int stmmac_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
disable_irq_wake(priv->wol_irq);
}
spin_lock_irq(&priv->lock);
mutex_lock(&priv->lock);
priv->wolopts = wol->wolopts;
spin_unlock_irq(&priv->lock);
mutex_unlock(&priv->lock);
return 0;
}

@ -392,7 +392,7 @@ bool stmmac_eee_init(struct stmmac_priv *priv)
* changed).
* In that case the driver disable own timers.
*/
spin_lock_irqsave(&priv->lock, flags);
mutex_lock(&priv->lock);
if (priv->eee_active) {
netdev_dbg(priv->dev, "disable EEE\n");
del_timer_sync(&priv->eee_ctrl_timer);
@ -400,11 +400,11 @@ bool stmmac_eee_init(struct stmmac_priv *priv)
tx_lpi_timer);
}
priv->eee_active = 0;
spin_unlock_irqrestore(&priv->lock, flags);
mutex_unlock(&priv->lock);
goto out;
}
/* Activate the EEE and start timers */
spin_lock_irqsave(&priv->lock, flags);
mutex_lock(&priv->lock);
if (!priv->eee_active) {
priv->eee_active = 1;
setup_timer(&priv->eee_ctrl_timer,
@ -421,7 +421,7 @@ bool stmmac_eee_init(struct stmmac_priv *priv)
priv->hw->mac->set_eee_pls(priv->hw, ndev->phydev->link);
ret = true;
spin_unlock_irqrestore(&priv->lock, flags);
mutex_unlock(&priv->lock);
netdev_dbg(priv->dev, "Energy-Efficient Ethernet initialized\n");
}
@ -805,7 +805,7 @@ static void stmmac_adjust_link(struct net_device *dev)
if (!phydev)
return;
spin_lock_irqsave(&priv->lock, flags);
mutex_lock(&priv->lock);
if (phydev->link) {
u32 ctrl = readl(priv->ioaddr + MAC_CTRL_REG);
@ -864,7 +864,7 @@ static void stmmac_adjust_link(struct net_device *dev)
if (new_state && netif_msg_link(priv))
phy_print_status(phydev);
spin_unlock_irqrestore(&priv->lock, flags);
mutex_unlock(&priv->lock);
if (phydev->is_pseudo_fixed_link)
/* Stop PHY layer to call the hook to adjust the link in case
@ -4268,7 +4268,7 @@ int stmmac_dvr_probe(struct device *device,
(8 * priv->plat->rx_queues_to_use));
}
spin_lock_init(&priv->lock);
mutex_init(&priv->lock);
/* If a specific clk_csr value is passed from the platform
* this means that the CSR Clock Range selection cannot be
@ -4359,6 +4359,7 @@ int stmmac_dvr_remove(struct device *dev)
priv->hw->pcs != STMMAC_PCS_TBI &&
priv->hw->pcs != STMMAC_PCS_RTBI)
stmmac_mdio_unregister(ndev);
mutex_destroy(&priv->lock);
free_netdev(ndev);
return 0;
@ -4384,7 +4385,7 @@ int stmmac_suspend(struct device *dev)
if (ndev->phydev)
phy_stop(ndev->phydev);
spin_lock_irqsave(&priv->lock, flags);
mutex_lock(&priv->lock);
netif_device_detach(ndev);
stmmac_stop_all_queues(priv);
@ -4405,7 +4406,7 @@ int stmmac_suspend(struct device *dev)
clk_disable(priv->plat->pclk);
clk_disable(priv->plat->stmmac_clk);
}
spin_unlock_irqrestore(&priv->lock, flags);
mutex_unlock(&priv->lock);
priv->oldlink = false;
priv->speed = SPEED_UNKNOWN;
@ -4461,9 +4462,9 @@ int stmmac_resume(struct device *dev)
* from another devices (e.g. serial console).
*/
if (device_may_wakeup(priv->device)) {
spin_lock_irqsave(&priv->lock, flags);
mutex_lock(&priv->lock);
priv->hw->mac->pmt(priv->hw, 0);
spin_unlock_irqrestore(&priv->lock, flags);
mutex_unlock(&priv->lock);
priv->irq_wake = 0;
} else {
pinctrl_pm_select_default_state(priv->device);
@ -4477,7 +4478,7 @@ int stmmac_resume(struct device *dev)
netif_device_attach(ndev);
spin_lock_irqsave(&priv->lock, flags);
mutex_lock(&priv->lock);
stmmac_reset_queues_param(priv);
@ -4496,7 +4497,7 @@ int stmmac_resume(struct device *dev)
stmmac_start_all_queues(priv);
spin_unlock_irqrestore(&priv->lock, flags);
mutex_unlock(&priv->lock);
if (ndev->phydev)
phy_start(ndev->phydev);

Loading…
Cancel
Save