Commit 25bbec30 authored by Jonas Dreßler's avatar Jonas Dreßler Committed by Kalle Valo
Browse files

mwifiex: Allow switching interface type from P2P_CLIENT to P2P_GO



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: default avatarJonas Dreßler <verdre@v0yd.nl>
Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
Link: https://lore.kernel.org/r/20210914195909.36035-7-verdre@v0yd.nl
parent fae2aac8
Loading
Loading
Loading
Loading
+36 −0
Original line number Diff line number Diff line
@@ -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);