wifi: iwlwifi: fix max number of fw active links
The max active links that are supported by the FW is hard coded. This is wrong since this value is HW-dependent. Fix this by determining according to the actual HW. Also remove a redundant check that the number of active links doesn't exceeds the maximum. Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com> Signed-off-by: Gregory Greenman <gregory.greenman@intel.com> Link: https://lore.kernel.org/r/20230615094410.e78ad74c6715.I68b26911c0a312d72eaf25344b448d03b1c61f4e@changeid Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
parent
6e21e7b8cd
commit
823a970831
@ -118,24 +118,6 @@ int iwl_mvm_link_changed(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
|
||||
if (!link_info->phy_ctxt)
|
||||
return 0;
|
||||
|
||||
/* check there aren't too many active links */
|
||||
if (!link_info->active && active) {
|
||||
int i, count = 0;
|
||||
|
||||
/* link with phy_ctxt is active in FW */
|
||||
for_each_mvm_vif_valid_link(mvmvif, i)
|
||||
if (mvmvif->link[i]->phy_ctxt)
|
||||
count++;
|
||||
|
||||
if (vif->type == NL80211_IFTYPE_AP) {
|
||||
if (count > mvm->fw->ucode_capa.num_beacons)
|
||||
return -EOPNOTSUPP;
|
||||
/* this should be per HW or such */
|
||||
} else if (count >= IWL_MVM_FW_MAX_ACTIVE_LINKS_NUM) {
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
}
|
||||
|
||||
/* Catch early if driver tries to activate or deactivate a link
|
||||
* twice.
|
||||
*/
|
||||
|
@ -900,9 +900,7 @@ iwl_mvm_mld_change_vif_links(struct ieee80211_hw *hw,
|
||||
u16 added = new_links & ~old_links;
|
||||
int err, i;
|
||||
|
||||
if (hweight16(new_links) > 2) {
|
||||
return -EOPNOTSUPP;
|
||||
} else if (hweight16(new_links) > 1) {
|
||||
if (hweight16(new_links) > 1) {
|
||||
unsigned int n_active = 0;
|
||||
|
||||
for (i = 0; i < IEEE80211_MLD_MAX_NUM_LINKS; i++) {
|
||||
@ -917,7 +915,7 @@ iwl_mvm_mld_change_vif_links(struct ieee80211_hw *hw,
|
||||
if (vif->type == NL80211_IFTYPE_AP) {
|
||||
if (n_active > mvm->fw->ucode_capa.num_beacons)
|
||||
return -EOPNOTSUPP;
|
||||
} else if (n_active > 1) {
|
||||
} else if (n_active > iwl_mvm_max_active_links(mvm)) {
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
}
|
||||
|
@ -1544,6 +1544,28 @@ static inline bool iwl_mvm_is_ctdp_supported(struct iwl_mvm *mvm)
|
||||
IWL_UCODE_TLV_CAPA_CTDP_SUPPORT);
|
||||
}
|
||||
|
||||
static inline bool iwl_mvm_is_esr_supported(struct iwl_trans *trans)
|
||||
{
|
||||
if ((CSR_HW_RFID_TYPE(trans->hw_rf_id) == IWL_CFG_RF_TYPE_FM) &&
|
||||
!CSR_HW_RFID_IS_CDB(trans->hw_rf_id))
|
||||
/* Step A doesn't support eSR */
|
||||
return CSR_HW_RFID_STEP(trans->hw_rf_id);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline int iwl_mvm_max_active_links(struct iwl_mvm *mvm)
|
||||
{
|
||||
struct iwl_trans *trans = mvm->fwrt.trans;
|
||||
|
||||
if (iwl_mvm_is_esr_supported(trans) ||
|
||||
(CSR_HW_RFID_TYPE(trans->hw_rf_id) == IWL_CFG_RF_TYPE_FM &&
|
||||
CSR_HW_RFID_IS_CDB(trans->hw_rf_id)))
|
||||
return IWL_MVM_FW_MAX_ACTIVE_LINKS_NUM;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
extern const u8 iwl_mvm_ac_to_tx_fifo[];
|
||||
extern const u8 iwl_mvm_ac_to_gen2_tx_fifo[];
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user