mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	mac80211: agg-tx: refactor sending addba
We move the actual arming the timer and sending ADDBA to a function for the use in different places calling the same logic. Signed-off-by: Mordechay Goodstein <mordechay.goodstein@intel.com> Signed-off-by: Luca Coelho <luciano.coelho@intel.com> Link: https://lore.kernel.org/r/iwlwifi.20200326150855.58a337eb90a1.I75934e6464535fbf43969acc796bc886291e79a5@changeid Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
		
							parent
							
								
									4826e72110
								
							
						
					
					
						commit
						31d8bb4e07
					
				
					 1 changed files with 39 additions and 28 deletions
				
			
		| 
						 | 
				
			
			@ -9,7 +9,7 @@
 | 
			
		|||
 * Copyright 2007, Michael Wu <flamingice@sourmilk.net>
 | 
			
		||||
 * Copyright 2007-2010, Intel Corporation
 | 
			
		||||
 * Copyright(c) 2015-2017 Intel Deutschland GmbH
 | 
			
		||||
 * Copyright (C) 2018 - 2019 Intel Corporation
 | 
			
		||||
 * Copyright (C) 2018 - 2020 Intel Corporation
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <linux/ieee80211.h>
 | 
			
		||||
| 
						 | 
				
			
			@ -448,6 +448,43 @@ static void sta_addba_resp_timer_expired(struct timer_list *t)
 | 
			
		|||
	ieee80211_stop_tx_ba_session(&sta->sta, tid);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void ieee80211_send_addba_with_timeout(struct sta_info *sta,
 | 
			
		||||
					      struct tid_ampdu_tx *tid_tx)
 | 
			
		||||
{
 | 
			
		||||
	struct ieee80211_sub_if_data *sdata = sta->sdata;
 | 
			
		||||
	struct ieee80211_local *local = sta->local;
 | 
			
		||||
	u8 tid = tid_tx->tid;
 | 
			
		||||
	u16 buf_size;
 | 
			
		||||
 | 
			
		||||
	/* activate the timer for the recipient's addBA response */
 | 
			
		||||
	mod_timer(&tid_tx->addba_resp_timer, jiffies + ADDBA_RESP_INTERVAL);
 | 
			
		||||
	ht_dbg(sdata, "activated addBA response timer on %pM tid %d\n",
 | 
			
		||||
	       sta->sta.addr, tid);
 | 
			
		||||
 | 
			
		||||
	spin_lock_bh(&sta->lock);
 | 
			
		||||
	sta->ampdu_mlme.last_addba_req_time[tid] = jiffies;
 | 
			
		||||
	sta->ampdu_mlme.addba_req_num[tid]++;
 | 
			
		||||
	spin_unlock_bh(&sta->lock);
 | 
			
		||||
 | 
			
		||||
	if (sta->sta.he_cap.has_he) {
 | 
			
		||||
		buf_size = local->hw.max_tx_aggregation_subframes;
 | 
			
		||||
	} else {
 | 
			
		||||
		/*
 | 
			
		||||
		 * We really should use what the driver told us it will
 | 
			
		||||
		 * transmit as the maximum, but certain APs (e.g. the
 | 
			
		||||
		 * LinkSys WRT120N with FW v1.0.07 build 002 Jun 18 2012)
 | 
			
		||||
		 * will crash when we use a lower number.
 | 
			
		||||
		 */
 | 
			
		||||
		buf_size = IEEE80211_MAX_AMPDU_BUF_HT;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* send AddBA request */
 | 
			
		||||
	ieee80211_send_addba_request(sdata, sta->sta.addr, tid,
 | 
			
		||||
				     tid_tx->dialog_token,
 | 
			
		||||
				     sta->tid_seq[tid] >> 4,
 | 
			
		||||
				     buf_size, tid_tx->timeout);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ieee80211_tx_ba_session_handle_start(struct sta_info *sta, int tid)
 | 
			
		||||
{
 | 
			
		||||
	struct tid_ampdu_tx *tid_tx;
 | 
			
		||||
| 
						 | 
				
			
			@ -462,7 +499,6 @@ void ieee80211_tx_ba_session_handle_start(struct sta_info *sta, int tid)
 | 
			
		|||
		.timeout = 0,
 | 
			
		||||
	};
 | 
			
		||||
	int ret;
 | 
			
		||||
	u16 buf_size;
 | 
			
		||||
 | 
			
		||||
	tid_tx = rcu_dereference_protected_tid_tx(sta, tid);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -508,32 +544,7 @@ void ieee80211_tx_ba_session_handle_start(struct sta_info *sta, int tid)
 | 
			
		|||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* activate the timer for the recipient's addBA response */
 | 
			
		||||
	mod_timer(&tid_tx->addba_resp_timer, jiffies + ADDBA_RESP_INTERVAL);
 | 
			
		||||
	ht_dbg(sdata, "activated addBA response timer on %pM tid %d\n",
 | 
			
		||||
	       sta->sta.addr, tid);
 | 
			
		||||
 | 
			
		||||
	spin_lock_bh(&sta->lock);
 | 
			
		||||
	sta->ampdu_mlme.last_addba_req_time[tid] = jiffies;
 | 
			
		||||
	sta->ampdu_mlme.addba_req_num[tid]++;
 | 
			
		||||
	spin_unlock_bh(&sta->lock);
 | 
			
		||||
 | 
			
		||||
	if (sta->sta.he_cap.has_he) {
 | 
			
		||||
		buf_size = local->hw.max_tx_aggregation_subframes;
 | 
			
		||||
	} else {
 | 
			
		||||
		/*
 | 
			
		||||
		 * We really should use what the driver told us it will
 | 
			
		||||
		 * transmit as the maximum, but certain APs (e.g. the
 | 
			
		||||
		 * LinkSys WRT120N with FW v1.0.07 build 002 Jun 18 2012)
 | 
			
		||||
		 * will crash when we use a lower number.
 | 
			
		||||
		 */
 | 
			
		||||
		buf_size = IEEE80211_MAX_AMPDU_BUF_HT;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* send AddBA request */
 | 
			
		||||
	ieee80211_send_addba_request(sdata, sta->sta.addr, tid,
 | 
			
		||||
				     tid_tx->dialog_token, params.ssn,
 | 
			
		||||
				     buf_size, tid_tx->timeout);
 | 
			
		||||
	ieee80211_send_addba_with_timeout(sta, tid_tx);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue