All of lore.kernel.org
 help / color / mirror / Atom feed
From: Vasanthakumar Thiagarajan <vasanth@atheros.com>
To: <linville@tuxdriver.com>
Cc: <linux-wireless@vger.kernel.org>
Subject: [PATCH 2/3] ath9k: Paprd calibration should be per channel
Date: Wed, 15 Sep 2010 07:22:07 -0700	[thread overview]
Message-ID: <1284560528-8934-2-git-send-email-vasanth@atheros.com> (raw)
In-Reply-To: <1284560528-8934-1-git-send-email-vasanth@atheros.com>

Signed-off-by: Vasanthakumar Thiagarajan <vasanth@atheros.com>
---
 drivers/net/wireless/ath/ath9k/ar9003_paprd.c |    5 ++-
 drivers/net/wireless/ath/ath9k/hw.h           |   12 +++++++---
 drivers/net/wireless/ath/ath9k/main.c         |   28 +++++++++++-------------
 3 files changed, 24 insertions(+), 21 deletions(-)

diff --git a/drivers/net/wireless/ath/ath9k/ar9003_paprd.c b/drivers/net/wireless/ath/ath9k/ar9003_paprd.c
index 7c38229..fc283d2 100644
--- a/drivers/net/wireless/ath/ath9k/ar9003_paprd.c
+++ b/drivers/net/wireless/ath/ath9k/ar9003_paprd.c
@@ -577,7 +577,7 @@ static bool create_pa_curve(u32 *data_L, u32 *data_U, u32 *pa_table, u16 *gain)
 }
 
 void ar9003_paprd_populate_single_table(struct ath_hw *ah,
-					struct ath9k_hw_cal_data *caldata,
+					struct ath9k_hw_paprd_caldata *caldata,
 					int chain)
 {
 	u32 *paprd_table_val = caldata->pa_table[chain];
@@ -656,7 +656,8 @@ int ar9003_paprd_setup_gain_table(struct ath_hw *ah, int chain)
 EXPORT_SYMBOL(ar9003_paprd_setup_gain_table);
 
 int ar9003_paprd_create_curve(struct ath_hw *ah,
-			      struct ath9k_hw_cal_data *caldata, int chain)
+			      struct ath9k_hw_paprd_caldata *caldata,
+			      int chain)
 {
 	u16 *small_signal_gain = &caldata->small_signal_gain[chain];
 	u32 *pa_table = caldata->pa_table[chain];
diff --git a/drivers/net/wireless/ath/ath9k/hw.h b/drivers/net/wireless/ath/ath9k/hw.h
index a3c2ce2..daad373 100644
--- a/drivers/net/wireless/ath/ath9k/hw.h
+++ b/drivers/net/wireless/ath/ath9k/hw.h
@@ -343,16 +343,20 @@ struct ath9k_hw_cal_data {
 	int8_t iCoff;
 	int8_t qCoff;
 	int16_t rawNoiseFloor;
-	bool paprd_done;
 	bool nfcal_pending;
 	bool nfcal_interference;
+	struct ath9k_nfcal_hist nfCalHist[NUM_NF_READINGS];
+};
+
+struct ath9k_hw_paprd_caldata {
+	u8 paprd_done_txchainmask;
 	u16 small_signal_gain[AR9300_MAX_CHAINS];
 	u32 pa_table[AR9300_MAX_CHAINS][PAPRD_TABLE_SZ];
-	struct ath9k_nfcal_hist nfCalHist[NUM_NF_READINGS];
 };
 
 struct ath9k_channel {
 	struct ieee80211_channel *chan;
+	struct ath9k_hw_paprd_caldata paprd_caldata;
 	u16 channel;
 	u32 channelFlags;
 	u32 chanmode;
@@ -965,10 +969,10 @@ void ar9003_hw_bb_watchdog_read(struct ath_hw *ah);
 void ar9003_hw_bb_watchdog_dbg_info(struct ath_hw *ah);
 void ar9003_paprd_enable(struct ath_hw *ah, bool val);
 void ar9003_paprd_populate_single_table(struct ath_hw *ah,
-					struct ath9k_hw_cal_data *caldata,
+					struct ath9k_hw_paprd_caldata *caldata,
 					int chain);
 int ar9003_paprd_create_curve(struct ath_hw *ah,
-			      struct ath9k_hw_cal_data *caldata, int chain);
+		struct ath9k_hw_paprd_caldata *caldata, int chain);
 int ar9003_paprd_setup_gain_table(struct ath_hw *ah, int chain);
 int ar9003_paprd_init_table(struct ath_hw *ah);
 bool ar9003_paprd_is_done(struct ath_hw *ah);
diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c
index b529c3e..f316061 100644
--- a/drivers/net/wireless/ath/ath9k/main.c
+++ b/drivers/net/wireless/ath/ath9k/main.c
@@ -269,16 +269,14 @@ int ath_set_channel(struct ath_softc *sc, struct ieee80211_hw *hw,
 static void ath_paprd_activate(struct ath_softc *sc)
 {
 	struct ath_hw *ah = sc->sc_ah;
-	struct ath9k_hw_cal_data *caldata = ah->caldata;
+	struct ath_common *common = ath9k_hw_common(ah);
+	struct ath9k_hw_paprd_caldata *caldata = &ah->curchan->paprd_caldata;
 	int chain;
 
-	if (!caldata || !caldata->paprd_done)
-		return;
-
 	ath9k_ps_wakeup(sc);
 	ar9003_paprd_enable(ah, false);
 	for (chain = 0; chain < AR9300_MAX_CHAINS; chain++) {
-		if (!(ah->caps.tx_chainmask & BIT(chain)))
+		if (!(common->tx_chainmask & BIT(chain)))
 			continue;
 
 		ar9003_paprd_populate_single_table(ah, caldata, chain);
@@ -299,7 +297,8 @@ void ath_paprd_calibrate(struct work_struct *work)
 	int band = hw->conf.channel->band;
 	struct ieee80211_supported_band *sband = &sc->sbands[band];
 	struct ath_tx_control txctl;
-	struct ath9k_hw_cal_data *caldata = ah->caldata;
+	struct ath9k_hw_paprd_caldata *caldata = &ah->curchan->paprd_caldata;
+	struct ath_common *common = ath9k_hw_common(ah);
 	int qnum, ftype;
 	int chain_ok = 0;
 	int chain;
@@ -307,9 +306,6 @@ void ath_paprd_calibrate(struct work_struct *work)
 	int time_left;
 	int i;
 
-	if (!caldata)
-		return;
-
 	skb = alloc_skb(len, GFP_KERNEL);
 	if (!skb)
 		return;
@@ -333,7 +329,8 @@ void ath_paprd_calibrate(struct work_struct *work)
 	ath9k_ps_wakeup(sc);
 	ar9003_paprd_init_table(ah);
 	for (chain = 0; chain < AR9300_MAX_CHAINS; chain++) {
-		if (!(ah->caps.tx_chainmask & BIT(chain)))
+		if (!(common->tx_chainmask & BIT(chain)) ||
+		    (caldata->paprd_done_txchainmask & BIT(chain)))
 			continue;
 
 		chain_ok = 0;
@@ -367,14 +364,13 @@ void ath_paprd_calibrate(struct work_struct *work)
 		if (ar9003_paprd_create_curve(ah, caldata, chain) != 0)
 			break;
 
+		caldata->paprd_done_txchainmask |= BIT(chain);
 		chain_ok = 1;
 	}
 	kfree_skb(skb);
 
-	if (chain_ok) {
-		caldata->paprd_done = true;
+	if (chain_ok)
 		ath_paprd_activate(sc);
-	}
 
 fail_paprd:
 	ath9k_ps_restore(sc);
@@ -392,6 +388,7 @@ void ath_ani_calibrate(unsigned long data)
 	struct ath_softc *sc = (struct ath_softc *)data;
 	struct ath_hw *ah = sc->sc_ah;
 	struct ath_common *common = ath9k_hw_common(ah);
+	struct ath9k_hw_paprd_caldata *caldata = &ah->curchan->paprd_caldata;
 	bool longcal = false;
 	bool shortcal = false;
 	bool aniflag = false;
@@ -486,8 +483,9 @@ set_timer:
 		cal_interval = min(cal_interval, (u32)short_cal_interval);
 
 	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 (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_PAPRD) {
+		if ((caldata->paprd_done_txchainmask & common->tx_chainmask)
+		    != common->tx_chainmask)
 			ieee80211_queue_work(sc->hw, &sc->paprd_work);
 		else
 			ath_paprd_activate(sc);
-- 
1.7.0.4


  reply	other threads:[~2010-09-15 14:22 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-09-15 14:22 [PATCH 1/3] ath9k: Fix regression in starting ANI after association Vasanthakumar Thiagarajan
2010-09-15 14:22 ` Vasanthakumar Thiagarajan [this message]
2010-09-15 15:23   ` [PATCH 2/3] ath9k: Paprd calibration should be per channel Felix Fietkau
2010-09-16  5:17     ` Vasanthakumar Thiagarajan
2010-09-16  6:47       ` Felix Fietkau
2010-09-15 14:22 ` [PATCH 3/3] ath9k: Fix sparse warning: symbol 'ath_ant_div_conf_fast_divbias' was not declared Vasanthakumar Thiagarajan
2010-09-15 16:21 ` [PATCH 1/3] ath9k: Fix regression in starting ANI after association Luis R. Rodriguez
2010-09-16  4:49   ` Vasanthakumar Thiagarajan
2010-09-16 14:19     ` Luis R. Rodriguez
2010-09-22 13:49       ` Vasanthakumar Thiagarajan
2010-09-27 17:21         ` Luis R. Rodriguez

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1284560528-8934-2-git-send-email-vasanth@atheros.com \
    --to=vasanth@atheros.com \
    --cc=linux-wireless@vger.kernel.org \
    --cc=linville@tuxdriver.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.