diff options
| author | Ingo Molnar <mingo@elte.hu> | 2009-05-18 07:37:44 +0200 | 
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2009-05-18 07:37:49 +0200 | 
| commit | dc3f81b129b5439ba7bac265bbc6a51a39275dae (patch) | |
| tree | 216030731d911249496d2e97206cd61431e31c89 /drivers/net/wireless/ath5k/base.c | |
| parent | d2517a49d55536b38c7a87e5289550cfedaa4dcc (diff) | |
| parent | 1406de8e11eb043681297adf86d6892ff8efc27a (diff) | |
Merge commit 'v2.6.30-rc6' into perfcounters/core
Merge reason: this branch was on an -rc4 base, merge it up to -rc6
              to get the latest upstream fixes.
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'drivers/net/wireless/ath5k/base.c')
| -rw-r--r-- | drivers/net/wireless/ath5k/base.c | 22 | 
1 files changed, 13 insertions, 9 deletions
| diff --git a/drivers/net/wireless/ath5k/base.c b/drivers/net/wireless/ath5k/base.c index a08bc8a4fb6..32df27a9c7a 100644 --- a/drivers/net/wireless/ath5k/base.c +++ b/drivers/net/wireless/ath5k/base.c @@ -214,7 +214,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); @@ -1038,16 +1038,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; @@ -2314,7 +2311,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; @@ -2599,18 +2596,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) { @@ -2648,7 +2652,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); | 
