@@ -339,6 +339,10 @@ int iwl_mld_load_fw(struct iwl_mld *mld)
if (ret)
return ret;
+ ret = iwl_mld_init_mcc(mld);
+ if (ret)
+ return ret;
+
mld->fw_status.running = true;
return 0;
@@ -481,10 +485,6 @@ static int iwl_mld_config_fw(struct iwl_mld *mld)
if (ret)
return ret;
- ret = iwl_mld_init_mcc(mld);
- if (ret)
- return ret;
-
if (mld->fw_status.in_hw_restart) {
iwl_mld_send_recovery_cmd(mld, ERROR_RECOVERY_UPDATE_DB);
iwl_mld_time_sync_fw_config(mld);
@@ -164,14 +164,6 @@ static void iwl_mld_hw_set_security(struct iwl_mld *mld)
NL80211_EXT_FEATURE_BEACON_PROTECTION);
}
-static void iwl_mld_hw_set_regulatory(struct iwl_mld *mld)
-{
- struct wiphy *wiphy = mld->wiphy;
-
- wiphy->regulatory_flags |= REGULATORY_WIPHY_SELF_MANAGED;
- wiphy->regulatory_flags |= REGULATORY_ENABLE_RELAX_NO_IR;
-}
-
static void iwl_mld_hw_set_antennas(struct iwl_mld *mld)
{
struct wiphy *wiphy = mld->wiphy;
@@ -415,7 +407,6 @@ int iwl_mld_register_hw(struct iwl_mld *mld)
iwl_mld_hw_set_addresses(mld);
iwl_mld_hw_set_channels(mld);
iwl_mld_hw_set_security(mld);
- iwl_mld_hw_set_regulatory(mld);
iwl_mld_hw_set_pm(mld);
iwl_mld_hw_set_antennas(mld);
iwl_mac_hw_set_radiotap(mld);
@@ -2,7 +2,7 @@
/*
* Copyright (C) 2024-2025 Intel Corporation
*/
-
+#include <linux/rtnetlink.h>
#include <net/mac80211.h>
#include "fw/api/rx.h"
@@ -50,6 +50,14 @@ static void __exit iwl_mld_exit(void)
}
module_exit(iwl_mld_exit);
+static void iwl_mld_hw_set_regulatory(struct iwl_mld *mld)
+{
+ struct wiphy *wiphy = mld->wiphy;
+
+ wiphy->regulatory_flags |= REGULATORY_WIPHY_SELF_MANAGED;
+ wiphy->regulatory_flags |= REGULATORY_ENABLE_RELAX_NO_IR;
+}
+
VISIBLE_IF_IWLWIFI_KUNIT
void iwl_construct_mld(struct iwl_mld *mld, struct iwl_trans *trans,
const struct iwl_cfg *cfg, const struct iwl_fw *fw,
@@ -67,7 +75,6 @@ void iwl_construct_mld(struct iwl_mld *mld, struct iwl_trans *trans,
/* Setup async RX handling */
spin_lock_init(&mld->async_handlers_lock);
- INIT_LIST_HEAD(&mld->async_handlers_list);
wiphy_work_init(&mld->async_handlers_wk,
iwl_mld_async_handlers_wk);
@@ -387,9 +394,13 @@ iwl_op_mode_mld_start(struct iwl_trans *trans, const struct iwl_cfg *cfg,
iwl_bios_setup_step(trans, &mld->fwrt);
mld->bios_enable_puncturing = iwl_uefi_get_puncturing(&mld->fwrt);
+ iwl_mld_hw_set_regulatory(mld);
+
/* Configure transport layer with the opmode specific params */
iwl_mld_configure_trans(op_mode);
+ /* needed for regulatory init */
+ rtnl_lock();
/* Needed for sending commands */
wiphy_lock(mld->wiphy);
@@ -401,6 +412,7 @@ iwl_op_mode_mld_start(struct iwl_trans *trans, const struct iwl_cfg *cfg,
if (ret) {
wiphy_unlock(mld->wiphy);
+ rtnl_unlock();
iwl_fw_flush_dumps(&mld->fwrt);
goto free_hw;
}
@@ -408,6 +420,7 @@ iwl_op_mode_mld_start(struct iwl_trans *trans, const struct iwl_cfg *cfg,
iwl_mld_stop_fw(mld);
wiphy_unlock(mld->wiphy);
+ rtnl_unlock();
ret = iwl_mld_leds_init(mld);
if (ret)