|
@@ -840,6 +840,36 @@ iwl_mvm_tx_tso_segment(struct sk_buff *skb, unsigned int num_subframes,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static unsigned int iwl_mvm_max_amsdu_size(struct iwl_mvm *mvm,
|
|
|
+ struct ieee80211_sta *sta,
|
|
|
+ unsigned int tid)
|
|
|
+{
|
|
|
+ struct iwl_mvm_sta *mvmsta = iwl_mvm_sta_from_mac80211(sta);
|
|
|
+ enum nl80211_band band = mvmsta->vif->bss_conf.chandef.chan->band;
|
|
|
+ u8 ac = tid_to_mac80211_ac[tid];
|
|
|
+ unsigned int txf;
|
|
|
+ int lmac = IWL_LMAC_24G_INDEX;
|
|
|
+
|
|
|
+ if (iwl_mvm_is_cdb_supported(mvm) &&
|
|
|
+ band == NL80211_BAND_5GHZ)
|
|
|
+ lmac = IWL_LMAC_5G_INDEX;
|
|
|
+
|
|
|
+ /* For HE redirect to trigger based fifos */
|
|
|
+ if (sta->he_cap.has_he && !WARN_ON(!iwl_mvm_has_new_tx_api(mvm)))
|
|
|
+ ac += 4;
|
|
|
+
|
|
|
+ txf = iwl_mvm_mac_ac_to_tx_fifo(mvm, ac);
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Don't send an AMSDU that will be longer than the TXF.
|
|
|
+ * Add a security margin of 256 for the TX command + headers.
|
|
|
+ * We also want to have the start of the next packet inside the
|
|
|
+ * fifo to be able to send bursts.
|
|
|
+ */
|
|
|
+ return min_t(unsigned int, mvmsta->max_amsdu_len,
|
|
|
+ mvm->fwrt.smem_cfg.lmac[lmac].txfifo_size[txf] - 256);
|
|
|
+}
|
|
|
+
|
|
|
static int iwl_mvm_tx_tso(struct iwl_mvm *mvm, struct sk_buff *skb,
|
|
|
struct ieee80211_tx_info *info,
|
|
|
struct ieee80211_sta *sta,
|
|
@@ -852,7 +882,7 @@ static int iwl_mvm_tx_tso(struct iwl_mvm *mvm, struct sk_buff *skb,
|
|
|
u16 snap_ip_tcp, pad;
|
|
|
unsigned int dbg_max_amsdu_len;
|
|
|
netdev_features_t netdev_flags = NETIF_F_CSUM_MASK | NETIF_F_SG;
|
|
|
- u8 tid, txf;
|
|
|
+ u8 tid;
|
|
|
|
|
|
snap_ip_tcp = 8 + skb_transport_header(skb) - skb_network_header(skb) +
|
|
|
tcp_hdrlen(skb);
|
|
@@ -891,20 +921,7 @@ static int iwl_mvm_tx_tso(struct iwl_mvm *mvm, struct sk_buff *skb,
|
|
|
!(mvmsta->amsdu_enabled & BIT(tid)))
|
|
|
return iwl_mvm_tx_tso_segment(skb, 1, netdev_flags, mpdus_skb);
|
|
|
|
|
|
- max_amsdu_len = mvmsta->max_amsdu_len;
|
|
|
-
|
|
|
- /* the Tx FIFO to which this A-MSDU will be routed */
|
|
|
- txf = iwl_mvm_mac_ac_to_tx_fifo(mvm, tid_to_mac80211_ac[tid]);
|
|
|
-
|
|
|
- /*
|
|
|
- * Don't send an AMSDU that will be longer than the TXF.
|
|
|
- * Add a security margin of 256 for the TX command + headers.
|
|
|
- * We also want to have the start of the next packet inside the
|
|
|
- * fifo to be able to send bursts.
|
|
|
- */
|
|
|
- max_amsdu_len = min_t(unsigned int, max_amsdu_len,
|
|
|
- mvm->fwrt.smem_cfg.lmac[0].txfifo_size[txf] -
|
|
|
- 256);
|
|
|
+ max_amsdu_len = iwl_mvm_max_amsdu_size(mvm, sta, tid);
|
|
|
|
|
|
if (unlikely(dbg_max_amsdu_len))
|
|
|
max_amsdu_len = min_t(unsigned int, max_amsdu_len,
|