On Sat, Aug 15, 2015 at 10:39 PM, Emmanuel Grumbach
<[email protected]> wrote:
> 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 <[email protected]>
Ooops - I forgot to enable compilations for all the drivers....
Will re-submit.
> ---
> drivers/net/wireless/iwlwifi/dvm/mac80211.c | 2 +-
> drivers/net/wireless/iwlwifi/mvm/mac80211.c | 2 +-
> drivers/net/wireless/mac80211_hwsim.c | 2 +-
> include/linux/ieee80211.h | 1 +
> include/net/mac80211.h | 5 ++++-
> net/mac80211/agg-rx.c | 4 ++--
> net/mac80211/agg-tx.c | 15 ++++++++++-----
> net/mac80211/driver-ops.h | 7 ++++---
> net/mac80211/sta_info.h | 2 ++
> net/mac80211/trace.h | 10 ++++++----
> 10 files changed, 32 insertions(+), 18 deletions(-)
>
> diff --git a/drivers/net/wireless/iwlwifi/dvm/mac80211.c
> b/drivers/net/wireless/iwlwifi/dvm/mac80211.c
> index 7acaa26..26445a5 100644
> --- a/drivers/net/wireless/iwlwifi/dvm/mac80211.c
> +++ b/drivers/net/wireless/iwlwifi/dvm/mac80211.c
> @@ -719,7 +719,7 @@ static int iwlagn_mac_ampdu_action(struct ieee80211_hw
> *hw,
> struct ieee80211_vif *vif,
> enum ieee80211_ampdu_mlme_action action,
> struct ieee80211_sta *sta, u16 tid, u16
> *ssn,
> - u8 buf_size)
> + u8 buf_size, bool amsdu)
> {
> struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
> int ret = -EINVAL;
> diff --git a/drivers/net/wireless/iwlwifi/mvm/mac80211.c
> b/drivers/net/wireless/iwlwifi/mvm/mac80211.c
> index dfdab38..dc46919 100644
> --- a/drivers/net/wireless/iwlwifi/mvm/mac80211.c
> +++ b/drivers/net/wireless/iwlwifi/mvm/mac80211.c
> @@ -815,7 +815,7 @@ static int iwl_mvm_mac_ampdu_action(struct ieee80211_hw
> *hw,
> struct ieee80211_vif *vif,
> enum ieee80211_ampdu_mlme_action action,
> struct ieee80211_sta *sta, u16 tid,
> - u16 *ssn, u8 buf_size)
> + u16 *ssn, u8 buf_size, bool amsdu)
> {
> struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
> int ret;
> diff --git a/drivers/net/wireless/mac80211_hwsim.c
> b/drivers/net/wireless/mac80211_hwsim.c
> index dbb46ec..6d2a622 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,
> struct ieee80211_vif *vif,
> enum ieee80211_ampdu_mlme_action
> action,
> struct ieee80211_sta *sta, u16 tid,
> u16 *ssn,
> - u8 buf_size)
> + u8 buf_size, bool amsdu)
> {
> switch (action) {
> case IEEE80211_AMPDU_TX_START:
> diff --git a/include/linux/ieee80211.h b/include/linux/ieee80211.h
> index cfa906f..19eb9ec 100644
> --- a/include/linux/ieee80211.h
> +++ b/include/linux/ieee80211.h
> @@ -1379,6 +1379,7 @@ struct ieee80211_ht_operation {
>
>
> /* block-ack parameters */
> +#define IEEE80211_ADDBA_PARAM_AMSDU_MASK 0x0001
> #define IEEE80211_ADDBA_PARAM_POLICY_MASK 0x0002
> #define IEEE80211_ADDBA_PARAM_TID_MASK 0x003C
> #define IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK 0xFFC0
> diff --git a/include/net/mac80211.h b/include/net/mac80211.h
> index 344424c..d37d6cd 100644
> --- a/include/net/mac80211.h
> +++ b/include/net/mac80211.h
> @@ -3033,6 +3033,9 @@ enum ieee80211_reconfig_type {
> * buffer size of 8. Correct ways to retransmit #1 would be:
> * - TX: 1 or 18 or 81
> * Even "189" would be wrong since 1 could be lost again.
> + * The @amsdu parameter is valid when the action is set to
> + * %IEEE80211_AMPDU_TX_OPERATIONAL and indicates the peer's ability
> + * to receive A-MSDU within A-MPDU.
> *
> * Returns a negative error code on failure.
> * The callback can sleep.
> @@ -3370,7 +3373,7 @@ struct ieee80211_ops {
> struct ieee80211_vif *vif,
> enum ieee80211_ampdu_mlme_action action,
> struct ieee80211_sta *sta, u16 tid, u16 *ssn,
> - u8 buf_size);
> + u8 buf_size, bool amsdu);
> int (*get_survey)(struct ieee80211_hw *hw, int idx,
> struct survey_info *survey);
> void (*rfkill_poll)(struct ieee80211_hw *hw);
> diff --git a/net/mac80211/agg-rx.c b/net/mac80211/agg-rx.c
> index 78de79b..10ad4ac 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,
> (int)reason);
>
> if (drv_ampdu_action(local, sta->sdata, IEEE80211_AMPDU_RX_STOP,
> - &sta->sta, tid, NULL, 0))
> + &sta->sta, tid, NULL, 0, false))
> sdata_info(sta->sdata,
> "HW problem - can not stop rx aggregation for %pM
> tid %d\n",
> sta->sta.addr, tid);
> @@ -323,7 +323,7 @@ void __ieee80211_start_rx_ba_session(struct sta_info *sta,
> __skb_queue_head_init(&tid_agg_rx->reorder_buf[i]);
>
> ret = drv_ampdu_action(local, sta->sdata, IEEE80211_AMPDU_RX_START,
> - &sta->sta, tid, &start_seq_num, 0);
> + &sta->sta, tid, &start_seq_num, 0, false);
> ht_dbg(sta->sdata, "Rx A-MPDU request on %pM tid %d result %d\n",
> sta->sta.addr, tid, ret);
> if (ret) {
> diff --git a/net/mac80211/agg-tx.c b/net/mac80211/agg-tx.c
> index c8ba2e7..a758eb84 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,
> mgmt->u.action.u.addba_req.action_code = WLAN_ACTION_ADDBA_REQ;
>
> mgmt->u.action.u.addba_req.dialog_token = dialog_token;
> - capab = (u16)(1 << 1); /* bit 1 aggregation policy */
> + capab = (u16)(1 << 0); /* bit 0 A-MSDU support */
> + capab |= (u16)(1 << 1); /* bit 1 aggregation policy */
> capab |= (u16)(tid << 2); /* bit 5:2 TID number */
> capab |= (u16)(agg_size << 6); /* bit 15:6 max size of aggergation */
>
> @@ -331,7 +332,7 @@ int ___ieee80211_stop_tx_ba_session(struct sta_info *sta,
> u16 tid,
> return -EALREADY;
> ret = drv_ampdu_action(local, sta->sdata,
> IEEE80211_AMPDU_TX_STOP_FLUSH_CONT,
> - &sta->sta, tid, NULL, 0);
> + &sta->sta, tid, NULL, 0, false);
> WARN_ON_ONCE(ret);
> return 0;
> }
> @@ -381,7 +382,7 @@ int ___ieee80211_stop_tx_ba_session(struct sta_info *sta,
> u16 tid,
> tid_tx->tx_stop = reason == AGG_STOP_LOCAL_REQUEST;
>
> ret = drv_ampdu_action(local, sta->sdata, action,
> - &sta->sta, tid, NULL, 0);
> + &sta->sta, tid, NULL, 0, false);
>
> /* HW shall not deny going back to legacy */
> if (WARN_ON(ret)) {
> @@ -469,7 +470,7 @@ void ieee80211_tx_ba_session_handle_start(struct sta_info
> *sta, int tid)
> start_seq_num = sta->tid_seq[tid] >> 4;
>
> ret = drv_ampdu_action(local, sdata, IEEE80211_AMPDU_TX_START,
> - &sta->sta, tid, &start_seq_num, 0);
> + &sta->sta, tid, &start_seq_num, 0, false);
> if (ret) {
> ht_dbg(sdata,
> "BA request denied - HW unavailable for %pM tid %d\n",
> @@ -693,7 +694,8 @@ static void ieee80211_agg_tx_operational(struct
> ieee80211_local *local,
>
> drv_ampdu_action(local, sta->sdata,
> IEEE80211_AMPDU_TX_OPERATIONAL,
> - &sta->sta, tid, NULL, tid_tx->buf_size);
> + &sta->sta, tid, NULL, tid_tx->buf_size,
> + tid_tx->amsdu);
>
> /*
> * synchronize with TX path, while splicing the TX path
> @@ -918,8 +920,10 @@ void ieee80211_process_addba_resp(struct ieee80211_local
> *local,
> struct tid_ampdu_tx *tid_tx;
> u16 capab, tid;
> u8 buf_size;
> + bool amsdu;
>
> capab = le16_to_cpu(mgmt->u.action.u.addba_resp.capab);
> + amsdu = capab & IEEE80211_ADDBA_PARAM_AMSDU_MASK;
> tid = (capab & IEEE80211_ADDBA_PARAM_TID_MASK) >> 2;
> buf_size = (capab & IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK) >> 6;
>
> @@ -968,6 +972,7 @@ void ieee80211_process_addba_resp(struct ieee80211_local
> *local,
> }
>
> tid_tx->buf_size = buf_size;
> + tid_tx->amsdu = amsdu;
>
> if (test_bit(HT_AGG_STATE_DRV_READY, &tid_tx->state))
> ieee80211_agg_tx_operational(local, sta, tid);
> diff --git a/net/mac80211/driver-ops.h b/net/mac80211/driver-ops.h
> index 157b20b..31482e2 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,
> struct ieee80211_sub_if_data *sdata,
> enum ieee80211_ampdu_mlme_action action,
> struct ieee80211_sta *sta, u16 tid,
> - u16 *ssn, u8 buf_size)
> + u16 *ssn, u8 buf_size, bool amsdu)
> {
> int ret = -EOPNOTSUPP;
>
> @@ -744,11 +744,12 @@ static inline int drv_ampdu_action(struct
> ieee80211_local *local,
> if (!check_sdata_in_driver(sdata))
> return -EIO;
>
> - trace_drv_ampdu_action(local, sdata, action, sta, tid, ssn, buf_size);
> + trace_drv_ampdu_action(local, sdata, action, sta, tid,
> + ssn, buf_size, amsdu);
>
> if (local->ops->ampdu_action)
> ret = local->ops->ampdu_action(&local->hw, &sdata->vif,
> action,
> - sta, tid, ssn, buf_size);
> + sta, tid, ssn, buf_size,
> amsdu);
>
> trace_drv_return_int(local, ret);
>
> diff --git a/net/mac80211/sta_info.h b/net/mac80211/sta_info.h
> index b087c71..d5ded87 100644
> --- a/net/mac80211/sta_info.h
> +++ b/net/mac80211/sta_info.h
> @@ -133,6 +133,7 @@ enum ieee80211_agg_stop_reason {
> * @buf_size: reorder buffer size at receiver
> * @failed_bar_ssn: ssn of the last failed BAR tx attempt
> * @bar_pending: BAR needs to be re-sent
> + * @amsdu: support A-MSDU withing A-MDPU
> *
> * This structure's lifetime is managed by RCU, assignments to
> * the array holding it must hold the aggregation mutex.
> @@ -158,6 +159,7 @@ struct tid_ampdu_tx {
>
> u16 failed_bar_ssn;
> bool bar_pending;
> + bool amsdu;
> };
>
> /**
> diff --git a/net/mac80211/trace.h b/net/mac80211/trace.h
> index b5960b9..314e3bd 100644
> --- a/net/mac80211/trace.h
> +++ b/net/mac80211/trace.h
> @@ -974,9 +974,9 @@ TRACE_EVENT(drv_ampdu_action,
> struct ieee80211_sub_if_data *sdata,
> enum ieee80211_ampdu_mlme_action action,
> struct ieee80211_sta *sta, u16 tid,
> - u16 *ssn, u8 buf_size),
> + u16 *ssn, u8 buf_size, bool amsdu),
>
> - TP_ARGS(local, sdata, action, sta, tid, ssn, buf_size),
> + TP_ARGS(local, sdata, action, sta, tid, ssn, buf_size, amsdu),
>
> TP_STRUCT__entry(
> LOCAL_ENTRY
> @@ -985,6 +985,7 @@ TRACE_EVENT(drv_ampdu_action,
> __field(u16, tid)
> __field(u16, ssn)
> __field(u8, buf_size)
> + __field(bool, amsdu)
> VIF_ENTRY
> ),
>
> @@ -996,12 +997,13 @@ TRACE_EVENT(drv_ampdu_action,
> __entry->tid = tid;
> __entry->ssn = ssn ? *ssn : 0;
> __entry->buf_size = buf_size;
> + __entry->amsdu = amsdu;
> ),
>
> TP_printk(
> - LOCAL_PR_FMT VIF_PR_FMT STA_PR_FMT " action:%d tid:%d buf:%d",
> + LOCAL_PR_FMT VIF_PR_FMT STA_PR_FMT " action:%d tid:%d buf:%d
> amsdu:%d",
> LOCAL_PR_ARG, VIF_PR_ARG, STA_PR_ARG, __entry->action,
> - __entry->tid, __entry->buf_size
> + __entry->tid, __entry->buf_size, __entry->amsdu
> )
> );
>
> --
> 2.1.4
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
> the body of a message to [email protected]
> More majordomo info at http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html