diff options
author | Stephen Hemminger <shemminger@linux-foundation.org> | 2007-02-16 14:56:11 -0800 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2007-03-09 10:50:22 -0800 |
commit | aac84df512958344a3e43651aa7063c6bb7f785b (patch) | |
tree | 1c3b3c10452bbc195d3d86358ea4c644a795d053 /drivers/net | |
parent | a6f04a7642b000d71ac3ff361e53af914f5dd27c (diff) |
sky2: transmit timeout deadlock
The code in transmit timeout incorrectly assumed that netif_tx_lock
was not set.
Signed-off-by: Stephen Hemminger <shemminger@linux-foundation.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/sky2.c | 6 |
1 files changed, 2 insertions, 4 deletions
diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c index 822dd0b1313..f44c3977538 100644 --- a/drivers/net/sky2.c +++ b/drivers/net/sky2.c @@ -1796,6 +1796,7 @@ out: /* Transmit timeout is only called if we are running, carries is up * and tx queue is full (stopped). + * Called with netif_tx_lock held. */ static void sky2_tx_timeout(struct net_device *dev) { @@ -1821,17 +1822,14 @@ static void sky2_tx_timeout(struct net_device *dev) sky2_write8(hw, STAT_TX_TIMER_CTRL, TIM_START); } else if (report != sky2->tx_cons) { printk(KERN_INFO PFX "status report lost?\n"); - - netif_tx_lock_bh(dev); sky2_tx_complete(sky2, report); - netif_tx_unlock_bh(dev); } else { printk(KERN_INFO PFX "hardware hung? flushing\n"); sky2_write32(hw, Q_ADDR(txq, Q_CSR), BMU_STOP); sky2_write32(hw, Y2_QADDR(txq, PREF_UNIT_CTRL), PREF_UNIT_RST_SET); - sky2_tx_clean(dev); + sky2_tx_complete(sky2, sky2->tx_prod); sky2_qset(hw, txq); sky2_prefetch_init(hw, txq, sky2->tx_le_map, TX_RING_SIZE - 1); |