* [PATCH 3/3] ath9k_hw: fix a noise floor calibration related race condition
From: Felix Fietkau @ 2010-07-28 17:45 UTC (permalink / raw)
To: linux-wireless; +Cc: linville, lrodriguez
In-Reply-To: <1280339151-37084-2-git-send-email-nbd@openwrt.org>
On AR5008-AR9002, other forms of calibration must not be started while
the noise floor calibration is running, as this can create invalid
readings which were sometimes not even recoverable by any further
calibration attempts.
This patch also ensures that the result of noise floor measurements
are processed faster and also allows the result of the initial
calibration on reset to make it into the NF history buffer
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
---
drivers/net/wireless/ath/ath9k/ar9002_calib.c | 32 ++++++++++++++++--------
drivers/net/wireless/ath/ath9k/calib.c | 15 ++++++-----
drivers/net/wireless/ath/ath9k/calib.h | 3 +-
drivers/net/wireless/ath/ath9k/hw.h | 1 +
4 files changed, 31 insertions(+), 20 deletions(-)
diff --git a/drivers/net/wireless/ath/ath9k/ar9002_calib.c b/drivers/net/wireless/ath/ath9k/ar9002_calib.c
index 4a7bcfa..916cde7 100644
--- a/drivers/net/wireless/ath/ath9k/ar9002_calib.c
+++ b/drivers/net/wireless/ath/ath9k/ar9002_calib.c
@@ -687,8 +687,13 @@ static bool ar9002_hw_calibrate(struct ath_hw *ah,
{
bool iscaldone = true;
struct ath9k_cal_list *currCal = ah->cal_list_curr;
+ bool nfcal, nfcal_pending = false;
- if (currCal &&
+ nfcal = !!(REG_READ(ah, AR_PHY_AGC_CONTROL) & AR_PHY_AGC_CONTROL_NF);
+ if (ah->caldata)
+ nfcal_pending = ah->caldata->nfcal_pending;
+
+ if (currCal && !nfcal &&
(currCal->calState == CAL_RUNNING ||
currCal->calState == CAL_WAITING)) {
iscaldone = ar9002_hw_per_calibration(ah, chan,
@@ -704,7 +709,7 @@ static bool ar9002_hw_calibrate(struct ath_hw *ah,
}
/* Do NF cal only at longer intervals */
- if (longcal) {
+ if (longcal || nfcal_pending) {
/* Do periodic PAOffset Cal */
ar9002_hw_pa_cal(ah, false);
ar9002_hw_olc_temp_compensation(ah);
@@ -713,16 +718,18 @@ static bool ar9002_hw_calibrate(struct ath_hw *ah,
* Get the value from the previous NF cal and update
* history buffer.
*/
- ath9k_hw_getnf(ah, chan);
-
- /*
- * Load the NF from history buffer of the current channel.
- * NF is slow time-variant, so it is OK to use a historical
- * value.
- */
- ath9k_hw_loadnf(ah, ah->curchan);
+ if (ath9k_hw_getnf(ah, chan)) {
+ /*
+ * Load the NF from history buffer of the current
+ * channel.
+ * NF is slow time-variant, so it is OK to use a
+ * historical value.
+ */
+ ath9k_hw_loadnf(ah, ah->curchan);
+ }
- ath9k_hw_start_nfcal(ah);
+ if (longcal)
+ ath9k_hw_start_nfcal(ah);
}
return iscaldone;
@@ -873,6 +880,9 @@ static bool ar9002_hw_init_cal(struct ath_hw *ah, struct ath9k_channel *chan)
REG_WRITE(ah, AR_PHY_AGC_CONTROL,
REG_READ(ah, AR_PHY_AGC_CONTROL) | AR_PHY_AGC_CONTROL_NF);
+ if (ah->caldata)
+ ah->caldata->nfcal_pending = true;
+
ah->cal_list = ah->cal_list_last = ah->cal_list_curr = NULL;
/* Enable IQ, ADC Gain and ADC DC offset CALs */
diff --git a/drivers/net/wireless/ath/ath9k/calib.c b/drivers/net/wireless/ath/ath9k/calib.c
index 52460bc..787657b 100644
--- a/drivers/net/wireless/ath/ath9k/calib.c
+++ b/drivers/net/wireless/ath/ath9k/calib.c
@@ -156,6 +156,9 @@ EXPORT_SYMBOL(ath9k_hw_reset_calvalid);
void ath9k_hw_start_nfcal(struct ath_hw *ah)
{
+ if (ah->caldata)
+ ah->caldata->nfcal_pending = true;
+
REG_SET_BIT(ah, AR_PHY_AGC_CONTROL,
AR_PHY_AGC_CONTROL_ENABLE_NF);
REG_SET_BIT(ah, AR_PHY_AGC_CONTROL,
@@ -282,8 +285,7 @@ static void ath9k_hw_nf_sanitize(struct ath_hw *ah, s16 *nf)
}
}
-int16_t ath9k_hw_getnf(struct ath_hw *ah,
- struct ath9k_channel *chan)
+bool ath9k_hw_getnf(struct ath_hw *ah, struct ath9k_channel *chan)
{
struct ath_common *common = ath9k_hw_common(ah);
int16_t nf, nfThresh;
@@ -293,7 +295,7 @@ int16_t ath9k_hw_getnf(struct ath_hw *ah,
struct ath9k_hw_cal_data *caldata = ah->caldata;
if (!caldata)
- return ath9k_hw_get_default_nf(ah, chan);
+ return false;
chan->channelFlags &= (~CHANNEL_CW_INT);
if (REG_READ(ah, AR_PHY_AGC_CONTROL) & AR_PHY_AGC_CONTROL_NF) {
@@ -301,7 +303,7 @@ int16_t ath9k_hw_getnf(struct ath_hw *ah,
"NF did not complete in calibration window\n");
nf = 0;
caldata->rawNoiseFloor = nf;
- return caldata->rawNoiseFloor;
+ return false;
} else {
ath9k_hw_do_getnf(ah, nfarray);
ath9k_hw_nf_sanitize(ah, nfarray);
@@ -317,11 +319,10 @@ int16_t ath9k_hw_getnf(struct ath_hw *ah,
}
h = caldata->nfCalHist;
-
+ caldata->nfcal_pending = false;
ath9k_hw_update_nfcal_hist_buffer(h, nfarray);
caldata->rawNoiseFloor = h[0].privNF;
-
- return ah->caldata->rawNoiseFloor;
+ return true;
}
void ath9k_init_nfcal_hist_buffer(struct ath_hw *ah,
diff --git a/drivers/net/wireless/ath/ath9k/calib.h b/drivers/net/wireless/ath/ath9k/calib.h
index 09a0ed2..8381e81 100644
--- a/drivers/net/wireless/ath/ath9k/calib.h
+++ b/drivers/net/wireless/ath/ath9k/calib.h
@@ -110,8 +110,7 @@ struct ath9k_pacal_info{
bool ath9k_hw_reset_calvalid(struct ath_hw *ah);
void ath9k_hw_start_nfcal(struct ath_hw *ah);
void ath9k_hw_loadnf(struct ath_hw *ah, struct ath9k_channel *chan);
-int16_t ath9k_hw_getnf(struct ath_hw *ah,
- struct ath9k_channel *chan);
+bool ath9k_hw_getnf(struct ath_hw *ah, struct ath9k_channel *chan);
void ath9k_init_nfcal_hist_buffer(struct ath_hw *ah,
struct ath9k_channel *chan);
s16 ath9k_hw_getchan_noise(struct ath_hw *ah, struct ath9k_channel *chan);
diff --git a/drivers/net/wireless/ath/ath9k/hw.h b/drivers/net/wireless/ath/ath9k/hw.h
index c1b7011..399f7c1 100644
--- a/drivers/net/wireless/ath/ath9k/hw.h
+++ b/drivers/net/wireless/ath/ath9k/hw.h
@@ -354,6 +354,7 @@ struct ath9k_hw_cal_data {
int8_t qCoff;
int16_t rawNoiseFloor;
bool paprd_done;
+ bool nfcal_pending;
u16 small_signal_gain[AR9300_MAX_CHAINS];
u32 pa_table[AR9300_MAX_CHAINS][PAPRD_TABLE_SZ];
struct ath9k_nfcal_hist nfCalHist[NUM_NF_READINGS];
--
1.6.4.2
^ permalink raw reply related
* [PATCH 1/3] ath9k: prevent calibration during off-channel activity
From: Felix Fietkau @ 2010-07-28 17:45 UTC (permalink / raw)
To: linux-wireless; +Cc: linville, lrodriguez
Previously the software scan callback was used to indicate to the hardware,
when it was safe to calibrate. This didn't really work properly, because it
depends on a specific order of software scan callbacks vs. channel changes.
Also, software scans are not the only thing that triggers off-channel
activity, so it's better to use the newly added indication from mac80211 for
this and not use the software scan callback for anything calibration related.
This fixes at least some of the invalid noise floor readings that I've seen
in AP mode on AR9160
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
---
drivers/net/wireless/ath/ath9k/ath9k.h | 3 +-
drivers/net/wireless/ath/ath9k/main.c | 75 ++++++++++++++++---------------
drivers/net/wireless/ath/ath9k/recv.c | 4 +-
3 files changed, 42 insertions(+), 40 deletions(-)
diff --git a/drivers/net/wireless/ath/ath9k/ath9k.h b/drivers/net/wireless/ath/ath9k/ath9k.h
index 998ae2c..9e967b1 100644
--- a/drivers/net/wireless/ath/ath9k/ath9k.h
+++ b/drivers/net/wireless/ath/ath9k/ath9k.h
@@ -510,13 +510,12 @@ void ath_deinit_leds(struct ath_softc *sc);
#define SC_OP_BEACONS BIT(1)
#define SC_OP_RXAGGR BIT(2)
#define SC_OP_TXAGGR BIT(3)
-#define SC_OP_FULL_RESET BIT(4)
#define SC_OP_PREAMBLE_SHORT BIT(5)
#define SC_OP_PROTECT_ENABLE BIT(6)
#define SC_OP_RXFLUSH BIT(7)
#define SC_OP_LED_ASSOCIATED BIT(8)
#define SC_OP_LED_ON BIT(9)
-#define SC_OP_SCANNING BIT(10)
+#define SC_OP_OFFCHANNEL BIT(10)
#define SC_OP_TSF_RESET BIT(11)
#define SC_OP_BT_PRIORITY_DETECTED BIT(12)
#define SC_OP_BT_SCAN BIT(13)
diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c
index 0429dda..c82d8c4 100644
--- a/drivers/net/wireless/ath/ath9k/main.c
+++ b/drivers/net/wireless/ath/ath9k/main.c
@@ -154,6 +154,27 @@ void ath9k_ps_restore(struct ath_softc *sc)
spin_unlock_irqrestore(&sc->sc_pm_lock, flags);
}
+static void ath_start_ani(struct ath_common *common)
+{
+ struct ath_hw *ah = common->ah;
+ unsigned long timestamp = jiffies_to_msecs(jiffies);
+ struct ath_softc *sc = (struct ath_softc *) common->priv;
+
+ if (!(sc->sc_flags & SC_OP_ANI_RUN))
+ return;
+
+ if (sc->sc_flags & SC_OP_OFFCHANNEL)
+ return;
+
+ common->ani.longcal_timer = timestamp;
+ common->ani.shortcal_timer = timestamp;
+ common->ani.checkani_timer = timestamp;
+
+ mod_timer(&common->ani.timer,
+ jiffies +
+ msecs_to_jiffies((u32)ah->config.ani_poll_interval));
+}
+
/*
* Set/change channels. If the channel is really being changed, it's done
* by reseting the chip. To accomplish this we must first cleanup any pending
@@ -172,6 +193,11 @@ int ath_set_channel(struct ath_softc *sc, struct ieee80211_hw *hw,
if (sc->sc_flags & SC_OP_INVALID)
return -EIO;
+ del_timer_sync(&common->ani.timer);
+ cancel_work_sync(&sc->paprd_work);
+ cancel_work_sync(&sc->hw_check_work);
+ cancel_delayed_work_sync(&sc->tx_complete_work);
+
ath9k_ps_wakeup(sc);
/*
@@ -191,7 +217,7 @@ int ath_set_channel(struct ath_softc *sc, struct ieee80211_hw *hw,
* to flush data frames already in queue because of
* changing channel. */
- if (!stopped || (sc->sc_flags & SC_OP_FULL_RESET))
+ if (!stopped || !(sc->sc_flags & SC_OP_OFFCHANNEL))
fastcc = false;
ath_print(common, ATH_DBG_CONFIG,
@@ -212,8 +238,6 @@ int ath_set_channel(struct ath_softc *sc, struct ieee80211_hw *hw,
}
spin_unlock_bh(&sc->sc_resetlock);
- sc->sc_flags &= ~SC_OP_FULL_RESET;
-
if (ath_startrecv(sc) != 0) {
ath_print(common, ATH_DBG_FATAL,
"Unable to restart recv logic\n");
@@ -225,6 +249,12 @@ int ath_set_channel(struct ath_softc *sc, struct ieee80211_hw *hw,
ath_update_txpow(sc);
ath9k_hw_set_interrupts(ah, ah->imask);
+ if (!(sc->sc_flags & SC_OP_OFFCHANNEL)) {
+ ath_start_ani(common);
+ ieee80211_queue_delayed_work(sc->hw, &sc->tx_complete_work, 0);
+ ath_beacon_config(sc, NULL);
+ }
+
ps_restore:
ath9k_ps_restore(sc);
return r;
@@ -439,8 +469,7 @@ 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) &&
- !(sc->sc_flags & SC_OP_SCANNING)) {
+ if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_PAPRD) {
if (!sc->sc_ah->curchan->paprd_done)
ieee80211_queue_work(sc->hw, &sc->paprd_work);
else
@@ -448,24 +477,6 @@ set_timer:
}
}
-static void ath_start_ani(struct ath_common *common)
-{
- struct ath_hw *ah = common->ah;
- unsigned long timestamp = jiffies_to_msecs(jiffies);
- struct ath_softc *sc = (struct ath_softc *) common->priv;
-
- if (!(sc->sc_flags & SC_OP_ANI_RUN))
- return;
-
- common->ani.longcal_timer = timestamp;
- common->ani.shortcal_timer = timestamp;
- common->ani.checkani_timer = timestamp;
-
- mod_timer(&common->ani.timer,
- jiffies +
- msecs_to_jiffies((u32)ah->config.ani_poll_interval));
-}
-
/*
* Update tx/rx chainmask. For legacy association,
* hard code chainmask to 1x1, for 11n association, use
@@ -477,7 +488,7 @@ void ath_update_chainmask(struct ath_softc *sc, int is_ht)
struct ath_hw *ah = sc->sc_ah;
struct ath_common *common = ath9k_hw_common(ah);
- if ((sc->sc_flags & SC_OP_SCANNING) || is_ht ||
+ if ((sc->sc_flags & SC_OP_OFFCHANNEL) || is_ht ||
(ah->btcoex_hw.scheme != ATH_BTCOEX_CFG_NONE)) {
common->tx_chainmask = ah->caps.tx_chainmask;
common->rx_chainmask = ah->caps.rx_chainmask;
@@ -1579,6 +1590,10 @@ static int ath9k_config(struct ieee80211_hw *hw, u32 changed)
aphy->chan_idx = pos;
aphy->chan_is_ht = conf_is_ht(conf);
+ if (hw->conf.flags & IEEE80211_CONF_OFFCHANNEL)
+ sc->sc_flags |= SC_OP_OFFCHANNEL;
+ else
+ sc->sc_flags &= ~SC_OP_OFFCHANNEL;
if (aphy->state == ATH_WIPHY_SCAN ||
aphy->state == ATH_WIPHY_ACTIVE)
@@ -1990,7 +2005,6 @@ static void ath9k_sw_scan_start(struct ieee80211_hw *hw)
{
struct ath_wiphy *aphy = hw->priv;
struct ath_softc *sc = aphy->sc;
- struct ath_common *common = ath9k_hw_common(sc->sc_ah);
mutex_lock(&sc->mutex);
if (ath9k_wiphy_scanning(sc)) {
@@ -2007,11 +2021,6 @@ static void ath9k_sw_scan_start(struct ieee80211_hw *hw)
aphy->state = ATH_WIPHY_SCAN;
ath9k_wiphy_pause_all_forced(sc, aphy);
- sc->sc_flags |= SC_OP_SCANNING;
- del_timer_sync(&common->ani.timer);
- cancel_work_sync(&sc->paprd_work);
- cancel_work_sync(&sc->hw_check_work);
- cancel_delayed_work_sync(&sc->tx_complete_work);
mutex_unlock(&sc->mutex);
}
@@ -2023,15 +2032,9 @@ static void ath9k_sw_scan_complete(struct ieee80211_hw *hw)
{
struct ath_wiphy *aphy = hw->priv;
struct ath_softc *sc = aphy->sc;
- struct ath_common *common = ath9k_hw_common(sc->sc_ah);
mutex_lock(&sc->mutex);
aphy->state = ATH_WIPHY_ACTIVE;
- sc->sc_flags &= ~SC_OP_SCANNING;
- sc->sc_flags |= SC_OP_FULL_RESET;
- ath_start_ani(common);
- ieee80211_queue_delayed_work(sc->hw, &sc->tx_complete_work, 0);
- ath_beacon_config(sc, NULL);
mutex_unlock(&sc->mutex);
}
diff --git a/drivers/net/wireless/ath/ath9k/recv.c b/drivers/net/wireless/ath/ath9k/recv.c
index da0cfe9..4125ca2 100644
--- a/drivers/net/wireless/ath/ath9k/recv.c
+++ b/drivers/net/wireless/ath/ath9k/recv.c
@@ -292,7 +292,7 @@ static void ath_edma_start_recv(struct ath_softc *sc)
ath_opmode_init(sc);
- ath9k_hw_startpcureceive(sc->sc_ah, (sc->sc_flags & SC_OP_SCANNING));
+ ath9k_hw_startpcureceive(sc->sc_ah, (sc->sc_flags & SC_OP_OFFCHANNEL));
}
static void ath_edma_stop_recv(struct ath_softc *sc)
@@ -498,7 +498,7 @@ int ath_startrecv(struct ath_softc *sc)
start_recv:
spin_unlock_bh(&sc->rx.rxbuflock);
ath_opmode_init(sc);
- ath9k_hw_startpcureceive(ah, (sc->sc_flags & SC_OP_SCANNING));
+ ath9k_hw_startpcureceive(ah, (sc->sc_flags & SC_OP_OFFCHANNEL));
return 0;
}
--
1.6.4.2
^ permalink raw reply related
* [PATCH 2/3] ath9k_hw: clean up per-channel calibration data
From: Felix Fietkau @ 2010-07-28 17:45 UTC (permalink / raw)
To: linux-wireless; +Cc: linville, lrodriguez
In-Reply-To: <1280339151-37084-1-git-send-email-nbd@openwrt.org>
The noise floor history buffer is currently not kept per channel, which
can lead to problems when changing channels from a clean channel to a
noisy one. Also when switching from HT20 to HT40, the noise floor
history buffer is full of measurements, but none of them contain data
for the extension channel, which it needs quite a bit of time to recover
from.
This patch puts all the per-channel calibration data into a single data
structure, and gives the the driver control over whether that is used
per-channel or even not used for some channels.
For ath9k_htc, I decided to keep this per-channel in order to avoid
creating regressions.
For ath9k, the data is kept only for the operating channel, which saves
some space. ath9k_hw takes care of wiping old data when the operating
channel or its channel flags change.
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
---
drivers/net/wireless/ath/ath9k/ar9002_calib.c | 8 +-
drivers/net/wireless/ath/ath9k/ar9003_calib.c | 8 +-
drivers/net/wireless/ath/ath9k/ar9003_paprd.c | 17 ++--
drivers/net/wireless/ath/ath9k/ath9k.h | 1 +
drivers/net/wireless/ath/ath9k/calib.c | 99 +++++++++++++------------
drivers/net/wireless/ath/ath9k/calib.h | 3 +-
drivers/net/wireless/ath/ath9k/htc.h | 2 +
drivers/net/wireless/ath/ath9k/htc_drv_main.c | 10 ++-
drivers/net/wireless/ath/ath9k/hw.c | 18 +++--
drivers/net/wireless/ath/ath9k/hw.h | 24 ++++--
drivers/net/wireless/ath/ath9k/main.c | 32 +++++---
drivers/net/wireless/ath/ath9k/xmit.c | 2 +-
12 files changed, 130 insertions(+), 94 deletions(-)
diff --git a/drivers/net/wireless/ath/ath9k/ar9002_calib.c b/drivers/net/wireless/ath/ath9k/ar9002_calib.c
index dabafb8..4a7bcfa 100644
--- a/drivers/net/wireless/ath/ath9k/ar9002_calib.c
+++ b/drivers/net/wireless/ath/ath9k/ar9002_calib.c
@@ -63,6 +63,7 @@ static bool ar9002_hw_per_calibration(struct ath_hw *ah,
u8 rxchainmask,
struct ath9k_cal_list *currCal)
{
+ struct ath9k_hw_cal_data *caldata = ah->caldata;
bool iscaldone = false;
if (currCal->calState == CAL_RUNNING) {
@@ -81,14 +82,14 @@ static bool ar9002_hw_per_calibration(struct ath_hw *ah,
}
currCal->calData->calPostProc(ah, numChains);
- ichan->CalValid |= currCal->calData->calType;
+ caldata->CalValid |= currCal->calData->calType;
currCal->calState = CAL_DONE;
iscaldone = true;
} else {
ar9002_hw_setup_calibration(ah, currCal);
}
}
- } else if (!(ichan->CalValid & currCal->calData->calType)) {
+ } else if (!(caldata->CalValid & currCal->calData->calType)) {
ath9k_hw_reset_calibration(ah, currCal);
}
@@ -901,7 +902,8 @@ static bool ar9002_hw_init_cal(struct ath_hw *ah, struct ath9k_channel *chan)
ath9k_hw_reset_calibration(ah, ah->cal_list_curr);
}
- chan->CalValid = 0;
+ if (ah->caldata)
+ ah->caldata->CalValid = 0;
return true;
}
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_calib.c b/drivers/net/wireless/ath/ath9k/ar9003_calib.c
index 5a06503..1c5dadc 100644
--- a/drivers/net/wireless/ath/ath9k/ar9003_calib.c
+++ b/drivers/net/wireless/ath/ath9k/ar9003_calib.c
@@ -68,6 +68,7 @@ static bool ar9003_hw_per_calibration(struct ath_hw *ah,
u8 rxchainmask,
struct ath9k_cal_list *currCal)
{
+ struct ath9k_hw_cal_data *caldata = ah->caldata;
/* Cal is assumed not done until explicitly set below */
bool iscaldone = false;
@@ -95,7 +96,7 @@ static bool ar9003_hw_per_calibration(struct ath_hw *ah,
currCal->calData->calPostProc(ah, numChains);
/* Calibration has finished. */
- ichan->CalValid |= currCal->calData->calType;
+ caldata->CalValid |= currCal->calData->calType;
currCal->calState = CAL_DONE;
iscaldone = true;
} else {
@@ -106,7 +107,7 @@ static bool ar9003_hw_per_calibration(struct ath_hw *ah,
ar9003_hw_setup_calibration(ah, currCal);
}
}
- } else if (!(ichan->CalValid & currCal->calData->calType)) {
+ } else if (!(caldata->CalValid & currCal->calData->calType)) {
/* If current cal is marked invalid in channel, kick it off */
ath9k_hw_reset_calibration(ah, currCal);
}
@@ -785,7 +786,8 @@ static bool ar9003_hw_init_cal(struct ath_hw *ah,
if (ah->cal_list_curr)
ath9k_hw_reset_calibration(ah, ah->cal_list_curr);
- chan->CalValid = 0;
+ if (ah->caldata)
+ ah->caldata->CalValid = 0;
return true;
}
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_paprd.c b/drivers/net/wireless/ath/ath9k/ar9003_paprd.c
index 49e0c86..7c38229 100644
--- a/drivers/net/wireless/ath/ath9k/ar9003_paprd.c
+++ b/drivers/net/wireless/ath/ath9k/ar9003_paprd.c
@@ -577,10 +577,11 @@ 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_channel *chan, int chain)
+ struct ath9k_hw_cal_data *caldata,
+ int chain)
{
- u32 *paprd_table_val = chan->pa_table[chain];
- u32 small_signal_gain = chan->small_signal_gain[chain];
+ u32 *paprd_table_val = caldata->pa_table[chain];
+ u32 small_signal_gain = caldata->small_signal_gain[chain];
u32 training_power;
u32 reg = 0;
int i;
@@ -654,17 +655,17 @@ 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_channel *chan,
- int chain)
+int ar9003_paprd_create_curve(struct ath_hw *ah,
+ struct ath9k_hw_cal_data *caldata, int chain)
{
- u16 *small_signal_gain = &chan->small_signal_gain[chain];
- u32 *pa_table = chan->pa_table[chain];
+ u16 *small_signal_gain = &caldata->small_signal_gain[chain];
+ u32 *pa_table = caldata->pa_table[chain];
u32 *data_L, *data_U;
int i, status = 0;
u32 *buf;
u32 reg;
- memset(chan->pa_table[chain], 0, sizeof(chan->pa_table[chain]));
+ memset(caldata->pa_table[chain], 0, sizeof(caldata->pa_table[chain]));
buf = kmalloc(2 * 48 * sizeof(u32), GFP_ATOMIC);
if (!buf)
diff --git a/drivers/net/wireless/ath/ath9k/ath9k.h b/drivers/net/wireless/ath/ath9k/ath9k.h
index 9e967b1..20f9002 100644
--- a/drivers/net/wireless/ath/ath9k/ath9k.h
+++ b/drivers/net/wireless/ath/ath9k/ath9k.h
@@ -608,6 +608,7 @@ struct ath_softc {
struct ath_wiphy {
struct ath_softc *sc; /* shared for all virtual wiphys */
struct ieee80211_hw *hw;
+ struct ath9k_hw_cal_data caldata;
enum ath_wiphy_state {
ATH_WIPHY_INACTIVE,
ATH_WIPHY_ACTIVE,
diff --git a/drivers/net/wireless/ath/ath9k/calib.c b/drivers/net/wireless/ath/ath9k/calib.c
index 139289e..52460bc 100644
--- a/drivers/net/wireless/ath/ath9k/calib.c
+++ b/drivers/net/wireless/ath/ath9k/calib.c
@@ -22,23 +22,6 @@
/* We can tune this as we go by monitoring really low values */
#define ATH9K_NF_TOO_LOW -60
-/* AR5416 may return very high value (like -31 dBm), in those cases the nf
- * is incorrect and we should use the static NF value. Later we can try to
- * find out why they are reporting these values */
-
-static bool ath9k_hw_nf_in_range(struct ath_hw *ah, s16 nf)
-{
- if (nf > ATH9K_NF_TOO_LOW) {
- ath_print(ath9k_hw_common(ah), ATH_DBG_CALIBRATE,
- "noise floor value detected (%d) is "
- "lower than what we think is a "
- "reasonable value (%d)\n",
- nf, ATH9K_NF_TOO_LOW);
- return false;
- }
- return true;
-}
-
static int16_t ath9k_hw_get_nf_hist_mid(int16_t *nfCalBuffer)
{
int16_t nfval;
@@ -121,6 +104,19 @@ void ath9k_hw_reset_calibration(struct ath_hw *ah,
ah->cal_samples = 0;
}
+static s16 ath9k_hw_get_default_nf(struct ath_hw *ah,
+ struct ath9k_channel *chan)
+{
+ struct ath_nf_limits *limit;
+
+ if (!chan || IS_CHAN_2GHZ(chan))
+ limit = &ah->nf_2g;
+ else
+ limit = &ah->nf_5g;
+
+ return limit->nominal;
+}
+
/* This is done for the currently configured channel */
bool ath9k_hw_reset_calvalid(struct ath_hw *ah)
{
@@ -128,7 +124,7 @@ bool ath9k_hw_reset_calvalid(struct ath_hw *ah)
struct ieee80211_conf *conf = &common->hw->conf;
struct ath9k_cal_list *currCal = ah->cal_list_curr;
- if (!ah->curchan)
+ if (!ah->caldata)
return true;
if (!AR_SREV_9100(ah) && !AR_SREV_9160_10_OR_LATER(ah))
@@ -151,7 +147,7 @@ bool ath9k_hw_reset_calvalid(struct ath_hw *ah)
"Resetting Cal %d state for channel %u\n",
currCal->calData->calType, conf->channel->center_freq);
- ah->curchan->CalValid &= ~currCal->calData->calType;
+ ah->caldata->CalValid &= ~currCal->calData->calType;
currCal->calState = CAL_WAITING;
return false;
@@ -169,19 +165,28 @@ void ath9k_hw_start_nfcal(struct ath_hw *ah)
void ath9k_hw_loadnf(struct ath_hw *ah, struct ath9k_channel *chan)
{
- struct ath9k_nfcal_hist *h;
+ struct ath9k_nfcal_hist *h = NULL;
unsigned i, j;
int32_t val;
u8 chainmask = (ah->rxchainmask << 3) | ah->rxchainmask;
struct ath_common *common = ath9k_hw_common(ah);
+ s16 default_nf = ath9k_hw_get_default_nf(ah, chan);
- h = ah->nfCalHist;
+ if (ah->caldata)
+ h = ah->caldata->nfCalHist;
for (i = 0; i < NUM_NF_READINGS; i++) {
if (chainmask & (1 << i)) {
+ s16 nfval;
+
+ if (h)
+ nfval = h[i].privNF;
+ else
+ nfval = default_nf;
+
val = REG_READ(ah, ah->nf_regs[i]);
val &= 0xFFFFFE00;
- val |= (((u32) (h[i].privNF) << 1) & 0x1ff);
+ val |= (((u32) nfval << 1) & 0x1ff);
REG_WRITE(ah, ah->nf_regs[i], val);
}
}
@@ -285,14 +290,18 @@ int16_t ath9k_hw_getnf(struct ath_hw *ah,
int16_t nfarray[NUM_NF_READINGS] = { 0 };
struct ath9k_nfcal_hist *h;
struct ieee80211_channel *c = chan->chan;
+ struct ath9k_hw_cal_data *caldata = ah->caldata;
+
+ if (!caldata)
+ return ath9k_hw_get_default_nf(ah, chan);
chan->channelFlags &= (~CHANNEL_CW_INT);
if (REG_READ(ah, AR_PHY_AGC_CONTROL) & AR_PHY_AGC_CONTROL_NF) {
ath_print(common, ATH_DBG_CALIBRATE,
"NF did not complete in calibration window\n");
nf = 0;
- chan->rawNoiseFloor = nf;
- return chan->rawNoiseFloor;
+ caldata->rawNoiseFloor = nf;
+ return caldata->rawNoiseFloor;
} else {
ath9k_hw_do_getnf(ah, nfarray);
ath9k_hw_nf_sanitize(ah, nfarray);
@@ -307,47 +316,41 @@ int16_t ath9k_hw_getnf(struct ath_hw *ah,
}
}
- h = ah->nfCalHist;
+ h = caldata->nfCalHist;
ath9k_hw_update_nfcal_hist_buffer(h, nfarray);
- chan->rawNoiseFloor = h[0].privNF;
+ caldata->rawNoiseFloor = h[0].privNF;
- return chan->rawNoiseFloor;
+ return ah->caldata->rawNoiseFloor;
}
-void ath9k_init_nfcal_hist_buffer(struct ath_hw *ah)
+void ath9k_init_nfcal_hist_buffer(struct ath_hw *ah,
+ struct ath9k_channel *chan)
{
- struct ath_nf_limits *limit;
+ struct ath9k_nfcal_hist *h;
+ s16 default_nf;
int i, j;
- if (!ah->curchan || IS_CHAN_2GHZ(ah->curchan))
- limit = &ah->nf_2g;
- else
- limit = &ah->nf_5g;
+ if (!ah->caldata)
+ return;
+ h = ah->caldata->nfCalHist;
+ default_nf = ath9k_hw_get_default_nf(ah, chan);
for (i = 0; i < NUM_NF_READINGS; i++) {
- ah->nfCalHist[i].currIndex = 0;
- ah->nfCalHist[i].privNF = limit->nominal;
- ah->nfCalHist[i].invalidNFcount =
- AR_PHY_CCA_FILTERWINDOW_LENGTH;
+ h[i].currIndex = 0;
+ h[i].privNF = default_nf;
+ h[i].invalidNFcount = AR_PHY_CCA_FILTERWINDOW_LENGTH;
for (j = 0; j < ATH9K_NF_CAL_HIST_MAX; j++) {
- ah->nfCalHist[i].nfCalBuffer[j] = limit->nominal;
+ h[i].nfCalBuffer[j] = default_nf;
}
}
}
s16 ath9k_hw_getchan_noise(struct ath_hw *ah, struct ath9k_channel *chan)
{
- s16 nf;
-
- if (chan->rawNoiseFloor == 0)
- nf = -96;
- else
- nf = chan->rawNoiseFloor;
-
- if (!ath9k_hw_nf_in_range(ah, nf))
- nf = ATH_DEFAULT_NOISE_FLOOR;
+ if (!ah->caldata || !ah->caldata->rawNoiseFloor)
+ return ath9k_hw_get_default_nf(ah, chan);
- return nf;
+ return ah->caldata->rawNoiseFloor;
}
EXPORT_SYMBOL(ath9k_hw_getchan_noise);
diff --git a/drivers/net/wireless/ath/ath9k/calib.h b/drivers/net/wireless/ath/ath9k/calib.h
index cd60d09..09a0ed2 100644
--- a/drivers/net/wireless/ath/ath9k/calib.h
+++ b/drivers/net/wireless/ath/ath9k/calib.h
@@ -112,7 +112,8 @@ void ath9k_hw_start_nfcal(struct ath_hw *ah);
void ath9k_hw_loadnf(struct ath_hw *ah, struct ath9k_channel *chan);
int16_t ath9k_hw_getnf(struct ath_hw *ah,
struct ath9k_channel *chan);
-void ath9k_init_nfcal_hist_buffer(struct ath_hw *ah);
+void ath9k_init_nfcal_hist_buffer(struct ath_hw *ah,
+ struct ath9k_channel *chan);
s16 ath9k_hw_getchan_noise(struct ath_hw *ah, struct ath9k_channel *chan);
void ath9k_hw_reset_calibration(struct ath_hw *ah,
struct ath9k_cal_list *currCal);
diff --git a/drivers/net/wireless/ath/ath9k/htc.h b/drivers/net/wireless/ath/ath9k/htc.h
index 3756400..43b9e21 100644
--- a/drivers/net/wireless/ath/ath9k/htc.h
+++ b/drivers/net/wireless/ath/ath9k/htc.h
@@ -353,6 +353,8 @@ struct ath9k_htc_priv {
u16 seq_no;
u32 bmiss_cnt;
+ struct ath9k_hw_cal_data caldata[38];
+
spinlock_t beacon_lock;
bool tx_queues_stop;
diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_main.c b/drivers/net/wireless/ath/ath9k/htc_drv_main.c
index cf9bcc6..ebed9d1 100644
--- a/drivers/net/wireless/ath/ath9k/htc_drv_main.c
+++ b/drivers/net/wireless/ath/ath9k/htc_drv_main.c
@@ -125,6 +125,7 @@ static int ath9k_htc_set_channel(struct ath9k_htc_priv *priv,
struct ieee80211_conf *conf = &common->hw->conf;
bool fastcc = true;
struct ieee80211_channel *channel = hw->conf.channel;
+ struct ath9k_hw_cal_data *caldata;
enum htc_phymode mode;
__be16 htc_mode;
u8 cmd_rsp;
@@ -149,7 +150,8 @@ static int ath9k_htc_set_channel(struct ath9k_htc_priv *priv,
priv->ah->curchan->channel,
channel->center_freq, conf_is_ht(conf), conf_is_ht40(conf));
- ret = ath9k_hw_reset(ah, hchan, fastcc);
+ caldata = &priv->caldata[channel->hw_value];
+ ret = ath9k_hw_reset(ah, hchan, caldata, fastcc);
if (ret) {
ath_print(common, ATH_DBG_FATAL,
"Unable to reset channel (%u Mhz) "
@@ -1028,7 +1030,7 @@ static void ath9k_htc_radio_enable(struct ieee80211_hw *hw)
ah->curchan = ath9k_cmn_get_curchannel(hw, ah);
/* Reset the HW */
- ret = ath9k_hw_reset(ah, ah->curchan, false);
+ ret = ath9k_hw_reset(ah, ah->curchan, ah->caldata, false);
if (ret) {
ath_print(common, ATH_DBG_FATAL,
"Unable to reset hardware; reset status %d "
@@ -1091,7 +1093,7 @@ static void ath9k_htc_radio_disable(struct ieee80211_hw *hw)
ah->curchan = ath9k_cmn_get_curchannel(hw, ah);
/* Reset the HW */
- ret = ath9k_hw_reset(ah, ah->curchan, false);
+ ret = ath9k_hw_reset(ah, ah->curchan, ah->caldata, false);
if (ret) {
ath_print(common, ATH_DBG_FATAL,
"Unable to reset hardware; reset status %d "
@@ -1179,7 +1181,7 @@ static int ath9k_htc_start(struct ieee80211_hw *hw)
ath9k_hw_configpcipowersave(ah, 0, 0);
ath9k_hw_htc_resetinit(ah);
- ret = ath9k_hw_reset(ah, init_channel, false);
+ ret = ath9k_hw_reset(ah, init_channel, ah->caldata, false);
if (ret) {
ath_print(common, ATH_DBG_FATAL,
"Unable to reset hardware; reset status %d "
diff --git a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c
index 2f83f97..ac8e0bb 100644
--- a/drivers/net/wireless/ath/ath9k/hw.c
+++ b/drivers/net/wireless/ath/ath9k/hw.c
@@ -609,7 +609,6 @@ static int __ath9k_hw_init(struct ath_hw *ah)
else
ah->tx_trig_level = (AR_FTRIG_512B >> AR_FTRIG_S);
- ath9k_init_nfcal_hist_buffer(ah);
ah->bb_watchdog_timeout_ms = 25;
common->state = ATH_HW_INITIALIZED;
@@ -1182,9 +1181,6 @@ static bool ath9k_hw_channel_change(struct ath_hw *ah,
ath9k_hw_spur_mitigate_freq(ah, chan);
- if (!chan->oneTimeCalsDone)
- chan->oneTimeCalsDone = true;
-
return true;
}
@@ -1217,7 +1213,7 @@ bool ath9k_hw_check_alive(struct ath_hw *ah)
EXPORT_SYMBOL(ath9k_hw_check_alive);
int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,
- bool bChannelChange)
+ struct ath9k_hw_cal_data *caldata, bool bChannelChange)
{
struct ath_common *common = ath9k_hw_common(ah);
u32 saveLedState;
@@ -1242,9 +1238,19 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,
if (!ath9k_hw_setpower(ah, ATH9K_PM_AWAKE))
return -EIO;
- if (curchan && !ah->chip_fullsleep)
+ if (curchan && !ah->chip_fullsleep && ah->caldata)
ath9k_hw_getnf(ah, curchan);
+ ah->caldata = caldata;
+ if (caldata &&
+ (chan->channel != caldata->channel ||
+ (chan->channelFlags & ~CHANNEL_CW_INT) !=
+ (caldata->channelFlags & ~CHANNEL_CW_INT))) {
+ /* Operating channel changed, reset channel calibration data */
+ memset(caldata, 0, sizeof(*caldata));
+ ath9k_init_nfcal_hist_buffer(ah, chan);
+ }
+
if (bChannelChange &&
(ah->chip_fullsleep != true) &&
(ah->curchan != NULL) &&
diff --git a/drivers/net/wireless/ath/ath9k/hw.h b/drivers/net/wireless/ath/ath9k/hw.h
index 2d30efc..c1b7011 100644
--- a/drivers/net/wireless/ath/ath9k/hw.h
+++ b/drivers/net/wireless/ath/ath9k/hw.h
@@ -346,19 +346,24 @@ enum ath9k_int {
CHANNEL_HT40PLUS | \
CHANNEL_HT40MINUS)
-struct ath9k_channel {
- struct ieee80211_channel *chan;
+struct ath9k_hw_cal_data {
u16 channel;
u32 channelFlags;
- u32 chanmode;
int32_t CalValid;
- bool oneTimeCalsDone;
int8_t iCoff;
int8_t qCoff;
int16_t rawNoiseFloor;
bool paprd_done;
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;
+ u16 channel;
+ u32 channelFlags;
+ u32 chanmode;
};
#define IS_CHAN_G(_c) ((((_c)->channelFlags & (CHANNEL_G)) == CHANNEL_G) || \
@@ -669,7 +674,7 @@ struct ath_hw {
enum nl80211_iftype opmode;
enum ath9k_power_mode power_mode;
- struct ath9k_nfcal_hist nfCalHist[NUM_NF_READINGS];
+ struct ath9k_hw_cal_data *caldata;
struct ath9k_pacal_info pacal_info;
struct ar5416Stats stats;
struct ath9k_tx_queue_info txq[ATH9K_NUM_TX_QUEUES];
@@ -863,7 +868,7 @@ const char *ath9k_hw_probe(u16 vendorid, u16 devid);
void ath9k_hw_deinit(struct ath_hw *ah);
int ath9k_hw_init(struct ath_hw *ah);
int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,
- bool bChannelChange);
+ struct ath9k_hw_cal_data *caldata, bool bChannelChange);
int ath9k_hw_fill_cap_info(struct ath_hw *ah);
u32 ath9k_regd_get_ctl(struct ath_regulatory *reg, struct ath9k_channel *chan);
@@ -958,9 +963,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_channel *chan, int chain);
-int ar9003_paprd_create_curve(struct ath_hw *ah, struct ath9k_channel *chan,
- int chain);
+ struct ath9k_hw_cal_data *caldata,
+ int chain);
+int ar9003_paprd_create_curve(struct ath_hw *ah,
+ struct ath9k_hw_cal_data *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 c82d8c4..0b3f59a 100644
--- a/drivers/net/wireless/ath/ath9k/main.c
+++ b/drivers/net/wireless/ath/ath9k/main.c
@@ -183,11 +183,13 @@ static void ath_start_ani(struct ath_common *common)
int ath_set_channel(struct ath_softc *sc, struct ieee80211_hw *hw,
struct ath9k_channel *hchan)
{
+ struct ath_wiphy *aphy = hw->priv;
struct ath_hw *ah = sc->sc_ah;
struct ath_common *common = ath9k_hw_common(ah);
struct ieee80211_conf *conf = &common->hw->conf;
bool fastcc = true, stopped;
struct ieee80211_channel *channel = hw->conf.channel;
+ struct ath9k_hw_cal_data *caldata = NULL;
int r;
if (sc->sc_flags & SC_OP_INVALID)
@@ -220,6 +222,9 @@ int ath_set_channel(struct ath_softc *sc, struct ieee80211_hw *hw,
if (!stopped || !(sc->sc_flags & SC_OP_OFFCHANNEL))
fastcc = false;
+ if (!(sc->sc_flags & SC_OP_OFFCHANNEL))
+ caldata = &aphy->caldata;
+
ath_print(common, ATH_DBG_CONFIG,
"(%u MHz) -> (%u MHz), conf_is_ht40: %d\n",
sc->sc_ah->curchan->channel,
@@ -227,7 +232,7 @@ int ath_set_channel(struct ath_softc *sc, struct ieee80211_hw *hw,
spin_lock_bh(&sc->sc_resetlock);
- r = ath9k_hw_reset(ah, hchan, fastcc);
+ r = ath9k_hw_reset(ah, hchan, caldata, fastcc);
if (r) {
ath_print(common, ATH_DBG_FATAL,
"Unable to reset channel (%u MHz), "
@@ -263,9 +268,10 @@ 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;
int chain;
- if (!ah->curchan->paprd_done)
+ if (!caldata || !caldata->paprd_done)
return;
ath9k_ps_wakeup(sc);
@@ -273,7 +279,7 @@ static void ath_paprd_activate(struct ath_softc *sc)
if (!(ah->caps.tx_chainmask & BIT(chain)))
continue;
- ar9003_paprd_populate_single_table(ah, ah->curchan, chain);
+ ar9003_paprd_populate_single_table(ah, caldata, chain);
}
ar9003_paprd_enable(ah, true);
@@ -291,6 +297,7 @@ 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;
int qnum, ftype;
int chain_ok = 0;
int chain;
@@ -298,6 +305,9 @@ 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;
@@ -352,7 +362,7 @@ void ath_paprd_calibrate(struct work_struct *work)
if (!ar9003_paprd_is_done(ah))
break;
- if (ar9003_paprd_create_curve(ah, ah->curchan, chain) != 0)
+ if (ar9003_paprd_create_curve(ah, caldata, chain) != 0)
break;
chain_ok = 1;
@@ -360,7 +370,7 @@ void ath_paprd_calibrate(struct work_struct *work)
kfree_skb(skb);
if (chain_ok) {
- ah->curchan->paprd_done = true;
+ caldata->paprd_done = true;
ath_paprd_activate(sc);
}
@@ -469,8 +479,8 @@ 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) {
- if (!sc->sc_ah->curchan->paprd_done)
+ if ((sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_PAPRD) && ah->caldata) {
+ if (!ah->caldata->paprd_done)
ieee80211_queue_work(sc->hw, &sc->paprd_work);
else
ath_paprd_activate(sc);
@@ -828,7 +838,7 @@ void ath_radio_enable(struct ath_softc *sc, struct ieee80211_hw *hw)
ah->curchan = ath_get_curchannel(sc, sc->hw);
spin_lock_bh(&sc->sc_resetlock);
- r = ath9k_hw_reset(ah, ah->curchan, false);
+ r = ath9k_hw_reset(ah, ah->curchan, ah->caldata, false);
if (r) {
ath_print(common, ATH_DBG_FATAL,
"Unable to reset channel (%u MHz), "
@@ -888,7 +898,7 @@ void ath_radio_disable(struct ath_softc *sc, struct ieee80211_hw *hw)
ah->curchan = ath_get_curchannel(sc, hw);
spin_lock_bh(&sc->sc_resetlock);
- r = ath9k_hw_reset(ah, ah->curchan, false);
+ r = ath9k_hw_reset(ah, ah->curchan, ah->caldata, false);
if (r) {
ath_print(ath9k_hw_common(sc->sc_ah), ATH_DBG_FATAL,
"Unable to reset channel (%u MHz), "
@@ -921,7 +931,7 @@ int ath_reset(struct ath_softc *sc, bool retry_tx)
ath_flushrecv(sc);
spin_lock_bh(&sc->sc_resetlock);
- r = ath9k_hw_reset(ah, sc->sc_ah->curchan, false);
+ r = ath9k_hw_reset(ah, sc->sc_ah->curchan, ah->caldata, false);
if (r)
ath_print(common, ATH_DBG_FATAL,
"Unable to reset hardware; reset status %d\n", r);
@@ -1096,7 +1106,7 @@ static int ath9k_start(struct ieee80211_hw *hw)
* and then setup of the interrupt mask.
*/
spin_lock_bh(&sc->sc_resetlock);
- r = ath9k_hw_reset(ah, init_channel, false);
+ r = ath9k_hw_reset(ah, init_channel, ah->caldata, false);
if (r) {
ath_print(common, ATH_DBG_FATAL,
"Unable to reset hardware; reset status %d "
diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c
index 501b728..700ba8d 100644
--- a/drivers/net/wireless/ath/ath9k/xmit.c
+++ b/drivers/net/wireless/ath/ath9k/xmit.c
@@ -1181,7 +1181,7 @@ void ath_drain_all_txq(struct ath_softc *sc, bool retry_tx)
"Failed to stop TX DMA. Resetting hardware!\n");
spin_lock_bh(&sc->sc_resetlock);
- r = ath9k_hw_reset(ah, sc->sc_ah->curchan, false);
+ r = ath9k_hw_reset(ah, sc->sc_ah->curchan, ah->caldata, false);
if (r)
ath_print(common, ATH_DBG_FATAL,
"Unable to reset hardware; reset status %d\n",
--
1.6.4.2
^ permalink raw reply related
* Re: [PATCH v4 1/3] cfg80211: Add nl80211 antenna configuration
From: Felix Fietkau @ 2010-07-28 17:50 UTC (permalink / raw)
To: Luis R. Rodriguez; +Cc: Bruno Randolf, johannes, linville, linux-wireless
In-Reply-To: <AANLkTimBu2=9XhzKwUi1ZpRmGWA+C4GCDgXqp-YJVLxt@mail.gmail.com>
On 2010-07-28 7:24 PM, Luis R. Rodriguez wrote:
> On Tue, Jul 27, 2010 at 7:06 PM, Bruno Randolf <br1@einfach.org> wrote:
>> On Wed July 28 2010 01:47:34 Luis R. Rodriguez wrote:
>>> On Tue, Jul 27, 2010 at 9:39 AM, Felix Fietkau <nbd@openwrt.org> wrote:
>>> > On 2010-07-27 6:19 PM, Luis R. Rodriguez wrote:
>>> >>> + * @NL80211_ATTR_WIPHY_ANTENNA_TX: Bitmap of allowed antennas for
>>> >>> transmitting. + * Each bit represents one antenna, starting with
>>> >>> antenna 1 at the first + * bit. If the bitmap is zero (0), the TX
>>> >>> antenna follows RX diversity.
>>> >>
>>> >> What about for 802.11n? What if you want to disable TX?
>>> >
>>> > Disabling tx shouldn't be handled by the antenna setting, IMHO.
>>> >
>>> >>> + * If multiple antennas are selected all selected antennas have to
>>> >>> be used + * for transmitting (801.11n multiple TX chains).
>>> >>
>>> >> I rather call this TX / RX chainmask then.
>>> >
>>> > Well, for legacy hardware, these aren't really chains, as there is only
>>> > one rx and one tx path, just with switching onto multiple antennas.
>>> >
>>> >>> + * Drivers may reject configurations they cannot support.
>>> >>> + *
>>> >>> + * @NL80211_ATTR_WIPHY_ANTENNA_RX: Bitmap of allowed antennas for
>>> >>> receiving. + * Each bit represents one antenna, starting with
>>> >>> antenna 1 at the first + * bit. If multiple antennas are selected
>>> >>> in the bitmap, 802.11n devices + * should use multiple RX chains
>>> >>> on these antennas, while non-802.11n + * drivers should use
>>> >>> antenna diversity between these antennas.
>>> >>
>>> >> What about TX beamforming, and STBC?
>>> >
>>> > Disabling one antenna/chain on a two-chain device would naturally
>>> > disable TxBF and STBC as well, since it limits the number of available
>>> > chains. The driver should simply act as if the disabled chains didn't
>>> > exist.
>>>
>>> That would work.
>>>
>>> >> Unless 802.11n is completely dealt with I really prefer this patch to
>>> >> only address legacy. Otherwise I see sloppyness and inconsistencies on
>>> >> supporting this feature throughout different drivers. I'd like to
>>> >> avoid that at all costs on nl80211. What you are trying to address is
>>> >> legacy antenna setup, not 802.11n RX/TX chainmask dynamic settings so
>>> >> I'd really try to avoid it unless you really want to address all
>>> >> aspects of chain configuration for 802.11n and even then what I'm
>>> >> leading on to say is I think you'll see if you try to address both it
>>> >> just gets messy.
>>> >
>>> > I think 802.11n is already completely dealt with if you treat this as
>>> > the chainmask on 11n devices.
>>>
>>> Its fine by me if the above cases are also embedded into the
>>> documentation, just don't want these questions lingering. I can't
>>> think of other 802.11n special cases.
>>
>> thanks felix :)
>>
>> luis, could you tell me what exactly you would want to include in the
>> documentation?
>
> Sure, but after some though I'm sticking to my preference for an API
> for this, legacy and 802.11n chainmask / antenna selection should be
> dealt with separately.
As I pointed out in an earlier discussion, they *cannot* really be
treated separately if you're running in AP mode, dealing with both
legacy and 11n clients.
> Reason is I just reviewed the IEEE 802.11 sections 19.19 for TX
> beamforming but also happened to stumble upon section 19.20 Antenna
> selection. This Antenna Selection section indicates you can support
> more antennas than chains and you can use and that the antenna you use
> for your chains can vary over time. You select which antenna to use
> based on training/sounding tests on each antenna. Antenna selection as
> per 19.19 supports up to 8 antennas and up to 4 RF chains. Section
> 19.20.2 deals with how a STA can initiate antenna selection training
> with another STA. Now granted we don't have code for this and I don't
> think this is all done explicitly in hardware so one can argue we can
> deal with this when/if we do add support for this but this just
> highlights how different "antenna selection" or knobs to tune antennas
> is even from a standard perspective than legacy. For STBC and TX
> beamforming requirements I would like to see mac80211 actually have
> code which disables STBC and later TX beamforming (once we have code
> for it) if we enable only one chain, I don't see why drivers should
> deal with this.
This is easy to handle, it can work like this:
We treat the setting not as a raw chainmask, but actually as an antenna
mask. The chainmask gets calculated from that. If we disable all
antennas belonging to a particular chain, we disable the entire chain.
For AR9285 we will already deviate from treating this as a chainmask,
because it has one chain with rx diversity. Please accept this API, I'm
sure the API can be used to handle everything related to 802.11n
antenna/chain selection properly. :)
- Felix
^ permalink raw reply
* Re: [BUG] after starting wimaxd at boot iwlagn module will crash for intel 6250 card
From: Alexey Shvetsov @ 2010-07-28 17:53 UTC (permalink / raw)
To: Inaky Perez-Gonzalez, wimax, linux-wireless
In-Reply-To: <1280270313.26204.288.camel@localhost.localdomain>
[-- Attachment #1: Type: Text/Plain, Size: 50951 bytes --]
Updated relevant part of logs for this bug
Jul 27 15:19:16 x201 wimaxd:
daemon starts
Jul 27 15:19:16 x201 wimaxd: pdifile is created
Jul 27
15:19:16 x201 wimaxd: wimaxd event: AppSrv is ready
Jul 27 15:19:27 x201
kernel: iwlagn 0000:02:00.0: Microcode SW error detected. Restarting
0x2000000.
Jul 27 15:19:27 x201 kernel: iwlagn 0000:02:00.0: Loaded firmware
version: 9.201.4.1 build 24255
Jul 27 15:19:27 x201 kernel: iwlagn
0000:02:00.0: Start IWL Error Log Dump:
Jul 27 15:19:27 x201 kernel: iwlagn
0000:02:00.0: Status: 0x000312E4, count: 5
Jul 27 15:19:27 x201 kernel:
iwlagn 0000:02:00.0: Desc Time data1
data2 line
Jul 27 15:19:27 x201 kernel: iwlagn 0000:02:00.0: SYSASSERT
(#05) 0000003432 0x000000BE 0x8000000D 453
Jul 27
15:19:27 x201 kernel: iwlagn 0000:02:00.0: pc blink1 blink2 ilink1
ilink2 hcmd
Jul 27 15:19:27 x201 kernel: iwlagn 0000:02:00.0: 0x1C548
0x1E674 0x1E674 0x009D6 0x00000 0x4360095
Jul 27 15:19:27 x201 kernel:
iwlagn 0000:02:00.0: CSR values:
Jul 27 15:19:27 x201 kernel: iwlagn
0000:02:00.0: (2nd byte of CSR_INT_COALESCING is CSR_INT_PERIODIC_REG)
Jul
27 15:19:27 x201 kernel: iwlagn 0000:02:00.0: CSR_HW_IF_CONFIG_REG:
0X00480303
Jul 27 15:19:27 x201 kernel: iwlagn 0000:02:00.0:
CSR_INT_COALESCING: 0X00000040
Jul 27 15:19:27 x201 kernel: iwlagn
0000:02:00.0: CSR_INT: 0X00000000
Jul 27 15:19:27 x201
kernel: iwlagn 0000:02:00.0: CSR_INT_MASK: 0X00000000
Jul 27
15:19:27 x201 kernel: iwlagn 0000:02:00.0: CSR_FH_INT_STATUS:
0X00000000
Jul 27 15:19:27 x201 kernel: iwlagn 0000:02:00.0:
CSR_GPIO_IN: 0X0000000f
Jul 27 15:19:27 x201 kernel: iwlagn 0000:02:00.0:
CSR_RESET: 0X00000000
Jul 27 15:19:27 x201 kernel: iwlagn
0000:02:00.0: CSR_GP_CNTRL: 0X080403c5
Jul 27 15:19:27 x201
kernel: iwlagn 0000:02:00.0: CSR_HW_REV: 0X00000084
Jul 27
15:19:27 x201 kernel: iwlagn 0000:02:00.0: CSR_EEPROM_REG:
0Xa0820ffd
Jul 27 15:19:27 x201 kernel: iwlagn 0000:02:00.0:
CSR_EEPROM_GP: 0X90000801
Jul 27 15:19:27 x201 kernel: iwlagn 0000:02:00.0:
CSR_OTP_GP_REG: 0X00030001
Jul 27 15:19:27 x201 kernel: iwlagn
0000:02:00.0: CSR_GIO_REG: 0X00080042
Jul 27 15:19:27 x201
kernel: iwlagn 0000:02:00.0: CSR_GP_UCODE_REG: 0X0000056a
Jul 27
15:19:27 x201 kernel: iwlagn 0000:02:00.0: CSR_GP_DRIVER_REG:
0X00000004
Jul 27 15:19:27 x201 kernel: iwlagn 0000:02:00.0:
CSR_UCODE_DRV_GP1: 0X00000001
Jul 27 15:19:27 x201 kernel: iwlagn
0000:02:00.0: CSR_UCODE_DRV_GP2: 0X00000000
Jul 27 15:19:27 x201
kernel: iwlagn 0000:02:00.0: CSR_LED_REG: 0X00000058
Jul 27
15:19:27 x201 kernel: iwlagn 0000:02:00.0: CSR_DRAM_INT_TBL_REG:
0X880ffffe
Jul 27 15:19:27 x201 kernel: iwlagn 0000:02:00.0:
CSR_GIO_CHICKEN_BITS: 0X27800200
Jul 27 15:19:27 x201 kernel: iwlagn
0000:02:00.0: CSR_ANA_PLL_CFG: 0X00000000
Jul 27 15:19:27 x201
kernel: iwlagn 0000:02:00.0: CSR_HW_REV_WA_REG: 0X0001001a
Jul 27
15:19:27 x201 kernel: iwlagn 0000:02:00.0: CSR_DBG_HPET_MEM_REG:
0Xffff0000
Jul 27 15:19:27 x201 kernel: iwlagn 0000:02:00.0: FH register
values:
Jul 27 15:19:27 x201 kernel: iwlagn 0000:02:00.0:
FH_RSCSR_CHNL0_STTS_WPTR_REG: 0X0ffede00
Jul 27 15:19:27 x201 kernel: iwlagn
0000:02:00.0: FH_RSCSR_CHNL0_RBDCB_BASE_REG: 0X00ffedf0
Jul 27
15:19:27 x201 kernel: iwlagn 0000:02:00.0:
FH_RSCSR_CHNL0_WPTR: 0X00000090
Jul 27 15:19:27 x201 kernel: iwlagn
0000:02:00.0: FH_MEM_RCSR_CHNL0_CONFIG_REG: 0X80819104
Jul 27
15:19:27 x201 kernel: iwlagn 0000:02:00.0:
FH_MEM_RSSR_SHARED_CTRL_REG: 0X000000fc
Jul 27 15:19:27 x201 kernel: iwlagn
0000:02:00.0: FH_MEM_RSSR_RX_STATUS_REG: 0X07030000
Jul 27
15:19:27 x201 kernel: iwlagn 0000:02:00.0:
FH_MEM_RSSR_RX_ENABLE_ERR_IRQ2DRV: 0X00000000
Jul 27 15:19:27 x201 kernel:
iwlagn 0000:02:00.0: FH_TSSR_TX_STATUS_REG: 0X07ff0001
Jul 27
15:19:27 x201 kernel: iwlagn 0000:02:00.0:
FH_TSSR_TX_ERROR_REG: 0X00000000
Jul 27 15:19:27 x201 kernel: iwlagn
0000:02:00.0: Start IWL Event Log Dump: display last 20 entries
Jul 27
15:19:27 x201 kernel: iwlagn 0000:02:00.0:
EVT_LOGT:0001676513:0x00000196:0601
Jul 27 15:19:27 x201 kernel: iwlagn
0000:02:00.0: EVT_LOGT:0001676513:0xffffffff:0600
Jul 27 15:19:27 x201
kernel: iwlagn 0000:02:00.0: EVT_LOGT:0001676514:0x00000004:0600
Jul 27
15:19:27 x201 kernel: iwlagn 0000:02:00.0:
EVT_LOGT:0001676514:0x0000019a:0606
Jul 27 15:19:27 x201 kernel: iwlagn
0000:02:00.0: EVT_LOGT:0001676515:0x000001f1:0615
Jul 27 15:19:27 x201
kernel: iwlagn 0000:02:00.0: EVT_LOGT:0001676567:0x000182f7:0615
Jul 27
15:19:27 x201 kernel: iwlagn 0000:02:00.0:
EVT_LOGT:0001676568:0x00288000:0615
Jul 27 15:19:27 x201 kernel: iwlagn
0000:02:00.0: EVT_LOGT:0001676568:0xffffffff:0615
Jul 27 15:19:27 x201
kernel: iwlagn 0000:02:00.0: EVT_LOGT:0001676569:0x00000054:0601
Jul 27
15:19:27 x201 kernel: iwlagn 0000:02:00.0:
EVT_LOGT:0001676570:0xffffffff:0615
Jul 27 15:19:27 x201 kernel: iwlagn
0000:02:00.0: EVT_LOGT:0001676576:0x0000006b:0601
Jul 27 15:19:27 x201
kernel: iwlagn 0000:02:00.0: EVT_LOGT:0001676591:0x000000e5:0628
Jul 27
15:19:27 x201 kernel: iwlagn 0000:02:00.0:
EVT_LOGT:0001676591:0x00000000:0628
Jul 27 15:19:27 x201 kernel: iwlagn
0000:02:00.0: EVT_LOGT:0001676591:0x02288000:0628
Jul 27 15:19:27 x201
kernel: iwlagn 0000:02:00.0: EVT_LOGT:0001676591:0x02000000:0628
Jul 27
15:19:27 x201 kernel: iwlagn 0000:02:00.0:
EVT_LOGT:0001676591:0x00000000:0628
Jul 27 15:19:27 x201 kernel: iwlagn
0000:02:00.0: EVT_LOGT:0001676591:0x00000800:0628
Jul 27 15:19:27 x201
kernel: iwlagn 0000:02:00.0: EVT_LOGT:0001676591:0x04000000:0628
Jul 27
15:19:27 x201 kernel: iwlagn 0000:02:00.0:
EVT_LOGT:0001676594:0x0000025d:0601
Jul 27 15:19:27 x201 kernel: iwlagn
0000:02:00.0: EVT_LOGT:0001676684:0x00000000:0125
Jul 27 15:19:27 x201
kernel: iwlagn 0000:02:00.0: Command POWER_TABLE_CMD failed: FW Error
Jul 27
15:19:27 x201 kernel: iwlagn 0000:02:00.0: set power fail, ret = -5
Jul 27
15:19:27 x201 kernel: iwlagn 0000:02:00.0: Microcode SW error detected.
Restarting 0x2000000.
Jul 27 15:19:27 x201 kernel: iwlagn 0000:02:00.0:
Loaded firmware version: 9.201.4.1 build 24255
Jul 27 15:19:27 x201 kernel:
iwlagn 0000:02:00.0: Start IWL Error Log Dump:
Jul 27 15:19:27 x201 kernel:
iwlagn 0000:02:00.0: Status: 0x00020224, count: 5
Jul 27 15:19:27 x201
kernel: iwlagn 0000:02:00.0: Desc Time
data1 data2 line
Jul 27 15:19:27 x201 kernel: iwlagn 0000:02:00.0:
SYSASSERT (#05) 0000013122 0x0000008D 0x8000000D 453
Jul
27 15:19:27 x201 kernel: iwlagn 0000:02:00.0: pc blink1 blink2 ilink1
ilink2 hcmd
Jul 27 15:19:27 x201 kernel: iwlagn 0000:02:00.0: 0x1EAB8
0x1EAA6 0x1EAA6 0x009D6 0x00000 0x400005A
Jul 27 15:19:27 x201 kernel:
iwlagn 0000:02:00.0: CSR values:
Jul 27 15:19:27 x201 kernel: iwlagn
0000:02:00.0: (2nd byte of CSR_INT_COALESCING is CSR_INT_PERIODIC_REG)
Jul
27 15:19:27 x201 kernel: iwlagn 0000:02:00.0: CSR_HW_IF_CONFIG_REG:
0X00480303
Jul 27 15:19:27 x201 kernel: iwlagn 0000:02:00.0:
CSR_INT_COALESCING: 0X0000ff40
Jul 27 15:19:27 x201 kernel: iwlagn
0000:02:00.0: CSR_INT: 0X00000000
Jul 27 15:19:27 x201
kernel: iwlagn 0000:02:00.0: CSR_INT_MASK: 0X00000000
Jul 27
15:19:27 x201 kernel: iwlagn 0000:02:00.0: CSR_FH_INT_STATUS:
0X00000000
Jul 27 15:19:27 x201 kernel: iwlagn 0000:02:00.0:
CSR_GPIO_IN: 0X0000000f
Jul 27 15:19:27 x201 kernel: iwlagn 0000:02:00.0:
CSR_RESET: 0X00000000
Jul 27 15:19:27 x201 kernel: iwlagn
0000:02:00.0: CSR_GP_CNTRL: 0X080403c5
Jul 27 15:19:27 x201
kernel: iwlagn 0000:02:00.0: CSR_HW_REV: 0X00000084
Jul 27
15:19:27 x201 kernel: iwlagn 0000:02:00.0: CSR_EEPROM_REG:
0Xa0820ffd
Jul 27 15:19:27 x201 kernel: iwlagn 0000:02:00.0:
CSR_EEPROM_GP: 0X90000801
Jul 27 15:19:27 x201 kernel: iwlagn 0000:02:00.0:
CSR_OTP_GP_REG: 0X00030001
Jul 27 15:19:27 x201 kernel: iwlagn
0000:02:00.0: CSR_GIO_REG: 0X00080046
Jul 27 15:19:27 x201
kernel: iwlagn 0000:02:00.0: CSR_GP_UCODE_REG: 0X00000002
Jul 27
15:19:27 x201 kernel: iwlagn 0000:02:00.0: CSR_GP_DRIVER_REG:
0X00000004
Jul 27 15:19:27 x201 kernel: iwlagn 0000:02:00.0:
CSR_UCODE_DRV_GP1: 0X00000000
Jul 27 15:19:27 x201 kernel: iwlagn
0000:02:00.0: CSR_UCODE_DRV_GP2: 0X00000000
Jul 27 15:19:27 x201
kernel: iwlagn 0000:02:00.0: CSR_LED_REG: 0X00000018
Jul 27
15:19:27 x201 kernel: iwlagn 0000:02:00.0: CSR_DRAM_INT_TBL_REG:
0X880ffffe
Jul 27 15:19:27 x201 kernel: iwlagn 0000:02:00.0:
CSR_GIO_CHICKEN_BITS: 0X27800200
Jul 27 15:19:27 x201 kernel: iwlagn
0000:02:00.0: CSR_ANA_PLL_CFG: 0X00000000
Jul 27 15:19:27 x201
kernel: iwlagn 0000:02:00.0: CSR_HW_REV_WA_REG: 0X0001001a
Jul 27
15:19:27 x201 kernel: iwlagn 0000:02:00.0: CSR_DBG_HPET_MEM_REG:
0Xffff0000
Jul 27 15:19:27 x201 kernel: iwlagn 0000:02:00.0: FH register
values:
Jul 27 15:19:27 x201 kernel: iwlagn 0000:02:00.0:
FH_RSCSR_CHNL0_STTS_WPTR_REG: 0X0ffede00
Jul 27 15:19:27 x201 kernel: iwlagn
0000:02:00.0: FH_RSCSR_CHNL0_RBDCB_BASE_REG: 0X00ffedf0
Jul 27
15:19:27 x201 kernel: iwlagn 0000:02:00.0:
FH_RSCSR_CHNL0_WPTR: 0X00000000
Jul 27 15:19:27 x201 kernel: iwlagn
0000:02:00.0: FH_MEM_RCSR_CHNL0_CONFIG_REG: 0X80819104
Jul 27
15:19:27 x201 kernel: iwlagn 0000:02:00.0:
FH_MEM_RSSR_SHARED_CTRL_REG: 0X000000fc
Jul 27 15:19:27 x201 kernel: iwlagn
0000:02:00.0: FH_MEM_RSSR_RX_STATUS_REG: 0X07030000
Jul 27
15:19:27 x201 kernel: iwlagn 0000:02:00.0:
FH_MEM_RSSR_RX_ENABLE_ERR_IRQ2DRV: 0X00000000
Jul 27 15:19:27 x201 kernel:
iwlagn 0000:02:00.0: FH_TSSR_TX_STATUS_REG: 0X07ff0001
Jul 27
15:19:27 x201 kernel: iwlagn 0000:02:00.0:
FH_TSSR_TX_ERROR_REG: 0X00000000
Jul 27 15:19:27 x201 kernel: iwlagn
0000:02:00.0: Start IWL Event Log Dump: display last 20 entries
Jul 27
15:19:27 x201 kernel: iwlagn 0000:02:00.0:
EVT_LOGT:0000005631:0x000000ff:1100
Jul 27 15:19:27 x201 kernel: iwlagn
0000:02:00.0: EVT_LOGT:0000005631:0x000000ff:1100
Jul 27 15:19:27 x201
kernel: iwlagn 0000:02:00.0: EVT_LOGT:0000005632:0x000000ff:1100
Jul 27
15:19:27 x201 kernel: iwlagn 0000:02:00.0:
EVT_LOGT:0000005633:0x000000ff:1100
Jul 27 15:19:27 x201 kernel: iwlagn
0000:02:00.0: EVT_LOGT:0000005633:0x000000ff:1100
Jul 27 15:19:27 x201
kernel: iwlagn 0000:02:00.0: EVT_LOGT:0000005634:0x000000ff:1100
Jul 27
15:19:27 x201 kernel: iwlagn 0000:02:00.0:
EVT_LOGT:0000005635:0x000000ff:1100
Jul 27 15:19:27 x201 kernel: iwlagn
0000:02:00.0: EVT_LOGT:0000005636:0x000000ff:1100
Jul 27 15:19:27 x201
kernel: iwlagn 0000:02:00.0: EVT_LOGT:0000005637:0x000000ff:1100
Jul 27
15:19:27 x201 kernel: iwlagn 0000:02:00.0:
EVT_LOGT:0000005638:0x000000ff:1100
Jul 27 15:19:27 x201 kernel: iwlagn
0000:02:00.0: EVT_LOGT:0000005639:0x000000ff:1100
Jul 27 15:19:27 x201
kernel: iwlagn 0000:02:00.0: EVT_LOGT:0000005640:0x000000ff:1100
Jul 27
15:19:27 x201 kernel: iwlagn 0000:02:00.0:
EVT_LOGT:0000005640:0x000000ff:1100
Jul 27 15:19:27 x201 kernel: iwlagn
0000:02:00.0: EVT_LOGT:0000005641:0x000000ff:1100
Jul 27 15:19:27 x201
kernel: iwlagn 0000:02:00.0: EVT_LOGT:0000005642:0x000000ff:1100
Jul 27
15:19:27 x201 kernel: iwlagn 0000:02:00.0:
EVT_LOGT:0000013014:0x0400005a:0401
Jul 27 15:19:27 x201 kernel: iwlagn
0000:02:00.0: EVT_LOGT:0000013015:0x0400005a:1513
Jul 27 15:19:27 x201
kernel: iwlagn 0000:02:00.0: EVT_LOGT:0000013016:0x00000000:1513
Jul 27
15:19:27 x201 kernel: iwlagn 0000:02:00.0:
EVT_LOGT:0000013017:0x00000001:1523
Jul 27 15:19:27 x201 kernel: iwlagn
0000:02:00.0: EVT_LOGT:0000013132:0x00000000:0125
Jul 27 15:19:27 x201
kernel: iwlagn 0000:02:00.0: Command REPLY_PHY_CALIBRATION_CMD failed: FW
Error
Jul 27 15:19:27 x201 kernel: iwlagn 0000:02:00.0: Error -5 iteration
0
Jul 27 15:19:27 x201 kernel: iwlagn 0000:02:00.0: Error sending
TX_ANT_CONFIGURATION_CMD: time out after 500ms.
Jul 27 15:19:28 x201 kernel:
iwlagn 0000:02:00.0: Error sending REPLY_BT_CONFIG: time out after
500ms.
Jul 27 15:19:28 x201 kernel: iwlagn 0000:02:00.0: failed to send BT
Coex Config
Jul 27 15:19:28 x201 kernel: iwlagn 0000:02:00.0: Error sending
REPLY_RXON: time out after 500ms.
Jul 27 15:19:28 x201 kernel: iwlagn
0000:02:00.0: Error setting new RXON (-110)
Jul 27 15:19:29 x201 kernel:
iwlagn 0000:02:00.0: Error sending REPLY_CT_KILL_CONFIG_CMD: time out after
500ms.
Jul 27 15:19:29 x201 kernel: iwlagn 0000:02:00.0:
REPLY_CT_KILL_CONFIG_CMD failed
Jul 27 15:19:29 x201 kernel: iwlagn
0000:02:00.0: queue 4 stuck 3 time. Fw reload.
Jul 27 15:19:29 x201 kernel:
iwlagn 0000:02:00.0: On demand firmware reload
Jul 27 15:19:29 x201 kernel:
iwlagn 0000:02:00.0: Error sending POWER_TABLE_CMD: time out after
500ms.
Jul 27 15:19:29 x201 kernel: iwlagn 0000:02:00.0: set power fail, ret
= -110
Jul 27 15:19:29 x201 kernel: ------------[ cut here ]------------
Jul
27 15:19:29 x201 kernel: WARNING: at
drivers/net/wireless/iwlwifi/iwl-core.c:2068
iwl_mac_add_interface+0x127/0x150 [iwlcore]()
Jul 27 15:19:29 x201 kernel:
Hardware name: 3626W6E
Jul 27 15:19:29 x201 kernel: Modules linked in: ipv6
sco bnep rfcomm l2cap tp_smapi hdaps thinkpad_ec iwlagn btusb i2400m_usb
iwlcore bluetooth i2400m mac80211 joydev wimax i2c_i801 cfg80211 nfs lockd
sunrpc scsi_wait_scan usb_storage
Jul 27 15:19:29 x201 kernel: Pid: 18,
comm: events/3 Not tainted 2.6.35-rc6-tuxonice #2
Jul 27 15:19:29 x201
kernel: Call Trace:
Jul 27 15:19:29 x201 kernel: [<ffffffff8107737a>]
warn_slowpath_common+0x7a/0xb0
Jul 27 15:19:29 x201 kernel:
[<ffffffff810773c5>] warn_slowpath_null+0x15/0x20
Jul 27 15:19:29 x201
kernel: [<ffffffffa01e0077>] iwl_mac_add_interface+0x127/0x150 [iwlcore]
Jul
27 15:19:29 x201 kernel: [<ffffffffa0123454>] ieee80211_reconfig+0x84/0x460
[mac80211]
Jul 27 15:19:29 x201 kernel: [<ffffffffa0106bc0>] ?
ieee80211_restart_work+0x0/0x30 [mac80211]
Jul 27 15:19:29 x201 kernel:
[<ffffffffa0106bdd>] ieee80211_restart_work+0x1d/0x30 [mac80211]
Jul 27
15:19:29 x201 kernel: [<ffffffff8108b8ed>] worker_thread+0x16d/0x270
Jul 27
15:19:29 x201 kernel: [<ffffffff81090060>] ?
autoremove_wake_function+0x0/0x40
Jul 27 15:19:29 x201 kernel:
[<ffffffff8108b780>] ? worker_thread+0x0/0x270
Jul 27 15:19:29 x201 kernel:
[<ffffffff8108fa3e>] kthread+0x8e/0xa0
Jul 27 15:19:29 x201 kernel:
[<ffffffff8102cb54>] kernel_thread_helper+0x4/0x10
Jul 27 15:19:29 x201
kernel: [<ffffffff8108f9b0>] ? kthread+0x0/0xa0
Jul 27 15:19:29 x201 kernel:
[<ffffffff8102cb50>] ? kernel_thread_helper+0x0/0x10
Jul 27 15:19:29 x201
kernel: ---[ end trace f89060a8b6153bf5 ]---
Jul 27 15:19:29 x201 kernel:
iwlagn 0000:02:00.0: Microcode SW error detected. Restarting 0x2000000.
Jul
27 15:19:29 x201 kernel: iwlagn 0000:02:00.0: Loaded firmware version:
9.201.4.1 build 24255
Jul 27 15:19:29 x201 kernel: iwlagn 0000:02:00.0:
Start IWL Error Log Dump:
Jul 27 15:19:29 x201 kernel: iwlagn 0000:02:00.0:
Status: 0x00020224, count: 5
Jul 27 15:19:29 x201 kernel: iwlagn
0000:02:00.0: Desc Time data1 data2
line
Jul 27 15:19:29 x201 kernel: iwlagn 0000:02:00.0: SYSASSERT
(#05) 0000013599 0x0000008D 0x8000000D 453
Jul 27 15:19:29 x201
kernel: iwlagn 0000:02:00.0: pc blink1 blink2 ilink1 ilink2
hcmd
Jul 27 15:19:29 x201 kernel: iwlagn 0000:02:00.0: 0x1EAB8 0x1EAA6
0x1EAA6 0x009D6 0x00000 0x400005A
Jul 27 15:19:29 x201 kernel: iwlagn
0000:02:00.0: CSR values:
Jul 27 15:19:29 x201 kernel: iwlagn 0000:02:00.0:
(2nd byte of CSR_INT_COALESCING is CSR_INT_PERIODIC_REG)
Jul 27 15:19:29
x201 kernel: iwlagn 0000:02:00.0: CSR_HW_IF_CONFIG_REG:
0X00480303
Jul 27 15:19:29 x201 kernel: iwlagn 0000:02:00.0:
CSR_INT_COALESCING: 0X0000ff40
Jul 27 15:19:29 x201 kernel: iwlagn
0000:02:00.0: CSR_INT: 0X00000000
Jul 27 15:19:29 x201
kernel: iwlagn 0000:02:00.0: CSR_INT_MASK: 0X00000000
Jul 27
15:19:29 x201 kernel: iwlagn 0000:02:00.0: CSR_FH_INT_STATUS:
0X00000000
Jul 27 15:19:29 x201 kernel: iwlagn 0000:02:00.0:
CSR_GPIO_IN: 0X0000000f
Jul 27 15:19:29 x201 kernel: iwlagn 0000:02:00.0:
CSR_RESET: 0X00000000
Jul 27 15:19:29 x201 kernel: iwlagn
0000:02:00.0: CSR_GP_CNTRL: 0X080403c5
Jul 27 15:19:29 x201
kernel: iwlagn 0000:02:00.0: CSR_HW_REV: 0X00000084
Jul 27
15:19:29 x201 kernel: iwlagn 0000:02:00.0: CSR_EEPROM_REG:
0Xa0820ffd
Jul 27 15:19:29 x201 kernel: iwlagn 0000:02:00.0:
CSR_EEPROM_GP: 0X90000801
Jul 27 15:19:29 x201 kernel: iwlagn 0000:02:00.0:
CSR_OTP_GP_REG: 0X00030001
Jul 27 15:19:29 x201 kernel: iwlagn
0000:02:00.0: CSR_GIO_REG: 0X00080046
Jul 27 15:19:29 x201
kernel: iwlagn 0000:02:00.0: CSR_GP_UCODE_REG: 0X00000002
Jul 27
15:19:29 x201 kernel: iwlagn 0000:02:00.0: CSR_GP_DRIVER_REG:
0X00000004
Jul 27 15:19:29 x201 kernel: iwlagn 0000:02:00.0:
CSR_UCODE_DRV_GP1: 0X00000000
Jul 27 15:19:29 x201 kernel: iwlagn
0000:02:00.0: CSR_UCODE_DRV_GP2: 0X00000000
Jul 27 15:19:29 x201
kernel: iwlagn 0000:02:00.0: CSR_LED_REG: 0X00000018
Jul 27
15:19:29 x201 kernel: iwlagn 0000:02:00.0: CSR_DRAM_INT_TBL_REG:
0X880ffffe
Jul 27 15:19:29 x201 kernel: iwlagn 0000:02:00.0:
CSR_GIO_CHICKEN_BITS: 0X27800200
Jul 27 15:19:29 x201 kernel: iwlagn
0000:02:00.0: CSR_ANA_PLL_CFG: 0X00000000
Jul 27 15:19:29 x201
kernel: iwlagn 0000:02:00.0: CSR_HW_REV_WA_REG: 0X0001001a
Jul 27
15:19:29 x201 kernel: iwlagn 0000:02:00.0: CSR_DBG_HPET_MEM_REG:
0Xffff0000
Jul 27 15:19:29 x201 kernel: iwlagn 0000:02:00.0: FH register
values:
Jul 27 15:19:29 x201 kernel: iwlagn 0000:02:00.0:
FH_RSCSR_CHNL0_STTS_WPTR_REG: 0X0ffede00
Jul 27 15:19:29 x201 kernel: iwlagn
0000:02:00.0: FH_RSCSR_CHNL0_RBDCB_BASE_REG: 0X00ffedf0
Jul 27
15:19:29 x201 kernel: iwlagn 0000:02:00.0:
FH_RSCSR_CHNL0_WPTR: 0X00000000
Jul 27 15:19:29 x201 kernel: iwlagn
0000:02:00.0: FH_MEM_RCSR_CHNL0_CONFIG_REG: 0X80819104
Jul 27
15:19:29 x201 kernel: iwlagn 0000:02:00.0:
FH_MEM_RSSR_SHARED_CTRL_REG: 0X000000fc
Jul 27 15:19:29 x201 kernel: iwlagn
0000:02:00.0: FH_MEM_RSSR_RX_STATUS_REG: 0X07030000
Jul 27
15:19:29 x201 kernel: iwlagn 0000:02:00.0:
FH_MEM_RSSR_RX_ENABLE_ERR_IRQ2DRV: 0X00000000
Jul 27 15:19:29 x201 kernel:
iwlagn 0000:02:00.0: FH_TSSR_TX_STATUS_REG: 0X07ff0001
Jul 27
15:19:29 x201 kernel: iwlagn 0000:02:00.0:
FH_TSSR_TX_ERROR_REG: 0X00000000
Jul 27 15:19:29 x201 kernel: iwlagn
0000:02:00.0: Start IWL Event Log Dump: display last 20 entries
Jul 27
15:19:29 x201 kernel: iwlagn 0000:02:00.0:
EVT_LOGT:0000005630:0x000000ff:1100
Jul 27 15:19:29 x201 kernel: iwlagn
0000:02:00.0: EVT_LOGT:0000005630:0x000000ff:1100
Jul 27 15:19:29 x201
kernel: iwlagn 0000:02:00.0: EVT_LOGT:0000005631:0x000000ff:1100
Jul 27
15:19:29 x201 kernel: iwlagn 0000:02:00.0:
EVT_LOGT:0000005632:0x000000ff:1100
Jul 27 15:19:29 x201 kernel: iwlagn
0000:02:00.0: EVT_LOGT:0000005632:0x000000ff:1100
Jul 27 15:19:29 x201
kernel: iwlagn 0000:02:00.0: EVT_LOGT:0000005633:0x000000ff:1100
Jul 27
15:19:29 x201 kernel: iwlagn 0000:02:00.0:
EVT_LOGT:0000005634:0x000000ff:1100
Jul 27 15:19:29 x201 kernel: iwlagn
0000:02:00.0: EVT_LOGT:0000005635:0x000000ff:1100
Jul 27 15:19:29 x201
kernel: iwlagn 0000:02:00.0: EVT_LOGT:0000005636:0x000000ff:1100
Jul 27
15:19:29 x201 kernel: iwlagn 0000:02:00.0:
EVT_LOGT:0000005637:0x000000ff:1100
Jul 27 15:19:29 x201 kernel: iwlagn
0000:02:00.0: EVT_LOGT:0000005638:0x000000ff:1100
Jul 27 15:19:29 x201
kernel: iwlagn 0000:02:00.0: EVT_LOGT:0000005638:0x000000ff:1100
Jul 27
15:19:29 x201 kernel: iwlagn 0000:02:00.0:
EVT_LOGT:0000005639:0x000000ff:1100
Jul 27 15:19:29 x201 kernel: iwlagn
0000:02:00.0: EVT_LOGT:0000005640:0x000000ff:1100
Jul 27 15:19:29 x201
kernel: iwlagn 0000:02:00.0: EVT_LOGT:0000005641:0x000000ff:1100
Jul 27
15:19:29 x201 kernel: iwlagn 0000:02:00.0:
EVT_LOGT:0000013491:0x0400005a:0401
Jul 27 15:19:29 x201 kernel: iwlagn
0000:02:00.0: EVT_LOGT:0000013492:0x0400005a:1513
Jul 27 15:19:29 x201
kernel: iwlagn 0000:02:00.0: EVT_LOGT:0000013492:0x00000000:1513
Jul 27
15:19:29 x201 kernel: iwlagn 0000:02:00.0:
EVT_LOGT:0000013493:0x00000001:1523
Jul 27 15:19:29 x201 kernel: iwlagn
0000:02:00.0: EVT_LOGT:0000013608:0x00000000:0125
Jul 27 15:19:29 x201
kernel: iwlagn 0000:02:00.0: Command REPLY_PHY_CALIBRATION_CMD failed: FW
Error
Jul 27 15:19:29 x201 kernel: iwlagn 0000:02:00.0: Error -5 iteration
0
Jul 27 15:19:30 x201 kernel: iwlagn 0000:02:00.0: Error sending
TX_ANT_CONFIGURATION_CMD: time out after 500ms.
Jul 27 15:19:30 x201 kernel:
iwlagn 0000:02:00.0: Error sending REPLY_BT_CONFIG: time out after
500ms.
Jul 27 15:19:30 x201 kernel: iwlagn 0000:02:00.0: failed to send BT
Coex Config
Jul 27 15:19:31 x201 kernel: iwlagn 0000:02:00.0: Error sending
REPLY_RXON: time out after 500ms.
Jul 27 15:19:31 x201 kernel: iwlagn
0000:02:00.0: Error setting new RXON (-110)
Jul 27 15:19:31 x201 kernel:
iwlagn 0000:02:00.0: Error sending REPLY_CT_KILL_CONFIG_CMD: time out after
500ms.
Jul 27 15:19:31 x201 kernel: iwlagn 0000:02:00.0:
REPLY_CT_KILL_CONFIG_CMD failed
Jul 27 15:19:31 x201 kernel: iwlagn
0000:02:00.0: queue 4 stuck 3 time. Fw reload.
Jul 27 15:19:32 x201 kernel:
iwlagn 0000:02:00.0: Error sending POWER_TABLE_CMD: time out after
500ms.
Jul 27 15:19:32 x201 kernel: iwlagn 0000:02:00.0: set power fail, ret
= -110
Jul 27 15:19:32 x201 kernel: ------------[ cut here ]------------
Jul
27 15:19:32 x201 kernel: WARNING: at
drivers/net/wireless/iwlwifi/iwl-core.c:2068
iwl_mac_add_interface+0x127/0x150 [iwlcore]()
Jul 27 15:19:32 x201 kernel:
Hardware name: 3626W6E
Jul 27 15:19:32 x201 kernel: Modules linked in: ipv6
sco bnep rfcomm l2cap tp_smapi hdaps thinkpad_ec iwlagn btusb i2400m_usb
iwlcore bluetooth i2400m mac80211 joydev wimax i2c_i801 cfg80211 nfs lockd
sunrpc scsi_wait_scan usb_storage
Jul 27 15:19:32 x201 kernel: Pid: 16,
comm: events/1 Tainted: G W 2.6.35-rc6-tuxonice #2
Jul 27 15:19:32
x201 kernel: Call Trace:
Jul 27 15:19:32 x201 kernel: [<ffffffff8107737a>]
warn_slowpath_common+0x7a/0xb0
Jul 27 15:19:32 x201 kernel:
[<ffffffff810773c5>] warn_slowpath_null+0x15/0x20
Jul 27 15:19:32 x201
kernel: [<ffffffffa01e0077>] iwl_mac_add_interface+0x127/0x150 [iwlcore]
Jul
27 15:19:32 x201 kernel: [<ffffffffa0123454>] ieee80211_reconfig+0x84/0x460
[mac80211]
Jul 27 15:19:32 x201 kernel: [<ffffffffa0106bc0>] ?
ieee80211_restart_work+0x0/0x30 [mac80211]
Jul 27 15:19:32 x201 kernel:
[<ffffffffa0106bdd>] ieee80211_restart_work+0x1d/0x30 [mac80211]
Jul 27
15:19:32 x201 kernel: [<ffffffff8108b8ed>] worker_thread+0x16d/0x270
Jul 27
15:19:32 x201 kernel: [<ffffffff81090060>] ?
autoremove_wake_function+0x0/0x40
Jul 27 15:19:32 x201 kernel:
[<ffffffff8108b780>] ? worker_thread+0x0/0x270
Jul 27 15:19:32 x201 kernel:
[<ffffffff8108fa3e>] kthread+0x8e/0xa0
Jul 27 15:19:32 x201 kernel:
[<ffffffff8102cb54>] kernel_thread_helper+0x4/0x10
Jul 27 15:19:32 x201
kernel: [<ffffffff8108f9b0>] ? kthread+0x0/0xa0
Jul 27 15:19:32 x201 kernel:
[<ffffffff8102cb50>] ? kernel_thread_helper+0x0/0x10
Jul 27 15:19:32 x201
kernel: ---[ end trace f89060a8b6153bf6 ]---
Jul 27 15:19:32 x201 kernel:
iwlagn 0000:02:00.0: Microcode SW error detected. Restarting 0x2000000.
Jul
27 15:19:32 x201 kernel: iwlagn 0000:02:00.0: Loaded firmware version:
9.201.4.1 build 24255
Jul 27 15:19:32 x201 kernel: iwlagn 0000:02:00.0:
Start IWL Error Log Dump:
Jul 27 15:19:32 x201 kernel: iwlagn 0000:02:00.0:
Status: 0x00020224, count: 5
Jul 27 15:19:32 x201 kernel: iwlagn
0000:02:00.0: Desc Time data1 data2
line
Jul 27 15:19:32 x201 kernel: iwlagn 0000:02:00.0: SYSASSERT
(#05) 0000012798 0x0000008D 0x8000000D 453
Jul 27 15:19:32 x201
kernel: iwlagn 0000:02:00.0: pc blink1 blink2 ilink1 ilink2
hcmd
Jul 27 15:19:32 x201 kernel: iwlagn 0000:02:00.0: 0x1EAB8 0x1EAA6
0x1EAA6 0x009D6 0x00000 0x400005A
Jul 27 15:19:32 x201 kernel: iwlagn
0000:02:00.0: CSR values:
Jul 27 15:19:32 x201 kernel: iwlagn 0000:02:00.0:
(2nd byte of CSR_INT_COALESCING is CSR_INT_PERIODIC_REG)
Jul 27 15:19:32
x201 kernel: iwlagn 0000:02:00.0: CSR_HW_IF_CONFIG_REG:
0X00480303
Jul 27 15:19:32 x201 kernel: iwlagn 0000:02:00.0:
CSR_INT_COALESCING: 0X0000ff40
Jul 27 15:19:32 x201 kernel: iwlagn
0000:02:00.0: CSR_INT: 0X00000000
Jul 27 15:19:32 x201
kernel: iwlagn 0000:02:00.0: CSR_INT_MASK: 0X00000000
Jul 27
15:19:32 x201 kernel: iwlagn 0000:02:00.0: CSR_FH_INT_STATUS:
0X00000000
Jul 27 15:19:32 x201 kernel: iwlagn 0000:02:00.0:
CSR_GPIO_IN: 0X0000000f
Jul 27 15:19:32 x201 kernel: iwlagn 0000:02:00.0:
CSR_RESET: 0X00000000
Jul 27 15:19:32 x201 kernel: iwlagn
0000:02:00.0: CSR_GP_CNTRL: 0X080403c5
Jul 27 15:19:32 x201
kernel: iwlagn 0000:02:00.0: CSR_HW_REV: 0X00000084
Jul 27
15:19:32 x201 kernel: iwlagn 0000:02:00.0: CSR_EEPROM_REG:
0Xa0820ffd
Jul 27 15:19:32 x201 kernel: iwlagn 0000:02:00.0:
CSR_EEPROM_GP: 0X90000801
Jul 27 15:19:32 x201 kernel: iwlagn 0000:02:00.0:
CSR_OTP_GP_REG: 0X00030001
Jul 27 15:19:32 x201 kernel: iwlagn
0000:02:00.0: CSR_GIO_REG: 0X00080046
Jul 27 15:19:32 x201
kernel: iwlagn 0000:02:00.0: CSR_GP_UCODE_REG: 0X00000002
Jul 27
15:19:32 x201 kernel: iwlagn 0000:02:00.0: CSR_GP_DRIVER_REG:
0X00000004
Jul 27 15:19:32 x201 kernel: iwlagn 0000:02:00.0:
CSR_UCODE_DRV_GP1: 0X00000000
Jul 27 15:19:32 x201 kernel: iwlagn
0000:02:00.0: CSR_UCODE_DRV_GP2: 0X00000000
Jul 27 15:19:32 x201
kernel: iwlagn 0000:02:00.0: CSR_LED_REG: 0X00000018
Jul 27
15:19:32 x201 kernel: iwlagn 0000:02:00.0: CSR_DRAM_INT_TBL_REG:
0X880ffffe
Jul 27 15:19:32 x201 kernel: iwlagn 0000:02:00.0:
CSR_GIO_CHICKEN_BITS: 0X27800200
Jul 27 15:19:32 x201 kernel: iwlagn
0000:02:00.0: CSR_ANA_PLL_CFG: 0X00000000
Jul 27 15:19:32 x201
kernel: iwlagn 0000:02:00.0: CSR_HW_REV_WA_REG: 0X0001001a
Jul 27
15:19:32 x201 kernel: iwlagn 0000:02:00.0: CSR_DBG_HPET_MEM_REG:
0Xffff0000
Jul 27 15:19:32 x201 kernel: iwlagn 0000:02:00.0: FH register
values:
Jul 27 15:19:32 x201 kernel: iwlagn 0000:02:00.0:
FH_RSCSR_CHNL0_STTS_WPTR_REG: 0X0ffede00
Jul 27 15:19:32 x201 kernel: iwlagn
0000:02:00.0: FH_RSCSR_CHNL0_RBDCB_BASE_REG: 0X00ffedf0
Jul 27
15:19:32 x201 kernel: iwlagn 0000:02:00.0:
FH_RSCSR_CHNL0_WPTR: 0X00000000
Jul 27 15:19:32 x201 kernel: iwlagn
0000:02:00.0: FH_MEM_RCSR_CHNL0_CONFIG_REG: 0X80819104
Jul 27
15:19:32 x201 kernel: iwlagn 0000:02:00.0:
FH_MEM_RSSR_SHARED_CTRL_REG: 0X000000fc
Jul 27 15:19:32 x201 kernel: iwlagn
0000:02:00.0: FH_MEM_RSSR_RX_STATUS_REG: 0X07030000
Jul 27
15:19:32 x201 kernel: iwlagn 0000:02:00.0:
FH_MEM_RSSR_RX_ENABLE_ERR_IRQ2DRV: 0X00000000
Jul 27 15:19:32 x201 kernel:
iwlagn 0000:02:00.0: FH_TSSR_TX_STATUS_REG: 0X07ff0001
Jul 27
15:19:32 x201 kernel: iwlagn 0000:02:00.0:
FH_TSSR_TX_ERROR_REG: 0X00000000
Jul 27 15:19:32 x201 kernel: iwlagn
0000:02:00.0: Start IWL Event Log Dump: display last 20 entries
Jul 27
15:19:32 x201 kernel: iwlagn 0000:02:00.0:
EVT_LOGT:0000005629:0x000000ff:1100
Jul 27 15:19:32 x201 kernel: iwlagn
0000:02:00.0: EVT_LOGT:0000005630:0x000000ff:1100
Jul 27 15:19:32 x201
kernel: iwlagn 0000:02:00.0: EVT_LOGT:0000005631:0x000000ff:1100
Jul 27
15:19:32 x201 kernel: iwlagn 0000:02:00.0:
EVT_LOGT:0000005632:0x000000ff:1100
Jul 27 15:19:32 x201 kernel: iwlagn
0000:02:00.0: EVT_LOGT:0000005632:0x000000ff:1100
Jul 27 15:19:32 x201
kernel: iwlagn 0000:02:00.0: EVT_LOGT:0000005633:0x000000ff:1100
Jul 27
15:19:32 x201 kernel: iwlagn 0000:02:00.0:
EVT_LOGT:0000005634:0x000000ff:1100
Jul 27 15:19:32 x201 kernel: iwlagn
0000:02:00.0: EVT_LOGT:0000005635:0x000000ff:1100
Jul 27 15:19:32 x201
kernel: iwlagn 0000:02:00.0: EVT_LOGT:0000005636:0x000000ff:1100
Jul 27
15:19:32 x201 kernel: iwlagn 0000:02:00.0:
EVT_LOGT:0000005637:0x000000ff:1100
Jul 27 15:19:32 x201 kernel: iwlagn
0000:02:00.0: EVT_LOGT:0000005638:0x000000ff:1100
Jul 27 15:19:32 x201
kernel: iwlagn 0000:02:00.0: EVT_LOGT:0000005638:0x000000ff:1100
Jul 27
15:19:32 x201 kernel: iwlagn 0000:02:00.0:
EVT_LOGT:0000005639:0x000000ff:1100
Jul 27 15:19:32 x201 kernel: iwlagn
0000:02:00.0: EVT_LOGT:0000005640:0x000000ff:1100
Jul 27 15:19:32 x201
kernel: iwlagn 0000:02:00.0: EVT_LOGT:0000005640:0x000000ff:1100
Jul 27
15:19:32 x201 kernel: iwlagn 0000:02:00.0:
EVT_LOGT:0000012690:0x0400005a:0401
Jul 27 15:19:32 x201 kernel: iwlagn
0000:02:00.0: EVT_LOGT:0000012691:0x0400005a:1513
Jul 27 15:19:32 x201
kernel: iwlagn 0000:02:00.0: EVT_LOGT:0000012692:0x00000000:1513
Jul 27
15:19:32 x201 kernel: iwlagn 0000:02:00.0:
EVT_LOGT:0000012693:0x00000001:1523
Jul 27 15:19:32 x201 kernel: iwlagn
0000:02:00.0: EVT_LOGT:0000012807:0x00000000:0125
Jul 27 15:19:32 x201
kernel: iwlagn 0000:02:00.0: Command REPLY_PHY_CALIBRATION_CMD failed: FW
Error
Jul 27 15:19:32 x201 kernel: iwlagn 0000:02:00.0: Error -5 iteration
0
Jul 27 15:19:32 x201 kernel: iwlagn 0000:02:00.0: Error sending
TX_ANT_CONFIGURATION_CMD: time out after 500ms.
Jul 27 15:19:33 x201 kernel:
iwlagn 0000:02:00.0: Error sending REPLY_BT_CONFIG: time out after
500ms.
Jul 27 15:19:33 x201 kernel: iwlagn 0000:02:00.0: failed to send BT
Coex Config
Jul 27 15:19:33 x201 kernel: iwlagn 0000:02:00.0: Error sending
REPLY_RXON: time out after 500ms.
Jul 27 15:19:33 x201 kernel: iwlagn
0000:02:00.0: Error setting new RXON (-110)
Jul 27 15:19:34 x201 kernel:
iwlagn 0000:02:00.0: Error sending REPLY_CT_KILL_CONFIG_CMD: time out after
500ms.
Jul 27 15:19:34 x201 kernel: iwlagn 0000:02:00.0:
REPLY_CT_KILL_CONFIG_CMD failed
Jul 27 15:19:34 x201 kernel: iwlagn
0000:02:00.0: queue 4 stuck 3 time. Fw reload.
Jul 27 15:19:34 x201 kernel:
iwlagn 0000:02:00.0: On demand firmware reload
Jul 27 15:19:34 x201 kernel:
iwlagn 0000:02:00.0: Error sending POWER_TABLE_CMD: time out after
500ms.
Jul 27 15:19:34 x201 kernel: iwlagn 0000:02:00.0: set power fail, ret
= -110
Jul 27 15:19:34 x201 kernel: ------------[ cut here ]------------
Jul
27 15:19:34 x201 kernel: WARNING: at
drivers/net/wireless/iwlwifi/iwl-core.c:2068
iwl_mac_add_interface+0x127/0x150 [iwlcore]()
Jul 27 15:19:34 x201 kernel:
Hardware name: 3626W6E
Jul 27 15:19:34 x201 kernel: Modules linked in: ipv6
sco bnep rfcomm l2cap tp_smapi hdaps thinkpad_ec iwlagn btusb i2400m_usb
iwlcore bluetooth i2400m mac80211 joydev wimax i2c_i801 cfg80211 nfs lockd
sunrpc scsi_wait_scan usb_storage
Jul 27 15:19:34 x201 kernel: Pid: 17,
comm: events/2 Tainted: G W 2.6.35-rc6-tuxonice #2
Jul 27 15:19:34
x201 kernel: Call Trace:
Jul 27 15:19:34 x201 kernel: [<ffffffff8107737a>]
warn_slowpath_common+0x7a/0xb0
Jul 27 15:19:34 x201 kernel:
[<ffffffff810773c5>] warn_slowpath_null+0x15/0x20
Jul 27 15:19:34 x201
kernel: [<ffffffffa01e0077>] iwl_mac_add_interface+0x127/0x150 [iwlcore]
Jul
27 15:19:34 x201 kernel: [<ffffffffa0123454>] ieee80211_reconfig+0x84/0x460
[mac80211]
Jul 27 15:19:34 x201 kernel: [<ffffffffa0106bc0>] ?
ieee80211_restart_work+0x0/0x30 [mac80211]
Jul 27 15:19:34 x201 kernel:
[<ffffffffa0106bdd>] ieee80211_restart_work+0x1d/0x30 [mac80211]
Jul 27
15:19:34 x201 kernel: [<ffffffff8108b8ed>] worker_thread+0x16d/0x270
Jul 27
15:19:34 x201 kernel: [<ffffffff81090060>] ?
autoremove_wake_function+0x0/0x40
Jul 27 15:19:34 x201 kernel:
[<ffffffff8108b780>] ? worker_thread+0x0/0x270
Jul 27 15:19:34 x201 kernel:
[<ffffffff8108fa3e>] kthread+0x8e/0xa0
Jul 27 15:19:34 x201 kernel:
[<ffffffff8102cb54>] kernel_thread_helper+0x4/0x10
Jul 27 15:19:34 x201
kernel: [<ffffffff8108f9b0>] ? kthread+0x0/0xa0
Jul 27 15:19:34 x201 kernel:
[<ffffffff8102cb50>] ? kernel_thread_helper+0x0/0x10
Jul 27 15:19:34 x201
kernel: ---[ end trace f89060a8b6153bf7 ]---
Jul 27 15:19:34 x201 kernel:
iwlagn 0000:02:00.0: Microcode SW error detected. Restarting 0x2000000.
Jul
27 15:19:34 x201 kernel: iwlagn 0000:02:00.0: Loaded firmware version:
9.201.4.1 build 24255
Jul 27 15:19:34 x201 kernel: iwlagn 0000:02:00.0:
Start IWL Error Log Dump:
Jul 27 15:19:34 x201 kernel: iwlagn 0000:02:00.0:
Status: 0x00020224, count: 5
Jul 27 15:19:34 x201 kernel: iwlagn
0000:02:00.0: Desc Time data1 data2
line
Jul 27 15:19:34 x201 kernel: iwlagn 0000:02:00.0: SYSASSERT
(#05) 0000013662 0x0000008D 0x8000000D 453
Jul 27 15:19:34 x201
kernel: iwlagn 0000:02:00.0: pc blink1 blink2 ilink1 ilink2
hcmd
Jul 27 15:19:34 x201 kernel: iwlagn 0000:02:00.0: 0x1EAB8 0x1EAA6
0x1EAA6 0x009D6 0x00000 0x400005A
Jul 27 15:19:34 x201 kernel: iwlagn
0000:02:00.0: CSR values:
Jul 27 15:19:34 x201 kernel: iwlagn 0000:02:00.0:
(2nd byte of CSR_INT_COALESCING is CSR_INT_PERIODIC_REG)
Jul 27 15:19:34
x201 kernel: iwlagn 0000:02:00.0: CSR_HW_IF_CONFIG_REG:
0X00480303
Jul 27 15:19:34 x201 kernel: iwlagn 0000:02:00.0:
CSR_INT_COALESCING: 0X0000ff40
Jul 27 15:19:34 x201 kernel: iwlagn
0000:02:00.0: CSR_INT: 0X00000000
Jul 27 15:19:34 x201
kernel: iwlagn 0000:02:00.0: CSR_INT_MASK: 0X00000000
Jul 27
15:19:34 x201 kernel: iwlagn 0000:02:00.0: CSR_FH_INT_STATUS:
0X00000000
Jul 27 15:19:34 x201 kernel: iwlagn 0000:02:00.0:
CSR_GPIO_IN: 0X0000000f
Jul 27 15:19:34 x201 kernel: iwlagn 0000:02:00.0:
CSR_RESET: 0X00000000
Jul 27 15:19:34 x201 kernel: iwlagn
0000:02:00.0: CSR_GP_CNTRL: 0X080403c5
Jul 27 15:19:34 x201
kernel: iwlagn 0000:02:00.0: CSR_HW_REV: 0X00000084
Jul 27
15:19:34 x201 kernel: iwlagn 0000:02:00.0: CSR_EEPROM_REG:
0Xa0820ffd
Jul 27 15:19:34 x201 kernel: iwlagn 0000:02:00.0:
CSR_EEPROM_GP: 0X90000801
Jul 27 15:19:34 x201 kernel: iwlagn 0000:02:00.0:
CSR_OTP_GP_REG: 0X00030001
Jul 27 15:19:34 x201 kernel: iwlagn
0000:02:00.0: CSR_GIO_REG: 0X00080046
Jul 27 15:19:34 x201
kernel: iwlagn 0000:02:00.0: CSR_GP_UCODE_REG: 0X00000002
Jul 27
15:19:34 x201 kernel: iwlagn 0000:02:00.0: CSR_GP_DRIVER_REG:
0X00000004
Jul 27 15:19:34 x201 kernel: iwlagn 0000:02:00.0:
CSR_UCODE_DRV_GP1: 0X00000000
Jul 27 15:19:34 x201 kernel: iwlagn
0000:02:00.0: CSR_UCODE_DRV_GP2: 0X00000000
Jul 27 15:19:34 x201
kernel: iwlagn 0000:02:00.0: CSR_LED_REG: 0X00000018
Jul 27
15:19:34 x201 kernel: iwlagn 0000:02:00.0: CSR_DRAM_INT_TBL_REG:
0X880ffffe
Jul 27 15:19:34 x201 kernel: iwlagn 0000:02:00.0:
CSR_GIO_CHICKEN_BITS: 0X27800200
Jul 27 15:19:34 x201 kernel: iwlagn
0000:02:00.0: CSR_ANA_PLL_CFG: 0X00000000
Jul 27 15:19:34 x201
kernel: iwlagn 0000:02:00.0: CSR_HW_REV_WA_REG: 0X0001001a
Jul 27
15:19:34 x201 kernel: iwlagn 0000:02:00.0: CSR_DBG_HPET_MEM_REG:
0Xffff0000
Jul 27 15:19:34 x201 kernel: iwlagn 0000:02:00.0: FH register
values:
Jul 27 15:19:34 x201 kernel: iwlagn 0000:02:00.0:
FH_RSCSR_CHNL0_STTS_WPTR_REG: 0X0ffede00
Jul 27 15:19:34 x201 kernel: iwlagn
0000:02:00.0: FH_RSCSR_CHNL0_RBDCB_BASE_REG: 0X00ffedf0
Jul 27
15:19:34 x201 kernel: iwlagn 0000:02:00.0:
FH_RSCSR_CHNL0_WPTR: 0X00000000
Jul 27 15:19:34 x201 kernel: iwlagn
0000:02:00.0: FH_MEM_RCSR_CHNL0_CONFIG_REG: 0X80819104
Jul 27
15:19:34 x201 kernel: iwlagn 0000:02:00.0:
FH_MEM_RSSR_SHARED_CTRL_REG: 0X000000fc
Jul 27 15:19:34 x201 kernel: iwlagn
0000:02:00.0: FH_MEM_RSSR_RX_STATUS_REG: 0X07030000
Jul 27
15:19:34 x201 kernel: iwlagn 0000:02:00.0:
FH_MEM_RSSR_RX_ENABLE_ERR_IRQ2DRV: 0X00000000
Jul 27 15:19:34 x201 kernel:
iwlagn 0000:02:00.0: FH_TSSR_TX_STATUS_REG: 0X07ff0001
Jul 27
15:19:34 x201 kernel: iwlagn 0000:02:00.0:
FH_TSSR_TX_ERROR_REG: 0X00000000
Jul 27 15:19:34 x201 kernel: iwlagn
0000:02:00.0: Start IWL Event Log Dump: display last 20 entries
Jul 27
15:19:34 x201 kernel: iwlagn 0000:02:00.0:
EVT_LOGT:0000005629:0x000000ff:1100
Jul 27 15:19:34 x201 kernel: iwlagn
0000:02:00.0: EVT_LOGT:0000005630:0x000000ff:1100
Jul 27 15:19:34 x201
kernel: iwlagn 0000:02:00.0: EVT_LOGT:0000005631:0x000000ff:1100
Jul 27
15:19:34 x201 kernel: iwlagn 0000:02:00.0:
EVT_LOGT:0000005632:0x000000ff:1100
Jul 27 15:19:34 x201 kernel: iwlagn
0000:02:00.0: EVT_LOGT:0000005632:0x000000ff:1100
Jul 27 15:19:34 x201
kernel: iwlagn 0000:02:00.0: EVT_LOGT:0000005633:0x000000ff:1100
Jul 27
15:19:34 x201 kernel: iwlagn 0000:02:00.0:
EVT_LOGT:0000005634:0x000000ff:1100
Jul 27 15:19:34 x201 kernel: iwlagn
0000:02:00.0: EVT_LOGT:0000005635:0x000000ff:1100
Jul 27 15:19:34 x201
kernel: iwlagn 0000:02:00.0: EVT_LOGT:0000005636:0x000000ff:1100
Jul 27
15:19:34 x201 kernel: iwlagn 0000:02:00.0:
EVT_LOGT:0000005637:0x000000ff:1100
Jul 27 15:19:34 x201 kernel: iwlagn
0000:02:00.0: EVT_LOGT:0000005638:0x000000ff:1100
Jul 27 15:19:34 x201
kernel: iwlagn 0000:02:00.0: EVT_LOGT:0000005638:0x000000ff:1100
Jul 27
15:19:34 x201 kernel: iwlagn 0000:02:00.0:
EVT_LOGT:0000005639:0x000000ff:1100
Jul 27 15:19:34 x201 kernel: iwlagn
0000:02:00.0: EVT_LOGT:0000005640:0x000000ff:1100
Jul 27 15:19:34 x201
kernel: iwlagn 0000:02:00.0: EVT_LOGT:0000005640:0x000000ff:1100
Jul 27
15:19:34 x201 kernel: iwlagn 0000:02:00.0:
EVT_LOGT:0000013554:0x0400005a:0401
Jul 27 15:19:34 x201 kernel: iwlagn
0000:02:00.0: EVT_LOGT:0000013555:0x0400005a:1513
Jul 27 15:19:34 x201
kernel: iwlagn 0000:02:00.0: EVT_LOGT:0000013555:0x00000000:1513
Jul 27
15:19:34 x201 kernel: iwlagn 0000:02:00.0:
EVT_LOGT:0000013556:0x00000001:1523
Jul 27 15:19:34 x201 kernel: iwlagn
0000:02:00.0: EVT_LOGT:0000013671:0x00000000:0125
Jul 27 15:19:34 x201
kernel: iwlagn 0000:02:00.0: Command REPLY_PHY_CALIBRATION_CMD failed: FW
Error
Jul 27 15:19:34 x201 kernel: iwlagn 0000:02:00.0: Error -5 iteration
0
Jul 27 15:19:35 x201 kernel: iwlagn 0000:02:00.0: Error sending
TX_ANT_CONFIGURATION_CMD: time out after 500ms.
Jul 27 15:19:35 x201 kernel:
iwlagn 0000:02:00.0: Error sending REPLY_BT_CONFIG: time out after
500ms.
Jul 27 15:19:35 x201 kernel: iwlagn 0000:02:00.0: failed to send BT
Coex Config
Jul 27 15:19:36 x201 kernel: iwlagn 0000:02:00.0: Error sending
REPLY_RXON: time out after 500ms.
Jul 27 15:19:36 x201 kernel: iwlagn
0000:02:00.0: Error setting new RXON (-110)
Jul 27 15:19:36 x201 kernel:
iwlagn 0000:02:00.0: Error sending REPLY_CT_KILL_CONFIG_CMD: time out after
500ms.
Jul 27 15:19:36 x201 kernel: iwlagn 0000:02:00.0:
REPLY_CT_KILL_CONFIG_CMD failed
Jul 27 15:19:36 x201 kernel: iwlagn
0000:02:00.0: queue 4 stuck 3 time. Fw reload.
Jul 27 15:19:37 x201 kernel:
iwlagn 0000:02:00.0: Error sending POWER_TABLE_CMD: time out after
500ms.
Jul 27 15:19:37 x201 kernel: iwlagn 0000:02:00.0: set power fail, ret
= -110
Jul 27 15:19:37 x201 kernel: iwlagn 0000:02:00.0: Error sending
REPLY_RXON: time out after 500ms.
Jul 27 15:19:37 x201 kernel: iwlagn
0000:02:00.0: Error setting new RXON (-110)
Jul 27 15:19:38 x201 kernel:
iwlagn 0000:02:00.0: Error sending REPLY_RXON: time out after 500ms.
Jul 27
15:19:38 x201 kernel: iwlagn 0000:02:00.0: Error setting new RXON (-110)
Jul
27 15:19:38 x201 kernel: iwlagn 0000:02:00.0: Error sending REPLY_RXON: time
out after 500ms.
Jul 27 15:19:38 x201 kernel: iwlagn 0000:02:00.0: Error
setting new RXON (-110)
Jul 27 15:19:39 x201 kernel: iwlagn 0000:02:00.0:
Error sending REPLY_RXON: time out after 500ms.
Jul 27 15:19:39 x201 kernel:
iwlagn 0000:02:00.0: Error setting new RXON (-110)
Jul 27 15:19:39 x201
kernel: iwlagn 0000:02:00.0: Microcode SW error detected. Restarting
0x2000000.
Jul 27 15:19:39 x201 kernel: iwlagn 0000:02:00.0: Loaded firmware
version: 9.201.4.1 build 24255
Jul 27 15:19:39 x201 kernel: iwlagn
0000:02:00.0: Start IWL Error Log Dump:
Jul 27 15:19:39 x201 kernel: iwlagn
0000:02:00.0: Status: 0x00020224, count: 5
Jul 27 15:19:39 x201 kernel:
iwlagn 0000:02:00.0: Desc Time data1
data2 line
Jul 27 15:19:39 x201 kernel: iwlagn 0000:02:00.0: SYSASSERT
(#05) 0000013754 0x0000008D 0x8000000D 453
Jul 27
15:19:39 x201 kernel: iwlagn 0000:02:00.0: pc blink1 blink2 ilink1
ilink2 hcmd
Jul 27 15:19:39 x201 kernel: iwlagn 0000:02:00.0: 0x1EAB8
0x1EAA6 0x1EAA6 0x009D6 0x00000 0x400005A
Jul 27 15:19:39 x201 kernel:
iwlagn 0000:02:00.0: CSR values:
Jul 27 15:19:39 x201 kernel: iwlagn
0000:02:00.0: (2nd byte of CSR_INT_COALESCING is CSR_INT_PERIODIC_REG)
Jul
27 15:19:39 x201 kernel: iwlagn 0000:02:00.0: CSR_HW_IF_CONFIG_REG:
0X00480303
Jul 27 15:19:39 x201 kernel: iwlagn 0000:02:00.0:
CSR_INT_COALESCING: 0X0000ff40
Jul 27 15:19:39 x201 kernel: iwlagn
0000:02:00.0: CSR_INT: 0X00000000
Jul 27 15:19:39 x201
kernel: iwlagn 0000:02:00.0: CSR_INT_MASK: 0X00000000
Jul 27
15:19:39 x201 kernel: iwlagn 0000:02:00.0: CSR_FH_INT_STATUS:
0X00000000
Jul 27 15:19:39 x201 kernel: iwlagn 0000:02:00.0:
CSR_GPIO_IN: 0X0000000f
Jul 27 15:19:39 x201 kernel: iwlagn 0000:02:00.0:
CSR_RESET: 0X00000000Jul 27 15:19:39 x201 kernel: iwlagn
0000:02:00.0: CSR_GP_CNTRL: 0X080403c5
Jul 27 15:19:39 x201
kernel: iwlagn 0000:02:00.0: CSR_HW_REV: 0X00000084
Jul 27
15:19:39 x201 kernel: iwlagn 0000:02:00.0: CSR_EEPROM_REG:
0Xa0820ffd
Jul 27 15:19:39 x201 kernel: iwlagn 0000:02:00.0:
CSR_EEPROM_GP: 0X90000801
Jul 27 15:19:39 x201 kernel: iwlagn 0000:02:00.0:
CSR_OTP_GP_REG: 0X00030001
Jul 27 15:19:39 x201 kernel: iwlagn
0000:02:00.0: CSR_GIO_REG: 0X00080046
Jul 27 15:19:39 x201
kernel: iwlagn 0000:02:00.0: CSR_GP_UCODE_REG: 0X00000002
Jul 27
15:19:39 x201 kernel: iwlagn 0000:02:00.0: CSR_GP_DRIVER_REG:
0X00000004
Jul 27 15:19:39 x201 kernel: iwlagn 0000:02:00.0:
CSR_UCODE_DRV_GP1: 0X00000000
Jul 27 15:19:39 x201 kernel: iwlagn
0000:02:00.0: CSR_UCODE_DRV_GP2: 0X00000000
Jul 27 15:19:39 x201
kernel: iwlagn 0000:02:00.0: CSR_LED_REG: 0X00000018
Jul 27
15:19:39 x201 kernel: iwlagn 0000:02:00.0: CSR_DRAM_INT_TBL_REG:
0X880ffffe
Jul 27 15:19:39 x201 kernel: iwlagn 0000:02:00.0:
CSR_GIO_CHICKEN_BITS: 0X27800200
Jul 27 15:19:39 x201 kernel: iwlagn
0000:02:00.0: CSR_ANA_PLL_CFG: 0X00000000
Jul 27 15:19:39 x201
kernel: iwlagn 0000:02:00.0: CSR_HW_REV_WA_REG: 0X0001001a
Jul 27
15:19:39 x201 kernel: iwlagn 0000:02:00.0: CSR_DBG_HPET_MEM_REG:
0Xffff0000
Jul 27 15:19:39 x201 kernel: iwlagn 0000:02:00.0: FH register
values:
Jul 27 15:19:39 x201 kernel: iwlagn 0000:02:00.0:
FH_RSCSR_CHNL0_STTS_WPTR_REG: 0X0ffede00
Jul 27 15:19:39 x201 kernel: iwlagn
0000:02:00.0: FH_RSCSR_CHNL0_RBDCB_BASE_REG: 0X00ffedf0
Jul 27
15:19:39 x201 kernel: iwlagn 0000:02:00.0:
FH_RSCSR_CHNL0_WPTR: 0X00000000
Jul 27 15:19:39 x201 kernel: iwlagn
0000:02:00.0: FH_MEM_RCSR_CHNL0_CONFIG_REG: 0X80819104
Jul 27
15:19:39 x201 kernel: iwlagn 0000:02:00.0:
FH_MEM_RSSR_SHARED_CTRL_REG: 0X000000fc
Jul 27 15:19:39 x201 kernel: iwlagn
0000:02:00.0: FH_MEM_RSSR_RX_STATUS_REG: 0X07030000
Jul 27
15:19:39 x201 kernel: iwlagn 0000:02:00.0:
FH_MEM_RSSR_RX_ENABLE_ERR_IRQ2DRV: 0X00000000
Jul 27 15:19:39 x201 kernel:
iwlagn 0000:02:00.0: FH_TSSR_TX_STATUS_REG: 0X07ff0001
Jul 27
15:19:39 x201 kernel: iwlagn 0000:02:00.0:
FH_TSSR_TX_ERROR_REG: 0X00000000
Jul 27 15:19:39 x201 kernel: iwlagn
0000:02:00.0: Start IWL Event Log Dump: display last 20 entries
Jul 27
15:19:39 x201 kernel: iwlagn 0000:02:00.0:
EVT_LOGT:0000005631:0x000000ff:1100
Jul 27 15:19:39 x201 kernel: iwlagn
0000:02:00.0: EVT_LOGT:0000005631:0x000000ff:1100
Jul 27 15:19:39 x201
kernel: iwlagn 0000:02:00.0: EVT_LOGT:0000005632:0x000000ff:1100
Jul 27
15:19:39 x201 kernel: iwlagn 0000:02:00.0:
EVT_LOGT:0000005633:0x000000ff:1100
Jul 27 15:19:39 x201 kernel: iwlagn
0000:02:00.0: EVT_LOGT:0000005633:0x000000ff:1100
Jul 27 15:19:39 x201
kernel: iwlagn 0000:02:00.0: EVT_LOGT:0000005634:0x000000ff:1100
Jul 27
15:19:39 x201 kernel: iwlagn 0000:02:00.0:
EVT_LOGT:0000005635:0x000000ff:1100
Jul 27 15:19:39 x201 kernel: iwlagn
0000:02:00.0: EVT_LOGT:0000005636:0x000000ff:1100
Jul 27 15:19:39 x201
kernel: iwlagn 0000:02:00.0: EVT_LOGT:0000005637:0x000000ff:1100
Jul 27
15:19:39 x201 kernel: iwlagn 0000:02:00.0:
EVT_LOGT:0000005638:0x000000ff:1100
Jul 27 15:19:39 x201 kernel: iwlagn
0000:02:00.0: EVT_LOGT:0000005639:0x000000ff:1100
Jul 27 15:19:39 x201
kernel: iwlagn 0000:02:00.0: EVT_LOGT:0000005639:0x000000ff:1100
Jul 27
15:19:39 x201 kernel: iwlagn 0000:02:00.0:
EVT_LOGT:0000005640:0x000000ff:1100
Jul 27 15:19:39 x201 kernel: iwlagn
0000:02:00.0: EVT_LOGT:0000005641:0x000000ff:1100
Jul 27 15:19:39 x201
kernel: iwlagn 0000:02:00.0: EVT_LOGT:0000005642:0x000000ff:1100
Jul 27
15:19:39 x201 kernel: iwlagn 0000:02:00.0:
EVT_LOGT:0000013647:0x0400005a:0401
Jul 27 15:19:39 x201 kernel: iwlagn
0000:02:00.0: EVT_LOGT:0000013648:0x0400005a:1513
Jul 27 15:19:39 x201
kernel: iwlagn 0000:02:00.0: EVT_LOGT:0000013648:0x00000000:1513
Jul 27
15:19:39 x201 kernel: iwlagn 0000:02:00.0:
EVT_LOGT:0000013650:0x00000001:1523
Jul 27 15:19:39 x201 kernel: iwlagn
0000:02:00.0: EVT_LOGT:0000013764:0x00000000:0125
Jul 27 15:19:39 x201
kernel: iwlagn 0000:02:00.0: Command REPLY_PHY_CALIBRATION_CMD failed: FW
Error
Jul 27 15:19:39 x201 kernel: iwlagn 0000:02:00.0: Error -5 iteration
0
Jul 27 15:19:39 x201 kernel: iwlagn 0000:02:00.0: Error sending
TX_ANT_CONFIGURATION_CMD: time out after 500ms.
Jul 27 15:19:40 x201 kernel:
iwlagn 0000:02:00.0: Error sending REPLY_BT_CONFIG: time out after
500ms.
Jul 27 15:19:40 x201 kernel: iwlagn 0000:02:00.0: failed to send BT
Coex Config
Jul 27 15:19:40 x201 kernel: iwlagn 0000:02:00.0: Error sending
REPLY_RXON: time out after 500ms.
Jul 27 15:19:40 x201 kernel: iwlagn
0000:02:00.0: Error setting new RXON (-110)
Jul 27 15:19:41 x201 kernel:
iwlagn 0000:02:00.0: Error sending REPLY_CT_KILL_CONFIG_CMD: time out after
500ms.
Jul 27 15:19:41 x201 kernel: iwlagn 0000:02:00.0:
REPLY_CT_KILL_CONFIG_CMD failed
Jul 27 15:19:41 x201 kernel: iwlagn
0000:02:00.0: queue 4 stuck 3 time. Fw reload.
Jul 27 15:19:41 x201 kernel:
iwlagn 0000:02:00.0: On demand firmware reload
Jul 27 15:19:41 x201 kernel:
iwlagn 0000:02:00.0: Error sending POWER_TABLE_CMD: time out after
500ms.
Jul 27 15:19:41 x201 kernel: iwlagn 0000:02:00.0: set power fail, ret
= -110
Jul 27 15:19:41 x201 kernel: ------------[ cut here ]------------
Jul
27 15:19:41 x201 kernel: WARNING: at
drivers/net/wireless/iwlwifi/iwl-core.c:2068
iwl_mac_add_interface+0x127/0x150 [iwlcore]()
Jul 27 15:19:41 x201 kernel:
Hardware name: 3626W6E
Jul 27 15:19:41 x201 kernel: Modules linked in: ipv6
sco bnep rfcomm l2cap tp_smapi hdaps thinkpad_ec iwlagn btusb i2400m_usb
iwlcore bluetooth i2400m mac80211 joydev wimax i2c_i801 cfg80211 nfs lockd
sunrpc scsi_wait_scan usb_storage
Jul 27 15:19:41 x201 kernel: Pid: 16,
comm: events/1 Tainted: G W 2.6.35-rc6-tuxonice #2
Jul 27 15:19:41
x201 kernel: Call Trace:
Jul 27 15:19:41 x201 kernel: [<ffffffff8107737a>]
warn_slowpath_common+0x7a/0xb0
Jul 27 15:19:41 x201 kernel:
[<ffffffff810773c5>] warn_slowpath_null+0x15/0x20
Jul 27 15:19:41 x201
kernel: [<ffffffffa01e0077>] iwl_mac_add_interface+0x127/0x150 [iwlcore]
Jul
27 15:19:41 x201 kernel: [<ffffffffa0123454>] ieee80211_reconfig+0x84/0x460
[mac80211]
Jul 27 15:19:41 x201 kernel: [<ffffffffa0106bc0>] ?
ieee80211_restart_work+0x0/0x30 [mac80211]
Jul 27 15:19:41 x201 kernel:
[<ffffffffa0106bdd>] ieee80211_restart_work+0x1d/0x30 [mac80211]
Jul 27
15:19:41 x201 kernel: [<ffffffff8108b8ed>] worker_thread+0x16d/0x270
Jul 27
15:19:41 x201 kernel: [<ffffffff81090060>] ?
autoremove_wake_function+0x0/0x40
Jul 27 15:19:41 x201 kernel:
[<ffffffff8108b780>] ? worker_thread+0x0/0x270
Jul 27 15:19:41 x201 kernel:
[<ffffffff8108fa3e>] kthread+0x8e/0xa0
Jul 27 15:19:41 x201 kernel:
[<ffffffff8102cb54>] kernel_thread_helper+0x4/0x10
Jul 27 15:19:41 x201
kernel: [<ffffffff8108f9b0>] ? kthread+0x0/0xa0
Jul 27 15:19:41 x201 kernel:
[<ffffffff8102cb50>] ? kernel_thread_helper+0x0/0x10
Jul 27 15:19:41 x201
kernel: ---[ end trace f89060a8b6153bf8 ]---
Jul 27 15:19:41 x201 kernel:
iwlagn 0000:02:00.0: Microcode SW error detected. Restarting 0x2000000.
Jul
27 15:19:41 x201 kernel: iwlagn 0000:02:00.0: Loaded firmware version:
9.201.4.1 build 24255
Jul 27 15:19:41 x201 kernel: iwlagn 0000:02:00.0:
Start IWL Error Log Dump:
Jul 27 15:19:41 x201 kernel: iwlagn 0000:02:00.0:
Status: 0x00020224, count: 5
Jul 27 15:19:41 x201 kernel: iwlagn
0000:02:00.0: Desc Time data1 data2
line
Jul 27 15:19:41 x201 kernel: iwlagn 0000:02:00.0: SYSASSERT
(#05) 0000012923 0x0000008D 0x8000000D 453
Jul 27 15:19:41 x201
kernel: iwlagn 0000:02:00.0: pc blink1 blink2 ilink1 ilink2
hcmd
--
Best Regards,
Alexey 'Alexxy' Shvetsov
Petersburg Nuclear
Physics Institute, Russia
Department of Molecular and Radiation
Biophysics
Gentoo Team Ru
Gentoo Linux
Dev
mailto:alexxyum@gmail.com
mailto:alexxy@gentoo.org
mailto:alexxy@omrb.pn
pi.spb.ru
[-- Attachment #2: This is a digitally signed message part. --]
[-- Type: application/pgp-signature, Size: 198 bytes --]
^ permalink raw reply
* Re: [BUG] after starting wimaxd at boot iwlagn module will crash for intel 6250 card
From: Inaky Perez-Gonzalez @ 2010-07-28 18:09 UTC (permalink / raw)
To: alexxy; +Cc: wimax, linux-wireless
In-Reply-To: <201007282154.06383.alexxy@gentoo.org>
Hi Alexey
On Wed, 2010-07-28 at 21:53 +0400, Alexey Shvetsov wrote:
> Updated relevant part of logs for this bug
>
My concern here is that I am not seeing why the i2400m is failing to
initialize; there are no i2400m relevant messages. If I remember
correctly, over IRC you said that a grep of messages for i2400m only
turned:
Jul 22 16:20:03 x201 kernel: i2400m_usb: probe of 2-1.3:1.0 failed with
error -22
It that's the case, I missed to make the code properly report an error
condition, and we need to find out which one is it.
Can you enable debugging?:
1. unload the i2400m and i2400m-usb modules
2. $ modprobe i2400m debug='driver:8 control:3'
3. $ modprobe i2400m-usb debug='usb:8'
that should be printing way more logs to the console
^ permalink raw reply
* Re: iw dev wlan0 link - "Not connected"
From: Luis R. Rodriguez @ 2010-07-28 17:30 UTC (permalink / raw)
To: Zhongliang Zhao; +Cc: linux-wireless
In-Reply-To: <4C500460.5000505@iam.unibe.ch>
On Wed, Jul 28, 2010 at 3:20 AM, Zhongliang Zhao <zhao@iam.unibe.ch> wrote:
> On 07/26/2010 07:23 PM, Luis R. Rodriguez wrote:
>>
>> On Mon, Jul 26, 2010 at 2:29 AM, Zhongliang Zhao<zhao@iam.unibe.ch>
>> wrote:
>>
>>>
>>> Dear all,
>>>
>>> When I use "iw dev wlan0 link" to get information on wlan0 (basically to
>>> check the channel used on wlan0),
>>> it says: " Not connected "
>>>
>>> Can someone tell me how to fix this?
>>>
>>
>> Refer to:
>>
>> http://wireless.kernel.org/en/users/Documentation/iw#Getting_link_status
>>
>> And then:
>>
>>
>> http://wireless.kernel.org/en/users/Documentation/iw#Establishing_a_basic_connection
>>
>> What you really want to use is:
>>
>> http://wireless.kernel.org/en/users/Documentation/wpa_supplicant
>>
>> Luis
>>
>
>
> Luis, thanks for the reply. But actually we're working on mesh nodes with
> the iw-tool installed, so maybe we should use the "mesh" interface mode. In
> this case, how to solve the problem?
http://wireless.kernel.org/en/users/Documentation/iw#Creating_and_inspecting_Mesh_Point_interfaces_with_iw
Note for ath9k you currently have to issue a scan to kick the card to
beacon, its a bug, not dealt with yet.
Luis
^ permalink raw reply
* Re: [BUG] after starting wimaxd at boot iwlagn module will crash for intel 6250 card
From: Inaky Perez-Gonzalez @ 2010-07-28 18:23 UTC (permalink / raw)
To: alexxy; +Cc: linux-wireless, wimax
In-Reply-To: <1280340597.26204.300.camel@localhost.localdomain>
On Wed, 2010-07-28 at 11:09 -0700, Inaky Perez-Gonzalez wrote:
> Hi Alexey
>
> On Wed, 2010-07-28 at 21:53 +0400, Alexey Shvetsov wrote:
> > Updated relevant part of logs for this bug
> >
On the other side, I just went through the huge log file you sent me --
thx for that.
I don't see any i2400m errors in there -- the driver seems to at least
be able to initialize right. WiFi's iwlagn gets toasted, but i2400m is
not really complaining about anything -- except when NetworkManager
seemingly tries to turn on/off the radio and a message about it being
done while the device is not in the right state is popping up:
...
kernel: iwlagn 0000:02:00.0: RF_KILL bit toggled to enable radio.
NetworkManager: <info> WiFi now disabled by radio killswitch
kernel: i2400m_usb 2-1.3:1.0: 'RF Control' (0x4602) command failed: -84 - invalid state (3)
NetworkManager: <info> (wlan0): bringing up device.
kernel: iwlagn 0000:02:00.0: Microcode SW error detected. Restarting
...
I say seemingly because I don't remember NetworkManager actually doing
that on WiMAX devices, but I could be wrong, as they expose an RFKILL
interface.
So I am the more puzzled here, I guess I need to re-establish a baseline
to curb confusion, please help me here:
-- let's be in peace with the fact that wifi is not working at this
point --
(1) Does WiMAX work ok when iwlagn is unloaded? can you get to turn on
the radio and scan?
(2) Apparently the driver is up and running when iwlagn is loaded
(according to your logs). Can you get the daemon to start? turn the
radio on? scan?
(3) when and how do you actually get that -22 error from the i2400m
probe?
^ permalink raw reply
* [PATCH] mwl8k: add get_survey callback in order to get channel noise
From: John W. Linville @ 2010-07-28 18:22 UTC (permalink / raw)
To: linux-wireless; +Cc: Lennert Buytenhek, John W. Linville
Signed-off-by: John W. Linville <linville@tuxdriver.com>
---
drivers/net/wireless/mwl8k.c | 31 +++++++++++++++++++++++++++----
1 files changed, 27 insertions(+), 4 deletions(-)
diff --git a/drivers/net/wireless/mwl8k.c b/drivers/net/wireless/mwl8k.c
index 28beeaf..d761ed2 100644
--- a/drivers/net/wireless/mwl8k.c
+++ b/drivers/net/wireless/mwl8k.c
@@ -86,7 +86,7 @@ struct rxd_ops {
void (*rxd_init)(void *rxd, dma_addr_t next_dma_addr);
void (*rxd_refill)(void *rxd, dma_addr_t addr, int len);
int (*rxd_process)(void *rxd, struct ieee80211_rx_status *status,
- __le16 *qos);
+ __le16 *qos, s8 *noise);
};
struct mwl8k_device_info {
@@ -207,6 +207,9 @@ struct mwl8k_priv {
/* Tasklet to perform RX. */
struct tasklet_struct poll_rx_task;
+
+ /* Most recently reported noise in dBm */
+ s8 noise;
};
/* Per interface specific private data */
@@ -741,7 +744,7 @@ static void mwl8k_rxd_8366_ap_refill(void *_rxd, dma_addr_t addr, int len)
static int
mwl8k_rxd_8366_ap_process(void *_rxd, struct ieee80211_rx_status *status,
- __le16 *qos)
+ __le16 *qos, s8 *noise)
{
struct mwl8k_rxd_8366_ap *rxd = _rxd;
@@ -752,6 +755,7 @@ mwl8k_rxd_8366_ap_process(void *_rxd, struct ieee80211_rx_status *status,
memset(status, 0, sizeof(*status));
status->signal = -rxd->rssi;
+ *noise = -rxd->noise_floor;
if (rxd->rate & MWL8K_8366_AP_RATE_INFO_MCS_FORMAT) {
status->flag |= RX_FLAG_HT;
@@ -839,7 +843,7 @@ static void mwl8k_rxd_sta_refill(void *_rxd, dma_addr_t addr, int len)
static int
mwl8k_rxd_sta_process(void *_rxd, struct ieee80211_rx_status *status,
- __le16 *qos)
+ __le16 *qos, s8 *noise)
{
struct mwl8k_rxd_sta *rxd = _rxd;
u16 rate_info;
@@ -853,6 +857,7 @@ mwl8k_rxd_sta_process(void *_rxd, struct ieee80211_rx_status *status,
memset(status, 0, sizeof(*status));
status->signal = -rxd->rssi;
+ *noise = -rxd->noise_level;
status->antenna = MWL8K_STA_RATE_INFO_ANTSELECT(rate_info);
status->rate_idx = MWL8K_STA_RATE_INFO_RATEID(rate_info);
@@ -1053,7 +1058,8 @@ static int rxq_process(struct ieee80211_hw *hw, int index, int limit)
rxd = rxq->rxd + (rxq->head * priv->rxd_ops->rxd_size);
- pkt_len = priv->rxd_ops->rxd_process(rxd, &status, &qos);
+ pkt_len = priv->rxd_ops->rxd_process(rxd, &status, &qos,
+ &priv->noise);
if (pkt_len < 0)
break;
@@ -3755,6 +3761,22 @@ static int mwl8k_get_stats(struct ieee80211_hw *hw,
return mwl8k_cmd_get_stat(hw, stats);
}
+static int mwl8k_get_survey(struct ieee80211_hw *hw, int idx,
+ struct survey_info *survey)
+{
+ struct mwl8k_priv *priv = hw->priv;
+ struct ieee80211_conf *conf = &hw->conf;
+
+ if (idx != 0)
+ return -ENOENT;
+
+ survey->channel = conf->channel;
+ survey->filled = SURVEY_INFO_NOISE_DBM;
+ survey->noise = priv->noise;
+
+ return 0;
+}
+
static int
mwl8k_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
enum ieee80211_ampdu_mlme_action action,
@@ -3786,6 +3808,7 @@ static const struct ieee80211_ops mwl8k_ops = {
.sta_remove = mwl8k_sta_remove,
.conf_tx = mwl8k_conf_tx,
.get_stats = mwl8k_get_stats,
+ .get_survey = mwl8k_get_survey,
.ampdu_action = mwl8k_ampdu_action,
};
--
1.7.1.1
^ permalink raw reply related
* Re: [PATCH] mwl8k: add get_survey callback in order to get channel noise
From: Lennert Buytenhek @ 2010-07-28 18:40 UTC (permalink / raw)
To: John W. Linville; +Cc: linux-wireless
In-Reply-To: <1280341361-21337-1-git-send-email-linville@tuxdriver.com>
On Wed, Jul 28, 2010 at 02:22:41PM -0400, John W. Linville wrote:
> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Didn't test this, but looks OK.
Acked-by: Lennert Buytenhek <buytenh@wantstofly.org>
^ permalink raw reply
* [PATCH] ar9170: add get_survey callback in order to get channel noise
From: John W. Linville @ 2010-07-28 18:48 UTC (permalink / raw)
To: linux-wireless; +Cc: Christian Lamparter, John W. Linville
Signed-off-by: John W. Linville <linville@tuxdriver.com>
---
drivers/net/wireless/ath/ar9170/main.c | 17 +++++++++++++++++
1 files changed, 17 insertions(+), 0 deletions(-)
diff --git a/drivers/net/wireless/ath/ar9170/main.c b/drivers/net/wireless/ath/ar9170/main.c
index 5e2c514..e089d9f 100644
--- a/drivers/net/wireless/ath/ar9170/main.c
+++ b/drivers/net/wireless/ath/ar9170/main.c
@@ -1905,6 +1905,22 @@ static int ar9170_get_stats(struct ieee80211_hw *hw,
return 0;
}
+static int ar9170_get_survey(struct ieee80211_hw *hw, int idx,
+ struct survey_info *survey)
+{
+ struct ar9170 *ar = hw->priv;
+ struct ieee80211_conf *conf = &hw->conf;
+
+ if (idx != 0)
+ return -ENOENT;
+
+ survey->channel = conf->channel;
+ survey->filled = SURVEY_INFO_NOISE_DBM;
+ survey->noise = ar->noise[0];
+
+ return 0;
+}
+
static int ar9170_conf_tx(struct ieee80211_hw *hw, u16 queue,
const struct ieee80211_tx_queue_params *param)
{
@@ -1957,6 +1973,7 @@ static const struct ieee80211_ops ar9170_ops = {
.get_tsf = ar9170_op_get_tsf,
.set_key = ar9170_set_key,
.get_stats = ar9170_get_stats,
+ .get_survey = ar9170_get_survey,
.ampdu_action = ar9170_ampdu_action,
};
--
1.7.1.1
^ permalink raw reply related
* Compat-wireless release for 2010-07-28 is baked
From: Compat-wireless cronjob account @ 2010-07-28 19:03 UTC (permalink / raw)
To: linux-wireless
>From git://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next
886be5a..54ebee1 history -> origin/history
+ 7ef15af...1068a69 master -> origin/master (forced update)
1a041a2..fc0f5ac stable -> origin/stable
* [new tag] next-20100728 -> next-20100728
compat-wireless code metrics
493866 - Total upstream lines of code being pulled
1447 - backport code changes
1211 - backport code additions
236 - backport code deletions
5764 - backport from compat module
7211 - total backport code
1.4601 - % of code consists of backport work
1218 - Crap changes not yet posted
1179 - Crap additions not yet posted
39 - Crap deletions not yet posted
0.2466 - % of crap code
Base tree: linux-next.git
Base tree version: next-20100728
compat-wireless release: compat-wireless-2010-07-13-4-g04898a5
^ permalink raw reply
* Re: [PATCH] ar9170: add get_survey callback in order to get channel noise
From: Christian Lamparter @ 2010-07-28 19:10 UTC (permalink / raw)
To: John W. Linville; +Cc: linux-wireless
In-Reply-To: <1280342924-22811-1-git-send-email-linville@tuxdriver.com>
On Wednesday 28 July 2010 20:48:44 John W. Linville wrote:
> Signed-off-by: John W. Linville <linville@tuxdriver.com>
> ---
> drivers/net/wireless/ath/ar9170/main.c | 17 +++++++++++++++++
> 1 files changed, 17 insertions(+), 0 deletions(-)
>
> diff --git a/drivers/net/wireless/ath/ar9170/main.c b/drivers/net/wireless/ath/ar9170/main.c
> index 5e2c514..e089d9f 100644
> --- a/drivers/net/wireless/ath/ar9170/main.c
> +++ b/drivers/net/wireless/ath/ar9170/main.c
> @@ -1905,6 +1905,22 @@ static int ar9170_get_stats(struct ieee80211_hw *hw,
> return 0;
> }
>
> +static int ar9170_get_survey(struct ieee80211_hw *hw, int idx,
> + struct survey_info *survey)
> +{
> + struct ar9170 *ar = hw->priv;
> + struct ieee80211_conf *conf = &hw->conf;
> +
> + if (idx != 0)
> + return -ENOENT;
> +
> + survey->channel = conf->channel;
> + survey->filled = SURVEY_INFO_NOISE_DBM;
> + survey->noise = ar->noise[0];
> +
> + return 0;
> +}
> +
> static int ar9170_conf_tx(struct ieee80211_hw *hw, u16 queue,
> const struct ieee80211_tx_queue_params *param)
> {
> @@ -1957,6 +1973,7 @@ static const struct ieee80211_ops ar9170_ops = {
> .get_tsf = ar9170_op_get_tsf,
> .set_key = ar9170_set_key,
> .get_stats = ar9170_get_stats,
> + .get_survey = ar9170_get_survey,
> .ampdu_action = ar9170_ampdu_action,
> };
One problem: the noisefloor stays at the same level and
is not updated. You would have to call ar9170_set_channel,
but I don't recommend that because that may lockup
the device :(.
Regards,
Chr
^ permalink raw reply
* Re: [BUG] after starting wimaxd at boot iwlagn module will crash for intel 6250 card
From: Dan Williams @ 2010-07-28 21:14 UTC (permalink / raw)
To: Inaky Perez-Gonzalez; +Cc: alexxy, linux-wireless, wimax
In-Reply-To: <1280341422.26204.307.camel@localhost.localdomain>
On Wed, 2010-07-28 at 11:23 -0700, Inaky Perez-Gonzalez wrote:
> On Wed, 2010-07-28 at 11:09 -0700, Inaky Perez-Gonzalez wrote:
> > Hi Alexey
> >
> > On Wed, 2010-07-28 at 21:53 +0400, Alexey Shvetsov wrote:
> > > Updated relevant part of logs for this bug
> > >
>
> On the other side, I just went through the huge log file you sent me --
> thx for that.
>
> I don't see any i2400m errors in there -- the driver seems to at least
> be able to initialize right. WiFi's iwlagn gets toasted, but i2400m is
> not really complaining about anything -- except when NetworkManager
> seemingly tries to turn on/off the radio and a message about it being
> done while the device is not in the right state is popping up:
Stock NM actually doesn't poke rfkill for any device type yet. It
listens for killswitch changes, but it doesn't modify the switch state
at all. It will set the wifi device !IFF_UP though. At some point
we'll hook up rfkill to the "Wireless Enabled" checkbox, but rfkill is
such a tangled mess that it takes a bit of work to get the user
interaction right.
(there are platform and hardware switches, and sometimes the platform
switches control the hard/soft block on the hardware switches.
sometimes they don't. and you can't really tell. so you have to loop
through all switches, try turning them all off, and if any one fails to
turn off then you go through again until all of them turn off or until
it fails. but you can't tell it might fail before you try...)
> ...
> kernel: iwlagn 0000:02:00.0: RF_KILL bit toggled to enable radio.
> NetworkManager: <info> WiFi now disabled by radio killswitch
> kernel: i2400m_usb 2-1.3:1.0: 'RF Control' (0x4602) command failed: -84 - invalid state (3)
> NetworkManager: <info> (wlan0): bringing up device.
> kernel: iwlagn 0000:02:00.0: Microcode SW error detected. Restarting
> ...
>
> I say seemingly because I don't remember NetworkManager actually doing
> that on WiMAX devices, but I could be wrong, as they expose an RFKILL
> interface.
NM doesn't do anything yet with wimax devices, though it'll look for
wimax killswitches. But nothing is done with them yet upstream.
So I guess my question here is whether Alexey is using a stock NM or a
distro-patched one. Ubuntu used to patch NM to actually poke the rfkill
bits, not sure if they still do that or not. Fedora does not, and I
don't think Novell/SUSE does either.
Dan
> So I am the more puzzled here, I guess I need to re-establish a baseline
> to curb confusion, please help me here:
>
> -- let's be in peace with the fact that wifi is not working at this
> point --
>
> (1) Does WiMAX work ok when iwlagn is unloaded? can you get to turn on
> the radio and scan?
>
> (2) Apparently the driver is up and running when iwlagn is loaded
> (according to your logs). Can you get the daemon to start? turn the
> radio on? scan?
>
> (3) when and how do you actually get that -22 error from the i2400m
> probe?
>
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply
* [RFC/PATCH] libertas_tf: add get_survey callback in order to get channel noise
From: John W. Linville @ 2010-07-28 19:05 UTC (permalink / raw)
To: linux-wireless; +Cc: Steve deRosier, John W. Linville
Signed-off-by: John W. Linville <linville@tuxdriver.com>
---
_Is_ the noise floor actually reported in dBm? Or some other unit?
drivers/net/wireless/libertas_tf/libertas_tf.h | 3 +++
drivers/net/wireless/libertas_tf/main.c | 18 ++++++++++++++++++
2 files changed, 21 insertions(+), 0 deletions(-)
diff --git a/drivers/net/wireless/libertas_tf/libertas_tf.h b/drivers/net/wireless/libertas_tf/libertas_tf.h
index 737eac9..ad77b92 100644
--- a/drivers/net/wireless/libertas_tf/libertas_tf.h
+++ b/drivers/net/wireless/libertas_tf/libertas_tf.h
@@ -253,6 +253,9 @@ struct lbtf_private {
u8 fw_ready;
u8 surpriseremoved;
struct sk_buff_head bc_ps_buf;
+
+ /* Most recently reported noise in dBm */
+ s8 noise;
};
/* 802.11-related definitions */
diff --git a/drivers/net/wireless/libertas_tf/main.c b/drivers/net/wireless/libertas_tf/main.c
index 817fffc..9278b3c 100644
--- a/drivers/net/wireless/libertas_tf/main.c
+++ b/drivers/net/wireless/libertas_tf/main.c
@@ -525,6 +525,22 @@ static void lbtf_op_bss_info_changed(struct ieee80211_hw *hw,
lbtf_deb_leave(LBTF_DEB_MACOPS);
}
+static int lbtf_op_get_survey(struct ieee80211_hw *hw, int idx,
+ struct survey_info *survey)
+{
+ struct lbtf_private *priv = hw->priv;
+ struct ieee80211_conf *conf = &hw->conf;
+
+ if (idx != 0)
+ return -ENOENT;
+
+ survey->channel = conf->channel;
+ survey->filled = SURVEY_INFO_NOISE_DBM;
+ survey->noise = priv->noise;
+
+ return 0;
+}
+
static const struct ieee80211_ops lbtf_ops = {
.tx = lbtf_op_tx,
.start = lbtf_op_start,
@@ -535,6 +551,7 @@ static const struct ieee80211_ops lbtf_ops = {
.prepare_multicast = lbtf_op_prepare_multicast,
.configure_filter = lbtf_op_configure_filter,
.bss_info_changed = lbtf_op_bss_info_changed,
+ .get_survey = lbtf_op_get_survey,
};
int lbtf_rx(struct lbtf_private *priv, struct sk_buff *skb)
@@ -555,6 +572,7 @@ int lbtf_rx(struct lbtf_private *priv, struct sk_buff *skb)
stats.freq = priv->cur_freq;
stats.band = IEEE80211_BAND_2GHZ;
stats.signal = prxpd->snr;
+ priv->noise = prxpd->nf;
/* Marvell rate index has a hole at value 4 */
if (prxpd->rx_rate > 4)
--prxpd->rx_rate;
--
1.7.1.1
^ permalink raw reply related
* [PATCH] wl1251: add get_survey callback in order to get channel noise
From: John W. Linville @ 2010-07-28 19:25 UTC (permalink / raw)
To: linux-wireless; +Cc: Kalle Valo, John W. Linville
Signed-off-by: John W. Linville <linville@tuxdriver.com>
---
The calculation of the noise value looks a bit strange to me, but this
is the same calculation from commit 446cfaa412beef0dd6cb0edf3b4eaed34d824537,
some hopefully it was/is correct (or good enough)...
drivers/net/wireless/wl12xx/wl1251.h | 3 +++
drivers/net/wireless/wl12xx/wl1251_main.c | 17 +++++++++++++++++
drivers/net/wireless/wl12xx/wl1251_rx.c | 6 ++++++
3 files changed, 26 insertions(+), 0 deletions(-)
diff --git a/drivers/net/wireless/wl12xx/wl1251.h b/drivers/net/wireless/wl12xx/wl1251.h
index 4f5f02a..6b942a2 100644
--- a/drivers/net/wireless/wl12xx/wl1251.h
+++ b/drivers/net/wireless/wl12xx/wl1251.h
@@ -381,6 +381,9 @@ struct wl1251 {
u32 chip_id;
char fw_ver[21];
+
+ /* Most recently reported noise in dBm */
+ s8 noise;
};
int wl1251_plt_start(struct wl1251 *wl);
diff --git a/drivers/net/wireless/wl12xx/wl1251_main.c b/drivers/net/wireless/wl12xx/wl1251_main.c
index 38f72f4..a6d8d1a 100644
--- a/drivers/net/wireless/wl12xx/wl1251_main.c
+++ b/drivers/net/wireless/wl12xx/wl1251_main.c
@@ -1172,6 +1172,22 @@ out:
return ret;
}
+static int wl1251_op_get_survey(struct ieee80211_hw *hw, int idx,
+ struct survey_info *survey)
+{
+ struct wl1251 *wl = hw->priv;
+ struct ieee80211_conf *conf = &hw->conf;
+
+ if (idx != 0)
+ return -ENOENT;
+
+ survey->channel = conf->channel;
+ survey->filled = SURVEY_INFO_NOISE_DBM;
+ survey->noise = wl->noise;
+
+ return 0;
+}
+
/* can't be const, mac80211 writes to this */
static struct ieee80211_supported_band wl1251_band_2ghz = {
.channels = wl1251_channels,
@@ -1193,6 +1209,7 @@ static const struct ieee80211_ops wl1251_ops = {
.bss_info_changed = wl1251_op_bss_info_changed,
.set_rts_threshold = wl1251_op_set_rts_threshold,
.conf_tx = wl1251_op_conf_tx,
+ .get_survey = wl1251_op_get_survey,
};
static int wl1251_read_eeprom_byte(struct wl1251 *wl, off_t offset, u8 *data)
diff --git a/drivers/net/wireless/wl12xx/wl1251_rx.c b/drivers/net/wireless/wl12xx/wl1251_rx.c
index 8515158..1b6294b 100644
--- a/drivers/net/wireless/wl12xx/wl1251_rx.c
+++ b/drivers/net/wireless/wl12xx/wl1251_rx.c
@@ -74,6 +74,12 @@ static void wl1251_rx_status(struct wl1251 *wl,
status->signal = desc->rssi;
+ /*
+ * FIXME: guessing that snr needs to be divided by two, otherwise
+ * the values don't make any sense
+ */
+ wl->noise = desc->rssi - desc->snr / 2;
+
status->freq = ieee80211_channel_to_frequency(desc->channel);
status->flag |= RX_FLAG_TSFT;
--
1.7.1.1
^ permalink raw reply related
* Re: [PATCH] ar9170: add get_survey callback in order to get channel noise
From: John W. Linville @ 2010-07-28 19:15 UTC (permalink / raw)
To: Christian Lamparter; +Cc: linux-wireless
In-Reply-To: <201007282110.31458.chunkeey@googlemail.com>
On Wed, Jul 28, 2010 at 09:10:31PM +0200, Christian Lamparter wrote:
> On Wednesday 28 July 2010 20:48:44 John W. Linville wrote:
> > Signed-off-by: John W. Linville <linville@tuxdriver.com>
> > ---
> > drivers/net/wireless/ath/ar9170/main.c | 17 +++++++++++++++++
> > 1 files changed, 17 insertions(+), 0 deletions(-)
> >
> > diff --git a/drivers/net/wireless/ath/ar9170/main.c b/drivers/net/wireless/ath/ar9170/main.c
> > index 5e2c514..e089d9f 100644
> > --- a/drivers/net/wireless/ath/ar9170/main.c
> > +++ b/drivers/net/wireless/ath/ar9170/main.c
> > @@ -1905,6 +1905,22 @@ static int ar9170_get_stats(struct ieee80211_hw *hw,
> > return 0;
> > }
> >
> > +static int ar9170_get_survey(struct ieee80211_hw *hw, int idx,
> > + struct survey_info *survey)
> > +{
> > + struct ar9170 *ar = hw->priv;
> > + struct ieee80211_conf *conf = &hw->conf;
> > +
> > + if (idx != 0)
> > + return -ENOENT;
> > +
> > + survey->channel = conf->channel;
> > + survey->filled = SURVEY_INFO_NOISE_DBM;
> > + survey->noise = ar->noise[0];
> > +
> > + return 0;
> > +}
> > +
> > static int ar9170_conf_tx(struct ieee80211_hw *hw, u16 queue,
> > const struct ieee80211_tx_queue_params *param)
> > {
> > @@ -1957,6 +1973,7 @@ static const struct ieee80211_ops ar9170_ops = {
> > .get_tsf = ar9170_op_get_tsf,
> > .set_key = ar9170_set_key,
> > .get_stats = ar9170_get_stats,
> > + .get_survey = ar9170_get_survey,
> > .ampdu_action = ar9170_ampdu_action,
> > };
>
> One problem: the noisefloor stays at the same level and
> is not updated. You would have to call ar9170_set_channel,
> but I don't recommend that because that may lockup
> the device :(.
I'm not sure I understand -- isn't ar9170_set_channel already called
from ar9170_op_config? Or are you saying that the value will be
stale unless you call ar9170_set_channel again?
How is this patch any worse than the situation was before commit
5d6566ff356a19fb6ad994717cb937ff88063fa6?
John
--
John W. Linville Someday the world will need a hero, and you
linville@tuxdriver.com might be all we have. Be ready.
^ permalink raw reply
* Re: [PATCH v2 03/20] mmc: support embedded data field in mmc_host
From: Vitaly Wool @ 2010-07-28 19:47 UTC (permalink / raw)
To: Ohad Ben-Cohen
Cc: linux-wireless, linux-mmc, linux-omap, Kalle Valo, Pandita Vikram,
linux, Nicolas Pitre, Tony Lindgren, Roger Quadros, San Mehat,
Chikkature Rajashekar Madhusudhan, Luciano Coelho, akpm,
linux-arm-kernel
In-Reply-To: <1279733634-21974-4-git-send-email-ohad@wizery.com>
Hi Ohad,
On Wed, Jul 21, 2010 at 7:33 PM, Ohad Ben-Cohen <ohad@wizery.com> wrote:
> Add support to set/get mmc_host private embedded
> data.
>
> This is needed to allow software to dynamically
> create (and remove) SDIO functions which represents
> embedded SDIO devices.
>
<snip>
> @@ -209,6 +209,8 @@ struct mmc_host {
> struct led_trigger *led; /* activity led */
> #endif
>
> + void *embedded_data;
> +
To my understanding, this data doesn't belong to mmc_host. It's not a
host data at all. E. g. imagine a GPIO IRQ for some SDIO chip -- it's
totally unrelated to host.
I think a cleaner way would be to introduce something similar to what
we have for SPI, e. g. struct sdio_board_info. This board info will
contain platform-specific stuff and vendor id/chip id for each onboard
SDIO device. Then the SDIO core will pick up the appropriate data
basing on vendor id/chip id.
~Vitaly
^ permalink raw reply
* Re: [PATCH] ar9170: add get_survey callback in order to get channel noise
From: Christian Lamparter @ 2010-07-28 19:57 UTC (permalink / raw)
To: John W. Linville; +Cc: linux-wireless, Benoit Papillault
In-Reply-To: <20100728191552.GA2668@tuxdriver.com>
On Wednesday 28 July 2010 21:15:53 John W. Linville wrote:
> On Wed, Jul 28, 2010 at 09:10:31PM +0200, Christian Lamparter wrote:
> > On Wednesday 28 July 2010 20:48:44 John W. Linville wrote:
> > > Signed-off-by: John W. Linville <linville@tuxdriver.com>
> > > ---
> > > drivers/net/wireless/ath/ar9170/main.c | 17 +++++++++++++++++
> > > 1 files changed, 17 insertions(+), 0 deletions(-)
> > > [...]
> > One problem: the noisefloor stays at the same level and
> > is not updated. You would have to call ar9170_set_channel,
> > but I don't recommend that because that may lockup
> > the device :(.
>
> I'm not sure I understand -- isn't ar9170_set_channel already called
> from ar9170_op_config? Or are you saying that the value will be
> stale unless you call ar9170_set_channel again?
the latter... come to think of it, I wrote a RFT a while back:
"[RFT] ar9170: implement get_survey" <- 27. April
and Benoit joined in to point out that he has/had the same
issue with ath9k hardware. Was this ever sorted out?
> How is this patch any worse than the situation was before commit
> 5d6566ff356a19fb6ad994717cb937ff88063fa6?
Well, a dodgy value is hardly an improvement, right?
Sure it is _just_ the noise *floor* and people
might argue that any value is better than nothing at all.
Therefore, yes:
Acked-by: Christian Lamparter <chunkeey@googlemail.com>
and add the nf-update to the TODO-list...
Or wait and look how ath9k(_htc) does/did it.
Regards,
Christian
^ permalink raw reply
* Re: [BUG] after starting wimaxd at boot iwlagn module will crash for intel 6250 card
From: Inaky Perez-Gonzalez @ 2010-07-28 20:21 UTC (permalink / raw)
To: Dan Williams; +Cc: linux-wireless@vger.kernel.org, wimax@linuxwimax.org
In-Reply-To: <1280351645.2700.8.camel@dcbw.foobar.com>
On Wed, 2010-07-28 at 14:14 -0700, Dan Williams wrote:
...
> > ...
> > kernel: iwlagn 0000:02:00.0: RF_KILL bit toggled to enable radio.
> > NetworkManager: <info> WiFi now disabled by radio killswitch
> > kernel: i2400m_usb 2-1.3:1.0: 'RF Control' (0x4602) command failed: -84 - invalid state (3)
> > NetworkManager: <info> (wlan0): bringing up device.
> > kernel: iwlagn 0000:02:00.0: Microcode SW error detected. Restarting
> > ...
> >
> > I say seemingly because I don't remember NetworkManager actually doing
> > that on WiMAX devices, but I could be wrong, as they expose an RFKILL
> > interface.
>
> NM doesn't do anything yet with wimax devices, though it'll look for
> wimax killswitches. But nothing is done with them yet upstream.
>
> So I guess my question here is whether Alexey is using a stock NM or a
> distro-patched one. Ubuntu used to patch NM to actually poke the rfkill
> bits, not sure if they still do that or not. Fedora does not, and I
> don't think Novell/SUSE does either.
Thanks for the clarification Dan, that eliminates a variable :)
^ permalink raw reply
* Re: [PATCH 1/3] ath9k: prevent calibration during off-channel activity
From: Luis R. Rodriguez @ 2010-07-28 20:43 UTC (permalink / raw)
To: Felix Fietkau; +Cc: linux-wireless, linville
In-Reply-To: <1280339151-37084-1-git-send-email-nbd@openwrt.org>
On Wed, Jul 28, 2010 at 10:45 AM, Felix Fietkau <nbd@openwrt.org> wrote:
> Previously the software scan callback was used to indicate to the hardware,
> when it was safe to calibrate. This didn't really work properly, because it
> depends on a specific order of software scan callbacks vs. channel changes.
> Also, software scans are not the only thing that triggers off-channel
> activity, so it's better to use the newly added indication from mac80211 for
> this and not use the software scan callback for anything calibration related.
>
> This fixes at least some of the invalid noise floor readings that I've seen
> in AP mode on AR9160
Neat!
> --- a/drivers/net/wireless/ath/ath9k/main.c
> +++ b/drivers/net/wireless/ath/ath9k/main.c
> @@ -154,6 +154,27 @@ void ath9k_ps_restore(struct ath_softc *sc)
> spin_unlock_irqrestore(&sc->sc_pm_lock, flags);
> }
> spin_unlock_irqrestore(&sc->sc_pm_lock, flags);
> }
>
> +static void ath_start_ani(struct ath_common *common)
> +{
> + struct ath_hw *ah = common->ah;
> + unsigned long timestamp = jiffies_to_msecs(jiffies);
> + struct ath_softc *sc = (struct ath_softc *) common->priv;
> +
> + if (!(sc->sc_flags & SC_OP_ANI_RUN))
> + return;
> +
> + if (sc->sc_flags & SC_OP_OFFCHANNEL)
> + return;
> +
> + common->ani.longcal_timer = timestamp;
> + common->ani.shortcal_timer = timestamp;
> + common->ani.checkani_timer = timestamp;
> +
> + mod_timer(&common->ani.timer,
> + jiffies +
> + msecs_to_jiffies((u32)ah->config.ani_poll_interval));
> +}
I would prefer if you do this sort of code shift in a separate patch.
In this case its pretty easy to see the code is the same so I think
its fine the way it is now but for next time please. Otherwise looks
good, thanks!!
Luis
^ permalink raw reply
* Re: [PATCH] wl1251: add get_survey callback in order to get channel noise
From: Kalle Valo @ 2010-07-28 20:36 UTC (permalink / raw)
To: John W. Linville; +Cc: linux-wireless
In-Reply-To: <1280345147-24137-1-git-send-email-linville@tuxdriver.com>
On 07/28/2010 10:25 PM, John W. Linville wrote:
> Signed-off-by: John W. Linville <linville@tuxdriver.com>
> ---
> The calculation of the noise value looks a bit strange to me, but this
> is the same calculation from commit 446cfaa412beef0dd6cb0edf3b4eaed34d824537,
> some hopefully it was/is correct (or good enough)...
I never was able to find out proper way to measure noise with wl1251.
The algorithm I came up and included in this patch is most likely
incorrect. But as having support for noise survey doesn't do any harm,
and hopefully we even might motivate someone to fix the algorithm, I
think it's safe to have this patch.
Acked-by: Kalle Valo <kvalo@adurom.com>
^ permalink raw reply
* [PATCH] wl1271: add get_survey callback in order to get channel noise
From: John W. Linville @ 2010-07-28 20:42 UTC (permalink / raw)
To: linux-wireless; +Cc: Luciano Coelho, Juuso Oikarinen, John W. Linville
Signed-off-by: John W. Linville <linville@tuxdriver.com>
---
drivers/net/wireless/wl12xx/wl1271.h | 3 +++
drivers/net/wireless/wl12xx/wl1271_main.c | 17 +++++++++++++++++
drivers/net/wireless/wl12xx/wl1271_rx.c | 7 +++++++
3 files changed, 27 insertions(+), 0 deletions(-)
diff --git a/drivers/net/wireless/wl12xx/wl1271.h b/drivers/net/wireless/wl12xx/wl1271.h
index 53d47d7..dd3cee6 100644
--- a/drivers/net/wireless/wl12xx/wl1271.h
+++ b/drivers/net/wireless/wl12xx/wl1271.h
@@ -475,6 +475,9 @@ struct wl1271 {
bool sg_enabled;
struct list_head list;
+
+ /* Most recently reported noise in dBm */
+ s8 noise;
};
int wl1271_plt_start(struct wl1271 *wl);
diff --git a/drivers/net/wireless/wl12xx/wl1271_main.c b/drivers/net/wireless/wl12xx/wl1271_main.c
index 864318f..374abf0 100644
--- a/drivers/net/wireless/wl12xx/wl1271_main.c
+++ b/drivers/net/wireless/wl12xx/wl1271_main.c
@@ -1927,6 +1927,22 @@ out:
return mactime;
}
+static int wl1271_op_get_survey(struct ieee80211_hw *hw, int idx,
+ struct survey_info *survey)
+{
+ struct wl1271 *wl = hw->priv;
+ struct ieee80211_conf *conf = &hw->conf;
+
+ if (idx != 0)
+ return -ENOENT;
+
+ survey->channel = conf->channel;
+ survey->filled = SURVEY_INFO_NOISE_DBM;
+ survey->noise = wl->noise;
+
+ return 0;
+}
+
/* can't be const, mac80211 writes to this */
static struct ieee80211_rate wl1271_rates[] = {
{ .bitrate = 10,
@@ -2156,6 +2172,7 @@ static const struct ieee80211_ops wl1271_ops = {
.set_rts_threshold = wl1271_op_set_rts_threshold,
.conf_tx = wl1271_op_conf_tx,
.get_tsf = wl1271_op_get_tsf,
+ .get_survey = wl1271_op_get_survey,
CFG80211_TESTMODE_CMD(wl1271_tm_cmd)
};
diff --git a/drivers/net/wireless/wl12xx/wl1271_rx.c b/drivers/net/wireless/wl12xx/wl1271_rx.c
index e98f22b..019aa79 100644
--- a/drivers/net/wireless/wl12xx/wl1271_rx.c
+++ b/drivers/net/wireless/wl12xx/wl1271_rx.c
@@ -55,6 +55,13 @@ static void wl1271_rx_status(struct wl1271 *wl,
status->signal = desc->rssi;
+ /*
+ * FIXME: In wl1251, the SNR should be divided by two. In wl1271 we
+ * need to divide by two for now, but TI has been discussing about
+ * changing it. This needs to be rechecked.
+ */
+ wl->noise = desc->rssi - (desc->snr >> 1);
+
status->freq = ieee80211_channel_to_frequency(desc->channel);
if (desc->flags & WL1271_RX_DESC_ENCRYPT_MASK) {
--
1.7.1.1
^ permalink raw reply related
* [PATCH] ar9170: add get_survey callback in order to get channel noise
From: John W. Linville @ 2010-07-28 20:30 UTC (permalink / raw)
To: linux-wireless; +Cc: Christian Lamparter, John W. Linville
In-Reply-To: <201007282157.57068.chunkeey@googlemail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Acked-by: Christian Lamparter <chunkeey@googlemail.com>
---
drivers/net/wireless/ath/ar9170/main.c | 17 +++++++++++++++++
1 files changed, 17 insertions(+), 0 deletions(-)
diff --git a/drivers/net/wireless/ath/ar9170/main.c b/drivers/net/wireless/ath/ar9170/main.c
index 5e2c514..e089d9f 100644
--- a/drivers/net/wireless/ath/ar9170/main.c
+++ b/drivers/net/wireless/ath/ar9170/main.c
@@ -1905,6 +1905,22 @@ static int ar9170_get_stats(struct ieee80211_hw *hw,
return 0;
}
+static int ar9170_get_survey(struct ieee80211_hw *hw, int idx,
+ struct survey_info *survey)
+{
+ struct ar9170 *ar = hw->priv;
+ struct ieee80211_conf *conf = &hw->conf;
+
+ if (idx != 0)
+ return -ENOENT;
+
+ survey->channel = conf->channel;
+ survey->filled = SURVEY_INFO_NOISE_DBM;
+ survey->noise = ar->noise[0];
+
+ return 0;
+}
+
static int ar9170_conf_tx(struct ieee80211_hw *hw, u16 queue,
const struct ieee80211_tx_queue_params *param)
{
@@ -1957,6 +1973,7 @@ static const struct ieee80211_ops ar9170_ops = {
.get_tsf = ar9170_op_get_tsf,
.set_key = ar9170_set_key,
.get_stats = ar9170_get_stats,
+ .get_survey = ar9170_get_survey,
.ampdu_action = ar9170_ampdu_action,
};
--
1.7.1.1
^ permalink raw reply related
* Re: [PATCH 2/3] ath9k_hw: clean up per-channel calibration data
From: Luis R. Rodriguez @ 2010-07-28 20:52 UTC (permalink / raw)
To: Felix Fietkau; +Cc: linux-wireless, linville, Jouni Malinen
In-Reply-To: <1280339151-37084-2-git-send-email-nbd@openwrt.org>
On Wed, Jul 28, 2010 at 10:45 AM, Felix Fietkau <nbd@openwrt.org> wrote:
> The noise floor history buffer is currently not kept per channel, which
> can lead to problems when changing channels from a clean channel to a
> noisy one. Also when switching from HT20 to HT40, the noise floor
> history buffer is full of measurements, but none of them contain data
> for the extension channel, which it needs quite a bit of time to recover
> from.
>
> This patch puts all the per-channel calibration data into a single data
> structure, and gives the the driver control over whether that is used
> per-channel or even not used for some channels.
>
> For ath9k_htc, I decided to keep this per-channel in order to avoid
> creating regressions.
>
> For ath9k, the data is kept only for the operating channel, which saves
> some space. ath9k_hw takes care of wiping old data when the operating
> channel or its channel flags change.
>
> Signed-off-by: Felix Fietkau <nbd@openwrt.org>
But this also means every time we want to get operational on a channel
we have to learn the current noise all over again. This means for WiFi
Direct every channel swap we'd have to learn to walk, which happens
quite often. What do you think? Sorry, I know we discussed this
approach and I seemed fine but this just occurred to me now, and will
become really important later when we support WiFi Direct.
Luis
^ permalink raw reply
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox