diff options
| -rw-r--r-- | drivers/net/wireless/iwlwifi/dvm/mac80211.c | 2 | ||||
| -rw-r--r-- | drivers/net/wireless/iwlwifi/dvm/main.c | 2 | ||||
| -rw-r--r-- | drivers/net/wireless/iwlwifi/pcie/rx.c | 23 | ||||
| -rw-r--r-- | net/mac80211/cfg.c | 3 | ||||
| -rw-r--r-- | net/mac80211/ieee80211_i.h | 2 | ||||
| -rw-r--r-- | net/mac80211/main.c | 6 | ||||
| -rw-r--r-- | net/mac80211/scan.c | 2 | ||||
| -rw-r--r-- | net/mac80211/sta_info.c | 11 | ||||
| -rw-r--r-- | net/mac80211/status.c | 9 | ||||
| -rw-r--r-- | net/mac80211/tx.c | 9 | ||||
| -rw-r--r-- | net/mac80211/util.c | 2 | ||||
| -rw-r--r-- | net/wireless/reg.c | 5 |
12 files changed, 60 insertions, 16 deletions
diff --git a/drivers/net/wireless/iwlwifi/dvm/mac80211.c b/drivers/net/wireless/iwlwifi/dvm/mac80211.c index ff8162d4c454..fa4d1b8cd9f6 100644 --- a/drivers/net/wireless/iwlwifi/dvm/mac80211.c +++ b/drivers/net/wireless/iwlwifi/dvm/mac80211.c | |||
| @@ -521,7 +521,7 @@ static void iwlagn_mac_tx(struct ieee80211_hw *hw, | |||
| 521 | ieee80211_get_tx_rate(hw, IEEE80211_SKB_CB(skb))->bitrate); | 521 | ieee80211_get_tx_rate(hw, IEEE80211_SKB_CB(skb))->bitrate); |
| 522 | 522 | ||
| 523 | if (iwlagn_tx_skb(priv, control->sta, skb)) | 523 | if (iwlagn_tx_skb(priv, control->sta, skb)) |
| 524 | dev_kfree_skb_any(skb); | 524 | ieee80211_free_txskb(hw, skb); |
| 525 | } | 525 | } |
| 526 | 526 | ||
| 527 | static void iwlagn_mac_update_tkip_key(struct ieee80211_hw *hw, | 527 | static void iwlagn_mac_update_tkip_key(struct ieee80211_hw *hw, |
diff --git a/drivers/net/wireless/iwlwifi/dvm/main.c b/drivers/net/wireless/iwlwifi/dvm/main.c index 7ff3f1430678..408132cf83c1 100644 --- a/drivers/net/wireless/iwlwifi/dvm/main.c +++ b/drivers/net/wireless/iwlwifi/dvm/main.c | |||
| @@ -2114,7 +2114,7 @@ static void iwl_free_skb(struct iwl_op_mode *op_mode, struct sk_buff *skb) | |||
| 2114 | 2114 | ||
| 2115 | info = IEEE80211_SKB_CB(skb); | 2115 | info = IEEE80211_SKB_CB(skb); |
| 2116 | iwl_trans_free_tx_cmd(priv->trans, info->driver_data[1]); | 2116 | iwl_trans_free_tx_cmd(priv->trans, info->driver_data[1]); |
| 2117 | dev_kfree_skb_any(skb); | 2117 | ieee80211_free_txskb(priv->hw, skb); |
| 2118 | } | 2118 | } |
| 2119 | 2119 | ||
| 2120 | static void iwl_set_hw_rfkill_state(struct iwl_op_mode *op_mode, bool state) | 2120 | static void iwl_set_hw_rfkill_state(struct iwl_op_mode *op_mode, bool state) |
diff --git a/drivers/net/wireless/iwlwifi/pcie/rx.c b/drivers/net/wireless/iwlwifi/pcie/rx.c index 17c8e5d82681..bb69f8f90b3b 100644 --- a/drivers/net/wireless/iwlwifi/pcie/rx.c +++ b/drivers/net/wireless/iwlwifi/pcie/rx.c | |||
| @@ -321,6 +321,14 @@ static void iwl_rx_allocate(struct iwl_trans *trans, gfp_t priority) | |||
| 321 | dma_map_page(trans->dev, page, 0, | 321 | dma_map_page(trans->dev, page, 0, |
| 322 | PAGE_SIZE << trans_pcie->rx_page_order, | 322 | PAGE_SIZE << trans_pcie->rx_page_order, |
| 323 | DMA_FROM_DEVICE); | 323 | DMA_FROM_DEVICE); |
| 324 | if (dma_mapping_error(trans->dev, rxb->page_dma)) { | ||
| 325 | rxb->page = NULL; | ||
| 326 | spin_lock_irqsave(&rxq->lock, flags); | ||
| 327 | list_add(&rxb->list, &rxq->rx_used); | ||
| 328 | spin_unlock_irqrestore(&rxq->lock, flags); | ||
| 329 | __free_pages(page, trans_pcie->rx_page_order); | ||
| 330 | return; | ||
| 331 | } | ||
| 324 | /* dma address must be no more than 36 bits */ | 332 | /* dma address must be no more than 36 bits */ |
| 325 | BUG_ON(rxb->page_dma & ~DMA_BIT_MASK(36)); | 333 | BUG_ON(rxb->page_dma & ~DMA_BIT_MASK(36)); |
| 326 | /* and also 256 byte aligned! */ | 334 | /* and also 256 byte aligned! */ |
| @@ -488,8 +496,19 @@ static void iwl_rx_handle_rxbuf(struct iwl_trans *trans, | |||
| 488 | dma_map_page(trans->dev, rxb->page, 0, | 496 | dma_map_page(trans->dev, rxb->page, 0, |
| 489 | PAGE_SIZE << trans_pcie->rx_page_order, | 497 | PAGE_SIZE << trans_pcie->rx_page_order, |
| 490 | DMA_FROM_DEVICE); | 498 | DMA_FROM_DEVICE); |
| 491 | list_add_tail(&rxb->list, &rxq->rx_free); | 499 | if (dma_mapping_error(trans->dev, rxb->page_dma)) { |
| 492 | rxq->free_count++; | 500 | /* |
| 501 | * free the page(s) as well to not break | ||
| 502 | * the invariant that the items on the used | ||
| 503 | * list have no page(s) | ||
| 504 | */ | ||
| 505 | __free_pages(rxb->page, trans_pcie->rx_page_order); | ||
| 506 | rxb->page = NULL; | ||
| 507 | list_add_tail(&rxb->list, &rxq->rx_used); | ||
| 508 | } else { | ||
| 509 | list_add_tail(&rxb->list, &rxq->rx_free); | ||
| 510 | rxq->free_count++; | ||
| 511 | } | ||
| 493 | } else | 512 | } else |
| 494 | list_add_tail(&rxb->list, &rxq->rx_used); | 513 | list_add_tail(&rxb->list, &rxq->rx_used); |
| 495 | spin_unlock_irqrestore(&rxq->lock, flags); | 514 | spin_unlock_irqrestore(&rxq->lock, flags); |
diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c index 05f3a313db88..7371f676cf41 100644 --- a/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c | |||
| @@ -2594,6 +2594,9 @@ static void ieee80211_mgmt_frame_register(struct wiphy *wiphy, | |||
| 2594 | else | 2594 | else |
| 2595 | local->probe_req_reg--; | 2595 | local->probe_req_reg--; |
| 2596 | 2596 | ||
| 2597 | if (!local->open_count) | ||
| 2598 | break; | ||
| 2599 | |||
| 2597 | ieee80211_queue_work(&local->hw, &local->reconfig_filter); | 2600 | ieee80211_queue_work(&local->hw, &local->reconfig_filter); |
| 2598 | break; | 2601 | break; |
| 2599 | default: | 2602 | default: |
diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h index 8c804550465b..156e5835e37f 100644 --- a/net/mac80211/ieee80211_i.h +++ b/net/mac80211/ieee80211_i.h | |||
| @@ -1314,6 +1314,8 @@ netdev_tx_t ieee80211_monitor_start_xmit(struct sk_buff *skb, | |||
| 1314 | struct net_device *dev); | 1314 | struct net_device *dev); |
| 1315 | netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb, | 1315 | netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb, |
| 1316 | struct net_device *dev); | 1316 | struct net_device *dev); |
| 1317 | void ieee80211_purge_tx_queue(struct ieee80211_hw *hw, | ||
| 1318 | struct sk_buff_head *skbs); | ||
| 1317 | 1319 | ||
| 1318 | /* HT */ | 1320 | /* HT */ |
| 1319 | void ieee80211_apply_htcap_overrides(struct ieee80211_sub_if_data *sdata, | 1321 | void ieee80211_apply_htcap_overrides(struct ieee80211_sub_if_data *sdata, |
diff --git a/net/mac80211/main.c b/net/mac80211/main.c index c80c4490351c..f57f597972f8 100644 --- a/net/mac80211/main.c +++ b/net/mac80211/main.c | |||
| @@ -871,8 +871,10 @@ int ieee80211_register_hw(struct ieee80211_hw *hw) | |||
| 871 | local->hw.wiphy->cipher_suites, | 871 | local->hw.wiphy->cipher_suites, |
| 872 | sizeof(u32) * local->hw.wiphy->n_cipher_suites, | 872 | sizeof(u32) * local->hw.wiphy->n_cipher_suites, |
| 873 | GFP_KERNEL); | 873 | GFP_KERNEL); |
| 874 | if (!suites) | 874 | if (!suites) { |
| 875 | return -ENOMEM; | 875 | result = -ENOMEM; |
| 876 | goto fail_wiphy_register; | ||
| 877 | } | ||
| 876 | for (r = 0; r < local->hw.wiphy->n_cipher_suites; r++) { | 878 | for (r = 0; r < local->hw.wiphy->n_cipher_suites; r++) { |
| 877 | u32 suite = local->hw.wiphy->cipher_suites[r]; | 879 | u32 suite = local->hw.wiphy->cipher_suites[r]; |
| 878 | if (suite == WLAN_CIPHER_SUITE_WEP40 || | 880 | if (suite == WLAN_CIPHER_SUITE_WEP40 || |
diff --git a/net/mac80211/scan.c b/net/mac80211/scan.c index c4cdbde24fd3..43e60b5a7546 100644 --- a/net/mac80211/scan.c +++ b/net/mac80211/scan.c | |||
| @@ -917,7 +917,7 @@ int ieee80211_request_sched_scan_start(struct ieee80211_sub_if_data *sdata, | |||
| 917 | struct cfg80211_sched_scan_request *req) | 917 | struct cfg80211_sched_scan_request *req) |
| 918 | { | 918 | { |
| 919 | struct ieee80211_local *local = sdata->local; | 919 | struct ieee80211_local *local = sdata->local; |
| 920 | struct ieee80211_sched_scan_ies sched_scan_ies; | 920 | struct ieee80211_sched_scan_ies sched_scan_ies = {}; |
| 921 | int ret, i; | 921 | int ret, i; |
| 922 | 922 | ||
| 923 | mutex_lock(&local->mtx); | 923 | mutex_lock(&local->mtx); |
diff --git a/net/mac80211/sta_info.c b/net/mac80211/sta_info.c index 0a4e4c04db89..d2eb64e12353 100644 --- a/net/mac80211/sta_info.c +++ b/net/mac80211/sta_info.c | |||
| @@ -117,8 +117,8 @@ static void free_sta_work(struct work_struct *wk) | |||
| 117 | 117 | ||
| 118 | for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) { | 118 | for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) { |
| 119 | local->total_ps_buffered -= skb_queue_len(&sta->ps_tx_buf[ac]); | 119 | local->total_ps_buffered -= skb_queue_len(&sta->ps_tx_buf[ac]); |
| 120 | __skb_queue_purge(&sta->ps_tx_buf[ac]); | 120 | ieee80211_purge_tx_queue(&local->hw, &sta->ps_tx_buf[ac]); |
| 121 | __skb_queue_purge(&sta->tx_filtered[ac]); | 121 | ieee80211_purge_tx_queue(&local->hw, &sta->tx_filtered[ac]); |
| 122 | } | 122 | } |
| 123 | 123 | ||
| 124 | #ifdef CONFIG_MAC80211_MESH | 124 | #ifdef CONFIG_MAC80211_MESH |
| @@ -141,7 +141,7 @@ static void free_sta_work(struct work_struct *wk) | |||
| 141 | tid_tx = rcu_dereference_raw(sta->ampdu_mlme.tid_tx[i]); | 141 | tid_tx = rcu_dereference_raw(sta->ampdu_mlme.tid_tx[i]); |
| 142 | if (!tid_tx) | 142 | if (!tid_tx) |
| 143 | continue; | 143 | continue; |
| 144 | __skb_queue_purge(&tid_tx->pending); | 144 | ieee80211_purge_tx_queue(&local->hw, &tid_tx->pending); |
| 145 | kfree(tid_tx); | 145 | kfree(tid_tx); |
| 146 | } | 146 | } |
| 147 | 147 | ||
| @@ -961,6 +961,7 @@ void ieee80211_sta_ps_deliver_wakeup(struct sta_info *sta) | |||
| 961 | struct ieee80211_local *local = sdata->local; | 961 | struct ieee80211_local *local = sdata->local; |
| 962 | struct sk_buff_head pending; | 962 | struct sk_buff_head pending; |
| 963 | int filtered = 0, buffered = 0, ac; | 963 | int filtered = 0, buffered = 0, ac; |
| 964 | unsigned long flags; | ||
| 964 | 965 | ||
| 965 | clear_sta_flag(sta, WLAN_STA_SP); | 966 | clear_sta_flag(sta, WLAN_STA_SP); |
| 966 | 967 | ||
| @@ -976,12 +977,16 @@ void ieee80211_sta_ps_deliver_wakeup(struct sta_info *sta) | |||
| 976 | for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) { | 977 | for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) { |
| 977 | int count = skb_queue_len(&pending), tmp; | 978 | int count = skb_queue_len(&pending), tmp; |
| 978 | 979 | ||
| 980 | spin_lock_irqsave(&sta->tx_filtered[ac].lock, flags); | ||
| 979 | skb_queue_splice_tail_init(&sta->tx_filtered[ac], &pending); | 981 | skb_queue_splice_tail_init(&sta->tx_filtered[ac], &pending); |
| 982 | spin_unlock_irqrestore(&sta->tx_filtered[ac].lock, flags); | ||
| 980 | tmp = skb_queue_len(&pending); | 983 | tmp = skb_queue_len(&pending); |
| 981 | filtered += tmp - count; | 984 | filtered += tmp - count; |
| 982 | count = tmp; | 985 | count = tmp; |
| 983 | 986 | ||
| 987 | spin_lock_irqsave(&sta->ps_tx_buf[ac].lock, flags); | ||
| 984 | skb_queue_splice_tail_init(&sta->ps_tx_buf[ac], &pending); | 988 | skb_queue_splice_tail_init(&sta->ps_tx_buf[ac], &pending); |
| 989 | spin_unlock_irqrestore(&sta->ps_tx_buf[ac].lock, flags); | ||
| 985 | tmp = skb_queue_len(&pending); | 990 | tmp = skb_queue_len(&pending); |
| 986 | buffered += tmp - count; | 991 | buffered += tmp - count; |
| 987 | } | 992 | } |
diff --git a/net/mac80211/status.c b/net/mac80211/status.c index 3af0cc4130f1..101eb88a2b78 100644 --- a/net/mac80211/status.c +++ b/net/mac80211/status.c | |||
| @@ -668,3 +668,12 @@ void ieee80211_free_txskb(struct ieee80211_hw *hw, struct sk_buff *skb) | |||
| 668 | dev_kfree_skb_any(skb); | 668 | dev_kfree_skb_any(skb); |
| 669 | } | 669 | } |
| 670 | EXPORT_SYMBOL(ieee80211_free_txskb); | 670 | EXPORT_SYMBOL(ieee80211_free_txskb); |
| 671 | |||
| 672 | void ieee80211_purge_tx_queue(struct ieee80211_hw *hw, | ||
| 673 | struct sk_buff_head *skbs) | ||
| 674 | { | ||
| 675 | struct sk_buff *skb; | ||
| 676 | |||
| 677 | while ((skb = __skb_dequeue(skbs))) | ||
| 678 | ieee80211_free_txskb(hw, skb); | ||
| 679 | } | ||
diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c index c9bf83f36657..b858ebe41fda 100644 --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c | |||
| @@ -1358,7 +1358,7 @@ static int invoke_tx_handlers(struct ieee80211_tx_data *tx) | |||
| 1358 | if (tx->skb) | 1358 | if (tx->skb) |
| 1359 | ieee80211_free_txskb(&tx->local->hw, tx->skb); | 1359 | ieee80211_free_txskb(&tx->local->hw, tx->skb); |
| 1360 | else | 1360 | else |
| 1361 | __skb_queue_purge(&tx->skbs); | 1361 | ieee80211_purge_tx_queue(&tx->local->hw, &tx->skbs); |
| 1362 | return -1; | 1362 | return -1; |
| 1363 | } else if (unlikely(res == TX_QUEUED)) { | 1363 | } else if (unlikely(res == TX_QUEUED)) { |
| 1364 | I802_DEBUG_INC(tx->local->tx_handlers_queued); | 1364 | I802_DEBUG_INC(tx->local->tx_handlers_queued); |
| @@ -2120,10 +2120,13 @@ netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb, | |||
| 2120 | */ | 2120 | */ |
| 2121 | void ieee80211_clear_tx_pending(struct ieee80211_local *local) | 2121 | void ieee80211_clear_tx_pending(struct ieee80211_local *local) |
| 2122 | { | 2122 | { |
| 2123 | struct sk_buff *skb; | ||
| 2123 | int i; | 2124 | int i; |
| 2124 | 2125 | ||
| 2125 | for (i = 0; i < local->hw.queues; i++) | 2126 | for (i = 0; i < local->hw.queues; i++) { |
| 2126 | skb_queue_purge(&local->pending[i]); | 2127 | while ((skb = skb_dequeue(&local->pending[i])) != NULL) |
| 2128 | ieee80211_free_txskb(&local->hw, skb); | ||
| 2129 | } | ||
| 2127 | } | 2130 | } |
| 2128 | 2131 | ||
| 2129 | /* | 2132 | /* |
diff --git a/net/mac80211/util.c b/net/mac80211/util.c index 239391807ca9..0151ae33c4cd 100644 --- a/net/mac80211/util.c +++ b/net/mac80211/util.c | |||
| @@ -1491,6 +1491,8 @@ int ieee80211_reconfig(struct ieee80211_local *local) | |||
| 1491 | list_for_each_entry(sdata, &local->interfaces, list) { | 1491 | list_for_each_entry(sdata, &local->interfaces, list) { |
| 1492 | if (sdata->vif.type != NL80211_IFTYPE_STATION) | 1492 | if (sdata->vif.type != NL80211_IFTYPE_STATION) |
| 1493 | continue; | 1493 | continue; |
| 1494 | if (!sdata->u.mgd.associated) | ||
| 1495 | continue; | ||
| 1494 | 1496 | ||
| 1495 | ieee80211_send_nullfunc(local, sdata, 0); | 1497 | ieee80211_send_nullfunc(local, sdata, 0); |
| 1496 | } | 1498 | } |
diff --git a/net/wireless/reg.c b/net/wireless/reg.c index bcc7d7ee5a51..b75756b05af7 100644 --- a/net/wireless/reg.c +++ b/net/wireless/reg.c | |||
| @@ -141,9 +141,8 @@ static const struct ieee80211_regdomain world_regdom = { | |||
| 141 | .reg_rules = { | 141 | .reg_rules = { |
| 142 | /* IEEE 802.11b/g, channels 1..11 */ | 142 | /* IEEE 802.11b/g, channels 1..11 */ |
| 143 | REG_RULE(2412-10, 2462+10, 40, 6, 20, 0), | 143 | REG_RULE(2412-10, 2462+10, 40, 6, 20, 0), |
| 144 | /* IEEE 802.11b/g, channels 12..13. No HT40 | 144 | /* IEEE 802.11b/g, channels 12..13. */ |
| 145 | * channel fits here. */ | 145 | REG_RULE(2467-10, 2472+10, 40, 6, 20, |
| 146 | REG_RULE(2467-10, 2472+10, 20, 6, 20, | ||
| 147 | NL80211_RRF_PASSIVE_SCAN | | 146 | NL80211_RRF_PASSIVE_SCAN | |
| 148 | NL80211_RRF_NO_IBSS), | 147 | NL80211_RRF_NO_IBSS), |
| 149 | /* IEEE 802.11 channel 14 - Only JP enables | 148 | /* IEEE 802.11 channel 14 - Only JP enables |
