wifi: iwlwifi: fix iwl_mvm_max_amsdu_size() for MLO
For MLO, we cannot use vif->bss_conf.chandef.chan->band, since that will lead to a NULL-ptr dereference as bss_conf isn't used. However, in case of real MLO, we also need to take both LMACs into account if they exist, since the station might be active on both LMACs at the same time. Signed-off-by: Johannes Berg <johannes.berg@intel.com> Signed-off-by: Gregory Greenman <gregory.greenman@intel.com> Link: https://lore.kernel.org/r/20230417113648.3588afc85d79.I11592893bbc191b9548518b8bd782de568a9f848@changeid Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
parent
15d4183425
commit
b2bc600cce
|
@ -804,10 +804,11 @@ 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];
|
||||
enum nl80211_band band;
|
||||
unsigned int txf;
|
||||
int lmac = iwl_mvm_get_lmac_id(mvm->fw, band);
|
||||
unsigned int val;
|
||||
int lmac;
|
||||
|
||||
/* For HE redirect to trigger based fifos */
|
||||
if (sta->deflink.he_cap.has_he && !WARN_ON(!iwl_mvm_has_new_tx_api(mvm)))
|
||||
|
@ -821,7 +822,37 @@ unsigned int iwl_mvm_max_amsdu_size(struct iwl_mvm *mvm,
|
|||
* 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,
|
||||
val = mvmsta->max_amsdu_len;
|
||||
|
||||
if (hweight16(sta->valid_links) <= 1) {
|
||||
if (sta->valid_links) {
|
||||
struct ieee80211_bss_conf *link_conf;
|
||||
unsigned int link = ffs(sta->valid_links) - 1;
|
||||
|
||||
rcu_read_lock();
|
||||
link_conf = rcu_dereference(mvmsta->vif->link_conf[link]);
|
||||
if (WARN_ON(!link_conf))
|
||||
band = NL80211_BAND_2GHZ;
|
||||
else
|
||||
band = link_conf->chandef.chan->band;
|
||||
rcu_read_unlock();
|
||||
} else {
|
||||
band = mvmsta->vif->bss_conf.chandef.chan->band;
|
||||
}
|
||||
|
||||
lmac = iwl_mvm_get_lmac_id(mvm->fw, band);
|
||||
} else if (fw_has_capa(&mvm->fw->ucode_capa,
|
||||
IWL_UCODE_TLV_CAPA_CDB_SUPPORT)) {
|
||||
/* for real MLO restrict to both LMACs if they exist */
|
||||
lmac = IWL_LMAC_5G_INDEX;
|
||||
val = min_t(unsigned int, val,
|
||||
mvm->fwrt.smem_cfg.lmac[lmac].txfifo_size[txf] - 256);
|
||||
lmac = IWL_LMAC_24G_INDEX;
|
||||
} else {
|
||||
lmac = IWL_LMAC_24G_INDEX;
|
||||
}
|
||||
|
||||
return min_t(unsigned int, val,
|
||||
mvm->fwrt.smem_cfg.lmac[lmac].txfifo_size[txf] - 256);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue