Return-path: Received: from mail.atheros.com ([12.19.149.2]:34686 "EHLO mail.atheros.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753094Ab0IUFyx (ORCPT ); Tue, 21 Sep 2010 01:54:53 -0400 Received: from mail.atheros.com ([10.10.20.105]) by sidewinder.atheros.com for ; Mon, 20 Sep 2010 22:54:46 -0700 From: Vasanthakumar Thiagarajan To: CC: Subject: [PATCH 2/2] ath9k: Kick start paprd calibration whenever operating channel changes Date: Mon, 20 Sep 2010 22:54:47 -0700 Message-ID: <1285048487-16795-2-git-send-email-vasanth@atheros.com> In-Reply-To: <1285048487-16795-1-git-send-email-vasanth@atheros.com> References: <1285048487-16795-1-git-send-email-vasanth@atheros.com> MIME-Version: 1.0 Content-Type: text/plain Sender: linux-wireless-owner@vger.kernel.org List-ID: Signed-off-by: Vasanthakumar Thiagarajan --- drivers/net/wireless/ath/ath9k/hw.h | 1 + drivers/net/wireless/ath/ath9k/main.c | 18 +++++++++++++++++- 2 files changed, 18 insertions(+), 1 deletions(-) diff --git a/drivers/net/wireless/ath/ath9k/hw.h b/drivers/net/wireless/ath/ath9k/hw.h index df47f79..c1b4962 100644 --- a/drivers/net/wireless/ath/ath9k/hw.h +++ b/drivers/net/wireless/ath/ath9k/hw.h @@ -645,6 +645,7 @@ struct ath_hw { struct ath9k_hw_capabilities caps; struct ath9k_channel channels[38]; struct ath9k_channel *curchan; + struct ath9k_channel prev_paprd_chan; union { struct ar5416_eeprom_def def; diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c index a133878..9150788 100644 --- a/drivers/net/wireless/ath/ath9k/main.c +++ b/drivers/net/wireless/ath/ath9k/main.c @@ -266,6 +266,20 @@ int ath_set_channel(struct ath_softc *sc, struct ieee80211_hw *hw, return r; } +static bool is_paprd_done(struct ath_hw *ah) +{ + struct ath9k_channel *curchan, *paprd_chan; + + curchan = ah->curchan; + paprd_chan = &ah->prev_paprd_chan; + + if ((paprd_chan->channel == curchan->channel) && + paprd_chan->chanmode == curchan->chanmode) + return true; + + return false; +} + static void ath_paprd_activate(struct ath_softc *sc) { struct ath_hw *ah = sc->sc_ah; @@ -375,6 +389,8 @@ void ath_paprd_calibrate(struct work_struct *work) if (chain_ok) { caldata->paprd_done = true; + memcpy(&ah->prev_paprd_chan, ah->curchan, + sizeof(struct ath9k_channel)); ath_paprd_activate(sc); } @@ -489,7 +505,7 @@ set_timer: mod_timer(&common->ani.timer, jiffies + msecs_to_jiffies(cal_interval)); if ((sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_PAPRD) && ah->caldata) { - if (!ah->caldata->paprd_done) + if (!is_paprd_done(ah)) ieee80211_queue_work(sc->hw, &sc->paprd_work); else ath_paprd_activate(sc); -- 1.7.0.4