Commit 4c895f41 authored by Kirshenbaum Erez's avatar Kirshenbaum Erez Committed by John W. Linville

wil6210: Fix AP/PCP start flow

WMI PCP Start flow should not be handled through:
net_device_ops->ndo_open()->wil_up()->__wil_up()
because it missing mandatory FW parameters (SSID,Channel,IEs, Security...).

Prior to AP starting __wil_up() may be called with iftype set
cfg80211_ops->change_virtual_intf(NL80211_IFTYPE_AP or STATION)
depend on the application hostapd/wpa_supplicant/iw.
there should not be an attempt to start an AP flow,
AP/PCP start flow will be started latter by cfg80211_ops->start_ap().
Signed-off-by: default avatarKirshenbaum Erez <erezk@wilocity.com>
Signed-off-by: default avatarVladimir Kondratiev <qca_vkondrat@qca.qualcomm.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent eb4928cf
...@@ -286,10 +286,7 @@ static int __wil_up(struct wil6210_priv *wil) ...@@ -286,10 +286,7 @@ static int __wil_up(struct wil6210_priv *wil)
{ {
struct net_device *ndev = wil_to_ndev(wil); struct net_device *ndev = wil_to_ndev(wil);
struct wireless_dev *wdev = wil->wdev; struct wireless_dev *wdev = wil->wdev;
struct ieee80211_channel *channel = wdev->preset_chandef.chan;
int rc; int rc;
int bi;
u16 wmi_nettype = wil_iftype_nl2wmi(wdev->iftype);
rc = wil_reset(wil); rc = wil_reset(wil);
if (rc) if (rc)
...@@ -300,32 +297,25 @@ static int __wil_up(struct wil6210_priv *wil) ...@@ -300,32 +297,25 @@ static int __wil_up(struct wil6210_priv *wil)
if (rc) if (rc)
return rc; return rc;
/* FIXME Firmware works now in PBSS mode(ToDS=0, FromDS=0) */
wmi_nettype = wil_iftype_nl2wmi(NL80211_IFTYPE_ADHOC);
switch (wdev->iftype) { switch (wdev->iftype) {
case NL80211_IFTYPE_STATION: case NL80211_IFTYPE_STATION:
wil_dbg_misc(wil, "type: STATION\n"); wil_dbg_misc(wil, "type: STATION\n");
bi = 0;
ndev->type = ARPHRD_ETHER; ndev->type = ARPHRD_ETHER;
break; break;
case NL80211_IFTYPE_AP: case NL80211_IFTYPE_AP:
wil_dbg_misc(wil, "type: AP\n"); wil_dbg_misc(wil, "type: AP\n");
bi = 100;
ndev->type = ARPHRD_ETHER; ndev->type = ARPHRD_ETHER;
break; break;
case NL80211_IFTYPE_P2P_CLIENT: case NL80211_IFTYPE_P2P_CLIENT:
wil_dbg_misc(wil, "type: P2P_CLIENT\n"); wil_dbg_misc(wil, "type: P2P_CLIENT\n");
bi = 0;
ndev->type = ARPHRD_ETHER; ndev->type = ARPHRD_ETHER;
break; break;
case NL80211_IFTYPE_P2P_GO: case NL80211_IFTYPE_P2P_GO:
wil_dbg_misc(wil, "type: P2P_GO\n"); wil_dbg_misc(wil, "type: P2P_GO\n");
bi = 100;
ndev->type = ARPHRD_ETHER; ndev->type = ARPHRD_ETHER;
break; break;
case NL80211_IFTYPE_MONITOR: case NL80211_IFTYPE_MONITOR:
wil_dbg_misc(wil, "type: Monitor\n"); wil_dbg_misc(wil, "type: Monitor\n");
bi = 0;
ndev->type = ARPHRD_IEEE80211_RADIOTAP; ndev->type = ARPHRD_IEEE80211_RADIOTAP;
/* ARPHRD_IEEE80211 or ARPHRD_IEEE80211_RADIOTAP ? */ /* ARPHRD_IEEE80211 or ARPHRD_IEEE80211_RADIOTAP ? */
break; break;
...@@ -333,33 +323,9 @@ static int __wil_up(struct wil6210_priv *wil) ...@@ -333,33 +323,9 @@ static int __wil_up(struct wil6210_priv *wil)
return -EOPNOTSUPP; return -EOPNOTSUPP;
} }
/* Apply profile in the following order: */
/* SSID and channel for the AP */
switch (wdev->iftype) {
case NL80211_IFTYPE_AP:
case NL80211_IFTYPE_P2P_GO:
if (wdev->ssid_len == 0) {
wil_err(wil, "SSID not set\n");
return -EINVAL;
}
rc = wmi_set_ssid(wil, wdev->ssid_len, wdev->ssid);
if (rc)
return rc;
break;
default:
break;
}
/* MAC address - pre-requisite for other commands */ /* MAC address - pre-requisite for other commands */
wmi_set_mac_address(wil, ndev->dev_addr); wmi_set_mac_address(wil, ndev->dev_addr);
/* Set up beaconing if required. */
if (bi > 0) {
rc = wmi_pcp_start(wil, bi, wmi_nettype,
(channel ? channel->hw_value : 0));
if (rc)
return rc;
}
napi_enable(&wil->napi_rx); napi_enable(&wil->napi_rx);
napi_enable(&wil->napi_tx); napi_enable(&wil->napi_tx);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment