2019-10-02 04:30:06

by Johannes Berg

[permalink] [raw]
Subject: [PATCH] mac80211: simplify TX aggregation start

From: Johannes Berg <[email protected]>

There really is no need to make drivers call the
ieee80211_start_tx_ba_cb_irqsafe() function and then
schedule the worker if all we want is to set a bit.

Add a new return value (that was previously considered
invalid) to indicate that the driver is immediately
ready for the session, and make drivers use it. The
only drivers that remain different are the Intel ones
as they need to negotiate more with the firmware.

Signed-off-by: Johannes Berg <[email protected]>
---
drivers/net/wireless/ath/ath9k/htc_drv_main.c | 2 +-
drivers/net/wireless/ath/ath9k/main.c | 2 +-
drivers/net/wireless/ath/carl9170/main.c | 3 +--
drivers/net/wireless/ath/wcn36xx/main.c | 5 +++--
.../broadcom/brcm80211/brcmsmac/mac80211_if.c | 3 +--
drivers/net/wireless/intel/iwlegacy/4965-mac.c | 2 +-
drivers/net/wireless/intel/iwlwifi/dvm/tx.c | 2 +-
drivers/net/wireless/intel/iwlwifi/mvm/sta.c | 5 ++---
drivers/net/wireless/mac80211_hwsim.c | 3 +--
drivers/net/wireless/marvell/mwl8k.c | 2 +-
drivers/net/wireless/mediatek/mt76/mt7603/main.c | 3 +--
drivers/net/wireless/mediatek/mt76/mt7615/main.c | 3 +--
drivers/net/wireless/mediatek/mt76/mt76x02_util.c | 3 +--
drivers/net/wireless/mediatek/mt7601u/main.c | 3 +--
drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 2 +-
drivers/net/wireless/realtek/rtlwifi/base.c | 3 +--
drivers/net/wireless/realtek/rtw88/mac80211.c | 3 +--
drivers/net/wireless/rsi/rsi_91x_mac80211.c | 3 +--
include/net/mac80211.h | 11 +++++++++--
net/mac80211/agg-tx.c | 9 ++++++++-
20 files changed, 38 insertions(+), 34 deletions(-)

diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_main.c b/drivers/net/wireless/ath/ath9k/htc_drv_main.c
index a82ad739ab80..791f6633667c 100644
--- a/drivers/net/wireless/ath/ath9k/htc_drv_main.c
+++ b/drivers/net/wireless/ath/ath9k/htc_drv_main.c
@@ -1674,7 +1674,7 @@ static int ath9k_htc_ampdu_action(struct ieee80211_hw *hw,
case IEEE80211_AMPDU_TX_START:
ret = ath9k_htc_tx_aggr_oper(priv, vif, sta, action, tid);
if (!ret)
- ieee80211_start_tx_ba_cb_irqsafe(vif, sta->addr, tid);
+ ret = IEEE80211_AMPDU_TX_START_IMMEDIATE;
break;
case IEEE80211_AMPDU_TX_STOP_CONT:
case IEEE80211_AMPDU_TX_STOP_FLUSH:
diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c
index 34121fbf32e3..0548aa3702e3 100644
--- a/drivers/net/wireless/ath/ath9k/main.c
+++ b/drivers/net/wireless/ath/ath9k/main.c
@@ -1921,7 +1921,7 @@ static int ath9k_ampdu_action(struct ieee80211_hw *hw,
ath9k_ps_wakeup(sc);
ret = ath_tx_aggr_start(sc, sta, tid, ssn);
if (!ret)
- ieee80211_start_tx_ba_cb_irqsafe(vif, sta->addr, tid);
+ ret = IEEE80211_AMPDU_TX_START_IMMEDIATE;
ath9k_ps_restore(sc);
break;
case IEEE80211_AMPDU_TX_STOP_FLUSH:
diff --git a/drivers/net/wireless/ath/carl9170/main.c b/drivers/net/wireless/ath/carl9170/main.c
index 40a8054f8aa6..5914926a5c5b 100644
--- a/drivers/net/wireless/ath/carl9170/main.c
+++ b/drivers/net/wireless/ath/carl9170/main.c
@@ -1449,8 +1449,7 @@ static int carl9170_op_ampdu_action(struct ieee80211_hw *hw,
rcu_assign_pointer(sta_info->agg[tid], tid_info);
spin_unlock_bh(&ar->tx_ampdu_list_lock);

- ieee80211_start_tx_ba_cb_irqsafe(vif, sta->addr, tid);
- break;
+ return IEEE80211_AMPDU_TX_START_IMMEDIATE;

case IEEE80211_AMPDU_TX_STOP_CONT:
case IEEE80211_AMPDU_TX_STOP_FLUSH:
diff --git a/drivers/net/wireless/ath/wcn36xx/main.c b/drivers/net/wireless/ath/wcn36xx/main.c
index 79998a3ddb7a..a276dae30887 100644
--- a/drivers/net/wireless/ath/wcn36xx/main.c
+++ b/drivers/net/wireless/ath/wcn36xx/main.c
@@ -1084,6 +1084,7 @@ static int wcn36xx_ampdu_action(struct ieee80211_hw *hw,
enum ieee80211_ampdu_mlme_action action = params->action;
u16 tid = params->tid;
u16 *ssn = &params->ssn;
+ int ret = 0;

wcn36xx_dbg(WCN36XX_DBG_MAC, "mac ampdu action action %d tid %d\n",
action, tid);
@@ -1106,7 +1107,7 @@ static int wcn36xx_ampdu_action(struct ieee80211_hw *hw,
sta_priv->ampdu_state[tid] = WCN36XX_AMPDU_START;
spin_unlock_bh(&sta_priv->ampdu_lock);

- ieee80211_start_tx_ba_cb_irqsafe(vif, sta->addr, tid);
+ ret = IEEE80211_AMPDU_TX_START_IMMEDIATE;
break;
case IEEE80211_AMPDU_TX_OPERATIONAL:
spin_lock_bh(&sta_priv->ampdu_lock);
@@ -1131,7 +1132,7 @@ static int wcn36xx_ampdu_action(struct ieee80211_hw *hw,

mutex_unlock(&wcn->conf_mutex);

- return 0;
+ return ret;
}

static const struct ieee80211_ops wcn36xx_ops = {
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/mac80211_if.c b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/mac80211_if.c
index 6188275b17e5..8e8b685cfe09 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/mac80211_if.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/mac80211_if.c
@@ -850,8 +850,7 @@ brcms_ops_ampdu_action(struct ieee80211_hw *hw,
"START: tid %d is not agg\'able\n", tid);
return -EINVAL;
}
- ieee80211_start_tx_ba_cb_irqsafe(vif, sta->addr, tid);
- break;
+ return IEEE80211_AMPDU_TX_START_IMMEDIATE;

case IEEE80211_AMPDU_TX_STOP_CONT:
case IEEE80211_AMPDU_TX_STOP_FLUSH:
diff --git a/drivers/net/wireless/intel/iwlegacy/4965-mac.c b/drivers/net/wireless/intel/iwlegacy/4965-mac.c
index ffb705b18fb1..51fdd7ce30af 100644
--- a/drivers/net/wireless/intel/iwlegacy/4965-mac.c
+++ b/drivers/net/wireless/intel/iwlegacy/4965-mac.c
@@ -2265,7 +2265,7 @@ il4965_tx_agg_start(struct il_priv *il, struct ieee80211_vif *vif,
if (tid_data->tfds_in_queue == 0) {
D_HT("HW queue is empty\n");
tid_data->agg.state = IL_AGG_ON;
- ieee80211_start_tx_ba_cb_irqsafe(vif, sta->addr, tid);
+ ret = IEEE80211_AMPDU_TX_START_IMMEDIATE;
} else {
D_HT("HW queue is NOT empty: %d packets in HW queue\n",
tid_data->tfds_in_queue);
diff --git a/drivers/net/wireless/intel/iwlwifi/dvm/tx.c b/drivers/net/wireless/intel/iwlwifi/dvm/tx.c
index 3029e3f6de63..cd73fc5cfcbb 100644
--- a/drivers/net/wireless/intel/iwlwifi/dvm/tx.c
+++ b/drivers/net/wireless/intel/iwlwifi/dvm/tx.c
@@ -621,7 +621,7 @@ int iwlagn_tx_agg_start(struct iwl_priv *priv, struct ieee80211_vif *vif,
IWL_DEBUG_TX_QUEUES(priv, "Can proceed: ssn = next_recl = %d\n",
tid_data->agg.ssn);
tid_data->agg.state = IWL_AGG_STARTING;
- ieee80211_start_tx_ba_cb_irqsafe(vif, sta->addr, tid);
+ ret = IEEE80211_AMPDU_TX_START_IMMEDIATE;
} else {
IWL_DEBUG_TX_QUEUES(priv, "Can't proceed: ssn %d, "
"next_reclaimed = %d\n",
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/sta.c b/drivers/net/wireless/intel/iwlwifi/mvm/sta.c
index 0bedba4c61f2..1d6bc62b104c 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/sta.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/sta.c
@@ -2818,13 +2818,12 @@ int iwl_mvm_sta_tx_agg_start(struct iwl_mvm *mvm, struct ieee80211_vif *vif,

if (normalized_ssn == tid_data->next_reclaimed) {
tid_data->state = IWL_AGG_STARTING;
- ieee80211_start_tx_ba_cb_irqsafe(vif, sta->addr, tid);
+ ret = IEEE80211_AMPDU_TX_START_IMMEDIATE;
} else {
tid_data->state = IWL_EMPTYING_HW_QUEUE_ADDBA;
+ ret = 0;
}

- ret = 0;
-
out:
spin_unlock_bh(&mvmsta->lock);

diff --git a/drivers/net/wireless/mac80211_hwsim.c b/drivers/net/wireless/mac80211_hwsim.c
index 635956024e88..1aeb38296ec3 100644
--- a/drivers/net/wireless/mac80211_hwsim.c
+++ b/drivers/net/wireless/mac80211_hwsim.c
@@ -1979,8 +1979,7 @@ static int mac80211_hwsim_ampdu_action(struct ieee80211_hw *hw,

switch (action) {
case IEEE80211_AMPDU_TX_START:
- ieee80211_start_tx_ba_cb_irqsafe(vif, sta->addr, tid);
- break;
+ return IEEE80211_AMPDU_TX_START_IMMEDIATE;
case IEEE80211_AMPDU_TX_STOP_CONT:
case IEEE80211_AMPDU_TX_STOP_FLUSH:
case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
diff --git a/drivers/net/wireless/marvell/mwl8k.c b/drivers/net/wireless/marvell/mwl8k.c
index c4db6417748f..d55f229abeea 100644
--- a/drivers/net/wireless/marvell/mwl8k.c
+++ b/drivers/net/wireless/marvell/mwl8k.c
@@ -5520,7 +5520,7 @@ mwl8k_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
rc = -EBUSY;
break;
}
- ieee80211_start_tx_ba_cb_irqsafe(vif, addr, tid);
+ rc = IEEE80211_AMPDU_TX_START_IMMEDIATE;
break;
case IEEE80211_AMPDU_TX_STOP_CONT:
case IEEE80211_AMPDU_TX_STOP_FLUSH:
diff --git a/drivers/net/wireless/mediatek/mt76/mt7603/main.c b/drivers/net/wireless/mediatek/mt76/mt7603/main.c
index 25d5b1608bc9..4b3217b43a04 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7603/main.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7603/main.c
@@ -582,8 +582,7 @@ mt7603_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
break;
case IEEE80211_AMPDU_TX_START:
mtxq->agg_ssn = IEEE80211_SN_TO_SEQ(ssn);
- ieee80211_start_tx_ba_cb_irqsafe(vif, sta->addr, tid);
- break;
+ return IEEE80211_AMPDU_TX_START_IMMEDIATE;
case IEEE80211_AMPDU_TX_STOP_CONT:
mtxq->aggr = false;
mt7603_mac_tx_ba_reset(dev, msta->wcid.idx, tid, -1);
diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/main.c b/drivers/net/wireless/mediatek/mt76/mt7615/main.c
index 87c748715b5d..b6d78212306a 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7615/main.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7615/main.c
@@ -477,8 +477,7 @@ mt7615_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
break;
case IEEE80211_AMPDU_TX_START:
mtxq->agg_ssn = IEEE80211_SN_TO_SEQ(ssn);
- ieee80211_start_tx_ba_cb_irqsafe(vif, sta->addr, tid);
- break;
+ return IEEE80211_AMPDU_TX_START_IMMEDIATE;
case IEEE80211_AMPDU_TX_STOP_CONT:
mtxq->aggr = false;
mt7615_mcu_set_tx_ba(dev, params, 0);
diff --git a/drivers/net/wireless/mediatek/mt76/mt76x02_util.c b/drivers/net/wireless/mediatek/mt76/mt76x02_util.c
index aec73a0295e8..414b22399d93 100644
--- a/drivers/net/wireless/mediatek/mt76/mt76x02_util.c
+++ b/drivers/net/wireless/mediatek/mt76/mt76x02_util.c
@@ -393,8 +393,7 @@ int mt76x02_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
break;
case IEEE80211_AMPDU_TX_START:
mtxq->agg_ssn = IEEE80211_SN_TO_SEQ(ssn);
- ieee80211_start_tx_ba_cb_irqsafe(vif, sta->addr, tid);
- break;
+ return IEEE80211_AMPDU_TX_START_IMMEDIATE;
case IEEE80211_AMPDU_TX_STOP_CONT:
mtxq->aggr = false;
ieee80211_stop_tx_ba_cb_irqsafe(vif, sta->addr, tid);
diff --git a/drivers/net/wireless/mediatek/mt7601u/main.c b/drivers/net/wireless/mediatek/mt7601u/main.c
index 72e608cc53af..671d8897ae76 100644
--- a/drivers/net/wireless/mediatek/mt7601u/main.c
+++ b/drivers/net/wireless/mediatek/mt7601u/main.c
@@ -372,8 +372,7 @@ mt76_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
break;
case IEEE80211_AMPDU_TX_START:
msta->agg_ssn[tid] = ssn << 4;
- ieee80211_start_tx_ba_cb_irqsafe(vif, sta->addr, tid);
- break;
+ return IEEE80211_AMPDU_TX_START_IMMEDIATE;
case IEEE80211_AMPDU_TX_STOP_CONT:
ieee80211_stop_tx_ba_cb_irqsafe(vif, sta->addr, tid);
break;
diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
index f1cdcd61c54a..b74e758cce09 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
@@ -10489,7 +10489,7 @@ int rt2800_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
*/
break;
case IEEE80211_AMPDU_TX_START:
- ieee80211_start_tx_ba_cb_irqsafe(vif, sta->addr, tid);
+ ret = IEEE80211_AMPDU_TX_START_IMMEDIATE;
break;
case IEEE80211_AMPDU_TX_STOP_CONT:
case IEEE80211_AMPDU_TX_STOP_FLUSH:
diff --git a/drivers/net/wireless/realtek/rtlwifi/base.c b/drivers/net/wireless/realtek/rtlwifi/base.c
index ac746c322554..c75192c4447f 100644
--- a/drivers/net/wireless/realtek/rtlwifi/base.c
+++ b/drivers/net/wireless/realtek/rtlwifi/base.c
@@ -1776,8 +1776,7 @@ int rtl_tx_agg_start(struct ieee80211_hw *hw, struct ieee80211_vif *vif,

tid_data->agg.agg_state = RTL_AGG_START;

- ieee80211_start_tx_ba_cb_irqsafe(vif, sta->addr, tid);
- return 0;
+ return IEEE80211_AMPDU_TX_START_IMMEDIATE;
}

int rtl_tx_agg_stop(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
diff --git a/drivers/net/wireless/realtek/rtw88/mac80211.c b/drivers/net/wireless/realtek/rtw88/mac80211.c
index e5e3605bb693..a203b4705b94 100644
--- a/drivers/net/wireless/realtek/rtw88/mac80211.c
+++ b/drivers/net/wireless/realtek/rtw88/mac80211.c
@@ -437,8 +437,7 @@ static int rtw_ops_ampdu_action(struct ieee80211_hw *hw,

switch (params->action) {
case IEEE80211_AMPDU_TX_START:
- ieee80211_start_tx_ba_cb_irqsafe(vif, sta->addr, tid);
- break;
+ return IEEE80211_AMPDU_TX_START_IMMEDIATE;
case IEEE80211_AMPDU_TX_STOP_CONT:
case IEEE80211_AMPDU_TX_STOP_FLUSH:
case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
diff --git a/drivers/net/wireless/rsi/rsi_91x_mac80211.c b/drivers/net/wireless/rsi/rsi_91x_mac80211.c
index ce5e92d82efc..9c8ff8190418 100644
--- a/drivers/net/wireless/rsi/rsi_91x_mac80211.c
+++ b/drivers/net/wireless/rsi/rsi_91x_mac80211.c
@@ -1140,8 +1140,7 @@ static int rsi_mac80211_ampdu_action(struct ieee80211_hw *hw,
else if ((vif->type == NL80211_IFTYPE_AP) ||
(vif->type == NL80211_IFTYPE_P2P_GO))
rsta->seq_start[tid] = seq_no;
- ieee80211_start_tx_ba_cb_irqsafe(vif, sta->addr, tid);
- status = 0;
+ status = IEEE80211_AMPDU_TX_START_IMMEDIATE
break;

case IEEE80211_AMPDU_TX_STOP_CONT:
diff --git a/include/net/mac80211.h b/include/net/mac80211.h
index 523c6a09e1c8..d69081c38788 100644
--- a/include/net/mac80211.h
+++ b/include/net/mac80211.h
@@ -3095,7 +3095,9 @@ enum ieee80211_filter_flags {
*
* @IEEE80211_AMPDU_RX_START: start RX aggregation
* @IEEE80211_AMPDU_RX_STOP: stop RX aggregation
- * @IEEE80211_AMPDU_TX_START: start TX aggregation
+ * @IEEE80211_AMPDU_TX_START: start TX aggregation, the driver must either
+ * call ieee80211_start_tx_ba_cb_irqsafe() or return the special
+ * status %IEEE80211_AMPDU_TX_START_IMMEDIATE.
* @IEEE80211_AMPDU_TX_OPERATIONAL: TX aggregation has become operational
* @IEEE80211_AMPDU_TX_STOP_CONT: stop TX aggregation but continue transmitting
* queued packets, now unaggregated. After all packets are transmitted the
@@ -3119,6 +3121,8 @@ enum ieee80211_ampdu_mlme_action {
IEEE80211_AMPDU_TX_OPERATIONAL,
};

+#define IEEE80211_AMPDU_TX_START_IMMEDIATE 1
+
/**
* struct ieee80211_ampdu_params - AMPDU action parameters
*
@@ -3896,7 +3900,10 @@ struct ieee80211_ops {
*
* Even ``189`` would be wrong since 1 could be lost again.
*
- * Returns a negative error code on failure.
+ * Returns a negative error code on failure. The driver may return
+ * %IEEE80211_AMPDU_TX_START_IMMEDIATE for %IEEE80211_AMPDU_TX_START
+ * if the session can start immediately.
+ *
* The callback can sleep.
*/
int (*ampdu_action)(struct ieee80211_hw *hw,
diff --git a/net/mac80211/agg-tx.c b/net/mac80211/agg-tx.c
index b11883d26875..33da6f738c99 100644
--- a/net/mac80211/agg-tx.c
+++ b/net/mac80211/agg-tx.c
@@ -485,7 +485,14 @@ void ieee80211_tx_ba_session_handle_start(struct sta_info *sta, int tid)

params.ssn = sta->tid_seq[tid] >> 4;
ret = drv_ampdu_action(local, sdata, &params);
- if (ret) {
+ if (ret == IEEE80211_AMPDU_TX_START_IMMEDIATE) {
+ /*
+ * We didn't send the request yet, so don't need to check
+ * here if we already got a response, just mark as driver
+ * ready immediately.
+ */
+ set_bit(HT_AGG_STATE_DRV_READY, &tid_tx->state);
+ } else if (ret) {
ht_dbg(sdata,
"BA request denied - HW unavailable for %pM tid %d\n",
sta->sta.addr, tid);
--
2.20.1


2019-10-02 06:40:10

by kernel test robot

[permalink] [raw]
Subject: Re: [PATCH] mac80211: simplify TX aggregation start

Hi Johannes,

I love your patch! Yet something to improve:

[auto build test ERROR on wireless-drivers-next/master]
[cannot apply to v5.4-rc1 next-20191001]
[if your patch is applied to the wrong git tree, please drop us a note to help
improve the system. BTW, we also suggest to use '--base' option to specify the
base tree in git format-patch, please see https://stackoverflow.com/a/37406982]

url: https://github.com/0day-ci/linux/commits/Johannes-Berg/mac80211-simplify-TX-aggregation-start/20191002-113555
base: https://git.kernel.org/pub/scm/linux/kernel/git/kvalo/wireless-drivers-next.git master
config: sparc64-allmodconfig (attached as .config)
compiler: sparc64-linux-gcc (GCC) 7.4.0
reproduce:
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# save the attached .config to linux build tree
GCC_VERSION=7.4.0 make.cross ARCH=sparc64

If you fix the issue, kindly add following tag
Reported-by: kbuild test robot <[email protected]>

All error/warnings (new ones prefixed by >>):

drivers/net/wireless/rsi/rsi_91x_mac80211.c: In function 'rsi_mac80211_ampdu_action':
>> drivers/net/wireless/rsi/rsi_91x_mac80211.c:1144:3: error: expected ';' before 'break'
break;
^~~~~
>> drivers/net/wireless/rsi/rsi_91x_mac80211.c:1143:10: warning: this statement may fall through [-Wimplicit-fallthrough=]
status = IEEE80211_AMPDU_TX_START_IMMEDIATE
drivers/net/wireless/rsi/rsi_91x_mac80211.c:1146:2: note: here
case IEEE80211_AMPDU_TX_STOP_CONT:
^~~~

vim +1144 drivers/net/wireless/rsi/rsi_91x_mac80211.c

dad0d04fa7ba41 Fariya Fatima 2014-03-16 1064
dad0d04fa7ba41 Fariya Fatima 2014-03-16 1065 /**
dad0d04fa7ba41 Fariya Fatima 2014-03-16 1066 * rsi_mac80211_ampdu_action() - This function selects the AMPDU action for
dad0d04fa7ba41 Fariya Fatima 2014-03-16 1067 * the corresponding mlme_action flag and
dad0d04fa7ba41 Fariya Fatima 2014-03-16 1068 * informs the f/w regarding this.
dad0d04fa7ba41 Fariya Fatima 2014-03-16 1069 * @hw: Pointer to the ieee80211_hw structure.
dad0d04fa7ba41 Fariya Fatima 2014-03-16 1070 * @vif: Pointer to the ieee80211_vif structure.
50ea05efaf3bed Sara Sharon 2015-12-30 1071 * @params: Pointer to A-MPDU action parameters
dad0d04fa7ba41 Fariya Fatima 2014-03-16 1072 *
dad0d04fa7ba41 Fariya Fatima 2014-03-16 1073 * Return: status: 0 on success, negative error code on failure.
dad0d04fa7ba41 Fariya Fatima 2014-03-16 1074 */
dad0d04fa7ba41 Fariya Fatima 2014-03-16 1075 static int rsi_mac80211_ampdu_action(struct ieee80211_hw *hw,
dad0d04fa7ba41 Fariya Fatima 2014-03-16 1076 struct ieee80211_vif *vif,
50ea05efaf3bed Sara Sharon 2015-12-30 1077 struct ieee80211_ampdu_params *params)
dad0d04fa7ba41 Fariya Fatima 2014-03-16 1078 {
dad0d04fa7ba41 Fariya Fatima 2014-03-16 1079 int status = -EOPNOTSUPP;
dad0d04fa7ba41 Fariya Fatima 2014-03-16 1080 struct rsi_hw *adapter = hw->priv;
dad0d04fa7ba41 Fariya Fatima 2014-03-16 1081 struct rsi_common *common = adapter->priv;
32be57a666a51c Prameela Rani Garnepudi 2017-08-16 1082 struct rsi_sta *rsta = NULL;
32be57a666a51c Prameela Rani Garnepudi 2017-08-16 1083 u16 seq_no = 0, seq_start = 0;
dad0d04fa7ba41 Fariya Fatima 2014-03-16 1084 u8 ii = 0;
50ea05efaf3bed Sara Sharon 2015-12-30 1085 struct ieee80211_sta *sta = params->sta;
32be57a666a51c Prameela Rani Garnepudi 2017-08-16 1086 u8 sta_id = 0;
50ea05efaf3bed Sara Sharon 2015-12-30 1087 enum ieee80211_ampdu_mlme_action action = params->action;
50ea05efaf3bed Sara Sharon 2015-12-30 1088 u16 tid = params->tid;
50ea05efaf3bed Sara Sharon 2015-12-30 1089 u16 *ssn = &params->ssn;
50ea05efaf3bed Sara Sharon 2015-12-30 1090 u8 buf_size = params->buf_size;
dad0d04fa7ba41 Fariya Fatima 2014-03-16 1091
dad0d04fa7ba41 Fariya Fatima 2014-03-16 1092 for (ii = 0; ii < RSI_MAX_VIFS; ii++) {
dad0d04fa7ba41 Fariya Fatima 2014-03-16 1093 if (vif == adapter->vifs[ii])
dad0d04fa7ba41 Fariya Fatima 2014-03-16 1094 break;
dad0d04fa7ba41 Fariya Fatima 2014-03-16 1095 }
dad0d04fa7ba41 Fariya Fatima 2014-03-16 1096
dad0d04fa7ba41 Fariya Fatima 2014-03-16 1097 mutex_lock(&common->mutex);
32be57a666a51c Prameela Rani Garnepudi 2017-08-16 1098
dad0d04fa7ba41 Fariya Fatima 2014-03-16 1099 if (ssn != NULL)
dad0d04fa7ba41 Fariya Fatima 2014-03-16 1100 seq_no = *ssn;
dad0d04fa7ba41 Fariya Fatima 2014-03-16 1101
c7245c0975f134 Prameela Rani Garnepudi 2017-08-30 1102 if ((vif->type == NL80211_IFTYPE_AP) ||
c7245c0975f134 Prameela Rani Garnepudi 2017-08-30 1103 (vif->type == NL80211_IFTYPE_P2P_GO)) {
32be57a666a51c Prameela Rani Garnepudi 2017-08-16 1104 rsta = rsi_find_sta(common, sta->addr);
32be57a666a51c Prameela Rani Garnepudi 2017-08-16 1105 if (!rsta) {
32be57a666a51c Prameela Rani Garnepudi 2017-08-16 1106 rsi_dbg(ERR_ZONE, "No station mapped\n");
0270639e899e21 Dan Carpenter 2017-08-25 1107 status = 0;
0270639e899e21 Dan Carpenter 2017-08-25 1108 goto unlock;
32be57a666a51c Prameela Rani Garnepudi 2017-08-16 1109 }
32be57a666a51c Prameela Rani Garnepudi 2017-08-16 1110 sta_id = rsta->sta_id;
32be57a666a51c Prameela Rani Garnepudi 2017-08-16 1111 }
32be57a666a51c Prameela Rani Garnepudi 2017-08-16 1112
32be57a666a51c Prameela Rani Garnepudi 2017-08-16 1113 rsi_dbg(INFO_ZONE,
32be57a666a51c Prameela Rani Garnepudi 2017-08-16 1114 "%s: AMPDU action tid=%d ssn=0x%x, buf_size=%d sta_id=%d\n",
32be57a666a51c Prameela Rani Garnepudi 2017-08-16 1115 __func__, tid, seq_no, buf_size, sta_id);
32be57a666a51c Prameela Rani Garnepudi 2017-08-16 1116
dad0d04fa7ba41 Fariya Fatima 2014-03-16 1117 switch (action) {
dad0d04fa7ba41 Fariya Fatima 2014-03-16 1118 case IEEE80211_AMPDU_RX_START:
dad0d04fa7ba41 Fariya Fatima 2014-03-16 1119 status = rsi_send_aggregation_params_frame(common,
dad0d04fa7ba41 Fariya Fatima 2014-03-16 1120 tid,
dad0d04fa7ba41 Fariya Fatima 2014-03-16 1121 seq_no,
dad0d04fa7ba41 Fariya Fatima 2014-03-16 1122 buf_size,
32be57a666a51c Prameela Rani Garnepudi 2017-08-16 1123 STA_RX_ADDBA_DONE,
32be57a666a51c Prameela Rani Garnepudi 2017-08-16 1124 sta_id);
dad0d04fa7ba41 Fariya Fatima 2014-03-16 1125 break;
dad0d04fa7ba41 Fariya Fatima 2014-03-16 1126
dad0d04fa7ba41 Fariya Fatima 2014-03-16 1127 case IEEE80211_AMPDU_RX_STOP:
dad0d04fa7ba41 Fariya Fatima 2014-03-16 1128 status = rsi_send_aggregation_params_frame(common,
dad0d04fa7ba41 Fariya Fatima 2014-03-16 1129 tid,
dad0d04fa7ba41 Fariya Fatima 2014-03-16 1130 0,
dad0d04fa7ba41 Fariya Fatima 2014-03-16 1131 buf_size,
32be57a666a51c Prameela Rani Garnepudi 2017-08-16 1132 STA_RX_DELBA,
32be57a666a51c Prameela Rani Garnepudi 2017-08-16 1133 sta_id);
dad0d04fa7ba41 Fariya Fatima 2014-03-16 1134 break;
dad0d04fa7ba41 Fariya Fatima 2014-03-16 1135
dad0d04fa7ba41 Fariya Fatima 2014-03-16 1136 case IEEE80211_AMPDU_TX_START:
c7245c0975f134 Prameela Rani Garnepudi 2017-08-30 1137 if ((vif->type == NL80211_IFTYPE_STATION) ||
c7245c0975f134 Prameela Rani Garnepudi 2017-08-30 1138 (vif->type == NL80211_IFTYPE_P2P_CLIENT))
dad0d04fa7ba41 Fariya Fatima 2014-03-16 1139 common->vif_info[ii].seq_start = seq_no;
c7245c0975f134 Prameela Rani Garnepudi 2017-08-30 1140 else if ((vif->type == NL80211_IFTYPE_AP) ||
c7245c0975f134 Prameela Rani Garnepudi 2017-08-30 1141 (vif->type == NL80211_IFTYPE_P2P_GO))
32be57a666a51c Prameela Rani Garnepudi 2017-08-16 1142 rsta->seq_start[tid] = seq_no;
bec07d6ec29366 Johannes Berg 2019-10-01 @1143 status = IEEE80211_AMPDU_TX_START_IMMEDIATE
dad0d04fa7ba41 Fariya Fatima 2014-03-16 @1144 break;
dad0d04fa7ba41 Fariya Fatima 2014-03-16 1145
dad0d04fa7ba41 Fariya Fatima 2014-03-16 1146 case IEEE80211_AMPDU_TX_STOP_CONT:
dad0d04fa7ba41 Fariya Fatima 2014-03-16 1147 case IEEE80211_AMPDU_TX_STOP_FLUSH:
dad0d04fa7ba41 Fariya Fatima 2014-03-16 1148 case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
dad0d04fa7ba41 Fariya Fatima 2014-03-16 1149 status = rsi_send_aggregation_params_frame(common,
dad0d04fa7ba41 Fariya Fatima 2014-03-16 1150 tid,
dad0d04fa7ba41 Fariya Fatima 2014-03-16 1151 seq_no,
dad0d04fa7ba41 Fariya Fatima 2014-03-16 1152 buf_size,
32be57a666a51c Prameela Rani Garnepudi 2017-08-16 1153 STA_TX_DELBA,
32be57a666a51c Prameela Rani Garnepudi 2017-08-16 1154 sta_id);
dad0d04fa7ba41 Fariya Fatima 2014-03-16 1155 if (!status)
dad0d04fa7ba41 Fariya Fatima 2014-03-16 1156 ieee80211_stop_tx_ba_cb_irqsafe(vif, sta->addr, tid);
dad0d04fa7ba41 Fariya Fatima 2014-03-16 1157 break;
dad0d04fa7ba41 Fariya Fatima 2014-03-16 1158
dad0d04fa7ba41 Fariya Fatima 2014-03-16 1159 case IEEE80211_AMPDU_TX_OPERATIONAL:
c7245c0975f134 Prameela Rani Garnepudi 2017-08-30 1160 if ((vif->type == NL80211_IFTYPE_STATION) ||
c7245c0975f134 Prameela Rani Garnepudi 2017-08-30 1161 (vif->type == NL80211_IFTYPE_P2P_CLIENT))
32be57a666a51c Prameela Rani Garnepudi 2017-08-16 1162 seq_start = common->vif_info[ii].seq_start;
c7245c0975f134 Prameela Rani Garnepudi 2017-08-30 1163 else if ((vif->type == NL80211_IFTYPE_AP) ||
c7245c0975f134 Prameela Rani Garnepudi 2017-08-30 1164 (vif->type == NL80211_IFTYPE_P2P_GO))
32be57a666a51c Prameela Rani Garnepudi 2017-08-16 1165 seq_start = rsta->seq_start[tid];
dad0d04fa7ba41 Fariya Fatima 2014-03-16 1166 status = rsi_send_aggregation_params_frame(common,
dad0d04fa7ba41 Fariya Fatima 2014-03-16 1167 tid,
32be57a666a51c Prameela Rani Garnepudi 2017-08-16 1168 seq_start,
dad0d04fa7ba41 Fariya Fatima 2014-03-16 1169 buf_size,
32be57a666a51c Prameela Rani Garnepudi 2017-08-16 1170 STA_TX_ADDBA_DONE,
32be57a666a51c Prameela Rani Garnepudi 2017-08-16 1171 sta_id);
dad0d04fa7ba41 Fariya Fatima 2014-03-16 1172 break;
dad0d04fa7ba41 Fariya Fatima 2014-03-16 1173
dad0d04fa7ba41 Fariya Fatima 2014-03-16 1174 default:
a53e8f3edaa0f2 Colin Ian King 2018-05-26 1175 rsi_dbg(ERR_ZONE, "%s: Unknown AMPDU action\n", __func__);
dad0d04fa7ba41 Fariya Fatima 2014-03-16 1176 break;
dad0d04fa7ba41 Fariya Fatima 2014-03-16 1177 }
dad0d04fa7ba41 Fariya Fatima 2014-03-16 1178
0270639e899e21 Dan Carpenter 2017-08-25 1179 unlock:
dad0d04fa7ba41 Fariya Fatima 2014-03-16 1180 mutex_unlock(&common->mutex);
dad0d04fa7ba41 Fariya Fatima 2014-03-16 1181 return status;
dad0d04fa7ba41 Fariya Fatima 2014-03-16 1182 }
dad0d04fa7ba41 Fariya Fatima 2014-03-16 1183

:::::: The code at line 1144 was first introduced by commit
:::::: dad0d04fa7ba41ce603a01e8e64967650303e9a2 rsi: Add RS9113 wireless driver

:::::: TO: Fariya Fatima <[email protected]>
:::::: CC: John W. Linville <[email protected]>

---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation


Attachments:
(No filename) (11.93 kB)
.config.gz (57.71 kB)
Download all attachments

2019-10-02 09:12:28

by Stanislaw Gruszka

[permalink] [raw]
Subject: Re: [PATCH] mac80211: simplify TX aggregation start

On Tue, Oct 01, 2019 at 10:06:29PM +0200, Johannes Berg wrote:
> index f1cdcd61c54a..b74e758cce09 100644
> --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
> +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
> @@ -10489,7 +10489,7 @@ int rt2800_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
> */
> break;
> case IEEE80211_AMPDU_TX_START:
> - ieee80211_start_tx_ba_cb_irqsafe(vif, sta->addr, tid);
> + ret = IEEE80211_AMPDU_TX_START_IMMEDIATE;
> break;
> case IEEE80211_AMPDU_TX_STOP_CONT:
> case IEEE80211_AMPDU_TX_STOP_FLUSH:
<snip>
> +#define IEEE80211_AMPDU_TX_START_IMMEDIATE 1
> +
> /**

On rt2x00 we already return 1 for case we do not have free HW WCID
number for a remote station.

if (sta_priv->wcid > WCID_END)
return 1;

So we should change that to some other error code i.e. -ENOSPC.

Stanislaw

2019-10-02 09:13:29

by Johannes Berg

[permalink] [raw]
Subject: Re: [PATCH] mac80211: simplify TX aggregation start

On Wed, 2019-10-02 at 11:08 +0200, Stanislaw Gruszka wrote:
> On Tue, Oct 01, 2019 at 10:06:29PM +0200, Johannes Berg wrote:
> > index f1cdcd61c54a..b74e758cce09 100644
> > --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
> > +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
> > @@ -10489,7 +10489,7 @@ int rt2800_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
> > */
> > break;
> > case IEEE80211_AMPDU_TX_START:
> > - ieee80211_start_tx_ba_cb_irqsafe(vif, sta->addr, tid);
> > + ret = IEEE80211_AMPDU_TX_START_IMMEDIATE;
> > break;
> > case IEEE80211_AMPDU_TX_STOP_CONT:
> > case IEEE80211_AMPDU_TX_STOP_FLUSH:
> <snip>
> > +#define IEEE80211_AMPDU_TX_START_IMMEDIATE 1
> > +
> > /**
>
> On rt2x00 we already return 1 for case we do not have free HW WCID
> number for a remote station.
>
> if (sta_priv->wcid > WCID_END)
> return 1;
>
> So we should change that to some other error code i.e. -ENOSPC.

Hah, umm... that's kinda weird, but ok :)

johannes