net: gianfar: do not disable interrupts
each per-queue lock is taken with spin_lock_irqsave() except in the case where all of them are taken for some kind of serialisation. As an optimisation local_irq_save() is used so that lock_tx_qs() and lock_rx_qs() can use just the spin_lock() variant instead. On RT local_irq_save() behaves differently so we use the nort() variant. Lockdep screems easily by "ethtool -K eth0 rx off tx off" What remains is missing lockdep annotation that makes lockdep think lock_tx_qs() may cause a dead lock. Cc: stable-rt@vger.kernel.org Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
This commit is contained in:
parent
5616769d71
commit
13e7d53044
|
@ -1316,7 +1316,7 @@ static int gfar_suspend(struct device *dev)
|
|||
|
||||
if (netif_running(ndev)) {
|
||||
|
||||
local_irq_save(flags);
|
||||
local_irq_save_nort(flags);
|
||||
lock_tx_qs(priv);
|
||||
lock_rx_qs(priv);
|
||||
|
||||
|
@ -1334,7 +1334,7 @@ static int gfar_suspend(struct device *dev)
|
|||
|
||||
unlock_rx_qs(priv);
|
||||
unlock_tx_qs(priv);
|
||||
local_irq_restore(flags);
|
||||
local_irq_restore_nort(flags);
|
||||
|
||||
disable_napi(priv);
|
||||
|
||||
|
@ -1376,7 +1376,7 @@ static int gfar_resume(struct device *dev)
|
|||
/* Disable Magic Packet mode, in case something
|
||||
* else woke us up.
|
||||
*/
|
||||
local_irq_save(flags);
|
||||
local_irq_save_nort(flags);
|
||||
lock_tx_qs(priv);
|
||||
lock_rx_qs(priv);
|
||||
|
||||
|
@ -1388,7 +1388,7 @@ static int gfar_resume(struct device *dev)
|
|||
|
||||
unlock_rx_qs(priv);
|
||||
unlock_tx_qs(priv);
|
||||
local_irq_restore(flags);
|
||||
local_irq_restore_nort(flags);
|
||||
|
||||
netif_device_attach(ndev);
|
||||
|
||||
|
@ -2402,7 +2402,7 @@ void gfar_vlan_mode(struct net_device *dev, netdev_features_t features)
|
|||
u32 tempval;
|
||||
|
||||
regs = priv->gfargrp[0].regs;
|
||||
local_irq_save(flags);
|
||||
local_irq_save_nort(flags);
|
||||
lock_rx_qs(priv);
|
||||
|
||||
if (features & NETIF_F_HW_VLAN_CTAG_TX) {
|
||||
|
@ -2435,7 +2435,7 @@ void gfar_vlan_mode(struct net_device *dev, netdev_features_t features)
|
|||
gfar_change_mtu(dev, dev->mtu);
|
||||
|
||||
unlock_rx_qs(priv);
|
||||
local_irq_restore(flags);
|
||||
local_irq_restore_nort(flags);
|
||||
}
|
||||
|
||||
static int gfar_change_mtu(struct net_device *dev, int new_mtu)
|
||||
|
@ -3385,14 +3385,14 @@ static irqreturn_t gfar_error(int irq, void *grp_id)
|
|||
dev->stats.tx_dropped++;
|
||||
atomic64_inc(&priv->extra_stats.tx_underrun);
|
||||
|
||||
local_irq_save(flags);
|
||||
local_irq_save_nort(flags);
|
||||
lock_tx_qs(priv);
|
||||
|
||||
/* Reactivate the Tx Queues */
|
||||
gfar_write(®s->tstat, gfargrp->tstat);
|
||||
|
||||
unlock_tx_qs(priv);
|
||||
local_irq_restore(flags);
|
||||
local_irq_restore_nort(flags);
|
||||
}
|
||||
netif_dbg(priv, tx_err, dev, "Transmit Error\n");
|
||||
}
|
||||
|
|
|
@ -500,7 +500,7 @@ static int gfar_sringparam(struct net_device *dev,
|
|||
/* Halt TX and RX, and process the frames which
|
||||
* have already been received
|
||||
*/
|
||||
local_irq_save(flags);
|
||||
local_irq_save_nort(flags);
|
||||
lock_tx_qs(priv);
|
||||
lock_rx_qs(priv);
|
||||
|
||||
|
@ -508,7 +508,7 @@ static int gfar_sringparam(struct net_device *dev,
|
|||
|
||||
unlock_rx_qs(priv);
|
||||
unlock_tx_qs(priv);
|
||||
local_irq_restore(flags);
|
||||
local_irq_restore_nort(flags);
|
||||
|
||||
for (i = 0; i < priv->num_rx_queues; i++)
|
||||
gfar_clean_rx_ring(priv->rx_queue[i],
|
||||
|
@ -623,7 +623,7 @@ int gfar_set_features(struct net_device *dev, netdev_features_t features)
|
|||
/* Halt TX and RX, and process the frames which
|
||||
* have already been received
|
||||
*/
|
||||
local_irq_save(flags);
|
||||
local_irq_save_nort(flags);
|
||||
lock_tx_qs(priv);
|
||||
lock_rx_qs(priv);
|
||||
|
||||
|
@ -631,7 +631,7 @@ int gfar_set_features(struct net_device *dev, netdev_features_t features)
|
|||
|
||||
unlock_tx_qs(priv);
|
||||
unlock_rx_qs(priv);
|
||||
local_irq_restore(flags);
|
||||
local_irq_restore_nort(flags);
|
||||
|
||||
for (i = 0; i < priv->num_rx_queues; i++)
|
||||
gfar_clean_rx_ring(priv->rx_queue[i],
|
||||
|
|
|
@ -67,7 +67,7 @@ static ssize_t gfar_set_bd_stash(struct device *dev,
|
|||
return count;
|
||||
|
||||
|
||||
local_irq_save(flags);
|
||||
local_irq_save_nort(flags);
|
||||
lock_rx_qs(priv);
|
||||
|
||||
/* Set the new stashing value */
|
||||
|
@ -83,7 +83,7 @@ static ssize_t gfar_set_bd_stash(struct device *dev,
|
|||
gfar_write(®s->attr, temp);
|
||||
|
||||
unlock_rx_qs(priv);
|
||||
local_irq_restore(flags);
|
||||
local_irq_restore_nort(flags);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
@ -111,7 +111,7 @@ static ssize_t gfar_set_rx_stash_size(struct device *dev,
|
|||
if (!(priv->device_flags & FSL_GIANFAR_DEV_HAS_BUF_STASHING))
|
||||
return count;
|
||||
|
||||
local_irq_save(flags);
|
||||
local_irq_save_nort(flags);
|
||||
lock_rx_qs(priv);
|
||||
|
||||
if (length > priv->rx_buffer_size)
|
||||
|
@ -139,7 +139,7 @@ static ssize_t gfar_set_rx_stash_size(struct device *dev,
|
|||
|
||||
out:
|
||||
unlock_rx_qs(priv);
|
||||
local_irq_restore(flags);
|
||||
local_irq_restore_nort(flags);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
@ -170,7 +170,7 @@ static ssize_t gfar_set_rx_stash_index(struct device *dev,
|
|||
if (!(priv->device_flags & FSL_GIANFAR_DEV_HAS_BUF_STASHING))
|
||||
return count;
|
||||
|
||||
local_irq_save(flags);
|
||||
local_irq_save_nort(flags);
|
||||
lock_rx_qs(priv);
|
||||
|
||||
if (index > priv->rx_stash_size)
|
||||
|
@ -188,7 +188,7 @@ static ssize_t gfar_set_rx_stash_index(struct device *dev,
|
|||
|
||||
out:
|
||||
unlock_rx_qs(priv);
|
||||
local_irq_restore(flags);
|
||||
local_irq_restore_nort(flags);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
@ -218,7 +218,7 @@ static ssize_t gfar_set_fifo_threshold(struct device *dev,
|
|||
if (length > GFAR_MAX_FIFO_THRESHOLD)
|
||||
return count;
|
||||
|
||||
local_irq_save(flags);
|
||||
local_irq_save_nort(flags);
|
||||
lock_tx_qs(priv);
|
||||
|
||||
priv->fifo_threshold = length;
|
||||
|
@ -229,7 +229,7 @@ static ssize_t gfar_set_fifo_threshold(struct device *dev,
|
|||
gfar_write(®s->fifo_tx_thr, temp);
|
||||
|
||||
unlock_tx_qs(priv);
|
||||
local_irq_restore(flags);
|
||||
local_irq_restore_nort(flags);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
@ -258,7 +258,7 @@ static ssize_t gfar_set_fifo_starve(struct device *dev,
|
|||
if (num > GFAR_MAX_FIFO_STARVE)
|
||||
return count;
|
||||
|
||||
local_irq_save(flags);
|
||||
local_irq_save_nort(flags);
|
||||
lock_tx_qs(priv);
|
||||
|
||||
priv->fifo_starve = num;
|
||||
|
@ -269,7 +269,7 @@ static ssize_t gfar_set_fifo_starve(struct device *dev,
|
|||
gfar_write(®s->fifo_tx_starve, temp);
|
||||
|
||||
unlock_tx_qs(priv);
|
||||
local_irq_restore(flags);
|
||||
local_irq_restore_nort(flags);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
@ -299,7 +299,7 @@ static ssize_t gfar_set_fifo_starve_off(struct device *dev,
|
|||
if (num > GFAR_MAX_FIFO_STARVE_OFF)
|
||||
return count;
|
||||
|
||||
local_irq_save(flags);
|
||||
local_irq_save_nort(flags);
|
||||
lock_tx_qs(priv);
|
||||
|
||||
priv->fifo_starve_off = num;
|
||||
|
@ -310,7 +310,7 @@ static ssize_t gfar_set_fifo_starve_off(struct device *dev,
|
|||
gfar_write(®s->fifo_tx_starve_shutoff, temp);
|
||||
|
||||
unlock_tx_qs(priv);
|
||||
local_irq_restore(flags);
|
||||
local_irq_restore_nort(flags);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue