Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless
This commit is contained in:
commit
03c4444650
|
@ -95,8 +95,10 @@ static void ath9k_htc_vif_iter(void *data, u8 *mac, struct ieee80211_vif *vif)
|
||||||
|
|
||||||
if ((vif->type == NL80211_IFTYPE_AP ||
|
if ((vif->type == NL80211_IFTYPE_AP ||
|
||||||
vif->type == NL80211_IFTYPE_MESH_POINT) &&
|
vif->type == NL80211_IFTYPE_MESH_POINT) &&
|
||||||
bss_conf->enable_beacon)
|
bss_conf->enable_beacon) {
|
||||||
priv->reconfig_beacon = true;
|
priv->reconfig_beacon = true;
|
||||||
|
priv->rearm_ani = true;
|
||||||
|
}
|
||||||
|
|
||||||
if (bss_conf->assoc) {
|
if (bss_conf->assoc) {
|
||||||
priv->rearm_ani = true;
|
priv->rearm_ani = true;
|
||||||
|
@ -257,6 +259,7 @@ static int ath9k_htc_set_channel(struct ath9k_htc_priv *priv,
|
||||||
|
|
||||||
ath9k_htc_ps_wakeup(priv);
|
ath9k_htc_ps_wakeup(priv);
|
||||||
|
|
||||||
|
ath9k_htc_stop_ani(priv);
|
||||||
del_timer_sync(&priv->tx.cleanup_timer);
|
del_timer_sync(&priv->tx.cleanup_timer);
|
||||||
ath9k_htc_tx_drain(priv);
|
ath9k_htc_tx_drain(priv);
|
||||||
|
|
||||||
|
|
|
@ -3911,6 +3911,8 @@ enum nl80211_ap_sme_features {
|
||||||
* @NL80211_FEATURE_CELL_BASE_REG_HINTS: This driver has been tested
|
* @NL80211_FEATURE_CELL_BASE_REG_HINTS: This driver has been tested
|
||||||
* to work properly to suppport receiving regulatory hints from
|
* to work properly to suppport receiving regulatory hints from
|
||||||
* cellular base stations.
|
* cellular base stations.
|
||||||
|
* @NL80211_FEATURE_P2P_DEVICE_NEEDS_CHANNEL: (no longer available, only
|
||||||
|
* here to reserve the value for API/ABI compatibility)
|
||||||
* @NL80211_FEATURE_SAE: This driver supports simultaneous authentication of
|
* @NL80211_FEATURE_SAE: This driver supports simultaneous authentication of
|
||||||
* equals (SAE) with user space SME (NL80211_CMD_AUTHENTICATE) in station
|
* equals (SAE) with user space SME (NL80211_CMD_AUTHENTICATE) in station
|
||||||
* mode
|
* mode
|
||||||
|
@ -3955,7 +3957,7 @@ enum nl80211_feature_flags {
|
||||||
NL80211_FEATURE_HT_IBSS = 1 << 1,
|
NL80211_FEATURE_HT_IBSS = 1 << 1,
|
||||||
NL80211_FEATURE_INACTIVITY_TIMER = 1 << 2,
|
NL80211_FEATURE_INACTIVITY_TIMER = 1 << 2,
|
||||||
NL80211_FEATURE_CELL_BASE_REG_HINTS = 1 << 3,
|
NL80211_FEATURE_CELL_BASE_REG_HINTS = 1 << 3,
|
||||||
/* bit 4 is reserved - don't use */
|
NL80211_FEATURE_P2P_DEVICE_NEEDS_CHANNEL = 1 << 4,
|
||||||
NL80211_FEATURE_SAE = 1 << 5,
|
NL80211_FEATURE_SAE = 1 << 5,
|
||||||
NL80211_FEATURE_LOW_PRIORITY_SCAN = 1 << 6,
|
NL80211_FEATURE_LOW_PRIORITY_SCAN = 1 << 6,
|
||||||
NL80211_FEATURE_SCAN_FLUSH = 1 << 7,
|
NL80211_FEATURE_SCAN_FLUSH = 1 << 7,
|
||||||
|
|
|
@ -7519,9 +7519,9 @@ int __init l2cap_init(void)
|
||||||
l2cap_debugfs = debugfs_create_file("l2cap", 0444, bt_debugfs,
|
l2cap_debugfs = debugfs_create_file("l2cap", 0444, bt_debugfs,
|
||||||
NULL, &l2cap_debugfs_fops);
|
NULL, &l2cap_debugfs_fops);
|
||||||
|
|
||||||
debugfs_create_u16("l2cap_le_max_credits", 0466, bt_debugfs,
|
debugfs_create_u16("l2cap_le_max_credits", 0644, bt_debugfs,
|
||||||
&le_max_credits);
|
&le_max_credits);
|
||||||
debugfs_create_u16("l2cap_le_default_mps", 0466, bt_debugfs,
|
debugfs_create_u16("l2cap_le_default_mps", 0644, bt_debugfs,
|
||||||
&le_default_mps);
|
&le_default_mps);
|
||||||
|
|
||||||
bt_6lowpan_init();
|
bt_6lowpan_init();
|
||||||
|
|
|
@ -317,6 +317,7 @@ struct ieee80211_roc_work {
|
||||||
|
|
||||||
bool started, abort, hw_begun, notified;
|
bool started, abort, hw_begun, notified;
|
||||||
bool to_be_freed;
|
bool to_be_freed;
|
||||||
|
bool on_channel;
|
||||||
|
|
||||||
unsigned long hw_start_time;
|
unsigned long hw_start_time;
|
||||||
|
|
||||||
|
|
|
@ -3626,18 +3626,24 @@ void ieee80211_mgd_quiesce(struct ieee80211_sub_if_data *sdata)
|
||||||
|
|
||||||
sdata_lock(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
|
* If we are trying to authenticate / associate while suspending,
|
||||||
* won't know and won't actually abort those attempts, thus we
|
* cfg80211 won't know and won't actually abort those attempts,
|
||||||
* need to do that ourselves.
|
* thus we need to do that ourselves.
|
||||||
*/
|
*/
|
||||||
ieee80211_send_deauth_disassoc(sdata,
|
ieee80211_send_deauth_disassoc(sdata, bssid,
|
||||||
ifmgd->auth_data->bss->bssid,
|
|
||||||
IEEE80211_STYPE_DEAUTH,
|
IEEE80211_STYPE_DEAUTH,
|
||||||
WLAN_REASON_DEAUTH_LEAVING,
|
WLAN_REASON_DEAUTH_LEAVING,
|
||||||
false, frame_buf);
|
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,
|
cfg80211_tx_mlme_mgmt(sdata->dev, frame_buf,
|
||||||
IEEE80211_DEAUTH_FRAME_LEN);
|
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);
|
container_of(work, struct ieee80211_roc_work, work.work);
|
||||||
struct ieee80211_sub_if_data *sdata = roc->sdata;
|
struct ieee80211_sub_if_data *sdata = roc->sdata;
|
||||||
struct ieee80211_local *local = sdata->local;
|
struct ieee80211_local *local = sdata->local;
|
||||||
bool started;
|
bool started, on_channel;
|
||||||
|
|
||||||
mutex_lock(&local->mtx);
|
mutex_lock(&local->mtx);
|
||||||
|
|
||||||
|
@ -354,14 +354,26 @@ void ieee80211_sw_roc_work(struct work_struct *work)
|
||||||
if (!roc->started) {
|
if (!roc->started) {
|
||||||
struct ieee80211_roc_work *dep;
|
struct ieee80211_roc_work *dep;
|
||||||
|
|
||||||
/* start this ROC */
|
WARN_ON(local->use_chanctx);
|
||||||
ieee80211_offchannel_stop_vifs(local);
|
|
||||||
|
|
||||||
/* 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);
|
ieee80211_recalc_idle(local);
|
||||||
|
|
||||||
local->tmp_channel = roc->chan;
|
if (!roc->on_channel) {
|
||||||
ieee80211_hw_config(local, 0);
|
ieee80211_offchannel_stop_vifs(local);
|
||||||
|
|
||||||
|
local->tmp_channel = roc->chan;
|
||||||
|
ieee80211_hw_config(local, 0);
|
||||||
|
}
|
||||||
|
|
||||||
/* tell userspace or send frame */
|
/* tell userspace or send frame */
|
||||||
ieee80211_handle_roc_started(roc);
|
ieee80211_handle_roc_started(roc);
|
||||||
|
@ -380,9 +392,10 @@ void ieee80211_sw_roc_work(struct work_struct *work)
|
||||||
finish:
|
finish:
|
||||||
list_del(&roc->list);
|
list_del(&roc->list);
|
||||||
started = roc->started;
|
started = roc->started;
|
||||||
|
on_channel = roc->on_channel;
|
||||||
ieee80211_roc_notify_destroy(roc, !roc->abort);
|
ieee80211_roc_notify_destroy(roc, !roc->abort);
|
||||||
|
|
||||||
if (started) {
|
if (started && !on_channel) {
|
||||||
ieee80211_flush_queues(local, NULL);
|
ieee80211_flush_queues(local, NULL);
|
||||||
|
|
||||||
local->tmp_channel = NULL;
|
local->tmp_channel = NULL;
|
||||||
|
|
Loading…
Reference in a new issue