Loading drivers/net/wireless/ath/wil6210/cfg80211.c +42 −0 Original line number Diff line number Diff line Loading @@ -34,6 +34,8 @@ */ #define WIL_EDMG_CHANNELS (BIT(0) | BIT(1) | BIT(2) | BIT(3)) #define WIL_DISABLE_EDMG 255 bool disable_ap_sme; module_param(disable_ap_sme, bool, 0444); MODULE_PARM_DESC(disable_ap_sme, " let user space handle AP mode SME"); Loading Loading @@ -594,6 +596,9 @@ int wil_spec2wmi_ch(u8 spec_ch, u8 *wmi_ch) case 12: *wmi_ch = WMI_CHANNEL_12; break; case WIL_DISABLE_EDMG: *wmi_ch = 0; break; default: return -EINVAL; } Loading Loading @@ -2336,6 +2341,11 @@ static int wil_cfg80211_change_beacon(struct wiphy *wiphy, struct wil6210_vif *vif = ndev_to_vif(ndev); int rc; u32 privacy = 0; u16 len = 0, proberesp_len = 0; u8 *ies = NULL, *proberesp; bool ssid_changed = false; const u8 *ie; wil_dbg_misc(wil, "change_beacon, mid=%d\n", vif->mid); wil_print_bcon_data(bcon); Loading @@ -2348,6 +2358,27 @@ static int wil_cfg80211_change_beacon(struct wiphy *wiphy, memcpy(vif->ssid, wdev->ssid, wdev->ssid_len); vif->ssid_len = wdev->ssid_len; /* extract updated SSID from the probe response IE */ proberesp = _wil_cfg80211_get_proberesp_ies(bcon->probe_resp, bcon->probe_resp_len, &proberesp_len); rc = _wil_cfg80211_merge_extra_ies(proberesp, proberesp_len, bcon->proberesp_ies, bcon->proberesp_ies_len, &ies, &len); if (!rc) { ie = cfg80211_find_ie(WLAN_EID_SSID, ies, len); if (ie && ie[1] <= IEEE80211_MAX_SSID_LEN) if (ie[1] != vif->ssid_len || memcmp(&ie[2], vif->ssid, ie[1])) { memcpy(vif->ssid, &ie[2], ie[1]); vif->ssid_len = ie[1]; ssid_changed = true; } } /* in case privacy has changed, need to restart the AP */ if (vif->privacy != privacy) { wil_dbg_misc(wil, "privacy changed %d=>%d. Restarting AP\n", Loading @@ -2361,9 +2392,20 @@ static int wil_cfg80211_change_beacon(struct wiphy *wiphy, vif->hidden_ssid, vif->pbss); } else { if (ssid_changed) { rc = wmi_set_ssid(vif, vif->ssid_len, vif->ssid); if (rc) goto out; } rc = _wil_cfg80211_set_ies(vif, bcon); } if (ssid_changed) { wdev->ssid_len = vif->ssid_len; memcpy(wdev->ssid, vif->ssid, vif->ssid_len); } out: return rc; } Loading drivers/net/wireless/ath/wil6210/wil6210.h +1 −0 Original line number Diff line number Diff line Loading @@ -1049,6 +1049,7 @@ struct wil6210_priv { u8 wakeup_trigger; struct wil_suspend_stats suspend_stats; struct wil_debugfs_data dbg_data; /* set to WIL_EDMG_DISABLE to force disable EDMG */ u8 force_edmg_channel; bool tx_latency; /* collect TX latency measurements */ size_t tx_latency_res; /* bin resolution in usec */ Loading drivers/net/wireless/ath/wil6210/wmi.c +20 −20 Original line number Diff line number Diff line Loading @@ -1069,6 +1069,24 @@ static void wmi_evt_connect(struct wil6210_vif *vif, int id, void *d, int len) mutex_unlock(&wil->mutex); return; } sinfo = kzalloc(sizeof(*sinfo), GFP_KERNEL); if (!sinfo) { wmi_disconnect_sta(vif, wil->sta[evt->cid].addr, WLAN_REASON_UNSPECIFIED, false); rc = -ENOMEM; goto out; } sinfo->generation = wil->sinfo_gen++; if (assoc_req_ie) { sinfo->assoc_req_ies = assoc_req_ie; sinfo->assoc_req_ies_len = assoc_req_ielen; } cfg80211_new_sta(ndev, evt->bssid, sinfo, GFP_KERNEL); kfree(sinfo); } ether_addr_copy(wil->sta[evt->cid].addr, evt->bssid); Loading Loading @@ -1111,28 +1129,10 @@ static void wmi_evt_connect(struct wil6210_vif *vif, int id, void *d, int len) (wdev->iftype == NL80211_IFTYPE_P2P_GO)) { if (rc) { if (disable_ap_sme) /* notify new_sta has failed */ cfg80211_del_sta(ndev, evt->bssid, GFP_KERNEL); goto out; } sinfo = kzalloc(sizeof(*sinfo), GFP_KERNEL); if (!sinfo) { rc = -ENOMEM; goto out; } sinfo->generation = wil->sinfo_gen++; if (assoc_req_ie) { sinfo->assoc_req_ies = assoc_req_ie; sinfo->assoc_req_ies_len = assoc_req_ielen; } cfg80211_new_sta(ndev, evt->bssid, sinfo, GFP_KERNEL); kfree(sinfo); } else { wil_err(wil, "unhandled iftype %d for CID %d\n", wdev->iftype, evt->cid); Loading Loading
drivers/net/wireless/ath/wil6210/cfg80211.c +42 −0 Original line number Diff line number Diff line Loading @@ -34,6 +34,8 @@ */ #define WIL_EDMG_CHANNELS (BIT(0) | BIT(1) | BIT(2) | BIT(3)) #define WIL_DISABLE_EDMG 255 bool disable_ap_sme; module_param(disable_ap_sme, bool, 0444); MODULE_PARM_DESC(disable_ap_sme, " let user space handle AP mode SME"); Loading Loading @@ -594,6 +596,9 @@ int wil_spec2wmi_ch(u8 spec_ch, u8 *wmi_ch) case 12: *wmi_ch = WMI_CHANNEL_12; break; case WIL_DISABLE_EDMG: *wmi_ch = 0; break; default: return -EINVAL; } Loading Loading @@ -2336,6 +2341,11 @@ static int wil_cfg80211_change_beacon(struct wiphy *wiphy, struct wil6210_vif *vif = ndev_to_vif(ndev); int rc; u32 privacy = 0; u16 len = 0, proberesp_len = 0; u8 *ies = NULL, *proberesp; bool ssid_changed = false; const u8 *ie; wil_dbg_misc(wil, "change_beacon, mid=%d\n", vif->mid); wil_print_bcon_data(bcon); Loading @@ -2348,6 +2358,27 @@ static int wil_cfg80211_change_beacon(struct wiphy *wiphy, memcpy(vif->ssid, wdev->ssid, wdev->ssid_len); vif->ssid_len = wdev->ssid_len; /* extract updated SSID from the probe response IE */ proberesp = _wil_cfg80211_get_proberesp_ies(bcon->probe_resp, bcon->probe_resp_len, &proberesp_len); rc = _wil_cfg80211_merge_extra_ies(proberesp, proberesp_len, bcon->proberesp_ies, bcon->proberesp_ies_len, &ies, &len); if (!rc) { ie = cfg80211_find_ie(WLAN_EID_SSID, ies, len); if (ie && ie[1] <= IEEE80211_MAX_SSID_LEN) if (ie[1] != vif->ssid_len || memcmp(&ie[2], vif->ssid, ie[1])) { memcpy(vif->ssid, &ie[2], ie[1]); vif->ssid_len = ie[1]; ssid_changed = true; } } /* in case privacy has changed, need to restart the AP */ if (vif->privacy != privacy) { wil_dbg_misc(wil, "privacy changed %d=>%d. Restarting AP\n", Loading @@ -2361,9 +2392,20 @@ static int wil_cfg80211_change_beacon(struct wiphy *wiphy, vif->hidden_ssid, vif->pbss); } else { if (ssid_changed) { rc = wmi_set_ssid(vif, vif->ssid_len, vif->ssid); if (rc) goto out; } rc = _wil_cfg80211_set_ies(vif, bcon); } if (ssid_changed) { wdev->ssid_len = vif->ssid_len; memcpy(wdev->ssid, vif->ssid, vif->ssid_len); } out: return rc; } Loading
drivers/net/wireless/ath/wil6210/wil6210.h +1 −0 Original line number Diff line number Diff line Loading @@ -1049,6 +1049,7 @@ struct wil6210_priv { u8 wakeup_trigger; struct wil_suspend_stats suspend_stats; struct wil_debugfs_data dbg_data; /* set to WIL_EDMG_DISABLE to force disable EDMG */ u8 force_edmg_channel; bool tx_latency; /* collect TX latency measurements */ size_t tx_latency_res; /* bin resolution in usec */ Loading
drivers/net/wireless/ath/wil6210/wmi.c +20 −20 Original line number Diff line number Diff line Loading @@ -1069,6 +1069,24 @@ static void wmi_evt_connect(struct wil6210_vif *vif, int id, void *d, int len) mutex_unlock(&wil->mutex); return; } sinfo = kzalloc(sizeof(*sinfo), GFP_KERNEL); if (!sinfo) { wmi_disconnect_sta(vif, wil->sta[evt->cid].addr, WLAN_REASON_UNSPECIFIED, false); rc = -ENOMEM; goto out; } sinfo->generation = wil->sinfo_gen++; if (assoc_req_ie) { sinfo->assoc_req_ies = assoc_req_ie; sinfo->assoc_req_ies_len = assoc_req_ielen; } cfg80211_new_sta(ndev, evt->bssid, sinfo, GFP_KERNEL); kfree(sinfo); } ether_addr_copy(wil->sta[evt->cid].addr, evt->bssid); Loading Loading @@ -1111,28 +1129,10 @@ static void wmi_evt_connect(struct wil6210_vif *vif, int id, void *d, int len) (wdev->iftype == NL80211_IFTYPE_P2P_GO)) { if (rc) { if (disable_ap_sme) /* notify new_sta has failed */ cfg80211_del_sta(ndev, evt->bssid, GFP_KERNEL); goto out; } sinfo = kzalloc(sizeof(*sinfo), GFP_KERNEL); if (!sinfo) { rc = -ENOMEM; goto out; } sinfo->generation = wil->sinfo_gen++; if (assoc_req_ie) { sinfo->assoc_req_ies = assoc_req_ie; sinfo->assoc_req_ies_len = assoc_req_ielen; } cfg80211_new_sta(ndev, evt->bssid, sinfo, GFP_KERNEL); kfree(sinfo); } else { wil_err(wil, "unhandled iftype %d for CID %d\n", wdev->iftype, evt->cid); Loading