Commit aac84df5 authored by Stephen Hemminger's avatar Stephen Hemminger Committed by Greg Kroah-Hartman

sky2: transmit timeout deadlock

The code in transmit timeout incorrectly assumed that netif_tx_lock
was not set.
Signed-off-by: default avatarStephen Hemminger <shemminger@linux-foundation.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent a6f04a76
......@@ -1796,6 +1796,7 @@ static void sky2_phy_intr(struct sky2_hw *hw, unsigned port)
/* 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);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment