wifi: iwlwifi: mld: support changing iftype at runtime

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
This commit is contained in:
Johannes Berg
2026-03-20 10:09:07 +02:00
committed by Miri Korenblit
parent d60cbe9ef6
commit 7fa6fcfca7

View 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,