diff options
author | Stephen Hemminger <shemminger@osdl.org> | 2006-02-22 20:45:01 +0100 |
---|---|---|
committer | Francois Romieu <romieu@fr.zoreil.com> | 2006-02-23 01:25:03 +0100 |
commit | 9a6d343188f5f1e9537e700fc4139c2d905ff129 (patch) | |
tree | 6e41f133f4e229b4cd301c36c4deb8c04e5038c7 /drivers/net | |
parent | [PATCH] sky2: poke coalescing timer to fix hang (diff) | |
download | linux-9a6d343188f5f1e9537e700fc4139c2d905ff129.tar.xz linux-9a6d343188f5f1e9537e700fc4139c2d905ff129.zip |
[PATCH] sky2: force early transmit status
Need to force a transmit coalesce timer restart after processing
transmit packets. Otherwise, can get transmit status after last
update and chip doesn't send the next one.
Can go with the chip defaults for coalescing timers, except for
Tx timer which needs to be bigger.
Signed-off-by: Stephen Hemminger <shemminger@osdl.org>
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/sky2.c | 14 |
1 files changed, 6 insertions, 8 deletions
diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c index 629809433cb3..d913d3407e90 100644 --- a/drivers/net/sky2.c +++ b/drivers/net/sky2.c @@ -1988,13 +1988,12 @@ exit_loop: sky2_tx_check(hw, 0, tx_done[0]); sky2_tx_check(hw, 1, tx_done[1]); - if (likely(work_done < to_do)) { - /* need to restart TX timer */ - if (is_ec_a1(hw)) { - sky2_write8(hw, STAT_TX_TIMER_CTRL, TIM_STOP); - sky2_write8(hw, STAT_TX_TIMER_CTRL, TIM_START); - } + if (sky2_read8(hw, STAT_TX_TIMER_CTRL) == TIM_START) { + sky2_write8(hw, STAT_TX_TIMER_CTRL, TIM_STOP); + sky2_write8(hw, STAT_TX_TIMER_CTRL, TIM_START); + } + if (likely(work_done < to_do)) { netif_rx_complete(dev0); hw->intr_mask |= Y2_IS_STAT_BMU; sky2_write32(hw, B0_IMSK, hw->intr_mask); @@ -2352,8 +2351,7 @@ static int sky2_reset(struct sky2_hw *hw) sky2_write8(hw, STAT_FIFO_ISR_WM, 16); sky2_write32(hw, STAT_TX_TIMER_INI, sky2_us2clk(hw, 1000)); - sky2_write32(hw, STAT_LEV_TIMER_INI, sky2_us2clk(hw, 100)); - sky2_write32(hw, STAT_ISR_TIMER_INI, sky2_us2clk(hw, 20)); + sky2_write32(hw, STAT_ISR_TIMER_INI, sky2_us2clk(hw, 7)); } /* enable status unit */ |