aboutsummaryrefslogtreecommitdiffstats
path: root/package/mac80211/patches/311-pending_work.patch
diff options
context:
space:
mode:
Diffstat (limited to 'package/mac80211/patches/311-pending_work.patch')
-rw-r--r--package/mac80211/patches/311-pending_work.patch273
1 files changed, 0 insertions, 273 deletions
diff --git a/package/mac80211/patches/311-pending_work.patch b/package/mac80211/patches/311-pending_work.patch
deleted file mode 100644
index 827f677b13..0000000000
--- a/package/mac80211/patches/311-pending_work.patch
+++ /dev/null
@@ -1,273 +0,0 @@
---- a/drivers/net/wireless/ath/ath9k/mac.c
-+++ b/drivers/net/wireless/ath/ath9k/mac.c
-@@ -766,14 +766,6 @@ void ath9k_hw_startpcureceive(struct ath
- }
- EXPORT_SYMBOL(ath9k_hw_startpcureceive);
-
--void ath9k_hw_stoppcurecv(struct ath_hw *ah)
--{
-- REG_SET_BIT(ah, AR_DIAG_SW, AR_DIAG_RX_DIS);
--
-- ath9k_hw_disable_mib_counters(ah);
--}
--EXPORT_SYMBOL(ath9k_hw_stoppcurecv);
--
- void ath9k_hw_abortpcurecv(struct ath_hw *ah)
- {
- REG_SET_BIT(ah, AR_DIAG_SW, AR_DIAG_RX_ABORT | AR_DIAG_RX_DIS);
---- a/drivers/net/wireless/ath/ath9k/mac.h
-+++ b/drivers/net/wireless/ath/ath9k/mac.h
-@@ -691,7 +691,6 @@ void ath9k_hw_setuprxdesc(struct ath_hw
- bool ath9k_hw_setrxabort(struct ath_hw *ah, bool set);
- void ath9k_hw_putrxbuf(struct ath_hw *ah, u32 rxdp);
- void ath9k_hw_startpcureceive(struct ath_hw *ah, bool is_scanning);
--void ath9k_hw_stoppcurecv(struct ath_hw *ah);
- void ath9k_hw_abortpcurecv(struct ath_hw *ah);
- bool ath9k_hw_stopdmarecv(struct ath_hw *ah);
- int ath9k_hw_beaconq_setup(struct ath_hw *ah);
---- a/drivers/net/wireless/ath/ath9k/recv.c
-+++ b/drivers/net/wireless/ath/ath9k/recv.c
-@@ -518,7 +518,7 @@ bool ath_stoprecv(struct ath_softc *sc)
- bool stopped;
-
- spin_lock_bh(&sc->rx.rxbuflock);
-- ath9k_hw_stoppcurecv(ah);
-+ ath9k_hw_abortpcurecv(ah);
- ath9k_hw_setrxfilter(ah, 0);
- stopped = ath9k_hw_stopdmarecv(ah);
-
---- a/drivers/net/wireless/ath/ath9k/xmit.c
-+++ b/drivers/net/wireless/ath/ath9k/xmit.c
-@@ -163,6 +163,7 @@ static void ath_tx_flush_tid(struct ath_
- bf = list_first_entry(&tid->buf_q, struct ath_buf, list);
- list_move_tail(&bf->list, &bf_head);
-
-+ spin_unlock_bh(&txq->axq_lock);
- fi = get_frame_info(bf->bf_mpdu);
- if (fi->retries) {
- ath_tx_update_baw(sc, tid, fi->seqno);
-@@ -170,6 +171,7 @@ static void ath_tx_flush_tid(struct ath_
- } else {
- ath_tx_send_normal(sc, txq, tid, &bf_head);
- }
-+ spin_lock_bh(&txq->axq_lock);
- }
-
- spin_unlock_bh(&txq->axq_lock);
---- a/net/mac80211/ieee80211_i.h
-+++ b/net/mac80211/ieee80211_i.h
-@@ -349,6 +349,7 @@ struct ieee80211_if_managed {
- struct work_struct chswitch_work;
- struct work_struct beacon_connection_loss_work;
-
-+ unsigned long beacon_timeout;
- unsigned long probe_timeout;
- int probe_send_count;
-
-@@ -1269,6 +1270,8 @@ void ieee80211_send_nullfunc(struct ieee
- int powersave);
- void ieee80211_sta_rx_notify(struct ieee80211_sub_if_data *sdata,
- struct ieee80211_hdr *hdr);
-+void ieee80211_sta_tx_notify(struct ieee80211_sub_if_data *sdata,
-+ struct ieee80211_hdr *hdr);
- void ieee80211_beacon_connection_loss_work(struct work_struct *work);
-
- void ieee80211_wake_queues_by_reason(struct ieee80211_hw *hw,
---- a/net/mac80211/mlme.c
-+++ b/net/mac80211/mlme.c
-@@ -28,13 +28,19 @@
- #include "rate.h"
- #include "led.h"
-
-+#define IEEE80211_MAX_NULLFUNC_TRIES 2
- #define IEEE80211_MAX_PROBE_TRIES 5
-
- /*
-- * beacon loss detection timeout
-- * XXX: should depend on beacon interval
-+ * Beacon loss timeout is calculated as N frames times the
-+ * advertised beacon interval. This may need to be somewhat
-+ * higher than what hardware might detect to account for
-+ * delays in the host processing frames. But since we also
-+ * probe on beacon miss before declaring the connection lost
-+ * default to what we want.
- */
--#define IEEE80211_BEACON_LOSS_TIME (2 * HZ)
-+#define IEEE80211_BEACON_LOSS_COUNT 7
-+
- /*
- * Time the connection can be idle before we probe
- * it to see if we can still talk to the AP.
-@@ -121,7 +127,7 @@ void ieee80211_sta_reset_beacon_monitor(
- return;
-
- mod_timer(&sdata->u.mgd.bcn_mon_timer,
-- round_jiffies_up(jiffies + IEEE80211_BEACON_LOSS_TIME));
-+ round_jiffies_up(jiffies + sdata->u.mgd.beacon_timeout));
- }
-
- void ieee80211_sta_reset_conn_monitor(struct ieee80211_sub_if_data *sdata)
-@@ -871,6 +877,9 @@ static void ieee80211_set_associated(str
- bss_info_changed |= ieee80211_handle_bss_capability(sdata,
- cbss->capability, bss->has_erp_value, bss->erp_value);
-
-+ sdata->u.mgd.beacon_timeout = usecs_to_jiffies(ieee80211_tu_to_usec(
-+ IEEE80211_BEACON_LOSS_COUNT * bss_conf->beacon_int));
-+
- sdata->u.mgd.associated = cbss;
- memcpy(sdata->u.mgd.bssid, cbss->bssid, ETH_ALEN);
-
-@@ -1026,6 +1035,51 @@ void ieee80211_sta_rx_notify(struct ieee
- ieee80211_sta_reset_conn_monitor(sdata);
- }
-
-+static void ieee80211_reset_ap_probe(struct ieee80211_sub_if_data *sdata)
-+{
-+ struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
-+
-+ if (!(ifmgd->flags & (IEEE80211_STA_BEACON_POLL |
-+ IEEE80211_STA_CONNECTION_POLL)))
-+ return;
-+
-+ ifmgd->flags &= ~(IEEE80211_STA_CONNECTION_POLL |
-+ IEEE80211_STA_BEACON_POLL);
-+ mutex_lock(&sdata->local->iflist_mtx);
-+ ieee80211_recalc_ps(sdata->local, -1);
-+ mutex_unlock(&sdata->local->iflist_mtx);
-+
-+ if (sdata->local->hw.flags & IEEE80211_HW_CONNECTION_MONITOR)
-+ return;
-+
-+ /*
-+ * We've received a probe response, but are not sure whether
-+ * we have or will be receiving any beacons or data, so let's
-+ * schedule the timers again, just in case.
-+ */
-+ ieee80211_sta_reset_beacon_monitor(sdata);
-+
-+ mod_timer(&ifmgd->conn_mon_timer,
-+ round_jiffies_up(jiffies +
-+ IEEE80211_CONNECTION_IDLE_TIME));
-+}
-+
-+void ieee80211_sta_tx_notify(struct ieee80211_sub_if_data *sdata,
-+ struct ieee80211_hdr *hdr)
-+{
-+ if (!ieee80211_is_data(hdr->frame_control) &&
-+ !ieee80211_is_nullfunc(hdr->frame_control))
-+ return;
-+
-+ ieee80211_sta_reset_conn_monitor(sdata);
-+
-+ if (ieee80211_is_nullfunc(hdr->frame_control) &&
-+ sdata->u.mgd.probe_send_count > 0) {
-+ sdata->u.mgd.probe_send_count = 0;
-+ ieee80211_queue_work(&sdata->local->hw, &sdata->work);
-+ }
-+}
-+
- static void ieee80211_mgd_probe_ap_send(struct ieee80211_sub_if_data *sdata)
- {
- struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
-@@ -1041,8 +1095,19 @@ static void ieee80211_mgd_probe_ap_send(
- if (ifmgd->probe_send_count >= unicast_limit)
- dst = NULL;
-
-- ssid = ieee80211_bss_get_ie(ifmgd->associated, WLAN_EID_SSID);
-- ieee80211_send_probe_req(sdata, dst, ssid + 2, ssid[1], NULL, 0);
-+ /*
-+ * When the hardware reports an accurate Tx ACK status, it's
-+ * better to send a nullfunc frame instead of a probe request,
-+ * as it will kick us off the AP quickly if we aren't associated
-+ * anymore. The timeout will be reset if the frame is ACKed by
-+ * the AP.
-+ */
-+ if (sdata->local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS)
-+ ieee80211_send_nullfunc(sdata->local, sdata, 0);
-+ else {
-+ ssid = ieee80211_bss_get_ie(ifmgd->associated, WLAN_EID_SSID);
-+ ieee80211_send_probe_req(sdata, dst, ssid + 2, ssid[1], NULL, 0);
-+ }
-
- ifmgd->probe_send_count++;
- ifmgd->probe_timeout = jiffies + IEEE80211_PROBE_WAIT;
-@@ -1509,29 +1574,8 @@ static void ieee80211_rx_mgmt_probe_resp
- ieee80211_rx_bss_info(sdata, mgmt, len, rx_status, &elems, false);
-
- if (ifmgd->associated &&
-- memcmp(mgmt->bssid, ifmgd->associated->bssid, ETH_ALEN) == 0 &&
-- ifmgd->flags & (IEEE80211_STA_BEACON_POLL |
-- IEEE80211_STA_CONNECTION_POLL)) {
-- ifmgd->flags &= ~(IEEE80211_STA_CONNECTION_POLL |
-- IEEE80211_STA_BEACON_POLL);
-- mutex_lock(&sdata->local->iflist_mtx);
-- ieee80211_recalc_ps(sdata->local, -1);
-- mutex_unlock(&sdata->local->iflist_mtx);
--
-- if (sdata->local->hw.flags & IEEE80211_HW_CONNECTION_MONITOR)
-- return;
--
-- /*
-- * We've received a probe response, but are not sure whether
-- * we have or will be receiving any beacons or data, so let's
-- * schedule the timers again, just in case.
-- */
-- ieee80211_sta_reset_beacon_monitor(sdata);
--
-- mod_timer(&ifmgd->conn_mon_timer,
-- round_jiffies_up(jiffies +
-- IEEE80211_CONNECTION_IDLE_TIME));
-- }
-+ memcmp(mgmt->bssid, ifmgd->associated->bssid, ETH_ALEN) == 0)
-+ ieee80211_reset_ap_probe(sdata);
- }
-
- /*
-@@ -1881,12 +1925,23 @@ void ieee80211_sta_work(struct ieee80211
- IEEE80211_STA_CONNECTION_POLL) &&
- ifmgd->associated) {
- u8 bssid[ETH_ALEN];
-+ int max_tries;
-+
-+ if (local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS)
-+ max_tries = IEEE80211_MAX_NULLFUNC_TRIES;
-+ else
-+ max_tries = IEEE80211_MAX_PROBE_TRIES;
-
- memcpy(bssid, ifmgd->associated->bssid, ETH_ALEN);
-- if (time_is_after_jiffies(ifmgd->probe_timeout))
-+
-+ /* ACK received for nullfunc probing frame */
-+ if (!ifmgd->probe_send_count)
-+ ieee80211_reset_ap_probe(sdata);
-+
-+ else if (time_is_after_jiffies(ifmgd->probe_timeout))
- run_again(ifmgd, ifmgd->probe_timeout);
-
-- else if (ifmgd->probe_send_count < IEEE80211_MAX_PROBE_TRIES) {
-+ else if (ifmgd->probe_send_count < max_tries) {
- #ifdef CONFIG_MAC80211_VERBOSE_DEBUG
- wiphy_debug(local->hw.wiphy,
- "%s: No probe response from AP %pM"
-@@ -2012,6 +2067,8 @@ void ieee80211_sta_restart(struct ieee80
- add_timer(&ifmgd->timer);
- if (test_and_clear_bit(TMR_RUNNING_CHANSW, &ifmgd->timers_running))
- add_timer(&ifmgd->chswitch_timer);
-+ ieee80211_sta_reset_beacon_monitor(sdata);
-+ ieee80211_send_nullfunc(sdata->local, sdata, 0);
- }
- #endif
-
---- a/net/mac80211/status.c
-+++ b/net/mac80211/status.c
-@@ -155,6 +155,10 @@ static void ieee80211_frame_acked(struct
-
- ieee80211_queue_work(&local->hw, &local->recalc_smps);
- }
-+
-+ if ((sdata->vif.type == NL80211_IFTYPE_STATION) &&
-+ (local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS))
-+ ieee80211_sta_tx_notify(sdata, (void *) skb->data);
- }
-
- void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb)