mwifiex: Allow switching interface type from P2P_CLIENT to P2P_GO
authorJonas Dreßler <verdre@v0yd.nl>
Tue, 14 Sep 2021 19:59:06 +0000 (21:59 +0200)
committerKalle Valo <kvalo@codeaurora.org>
Tue, 21 Sep 2021 15:02:18 +0000 (18:02 +0300)
It's possible to change virtual interface type between P2P_CLIENT and
P2P_GO, the card supports that just fine, and it happens for example
when using miracast with the miraclecast software.

So allow type changes between P2P_CLIENT and P2P_GO and simply call into
mwifiex_change_vif_to_p2p(), which handles this just fine. We have to
call mwifiex_cfg80211_deinit_p2p() before though to make sure the old
p2p mode is properly uninitialized.

Signed-off-by: Jonas Dreßler <verdre@v0yd.nl>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
Link: https://lore.kernel.org/r/20210914195909.36035-7-verdre@v0yd.nl
drivers/net/wireless/marvell/mwifiex/cfg80211.c

index f279710..ed4041f 100644 (file)
@@ -990,11 +990,26 @@ is_vif_type_change_allowed(struct mwifiex_adapter *adapter,
                }
 
        case NL80211_IFTYPE_P2P_CLIENT:
+               switch (new_iftype) {
+               case NL80211_IFTYPE_ADHOC:
+               case NL80211_IFTYPE_STATION:
+                       return true;
+               case NL80211_IFTYPE_P2P_GO:
+                       return true;
+               case NL80211_IFTYPE_AP:
+                       return adapter->curr_iface_comb.uap_intf !=
+                              adapter->iface_limit.uap_intf;
+               default:
+                       return false;
+               }
+
        case NL80211_IFTYPE_P2P_GO:
                switch (new_iftype) {
                case NL80211_IFTYPE_ADHOC:
                case NL80211_IFTYPE_STATION:
                        return true;
+               case NL80211_IFTYPE_P2P_CLIENT:
+                       return true;
                case NL80211_IFTYPE_AP:
                        return adapter->curr_iface_comb.uap_intf !=
                               adapter->iface_limit.uap_intf;
@@ -1265,6 +1280,24 @@ mwifiex_cfg80211_change_virtual_intf(struct wiphy *wiphy,
                }
 
        case NL80211_IFTYPE_P2P_CLIENT:
+               if (mwifiex_cfg80211_deinit_p2p(priv))
+                       return -EFAULT;
+
+               switch (type) {
+               case NL80211_IFTYPE_ADHOC:
+               case NL80211_IFTYPE_STATION:
+                       return mwifiex_change_vif_to_sta_adhoc(dev, curr_iftype,
+                                                              type, params);
+               case NL80211_IFTYPE_P2P_GO:
+                       return mwifiex_change_vif_to_p2p(dev, curr_iftype,
+                                                        type, params);
+               case NL80211_IFTYPE_AP:
+                       return mwifiex_change_vif_to_ap(dev, curr_iftype, type,
+                                                       params);
+               default:
+                       goto errnotsupp;
+               }
+
        case NL80211_IFTYPE_P2P_GO:
                if (mwifiex_cfg80211_deinit_p2p(priv))
                        return -EFAULT;
@@ -1274,6 +1307,9 @@ mwifiex_cfg80211_change_virtual_intf(struct wiphy *wiphy,
                case NL80211_IFTYPE_STATION:
                        return mwifiex_change_vif_to_sta_adhoc(dev, curr_iftype,
                                                               type, params);
+               case NL80211_IFTYPE_P2P_CLIENT:
+                       return mwifiex_change_vif_to_p2p(dev, curr_iftype,
+                                                        type, params);
                case NL80211_IFTYPE_AP:
                        return mwifiex_change_vif_to_ap(dev, curr_iftype, type,
                                                        params);