mac80211: Add timeout to BA session start API
authorSujith Manoharan <Sujith.Manoharan@atheros.com>
Wed, 15 Dec 2010 02:17:10 +0000 (07:47 +0530)
committerJohn W. Linville <linville@tuxdriver.com>
Wed, 15 Dec 2010 22:03:59 +0000 (17:03 -0500)
Allow drivers or rate control algorithms to specify BlockAck session
timeout when initiating an ADDBA transaction. This is useful in cases
where maintaining persistent BA sessions does not incur any overhead.

The current timeout value of 5000 TUs is retained for all non ath9k/ath9k_htc
drivers.

Signed-off-by: Sujith Manoharan <Sujith.Manoharan@atheros.com>
Reviewed-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath/ath9k/htc_drv_txrx.c
drivers/net/wireless/ath/ath9k/rc.c
drivers/net/wireless/iwlwifi/iwl-agn-rs.c
drivers/net/wireless/rtlwifi/rc.c
include/net/mac80211.h
net/mac80211/agg-tx.c
net/mac80211/debugfs_sta.c
net/mac80211/rc80211_minstrel_ht.c
net/mac80211/sta_info.h

index 31fad82239b343b05a0ad2992d952fa4fc014b40..33f36029fa4f9b351f9a3157b563783b5b2dcf50 100644 (file)
@@ -251,7 +251,7 @@ void ath9k_tx_tasklet(unsigned long data)
                                ista = (struct ath9k_htc_sta *)sta->drv_priv;
 
                                if (ath9k_htc_check_tx_aggr(priv, ista, tid)) {
-                                       ieee80211_start_tx_ba_session(sta, tid);
+                                       ieee80211_start_tx_ba_session(sta, tid, 0);
                                        spin_lock_bh(&priv->tx_lock);
                                        ista->tid_state[tid] = AGGR_PROGRESS;
                                        spin_unlock_bh(&priv->tx_lock);
index 2061a755a02647b9987dd7b294fb977282250ffe..896d12986b1e4ed7fe794be7a4046586fdcd78ee 100644 (file)
@@ -1373,7 +1373,7 @@ static void ath_tx_status(void *priv, struct ieee80211_supported_band *sband,
                        an = (struct ath_node *)sta->drv_priv;
 
                        if(ath_tx_aggr_check(sc, an, tid))
-                               ieee80211_start_tx_ba_session(sta, tid);
+                               ieee80211_start_tx_ba_session(sta, tid, 0);
                }
        }
 
index ee123482e1d5ef3ac0d989c76dbd113eb473d225..5083dba122caa7fac3d91e5206c34404e8dfd713 100644 (file)
@@ -387,7 +387,7 @@ static int rs_tl_turn_on_agg_for_tid(struct iwl_priv *priv,
        if (load > IWL_AGG_LOAD_THRESHOLD) {
                IWL_DEBUG_HT(priv, "Starting Tx agg: STA: %pM tid: %d\n",
                                sta->addr, tid);
-               ret = ieee80211_start_tx_ba_session(sta, tid);
+               ret = ieee80211_start_tx_ba_session(sta, tid, 5000);
                if (ret == -EAGAIN) {
                        /*
                         * driver and mac80211 is out of sync
index 904b8fd01f6d63320472abe267a1b8f6eef7b36d..91634107434a66aba4bea88ee39b62cc839867fa 100644 (file)
@@ -169,7 +169,7 @@ static void rtl_tx_status(void *ppriv,
                        tid = qc[0] & 0xf;
 
                        if (_rtl_tx_aggr_check(rtlpriv, tid))
-                               ieee80211_start_tx_ba_session(sta, tid);
+                               ieee80211_start_tx_ba_session(sta, tid, 5000);
                }
        }
 }
index e411cf87fb4152af0fe79bc7616eee34ca29dc38..69ded1ee49ce37743ff47c05cc514e7d3395ca60 100644 (file)
@@ -2435,6 +2435,7 @@ void ieee80211_queue_delayed_work(struct ieee80211_hw *hw,
  * ieee80211_start_tx_ba_session - Start a tx Block Ack session.
  * @sta: the station for which to start a BA session
  * @tid: the TID to BA on.
+ * @timeout: session timeout value (in TUs)
  *
  * Return: success if addBA request was sent, failure otherwise
  *
@@ -2442,7 +2443,8 @@ void ieee80211_queue_delayed_work(struct ieee80211_hw *hw,
  * the need to start aggregation on a certain RA/TID, the session level
  * will be managed by the mac80211.
  */
-int ieee80211_start_tx_ba_session(struct ieee80211_sta *sta, u16 tid);
+int ieee80211_start_tx_ba_session(struct ieee80211_sta *sta, u16 tid,
+                                 u16 timeout);
 
 /**
  * ieee80211_start_tx_ba_cb_irqsafe - low level driver ready to aggregate.
index d4679b265ba88698298a403dac25392b61dc04e7..9cc472c6a6a5497dcadea0af44fe011f14c2f5a7 100644 (file)
@@ -342,10 +342,11 @@ void ieee80211_tx_ba_session_handle_start(struct sta_info *sta, int tid)
        /* send AddBA request */
        ieee80211_send_addba_request(sdata, sta->sta.addr, tid,
                                     tid_tx->dialog_token, start_seq_num,
-                                    0x40, 5000);
+                                    0x40, tid_tx->timeout);
 }
 
-int ieee80211_start_tx_ba_session(struct ieee80211_sta *pubsta, u16 tid)
+int ieee80211_start_tx_ba_session(struct ieee80211_sta *pubsta, u16 tid,
+                                 u16 timeout)
 {
        struct sta_info *sta = container_of(pubsta, struct sta_info, sta);
        struct ieee80211_sub_if_data *sdata = sta->sdata;
@@ -420,6 +421,8 @@ int ieee80211_start_tx_ba_session(struct ieee80211_sta *pubsta, u16 tid)
        skb_queue_head_init(&tid_tx->pending);
        __set_bit(HT_AGG_STATE_WANT_START, &tid_tx->state);
 
+       tid_tx->timeout = timeout;
+
        /* Tx timer */
        tid_tx->addba_resp_timer.function = sta_addba_resp_timer_expired;
        tid_tx->addba_resp_timer.data = (unsigned long)&sta->timer_to_tid[tid];
index 8bb5af85f46910306890a49e751b090d0912c36e..c04a1396cf8d94e4ff6d467cb1f98a3a1133f5be 100644 (file)
@@ -189,7 +189,7 @@ static ssize_t sta_agg_status_write(struct file *file, const char __user *userbu
 
        if (tx) {
                if (start)
-                       ret = ieee80211_start_tx_ba_session(&sta->sta, tid);
+                       ret = ieee80211_start_tx_ba_session(&sta->sta, tid, 5000);
                else
                        ret = ieee80211_stop_tx_ba_session(&sta->sta, tid);
        } else {
index 4ad7a362fcc159aa29bea2e4747476009cdd2a41..165a4518bb48eeae847fd8523829b26591cf44e7 100644 (file)
@@ -374,7 +374,7 @@ minstrel_aggr_check(struct minstrel_priv *mp, struct ieee80211_sta *pubsta, stru
        if (skb_get_queue_mapping(skb) == IEEE80211_AC_VO)
                return;
 
-       ieee80211_start_tx_ba_session(pubsta, tid);
+       ieee80211_start_tx_ba_session(pubsta, tid, 5000);
 }
 
 static void
index fdca52cf88de2d57d63821f685d4d78e600006e8..bbdd2a86a94b2ad4eb0863f5a1be8a110c9c456e 100644 (file)
@@ -78,6 +78,7 @@ enum ieee80211_sta_info_flags {
  * @addba_resp_timer: timer for peer's response to addba request
  * @pending: pending frames queue -- use sta's spinlock to protect
  * @dialog_token: dialog token for aggregation session
+ * @timeout: session timeout value to be filled in ADDBA requests
  * @state: session state (see above)
  * @stop_initiator: initiator of a session stop
  * @tx_stop: TX DelBA frame when stopping
@@ -96,6 +97,7 @@ struct tid_ampdu_tx {
        struct timer_list addba_resp_timer;
        struct sk_buff_head pending;
        unsigned long state;
+       u16 timeout;
        u8 dialog_token;
        u8 stop_initiator;
        bool tx_stop;