Re: [PATCH] net: stmmac: Use mutex instead of spinlock
From: Thierry Reding Date: Thu, 24 May 2018 16:09:07 +0200 > From: Thierry Reding > > Some drivers, such as DWC EQOS on Tegra, need to perform operations that > can sleep under this lock (clk_set_rate() in tegra_eqos_fix_speed()) for > proper operation. Since there is no need for this lock to be a spinlock, > convert it to a mutex instead. > > Fixes: e6ea2d16fc61 ("net: stmmac: dwc-qos: Add Tegra186 support") > Reported-by: Jon Hunter > Signed-off-by: Thierry Reding > --- > This applies on top of net-next. Applied to net-next.
Re: [PATCH] net: stmmac: Use mutex instead of spinlock
From: Thierry Reding Date: Thu, 24 May 2018 16:09:07 +0200 > From: Thierry Reding > > Some drivers, such as DWC EQOS on Tegra, need to perform operations that > can sleep under this lock (clk_set_rate() in tegra_eqos_fix_speed()) for > proper operation. Since there is no need for this lock to be a spinlock, > convert it to a mutex instead. > > Fixes: e6ea2d16fc61 ("net: stmmac: dwc-qos: Add Tegra186 support") > Reported-by: Jon Hunter > Signed-off-by: Thierry Reding > --- > This applies on top of net-next. Applied to net-next.
Re: [PATCH] net: stmmac: Use mutex instead of spinlock
Hi, On 5/24/2018 7:39 PM, Thierry Reding wrote: From: Thierry RedingSome drivers, such as DWC EQOS on Tegra, need to perform operations that can sleep under this lock (clk_set_rate() in tegra_eqos_fix_speed()) for proper operation. Since there is no need for this lock to be a spinlock, convert it to a mutex instead. Fixes: e6ea2d16fc61 ("net: stmmac: dwc-qos: Add Tegra186 support") Reported-by: Jon Hunter Signed-off-by: Thierry Reding --- Tested on P3310 Tegra186 platform. Tested-by: Bhadram Varka -- Bhadram
Re: [PATCH] net: stmmac: Use mutex instead of spinlock
Hi, On 5/24/2018 7:39 PM, Thierry Reding wrote: From: Thierry Reding Some drivers, such as DWC EQOS on Tegra, need to perform operations that can sleep under this lock (clk_set_rate() in tegra_eqos_fix_speed()) for proper operation. Since there is no need for this lock to be a spinlock, convert it to a mutex instead. Fixes: e6ea2d16fc61 ("net: stmmac: dwc-qos: Add Tegra186 support") Reported-by: Jon Hunter Signed-off-by: Thierry Reding --- Tested on P3310 Tegra186 platform. Tested-by: Bhadram Varka -- Bhadram
[PATCH] net: stmmac: Use mutex instead of spinlock
From: Thierry RedingSome drivers, such as DWC EQOS on Tegra, need to perform operations that can sleep under this lock (clk_set_rate() in tegra_eqos_fix_speed()) for proper operation. Since there is no need for this lock to be a spinlock, convert it to a mutex instead. Fixes: e6ea2d16fc61 ("net: stmmac: dwc-qos: Add Tegra186 support") Reported-by: Jon Hunter Signed-off-by: Thierry Reding --- This applies on top of net-next. drivers/net/ethernet/stmicro/stmmac/stmmac.h | 2 +- .../ethernet/stmicro/stmmac/stmmac_ethtool.c | 12 +++ .../net/ethernet/stmicro/stmmac/stmmac_main.c | 31 +-- 3 files changed, 21 insertions(+), 24 deletions(-) diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac.h b/drivers/net/ethernet/stmicro/stmmac/stmmac.h index 42fc76e76bf9..5a2570b8d540 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac.h +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac.h @@ -121,7 +121,7 @@ struct stmmac_priv { struct net_device *dev; struct device *device; struct mac_device_info *hw; - spinlock_t lock; + struct mutex lock; /* RX Queue */ struct stmmac_rx_queue rx_queue[MTL_MAX_RX_QUEUES]; diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c index 6d82b3ef5c3b..5710864fa809 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c @@ -390,9 +390,9 @@ stmmac_ethtool_set_link_ksettings(struct net_device *dev, ADVERTISED_10baseT_Half | ADVERTISED_10baseT_Full); - spin_lock(>lock); + mutex_lock(>lock); stmmac_pcs_ctrl_ane(priv, priv->ioaddr, 1, priv->hw->ps, 0); - spin_unlock(>lock); + mutex_unlock(>lock); return 0; } @@ -632,12 +632,12 @@ static void stmmac_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol) { struct stmmac_priv *priv = netdev_priv(dev); - spin_lock_irq(>lock); + mutex_lock(>lock); if (device_can_wakeup(priv->device)) { wol->supported = WAKE_MAGIC | WAKE_UCAST; wol->wolopts = priv->wolopts; } - spin_unlock_irq(>lock); + mutex_unlock(>lock); } static int stmmac_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol) @@ -666,9 +666,9 @@ static int stmmac_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol) disable_irq_wake(priv->wol_irq); } - spin_lock_irq(>lock); + mutex_lock(>lock); priv->wolopts = wol->wolopts; - spin_unlock_irq(>lock); + mutex_unlock(>lock); return 0; } diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c index d9dbe1355896..8cc63da79a80 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c @@ -381,7 +381,6 @@ bool stmmac_eee_init(struct stmmac_priv *priv) { struct net_device *ndev = priv->dev; int interface = priv->plat->interface; - unsigned long flags; bool ret = false; if ((interface != PHY_INTERFACE_MODE_MII) && @@ -408,7 +407,7 @@ bool stmmac_eee_init(struct stmmac_priv *priv) * changed). * In that case the driver disable own timers. */ - spin_lock_irqsave(>lock, flags); + mutex_lock(>lock); if (priv->eee_active) { netdev_dbg(priv->dev, "disable EEE\n"); del_timer_sync(>eee_ctrl_timer); @@ -416,11 +415,11 @@ bool stmmac_eee_init(struct stmmac_priv *priv) tx_lpi_timer); } priv->eee_active = 0; - spin_unlock_irqrestore(>lock, flags); + mutex_unlock(>lock); goto out; } /* Activate the EEE and start timers */ - spin_lock_irqsave(>lock, flags); + mutex_lock(>lock); if (!priv->eee_active) { priv->eee_active = 1; timer_setup(>eee_ctrl_timer, @@ -435,7 +434,7 @@ bool stmmac_eee_init(struct stmmac_priv *priv) stmmac_set_eee_pls(priv, priv->hw, ndev->phydev->link); ret = true; - spin_unlock_irqrestore(>lock, flags); + mutex_unlock(>lock); netdev_dbg(priv->dev, "Energy-Efficient Ethernet initialized\n"); } @@ -811,13 +810,12 @@ static void stmmac_adjust_link(struct net_device *dev) { struct stmmac_priv *priv =
[PATCH] net: stmmac: Use mutex instead of spinlock
From: Thierry Reding Some drivers, such as DWC EQOS on Tegra, need to perform operations that can sleep under this lock (clk_set_rate() in tegra_eqos_fix_speed()) for proper operation. Since there is no need for this lock to be a spinlock, convert it to a mutex instead. Fixes: e6ea2d16fc61 ("net: stmmac: dwc-qos: Add Tegra186 support") Reported-by: Jon Hunter Signed-off-by: Thierry Reding --- This applies on top of net-next. drivers/net/ethernet/stmicro/stmmac/stmmac.h | 2 +- .../ethernet/stmicro/stmmac/stmmac_ethtool.c | 12 +++ .../net/ethernet/stmicro/stmmac/stmmac_main.c | 31 +-- 3 files changed, 21 insertions(+), 24 deletions(-) diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac.h b/drivers/net/ethernet/stmicro/stmmac/stmmac.h index 42fc76e76bf9..5a2570b8d540 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac.h +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac.h @@ -121,7 +121,7 @@ struct stmmac_priv { struct net_device *dev; struct device *device; struct mac_device_info *hw; - spinlock_t lock; + struct mutex lock; /* RX Queue */ struct stmmac_rx_queue rx_queue[MTL_MAX_RX_QUEUES]; diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c index 6d82b3ef5c3b..5710864fa809 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c @@ -390,9 +390,9 @@ stmmac_ethtool_set_link_ksettings(struct net_device *dev, ADVERTISED_10baseT_Half | ADVERTISED_10baseT_Full); - spin_lock(>lock); + mutex_lock(>lock); stmmac_pcs_ctrl_ane(priv, priv->ioaddr, 1, priv->hw->ps, 0); - spin_unlock(>lock); + mutex_unlock(>lock); return 0; } @@ -632,12 +632,12 @@ static void stmmac_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol) { struct stmmac_priv *priv = netdev_priv(dev); - spin_lock_irq(>lock); + mutex_lock(>lock); if (device_can_wakeup(priv->device)) { wol->supported = WAKE_MAGIC | WAKE_UCAST; wol->wolopts = priv->wolopts; } - spin_unlock_irq(>lock); + mutex_unlock(>lock); } static int stmmac_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol) @@ -666,9 +666,9 @@ static int stmmac_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol) disable_irq_wake(priv->wol_irq); } - spin_lock_irq(>lock); + mutex_lock(>lock); priv->wolopts = wol->wolopts; - spin_unlock_irq(>lock); + mutex_unlock(>lock); return 0; } diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c index d9dbe1355896..8cc63da79a80 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c @@ -381,7 +381,6 @@ bool stmmac_eee_init(struct stmmac_priv *priv) { struct net_device *ndev = priv->dev; int interface = priv->plat->interface; - unsigned long flags; bool ret = false; if ((interface != PHY_INTERFACE_MODE_MII) && @@ -408,7 +407,7 @@ bool stmmac_eee_init(struct stmmac_priv *priv) * changed). * In that case the driver disable own timers. */ - spin_lock_irqsave(>lock, flags); + mutex_lock(>lock); if (priv->eee_active) { netdev_dbg(priv->dev, "disable EEE\n"); del_timer_sync(>eee_ctrl_timer); @@ -416,11 +415,11 @@ bool stmmac_eee_init(struct stmmac_priv *priv) tx_lpi_timer); } priv->eee_active = 0; - spin_unlock_irqrestore(>lock, flags); + mutex_unlock(>lock); goto out; } /* Activate the EEE and start timers */ - spin_lock_irqsave(>lock, flags); + mutex_lock(>lock); if (!priv->eee_active) { priv->eee_active = 1; timer_setup(>eee_ctrl_timer, @@ -435,7 +434,7 @@ bool stmmac_eee_init(struct stmmac_priv *priv) stmmac_set_eee_pls(priv, priv->hw, ndev->phydev->link); ret = true; - spin_unlock_irqrestore(>lock, flags); + mutex_unlock(>lock); netdev_dbg(priv->dev, "Energy-Efficient Ethernet initialized\n"); } @@ -811,13 +810,12 @@ static void stmmac_adjust_link(struct net_device *dev) { struct stmmac_priv *priv = netdev_priv(dev); struct phy_device *phydev = dev->phydev; -