Commit bd2a8130 authored by John W. Linville's avatar John W. Linville
parents 6fe7cc71 43c771a1
...@@ -2594,6 +2594,9 @@ static void ieee80211_mgmt_frame_register(struct wiphy *wiphy, ...@@ -2594,6 +2594,9 @@ static void ieee80211_mgmt_frame_register(struct wiphy *wiphy,
else else
local->probe_req_reg--; local->probe_req_reg--;
if (!local->open_count)
break;
ieee80211_queue_work(&local->hw, &local->reconfig_filter); ieee80211_queue_work(&local->hw, &local->reconfig_filter);
break; break;
default: default:
......
...@@ -1314,6 +1314,8 @@ netdev_tx_t ieee80211_monitor_start_xmit(struct sk_buff *skb, ...@@ -1314,6 +1314,8 @@ netdev_tx_t ieee80211_monitor_start_xmit(struct sk_buff *skb,
struct net_device *dev); struct net_device *dev);
netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb, netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb,
struct net_device *dev); struct net_device *dev);
void ieee80211_purge_tx_queue(struct ieee80211_hw *hw,
struct sk_buff_head *skbs);
/* HT */ /* HT */
void ieee80211_apply_htcap_overrides(struct ieee80211_sub_if_data *sdata, void ieee80211_apply_htcap_overrides(struct ieee80211_sub_if_data *sdata,
......
...@@ -871,8 +871,10 @@ int ieee80211_register_hw(struct ieee80211_hw *hw) ...@@ -871,8 +871,10 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
local->hw.wiphy->cipher_suites, local->hw.wiphy->cipher_suites,
sizeof(u32) * local->hw.wiphy->n_cipher_suites, sizeof(u32) * local->hw.wiphy->n_cipher_suites,
GFP_KERNEL); GFP_KERNEL);
if (!suites) if (!suites) {
return -ENOMEM; result = -ENOMEM;
goto fail_wiphy_register;
}
for (r = 0; r < local->hw.wiphy->n_cipher_suites; r++) { for (r = 0; r < local->hw.wiphy->n_cipher_suites; r++) {
u32 suite = local->hw.wiphy->cipher_suites[r]; u32 suite = local->hw.wiphy->cipher_suites[r];
if (suite == WLAN_CIPHER_SUITE_WEP40 || if (suite == WLAN_CIPHER_SUITE_WEP40 ||
......
...@@ -917,7 +917,7 @@ int ieee80211_request_sched_scan_start(struct ieee80211_sub_if_data *sdata, ...@@ -917,7 +917,7 @@ int ieee80211_request_sched_scan_start(struct ieee80211_sub_if_data *sdata,
struct cfg80211_sched_scan_request *req) struct cfg80211_sched_scan_request *req)
{ {
struct ieee80211_local *local = sdata->local; struct ieee80211_local *local = sdata->local;
struct ieee80211_sched_scan_ies sched_scan_ies; struct ieee80211_sched_scan_ies sched_scan_ies = {};
int ret, i; int ret, i;
mutex_lock(&local->mtx); mutex_lock(&local->mtx);
......
...@@ -117,8 +117,8 @@ static void free_sta_work(struct work_struct *wk) ...@@ -117,8 +117,8 @@ static void free_sta_work(struct work_struct *wk)
for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) { for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) {
local->total_ps_buffered -= skb_queue_len(&sta->ps_tx_buf[ac]); local->total_ps_buffered -= skb_queue_len(&sta->ps_tx_buf[ac]);
__skb_queue_purge(&sta->ps_tx_buf[ac]); ieee80211_purge_tx_queue(&local->hw, &sta->ps_tx_buf[ac]);
__skb_queue_purge(&sta->tx_filtered[ac]); ieee80211_purge_tx_queue(&local->hw, &sta->tx_filtered[ac]);
} }
#ifdef CONFIG_MAC80211_MESH #ifdef CONFIG_MAC80211_MESH
...@@ -141,7 +141,7 @@ static void free_sta_work(struct work_struct *wk) ...@@ -141,7 +141,7 @@ static void free_sta_work(struct work_struct *wk)
tid_tx = rcu_dereference_raw(sta->ampdu_mlme.tid_tx[i]); tid_tx = rcu_dereference_raw(sta->ampdu_mlme.tid_tx[i]);
if (!tid_tx) if (!tid_tx)
continue; continue;
__skb_queue_purge(&tid_tx->pending); ieee80211_purge_tx_queue(&local->hw, &tid_tx->pending);
kfree(tid_tx); kfree(tid_tx);
} }
...@@ -961,6 +961,7 @@ void ieee80211_sta_ps_deliver_wakeup(struct sta_info *sta) ...@@ -961,6 +961,7 @@ void ieee80211_sta_ps_deliver_wakeup(struct sta_info *sta)
struct ieee80211_local *local = sdata->local; struct ieee80211_local *local = sdata->local;
struct sk_buff_head pending; struct sk_buff_head pending;
int filtered = 0, buffered = 0, ac; int filtered = 0, buffered = 0, ac;
unsigned long flags;
clear_sta_flag(sta, WLAN_STA_SP); clear_sta_flag(sta, WLAN_STA_SP);
...@@ -976,12 +977,16 @@ void ieee80211_sta_ps_deliver_wakeup(struct sta_info *sta) ...@@ -976,12 +977,16 @@ void ieee80211_sta_ps_deliver_wakeup(struct sta_info *sta)
for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) { for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) {
int count = skb_queue_len(&pending), tmp; int count = skb_queue_len(&pending), tmp;
spin_lock_irqsave(&sta->tx_filtered[ac].lock, flags);
skb_queue_splice_tail_init(&sta->tx_filtered[ac], &pending); skb_queue_splice_tail_init(&sta->tx_filtered[ac], &pending);
spin_unlock_irqrestore(&sta->tx_filtered[ac].lock, flags);
tmp = skb_queue_len(&pending); tmp = skb_queue_len(&pending);
filtered += tmp - count; filtered += tmp - count;
count = tmp; count = tmp;
spin_lock_irqsave(&sta->ps_tx_buf[ac].lock, flags);
skb_queue_splice_tail_init(&sta->ps_tx_buf[ac], &pending); skb_queue_splice_tail_init(&sta->ps_tx_buf[ac], &pending);
spin_unlock_irqrestore(&sta->ps_tx_buf[ac].lock, flags);
tmp = skb_queue_len(&pending); tmp = skb_queue_len(&pending);
buffered += tmp - count; buffered += tmp - count;
} }
......
...@@ -668,3 +668,12 @@ void ieee80211_free_txskb(struct ieee80211_hw *hw, struct sk_buff *skb) ...@@ -668,3 +668,12 @@ void ieee80211_free_txskb(struct ieee80211_hw *hw, struct sk_buff *skb)
dev_kfree_skb_any(skb); dev_kfree_skb_any(skb);
} }
EXPORT_SYMBOL(ieee80211_free_txskb); EXPORT_SYMBOL(ieee80211_free_txskb);
void ieee80211_purge_tx_queue(struct ieee80211_hw *hw,
struct sk_buff_head *skbs)
{
struct sk_buff *skb;
while ((skb = __skb_dequeue(skbs)))
ieee80211_free_txskb(hw, skb);
}
...@@ -1358,7 +1358,7 @@ static int invoke_tx_handlers(struct ieee80211_tx_data *tx) ...@@ -1358,7 +1358,7 @@ static int invoke_tx_handlers(struct ieee80211_tx_data *tx)
if (tx->skb) if (tx->skb)
ieee80211_free_txskb(&tx->local->hw, tx->skb); ieee80211_free_txskb(&tx->local->hw, tx->skb);
else else
__skb_queue_purge(&tx->skbs); ieee80211_purge_tx_queue(&tx->local->hw, &tx->skbs);
return -1; return -1;
} else if (unlikely(res == TX_QUEUED)) { } else if (unlikely(res == TX_QUEUED)) {
I802_DEBUG_INC(tx->local->tx_handlers_queued); I802_DEBUG_INC(tx->local->tx_handlers_queued);
...@@ -2120,10 +2120,13 @@ netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb, ...@@ -2120,10 +2120,13 @@ netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb,
*/ */
void ieee80211_clear_tx_pending(struct ieee80211_local *local) void ieee80211_clear_tx_pending(struct ieee80211_local *local)
{ {
struct sk_buff *skb;
int i; int i;
for (i = 0; i < local->hw.queues; i++) for (i = 0; i < local->hw.queues; i++) {
skb_queue_purge(&local->pending[i]); while ((skb = skb_dequeue(&local->pending[i])) != NULL)
ieee80211_free_txskb(&local->hw, skb);
}
} }
/* /*
......
...@@ -1491,6 +1491,8 @@ int ieee80211_reconfig(struct ieee80211_local *local) ...@@ -1491,6 +1491,8 @@ int ieee80211_reconfig(struct ieee80211_local *local)
list_for_each_entry(sdata, &local->interfaces, list) { list_for_each_entry(sdata, &local->interfaces, list) {
if (sdata->vif.type != NL80211_IFTYPE_STATION) if (sdata->vif.type != NL80211_IFTYPE_STATION)
continue; continue;
if (!sdata->u.mgd.associated)
continue;
ieee80211_send_nullfunc(local, sdata, 0); ieee80211_send_nullfunc(local, sdata, 0);
} }
......
...@@ -141,9 +141,8 @@ static const struct ieee80211_regdomain world_regdom = { ...@@ -141,9 +141,8 @@ static const struct ieee80211_regdomain world_regdom = {
.reg_rules = { .reg_rules = {
/* IEEE 802.11b/g, channels 1..11 */ /* IEEE 802.11b/g, channels 1..11 */
REG_RULE(2412-10, 2462+10, 40, 6, 20, 0), REG_RULE(2412-10, 2462+10, 40, 6, 20, 0),
/* IEEE 802.11b/g, channels 12..13. No HT40 /* IEEE 802.11b/g, channels 12..13. */
* channel fits here. */ REG_RULE(2467-10, 2472+10, 40, 6, 20,
REG_RULE(2467-10, 2472+10, 20, 6, 20,
NL80211_RRF_PASSIVE_SCAN | NL80211_RRF_PASSIVE_SCAN |
NL80211_RRF_NO_IBSS), NL80211_RRF_NO_IBSS),
/* IEEE 802.11 channel 14 - Only JP enables /* IEEE 802.11 channel 14 - Only JP enables
......
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