]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: iwlwifi: mld: Support changing NAN configuration
authorIlan Peer <ilan.peer@intel.com>
Mon, 10 Nov 2025 16:08:49 +0000 (18:08 +0200)
committerMiri Korenblit <miriam.rachel.korenblit@intel.com>
Wed, 21 Jan 2026 12:23:01 +0000 (14:23 +0200)
Add support for changing the NAN configuration.

Signed-off-by: Ilan Peer <ilan.peer@intel.com>
Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com>
Link: https://patch.msgid.link/20251110180612.82dcdfeb9533.Ib8576873c92f68f1bcafbda409d45ef2b4133e9f@changeid
drivers/net/wireless/intel/iwlwifi/mld/mac80211.c
drivers/net/wireless/intel/iwlwifi/mld/nan.c
drivers/net/wireless/intel/iwlwifi/mld/nan.h

index 9a58f2751d4ef714c579976a65835bb105993824..05ab6246eb17dc68896d3d097fcd03d1d23e355c 100644 (file)
@@ -2770,4 +2770,5 @@ const struct ieee80211_ops iwl_mld_hw_ops = {
        .can_neg_ttlm = iwl_mld_can_neg_ttlm,
        .start_nan = iwl_mld_start_nan,
        .stop_nan = iwl_mld_stop_nan,
+       .nan_change_conf = iwl_mld_nan_change_config,
 };
index 6cdee2aa0f50666de2a4b00934097054c4a333f2..e7a2c1ec7494b98211aa42747a3f6a2390b2deee 100644 (file)
@@ -37,22 +37,19 @@ static int iwl_mld_nan_send_config_cmd(struct iwl_mld *mld,
        return iwl_mld_send_cmd(mld, &hcmd);
 }
 
-int iwl_mld_start_nan(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
-                     struct cfg80211_nan_conf *conf)
+static int iwl_mld_nan_config(struct iwl_mld *mld,
+                             struct ieee80211_vif *vif,
+                             struct cfg80211_nan_conf *conf,
+                             enum iwl_ctxt_action action)
 {
-       struct iwl_mld *mld = IWL_MAC80211_GET_MLD(hw);
        struct iwl_mld_vif *mld_vif = iwl_mld_vif_from_mac80211(vif);
-       struct iwl_mld_int_sta *aux_sta = &mld_vif->aux_sta;
        struct iwl_nan_config_cmd cmd = {
-               .action = cpu_to_le32(FW_CTXT_ACTION_ADD),
+               .action = cpu_to_le32(action),
        };
        u8 *data __free(kfree) = NULL;
-       int ret;
 
        lockdep_assert_wiphy(mld->wiphy);
 
-       IWL_DEBUG_MAC80211(mld, "Start NAN: bands=0x%x\n", conf->bands);
-
        ether_addr_copy(cmd.nmi_addr, vif->addr);
        cmd.master_pref = conf->master_pref;
 
@@ -117,15 +114,27 @@ int iwl_mld_start_nan(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
                               conf->vendor_elems_len);
        }
 
+       cmd.sta_id = mld_vif->aux_sta.sta_id;
+       return iwl_mld_nan_send_config_cmd(mld, &cmd, data,
+                                          conf->extra_nan_attrs_len +
+                                          conf->vendor_elems_len);
+}
+
+int iwl_mld_start_nan(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
+                     struct cfg80211_nan_conf *conf)
+{
+       struct iwl_mld *mld = IWL_MAC80211_GET_MLD(hw);
+       struct iwl_mld_vif *mld_vif = iwl_mld_vif_from_mac80211(vif);
+       struct iwl_mld_int_sta *aux_sta = &mld_vif->aux_sta;
+       int ret;
+
+       IWL_DEBUG_MAC80211(mld, "NAN: start: bands=0x%x\n", conf->bands);
+
        ret = iwl_mld_add_aux_sta(mld, aux_sta);
        if (ret)
                return ret;
 
-       cmd.sta_id = aux_sta->sta_id;
-
-       ret = iwl_mld_nan_send_config_cmd(mld, &cmd, data,
-                                         conf->extra_nan_attrs_len +
-                                         conf->vendor_elems_len);
+       ret = iwl_mld_nan_config(mld, vif, conf, FW_CTXT_ACTION_ADD);
        if (ret) {
                IWL_ERR(mld, "Failed to start NAN. ret=%d\n", ret);
                iwl_mld_remove_aux_sta(mld, vif);
@@ -134,6 +143,23 @@ int iwl_mld_start_nan(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
        return ret;
 }
 
+int iwl_mld_nan_change_config(struct ieee80211_hw *hw,
+                             struct ieee80211_vif *vif,
+                             struct cfg80211_nan_conf *conf,
+                             u32 changes)
+{
+       struct iwl_mld *mld = IWL_MAC80211_GET_MLD(hw);
+
+       IWL_DEBUG_MAC80211(mld, "NAN: change: changes=0x%x, bands=0x%x\n",
+                          changes, conf->bands);
+
+       /* Note that we do not use 'changes' as the FW always expects the
+        * complete configuration, and mac80211 always provides the complete
+        * configuration.
+        */
+       return iwl_mld_nan_config(mld, vif, conf, FW_CTXT_ACTION_MODIFY);
+}
+
 int iwl_mld_stop_nan(struct ieee80211_hw *hw,
                     struct ieee80211_vif *vif)
 {
index 97607b74a1777c7d256f6fcf07d4c818c88e1c44..c9c83d1012f033f633fbd2224f5a57c475db8d7e 100644 (file)
@@ -10,6 +10,10 @@ bool iwl_mld_nan_supported(struct iwl_mld *mld);
 int iwl_mld_start_nan(struct ieee80211_hw *hw,
                      struct ieee80211_vif *vif,
                      struct cfg80211_nan_conf *conf);
+int iwl_mld_nan_change_config(struct ieee80211_hw *hw,
+                             struct ieee80211_vif *vif,
+                             struct cfg80211_nan_conf *conf,
+                             u32 changes);
 int iwl_mld_stop_nan(struct ieee80211_hw *hw,
                     struct ieee80211_vif *vif);
 void iwl_mld_handle_nan_cluster_notif(struct iwl_mld *mld,