Commit 823a9708 authored by Miri Korenblit's avatar Miri Korenblit Committed by Johannes Berg

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: default avatarMiri Korenblit <miriam.rachel.korenblit@intel.com>
Signed-off-by: default avatarGregory Greenman <gregory.greenman@intel.com>
Link: https://lore.kernel.org/r/20230615094410.e78ad74c6715.I68b26911c0a312d72eaf25344b448d03b1c61f4e@changeidSigned-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent 6e21e7b8
...@@ -118,24 +118,6 @@ int iwl_mvm_link_changed(struct iwl_mvm *mvm, struct ieee80211_vif *vif, ...@@ -118,24 +118,6 @@ int iwl_mvm_link_changed(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
if (!link_info->phy_ctxt) if (!link_info->phy_ctxt)
return 0; 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 /* Catch early if driver tries to activate or deactivate a link
* twice. * twice.
*/ */
......
...@@ -900,9 +900,7 @@ iwl_mvm_mld_change_vif_links(struct ieee80211_hw *hw, ...@@ -900,9 +900,7 @@ iwl_mvm_mld_change_vif_links(struct ieee80211_hw *hw,
u16 added = new_links & ~old_links; u16 added = new_links & ~old_links;
int err, i; int err, i;
if (hweight16(new_links) > 2) { if (hweight16(new_links) > 1) {
return -EOPNOTSUPP;
} else if (hweight16(new_links) > 1) {
unsigned int n_active = 0; unsigned int n_active = 0;
for (i = 0; i < IEEE80211_MLD_MAX_NUM_LINKS; i++) { for (i = 0; i < IEEE80211_MLD_MAX_NUM_LINKS; i++) {
...@@ -917,7 +915,7 @@ iwl_mvm_mld_change_vif_links(struct ieee80211_hw *hw, ...@@ -917,7 +915,7 @@ iwl_mvm_mld_change_vif_links(struct ieee80211_hw *hw,
if (vif->type == NL80211_IFTYPE_AP) { if (vif->type == NL80211_IFTYPE_AP) {
if (n_active > mvm->fw->ucode_capa.num_beacons) if (n_active > mvm->fw->ucode_capa.num_beacons)
return -EOPNOTSUPP; return -EOPNOTSUPP;
} else if (n_active > 1) { } else if (n_active > iwl_mvm_max_active_links(mvm)) {
return -EOPNOTSUPP; return -EOPNOTSUPP;
} }
} }
......
...@@ -1544,6 +1544,28 @@ static inline bool iwl_mvm_is_ctdp_supported(struct iwl_mvm *mvm) ...@@ -1544,6 +1544,28 @@ static inline bool iwl_mvm_is_ctdp_supported(struct iwl_mvm *mvm)
IWL_UCODE_TLV_CAPA_CTDP_SUPPORT); 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_tx_fifo[];
extern const u8 iwl_mvm_ac_to_gen2_tx_fifo[]; extern const u8 iwl_mvm_ac_to_gen2_tx_fifo[];
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment