mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-29 13:53:33 +00:00
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: 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
This commit is contained in:
parent
fae2aac8c7
commit
25bbec30a2
1 changed files with 36 additions and 0 deletions
|
@ -990,11 +990,26 @@ is_vif_type_change_allowed(struct mwifiex_adapter *adapter,
|
||||||
}
|
}
|
||||||
|
|
||||||
case NL80211_IFTYPE_P2P_CLIENT:
|
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:
|
case NL80211_IFTYPE_P2P_GO:
|
||||||
switch (new_iftype) {
|
switch (new_iftype) {
|
||||||
case NL80211_IFTYPE_ADHOC:
|
case NL80211_IFTYPE_ADHOC:
|
||||||
case NL80211_IFTYPE_STATION:
|
case NL80211_IFTYPE_STATION:
|
||||||
return true;
|
return true;
|
||||||
|
case NL80211_IFTYPE_P2P_CLIENT:
|
||||||
|
return true;
|
||||||
case NL80211_IFTYPE_AP:
|
case NL80211_IFTYPE_AP:
|
||||||
return adapter->curr_iface_comb.uap_intf !=
|
return adapter->curr_iface_comb.uap_intf !=
|
||||||
adapter->iface_limit.uap_intf;
|
adapter->iface_limit.uap_intf;
|
||||||
|
@ -1265,6 +1280,24 @@ mwifiex_cfg80211_change_virtual_intf(struct wiphy *wiphy,
|
||||||
}
|
}
|
||||||
|
|
||||||
case NL80211_IFTYPE_P2P_CLIENT:
|
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:
|
case NL80211_IFTYPE_P2P_GO:
|
||||||
if (mwifiex_cfg80211_deinit_p2p(priv))
|
if (mwifiex_cfg80211_deinit_p2p(priv))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
@ -1274,6 +1307,9 @@ mwifiex_cfg80211_change_virtual_intf(struct wiphy *wiphy,
|
||||||
case NL80211_IFTYPE_STATION:
|
case NL80211_IFTYPE_STATION:
|
||||||
return mwifiex_change_vif_to_sta_adhoc(dev, curr_iftype,
|
return mwifiex_change_vif_to_sta_adhoc(dev, curr_iftype,
|
||||||
type, params);
|
type, params);
|
||||||
|
case NL80211_IFTYPE_P2P_CLIENT:
|
||||||
|
return mwifiex_change_vif_to_p2p(dev, curr_iftype,
|
||||||
|
type, params);
|
||||||
case NL80211_IFTYPE_AP:
|
case NL80211_IFTYPE_AP:
|
||||||
return mwifiex_change_vif_to_ap(dev, curr_iftype, type,
|
return mwifiex_change_vif_to_ap(dev, curr_iftype, type,
|
||||||
params);
|
params);
|
||||||
|
|
Loading…
Reference in a new issue