Skip to content

Commit

Permalink
sky2: Reset tx train after interrupts disabled.
Browse files Browse the repository at this point in the history
Reseting the tx chain too soon results in invalid tx queue positions
being delivered in the status queue.  This also makes sure there's no
overlap between the cleanup done by sky2_tx_clean() and
sky2_tx_done().

Signed-off-by: Mike McCormack <mikem@ring3k.org>
Acked-by: Stephen Hemminger <shemminger@vyatta.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Mike McCormack authored and David S. Miller committed Aug 14, 2009
1 parent a510996 commit 264bb4f
Showing 1 changed file with 3 additions and 6 deletions.
9 changes: 3 additions & 6 deletions drivers/net/sky2.c
Original file line number Diff line number Diff line change
Expand Up @@ -1811,11 +1811,8 @@ static void sky2_tx_clean(struct net_device *dev)
netif_tx_unlock_bh(dev);
}

static void sky2_tx_reset(struct sky2_port* sky2)
static void sky2_tx_reset(struct sky2_hw *hw, unsigned port)
{
unsigned port = sky2->port;
struct sky2_hw *hw = sky2->hw;

/* Disable Force Sync bit and Enable Alloc bit */
sky2_write8(hw, SK_REG(port, TXA_CTRL),
TXA_DIS_FSYNC | TXA_DIS_ALLOC | TXA_STOP_RC);
Expand Down Expand Up @@ -1877,8 +1874,6 @@ static int sky2_down(struct net_device *dev)
&& port == 0 && hw->dev[1] && netif_running(hw->dev[1])))
sky2_write8(hw, SK_REG(port, GMAC_CTRL), GMC_RST_SET);

sky2_tx_reset(sky2);

sky2_write8(hw, SK_REG(port, RX_GMF_CTRL_T), GMF_RST_SET);

/* Force any delayed status interrrupt and NAPI */
Expand All @@ -1903,6 +1898,8 @@ static int sky2_down(struct net_device *dev)
/* turn off LED's */
sky2_write16(hw, B0_Y2LED, LED_STAT_OFF);

sky2_tx_reset(hw, port);

sky2_tx_clean(dev);
sky2_rx_clean(sky2);

Expand Down

0 comments on commit 264bb4f

Please sign in to comment.