Skip to content

Commit 5deadb9

Browse files
jmberg-intelgregkh
authored andcommitted
wifi: iwlwifi: acpi: check DSM func validity
[ Upstream commit 7bf2dfc ] The DSM func 0 (DSM_FUNC_QUERY) returns a bitmap of which other functions contain valid data, query and check it before returning other functions data. Fixes: 9db9349 ("iwlwifi: acpi: support device specific method (DSM)") Closes: https://bugzilla.kernel.org/show_bug.cgi?id=220085 Signed-off-by: Johannes Berg <johannes.berg@intel.com> Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com> Link: https://patch.msgid.link/20250828095500.881e17ff8f6a.Ic6d92997d9d5fad127919d6e1b830cd3fe944468@changeid Signed-off-by: Sasha Levin <sashal@kernel.org>
1 parent a530078 commit 5deadb9

File tree

2 files changed

+32
-1
lines changed

2 files changed

+32
-1
lines changed

drivers/net/wireless/intel/iwlwifi/fw/acpi.c

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ int iwl_acpi_get_dsm(struct iwl_fw_runtime *fwrt,
169169

170170
BUILD_BUG_ON(ARRAY_SIZE(acpi_dsm_size) != DSM_FUNC_NUM_FUNCS);
171171

172-
if (WARN_ON(func >= ARRAY_SIZE(acpi_dsm_size)))
172+
if (WARN_ON(func >= ARRAY_SIZE(acpi_dsm_size) || !func))
173173
return -EINVAL;
174174

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

181+
if (!fwrt->acpi_dsm_funcs_valid) {
182+
ret = iwl_acpi_get_dsm_integer(fwrt->dev, ACPI_DSM_REV,
183+
DSM_FUNC_QUERY,
184+
&iwl_guid, &tmp,
185+
acpi_dsm_size[DSM_FUNC_QUERY]);
186+
if (ret) {
187+
/* always indicate BIT(0) to avoid re-reading */
188+
fwrt->acpi_dsm_funcs_valid = BIT(0);
189+
return ret;
190+
}
191+
192+
IWL_DEBUG_RADIO(fwrt, "ACPI DSM validity bitmap 0x%x\n",
193+
(u32)tmp);
194+
/* always indicate BIT(0) to avoid re-reading */
195+
fwrt->acpi_dsm_funcs_valid = tmp | BIT(0);
196+
}
197+
198+
if (!(fwrt->acpi_dsm_funcs_valid & BIT(func))) {
199+
IWL_DEBUG_RADIO(fwrt, "ACPI DSM %d not indicated as valid\n",
200+
func);
201+
return -ENODATA;
202+
}
203+
181204
ret = iwl_acpi_get_dsm_integer(fwrt->dev, ACPI_DSM_REV, func,
182205
&iwl_guid, &tmp, expected_size);
183206
if (ret)

drivers/net/wireless/intel/iwlwifi/fw/runtime.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,10 @@ struct iwl_txf_iter_data {
113113
* @phy_filters: specific phy filters as read from WPFC BIOS table
114114
* @ppag_bios_rev: PPAG BIOS revision
115115
* @ppag_bios_source: see &enum bios_source
116+
* @acpi_dsm_funcs_valid: bitmap indicating which DSM values are valid,
117+
* zero (default initialization) means it hasn't been read yet,
118+
* and BIT(0) is set when it has since function 0 also has this
119+
* bitmap and is always supported
116120
*/
117121
struct iwl_fw_runtime {
118122
struct iwl_trans *trans;
@@ -189,6 +193,10 @@ struct iwl_fw_runtime {
189193
bool uats_valid;
190194
u8 uefi_tables_lock_status;
191195
struct iwl_phy_specific_cfg phy_filters;
196+
197+
#ifdef CONFIG_ACPI
198+
u32 acpi_dsm_funcs_valid;
199+
#endif
192200
};
193201

194202
void iwl_fw_runtime_init(struct iwl_fw_runtime *fwrt, struct iwl_trans *trans,

0 commit comments

Comments
 (0)