diff options
author | Emmanuel Grumbach <emmanuel.grumbach@intel.com> | 2015-08-16 04:13:22 -0400 |
---|---|---|
committer | Johannes Berg <johannes.berg@intel.com> | 2015-09-22 09:21:23 -0400 |
commit | e3abc8ff0fc18b3925fd5d5c5fbd1613856f4e7c (patch) | |
tree | 6e551a123ce0462ae6aed766ade50ae1bac0efbc | |
parent | 1b09b5568e5f46c6dfb781d7c1dfad431a6d8ec1 (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>
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 | ||
116 | void cw1200_suspend_resume(struct cw1200_common *priv, | 116 | void 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 | |||
5984 | il4965_mac_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif, | 5984 | il4965_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, | |||
184 | int il4965_mac_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif, | 184 | int 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); |
188 | int il4965_mac_sta_add(struct ieee80211_hw *hw, struct ieee80211_vif *vif, | 188 | int il4965_mac_sta_add(struct ieee80211_hw *hw, struct ieee80211_vif *vif, |
189 | struct ieee80211_sta *sta); | 189 | struct ieee80211_sta *sta); |
190 | void | 190 | void |
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) | |||
335 | static int | 335 | static int |
336 | mt76_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif, | 336 | mt76_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 | |||
5423 | mwl8k_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif, | 5423 | mwl8k_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); | |||
7937 | int rt2800_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif, | 7937 | int 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); | |||
220 | int rt2800_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif, | 220 | int 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); |
224 | int rt2800_get_survey(struct ieee80211_hw *hw, int idx, | 224 | int rt2800_get_survey(struct ieee80211_hw *hw, int idx, |
225 | struct survey_info *survey); | 225 | struct survey_info *survey); |
226 | void rt2800_disable_wpdma(struct rt2x00_dev *rt2x00dev); | 226 | void 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 | ||