From: Ilan Peer ilan.peer@intel.com
[ Upstream commit f81aa834bfa91c827f290b62a245e23c5ad2813c ]
The regulatory domain information was initialized every time the FW was loaded and the device was restarted. This was unnecessary and useless as at this stage the wiphy channels information was not setup yet so while the regulatory domain was set to the wiphy, the channel information was not updated.
In case that a specific MCC was configured during FW initialization then following updates with this MCC are ignored, and thus the wiphy channels information is left with information not matching the regulatory domain.
This commit moves the regulatory domain initialization to after the operational firmware is started, i.e., after the wiphy channels were configured and the regulatory information is needed.
Signed-off-by: Ilan Peer ilan.peer@intel.com Reviewed-by: Johannes Berg johannes.berg@intel.com Signed-off-by: Miri Korenblit miriam.rachel.korenblit@intel.com Link: https://patch.msgid.link/20250604061200.f138a7382093.I2fd8b3e99be13c2687da48... Signed-off-by: Miri Korenblit miriam.rachel.korenblit@intel.com Signed-off-by: Sasha Levin sashal@kernel.org ---
**YES**
This commit should be backported to stable kernel trees. Here's my extensive analysis:
## Bug Fix Nature
The commit fixes a real bug where regulatory domain information and wiphy channel configurations become mismatched. Specifically, from the commit message:
1. **Timing Issue**: The regulatory domain was being initialized in `iwl_mld_load_fw()` before wiphy channels were properly configured 2. **Update Failures**: When a specific MCC (Mobile Country Code) was configured during FW initialization, subsequent updates with the same MCC would be ignored, leaving channel information inconsistent with the regulatory domain
## Code Analysis
The changes are minimal and low-risk: - **Removed from `iwl_mld_load_fw()`**: Lines removing the `iwl_mld_init_mcc()` call and its error handling - **Added to `iwl_mld_start_fw()`**: The same call is added after `iwl_mld_config_fw()`, ensuring proper initialization order
## Comparison with Similar Commits
Most relevant is Similar Commit #4 (marked YES for backporting), which addressed regulatory domain update issues when firmware starts. That commit fixed the handling of `MCC_RESP_ILLEGAL` responses to ensure channel lists were properly updated - a closely related regulatory compliance issue.
## Stable Kernel Criteria
This commit meets the stable kernel requirements: 1. **Fixes a real bug**: Regulatory domain/channel mismatch is a serious issue affecting wireless compliance 2. **Small and contained**: Only moves a function call to the correct initialization sequence 3. **Low regression risk**: No new logic introduced, just reordering existing initialization 4. **Important functionality**: Regulatory compliance is critical for legal wireless operation 5. **Clear root cause**: The issue and fix are well-understood and documented
## Repository Context
From examining the kernel repository, I found that regulatory domain initialization has been an ongoing concern in iwlwifi, with multiple fixes addressing timing and synchronization issues. The `lar_regdom_set` flag is critical for preventing operations (like scans) before regulatory setup is complete.
The fix ensures that `iwl_mld_init_mcc()` is called after the firmware is fully configured (`iwl_mld_config_fw()`), which is the proper time when wiphy channels are set up and ready to receive regulatory updates.
This is precisely the type of bug fix that stable kernels should receive - it corrects a specific functional issue without introducing architectural changes or new features.
drivers/net/wireless/intel/iwlwifi/mld/fw.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/drivers/net/wireless/intel/iwlwifi/mld/fw.c b/drivers/net/wireless/intel/iwlwifi/mld/fw.c index 4b083d447ee2f..6be9366bd4b14 100644 --- a/drivers/net/wireless/intel/iwlwifi/mld/fw.c +++ b/drivers/net/wireless/intel/iwlwifi/mld/fw.c @@ -339,10 +339,6 @@ int iwl_mld_load_fw(struct iwl_mld *mld) if (ret) goto err;
- ret = iwl_mld_init_mcc(mld); - if (ret) - goto err; - mld->fw_status.running = true;
return 0; @@ -535,6 +531,10 @@ int iwl_mld_start_fw(struct iwl_mld *mld) if (ret) goto error;
+ ret = iwl_mld_init_mcc(mld); + if (ret) + goto error; + return 0;
error: