int wil_down(struct wil6210_priv *wil) { int rc; mutex_lock(&wil->mutex); rc = __wil_down(wil); mutex_unlock(&wil->mutex); return rc; }
static int wil_cfg80211_stop_ap(struct wiphy *wiphy, struct net_device *ndev) { int rc, rc1; struct wil6210_priv *wil = wiphy_to_wil(wiphy); wil_dbg_misc(wil, "%s()\n", __func__); mutex_lock(&wil->mutex); rc = wmi_pcp_stop(wil); __wil_down(wil); rc1 = __wil_up(wil); mutex_unlock(&wil->mutex); return min(rc, rc1); }
static int wil_cfg80211_start_ap(struct wiphy *wiphy, struct net_device *ndev, struct cfg80211_ap_settings *info) { int rc = 0; struct wil6210_priv *wil = wiphy_to_wil(wiphy); struct wireless_dev *wdev = ndev->ieee80211_ptr; struct ieee80211_channel *channel = info->chandef.chan; struct cfg80211_beacon_data *bcon = &info->beacon; struct cfg80211_crypto_settings *crypto = &info->crypto; u8 wmi_nettype = wil_iftype_nl2wmi(wdev->iftype); wil_dbg_misc(wil, "%s()\n", __func__); if (!channel) { wil_err(wil, "AP: No channel???\n"); return -EINVAL; } wil_dbg_misc(wil, "AP on Channel %d %d MHz, %s\n", channel->hw_value, channel->center_freq, info->privacy ? "secure" : "open"); wil_dbg_misc(wil, "Privacy: %d auth_type %d\n", info->privacy, info->auth_type); wil_dbg_misc(wil, "BI %d DTIM %d\n", info->beacon_interval, info->dtim_period); print_hex_dump_bytes("SSID ", DUMP_PREFIX_OFFSET, info->ssid, info->ssid_len); wil_print_bcon_data(bcon); wil_print_crypto(wil, crypto); if (wil_fix_bcon(wil, bcon)) { wil_dbg_misc(wil, "Fixed bcon\n"); wil_print_bcon_data(bcon); } mutex_lock(&wil->mutex); __wil_down(wil); rc = __wil_up(wil); if (rc) goto out; rc = wmi_set_ssid(wil, info->ssid_len, info->ssid); if (rc) goto out; /* IE's */ /* bcon 'head IE's are not relevant for 60g band */ /* * FW do not form regular beacon, so bcon IE's are not set * For the DMG bcon, when it will be supported, bcon IE's will * be reused; add something like: * wmi_set_ie(wil, WMI_FRAME_BEACON, bcon->beacon_ies_len, * bcon->beacon_ies); */ wmi_set_ie(wil, WMI_FRAME_PROBE_RESP, bcon->proberesp_ies_len, bcon->proberesp_ies); wmi_set_ie(wil, WMI_FRAME_ASSOC_RESP, bcon->assocresp_ies_len, bcon->assocresp_ies); wil->secure_pcp = info->privacy; rc = wmi_pcp_start(wil, info->beacon_interval, wmi_nettype, channel->hw_value); if (rc) goto out; netif_carrier_on(ndev); out: mutex_unlock(&wil->mutex); return rc; }