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

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@changeid


Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent 6e21e7b8
Loading
Loading
Loading
Loading
+0 −18
Original line number Diff line number Diff line
@@ -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.
		 */
+2 −4
Original line number Diff line number Diff line
@@ -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;
		}
	}
+22 −0
Original line number Diff line number Diff line
@@ -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[];