|
@@ -3429,6 +3429,7 @@ int iwlagn_mac_ampdu_action(struct ieee80211_hw *hw,
|
|
|
{
|
|
|
struct iwl_priv *priv = hw->priv;
|
|
|
int ret = -EINVAL;
|
|
|
+ struct iwl_station_priv *sta_priv = (void *) sta->drv_priv;
|
|
|
|
|
|
IWL_DEBUG_HT(priv, "A-MPDU action on addr %pM tid %d\n",
|
|
|
sta->addr, tid);
|
|
@@ -3483,11 +3484,28 @@ int iwlagn_mac_ampdu_action(struct ieee80211_hw *hw,
|
|
|
}
|
|
|
break;
|
|
|
case IEEE80211_AMPDU_TX_OPERATIONAL:
|
|
|
+ /*
|
|
|
+ * If the limit is 0, then it wasn't initialised yet,
|
|
|
+ * use the default. We can do that since we take the
|
|
|
+ * minimum below, and we don't want to go above our
|
|
|
+ * default due to hardware restrictions.
|
|
|
+ */
|
|
|
+ if (sta_priv->max_agg_bufsize == 0)
|
|
|
+ sta_priv->max_agg_bufsize =
|
|
|
+ LINK_QUAL_AGG_FRAME_LIMIT_DEF;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Even though in theory the peer could have different
|
|
|
+ * aggregation reorder buffer sizes for different sessions,
|
|
|
+ * our ucode doesn't allow for that and has a global limit
|
|
|
+ * for each station. Therefore, use the minimum of all the
|
|
|
+ * aggregation sessions and our default value.
|
|
|
+ */
|
|
|
+ sta_priv->max_agg_bufsize =
|
|
|
+ min(sta_priv->max_agg_bufsize, buf_size);
|
|
|
+
|
|
|
if (priv->cfg->ht_params &&
|
|
|
priv->cfg->ht_params->use_rts_for_aggregation) {
|
|
|
- struct iwl_station_priv *sta_priv =
|
|
|
- (void *) sta->drv_priv;
|
|
|
-
|
|
|
/*
|
|
|
* switch to RTS/CTS if it is the prefer protection
|
|
|
* method for HT traffic
|
|
@@ -3495,9 +3513,13 @@ int iwlagn_mac_ampdu_action(struct ieee80211_hw *hw,
|
|
|
|
|
|
sta_priv->lq_sta.lq.general_params.flags |=
|
|
|
LINK_QUAL_FLAGS_SET_STA_TLC_RTS_MSK;
|
|
|
- iwl_send_lq_cmd(priv, iwl_rxon_ctx_from_vif(vif),
|
|
|
- &sta_priv->lq_sta.lq, CMD_ASYNC, false);
|
|
|
}
|
|
|
+
|
|
|
+ sta_priv->lq_sta.lq.agg_params.agg_frame_cnt_limit =
|
|
|
+ sta_priv->max_agg_bufsize;
|
|
|
+
|
|
|
+ iwl_send_lq_cmd(priv, iwl_rxon_ctx_from_vif(vif),
|
|
|
+ &sta_priv->lq_sta.lq, CMD_ASYNC, false);
|
|
|
ret = 0;
|
|
|
break;
|
|
|
}
|