FAQ Search Today's Posts Mark Forums Read
» Video Reviews

» Linux Archive

Linux-archive is a website aiming to archive linux email lists and to make them easily accessible for linux users/developers.


» Sponsor

» Partners

» Sponsor

Go Back   Linux Archive > Debian > Debian Kernel

 
 
LinkBack Thread Tools
 
Old 08-05-2012, 08:37 AM
Jonathan Nieder
 
Default Bug#681232: Atheros WiFi Adapter couldn't find networks "gain calibration timeout"

tags 681232 + patch moreinfo
quit

Hi,

Russ Lind wrote:

> For what it's worth, the 3.5-1 kernel from experimental works for me
[...]
> I'd also built the 3.4.7 kernel from the sources at kernel.org.
[...]
> I've read about a number of people having this issue thru the 3.3
> kernels with various distros, and read the issue was supposedly
> fixed in the 3.4 branch. I get the impression it's an upstream
> issue.

Maybe one of the following patches helped.

v3.3-rc1~182^2~44^2~292 ath5k: Calibration re-work

v3.4-rc1~177^2~108^2~108 ath5k: do not stop queues for full
calibration

v3.4-rc1~177^2~108^2~107 ath5k: do not re-run AGC calibration
periodically

What seems oddest to me is that I'm not aware of any patches from
the range 3.2.20->3.2.21 that might have had this effect. Are you
sure that 3.2.20 did not reproduce the bug? If you have time to try
one of the following, I'd be interested:

a. Please test v3.2.20 and v3.2.21 from kernel.org, following
instructions from [1] or the following steps:

# get the kernel history, if you don't already have it
git clone
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git

# fetch point releases:
cd linux
git remote add stable
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git
git fetch stable

# configure, build, test:
git checkout v3.2.21
cp /boot/config-$(uname -r) .config; # current configuration
scripts/config --disable DEBUG_INFO
make localmodconfig; # optional: minimize configuration
make deb-pkg; # optionally with -j<num> for parallel build
dpkg -i ../<name of package>; # as root
reboot
... test test test ...

# hopefully it reproduces the bug, so try the older kernel:
cd linux
git checkout v3.2.20
make deb-pkg; # maybe with -j4
dpkg -i ../<name of package>; # as root
reboot
... test test test ...

# hopefully it does not reproduce the bug

b. If (a) goes well, please bisect to find which patch introduced
the bug, as described at [2]:

cd linux
git bisect start
git bisect good <some known-good kernel>
git bisect bad v3.2.21

# a version halfway between is automatically checked out
make deb-pkg; # maybe with -j4
dpkg -i ../<name of package>; # as root
reboot
... test test test ...
cd linux
git bisect good; # if it works well
git bisect bad; # if it reproduces the calibration timeouts
git bisect skip; # if some other bug makes it hard to test

... rinse and repeat until it prints the "first bad commit"
or until bored ...

# at any step, to see the regression range narrowing
apt-get install gitk
git bisect visualize

# to get a log of revs tested so far, which will let someone
# else pick up where you left off
git bisect log

c. How does a pre-compiled 3.3 kernel from http://snapshot.debian.org
do?

d. Please test the three attached patches together against a 3.2.y
kernel, following the directions at [3] or the following
instructions:

cd linux
git checkout stable/linux-3.2.y
git am -3sc $(ls -1 /path/to/patches/0[123]-*)
make deb-pkg; # maybe with -j4
dpkg -i ../<name of package>; # as root
reboot
... test test test ...

Hope that helps,
Jonathan

[1] http://kernel-handbook.alioth.debian.org/ch-common-tasks.html#s-kernel-org-package
[2] http://kernel-handbook.alioth.debian.org/ch-bugs.html#s9.2.1
[3] http://kernel-handbook.alioth.debian.org/ch-common-tasks.html#s-common-official
From: Nick Kossifidis <mickflemm@gmail.com>
Date: Fri, 25 Nov 2011 20:40:23 +0200
Subject: ath5k: Calibration re-work

commit ce169aca0d823d38465127023e3d571816e6666c upstream.

Noise floor calibration does not interfere with traffic and should run more
often as part of our "short calibration". The full calibration is not the
noise floor calibration but the AGC + Gain_F (on RF5111 and RF5112) calibration
and should run less often because it does interfere with traffic.

So

Short calibration -> I/Q & NF Calibration
Long calibration -> Short + AGC + Gain_F

This patch was for some time on my pub/ dir on www.kernel.org and has been tested
by a few people and me. I think it's O.K. to go in.

I also changed ah_calibration to ah_iq_cal_needed to make more sense.

v2 Use a workqueue instead of a tasklet for calibration

Signed-off-by: Nick Kossifidis <mickflemm@gmail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
drivers/net/wireless/ath/ath5k/ath5k.h | 15 ++---
drivers/net/wireless/ath/ath5k/base.c | 112 ++++++++++++++++++++++----------
drivers/net/wireless/ath/ath5k/phy.c | 82 +++++++++++++++++------
3 files changed, 147 insertions(+), 62 deletions(-)

diff --git a/drivers/net/wireless/ath/ath5k/ath5k.h b/drivers/net/wireless/ath/ath5k/ath5k.h
index fecbcd9..9f9a681 100644
--- a/drivers/net/wireless/ath/ath5k/ath5k.h
+++ b/drivers/net/wireless/ath/ath5k/ath5k.h
@@ -187,10 +187,9 @@
#define AR5K_TUNE_MAX_TXPOWER 63
#define AR5K_TUNE_DEFAULT_TXPOWER 25
#define AR5K_TUNE_TPC_TXPOWER false
-#define ATH5K_TUNE_CALIBRATION_INTERVAL_FULL 10000 /* 10 sec */
+#define ATH5K_TUNE_CALIBRATION_INTERVAL_FULL 60000 /* 60 sec */
+#define ATH5K_TUNE_CALIBRATION_INTERVAL_SHORT 10000 /* 10 sec */
#define ATH5K_TUNE_CALIBRATION_INTERVAL_ANI 1000 /* 1 sec */
-#define ATH5K_TUNE_CALIBRATION_INTERVAL_NF 60000 /* 60 sec */
-
#define ATH5K_TX_COMPLETE_POLL_INT 3000 /* 3 sec */

#define AR5K_INIT_CARR_SENSE_EN 1
@@ -895,7 +894,8 @@ enum ath5k_int {
enum ath5k_calibration_mask {
AR5K_CALIBRATION_FULL = 0x01,
AR5K_CALIBRATION_SHORT = 0x02,
- AR5K_CALIBRATION_ANI = 0x04,
+ AR5K_CALIBRATION_NF = 0x04,
+ AR5K_CALIBRATION_ANI = 0x08,
};

/*
@@ -1097,6 +1097,7 @@ struct ath5k_hw {
led_on; /* pin setting for LED on */

struct work_struct reset_work; /* deferred chip reset */
+ struct work_struct calib_work; /* deferred phy calibration */

struct list_head rxbuf; /* receive buffer */
spinlock_t rxbuflock;
@@ -1113,8 +1114,6 @@ struct ath5k_hw {

struct ath5k_rfkill rf_kill;

- struct tasklet_struct calib; /* calibration tasklet */
-
spinlock_t block; /* protects beacon */
struct tasklet_struct beacontq; /* beacon intr tasklet */
struct list_head bcbuf; /* beacon buffer */
@@ -1144,7 +1143,7 @@ struct ath5k_hw {
enum ath5k_int ah_imr;

struct ieee80211_channel *ah_current_channel;
- bool ah_calibration;
+ bool ah_iq_cal_needed;
bool ah_single_chip;

enum ath5k_version ah_version;
@@ -1228,8 +1227,8 @@ struct ath5k_hw {

/* Calibration timestamp */
unsigned long ah_cal_next_full;
+ unsigned long ah_cal_next_short;
unsigned long ah_cal_next_ani;
- unsigned long ah_cal_next_nf;

/* Calibration mask */
u8 ah_cal_mask;
diff --git a/drivers/net/wireless/ath/ath5k/base.c b/drivers/net/wireless/ath/ath5k/base.c
index b346d04..9f604a8 100644
--- a/drivers/net/wireless/ath/ath5k/base.c
+++ b/drivers/net/wireless/ath/ath5k/base.c
@@ -2112,16 +2112,29 @@ static void
ath5k_intr_calibration_poll(struct ath5k_hw *ah)
{
if (time_is_before_eq_jiffies(ah->ah_cal_next_ani) &&
- !(ah->ah_cal_mask & AR5K_CALIBRATION_FULL)) {
- /* run ANI only when full calibration is not active */
+ !(ah->ah_cal_mask & AR5K_CALIBRATION_FULL) &&
+ !(ah->ah_cal_mask & AR5K_CALIBRATION_SHORT)) {
+
+ /* Run ANI only when calibration is not active */
+
ah->ah_cal_next_ani = jiffies +
msecs_to_jiffies(ATH5K_TUNE_CALIBRATION_INTERVAL_A NI);
tasklet_schedule(&ah->ani_tasklet);

- } else if (time_is_before_eq_jiffies(ah->ah_cal_next_full)) {
- ah->ah_cal_next_full = jiffies +
- msecs_to_jiffies(ATH5K_TUNE_CALIBRATION_INTERVAL_F ULL);
- tasklet_schedule(&ah->calib);
+ } else if (time_is_before_eq_jiffies(ah->ah_cal_next_short) &&
+ !(ah->ah_cal_mask & AR5K_CALIBRATION_FULL) &&
+ !(ah->ah_cal_mask & AR5K_CALIBRATION_SHORT)) {
+
+ /* Run calibration only when another calibration
+ * is not running.
+ *
+ * Note: This is for both full/short calibration,
+ * if it's time for a full one, ath5k_calibrate_work will deal
+ * with it. */
+
+ ah->ah_cal_next_short = jiffies +
+ msecs_to_jiffies(ATH5K_TUNE_CALIBRATION_INTERVAL_S HORT);
+ ieee80211_queue_work(ah->hw, &ah->calib_work);
}
/* we could use SWI to generate enough interrupts to meet our
* calibration interval requirements, if necessary:
@@ -2238,41 +2251,58 @@ ath5k_intr(int irq, void *dev_id)
* for temperature/environment changes.
*/
static void
-ath5k_tasklet_calibrate(unsigned long data)
+ath5k_calibrate_work(struct work_struct *work)
{
- struct ath5k_hw *ah = (void *)data;
+ struct ath5k_hw *ah = container_of(work, struct ath5k_hw,
+ calib_work);
+
+ /* Should we run a full calibration ? */
+ if (time_is_before_eq_jiffies(ah->ah_cal_next_full)) {
+
+ ah->ah_cal_next_full = jiffies +
+ msecs_to_jiffies(ATH5K_TUNE_CALIBRATION_INTERVAL_F ULL);
+ ah->ah_cal_mask |= AR5K_CALIBRATION_FULL;
+
+ ATH5K_DBG(ah, ATH5K_DEBUG_CALIBRATE,
+ "running full calibration
");
+
+ if (ath5k_hw_gainf_calibrate(ah) == AR5K_RFGAIN_NEED_CHANGE) {
+ /*
+ * Rfgain is out of bounds, reset the chip
+ * to load new gain values.
+ */
+ ATH5K_DBG(ah, ATH5K_DEBUG_RESET,
+ "got new rfgain, resetting
");
+ ieee80211_queue_work(ah->hw, &ah->reset_work);
+ }
+
+ /* TODO: On full calibration we should stop TX here,
+ * so that it doesn't interfere (mostly due to gain_f
+ * calibration that messes with tx packets -see phy.c).
+ *
+ * NOTE: Stopping the queues from above is not enough
+ * to stop TX but saves us from disconecting (at least
+ * we don't lose packets). */
+ ieee80211_stop_queues(ah->hw);
+ } else
+ ah->ah_cal_mask |= AR5K_CALIBRATION_SHORT;

- /* Only full calibration for now */
- ah->ah_cal_mask |= AR5K_CALIBRATION_FULL;

ATH5K_DBG(ah, ATH5K_DEBUG_CALIBRATE, "channel %u/%x
",
ieee80211_frequency_to_channel(ah->curchan->center_freq),
ah->curchan->hw_value);

- if (ath5k_hw_gainf_calibrate(ah) == AR5K_RFGAIN_NEED_CHANGE) {
- /*
- * Rfgain is out of bounds, reset the chip
- * to load new gain values.
- */
- ATH5K_DBG(ah, ATH5K_DEBUG_RESET, "calibration, resetting
");
- ieee80211_queue_work(ah->hw, &ah->reset_work);
- }
if (ath5k_hw_phy_calibrate(ah, ah->curchan))
ATH5K_ERR(ah, "calibration of channel %u failed
",
ieee80211_frequency_to_channel(
ah->curchan->center_freq));

- /* Noise floor calibration interrupts rx/tx path while I/Q calibration
- * doesn't.
- * TODO: We should stop TX here, so that it doesn't interfere.
- * Note that stopping the queues is not enough to stop TX! */
- if (time_is_before_eq_jiffies(ah->ah_cal_next_nf)) {
- ah->ah_cal_next_nf = jiffies +
- msecs_to_jiffies(ATH5K_TUNE_CALIBRATION_INTERVAL_N F);
- ath5k_hw_update_noise_floor(ah);
- }
-
- ah->ah_cal_mask &= ~AR5K_CALIBRATION_FULL;
+ /* Clear calibration flags */
+ if (ah->ah_cal_mask & AR5K_CALIBRATION_FULL) {
+ ieee80211_wake_queues(ah->hw);
+ ah->ah_cal_mask &= ~AR5K_CALIBRATION_FULL;
+ } else if (ah->ah_cal_mask & AR5K_CALIBRATION_SHORT)
+ ah->ah_cal_mask &= ~AR5K_CALIBRATION_SHORT;
}


@@ -2585,7 +2615,6 @@ static void ath5k_stop_tasklets(struct ath5k_hw *ah)
ah->tx_pending = false;
tasklet_kill(&ah->rxtq);
tasklet_kill(&ah->txtq);
- tasklet_kill(&ah->calib);
tasklet_kill(&ah->beacontq);
tasklet_kill(&ah->ani_tasklet);
}
@@ -2689,9 +2718,24 @@ ath5k_reset(struct ath5k_hw *ah, struct ieee80211_channel *chan,

ath5k_ani_init(ah, ani_mode);

- ah->ah_cal_next_full = jiffies + msecs_to_jiffies(100);
- ah->ah_cal_next_ani = jiffies;
- ah->ah_cal_next_nf = jiffies;
+ /*
+ * Set calibration intervals
+ *
+ * Note: We don't need to run calibration imediately
+ * since some initial calibration is done on reset
+ * even for fast channel switching. Also on scanning
+ * this will get set again and again and it won't get
+ * executed unless we connect somewhere and spend some
+ * time on the channel (that's what calibration needs
+ * anyway to be accurate).
+ */
+ ah->ah_cal_next_full = jiffies +
+ msecs_to_jiffies(ATH5K_TUNE_CALIBRATION_INTERVAL_F ULL);
+ ah->ah_cal_next_ani = jiffies +
+ msecs_to_jiffies(ATH5K_TUNE_CALIBRATION_INTERVAL_A NI);
+ ah->ah_cal_next_short = jiffies +
+ msecs_to_jiffies(ATH5K_TUNE_CALIBRATION_INTERVAL_S HORT);
+
ewma_init(&ah->ah_beacon_rssi_avg, 1024, 8);

/* clear survey data and cycle counters */
@@ -2841,11 +2885,11 @@ ath5k_init(struct ieee80211_hw *hw)

tasklet_init(&ah->rxtq, ath5k_tasklet_rx, (unsigned long)ah);
tasklet_init(&ah->txtq, ath5k_tasklet_tx, (unsigned long)ah);
- tasklet_init(&ah->calib, ath5k_tasklet_calibrate, (unsigned long)ah);
tasklet_init(&ah->beacontq, ath5k_tasklet_beacon, (unsigned long)ah);
tasklet_init(&ah->ani_tasklet, ath5k_tasklet_ani, (unsigned long)ah);

INIT_WORK(&ah->reset_work, ath5k_reset_work);
+ INIT_WORK(&ah->calib_work, ath5k_calibrate_work);
INIT_DELAYED_WORK(&ah->tx_complete_work, ath5k_tx_complete_poll_work);

ret = ath5k_hw_common(ah)->bus_ops->eeprom_read_mac(ah, mac);
diff --git a/drivers/net/wireless/ath/ath5k/phy.c b/drivers/net/wireless/ath/ath5k/phy.c
index 01cb72d..ca4241d 100644
--- a/drivers/net/wireless/ath/ath5k/phy.c
+++ b/drivers/net/wireless/ath/ath5k/phy.c
@@ -338,9 +338,6 @@ static void ath5k_hw_wait_for_synth(struct ath5k_hw *ah,
* And this is the MadWiFi bug entry related to the above
* http://madwifi-project.org/ticket/1659
* with various measurements and diagrams
- *
- * TODO: Deal with power drops due to probes by setting an appropriate
- * tx power on the probe packets ! Make this part of the calibration process.
*/

/* Initialize ah_gain during attach */
@@ -372,10 +369,9 @@ int ath5k_hw_rfgain_opt_init(struct ath5k_hw *ah)
* tx power and a Peak to Average Power Detector (PAPD) will try
* to measure the gain.
*
- * XXX: How about forcing a tx packet (bypassing PCU arbitrator etc)
+ * TODO: Force a tx packet (bypassing PCU arbitrator etc)
* just after we enable the probe so that we don't mess with
- * standard traffic ? Maybe it's time to use sw interrupts and
- * a probe tasklet !!!
+ * standard traffic.
*/
static void ath5k_hw_request_rfgain_probe(struct ath5k_hw *ah)
{
@@ -575,9 +571,7 @@ done:
/* Main callback for thermal RF gain calibration engine
* Check for a new gain reading and schedule an adjustment
* if needed.
- *
- * TODO: Use sw interrupt to schedule reset if gain_F needs
- * adjustment */
+ */
enum ath5k_rfgain ath5k_hw_gainf_calibrate(struct ath5k_hw *ah)
{
u32 data, type;
@@ -1390,6 +1384,8 @@ void ath5k_hw_update_noise_floor(struct ath5k_hw *ah)
return;
}

+ ah->ah_cal_mask |= AR5K_CALIBRATION_NF;
+
ee_mode = ath5k_eeprom_mode_from_channel(ah->ah_current_channel);

/* completed NF calibration, test threshold */
@@ -1434,6 +1430,8 @@ void ath5k_hw_update_noise_floor(struct ath5k_hw *ah)

ah->ah_noise_floor = nf;

+ ah->ah_cal_mask &= ~AR5K_CALIBRATION_NF;
+
ATH5K_DBG(ah, ATH5K_DEBUG_CALIBRATE,
"noise floor calibrated: %d
", nf);
}
@@ -1547,12 +1545,19 @@ ath5k_hw_rf511x_iq_calibrate(struct ath5k_hw *ah)
s32 iq_corr, i_coff, i_coffd, q_coff, q_coffd;
int i;

- if (!ah->ah_calibration ||
- ath5k_hw_reg_read(ah, AR5K_PHY_IQ) & AR5K_PHY_IQ_RUN)
- return 0;
+ /* Skip if I/Q calibration is not needed or if it's still running */
+ if (!ah->ah_iq_cal_needed)
+ return -EINVAL;
+ else if (ath5k_hw_reg_read(ah, AR5K_PHY_IQ) & AR5K_PHY_IQ_RUN) {
+ ATH5K_DBG_UNLIMIT(ah, ATH5K_DEBUG_CALIBRATE,
+ "I/Q calibration still running");
+ return -EBUSY;
+ }

/* Calibration has finished, get the results and re-run */
- /* work around empty results which can apparently happen on 5212 */
+
+ /* Work around for empty results which can apparently happen on 5212:
+ * Read registers up to 10 times until we get both i_pr and q_pwr */
for (i = 0; i <= 10; i++) {
iq_corr = ath5k_hw_reg_read(ah, AR5K_PHY_IQRES_CAL_CORR);
i_pwr = ath5k_hw_reg_read(ah, AR5K_PHY_IQRES_CAL_PWR_I);
@@ -1570,9 +1575,13 @@ ath5k_hw_rf511x_iq_calibrate(struct ath5k_hw *ah)
else
q_coffd = q_pwr >> 7;

- /* protect against divide by 0 and loss of sign bits */
+ /* In case i_coffd became zero, cancel calibration
+ * not only it's too small, it'll also result a divide
+ * by zero later on. */
if (i_coffd == 0 || q_coffd < 2)
- return 0;
+ return -ECANCELED;
+
+ /* Protect against loss of sign bits */

i_coff = (-iq_corr) / i_coffd;
i_coff = clamp(i_coff, -32, 31); /* signed 6 bit */
@@ -1613,10 +1622,43 @@ int ath5k_hw_phy_calibrate(struct ath5k_hw *ah,
return ath5k_hw_rf5110_calibrate(ah, channel);

ret = ath5k_hw_rf511x_iq_calibrate(ah);
+ if (ret) {
+ ATH5K_DBG_UNLIMIT(ah, ATH5K_DEBUG_CALIBRATE,
+ "No I/Q correction performed (%uMHz)
",
+ channel->center_freq);

- if ((ah->ah_radio == AR5K_RF5111 || ah->ah_radio == AR5K_RF5112) &&
- (channel->hw_value != AR5K_MODE_11B))
- ath5k_hw_request_rfgain_probe(ah);
+ /* Happens all the time if there is not much
+ * traffic, consider it normal behaviour. */
+ ret = 0;
+ }
+
+ /* On full calibration do an AGC calibration and
+ * request a PAPD probe for gainf calibration if
+ * needed */
+ if (ah->ah_cal_mask & AR5K_CALIBRATION_FULL) {
+
+ AR5K_REG_ENABLE_BITS(ah, AR5K_PHY_AGCCTL,
+ AR5K_PHY_AGCCTL_CAL);
+
+ ret = ath5k_hw_register_timeout(ah, AR5K_PHY_AGCCTL,
+ AR5K_PHY_AGCCTL_CAL | AR5K_PHY_AGCCTL_NF,
+ 0, false);
+ if (ret) {
+ ATH5K_ERR(ah,
+ "gain calibration timeout (%uMHz)
",
+ channel->center_freq);
+ }
+
+ if ((ah->ah_radio == AR5K_RF5111 ||
+ ah->ah_radio == AR5K_RF5112)
+ && (channel->hw_value != AR5K_MODE_11B))
+ ath5k_hw_request_rfgain_probe(ah);
+ }
+
+ /* Update noise floor
+ * XXX: Only do this after AGC calibration */
+ if (!(ah->ah_cal_mask & AR5K_CALIBRATION_NF))
+ ath5k_hw_update_noise_floor(ah);

return ret;
}
@@ -3433,9 +3475,9 @@ int ath5k_hw_phy_init(struct ath5k_hw *ah, struct ieee80211_channel *channel,

/* At the same time start I/Q calibration for QAM constellation
* -no need for CCK- */
- ah->ah_calibration = false;
+ ah->ah_iq_cal_needed = false;
if (!(mode == AR5K_MODE_11B)) {
- ah->ah_calibration = true;
+ ah->ah_iq_cal_needed = true;
AR5K_REG_WRITE_BITS(ah, AR5K_PHY_IQ,
AR5K_PHY_IQ_CAL_NUM_LOG_MAX, 15);
AR5K_REG_ENABLE_BITS(ah, AR5K_PHY_IQ,
--
1.7.9.6 (Apple Git-31.1)

From: Felix Fietkau <nbd@openwrt.org>
Date: Tue, 6 Mar 2012 11:06:37 +0100
Subject: ath5k: do not stop queues for full calibration

commit 62e2c102cc1d2600381410c089ca9a37359577d2 upstream.

Some calibration types interfere with tx activity, but the queue stop does
not prevent that. In fact, some calibration types need tx activity to properly
function, so stopping the queues for them is counterproductive.
In some tests this patch has been shown to improve stability, especially in
AP or ad-hoc mode.

Signed-off-by: Felix Fietkau <nbd@openwrt.org>
Acked-by: Nick Kossifidis <mickflemm@gmail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
drivers/net/wireless/ath/ath5k/base.c | 14 ++------------
1 file changed, 2 insertions(+), 12 deletions(-)

diff --git a/drivers/net/wireless/ath/ath5k/base.c b/drivers/net/wireless/ath/ath5k/base.c
index 9f604a8..2e50218 100644
--- a/drivers/net/wireless/ath/ath5k/base.c
+++ b/drivers/net/wireless/ath/ath5k/base.c
@@ -2275,15 +2275,6 @@ ath5k_calibrate_work(struct work_struct *work)
"got new rfgain, resetting
");
ieee80211_queue_work(ah->hw, &ah->reset_work);
}
-
- /* TODO: On full calibration we should stop TX here,
- * so that it doesn't interfere (mostly due to gain_f
- * calibration that messes with tx packets -see phy.c).
- *
- * NOTE: Stopping the queues from above is not enough
- * to stop TX but saves us from disconecting (at least
- * we don't lose packets). */
- ieee80211_stop_queues(ah->hw);
} else
ah->ah_cal_mask |= AR5K_CALIBRATION_SHORT;

@@ -2298,10 +2289,9 @@ ath5k_calibrate_work(struct work_struct *work)
ah->curchan->center_freq));

/* Clear calibration flags */
- if (ah->ah_cal_mask & AR5K_CALIBRATION_FULL) {
- ieee80211_wake_queues(ah->hw);
+ if (ah->ah_cal_mask & AR5K_CALIBRATION_FULL)
ah->ah_cal_mask &= ~AR5K_CALIBRATION_FULL;
- } else if (ah->ah_cal_mask & AR5K_CALIBRATION_SHORT)
+ else if (ah->ah_cal_mask & AR5K_CALIBRATION_SHORT)
ah->ah_cal_mask &= ~AR5K_CALIBRATION_SHORT;
}

--
1.7.9.6 (Apple Git-31.1)

From: Felix Fietkau <nbd@openwrt.org>
Date: Tue, 6 Mar 2012 11:06:38 +0100
Subject: ath5k: do not re-run AGC calibration periodically

commit 5c17ddc4a047c59638c7eb8537aa887a1ddb9b0b upstream.

All other Atheros drivers run the AGC gain calibration and DC offset
calibration only after reset. Running them periodically has caused stability
issues on some (primarily AR2315/2413/5413/5414 based) devices, leading to
messages such as:

ath5k phy0: gain calibration timeout (2462MHz)
ath5k phy0: calibration of channel 11 failed

Related bug reports:
https://dev.openwrt.org/ticket/10574
https://bugzilla.redhat.com/show_bug.cgi?id=795141

Signed-off-by: Felix Fietkau <nbd@openwrt.org>
Acked-by: Nick Kossifidis <mickflemm@gmail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
drivers/net/wireless/ath/ath5k/phy.c | 34 +++++++++-------------------------
1 file changed, 9 insertions(+), 25 deletions(-)

diff --git a/drivers/net/wireless/ath/ath5k/phy.c b/drivers/net/wireless/ath/ath5k/phy.c
index ca4241d..d52f77d 100644
--- a/drivers/net/wireless/ath/ath5k/phy.c
+++ b/drivers/net/wireless/ath/ath5k/phy.c
@@ -1632,31 +1632,15 @@ int ath5k_hw_phy_calibrate(struct ath5k_hw *ah,
ret = 0;
}

- /* On full calibration do an AGC calibration and
- * request a PAPD probe for gainf calibration if
- * needed */
- if (ah->ah_cal_mask & AR5K_CALIBRATION_FULL) {
-
- AR5K_REG_ENABLE_BITS(ah, AR5K_PHY_AGCCTL,
- AR5K_PHY_AGCCTL_CAL);
-
- ret = ath5k_hw_register_timeout(ah, AR5K_PHY_AGCCTL,
- AR5K_PHY_AGCCTL_CAL | AR5K_PHY_AGCCTL_NF,
- 0, false);
- if (ret) {
- ATH5K_ERR(ah,
- "gain calibration timeout (%uMHz)
",
- channel->center_freq);
- }
-
- if ((ah->ah_radio == AR5K_RF5111 ||
- ah->ah_radio == AR5K_RF5112)
- && (channel->hw_value != AR5K_MODE_11B))
- ath5k_hw_request_rfgain_probe(ah);
- }
-
- /* Update noise floor
- * XXX: Only do this after AGC calibration */
+ /* On full calibration request a PAPD probe for
+ * gainf calibration if needed */
+ if ((ah->ah_cal_mask & AR5K_CALIBRATION_FULL) &&
+ (ah->ah_radio == AR5K_RF5111 ||
+ ah->ah_radio == AR5K_RF5112) &&
+ channel->hw_value != AR5K_MODE_11B)
+ ath5k_hw_request_rfgain_probe(ah);
+
+ /* Update noise floor */
if (!(ah->ah_cal_mask & AR5K_CALIBRATION_NF))
ath5k_hw_update_noise_floor(ah);

--
1.7.9.6 (Apple Git-31.1)
 
Old 08-05-2012, 03:12 PM
Russ Lind
 
Default Bug#681232: Atheros WiFi Adapter couldn't find networks "gain calibration timeout"

whoa, I'll see what I can do.

Building the 3.4.7 kernel was my first try at building the kernel, I
downloaded the bz2 file from kernel.org and followed the steps in
Telemachus' post (post #5) in the following thread:
http://forums.debian.net/viewtopic.php?f=16&t=36525


I haven't used git before but I will give your steps a try.

I definitely did not have this problem with the 3.2.20 Debian kernel
build. I diff'd the 3.2.20 and 3.2.21 kernel code (from kernel.org) in
net/wireless/ath and I didn't see any differences so I was surprised the
issue started happening with 3.2.21.


On 08/05/2012 01:37 AM, Jonathan Nieder wrote:

tags 681232 + patch moreinfo
quit

Hi,

Russ Lind wrote:


For what it's worth, the 3.5-1 kernel from experimental works for me

[...]

I'd also built the 3.4.7 kernel from the sources at kernel.org.

[...]

I've read about a number of people having this issue thru the 3.3
kernels with various distros, and read the issue was supposedly
fixed in the 3.4 branch. I get the impression it's an upstream
issue.

Maybe one of the following patches helped.

v3.3-rc1~182^2~44^2~292 ath5k: Calibration re-work

v3.4-rc1~177^2~108^2~108 ath5k: do not stop queues for full
calibration

v3.4-rc1~177^2~108^2~107 ath5k: do not re-run AGC calibration
periodically

What seems oddest to me is that I'm not aware of any patches from
the range 3.2.20->3.2.21 that might have had this effect. Are you
sure that 3.2.20 did not reproduce the bug? If you have time to try
one of the following, I'd be interested:

a. Please test v3.2.20 and v3.2.21 from kernel.org, following
instructions from [1] or the following steps:

# get the kernel history, if you don't already have it
git clone
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git

# fetch point releases:
cd linux
git remote add stable
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git
git fetch stable

# configure, build, test:
git checkout v3.2.21
cp /boot/config-$(uname -r) .config; # current configuration
scripts/config --disable DEBUG_INFO
make localmodconfig; # optional: minimize configuration
make deb-pkg; # optionally with -j<num> for parallel build
dpkg -i ../<name of package>; # as root
reboot
... test test test ...

# hopefully it reproduces the bug, so try the older kernel:
cd linux
git checkout v3.2.20
make deb-pkg; # maybe with -j4
dpkg -i ../<name of package>; # as root
reboot
... test test test ...

# hopefully it does not reproduce the bug

b. If (a) goes well, please bisect to find which patch introduced
the bug, as described at [2]:

cd linux
git bisect start
git bisect good<some known-good kernel>
git bisect bad v3.2.21

# a version halfway between is automatically checked out
make deb-pkg; # maybe with -j4
dpkg -i ../<name of package>; # as root
reboot
... test test test ...
cd linux
git bisect good; # if it works well
git bisect bad; # if it reproduces the calibration timeouts
git bisect skip; # if some other bug makes it hard to test

... rinse and repeat until it prints the "first bad commit"
or until bored ...

# at any step, to see the regression range narrowing
apt-get install gitk
git bisect visualize

# to get a log of revs tested so far, which will let someone
# else pick up where you left off
git bisect log

c. How does a pre-compiled 3.3 kernel from http://snapshot.debian.org
do?

d. Please test the three attached patches together against a 3.2.y
kernel, following the directions at [3] or the following
instructions:

cd linux
git checkout stable/linux-3.2.y
git am -3sc $(ls -1 /path/to/patches/0[123]-*)
make deb-pkg; # maybe with -j4
dpkg -i ../<name of package>; # as root
reboot
... test test test ...

Hope that helps,
Jonathan

[1] http://kernel-handbook.alioth.debian.org/ch-common-tasks.html#s-kernel-org-package
[2] http://kernel-handbook.alioth.debian.org/ch-bugs.html#s9.2.1
[3] http://kernel-handbook.alioth.debian.org/ch-common-tasks.html#s-common-official



--
To UNSUBSCRIBE, email to debian-kernel-REQUEST@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmaster@lists.debian.org
Archive: 501E8D6B.6060906@comcast.net">http://lists.debian.org/501E8D6B.6060906@comcast.net
 
Old 08-06-2012, 12:38 AM
Jesse Rhodes
 
Default Bug#681232: Atheros WiFi Adapter couldn't find networks "gain calibration timeout"

copying my message to everyone else manually because gmail ate my CC.

Hi there,

Steps a. and c.: Neither 3.3.0-rc6 (from snapshots),
nor 3.2.21, nor 3.2.20 reproduced the bug. I'm typing this email from
3.2.21 right now with a fully functional wireless connection.

I skipped step b. due to not having a bad bisect to refer to.



Step d.: 3.2.25+ including the attached patches also failed to reproduce the bug.

Not sure where to go from here but I'll keep digging if you point me in the right direction.

sney


On Sun, Aug 5, 2012 at 2:37 AM, Jonathan Nieder <jrnieder@gmail.com> wrote:

tags 681232 + patch moreinfo

quit



Hi,



Russ Lind wrote:



> For what it's worth, the 3.5-1 kernel from experimental works for me

[...]

> I'd also built the 3.4.7 kernel from the sources at kernel.org.

[...]

> I've read about a number of people having this issue thru the 3.3

> kernels with various distros, and read the issue was supposedly

> fixed in the 3.4 branch. *I get the impression it's an upstream

> issue.



Maybe one of the following patches helped.



* v3.3-rc1~182^2~44^2~292 ath5k: Calibration re-work



* v3.4-rc1~177^2~108^2~108 ath5k: do not stop queues for full

* * * * * * * * * * * * * *calibration



* v3.4-rc1~177^2~108^2~107 ath5k: do not re-run AGC calibration

* * * * * * * * * * * * * *periodically



What seems oddest to me is that I'm not aware of any patches from

the range 3.2.20->3.2.21 that might have had this effect. *Are you

sure that 3.2.20 did not reproduce the bug? *If you have time to try

one of the following, I'd be interested:



*a. Please test v3.2.20 and v3.2.21 from kernel.org, following

* * instructions from [1] or the following steps:



* * # get the kernel history, if you don't already have it

* * git clone

* * * git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git



* * # fetch point releases:

* * cd linux

* * git remote add stable

* * * git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git

* * git fetch stable



* * # configure, build, test:

* * git checkout v3.2.21

* * cp /boot/config-$(uname -r) .config; # current configuration

* * scripts/config --disable DEBUG_INFO

* * make localmodconfig; # optional: minimize configuration

* * make deb-pkg; # optionally with -j<num> for parallel build

* * dpkg -i ../<name of package>; # as root

* * reboot

* * ... test test test ...



* * # hopefully it reproduces the bug, so try the older kernel:

* * cd linux

* * git checkout v3.2.20

* * make deb-pkg; # maybe with -j4

* * dpkg -i ../<name of package>; # as root

* * reboot

* * ... test test test ...



* * # hopefully it does not reproduce the bug



*b. If (a) goes well, please bisect to find which patch introduced

* * the bug, as described at [2]:



* * cd linux

* * git bisect start

* * git bisect good <some known-good kernel>

* * git bisect bad v3.2.21



* * # a version halfway between is automatically checked out

* * make deb-pkg; # maybe with -j4

* * dpkg -i ../<name of package>; # as root

* * reboot

* * ... test test test ...

* * cd linux

* * git bisect good; # if it works well

* * git bisect bad; # if it reproduces the calibration timeouts

* * git bisect skip; # if some other bug makes it hard to test



* * ... rinse and repeat until it prints the "first bad commit"

* * or until bored ...



* * # at any step, to see the regression range narrowing

* * apt-get install gitk

* * git bisect visualize



* * # to get a log of revs tested so far, which will let someone

* * # else pick up where you left off

* * git bisect log



*c. How does a pre-compiled 3.3 kernel from http://snapshot.debian.org

* * do?



*d. Please test the three attached patches together against a 3.2.y

* * kernel, following the directions at [3] or the following

* * instructions:



* * cd linux

* * git checkout stable/linux-3.2.y

* * git am -3sc $(ls -1 /path/to/patches/0[123]-*)

* * make deb-pkg; # maybe with -j4

* * dpkg -i ../<name of package>; # as root

* * reboot

* * ... test test test ...



Hope that helps,

Jonathan



[1] http://kernel-handbook.alioth.debian.org/ch-common-tasks.html#s-kernel-org-package

[2] http://kernel-handbook.alioth.debian.org/ch-bugs.html#s9.2.1

[3] http://kernel-handbook.alioth.debian.org/ch-common-tasks.html#s-common-official
 
Old 08-07-2012, 04:04 AM
Jesse Rhodes
 
Default Bug#681232: Atheros WiFi Adapter couldn't find networks "gain calibration timeout"

Well, it's not going to happen when I'm using 3.2.0-2, and it always happens on 3.2.0-3 rendering it basically useless for a working system - not only is my network controller unusable, it also constantly spams the console with those "gain calibration timeout" messages.


Since 3.2.0-3 reports itself as Version: 3.2.21-3, and vanilla 3.2.21 worked fine, it must be some difference between the debian build and the upstream 3.2.21 that is causing this issue. Right?


On Sun, Aug 5, 2012 at 6:41 PM, Jonathan Nieder <jrnieder@gmail.com> wrote:

Jesse Rhodes wrote:



> Steps a. and c.: Neither 3.3.0-rc6 (from snapshots), nor 3.2.21, nor 3.2.20

> reproduced the bug. I'm typing this email from 3.2.21 right now with a

> fully functional wireless connection.



Thanks, Jesse. *I'd suggest using whatever kernel is most convenient

and letting us know whether it's happened again in a few days.



Do you mind if I forward your reply to the bug log?



Ciao,

Jonathan
 
Old 08-07-2012, 07:08 AM
Jonathan Nieder
 
Default Bug#681232: Atheros WiFi Adapter couldn't find networks "gain calibration timeout"

Jesse Rhodes wrote:

> Well, it's not going to happen when I'm using 3.2.0-2, and it always
> happens on 3.2.0-3 rendering it basically useless for a working system

Thanks for clarifying. I missed that you had tried 3.2.21-3 again.

Could you list the versions you've tested, in order, and what happened
with each for future reference?

[...]
> Since 3.2.0-3 reports itself as Version: 3.2.21-3, and vanilla 3.2.21
> worked fine,

Ok, here are two tests to try.

(i) Am I correct in guessing 3.2.21-1 from snapshot.debian.org
produces the gain calibration timeouts, too?

(ii) Here is a way of testing if the build process changed anything,
by building the same source with the same configuration:

cd linux

# fetch Debian-patched kernel
git remote add debian
git://git.debian.org/kernel/linux.git
git fetch debian

# configure, build, test
git checkout debian/wheezy
cp /boot/config-3.2.0-3-amd64 .config
scripts/config --disable DEBUG_INFO
make deb-pkg; # optionally with -j<num> for parallel build
dpkg -i ../<name of package>; # as root
... test test test ...

Thanks again, and sorry for the fuss,
Jonathan


--
To UNSUBSCRIBE, email to debian-kernel-REQUEST@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmaster@lists.debian.org
Archive: http://lists.debian.org/20120807070847.GA19456@mannheim-rule.local
 
Old 08-07-2012, 05:29 PM
Jesse Rhodes
 
Default Bug#681232: Atheros WiFi Adapter couldn't find networks "gain calibration timeout"

(i) 3.2.21-1 from snapshot produces the gain calibration timeouts.

(ii) so does a rebuild of debian patched 3.2.21-3.

Other kernels tried so far in order (we'll use "worked" for functional wifi, and "broke" for calibration timeouts):


debian 3.2.0-2 (3.2.20-1) worked
debian 3.2.0-3 (3.2.21-3) broke
vanilla 3.2.20 worked
vanilla 3.2.21 worked
snapshot.d.o 3.3.0-rc6 (3.3~rc6-1~experimental.1) worked
patched 3.2.y (3.2.25 with previous attached patches) worked

debian 3.2.0-3 (3.2.21-3) still broke # got paranoid, tried it again



On Tue, Aug 7, 2012 at 1:08 AM, Jonathan Nieder <jrnieder@gmail.com> wrote:

Jesse Rhodes wrote:



> Well, it's not going to happen when I'm using 3.2.0-2, and it always

> happens on 3.2.0-3 rendering it basically useless for a working system



Thanks for clarifying. *I missed that you had tried 3.2.21-3 again.



Could you list the versions you've tested, in order, and what happened

with each for future reference?



[...]

> Since 3.2.0-3 reports itself as Version: 3.2.21-3, and vanilla 3.2.21

> worked fine,



Ok, here are two tests to try.



*(i) Am I correct in guessing 3.2.21-1 from snapshot.debian.org

* * *produces the gain calibration timeouts, too?



*(ii) Here is a way of testing if the build process changed anything,

* * * by building the same source with the same configuration:



* * * * cd linux



* * * * # fetch Debian-patched kernel

* * * * git remote add debian

* * * * * git://git.debian.org/kernel/linux.git

* * * * git fetch debian



* * * * # configure, build, test

* * * * git checkout debian/wheezy

* * * * cp /boot/config-3.2.0-3-amd64 .config

* * * * scripts/config --disable DEBUG_INFO

* * * * make deb-pkg; # optionally with -j<num> for parallel build

* * * * dpkg -i ../<name of package>; # as root

* * * * ... test test test ...



Thanks again, and sorry for the fuss,

Jonathan
 
Old 08-07-2012, 07:17 PM
Jonathan Nieder
 
Default Bug#681232: Atheros WiFi Adapter couldn't find networks "gain calibration timeout"

Hi again,

Jesse Rhodes wrote:

> (i) 3.2.21-1 from snapshot produces the gain calibration timeouts.
>
> (ii) so does a rebuild of debian patched 3.2.21-3.

Ok, perfect.

Two more tests:

(iii) patched 3.2.21-3 with .config used for vanilla 3.2.21?
(iv) vanilla 3.2.21 with Debian .config

Thanks for your patience,
Jonathan


--
To UNSUBSCRIBE, email to debian-kernel-REQUEST@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmaster@lists.debian.org
Archive: http://lists.debian.org/20120807191752.GA181@mannheim-rule.local
 
Old 08-07-2012, 11:00 PM
Jesse Rhodes
 
Default Bug#681232: Atheros WiFi Adapter couldn't find networks "gain calibration timeout"

(iii) broke,
(iv) worked.

On Tue, Aug 7, 2012 at 1:17 PM, Jonathan Nieder <jrnieder@gmail.com> wrote:

Hi again,



Jesse Rhodes wrote:



> (i) 3.2.21-1 from snapshot produces the gain calibration timeouts.

>

> (ii) so does a rebuild of debian patched 3.2.21-3.



Ok, perfect.



Two more tests:



*(iii) patched 3.2.21-3 with .config used for vanilla 3.2.21?

*(iv) vanilla 3.2.21 with Debian .config



Thanks for your patience,

Jonathan
 
Old 08-09-2012, 07:13 AM
Jonathan Nieder
 
Default Bug#681232: Atheros WiFi Adapter couldn't find networks "gain calibration timeout"

tags 681232 - patch
quit

Jesse Rhodes wrote:

> (iii) broke,
> (iv) worked.

Weird. I can't find any obvious candidate for a patch that would have
broken the driver.

Can you bisect? Even a few iterations would help a lot in narrowing
down the search. It works like so:

cd linux
git bisect start
git checkout v3.2.21; # vanilla kernel
make deb-pkg; # optionally with -j<num> for parallel build
dpkg -i ../<name of package>; # as root
reboot
... test test test ...

# hopefully it avoids the bug, so
cd linux
git bisect good
git checkout debian/wheezy; # patched kernel
make deb-pkg; # maybe with -j4
dpkg -i ../<name of package>; # as root
reboot
... test test test ...

# hopefully it reproduces the bug, so
cd linux
git bisect bad

# a rev halfway between is automatically checked out
# to test
make deb-pkg; # maybe with -j4
dpkg -i ../<package>; # as root
reboot
... test test test ...

cd linux
git bisect bad; # if it reproduces the bug
git bisect good; # if it reliably does not
git bisect skip; # if some other bug makes it hard to test

# another rev to test is automatically checked out

... continue until it finds the "first bad rev" ...

At any step you can watch the regression range narrowing by
running "git bisect visualize" if the gitk package is installed.
When finished or bored, please run "git bisect log" to list revs
it has tested so others can analyze your results or pick up where
you left off.

Thanks again, and sorry I have no better ideas.

Sincerely,
Jonathan


--
To UNSUBSCRIBE, email to debian-kernel-REQUEST@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmaster@lists.debian.org
Archive: http://lists.debian.org/20120809071322.GF174@mannheim-rule.local
 
Old 08-09-2012, 03:57 PM
Jesse Rhodes
 
Default Bug#681232: Atheros WiFi Adapter couldn't find networks "gain calibration timeout"

Bisecting away.

Is 3.2.0-3 (3.2.23-1) from sid exempt from the freeze? I'm going to try that one as well. If it works, at least it'll likely work for the release, though we should probably keep hunting for the cause of this bug lest it surface again.
 

Thread Tools




All times are GMT. The time now is 07:24 AM.

VBulletin, Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
Content Relevant URLs by vBSEO ©2007, Crawlability, Inc.
Copyright 2007 - 2008, www.linux-archive.org