rtw88: add ieee80211_ops::change_interface
authorYan-Hsuan Chuang <yhchuang@realtek.com>
Fri, 17 Jul 2020 06:49:35 +0000 (14:49 +0800)
committerKalle Valo <kvalo@codeaurora.org>
Sun, 2 Aug 2020 15:05:16 +0000 (18:05 +0300)
Sometimes mac80211 will just ask driver to change the interface
instead of to remove and then add a new one. And for driver, to
change the interface is just simply to remove and add a new one
but change the type of it.

Signed-off-by: Yan-Hsuan Chuang <yhchuang@realtek.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
Link: https://lore.kernel.org/r/20200717064937.27966-6-yhchuang@realtek.com
drivers/net/wireless/realtek/rtw88/mac80211.c

index c412bc54efde1bc513793b5e7f188c781d5bcd95..bb82b044ff82b4bd5673cb9a091a8b2a02e84f2e 100644 (file)
@@ -231,6 +231,23 @@ static void rtw_ops_remove_interface(struct ieee80211_hw *hw,
        mutex_unlock(&rtwdev->mutex);
 }
 
+static int rtw_ops_change_interface(struct ieee80211_hw *hw,
+                                   struct ieee80211_vif *vif,
+                                   enum nl80211_iftype type, bool p2p)
+{
+       struct rtw_dev *rtwdev = hw->priv;
+
+       rtw_info(rtwdev, "change vif %pM (%d)->(%d), p2p (%d)->(%d)\n",
+                vif->addr, vif->type, type, vif->p2p, p2p);
+
+       rtw_ops_remove_interface(hw, vif);
+
+       vif->type = type;
+       vif->p2p = p2p;
+
+       return rtw_ops_add_interface(hw, vif);
+}
+
 static void rtw_ops_configure_filter(struct ieee80211_hw *hw,
                                     unsigned int changed_flags,
                                     unsigned int *new_flags,
@@ -827,6 +844,7 @@ const struct ieee80211_ops rtw_ops = {
        .config                 = rtw_ops_config,
        .add_interface          = rtw_ops_add_interface,
        .remove_interface       = rtw_ops_remove_interface,
+       .change_interface       = rtw_ops_change_interface,
        .configure_filter       = rtw_ops_configure_filter,
        .bss_info_changed       = rtw_ops_bss_info_changed,
        .conf_tx                = rtw_ops_conf_tx,