diff options
| author | David S. Miller <davem@davemloft.net> | 2009-05-18 21:08:20 -0700 | 
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2009-05-18 21:08:20 -0700 | 
| commit | bb803cfbecb03a0cf8dc7e1864f18dda6631af00 (patch) | |
| tree | 6c0989693bea6f50cfa5c6bb14f52ec19668def3 /drivers/net/wireless/ath/ath5k/base.c | |
| parent | 3878fb6fdbceecca20b15748f807340854220f06 (diff) | |
| parent | 511e11e396dc596825ce04d53d7f6d579404bc01 (diff) | |
| download | olio-linux-3.10-bb803cfbecb03a0cf8dc7e1864f18dda6631af00.tar.xz olio-linux-3.10-bb803cfbecb03a0cf8dc7e1864f18dda6631af00.zip  | |
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
Conflicts:
	drivers/scsi/fcoe/fcoe.c
Diffstat (limited to 'drivers/net/wireless/ath/ath5k/base.c')
| -rw-r--r-- | drivers/net/wireless/ath/ath5k/base.c | 22 | 
1 files changed, 13 insertions, 9 deletions
diff --git a/drivers/net/wireless/ath/ath5k/base.c b/drivers/net/wireless/ath/ath5k/base.c index 6789c5dfcc7..dbfe9f45050 100644 --- a/drivers/net/wireless/ath/ath5k/base.c +++ b/drivers/net/wireless/ath/ath5k/base.c @@ -218,7 +218,7 @@ static struct pci_driver ath5k_pci_driver = {   * Prototypes - MAC 802.11 stack related functions   */  static int ath5k_tx(struct ieee80211_hw *hw, struct sk_buff *skb); -static int ath5k_reset(struct ath5k_softc *sc, bool stop, bool change_channel); +static int ath5k_reset(struct ath5k_softc *sc, struct ieee80211_channel *chan);  static int ath5k_reset_wake(struct ath5k_softc *sc);  static int ath5k_start(struct ieee80211_hw *hw);  static void ath5k_stop(struct ieee80211_hw *hw); @@ -1076,16 +1076,13 @@ ath5k_chan_set(struct ath5k_softc *sc, struct ieee80211_channel *chan)  	if (chan->center_freq != sc->curchan->center_freq ||  		chan->hw_value != sc->curchan->hw_value) { -		sc->curchan = chan; -		sc->curband = &sc->sbands[chan->band]; -  		/*  		 * To switch channels clear any pending DMA operations;  		 * wait long enough for the RX fifo to drain, reset the  		 * hardware at the new frequency, and then re-enable  		 * the relevant bits of the h/w.  		 */ -		return ath5k_reset(sc, true, true); +		return ath5k_reset(sc, chan);  	}  	return 0; @@ -2350,7 +2347,7 @@ ath5k_init(struct ath5k_softc *sc)  	sc->imask = AR5K_INT_RXOK | AR5K_INT_RXERR | AR5K_INT_RXEOL |  		AR5K_INT_RXORN | AR5K_INT_TXDESC | AR5K_INT_TXEOL |  		AR5K_INT_FATAL | AR5K_INT_GLOBAL; -	ret = ath5k_reset(sc, false, false); +	ret = ath5k_reset(sc, NULL);  	if (ret)  		goto done; @@ -2635,18 +2632,25 @@ drop_packet:  	return NETDEV_TX_OK;  } +/* + * Reset the hardware.  If chan is not NULL, then also pause rx/tx + * and change to the given channel. + */  static int -ath5k_reset(struct ath5k_softc *sc, bool stop, bool change_channel) +ath5k_reset(struct ath5k_softc *sc, struct ieee80211_channel *chan)  {  	struct ath5k_hw *ah = sc->ah;  	int ret;  	ATH5K_DBG(sc, ATH5K_DEBUG_RESET, "resetting\n"); -	if (stop) { +	if (chan) {  		ath5k_hw_set_imr(ah, 0);  		ath5k_txq_cleanup(sc);  		ath5k_rx_stop(sc); + +		sc->curchan = chan; +		sc->curband = &sc->sbands[chan->band];  	}  	ret = ath5k_hw_reset(ah, sc->opmode, sc->curchan, true);  	if (ret) { @@ -2684,7 +2688,7 @@ ath5k_reset_wake(struct ath5k_softc *sc)  {  	int ret; -	ret = ath5k_reset(sc, true, true); +	ret = ath5k_reset(sc, sc->curchan);  	if (!ret)  		ieee80211_wake_queues(sc->hw);  |