Commit d9bfd5a0 authored by Johannes Berg's avatar Johannes Berg
Browse files

wifi: iwlwifi: mvm: allow number of beacons from FW



Newer firmware images have a TLV advertising how many
beacons they support, use that to permit adding more
links in AP mode (FW needs to support at least as many
links as beacons).

Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
Signed-off-by: default avatarGregory Greenman <gregory.greenman@intel.com>
Link: https://lore.kernel.org/r/20230416154301.0d7522533557.Ic6b5992e94446c35cb0f3add019defa6e7aded2a@changeid


Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent 8642ddb2
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -104,6 +104,7 @@ enum iwl_ucode_tlv_type {
	IWL_UCODE_TLV_CURRENT_PC		= 68,

	IWL_UCODE_TLV_FW_NUM_STATIONS		= IWL_UCODE_TLV_CONST_BASE + 0,
	IWL_UCODE_TLV_FW_NUM_BEACONS		= IWL_UCODE_TLV_CONST_BASE + 2,

	IWL_UCODE_TLV_TYPE_DEBUG_INFO		= IWL_UCODE_TLV_DEBUG_BASE + 0,
	IWL_UCODE_TLV_TYPE_BUFFER_ALLOCATION	= IWL_UCODE_TLV_DEBUG_BASE + 1,
+1 −0
Original line number Diff line number Diff line
@@ -51,6 +51,7 @@ struct iwl_ucode_capabilities {
	u32 error_log_addr;
	u32 error_log_size;
	u32 num_stations;
	u32 num_beacons;
	unsigned long _api[BITS_TO_LONGS(NUM_IWL_UCODE_TLV_API)];
	unsigned long _capa[BITS_TO_LONGS(NUM_IWL_UCODE_TLV_CAPA)];

+7 −0
Original line number Diff line number Diff line
@@ -1155,6 +1155,12 @@ static int iwl_parse_tlv_firmware(struct iwl_drv *drv,
			capa->num_stations =
				le32_to_cpup((const __le32 *)tlv_data);
			break;
		case IWL_UCODE_TLV_FW_NUM_BEACONS:
			if (tlv_len != sizeof(u32))
				goto invalid_tlv_len;
			capa->num_beacons =
				le32_to_cpup((const __le32 *)tlv_data);
			break;
		case IWL_UCODE_TLV_UMAC_DEBUG_ADDRS: {
			const struct iwl_umac_debug_addrs *dbg_ptrs =
				(const void *)tlv_data;
@@ -1415,6 +1421,7 @@ static void iwl_req_fw_callback(const struct firmware *ucode_raw, void *context)
			IWL_DEFAULT_STANDARD_PHY_CALIBRATE_TBL_SIZE;
	fw->ucode_capa.n_scan_channels = IWL_DEFAULT_SCAN_CHANNELS;
	fw->ucode_capa.num_stations = IWL_MVM_STATION_COUNT_MAX;
	fw->ucode_capa.num_beacons = 1;
	/* dump all fw memory areas by default */
	fw->dbg.dump_mask = 0xffffffff;

+4 −1
Original line number Diff line number Diff line
@@ -882,7 +882,10 @@ iwl_mvm_mld_change_vif_links(struct ieee80211_hw *hw,
				n_active++;
		}

		if (n_active > 1)
		if (vif->type == NL80211_IFTYPE_AP &&
		    n_active > mvm->fw->ucode_capa.num_beacons)
			return -EOPNOTSUPP;
		else if (n_active > 1)
			return -EOPNOTSUPP;
	}