]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
wifi: iwlwifi: mld: support changing iftype at runtime
authorJohannes Berg <johannes.berg@intel.com>
Fri, 20 Mar 2026 08:09:07 +0000 (10:09 +0200)
committerMiri Korenblit <miriam.rachel.korenblit@intel.com>
Wed, 25 Mar 2026 09:31:57 +0000 (11:31 +0200)
While the interface isn't really operating, which is already
required by mac80211, we can simply remove the MAC and add
it again to change the type. Implement this simple handling.

We could almost consider moving this to mac80211 itself, as
this kind of flow should be supportable by any device, but
for now keep it here.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com>
Link: https://patch.msgid.link/20260320100746.2fb530f9d825.I7cc68fa36e40c9f3bef3be9c2982061cb9ea2300@changeid
drivers/net/wireless/intel/iwlwifi/mld/mac80211.c

index 0c53d6bd96514c6bd661776d7cb50867a4cf202e..79f4dc271c34a08d766809e10396fb0246171806 100644 (file)
@@ -754,6 +754,30 @@ void iwl_mld_mac80211_remove_interface(struct ieee80211_hw *hw,
        mld->monitor.phy.valid = false;
 }
 
+static
+int iwl_mld_mac80211_change_interface(struct ieee80211_hw *hw,
+                                     struct ieee80211_vif *vif,
+                                     enum nl80211_iftype new_type, bool p2p)
+{
+       enum nl80211_iftype old_type = vif->type;
+       bool old_p2p = vif->p2p;
+       int ret;
+
+       iwl_mld_mac80211_remove_interface(hw, vif);
+
+       /* set the new type for adding it cleanly */
+       vif->type = new_type;
+       vif->p2p = p2p;
+
+       ret = iwl_mld_mac80211_add_interface(hw, vif);
+
+       /* restore for mac80211, it will change it again */
+       vif->type = old_type;
+       vif->p2p = old_p2p;
+
+       return ret;
+}
+
 struct iwl_mld_mc_iter_data {
        struct iwl_mld *mld;
        int port_id;
@@ -2716,6 +2740,7 @@ const struct ieee80211_ops iwl_mld_hw_ops = {
        .get_antenna = iwl_mld_get_antenna,
        .set_antenna = iwl_mld_set_antenna,
        .add_interface = iwl_mld_mac80211_add_interface,
+       .change_interface = iwl_mld_mac80211_change_interface,
        .remove_interface = iwl_mld_mac80211_remove_interface,
        .conf_tx = iwl_mld_mac80211_conf_tx,
        .prepare_multicast = iwl_mld_mac80211_prepare_multicast,