Commit 2c72c8d3 authored by Johannes Berg's avatar Johannes Berg
Browse files

Merge tag 'iwlwifi-fixes-2025-08-28' of...

Merge tag 'iwlwifi-fixes-2025-08-28' of https://git.kernel.org/pub/scm/linux/kernel/git/iwlwifi/iwlwifi-next



Miri Korenblit says:
====================
a few fixes, mainly of the cfg rework.
====================

Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parents b3bf3dcb 019f71a6
Loading
Loading
Loading
Loading
+24 −1
Original line number Diff line number Diff line
@@ -169,7 +169,7 @@ int iwl_acpi_get_dsm(struct iwl_fw_runtime *fwrt,

	BUILD_BUG_ON(ARRAY_SIZE(acpi_dsm_size) != DSM_FUNC_NUM_FUNCS);

	if (WARN_ON(func >= ARRAY_SIZE(acpi_dsm_size)))
	if (WARN_ON(func >= ARRAY_SIZE(acpi_dsm_size) || !func))
		return -EINVAL;

	expected_size = acpi_dsm_size[func];
@@ -178,6 +178,29 @@ int iwl_acpi_get_dsm(struct iwl_fw_runtime *fwrt,
	if (expected_size != sizeof(u8) && expected_size != sizeof(u32))
		return -EOPNOTSUPP;

	if (!fwrt->acpi_dsm_funcs_valid) {
		ret = iwl_acpi_get_dsm_integer(fwrt->dev, ACPI_DSM_REV,
					       DSM_FUNC_QUERY,
					       &iwl_guid, &tmp,
					       acpi_dsm_size[DSM_FUNC_QUERY]);
		if (ret) {
			/* always indicate BIT(0) to avoid re-reading */
			fwrt->acpi_dsm_funcs_valid = BIT(0);
			return ret;
		}

		IWL_DEBUG_RADIO(fwrt, "ACPI DSM validity bitmap 0x%x\n",
				(u32)tmp);
		/* always indicate BIT(0) to avoid re-reading */
		fwrt->acpi_dsm_funcs_valid = tmp | BIT(0);
	}

	if (!(fwrt->acpi_dsm_funcs_valid & BIT(func))) {
		IWL_DEBUG_RADIO(fwrt, "ACPI DSM %d not indicated as valid\n",
				func);
		return -ENODATA;
	}

	ret = iwl_acpi_get_dsm_integer(fwrt->dev, ACPI_DSM_REV, func,
				       &iwl_guid, &tmp, expected_size);
	if (ret)
+8 −0
Original line number Diff line number Diff line
@@ -113,6 +113,10 @@ struct iwl_txf_iter_data {
 * @phy_filters: specific phy filters as read from WPFC BIOS table
 * @ppag_bios_rev: PPAG BIOS revision
 * @ppag_bios_source: see &enum bios_source
 * @acpi_dsm_funcs_valid: bitmap indicating which DSM values are valid,
 *	zero (default initialization) means it hasn't been read yet,
 *	and BIT(0) is set when it has since function 0 also has this
 *	bitmap and is always supported
 */
struct iwl_fw_runtime {
	struct iwl_trans *trans;
@@ -189,6 +193,10 @@ struct iwl_fw_runtime {
	bool uats_valid;
	u8 uefi_tables_lock_status;
	struct iwl_phy_specific_cfg phy_filters;

#ifdef CONFIG_ACPI
	u32 acpi_dsm_funcs_valid;
#endif
};

void iwl_fw_runtime_init(struct iwl_fw_runtime *fwrt, struct iwl_trans *trans,
+6 −0
Original line number Diff line number Diff line
@@ -747,6 +747,12 @@ int iwl_uefi_get_dsm(struct iwl_fw_runtime *fwrt, enum iwl_dsm_funcs func,
		goto out;
	}

	if (!(data->functions[DSM_FUNC_QUERY] & BIT(func))) {
		IWL_DEBUG_RADIO(fwrt, "DSM func %d not in 0x%x\n",
				func, data->functions[DSM_FUNC_QUERY]);
		goto out;
	}

	*value = data->functions[func];

	IWL_DEBUG_RADIO(fwrt,
+17 −5
Original line number Diff line number Diff line
@@ -673,6 +673,8 @@ VISIBLE_IF_IWLWIFI_KUNIT const struct iwl_dev_info iwl_dev_info_table[] = {

	IWL_DEV_INFO(iwl6005_n_cfg, iwl6005_2agn_sff_name,
		     DEVICE(0x0082), SUBDEV_MASKED(0xC000, 0xF000)),
	IWL_DEV_INFO(iwl6005_n_cfg, iwl6005_2agn_sff_name,
		     DEVICE(0x0085), SUBDEV_MASKED(0xC000, 0xF000)),
	IWL_DEV_INFO(iwl6005_n_cfg, iwl6005_2agn_d_name,
		     DEVICE(0x0082), SUBDEV(0x4820)),
	IWL_DEV_INFO(iwl6005_n_cfg, iwl6005_2agn_mow1_name,
@@ -729,10 +731,10 @@ VISIBLE_IF_IWLWIFI_KUNIT const struct iwl_dev_info iwl_dev_info_table[] = {
		     DEVICE(0x0083), SUBDEV_MASKED(0x5, 0xF)),
	IWL_DEV_INFO(iwl1000_bg_cfg, iwl1000_bg_name,
		     DEVICE(0x0083), SUBDEV_MASKED(0x6, 0xF)),
	IWL_DEV_INFO(iwl1000_bgn_cfg, iwl1000_bgn_name,
		     DEVICE(0x0084), SUBDEV_MASKED(0x5, 0xF)),
	IWL_DEV_INFO(iwl1000_bg_cfg, iwl1000_bg_name,
		     DEVICE(0x0084), SUBDEV(0x1216)),
	IWL_DEV_INFO(iwl1000_bg_cfg, iwl1000_bg_name,
		     DEVICE(0x0084), SUBDEV(0x1316)),
		     DEVICE(0x0084), SUBDEV_MASKED(0x6, 0xF)),

/* 100 Series WiFi */
	IWL_DEV_INFO(iwl100_bgn_cfg, iwl100_bgn_name,
@@ -964,6 +966,12 @@ VISIBLE_IF_IWLWIFI_KUNIT const struct iwl_dev_info iwl_dev_info_table[] = {
		     DEVICE(0x24F3), SUBDEV(0x0004)),
	IWL_DEV_INFO(iwl8260_cfg, iwl8260_2n_name,
		     DEVICE(0x24F3), SUBDEV(0x0044)),
	IWL_DEV_INFO(iwl8260_cfg, iwl8260_2ac_name,
		     DEVICE(0x24F4)),
	IWL_DEV_INFO(iwl8260_cfg, iwl4165_2ac_name,
		     DEVICE(0x24F5)),
	IWL_DEV_INFO(iwl8260_cfg, iwl4165_2ac_name,
		     DEVICE(0x24F6)),
	IWL_DEV_INFO(iwl8265_cfg, iwl8265_2ac_name,
		     DEVICE(0x24FD)),
	IWL_DEV_INFO(iwl8265_cfg, iwl8275_2ac_name,
@@ -1222,11 +1230,15 @@ static int _iwl_pci_resume(struct device *device, bool restore)
	 * Note: MAC (bits 0:7) will be cleared upon suspend even with wowlan,
	 * but not bits [15:8]. So if we have bits set in lower word, assume
	 * the device is alive.
	 * Alternatively, if the scratch value is 0xFFFFFFFF, then we no longer
	 * have access to the device and consider it powered off.
	 * For older devices, just try silently to grab the NIC.
	 */
	if (trans->mac_cfg->device_family >= IWL_DEVICE_FAMILY_BZ) {
		if (!(iwl_read32(trans, CSR_FUNC_SCRATCH) &
		      CSR_FUNC_SCRATCH_POWER_OFF_MASK))
		u32 scratch = iwl_read32(trans, CSR_FUNC_SCRATCH);

		if (!(scratch & CSR_FUNC_SCRATCH_POWER_OFF_MASK) ||
		    scratch == ~0U)
			device_was_powered_off = true;
	} else {
		/*
+2 −1
Original line number Diff line number Diff line
@@ -2092,7 +2092,8 @@ static void iwl_txq_gen1_update_byte_cnt_tbl(struct iwl_trans *trans,
		break;
	}

	if (trans->mac_cfg->device_family < IWL_DEVICE_FAMILY_AX210)
	if (trans->mac_cfg->device_family >= IWL_DEVICE_FAMILY_9000 &&
	    trans->mac_cfg->device_family < IWL_DEVICE_FAMILY_AX210)
		len = DIV_ROUND_UP(len, 4);

	if (WARN_ON(len > 0xFFF || write_ptr >= TFD_QUEUE_SIZE_MAX))