summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--package/mac80211/patches/300-pending_work.patch304
-rw-r--r--package/mac80211/patches/440-ath5k_calibrate_no_queue_stop.patch31
-rw-r--r--package/mac80211/patches/441-ath5k_no_agc_recalibration.patch42
-rw-r--r--package/mac80211/patches/510-ath9k_intr_mitigation_tweak.patch2
-rw-r--r--package/mac80211/patches/513-ath9k_channelbw_debugfs.patch2
-rw-r--r--package/mac80211/patches/530-mac80211_cur_txpower.patch2
-rw-r--r--package/mac80211/patches/541-ath9k_ar9280_cold_reset.patch23
-rw-r--r--package/mac80211/patches/545-ath9k_fix_initvals.patch (renamed from package/mac80211/patches/570-ath9k_fix_initvals.patch)0
-rw-r--r--package/mac80211/patches/551-ath9k_per_chain_signal_strength.patch22
-rw-r--r--package/mac80211/patches/571-ath9k_beacon_fix.patch113
-rw-r--r--package/mac80211/patches/580-mac80211_ignore_bad_signal_values.patch44
-rw-r--r--package/mac80211/patches/581-ath9k_report_missing_signal.patch37
12 files changed, 308 insertions, 314 deletions
diff --git a/package/mac80211/patches/300-pending_work.patch b/package/mac80211/patches/300-pending_work.patch
index 8bb89422ed..b96e154884 100644
--- a/package/mac80211/patches/300-pending_work.patch
+++ b/package/mac80211/patches/300-pending_work.patch
@@ -1,6 +1,35 @@
--- a/drivers/net/wireless/ath/ath9k/ar9003_mac.c
+++ b/drivers/net/wireless/ath/ath9k/ar9003_mac.c
-@@ -510,7 +510,11 @@ int ath9k_hw_process_rxdesc_edma(struct
+@@ -326,7 +326,6 @@ static bool ar9003_hw_get_isr(struct ath
+ static int ar9003_hw_proc_txdesc(struct ath_hw *ah, void *ds,
+ struct ath_tx_status *ts)
+ {
+- struct ar9003_txc *txc = (struct ar9003_txc *) ds;
+ struct ar9003_txs *ads;
+ u32 status;
+
+@@ -336,11 +335,7 @@ static int ar9003_hw_proc_txdesc(struct
+ if ((status & AR_TxDone) == 0)
+ return -EINPROGRESS;
+
+- ts->qid = MS(ads->ds_info, AR_TxQcuNum);
+- if (!txc || (MS(txc->info, AR_TxQcuNum) == ts->qid))
+- ah->ts_tail = (ah->ts_tail + 1) % ah->ts_size;
+- else
+- return -ENOENT;
++ ah->ts_tail = (ah->ts_tail + 1) % ah->ts_size;
+
+ if ((MS(ads->ds_info, AR_DescId) != ATHEROS_VENDOR_ID) ||
+ (MS(ads->ds_info, AR_TxRxDesc) != 1)) {
+@@ -354,6 +349,7 @@ static int ar9003_hw_proc_txdesc(struct
+ ts->ts_seqnum = MS(status, AR_SeqNum);
+ ts->tid = MS(status, AR_TxTid);
+
++ ts->qid = MS(ads->ds_info, AR_TxQcuNum);
+ ts->desc_id = MS(ads->status1, AR_TxDescId);
+ ts->ts_tstamp = ads->status4;
+ ts->ts_status = 0;
+@@ -510,7 +506,11 @@ int ath9k_hw_process_rxdesc_edma(struct
*/
if (rxsp->status11 & AR_CRCErr)
rxs->rs_status |= ATH9K_RXERR_CRC;
@@ -13,7 +42,7 @@
phyerr = MS(rxsp->status11, AR_PHYErrCode);
/*
* If we reach a point here where AR_PostDelimCRCErr is
-@@ -532,11 +536,7 @@ int ath9k_hw_process_rxdesc_edma(struct
+@@ -532,11 +532,7 @@ int ath9k_hw_process_rxdesc_edma(struct
rxs->rs_status |= ATH9K_RXERR_PHY;
rxs->rs_phyerr = phyerr;
}
@@ -130,7 +159,24 @@
IEEE80211_TX_CTL_MORE_FRAMES | IEEE80211_TX_CTL_LDPC | \
IEEE80211_TX_CTL_STBC | IEEE80211_TX_STATUS_EOSP)
-@@ -1634,7 +1634,7 @@ void ieee80211_free_txskb(struct ieee802
+@@ -659,6 +659,8 @@ ieee80211_tx_info_clear_status(struct ie
+ * @RX_FLAG_HT: HT MCS was used and rate_idx is MCS index
+ * @RX_FLAG_40MHZ: HT40 (40 MHz) was used
+ * @RX_FLAG_SHORT_GI: Short guard interval was used
++ * @RX_FLAG_NO_SIGNAL_VAL: The signal strength value is not present.
++ * Valid only for data frames (mainly A-MPDU)
+ */
+ enum mac80211_rx_flags {
+ RX_FLAG_MMIC_ERROR = 1<<0,
+@@ -672,6 +674,7 @@ enum mac80211_rx_flags {
+ RX_FLAG_HT = 1<<9,
+ RX_FLAG_40MHZ = 1<<10,
+ RX_FLAG_SHORT_GI = 1<<11,
++ RX_FLAG_NO_SIGNAL_VAL = 1<<12,
+ };
+
+ /**
+@@ -1634,7 +1637,7 @@ void ieee80211_free_txskb(struct ieee802
* the station sends a PS-Poll or a uAPSD trigger frame, mac80211
* will inform the driver of this with the @allow_buffered_frames
* callback; this callback is optional. mac80211 will then transmit
@@ -139,7 +185,7 @@
* on each frame. The last frame in the service period (or the only
* response to a PS-Poll) also has %IEEE80211_TX_STATUS_EOSP set to
* indicate that it ends the service period; as this frame must have
-@@ -1642,6 +1642,9 @@ void ieee80211_free_txskb(struct ieee802
+@@ -1642,6 +1645,9 @@ void ieee80211_free_txskb(struct ieee802
* When TX status is reported for this frame, the service period is
* marked has having ended and a new one can be started by the peer.
*
@@ -149,7 +195,7 @@
* Another race condition can happen on some devices like iwlwifi
* when there are frames queued for the station and it wakes up
* or polls; the frames that are already queued could end up being
-@@ -2140,7 +2143,7 @@ enum ieee80211_frame_release_type {
+@@ -2140,7 +2146,7 @@ enum ieee80211_frame_release_type {
* @allow_buffered_frames: Prepare device to allow the given number of frames
* to go out to the given station. The frames will be sent by mac80211
* via the usual TX path after this call. The TX information for frames
@@ -337,7 +383,17 @@
break;
--- a/net/mac80211/rx.c
+++ b/net/mac80211/rx.c
-@@ -489,12 +489,12 @@ ieee80211_rx_mesh_check(struct ieee80211
+@@ -177,7 +177,8 @@ ieee80211_add_rx_radiotap_header(struct
+ pos += 2;
+
+ /* IEEE80211_RADIOTAP_DBM_ANTSIGNAL */
+- if (local->hw.flags & IEEE80211_HW_SIGNAL_DBM) {
++ if (local->hw.flags & IEEE80211_HW_SIGNAL_DBM &&
++ !(status->flag & RX_FLAG_NO_SIGNAL_VAL)) {
+ *pos = status->signal;
+ rthdr->it_present |=
+ cpu_to_le32(1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL);
+@@ -489,12 +490,12 @@ ieee80211_rx_mesh_check(struct ieee80211
if (ieee80211_has_tods(hdr->frame_control) ||
!ieee80211_has_fromds(hdr->frame_control))
return RX_DROP_MONITOR;
@@ -352,7 +408,20 @@
return RX_DROP_MONITOR;
}
}
-@@ -2282,6 +2282,7 @@ ieee80211_rx_h_action(struct ieee80211_r
+@@ -1309,8 +1310,10 @@ ieee80211_rx_h_sta_process(struct ieee80
+
+ sta->rx_fragments++;
+ sta->rx_bytes += rx->skb->len;
+- sta->last_signal = status->signal;
+- ewma_add(&sta->avg_signal, -status->signal);
++ if (!(status->flag & RX_FLAG_NO_SIGNAL_VAL)) {
++ sta->last_signal = status->signal;
++ ewma_add(&sta->avg_signal, -status->signal);
++ }
+
+ /*
+ * Change STA power saving mode only at the end of a frame
+@@ -2282,6 +2285,7 @@ ieee80211_rx_h_action(struct ieee80211_r
sdata->vif.type != NL80211_IFTYPE_MESH_POINT &&
sdata->vif.type != NL80211_IFTYPE_AP_VLAN &&
sdata->vif.type != NL80211_IFTYPE_AP &&
@@ -360,7 +429,7 @@
sdata->vif.type != NL80211_IFTYPE_ADHOC)
break;
-@@ -2336,7 +2337,7 @@ ieee80211_rx_h_action(struct ieee80211_r
+@@ -2336,7 +2340,7 @@ ieee80211_rx_h_action(struct ieee80211_r
if (sdata->vif.type != NL80211_IFTYPE_STATION)
break;
@@ -369,7 +438,7 @@
break;
goto queue;
-@@ -2492,14 +2493,15 @@ ieee80211_rx_h_mgmt(struct ieee80211_rx_
+@@ -2492,14 +2496,15 @@ ieee80211_rx_h_mgmt(struct ieee80211_rx_
if (!ieee80211_vif_is_mesh(&sdata->vif) &&
sdata->vif.type != NL80211_IFTYPE_ADHOC &&
@@ -387,7 +456,7 @@
break;
case cpu_to_le16(IEEE80211_STYPE_ASSOC_RESP):
case cpu_to_le16(IEEE80211_STYPE_REASSOC_RESP):
-@@ -2853,10 +2855,16 @@ static int prepare_for_handlers(struct i
+@@ -2853,10 +2858,16 @@ static int prepare_for_handlers(struct i
}
break;
case NL80211_IFTYPE_WDS:
@@ -1140,3 +1209,218 @@
tasklet_init(&sc->intr_tq, ath9k_tasklet, (unsigned long)sc);
tasklet_init(&sc->bcon_tasklet, ath_beacon_tasklet,
(unsigned long)sc);
+--- a/drivers/net/wireless/ath/ath9k/hw.c
++++ b/drivers/net/wireless/ath/ath9k/hw.c
+@@ -1386,10 +1386,16 @@ static bool ath9k_hw_set_reset_reg(struc
+ static bool ath9k_hw_chip_reset(struct ath_hw *ah,
+ struct ath9k_channel *chan)
+ {
+- if (AR_SREV_9280(ah) && ah->eep_ops->get_eeprom(ah, EEP_OL_PWRCTRL)) {
+- if (!ath9k_hw_set_reset_reg(ah, ATH9K_RESET_POWER_ON))
+- return false;
+- } else if (!ath9k_hw_set_reset_reg(ah, ATH9K_RESET_WARM))
++ int reset_type = ATH9K_RESET_WARM;
++
++ if (AR_SREV_9280(ah)) {
++ if (ah->eep_ops->get_eeprom(ah, EEP_OL_PWRCTRL))
++ reset_type = ATH9K_RESET_POWER_ON;
++ else
++ reset_type = ATH9K_RESET_COLD;
++ }
++
++ if (!ath9k_hw_set_reset_reg(ah, reset_type))
+ return false;
+
+ if (!ath9k_hw_setpower(ah, ATH9K_PM_AWAKE))
+--- a/drivers/net/wireless/ath/ath5k/base.c
++++ b/drivers/net/wireless/ath/ath5k/base.c
+@@ -2330,15 +2330,6 @@ ath5k_calibrate_work(struct work_struct
+ "got new rfgain, resetting\n");
+ ieee80211_queue_work(ah->hw, &ah->reset_work);
+ }
+-
+- /* TODO: On full calibration we should stop TX here,
+- * so that it doesn't interfere (mostly due to gain_f
+- * calibration that messes with tx packets -see phy.c).
+- *
+- * NOTE: Stopping the queues from above is not enough
+- * to stop TX but saves us from disconecting (at least
+- * we don't lose packets). */
+- ieee80211_stop_queues(ah->hw);
+ } else
+ ah->ah_cal_mask |= AR5K_CALIBRATION_SHORT;
+
+@@ -2353,10 +2344,9 @@ ath5k_calibrate_work(struct work_struct
+ ah->curchan->center_freq));
+
+ /* Clear calibration flags */
+- if (ah->ah_cal_mask & AR5K_CALIBRATION_FULL) {
+- ieee80211_wake_queues(ah->hw);
++ if (ah->ah_cal_mask & AR5K_CALIBRATION_FULL)
+ ah->ah_cal_mask &= ~AR5K_CALIBRATION_FULL;
+- } else if (ah->ah_cal_mask & AR5K_CALIBRATION_SHORT)
++ else if (ah->ah_cal_mask & AR5K_CALIBRATION_SHORT)
+ ah->ah_cal_mask &= ~AR5K_CALIBRATION_SHORT;
+ }
+
+--- a/drivers/net/wireless/ath/ath5k/phy.c
++++ b/drivers/net/wireless/ath/ath5k/phy.c
+@@ -1871,31 +1871,15 @@ ath5k_hw_phy_calibrate(struct ath5k_hw *
+ ret = 0;
+ }
+
+- /* On full calibration do an AGC calibration and
+- * request a PAPD probe for gainf calibration if
+- * needed */
+- if (ah->ah_cal_mask & AR5K_CALIBRATION_FULL) {
++ /* On full calibration request a PAPD probe for
++ * gainf calibration if needed */
++ if ((ah->ah_cal_mask & AR5K_CALIBRATION_FULL) &&
++ (ah->ah_radio == AR5K_RF5111 ||
++ ah->ah_radio == AR5K_RF5112) &&
++ channel->hw_value != AR5K_MODE_11B)
++ ath5k_hw_request_rfgain_probe(ah);
+
+- AR5K_REG_ENABLE_BITS(ah, AR5K_PHY_AGCCTL,
+- AR5K_PHY_AGCCTL_CAL);
+-
+- ret = ath5k_hw_register_timeout(ah, AR5K_PHY_AGCCTL,
+- AR5K_PHY_AGCCTL_CAL | AR5K_PHY_AGCCTL_NF,
+- 0, false);
+- if (ret) {
+- ATH5K_ERR(ah,
+- "gain calibration timeout (%uMHz)\n",
+- channel->center_freq);
+- }
+-
+- if ((ah->ah_radio == AR5K_RF5111 ||
+- ah->ah_radio == AR5K_RF5112)
+- && (channel->hw_value != AR5K_MODE_11B))
+- ath5k_hw_request_rfgain_probe(ah);
+- }
+-
+- /* Update noise floor
+- * XXX: Only do this after AGC calibration */
++ /* Update noise floor */
+ if (!(ah->ah_cal_mask & AR5K_CALIBRATION_NF))
+ ath5k_hw_update_noise_floor(ah);
+
+--- a/drivers/net/wireless/ath/ath9k/recv.c
++++ b/drivers/net/wireless/ath/ath9k/recv.c
+@@ -954,6 +954,7 @@ static void ath9k_process_rssi(struct at
+ struct ath_softc *sc = hw->priv;
+ struct ath_hw *ah = common->ah;
+ int last_rssi;
++ int rssi = rx_stats->rs_rssi;
+
+ if (!rx_stats->is_mybeacon ||
+ ((ah->opmode != NL80211_IFTYPE_STATION) &&
+@@ -965,13 +966,12 @@ static void ath9k_process_rssi(struct at
+
+ last_rssi = sc->last_rssi;
+ if (likely(last_rssi != ATH_RSSI_DUMMY_MARKER))
+- rx_stats->rs_rssi = ATH_EP_RND(last_rssi,
+- ATH_RSSI_EP_MULTIPLIER);
+- if (rx_stats->rs_rssi < 0)
+- rx_stats->rs_rssi = 0;
++ rssi = ATH_EP_RND(last_rssi, ATH_RSSI_EP_MULTIPLIER);
++ if (rssi < 0)
++ rssi = 0;
+
+ /* Update Beacon RSSI, this is used by ANI. */
+- ah->stats.avgbrssi = rx_stats->rs_rssi;
++ ah->stats.avgbrssi = rssi;
+ }
+
+ /*
+@@ -1011,6 +1011,8 @@ static int ath9k_rx_skb_preprocess(struc
+ rx_status->signal = ah->noise + rx_stats->rs_rssi;
+ rx_status->antenna = rx_stats->rs_antenna;
+ rx_status->flag |= RX_FLAG_MACTIME_MPDU;
++ if (rx_stats->rs_moreaggr)
++ rx_status->flag |= RX_FLAG_NO_SIGNAL_VAL;
+
+ return 0;
+ }
+--- a/drivers/net/wireless/ath/ath9k/beacon.c
++++ b/drivers/net/wireless/ath/ath9k/beacon.c
+@@ -91,7 +91,7 @@ static void ath_beacon_setup(struct ath_
+ info.txpower = MAX_RATE_POWER;
+ info.keyix = ATH9K_TXKEYIX_INVALID;
+ info.keytype = ATH9K_KEY_TYPE_CLEAR;
+- info.flags = ATH9K_TXDESC_NOACK;
++ info.flags = ATH9K_TXDESC_NOACK | ATH9K_TXDESC_INTREQ;
+
+ info.buf_addr[0] = bf->bf_buf_addr;
+ info.buf_len[0] = roundup(skb->len, 4);
+@@ -355,7 +355,6 @@ void ath_beacon_tasklet(unsigned long da
+ struct ath_common *common = ath9k_hw_common(ah);
+ struct ath_buf *bf = NULL;
+ struct ieee80211_vif *vif;
+- struct ath_tx_status ts;
+ bool edma = !!(ah->caps.hw_caps & ATH9K_HW_CAP_EDMA);
+ int slot;
+ u32 bfaddr, bc = 0;
+@@ -462,11 +461,6 @@ void ath_beacon_tasklet(unsigned long da
+ ath9k_hw_txstart(ah, sc->beacon.beaconq);
+
+ sc->beacon.ast_be_xmit += bc; /* XXX per-vif? */
+- if (edma) {
+- spin_lock_bh(&sc->sc_pcu_lock);
+- ath9k_hw_txprocdesc(ah, bf->bf_desc, (void *)&ts);
+- spin_unlock_bh(&sc->sc_pcu_lock);
+- }
+ }
+ }
+
+--- a/drivers/net/wireless/ath/ath9k/mac.c
++++ b/drivers/net/wireless/ath/ath9k/mac.c
+@@ -745,7 +745,11 @@ int ath9k_hw_beaconq_setup(struct ath_hw
+ qi.tqi_aifs = 1;
+ qi.tqi_cwmin = 0;
+ qi.tqi_cwmax = 0;
+- /* NB: don't enable any interrupts */
++
++ if (ah->caps.hw_caps & ATH9K_HW_CAP_EDMA)
++ qi.tqi_qflags = TXQ_FLAG_TXOKINT_ENABLE |
++ TXQ_FLAG_TXERRINT_ENABLE;
++
+ return ath9k_hw_setuptxqueue(ah, ATH9K_TX_QUEUE_BEACON, &qi);
+ }
+ EXPORT_SYMBOL(ath9k_hw_beaconq_setup);
+--- a/drivers/net/wireless/ath/ath9k/main.c
++++ b/drivers/net/wireless/ath/ath9k/main.c
+@@ -2300,6 +2300,7 @@ static int ath9k_tx_last_beacon(struct i
+ struct ath_vif *avp;
+ struct ath_buf *bf;
+ struct ath_tx_status ts;
++ bool edma = !!(ah->caps.hw_caps & ATH9K_HW_CAP_EDMA);
+ int status;
+
+ vif = sc->beacon.bslot[0];
+@@ -2310,7 +2311,7 @@ static int ath9k_tx_last_beacon(struct i
+ if (!avp->is_bslot_active)
+ return 0;
+
+- if (!sc->beacon.tx_processed) {
++ if (!sc->beacon.tx_processed && !edma) {
+ tasklet_disable(&sc->bcon_tasklet);
+
+ bf = avp->av_bcbuf;
+--- a/drivers/net/wireless/ath/ath9k/xmit.c
++++ b/drivers/net/wireless/ath/ath9k/xmit.c
+@@ -2296,9 +2296,12 @@ void ath_tx_edma_tasklet(struct ath_soft
+ break;
+ }
+
+- /* Skip beacon completions */
+- if (ts.qid == sc->beacon.beaconq)
++ /* Process beacon completions separately */
++ if (ts.qid == sc->beacon.beaconq) {
++ sc->beacon.tx_processed = true;
++ sc->beacon.tx_last = !(ts.ts_status & ATH9K_TXERR_MASK);
+ continue;
++ }
+
+ txq = &sc->tx.txq[ts.qid];
+
diff --git a/package/mac80211/patches/440-ath5k_calibrate_no_queue_stop.patch b/package/mac80211/patches/440-ath5k_calibrate_no_queue_stop.patch
deleted file mode 100644
index 3751c531ba..0000000000
--- a/package/mac80211/patches/440-ath5k_calibrate_no_queue_stop.patch
+++ /dev/null
@@ -1,31 +0,0 @@
---- a/drivers/net/wireless/ath/ath5k/base.c
-+++ b/drivers/net/wireless/ath/ath5k/base.c
-@@ -2330,15 +2330,6 @@ ath5k_calibrate_work(struct work_struct
- "got new rfgain, resetting\n");
- ieee80211_queue_work(ah->hw, &ah->reset_work);
- }
--
-- /* TODO: On full calibration we should stop TX here,
-- * so that it doesn't interfere (mostly due to gain_f
-- * calibration that messes with tx packets -see phy.c).
-- *
-- * NOTE: Stopping the queues from above is not enough
-- * to stop TX but saves us from disconecting (at least
-- * we don't lose packets). */
-- ieee80211_stop_queues(ah->hw);
- } else
- ah->ah_cal_mask |= AR5K_CALIBRATION_SHORT;
-
-@@ -2353,10 +2344,9 @@ ath5k_calibrate_work(struct work_struct
- ah->curchan->center_freq));
-
- /* Clear calibration flags */
-- if (ah->ah_cal_mask & AR5K_CALIBRATION_FULL) {
-- ieee80211_wake_queues(ah->hw);
-+ if (ah->ah_cal_mask & AR5K_CALIBRATION_FULL)
- ah->ah_cal_mask &= ~AR5K_CALIBRATION_FULL;
-- } else if (ah->ah_cal_mask & AR5K_CALIBRATION_SHORT)
-+ else if (ah->ah_cal_mask & AR5K_CALIBRATION_SHORT)
- ah->ah_cal_mask &= ~AR5K_CALIBRATION_SHORT;
- }
-
diff --git a/package/mac80211/patches/441-ath5k_no_agc_recalibration.patch b/package/mac80211/patches/441-ath5k_no_agc_recalibration.patch
deleted file mode 100644
index 87d0743d32..0000000000
--- a/package/mac80211/patches/441-ath5k_no_agc_recalibration.patch
+++ /dev/null
@@ -1,42 +0,0 @@
---- a/drivers/net/wireless/ath/ath5k/phy.c
-+++ b/drivers/net/wireless/ath/ath5k/phy.c
-@@ -1871,31 +1871,15 @@ ath5k_hw_phy_calibrate(struct ath5k_hw *
- ret = 0;
- }
-
-- /* On full calibration do an AGC calibration and
-- * request a PAPD probe for gainf calibration if
-- * needed */
-- if (ah->ah_cal_mask & AR5K_CALIBRATION_FULL) {
-+ /* On full calibration request a PAPD probe for
-+ * gainf calibration if needed */
-+ if ((ah->ah_cal_mask & AR5K_CALIBRATION_FULL) &&
-+ (ah->ah_radio == AR5K_RF5111 ||
-+ ah->ah_radio == AR5K_RF5112) &&
-+ channel->hw_value != AR5K_MODE_11B)
-+ ath5k_hw_request_rfgain_probe(ah);
-
-- AR5K_REG_ENABLE_BITS(ah, AR5K_PHY_AGCCTL,
-- AR5K_PHY_AGCCTL_CAL);
--
-- ret = ath5k_hw_register_timeout(ah, AR5K_PHY_AGCCTL,
-- AR5K_PHY_AGCCTL_CAL | AR5K_PHY_AGCCTL_NF,
-- 0, false);
-- if (ret) {
-- ATH5K_ERR(ah,
-- "gain calibration timeout (%uMHz)\n",
-- channel->center_freq);
-- }
--
-- if ((ah->ah_radio == AR5K_RF5111 ||
-- ah->ah_radio == AR5K_RF5112)
-- && (channel->hw_value != AR5K_MODE_11B))
-- ath5k_hw_request_rfgain_probe(ah);
-- }
--
-- /* Update noise floor
-- * XXX: Only do this after AGC calibration */
-+ /* Update noise floor */
- if (!(ah->ah_cal_mask & AR5K_CALIBRATION_NF))
- ath5k_hw_update_noise_floor(ah);
-
diff --git a/package/mac80211/patches/510-ath9k_intr_mitigation_tweak.patch b/package/mac80211/patches/510-ath9k_intr_mitigation_tweak.patch
index 092ab5714a..aee38d167d 100644
--- a/package/mac80211/patches/510-ath9k_intr_mitigation_tweak.patch
+++ b/package/mac80211/patches/510-ath9k_intr_mitigation_tweak.patch
@@ -1,6 +1,6 @@
--- a/drivers/net/wireless/ath/ath9k/hw.c
+++ b/drivers/net/wireless/ath/ath9k/hw.c
-@@ -1745,8 +1745,8 @@ int ath9k_hw_reset(struct ath_hw *ah, st
+@@ -1751,8 +1751,8 @@ int ath9k_hw_reset(struct ath_hw *ah, st
REG_WRITE(ah, AR_OBS, 8);
if (ah->config.rx_intr_mitigation) {
diff --git a/package/mac80211/patches/513-ath9k_channelbw_debugfs.patch b/package/mac80211/patches/513-ath9k_channelbw_debugfs.patch
index 99ba153c5a..34e5ea1601 100644
--- a/package/mac80211/patches/513-ath9k_channelbw_debugfs.patch
+++ b/package/mac80211/patches/513-ath9k_channelbw_debugfs.patch
@@ -128,7 +128,7 @@
return -EINVAL;
--- a/drivers/net/wireless/ath/ath9k/hw.c
+++ b/drivers/net/wireless/ath/ath9k/hw.c
-@@ -1570,6 +1570,10 @@ int ath9k_hw_reset(struct ath_hw *ah, st
+@@ -1576,6 +1576,10 @@ int ath9k_hw_reset(struct ath_hw *ah, st
caldata->rtt_hist.num_readings)
allow_fbs = true;
diff --git a/package/mac80211/patches/530-mac80211_cur_txpower.patch b/package/mac80211/patches/530-mac80211_cur_txpower.patch
index c7f901bfa2..3363fe27e6 100644
--- a/package/mac80211/patches/530-mac80211_cur_txpower.patch
+++ b/package/mac80211/patches/530-mac80211_cur_txpower.patch
@@ -1,6 +1,6 @@
--- a/include/net/mac80211.h
+++ b/include/net/mac80211.h
-@@ -816,7 +816,7 @@ enum ieee80211_smps_mode {
+@@ -819,7 +819,7 @@ enum ieee80211_smps_mode {
*/
struct ieee80211_conf {
u32 flags;
diff --git a/package/mac80211/patches/541-ath9k_ar9280_cold_reset.patch b/package/mac80211/patches/541-ath9k_ar9280_cold_reset.patch
deleted file mode 100644
index d6146e50a0..0000000000
--- a/package/mac80211/patches/541-ath9k_ar9280_cold_reset.patch
+++ /dev/null
@@ -1,23 +0,0 @@
---- a/drivers/net/wireless/ath/ath9k/hw.c
-+++ b/drivers/net/wireless/ath/ath9k/hw.c
-@@ -1395,10 +1395,16 @@ static bool ath9k_hw_set_reset_reg(struc
- static bool ath9k_hw_chip_reset(struct ath_hw *ah,
- struct ath9k_channel *chan)
- {
-- if (AR_SREV_9280(ah) && ah->eep_ops->get_eeprom(ah, EEP_OL_PWRCTRL)) {
-- if (!ath9k_hw_set_reset_reg(ah, ATH9K_RESET_POWER_ON))
-- return false;
-- } else if (!ath9k_hw_set_reset_reg(ah, ATH9K_RESET_WARM))
-+ int reset_type = ATH9K_RESET_WARM;
-+
-+ if (AR_SREV_9280(ah)) {
-+ if (ah->eep_ops->get_eeprom(ah, EEP_OL_PWRCTRL))
-+ reset_type = ATH9K_RESET_POWER_ON;
-+ else
-+ reset_type = ATH9K_RESET_COLD;
-+ }
-+
-+ if (!ath9k_hw_set_reset_reg(ah, reset_type))
- return false;
-
- if (!ath9k_hw_setpower(ah, ATH9K_PM_AWAKE))
diff --git a/package/mac80211/patches/570-ath9k_fix_initvals.patch b/package/mac80211/patches/545-ath9k_fix_initvals.patch
index 664fa1e897..664fa1e897 100644
--- a/package/mac80211/patches/570-ath9k_fix_initvals.patch
+++ b/package/mac80211/patches/545-ath9k_fix_initvals.patch
diff --git a/package/mac80211/patches/551-ath9k_per_chain_signal_strength.patch b/package/mac80211/patches/551-ath9k_per_chain_signal_strength.patch
index 6b4857ba14..75d2a34e5b 100644
--- a/package/mac80211/patches/551-ath9k_per_chain_signal_strength.patch
+++ b/package/mac80211/patches/551-ath9k_per_chain_signal_strength.patch
@@ -1,6 +1,6 @@
--- a/include/net/mac80211.h
+++ b/include/net/mac80211.h
-@@ -684,6 +684,9 @@ enum mac80211_rx_flags {
+@@ -687,6 +687,9 @@ enum mac80211_rx_flags {
* @mactime: value in microseconds of the 64-bit Time Synchronization Function
* (TSF) timer when the first data symbol (MPDU) arrived at the hardware.
* @band: the active band when this frame was received
@@ -10,7 +10,7 @@
* @freq: frequency the radio was tuned to when receiving this frame, in MHz
* @signal: signal strength when receiving this frame, either in dBm, in dB or
* unspecified depending on the hardware capabilities flags
-@@ -697,6 +700,10 @@ enum mac80211_rx_flags {
+@@ -700,6 +703,10 @@ enum mac80211_rx_flags {
struct ieee80211_rx_status {
u64 mactime;
enum ieee80211_band band;
@@ -37,7 +37,7 @@
--- a/net/mac80211/rx.c
+++ b/net/mac80211/rx.c
-@@ -1270,6 +1270,7 @@ ieee80211_rx_h_sta_process(struct ieee80
+@@ -1271,6 +1271,7 @@ ieee80211_rx_h_sta_process(struct ieee80
struct sk_buff *skb = rx->skb;
struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
@@ -45,9 +45,9 @@
if (!sta)
return RX_CONTINUE;
-@@ -1312,6 +1313,19 @@ ieee80211_rx_h_sta_process(struct ieee80
- sta->last_signal = status->signal;
- ewma_add(&sta->avg_signal, -status->signal);
+@@ -1315,6 +1316,19 @@ ieee80211_rx_h_sta_process(struct ieee80
+ ewma_add(&sta->avg_signal, -status->signal);
+ }
+ if (status->chains) {
+ sta->chains = status->chains;
@@ -147,9 +147,9 @@
memset(rx_status, 0, sizeof(struct ieee80211_rx_status));
-@@ -1012,6 +1013,20 @@ static int ath9k_rx_skb_preprocess(struc
- rx_status->antenna = rx_stats->rs_antenna;
- rx_status->flag |= RX_FLAG_MACTIME_MPDU;
+@@ -1014,6 +1015,20 @@ static int ath9k_rx_skb_preprocess(struc
+ if (rx_stats->rs_moreaggr)
+ rx_status->flag |= RX_FLAG_NO_SIGNAL_VAL;
+ for (i = 0, j = 0; i < ARRAY_SIZE(rx_stats->rs_rssi_ctl); i++) {
+ s8 rssi;
@@ -168,7 +168,7 @@
return 0;
}
-@@ -1542,14 +1557,14 @@ static void ath_ant_comb_scan(struct ath
+@@ -1544,14 +1559,14 @@ static void ath_ant_comb_scan(struct ath
struct ath_ant_comb *antcomb = &sc->ant_comb;
int alt_ratio = 0, alt_rssi_avg = 0, main_rssi_avg = 0, curr_alt_set;
int curr_main_set;
@@ -189,7 +189,7 @@
/* Record packet only when both main_rssi and alt_rssi is positive */
--- a/drivers/net/wireless/ath/ath9k/ar9003_mac.c
+++ b/drivers/net/wireless/ath/ath9k/ar9003_mac.c
-@@ -463,12 +463,12 @@ int ath9k_hw_process_rxdesc_edma(struct
+@@ -459,12 +459,12 @@ int ath9k_hw_process_rxdesc_edma(struct
/* XXX: Keycache */
rxs->rs_rssi = MS(rxsp->status5, AR_RxRSSICombined);
diff --git a/package/mac80211/patches/571-ath9k_beacon_fix.patch b/package/mac80211/patches/571-ath9k_beacon_fix.patch
deleted file mode 100644
index 96b80600fa..0000000000
--- a/package/mac80211/patches/571-ath9k_beacon_fix.patch
+++ /dev/null
@@ -1,113 +0,0 @@
---- a/drivers/net/wireless/ath/ath9k/ar9003_mac.c
-+++ b/drivers/net/wireless/ath/ath9k/ar9003_mac.c
-@@ -326,7 +326,6 @@ static bool ar9003_hw_get_isr(struct ath
- static int ar9003_hw_proc_txdesc(struct ath_hw *ah, void *ds,
- struct ath_tx_status *ts)
- {
-- struct ar9003_txc *txc = (struct ar9003_txc *) ds;
- struct ar9003_txs *ads;
- u32 status;
-
-@@ -336,11 +335,7 @@ static int ar9003_hw_proc_txdesc(struct
- if ((status & AR_TxDone) == 0)
- return -EINPROGRESS;
-
-- ts->qid = MS(ads->ds_info, AR_TxQcuNum);
-- if (!txc || (MS(txc->info, AR_TxQcuNum) == ts->qid))
-- ah->ts_tail = (ah->ts_tail + 1) % ah->ts_size;
-- else
-- return -ENOENT;
-+ ah->ts_tail = (ah->ts_tail + 1) % ah->ts_size;
-
- if ((MS(ads->ds_info, AR_DescId) != ATHEROS_VENDOR_ID) ||
- (MS(ads->ds_info, AR_TxRxDesc) != 1)) {
-@@ -354,6 +349,7 @@ static int ar9003_hw_proc_txdesc(struct
- ts->ts_seqnum = MS(status, AR_SeqNum);
- ts->tid = MS(status, AR_TxTid);
-
-+ ts->qid = MS(ads->ds_info, AR_TxQcuNum);
- ts->desc_id = MS(ads->status1, AR_TxDescId);
- ts->ts_tstamp = ads->status4;
- ts->ts_status = 0;
---- a/drivers/net/wireless/ath/ath9k/beacon.c
-+++ b/drivers/net/wireless/ath/ath9k/beacon.c
-@@ -91,7 +91,7 @@ static void ath_beacon_setup(struct ath_
- info.txpower = MAX_RATE_POWER;
- info.keyix = ATH9K_TXKEYIX_INVALID;
- info.keytype = ATH9K_KEY_TYPE_CLEAR;
-- info.flags = ATH9K_TXDESC_NOACK;
-+ info.flags = ATH9K_TXDESC_NOACK | ATH9K_TXDESC_INTREQ;
-
- info.buf_addr[0] = bf->bf_buf_addr;
- info.buf_len[0] = roundup(skb->len, 4);
-@@ -355,7 +355,6 @@ void ath_beacon_tasklet(unsigned long da
- struct ath_common *common = ath9k_hw_common(ah);
- struct ath_buf *bf = NULL;
- struct ieee80211_vif *vif;
-- struct ath_tx_status ts;
- bool edma = !!(ah->caps.hw_caps & ATH9K_HW_CAP_EDMA);
- int slot;
- u32 bfaddr, bc = 0;
-@@ -462,11 +461,6 @@ void ath_beacon_tasklet(unsigned long da
- ath9k_hw_txstart(ah, sc->beacon.beaconq);
-
- sc->beacon.ast_be_xmit += bc; /* XXX per-vif? */
-- if (edma) {
-- spin_lock_bh(&sc->sc_pcu_lock);
-- ath9k_hw_txprocdesc(ah, bf->bf_desc, (void *)&ts);
-- spin_unlock_bh(&sc->sc_pcu_lock);
-- }
- }
- }
-
---- a/drivers/net/wireless/ath/ath9k/mac.c
-+++ b/drivers/net/wireless/ath/ath9k/mac.c
-@@ -745,7 +745,11 @@ int ath9k_hw_beaconq_setup(struct ath_hw
- qi.tqi_aifs = 1;
- qi.tqi_cwmin = 0;
- qi.tqi_cwmax = 0;
-- /* NB: don't enable any interrupts */
-+
-+ if (ah->caps.hw_caps & ATH9K_HW_CAP_EDMA)
-+ qi.tqi_qflags = TXQ_FLAG_TXOKINT_ENABLE |
-+ TXQ_FLAG_TXERRINT_ENABLE;
-+
- return ath9k_hw_setuptxqueue(ah, ATH9K_TX_QUEUE_BEACON, &qi);
- }
- EXPORT_SYMBOL(ath9k_hw_beaconq_setup);
---- a/drivers/net/wireless/ath/ath9k/main.c
-+++ b/drivers/net/wireless/ath/ath9k/main.c
-@@ -2303,6 +2303,7 @@ static int ath9k_tx_last_beacon(struct i
- struct ath_vif *avp;
- struct ath_buf *bf;
- struct ath_tx_status ts;
-+ bool edma = !!(ah->caps.hw_caps & ATH9K_HW_CAP_EDMA);
- int status;
-
- vif = sc->beacon.bslot[0];
-@@ -2313,7 +2314,7 @@ static int ath9k_tx_last_beacon(struct i
- if (!avp->is_bslot_active)
- return 0;
-
-- if (!sc->beacon.tx_processed) {
-+ if (!sc->beacon.tx_processed && !edma) {
- tasklet_disable(&sc->bcon_tasklet);
-
- bf = avp->av_bcbuf;
---- a/drivers/net/wireless/ath/ath9k/xmit.c
-+++ b/drivers/net/wireless/ath/ath9k/xmit.c
-@@ -2317,9 +2317,12 @@ void ath_tx_edma_tasklet(struct ath_soft
- break;
- }
-
-- /* Skip beacon completions */
-- if (ts.qid == sc->beacon.beaconq)
-+ /* Process beacon completions separately */
-+ if (ts.qid == sc->beacon.beaconq) {
-+ sc->beacon.tx_processed = true;
-+ sc->beacon.tx_last = !(ts.ts_status & ATH9K_TXERR_MASK);
- continue;
-+ }
-
- txq = &sc->tx.txq[ts.qid];
-
diff --git a/package/mac80211/patches/580-mac80211_ignore_bad_signal_values.patch b/package/mac80211/patches/580-mac80211_ignore_bad_signal_values.patch
deleted file mode 100644
index cfc151629f..0000000000
--- a/package/mac80211/patches/580-mac80211_ignore_bad_signal_values.patch
+++ /dev/null
@@ -1,44 +0,0 @@
---- a/include/net/mac80211.h
-+++ b/include/net/mac80211.h
-@@ -659,6 +659,8 @@ ieee80211_tx_info_clear_status(struct ie
- * @RX_FLAG_HT: HT MCS was used and rate_idx is MCS index
- * @RX_FLAG_40MHZ: HT40 (40 MHz) was used
- * @RX_FLAG_SHORT_GI: Short guard interval was used
-+ * @RX_FLAG_NO_SIGNAL_VAL: The signal strength value is not present.
-+ * Valid only for data frames (mainly A-MPDU)
- */
- enum mac80211_rx_flags {
- RX_FLAG_MMIC_ERROR = 1<<0,
-@@ -672,6 +674,7 @@ enum mac80211_rx_flags {
- RX_FLAG_HT = 1<<9,
- RX_FLAG_40MHZ = 1<<10,
- RX_FLAG_SHORT_GI = 1<<11,
-+ RX_FLAG_NO_SIGNAL_VAL = 1<<12,
- };
-
- /**
---- a/net/mac80211/rx.c
-+++ b/net/mac80211/rx.c
-@@ -177,7 +177,8 @@ ieee80211_add_rx_radiotap_header(struct
- pos += 2;
-
- /* IEEE80211_RADIOTAP_DBM_ANTSIGNAL */
-- if (local->hw.flags & IEEE80211_HW_SIGNAL_DBM) {
-+ if (local->hw.flags & IEEE80211_HW_SIGNAL_DBM &&
-+ !(status->flag & RX_FLAG_NO_SIGNAL_VAL)) {
- *pos = status->signal;
- rthdr->it_present |=
- cpu_to_le32(1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL);
-@@ -1310,8 +1311,10 @@ ieee80211_rx_h_sta_process(struct ieee80
-
- sta->rx_fragments++;
- sta->rx_bytes += rx->skb->len;
-- sta->last_signal = status->signal;
-- ewma_add(&sta->avg_signal, -status->signal);
-+ if (!(status->flag & RX_FLAG_NO_SIGNAL_VAL)) {
-+ sta->last_signal = status->signal;
-+ ewma_add(&sta->avg_signal, -status->signal);
-+ }
-
- if (status->chains) {
- sta->chains = status->chains;
diff --git a/package/mac80211/patches/581-ath9k_report_missing_signal.patch b/package/mac80211/patches/581-ath9k_report_missing_signal.patch
deleted file mode 100644
index 7bf12ebd61..0000000000
--- a/package/mac80211/patches/581-ath9k_report_missing_signal.patch
+++ /dev/null
@@ -1,37 +0,0 @@
---- a/drivers/net/wireless/ath/ath9k/recv.c
-+++ b/drivers/net/wireless/ath/ath9k/recv.c
-@@ -954,6 +954,7 @@ static void ath9k_process_rssi(struct at
- struct ath_softc *sc = hw->priv;
- struct ath_hw *ah = common->ah;
- int last_rssi;
-+ int rssi = rx_stats->rs_rssi;
-
- if (!rx_stats->is_mybeacon ||
- ((ah->opmode != NL80211_IFTYPE_STATION) &&
-@@ -965,13 +966,12 @@ static void ath9k_process_rssi(struct at
-
- last_rssi = sc->last_rssi;
- if (likely(last_rssi != ATH_RSSI_DUMMY_MARKER))
-- rx_stats->rs_rssi = ATH_EP_RND(last_rssi,
-- ATH_RSSI_EP_MULTIPLIER);
-- if (rx_stats->rs_rssi < 0)
-- rx_stats->rs_rssi = 0;
-+ rssi = ATH_EP_RND(last_rssi, ATH_RSSI_EP_MULTIPLIER);
-+ if (rssi < 0)
-+ rssi = 0;
-
- /* Update Beacon RSSI, this is used by ANI. */
-- ah->stats.avgbrssi = rx_stats->rs_rssi;
-+ ah->stats.avgbrssi = rssi;
- }
-
- /*
-@@ -1012,6 +1012,8 @@ static int ath9k_rx_skb_preprocess(struc
- rx_status->signal = ah->noise + rx_stats->rs_rssi;
- rx_status->antenna = rx_stats->rs_antenna;
- rx_status->flag |= RX_FLAG_MACTIME_MPDU;
-+ if (rx_stats->rs_moreaggr)
-+ rx_status->flag |= RX_FLAG_NO_SIGNAL_VAL;
-
- for (i = 0, j = 0; i < ARRAY_SIZE(rx_stats->rs_rssi_ctl); i++) {
- s8 rssi;