summaryrefslogtreecommitdiff
path: root/drivers/net/wireless/intel/iwlwifi/fw/pnvm.c
diff options
context:
space:
mode:
authorAlon Giladi <alon.giladi@intel.com>2023-06-06 10:43:07 +0300
committerJohannes Berg <johannes.berg@intel.com>2023-06-06 13:45:06 +0200
commit380bf72d1b1dc3cb2572acd9b61153e79413b036 (patch)
tree8d8d21e8a9962e29a8aef3eff5f8fb351852ec58 /drivers/net/wireless/intel/iwlwifi/fw/pnvm.c
parent7c9c8477170d32def5df9d88823ea10d65749341 (diff)
wifi: iwlwifi: Separate reading and parsing of reduce power table
It enables to better handle error cases. Also save the image till the end of the loading and only then free it. Signed-off-by: Alon Giladi <alon.giladi@intel.com> Signed-off-by: Gregory Greenman <gregory.greenman@intel.com> Link: https://lore.kernel.org/r/20230606103519.71e3b3e0e794.Ifbe69ad99a7e805eb70e09280365821eb146b1c9@changeid Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'drivers/net/wireless/intel/iwlwifi/fw/pnvm.c')
-rw-r--r--drivers/net/wireless/intel/iwlwifi/fw/pnvm.c40
1 files changed, 25 insertions, 15 deletions
diff --git a/drivers/net/wireless/intel/iwlwifi/fw/pnvm.c b/drivers/net/wireless/intel/iwlwifi/fw/pnvm.c
index b556abece896..3b5a3c89fedf 100644
--- a/drivers/net/wireless/intel/iwlwifi/fw/pnvm.c
+++ b/drivers/net/wireless/intel/iwlwifi/fw/pnvm.c
@@ -319,29 +319,39 @@ int iwl_pnvm_load(struct iwl_trans *trans,
reduce_tables:
/* now try to get the reduce power table, if not loaded yet */
+ if (trans->failed_to_load_reduce_power_image)
+ goto notification;
+
if (!trans->reduce_power_loaded) {
memset(&pnvm_data, 0, sizeof(pnvm_data));
- ret = iwl_uefi_get_reduced_power(trans, &pnvm_data);
+ data = iwl_uefi_get_reduced_power(trans, &length);
+ if (IS_ERR(data)) {
+ ret = PTR_ERR(data);
+ trans->failed_to_load_reduce_power_image = true;
+ goto notification;
+ }
+
+ ret = iwl_uefi_reduce_power_parse(trans, data, length,
+ &pnvm_data);
if (ret) {
- /*
- * Pretend we've loaded it - at least we've tried and
- * couldn't load it at all, so there's no point in
- * trying again over and over.
- */
- trans->reduce_power_loaded = true;
- } else {
- ret = iwl_trans_load_reduce_power(trans, &pnvm_data, capa);
- if (ret) {
- IWL_DEBUG_FW(trans,
- "Failed to load reduce power table %d\n",
- ret);
- trans->reduce_power_loaded = true;
- }
+ trans->failed_to_load_reduce_power_image = true;
kfree(data);
+ goto notification;
+ }
+
+ ret = iwl_trans_load_reduce_power(trans, &pnvm_data, capa);
+ kfree(data);
+ if (ret) {
+ IWL_DEBUG_FW(trans,
+ "Failed to load reduce power table %d\n",
+ ret);
+ trans->failed_to_load_reduce_power_image = true;
+ goto notification;
}
}
iwl_trans_set_reduce_power(trans, capa);
+notification:
iwl_init_notification_wait(notif_wait, &pnvm_wait,
ntf_cmds, ARRAY_SIZE(ntf_cmds),
iwl_pnvm_complete_fn, trans);