summaryrefslogtreecommitdiff
path: root/package/mac80211/patches/526-ath9k_survey_channel_stats.patch
diff options
context:
space:
mode:
Diffstat (limited to 'package/mac80211/patches/526-ath9k_survey_channel_stats.patch')
-rw-r--r--package/mac80211/patches/526-ath9k_survey_channel_stats.patch183
1 files changed, 0 insertions, 183 deletions
diff --git a/package/mac80211/patches/526-ath9k_survey_channel_stats.patch b/package/mac80211/patches/526-ath9k_survey_channel_stats.patch
deleted file mode 100644
index 57ba398b02..0000000000
--- a/package/mac80211/patches/526-ath9k_survey_channel_stats.patch
+++ /dev/null
@@ -1,183 +0,0 @@
---- a/drivers/net/wireless/ath/ath9k/ath9k.h
-+++ b/drivers/net/wireless/ath/ath9k/ath9k.h
-@@ -594,6 +594,8 @@ struct ath_softc {
- struct delayed_work wiphy_work;
- unsigned long wiphy_scheduler_int;
- int wiphy_scheduler_index;
-+ struct survey_info *cur_survey;
-+ struct survey_info survey[ATH9K_NUM_CHANNELS];
-
- struct tasklet_struct intr_tq;
- struct tasklet_struct bcon_tasklet;
---- a/drivers/net/wireless/ath/ath9k/main.c
-+++ b/drivers/net/wireless/ath/ath9k/main.c
-@@ -176,6 +176,44 @@ static void ath_start_ani(struct ath_com
- msecs_to_jiffies((u32)ah->config.ani_poll_interval));
- }
-
-+static void ath_update_survey_nf(struct ath_softc *sc, int channel)
-+{
-+ struct ath_hw *ah = sc->sc_ah;
-+ struct ath9k_channel *chan = &ah->channels[channel];
-+ struct survey_info *survey = &sc->survey[channel];
-+
-+ if (chan->noisefloor) {
-+ survey->filled |= SURVEY_INFO_NOISE_DBM;
-+ survey->noise = chan->noisefloor;
-+ }
-+}
-+
-+static void ath_update_survey_stats(struct ath_softc *sc)
-+{
-+ struct ath_hw *ah = sc->sc_ah;
-+ struct ath_common *common = ath9k_hw_common(ah);
-+ int pos = ah->curchan - &ah->channels[0];
-+ struct survey_info *survey = &sc->survey[pos];
-+ struct ath_cycle_counters *cc = &common->cc_survey;
-+ unsigned int div = common->clockrate * 1000;
-+
-+ ath_hw_cycle_counters_update(common);
-+
-+ if (cc->cycles > 0) {
-+ survey->filled |= SURVEY_INFO_CHANNEL_TIME |
-+ SURVEY_INFO_CHANNEL_TIME_BUSY |
-+ SURVEY_INFO_CHANNEL_TIME_RX |
-+ SURVEY_INFO_CHANNEL_TIME_TX;
-+ survey->channel_time += cc->cycles / div;
-+ survey->channel_time_busy += cc->rx_busy / div;
-+ survey->channel_time_rx += cc->rx_frame / div;
-+ survey->channel_time_tx += cc->tx_frame / div;
-+ }
-+ memset(cc, 0, sizeof(*cc));
-+
-+ ath_update_survey_nf(sc, pos);
-+}
-+
- /*
- * 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
-@@ -454,6 +492,7 @@ void ath_ani_calibrate(unsigned long dat
- if (aniflag) {
- spin_lock_irqsave(&common->cc_lock, flags);
- ath9k_hw_ani_monitor(ah, ah->curchan);
-+ ath_update_survey_stats(sc);
- spin_unlock_irqrestore(&common->cc_lock, flags);
- }
-
-@@ -1533,7 +1572,8 @@ static int ath9k_config(struct ieee80211
- {
- struct ath_wiphy *aphy = hw->priv;
- struct ath_softc *sc = aphy->sc;
-- struct ath_common *common = ath9k_hw_common(sc->sc_ah);
-+ struct ath_hw *ah = sc->sc_ah;
-+ struct ath_common *common = ath9k_hw_common(ah);
- struct ieee80211_conf *conf = &hw->conf;
- bool disable_radio;
-
-@@ -1599,6 +1639,11 @@ static int ath9k_config(struct ieee80211
- if (changed & IEEE80211_CONF_CHANGE_CHANNEL) {
- struct ieee80211_channel *curchan = hw->conf.channel;
- int pos = curchan->hw_value;
-+ int old_pos = -1;
-+ unsigned long flags;
-+
-+ if (ah->curchan)
-+ old_pos = ah->curchan - &ah->channels[0];
-
- aphy->chan_idx = pos;
- aphy->chan_is_ht = conf_is_ht(conf);
-@@ -1626,12 +1671,45 @@ static int ath9k_config(struct ieee80211
-
- ath_update_chainmask(sc, conf_is_ht(conf));
-
-+ /* update survey stats for the old channel before switching */
-+ spin_lock_irqsave(&common->cc_lock, flags);
-+ ath_update_survey_stats(sc);
-+ spin_unlock_irqrestore(&common->cc_lock, flags);
-+
-+ /*
-+ * If the operating channel changes, change the survey in-use flags
-+ * along with it.
-+ * Reset the survey data for the new channel, unless we're switching
-+ * back to the operating channel from an off-channel operation.
-+ */
-+ if (!(hw->conf.flags & IEEE80211_CONF_OFFCHANNEL) &&
-+ sc->cur_survey != &sc->survey[pos]) {
-+
-+ if (sc->cur_survey)
-+ sc->cur_survey->filled &= ~SURVEY_INFO_IN_USE;
-+
-+ sc->cur_survey = &sc->survey[pos];
-+
-+ memset(sc->cur_survey, 0, sizeof(struct survey_info));
-+ sc->cur_survey->filled |= SURVEY_INFO_IN_USE;
-+ } else if (!(sc->survey[pos].filled & SURVEY_INFO_IN_USE)) {
-+ memset(&sc->survey[pos], 0, sizeof(struct survey_info));
-+ }
-+
- if (ath_set_channel(sc, hw, &sc->sc_ah->channels[pos]) < 0) {
- ath_print(common, ATH_DBG_FATAL,
- "Unable to set channel\n");
- mutex_unlock(&sc->mutex);
- return -EINVAL;
- }
-+
-+ /*
-+ * The most recent snapshot of channel->noisefloor for the old
-+ * channel is only available after the hardware reset. Copy it to
-+ * the survey stats now.
-+ */
-+ if (old_pos >= 0)
-+ ath_update_survey_nf(sc, old_pos);
- }
-
- skip_chan_change:
-@@ -2001,9 +2079,15 @@ static int ath9k_get_survey(struct ieee8
- {
- struct ath_wiphy *aphy = hw->priv;
- struct ath_softc *sc = aphy->sc;
-- struct ath_hw *ah = sc->sc_ah;
-+ struct ath_common *common = ath9k_hw_common(sc->sc_ah);
- struct ieee80211_supported_band *sband;
-- struct ath9k_channel *chan;
-+ struct ieee80211_channel *chan;
-+ unsigned long flags;
-+ int pos;
-+
-+ spin_lock_irqsave(&common->cc_lock, flags);
-+ if (idx == 0)
-+ ath_update_survey_stats(sc);
-
- sband = hw->wiphy->bands[IEEE80211_BAND_2GHZ];
- if (sband && idx >= sband->n_channels) {
-@@ -2014,21 +2098,17 @@ static int ath9k_get_survey(struct ieee8
- if (!sband)
- sband = hw->wiphy->bands[IEEE80211_BAND_5GHZ];
-
-- if (!sband || idx >= sband->n_channels)
-- return -ENOENT;
--
-- survey->channel = &sband->channels[idx];
-- chan = &ah->channels[survey->channel->hw_value];
-- survey->filled = 0;
--
-- if (chan == ah->curchan)
-- survey->filled |= SURVEY_INFO_IN_USE;
--
-- if (chan->noisefloor) {
-- survey->filled |= SURVEY_INFO_NOISE_DBM;
-- survey->noise = chan->noisefloor;
-+ if (!sband || idx >= sband->n_channels) {
-+ spin_unlock_irqrestore(&common->cc_lock, flags);
-+ return -ENOENT;
- }
-
-+ chan = &sband->channels[idx];
-+ pos = chan->hw_value;
-+ memcpy(survey, &sc->survey[pos], sizeof(*survey));
-+ survey->channel = chan;
-+ spin_unlock_irqrestore(&common->cc_lock, flags);
-+
- return 0;
- }
-