mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-20 13:41:30 +00:00
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless into for-davem
This commit is contained in:
commit
025a58fd9d
16 changed files with 106 additions and 78 deletions
|
@ -317,6 +317,7 @@ struct ieee80211_roc_work {
|
|||
|
||||
bool started, abort, hw_begun, notified;
|
||||
bool to_be_freed;
|
||||
bool on_channel;
|
||||
|
||||
unsigned long hw_start_time;
|
||||
|
||||
|
|
|
@ -3598,18 +3598,24 @@ void ieee80211_mgd_quiesce(struct ieee80211_sub_if_data *sdata)
|
|||
|
||||
sdata_lock(sdata);
|
||||
|
||||
if (ifmgd->auth_data) {
|
||||
if (ifmgd->auth_data || ifmgd->assoc_data) {
|
||||
const u8 *bssid = ifmgd->auth_data ?
|
||||
ifmgd->auth_data->bss->bssid :
|
||||
ifmgd->assoc_data->bss->bssid;
|
||||
|
||||
/*
|
||||
* If we are trying to authenticate while suspending, cfg80211
|
||||
* won't know and won't actually abort those attempts, thus we
|
||||
* need to do that ourselves.
|
||||
* If we are trying to authenticate / associate while suspending,
|
||||
* cfg80211 won't know and won't actually abort those attempts,
|
||||
* thus we need to do that ourselves.
|
||||
*/
|
||||
ieee80211_send_deauth_disassoc(sdata,
|
||||
ifmgd->auth_data->bss->bssid,
|
||||
ieee80211_send_deauth_disassoc(sdata, bssid,
|
||||
IEEE80211_STYPE_DEAUTH,
|
||||
WLAN_REASON_DEAUTH_LEAVING,
|
||||
false, frame_buf);
|
||||
ieee80211_destroy_auth_data(sdata, false);
|
||||
if (ifmgd->assoc_data)
|
||||
ieee80211_destroy_assoc_data(sdata, false);
|
||||
if (ifmgd->auth_data)
|
||||
ieee80211_destroy_auth_data(sdata, false);
|
||||
cfg80211_tx_mlme_mgmt(sdata->dev, frame_buf,
|
||||
IEEE80211_DEAUTH_FRAME_LEN);
|
||||
}
|
||||
|
|
|
@ -333,7 +333,7 @@ void ieee80211_sw_roc_work(struct work_struct *work)
|
|||
container_of(work, struct ieee80211_roc_work, work.work);
|
||||
struct ieee80211_sub_if_data *sdata = roc->sdata;
|
||||
struct ieee80211_local *local = sdata->local;
|
||||
bool started;
|
||||
bool started, on_channel;
|
||||
|
||||
mutex_lock(&local->mtx);
|
||||
|
||||
|
@ -354,14 +354,26 @@ void ieee80211_sw_roc_work(struct work_struct *work)
|
|||
if (!roc->started) {
|
||||
struct ieee80211_roc_work *dep;
|
||||
|
||||
/* start this ROC */
|
||||
ieee80211_offchannel_stop_vifs(local);
|
||||
WARN_ON(local->use_chanctx);
|
||||
|
||||
/* switch channel etc */
|
||||
/* If actually operating on the desired channel (with at least
|
||||
* 20 MHz channel width) don't stop all the operations but still
|
||||
* treat it as though the ROC operation started properly, so
|
||||
* other ROC operations won't interfere with this one.
|
||||
*/
|
||||
roc->on_channel = roc->chan == local->_oper_chandef.chan &&
|
||||
local->_oper_chandef.width != NL80211_CHAN_WIDTH_5 &&
|
||||
local->_oper_chandef.width != NL80211_CHAN_WIDTH_10;
|
||||
|
||||
/* start this ROC */
|
||||
ieee80211_recalc_idle(local);
|
||||
|
||||
local->tmp_channel = roc->chan;
|
||||
ieee80211_hw_config(local, 0);
|
||||
if (!roc->on_channel) {
|
||||
ieee80211_offchannel_stop_vifs(local);
|
||||
|
||||
local->tmp_channel = roc->chan;
|
||||
ieee80211_hw_config(local, 0);
|
||||
}
|
||||
|
||||
/* tell userspace or send frame */
|
||||
ieee80211_handle_roc_started(roc);
|
||||
|
@ -380,9 +392,10 @@ void ieee80211_sw_roc_work(struct work_struct *work)
|
|||
finish:
|
||||
list_del(&roc->list);
|
||||
started = roc->started;
|
||||
on_channel = roc->on_channel;
|
||||
ieee80211_roc_notify_destroy(roc, !roc->abort);
|
||||
|
||||
if (started) {
|
||||
if (started && !on_channel) {
|
||||
ieee80211_flush_queues(local, NULL);
|
||||
|
||||
local->tmp_channel = NULL;
|
||||
|
|
|
@ -21,10 +21,10 @@
|
|||
|
||||
#define VIF_ENTRY __field(enum nl80211_iftype, vif_type) __field(void *, sdata) \
|
||||
__field(bool, p2p) \
|
||||
__string(vif_name, sdata->dev ? sdata->dev->name : "<nodev>")
|
||||
__string(vif_name, sdata->name)
|
||||
#define VIF_ASSIGN __entry->vif_type = sdata->vif.type; __entry->sdata = sdata; \
|
||||
__entry->p2p = sdata->vif.p2p; \
|
||||
__assign_str(vif_name, sdata->dev ? sdata->dev->name : sdata->name)
|
||||
__assign_str(vif_name, sdata->name)
|
||||
#define VIF_PR_FMT " vif:%s(%d%s)"
|
||||
#define VIF_PR_ARG __get_str(vif_name), __entry->vif_type, __entry->p2p ? "/p2p" : ""
|
||||
|
||||
|
|
|
@ -129,9 +129,12 @@ ieee80211_vht_cap_ie_to_sta_vht_cap(struct ieee80211_sub_if_data *sdata,
|
|||
if (!vht_cap_ie || !sband->vht_cap.vht_supported)
|
||||
return;
|
||||
|
||||
/* A VHT STA must support 40 MHz */
|
||||
if (!(sta->sta.ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40))
|
||||
return;
|
||||
/*
|
||||
* A VHT STA must support 40 MHz, but if we verify that here
|
||||
* then we break a few things - some APs (e.g. Netgear R6300v2
|
||||
* and others based on the BCM4360 chipset) will unset this
|
||||
* capability bit when operating in 20 MHz.
|
||||
*/
|
||||
|
||||
vht_cap->vht_supported = true;
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue