summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEmmanuel Grumbach <emmanuel.grumbach@intel.com>2015-08-16 04:13:22 -0400
committerJohannes Berg <johannes.berg@intel.com>2015-09-22 09:21:23 -0400
commite3abc8ff0fc18b3925fd5d5c5fbd1613856f4e7c (patch)
tree6e551a123ce0462ae6aed766ade50ae1bac0efbc
parent1b09b5568e5f46c6dfb781d7c1dfad431a6d8ec1 (diff)
mac80211: allow to transmit A-MSDU within A-MPDU
Advertise the capability to send A-MSDU within A-MPDU in the AddBA request sent by mac80211. Let the driver know about the peer's capabilities. Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
-rw-r--r--drivers/net/wireless/ath/ath10k/mac.c2
-rw-r--r--drivers/net/wireless/ath/ath9k/htc_drv_main.c2
-rw-r--r--drivers/net/wireless/ath/ath9k/main.c2
-rw-r--r--drivers/net/wireless/ath/carl9170/main.c2
-rw-r--r--drivers/net/wireless/ath/wcn36xx/main.c2
-rw-r--r--drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c2
-rw-r--r--drivers/net/wireless/cw1200/sta.c2
-rw-r--r--drivers/net/wireless/cw1200/sta.h2
-rw-r--r--drivers/net/wireless/iwlegacy/4965-mac.c2
-rw-r--r--drivers/net/wireless/iwlegacy/4965.h2
-rw-r--r--drivers/net/wireless/iwlwifi/dvm/mac80211.c2
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/mac80211.c2
-rw-r--r--drivers/net/wireless/mac80211_hwsim.c2
-rw-r--r--drivers/net/wireless/mediatek/mt7601u/main.c3
-rw-r--r--drivers/net/wireless/mwl8k.c2
-rw-r--r--drivers/net/wireless/rsi/rsi_91x_mac80211.c4
-rw-r--r--drivers/net/wireless/rt2x00/rt2800lib.c2
-rw-r--r--drivers/net/wireless/rt2x00/rt2800lib.h2
-rw-r--r--drivers/net/wireless/rtlwifi/core.c2
-rw-r--r--drivers/net/wireless/ti/wlcore/main.c2
-rw-r--r--include/linux/ieee80211.h1
-rw-r--r--include/net/mac80211.h5
-rw-r--r--net/mac80211/agg-rx.c4
-rw-r--r--net/mac80211/agg-tx.c15
-rw-r--r--net/mac80211/driver-ops.h7
-rw-r--r--net/mac80211/sta_info.h2
-rw-r--r--net/mac80211/trace.h10
27 files changed, 52 insertions, 35 deletions
diff --git a/drivers/net/wireless/ath/ath10k/mac.c b/drivers/net/wireless/ath/ath10k/mac.c
index 64674c955d44..b04e7694c105 100644
--- a/drivers/net/wireless/ath/ath10k/mac.c
+++ b/drivers/net/wireless/ath/ath10k/mac.c
@@ -6144,7 +6144,7 @@ static int ath10k_ampdu_action(struct ieee80211_hw *hw,
6144 struct ieee80211_vif *vif, 6144 struct ieee80211_vif *vif,
6145 enum ieee80211_ampdu_mlme_action action, 6145 enum ieee80211_ampdu_mlme_action action,
6146 struct ieee80211_sta *sta, u16 tid, u16 *ssn, 6146 struct ieee80211_sta *sta, u16 tid, u16 *ssn,
6147 u8 buf_size) 6147 u8 buf_size, bool amsdu)
6148{ 6148{
6149 struct ath10k *ar = hw->priv; 6149 struct ath10k *ar = hw->priv;
6150 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif); 6150 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_main.c b/drivers/net/wireless/ath/ath9k/htc_drv_main.c
index 172a9ff4aaab..a680a970b7f7 100644
--- a/drivers/net/wireless/ath/ath9k/htc_drv_main.c
+++ b/drivers/net/wireless/ath/ath9k/htc_drv_main.c
@@ -1659,7 +1659,7 @@ static int ath9k_htc_ampdu_action(struct ieee80211_hw *hw,
1659 struct ieee80211_vif *vif, 1659 struct ieee80211_vif *vif,
1660 enum ieee80211_ampdu_mlme_action action, 1660 enum ieee80211_ampdu_mlme_action action,
1661 struct ieee80211_sta *sta, 1661 struct ieee80211_sta *sta,
1662 u16 tid, u16 *ssn, u8 buf_size) 1662 u16 tid, u16 *ssn, u8 buf_size, bool amsdu)
1663{ 1663{
1664 struct ath9k_htc_priv *priv = hw->priv; 1664 struct ath9k_htc_priv *priv = hw->priv;
1665 struct ath9k_htc_sta *ista; 1665 struct ath9k_htc_sta *ista;
diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c
index c27143ba9ffb..323eb33c3c6e 100644
--- a/drivers/net/wireless/ath/ath9k/main.c
+++ b/drivers/net/wireless/ath/ath9k/main.c
@@ -1856,7 +1856,7 @@ static int ath9k_ampdu_action(struct ieee80211_hw *hw,
1856 struct ieee80211_vif *vif, 1856 struct ieee80211_vif *vif,
1857 enum ieee80211_ampdu_mlme_action action, 1857 enum ieee80211_ampdu_mlme_action action,
1858 struct ieee80211_sta *sta, 1858 struct ieee80211_sta *sta,
1859 u16 tid, u16 *ssn, u8 buf_size) 1859 u16 tid, u16 *ssn, u8 buf_size, bool amsdu)
1860{ 1860{
1861 struct ath_softc *sc = hw->priv; 1861 struct ath_softc *sc = hw->priv;
1862 struct ath_common *common = ath9k_hw_common(sc->sc_ah); 1862 struct ath_common *common = ath9k_hw_common(sc->sc_ah);
diff --git a/drivers/net/wireless/ath/carl9170/main.c b/drivers/net/wireless/ath/carl9170/main.c
index 170c209f99b8..19d3d64416bf 100644
--- a/drivers/net/wireless/ath/carl9170/main.c
+++ b/drivers/net/wireless/ath/carl9170/main.c
@@ -1415,7 +1415,7 @@ static int carl9170_op_ampdu_action(struct ieee80211_hw *hw,
1415 struct ieee80211_vif *vif, 1415 struct ieee80211_vif *vif,
1416 enum ieee80211_ampdu_mlme_action action, 1416 enum ieee80211_ampdu_mlme_action action,
1417 struct ieee80211_sta *sta, 1417 struct ieee80211_sta *sta,
1418 u16 tid, u16 *ssn, u8 buf_size) 1418 u16 tid, u16 *ssn, u8 buf_size, bool amsdu)
1419{ 1419{
1420 struct ar9170 *ar = hw->priv; 1420 struct ar9170 *ar = hw->priv;
1421 struct carl9170_sta_info *sta_info = (void *) sta->drv_priv; 1421 struct carl9170_sta_info *sta_info = (void *) sta->drv_priv;
diff --git a/drivers/net/wireless/ath/wcn36xx/main.c b/drivers/net/wireless/ath/wcn36xx/main.c
index 900e72a089d8..7c169abdbafe 100644
--- a/drivers/net/wireless/ath/wcn36xx/main.c
+++ b/drivers/net/wireless/ath/wcn36xx/main.c
@@ -859,7 +859,7 @@ static int wcn36xx_ampdu_action(struct ieee80211_hw *hw,
859 struct ieee80211_vif *vif, 859 struct ieee80211_vif *vif,
860 enum ieee80211_ampdu_mlme_action action, 860 enum ieee80211_ampdu_mlme_action action,
861 struct ieee80211_sta *sta, u16 tid, u16 *ssn, 861 struct ieee80211_sta *sta, u16 tid, u16 *ssn,
862 u8 buf_size) 862 u8 buf_size, bool amsdu)
863{ 863{
864 struct wcn36xx *wcn = hw->priv; 864 struct wcn36xx *wcn = hw->priv;
865 struct wcn36xx_sta *sta_priv = NULL; 865 struct wcn36xx_sta *sta_priv = NULL;
diff --git a/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c b/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
index d2c5747e3ac9..bec2dc1ca2e4 100644
--- a/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
+++ b/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
@@ -820,7 +820,7 @@ brcms_ops_ampdu_action(struct ieee80211_hw *hw,
820 struct ieee80211_vif *vif, 820 struct ieee80211_vif *vif,
821 enum ieee80211_ampdu_mlme_action action, 821 enum ieee80211_ampdu_mlme_action action,
822 struct ieee80211_sta *sta, u16 tid, u16 *ssn, 822 struct ieee80211_sta *sta, u16 tid, u16 *ssn,
823 u8 buf_size) 823 u8 buf_size, bool amsdu)
824{ 824{
825 struct brcms_info *wl = hw->priv; 825 struct brcms_info *wl = hw->priv;
826 struct scb *scb = &wl->wlc->pri_scb; 826 struct scb *scb = &wl->wlc->pri_scb;
diff --git a/drivers/net/wireless/cw1200/sta.c b/drivers/net/wireless/cw1200/sta.c
index b86500b4418f..95a7fdb3cc1c 100644
--- a/drivers/net/wireless/cw1200/sta.c
+++ b/drivers/net/wireless/cw1200/sta.c
@@ -2137,7 +2137,7 @@ int cw1200_ampdu_action(struct ieee80211_hw *hw,
2137 struct ieee80211_vif *vif, 2137 struct ieee80211_vif *vif,
2138 enum ieee80211_ampdu_mlme_action action, 2138 enum ieee80211_ampdu_mlme_action action,
2139 struct ieee80211_sta *sta, u16 tid, u16 *ssn, 2139 struct ieee80211_sta *sta, u16 tid, u16 *ssn,
2140 u8 buf_size) 2140 u8 buf_size, bool amsdu)
2141{ 2141{
2142 /* Aggregation is implemented fully in firmware, 2142 /* Aggregation is implemented fully in firmware,
2143 * including block ack negotiation. Do not allow 2143 * including block ack negotiation. Do not allow
diff --git a/drivers/net/wireless/cw1200/sta.h b/drivers/net/wireless/cw1200/sta.h
index b7e386b7662b..bebb3379017f 100644
--- a/drivers/net/wireless/cw1200/sta.h
+++ b/drivers/net/wireless/cw1200/sta.h
@@ -111,7 +111,7 @@ int cw1200_ampdu_action(struct ieee80211_hw *hw,
111 struct ieee80211_vif *vif, 111 struct ieee80211_vif *vif,
112 enum ieee80211_ampdu_mlme_action action, 112 enum ieee80211_ampdu_mlme_action action,
113 struct ieee80211_sta *sta, u16 tid, u16 *ssn, 113 struct ieee80211_sta *sta, u16 tid, u16 *ssn,
114 u8 buf_size); 114 u8 buf_size, bool amsdu);
115 115
116void cw1200_suspend_resume(struct cw1200_common *priv, 116void cw1200_suspend_resume(struct cw1200_common *priv,
117 struct wsm_suspend_resume *arg); 117 struct wsm_suspend_resume *arg);
diff --git a/drivers/net/wireless/iwlegacy/4965-mac.c b/drivers/net/wireless/iwlegacy/4965-mac.c
index 44fa422f255e..6656215a13a9 100644
--- a/drivers/net/wireless/iwlegacy/4965-mac.c
+++ b/drivers/net/wireless/iwlegacy/4965-mac.c
@@ -5984,7 +5984,7 @@ int
5984il4965_mac_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 5984il4965_mac_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
5985 enum ieee80211_ampdu_mlme_action action, 5985 enum ieee80211_ampdu_mlme_action action,
5986 struct ieee80211_sta *sta, u16 tid, u16 * ssn, 5986 struct ieee80211_sta *sta, u16 tid, u16 * ssn,
5987 u8 buf_size) 5987 u8 buf_size, bool amsdu)
5988{ 5988{
5989 struct il_priv *il = hw->priv; 5989 struct il_priv *il = hw->priv;
5990 int ret = -EINVAL; 5990 int ret = -EINVAL;
diff --git a/drivers/net/wireless/iwlegacy/4965.h b/drivers/net/wireless/iwlegacy/4965.h
index 3a57f71b8ed5..8ab8706f9422 100644
--- a/drivers/net/wireless/iwlegacy/4965.h
+++ b/drivers/net/wireless/iwlegacy/4965.h
@@ -184,7 +184,7 @@ void il4965_mac_update_tkip_key(struct ieee80211_hw *hw,
184int il4965_mac_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 184int il4965_mac_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
185 enum ieee80211_ampdu_mlme_action action, 185 enum ieee80211_ampdu_mlme_action action,
186 struct ieee80211_sta *sta, u16 tid, u16 * ssn, 186 struct ieee80211_sta *sta, u16 tid, u16 * ssn,
187 u8 buf_size); 187 u8 buf_size, bool amsdu);
188int il4965_mac_sta_add(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 188int il4965_mac_sta_add(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
189 struct ieee80211_sta *sta); 189 struct ieee80211_sta *sta);
190void 190void
diff --git a/drivers/net/wireless/iwlwifi/dvm/mac80211.c b/drivers/net/wireless/iwlwifi/dvm/mac80211.c
index 453f7c315ab5..b3ad34e8bf5a 100644
--- a/drivers/net/wireless/iwlwifi/dvm/mac80211.c
+++ b/drivers/net/wireless/iwlwifi/dvm/mac80211.c
@@ -731,7 +731,7 @@ static int iwlagn_mac_ampdu_action(struct ieee80211_hw *hw,
731 struct ieee80211_vif *vif, 731 struct ieee80211_vif *vif,
732 enum ieee80211_ampdu_mlme_action action, 732 enum ieee80211_ampdu_mlme_action action,
733 struct ieee80211_sta *sta, u16 tid, u16 *ssn, 733 struct ieee80211_sta *sta, u16 tid, u16 *ssn,
734 u8 buf_size) 734 u8 buf_size, bool amsdu)
735{ 735{
736 struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw); 736 struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
737 int ret = -EINVAL; 737 int ret = -EINVAL;
diff --git a/drivers/net/wireless/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/iwlwifi/mvm/mac80211.c
index aa8c2b7f23c7..f70452c41d63 100644
--- a/drivers/net/wireless/iwlwifi/mvm/mac80211.c
+++ b/drivers/net/wireless/iwlwifi/mvm/mac80211.c
@@ -820,7 +820,7 @@ static int iwl_mvm_mac_ampdu_action(struct ieee80211_hw *hw,
820 struct ieee80211_vif *vif, 820 struct ieee80211_vif *vif,
821 enum ieee80211_ampdu_mlme_action action, 821 enum ieee80211_ampdu_mlme_action action,
822 struct ieee80211_sta *sta, u16 tid, 822 struct ieee80211_sta *sta, u16 tid,
823 u16 *ssn, u8 buf_size) 823 u16 *ssn, u8 buf_size, bool amsdu)
824{ 824{
825 struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw); 825 struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
826 int ret; 826 int ret;
diff --git a/drivers/net/wireless/mac80211_hwsim.c b/drivers/net/wireless/mac80211_hwsim.c
index 520bef80747f..2af2f3d0cc31 100644
--- a/drivers/net/wireless/mac80211_hwsim.c
+++ b/drivers/net/wireless/mac80211_hwsim.c
@@ -1819,7 +1819,7 @@ static int mac80211_hwsim_ampdu_action(struct ieee80211_hw *hw,
1819 struct ieee80211_vif *vif, 1819 struct ieee80211_vif *vif,
1820 enum ieee80211_ampdu_mlme_action action, 1820 enum ieee80211_ampdu_mlme_action action,
1821 struct ieee80211_sta *sta, u16 tid, u16 *ssn, 1821 struct ieee80211_sta *sta, u16 tid, u16 *ssn,
1822 u8 buf_size) 1822 u8 buf_size, bool amsdu)
1823{ 1823{
1824 switch (action) { 1824 switch (action) {
1825 case IEEE80211_AMPDU_TX_START: 1825 case IEEE80211_AMPDU_TX_START:
diff --git a/drivers/net/wireless/mediatek/mt7601u/main.c b/drivers/net/wireless/mediatek/mt7601u/main.c
index 169384b48b27..f715eee39851 100644
--- a/drivers/net/wireless/mediatek/mt7601u/main.c
+++ b/drivers/net/wireless/mediatek/mt7601u/main.c
@@ -335,7 +335,8 @@ static int mt7601u_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
335static int 335static int
336mt76_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 336mt76_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
337 enum ieee80211_ampdu_mlme_action action, 337 enum ieee80211_ampdu_mlme_action action,
338 struct ieee80211_sta *sta, u16 tid, u16 *ssn, u8 buf_size) 338 struct ieee80211_sta *sta, u16 tid, u16 *ssn, u8 buf_size,
339 bool amsdu)
339{ 340{
340 struct mt7601u_dev *dev = hw->priv; 341 struct mt7601u_dev *dev = hw->priv;
341 struct mt76_sta *msta = (struct mt76_sta *) sta->drv_priv; 342 struct mt76_sta *msta = (struct mt76_sta *) sta->drv_priv;
diff --git a/drivers/net/wireless/mwl8k.c b/drivers/net/wireless/mwl8k.c
index 9420fc61c2e6..30e3aaae32e2 100644
--- a/drivers/net/wireless/mwl8k.c
+++ b/drivers/net/wireless/mwl8k.c
@@ -5423,7 +5423,7 @@ static int
5423mwl8k_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 5423mwl8k_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
5424 enum ieee80211_ampdu_mlme_action action, 5424 enum ieee80211_ampdu_mlme_action action,
5425 struct ieee80211_sta *sta, u16 tid, u16 *ssn, 5425 struct ieee80211_sta *sta, u16 tid, u16 *ssn,
5426 u8 buf_size) 5426 u8 buf_size, bool amsdu)
5427{ 5427{
5428 5428
5429 int i, rc = 0; 5429 int i, rc = 0;
diff --git a/drivers/net/wireless/rsi/rsi_91x_mac80211.c b/drivers/net/wireless/rsi/rsi_91x_mac80211.c
index 7e804324bfa7..b5bcc933a2a6 100644
--- a/drivers/net/wireless/rsi/rsi_91x_mac80211.c
+++ b/drivers/net/wireless/rsi/rsi_91x_mac80211.c
@@ -664,6 +664,7 @@ static int rsi_mac80211_set_key(struct ieee80211_hw *hw,
664 * @tid: Traffic identifier. 664 * @tid: Traffic identifier.
665 * @ssn: Pointer to ssn value. 665 * @ssn: Pointer to ssn value.
666 * @buf_size: Buffer size (for kernel version > 2.6.38). 666 * @buf_size: Buffer size (for kernel version > 2.6.38).
667 * @amsdu: is AMSDU in AMPDU allowed
667 * 668 *
668 * Return: status: 0 on success, negative error code on failure. 669 * Return: status: 0 on success, negative error code on failure.
669 */ 670 */
@@ -673,7 +674,8 @@ static int rsi_mac80211_ampdu_action(struct ieee80211_hw *hw,
673 struct ieee80211_sta *sta, 674 struct ieee80211_sta *sta,
674 unsigned short tid, 675 unsigned short tid,
675 unsigned short *ssn, 676 unsigned short *ssn,
676 unsigned char buf_size) 677 unsigned char buf_size,
678 bool amsdu)
677{ 679{
678 int status = -EOPNOTSUPP; 680 int status = -EOPNOTSUPP;
679 struct rsi_hw *adapter = hw->priv; 681 struct rsi_hw *adapter = hw->priv;
diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c
index 9524564f873b..9733b31a780d 100644
--- a/drivers/net/wireless/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
@@ -7937,7 +7937,7 @@ EXPORT_SYMBOL_GPL(rt2800_get_tsf);
7937int rt2800_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 7937int rt2800_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
7938 enum ieee80211_ampdu_mlme_action action, 7938 enum ieee80211_ampdu_mlme_action action,
7939 struct ieee80211_sta *sta, u16 tid, u16 *ssn, 7939 struct ieee80211_sta *sta, u16 tid, u16 *ssn,
7940 u8 buf_size) 7940 u8 buf_size, bool amsdu)
7941{ 7941{
7942 struct rt2x00_sta *sta_priv = (struct rt2x00_sta *)sta->drv_priv; 7942 struct rt2x00_sta *sta_priv = (struct rt2x00_sta *)sta->drv_priv;
7943 int ret = 0; 7943 int ret = 0;
diff --git a/drivers/net/wireless/rt2x00/rt2800lib.h b/drivers/net/wireless/rt2x00/rt2800lib.h
index 1609b8a7f7eb..440790b92b19 100644
--- a/drivers/net/wireless/rt2x00/rt2800lib.h
+++ b/drivers/net/wireless/rt2x00/rt2800lib.h
@@ -220,7 +220,7 @@ u64 rt2800_get_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif);
220int rt2800_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 220int rt2800_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
221 enum ieee80211_ampdu_mlme_action action, 221 enum ieee80211_ampdu_mlme_action action,
222 struct ieee80211_sta *sta, u16 tid, u16 *ssn, 222 struct ieee80211_sta *sta, u16 tid, u16 *ssn,
223 u8 buf_size); 223 u8 buf_size, bool amsdu);
224int rt2800_get_survey(struct ieee80211_hw *hw, int idx, 224int rt2800_get_survey(struct ieee80211_hw *hw, int idx,
225 struct survey_info *survey); 225 struct survey_info *survey);
226void rt2800_disable_wpdma(struct rt2x00_dev *rt2x00dev); 226void rt2800_disable_wpdma(struct rt2x00_dev *rt2x00dev);
diff --git a/drivers/net/wireless/rtlwifi/core.c b/drivers/net/wireless/rtlwifi/core.c
index 585d0883c7e5..c925a4dff599 100644
--- a/drivers/net/wireless/rtlwifi/core.c
+++ b/drivers/net/wireless/rtlwifi/core.c
@@ -1373,7 +1373,7 @@ static int rtl_op_ampdu_action(struct ieee80211_hw *hw,
1373 struct ieee80211_vif *vif, 1373 struct ieee80211_vif *vif,
1374 enum ieee80211_ampdu_mlme_action action, 1374 enum ieee80211_ampdu_mlme_action action,
1375 struct ieee80211_sta *sta, u16 tid, u16 *ssn, 1375 struct ieee80211_sta *sta, u16 tid, u16 *ssn,
1376 u8 buf_size) 1376 u8 buf_size, bool amsdu)
1377{ 1377{
1378 struct rtl_priv *rtlpriv = rtl_priv(hw); 1378 struct rtl_priv *rtlpriv = rtl_priv(hw);
1379 1379
diff --git a/drivers/net/wireless/ti/wlcore/main.c b/drivers/net/wireless/ti/wlcore/main.c
index e819369d8f8f..ec7f6af3fab2 100644
--- a/drivers/net/wireless/ti/wlcore/main.c
+++ b/drivers/net/wireless/ti/wlcore/main.c
@@ -5263,7 +5263,7 @@ static int wl1271_op_ampdu_action(struct ieee80211_hw *hw,
5263 struct ieee80211_vif *vif, 5263 struct ieee80211_vif *vif,
5264 enum ieee80211_ampdu_mlme_action action, 5264 enum ieee80211_ampdu_mlme_action action,
5265 struct ieee80211_sta *sta, u16 tid, u16 *ssn, 5265 struct ieee80211_sta *sta, u16 tid, u16 *ssn,
5266 u8 buf_size) 5266 u8 buf_size, bool amsdu)
5267{ 5267{
5268 struct wl1271 *wl = hw->priv; 5268 struct wl1271 *wl = hw->priv;
5269 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif); 5269 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
diff --git a/include/linux/ieee80211.h b/include/linux/ieee80211.h
index cfa906f28b7a..19eb9ecd6cf3 100644
--- a/include/linux/ieee80211.h
+++ b/include/linux/ieee80211.h
@@ -1379,6 +1379,7 @@ struct ieee80211_ht_operation {
1379 1379
1380 1380
1381/* block-ack parameters */ 1381/* block-ack parameters */
1382#define IEEE80211_ADDBA_PARAM_AMSDU_MASK 0x0001
1382#define IEEE80211_ADDBA_PARAM_POLICY_MASK 0x0002 1383#define IEEE80211_ADDBA_PARAM_POLICY_MASK 0x0002
1383#define IEEE80211_ADDBA_PARAM_TID_MASK 0x003C 1384#define IEEE80211_ADDBA_PARAM_TID_MASK 0x003C
1384#define IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK 0xFFC0 1385#define IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK 0xFFC0
diff --git a/include/net/mac80211.h b/include/net/mac80211.h
index 167864503138..f28cbc0988eb 100644
--- a/include/net/mac80211.h
+++ b/include/net/mac80211.h
@@ -3026,6 +3026,9 @@ enum ieee80211_reconfig_type {
3026 * buffer size of 8. Correct ways to retransmit #1 would be: 3026 * buffer size of 8. Correct ways to retransmit #1 would be:
3027 * - TX: 1 or 18 or 81 3027 * - TX: 1 or 18 or 81
3028 * Even "189" would be wrong since 1 could be lost again. 3028 * Even "189" would be wrong since 1 could be lost again.
3029 * The @amsdu parameter is valid when the action is set to
3030 * %IEEE80211_AMPDU_TX_OPERATIONAL and indicates the peer's ability
3031 * to receive A-MSDU within A-MPDU.
3029 * 3032 *
3030 * Returns a negative error code on failure. 3033 * Returns a negative error code on failure.
3031 * The callback can sleep. 3034 * The callback can sleep.
@@ -3363,7 +3366,7 @@ struct ieee80211_ops {
3363 struct ieee80211_vif *vif, 3366 struct ieee80211_vif *vif,
3364 enum ieee80211_ampdu_mlme_action action, 3367 enum ieee80211_ampdu_mlme_action action,
3365 struct ieee80211_sta *sta, u16 tid, u16 *ssn, 3368 struct ieee80211_sta *sta, u16 tid, u16 *ssn,
3366 u8 buf_size); 3369 u8 buf_size, bool amsdu);
3367 int (*get_survey)(struct ieee80211_hw *hw, int idx, 3370 int (*get_survey)(struct ieee80211_hw *hw, int idx,
3368 struct survey_info *survey); 3371 struct survey_info *survey);
3369 void (*rfkill_poll)(struct ieee80211_hw *hw); 3372 void (*rfkill_poll)(struct ieee80211_hw *hw);
diff --git a/net/mac80211/agg-rx.c b/net/mac80211/agg-rx.c
index 5c564a68fb50..6ebe8611eca5 100644
--- a/net/mac80211/agg-rx.c
+++ b/net/mac80211/agg-rx.c
@@ -79,7 +79,7 @@ void ___ieee80211_stop_rx_ba_session(struct sta_info *sta, u16 tid,
79 (int)reason); 79 (int)reason);
80 80
81 if (drv_ampdu_action(local, sta->sdata, IEEE80211_AMPDU_RX_STOP, 81 if (drv_ampdu_action(local, sta->sdata, IEEE80211_AMPDU_RX_STOP,
82 &sta->sta, tid, NULL, 0)) 82 &sta->sta, tid, NULL, 0, false))
83 sdata_info(sta->sdata, 83 sdata_info(sta->sdata,
84 "HW problem - can not stop rx aggregation for %pM tid %d\n", 84 "HW problem - can not stop rx aggregation for %pM tid %d\n",
85 sta->sta.addr, tid); 85 sta->sta.addr, tid);
@@ -321,7 +321,7 @@ void __ieee80211_start_rx_ba_session(struct sta_info *sta,
321 __skb_queue_head_init(&tid_agg_rx->reorder_buf[i]); 321 __skb_queue_head_init(&tid_agg_rx->reorder_buf[i]);
322 322
323 ret = drv_ampdu_action(local, sta->sdata, IEEE80211_AMPDU_RX_START, 323 ret = drv_ampdu_action(local, sta->sdata, IEEE80211_AMPDU_RX_START,
324 &sta->sta, tid, &start_seq_num, 0); 324 &sta->sta, tid, &start_seq_num, 0, false);
325 ht_dbg(sta->sdata, "Rx A-MPDU request on %pM tid %d result %d\n", 325 ht_dbg(sta->sdata, "Rx A-MPDU request on %pM tid %d result %d\n",
326 sta->sta.addr, tid, ret); 326 sta->sta.addr, tid, ret);
327 if (ret) { 327 if (ret) {
diff --git a/net/mac80211/agg-tx.c b/net/mac80211/agg-tx.c
index c8ba2e77737c..a758eb84e8f0 100644
--- a/net/mac80211/agg-tx.c
+++ b/net/mac80211/agg-tx.c
@@ -97,7 +97,8 @@ static void ieee80211_send_addba_request(struct ieee80211_sub_if_data *sdata,
97 mgmt->u.action.u.addba_req.action_code = WLAN_ACTION_ADDBA_REQ; 97 mgmt->u.action.u.addba_req.action_code = WLAN_ACTION_ADDBA_REQ;
98 98
99 mgmt->u.action.u.addba_req.dialog_token = dialog_token; 99 mgmt->u.action.u.addba_req.dialog_token = dialog_token;
100 capab = (u16)(1 << 1); /* bit 1 aggregation policy */ 100 capab = (u16)(1 << 0); /* bit 0 A-MSDU support */
101 capab |= (u16)(1 << 1); /* bit 1 aggregation policy */
101 capab |= (u16)(tid << 2); /* bit 5:2 TID number */ 102 capab |= (u16)(tid << 2); /* bit 5:2 TID number */
102 capab |= (u16)(agg_size << 6); /* bit 15:6 max size of aggergation */ 103 capab |= (u16)(agg_size << 6); /* bit 15:6 max size of aggergation */
103 104
@@ -331,7 +332,7 @@ int ___ieee80211_stop_tx_ba_session(struct sta_info *sta, u16 tid,
331 return -EALREADY; 332 return -EALREADY;
332 ret = drv_ampdu_action(local, sta->sdata, 333 ret = drv_ampdu_action(local, sta->sdata,
333 IEEE80211_AMPDU_TX_STOP_FLUSH_CONT, 334 IEEE80211_AMPDU_TX_STOP_FLUSH_CONT,
334 &sta->sta, tid, NULL, 0); 335 &sta->sta, tid, NULL, 0, false);
335 WARN_ON_ONCE(ret); 336 WARN_ON_ONCE(ret);
336 return 0; 337 return 0;
337 } 338 }
@@ -381,7 +382,7 @@ int ___ieee80211_stop_tx_ba_session(struct sta_info *sta, u16 tid,
381 tid_tx->tx_stop = reason == AGG_STOP_LOCAL_REQUEST; 382 tid_tx->tx_stop = reason == AGG_STOP_LOCAL_REQUEST;
382 383
383 ret = drv_ampdu_action(local, sta->sdata, action, 384 ret = drv_ampdu_action(local, sta->sdata, action,
384 &sta->sta, tid, NULL, 0); 385 &sta->sta, tid, NULL, 0, false);
385 386
386 /* HW shall not deny going back to legacy */ 387 /* HW shall not deny going back to legacy */
387 if (WARN_ON(ret)) { 388 if (WARN_ON(ret)) {
@@ -469,7 +470,7 @@ void ieee80211_tx_ba_session_handle_start(struct sta_info *sta, int tid)
469 start_seq_num = sta->tid_seq[tid] >> 4; 470 start_seq_num = sta->tid_seq[tid] >> 4;
470 471
471 ret = drv_ampdu_action(local, sdata, IEEE80211_AMPDU_TX_START, 472 ret = drv_ampdu_action(local, sdata, IEEE80211_AMPDU_TX_START,
472 &sta->sta, tid, &start_seq_num, 0); 473 &sta->sta, tid, &start_seq_num, 0, false);
473 if (ret) { 474 if (ret) {
474 ht_dbg(sdata, 475 ht_dbg(sdata,
475 "BA request denied - HW unavailable for %pM tid %d\n", 476 "BA request denied - HW unavailable for %pM tid %d\n",
@@ -693,7 +694,8 @@ static void ieee80211_agg_tx_operational(struct ieee80211_local *local,
693 694
694 drv_ampdu_action(local, sta->sdata, 695 drv_ampdu_action(local, sta->sdata,
695 IEEE80211_AMPDU_TX_OPERATIONAL, 696 IEEE80211_AMPDU_TX_OPERATIONAL,
696 &sta->sta, tid, NULL, tid_tx->buf_size); 697 &sta->sta, tid, NULL, tid_tx->buf_size,
698 tid_tx->amsdu);
697 699
698 /* 700 /*
699 * synchronize with TX path, while splicing the TX path 701 * synchronize with TX path, while splicing the TX path
@@ -918,8 +920,10 @@ void ieee80211_process_addba_resp(struct ieee80211_local *local,
918 struct tid_ampdu_tx *tid_tx; 920 struct tid_ampdu_tx *tid_tx;
919 u16 capab, tid; 921 u16 capab, tid;
920 u8 buf_size; 922 u8 buf_size;
923 bool amsdu;
921 924
922 capab = le16_to_cpu(mgmt->u.action.u.addba_resp.capab); 925 capab = le16_to_cpu(mgmt->u.action.u.addba_resp.capab);
926 amsdu = capab & IEEE80211_ADDBA_PARAM_AMSDU_MASK;
923 tid = (capab & IEEE80211_ADDBA_PARAM_TID_MASK) >> 2; 927 tid = (capab & IEEE80211_ADDBA_PARAM_TID_MASK) >> 2;
924 buf_size = (capab & IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK) >> 6; 928 buf_size = (capab & IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK) >> 6;
925 929
@@ -968,6 +972,7 @@ void ieee80211_process_addba_resp(struct ieee80211_local *local,
968 } 972 }
969 973
970 tid_tx->buf_size = buf_size; 974 tid_tx->buf_size = buf_size;
975 tid_tx->amsdu = amsdu;
971 976
972 if (test_bit(HT_AGG_STATE_DRV_READY, &tid_tx->state)) 977 if (test_bit(HT_AGG_STATE_DRV_READY, &tid_tx->state))
973 ieee80211_agg_tx_operational(local, sta, tid); 978 ieee80211_agg_tx_operational(local, sta, tid);
diff --git a/net/mac80211/driver-ops.h b/net/mac80211/driver-ops.h
index 157b20baf752..31482e2cd25f 100644
--- a/net/mac80211/driver-ops.h
+++ b/net/mac80211/driver-ops.h
@@ -734,7 +734,7 @@ static inline int drv_ampdu_action(struct ieee80211_local *local,
734 struct ieee80211_sub_if_data *sdata, 734 struct ieee80211_sub_if_data *sdata,
735 enum ieee80211_ampdu_mlme_action action, 735 enum ieee80211_ampdu_mlme_action action,
736 struct ieee80211_sta *sta, u16 tid, 736 struct ieee80211_sta *sta, u16 tid,
737 u16 *ssn, u8 buf_size) 737 u16 *ssn, u8 buf_size, bool amsdu)
738{ 738{
739 int ret = -EOPNOTSUPP; 739 int ret = -EOPNOTSUPP;
740 740
@@ -744,11 +744,12 @@ static inline int drv_ampdu_action(struct ieee80211_local *local,
744 if (!check_sdata_in_driver(sdata)) 744 if (!check_sdata_in_driver(sdata))
745 return -EIO; 745 return -EIO;
746 746
747 trace_drv_ampdu_action(local, sdata, action, sta, tid, ssn, buf_size); 747 trace_drv_ampdu_action(local, sdata, action, sta, tid,
748 ssn, buf_size, amsdu);
748 749
749 if (local->ops->ampdu_action) 750 if (local->ops->ampdu_action)
750 ret = local->ops->ampdu_action(&local->hw, &sdata->vif, action, 751 ret = local->ops->ampdu_action(&local->hw, &sdata->vif, action,
751 sta, tid, ssn, buf_size); 752 sta, tid, ssn, buf_size, amsdu);
752 753
753 trace_drv_return_int(local, ret); 754 trace_drv_return_int(local, ret);
754 755
diff --git a/net/mac80211/sta_info.h b/net/mac80211/sta_info.h
index b087c71ff7fe..d5ded8749ac4 100644
--- a/net/mac80211/sta_info.h
+++ b/net/mac80211/sta_info.h
@@ -133,6 +133,7 @@ enum ieee80211_agg_stop_reason {
133 * @buf_size: reorder buffer size at receiver 133 * @buf_size: reorder buffer size at receiver
134 * @failed_bar_ssn: ssn of the last failed BAR tx attempt 134 * @failed_bar_ssn: ssn of the last failed BAR tx attempt
135 * @bar_pending: BAR needs to be re-sent 135 * @bar_pending: BAR needs to be re-sent
136 * @amsdu: support A-MSDU withing A-MDPU
136 * 137 *
137 * This structure's lifetime is managed by RCU, assignments to 138 * This structure's lifetime is managed by RCU, assignments to
138 * the array holding it must hold the aggregation mutex. 139 * the array holding it must hold the aggregation mutex.
@@ -158,6 +159,7 @@ struct tid_ampdu_tx {
158 159
159 u16 failed_bar_ssn; 160 u16 failed_bar_ssn;
160 bool bar_pending; 161 bool bar_pending;
162 bool amsdu;
161}; 163};
162 164
163/** 165/**
diff --git a/net/mac80211/trace.h b/net/mac80211/trace.h
index b5960b948f60..314e3bd7fbdb 100644
--- a/net/mac80211/trace.h
+++ b/net/mac80211/trace.h
@@ -974,9 +974,9 @@ TRACE_EVENT(drv_ampdu_action,
974 struct ieee80211_sub_if_data *sdata, 974 struct ieee80211_sub_if_data *sdata,
975 enum ieee80211_ampdu_mlme_action action, 975 enum ieee80211_ampdu_mlme_action action,
976 struct ieee80211_sta *sta, u16 tid, 976 struct ieee80211_sta *sta, u16 tid,
977 u16 *ssn, u8 buf_size), 977 u16 *ssn, u8 buf_size, bool amsdu),
978 978
979 TP_ARGS(local, sdata, action, sta, tid, ssn, buf_size), 979 TP_ARGS(local, sdata, action, sta, tid, ssn, buf_size, amsdu),
980 980
981 TP_STRUCT__entry( 981 TP_STRUCT__entry(
982 LOCAL_ENTRY 982 LOCAL_ENTRY
@@ -985,6 +985,7 @@ TRACE_EVENT(drv_ampdu_action,
985 __field(u16, tid) 985 __field(u16, tid)
986 __field(u16, ssn) 986 __field(u16, ssn)
987 __field(u8, buf_size) 987 __field(u8, buf_size)
988 __field(bool, amsdu)
988 VIF_ENTRY 989 VIF_ENTRY
989 ), 990 ),
990 991
@@ -996,12 +997,13 @@ TRACE_EVENT(drv_ampdu_action,
996 __entry->tid = tid; 997 __entry->tid = tid;
997 __entry->ssn = ssn ? *ssn : 0; 998 __entry->ssn = ssn ? *ssn : 0;
998 __entry->buf_size = buf_size; 999 __entry->buf_size = buf_size;
1000 __entry->amsdu = amsdu;
999 ), 1001 ),
1000 1002
1001 TP_printk( 1003 TP_printk(
1002 LOCAL_PR_FMT VIF_PR_FMT STA_PR_FMT " action:%d tid:%d buf:%d", 1004 LOCAL_PR_FMT VIF_PR_FMT STA_PR_FMT " action:%d tid:%d buf:%d amsdu:%d",
1003 LOCAL_PR_ARG, VIF_PR_ARG, STA_PR_ARG, __entry->action, 1005 LOCAL_PR_ARG, VIF_PR_ARG, STA_PR_ARG, __entry->action,
1004 __entry->tid, __entry->buf_size 1006 __entry->tid, __entry->buf_size, __entry->amsdu
1005 ) 1007 )
1006); 1008);
1007 1009