diff options
| -rw-r--r-- | MAINTAINERS | 7 | ||||
| -rw-r--r-- | drivers/net/wireless/ath/ath5k/dma.c | 4 | ||||
| -rw-r--r-- | drivers/net/wireless/ath/ath5k/pcu.c | 4 | ||||
| -rw-r--r-- | drivers/net/wireless/ath/ath9k/ar9002_hw.c | 3 | ||||
| -rw-r--r-- | drivers/net/wireless/ath/ath9k/ath9k.h | 2 | ||||
| -rw-r--r-- | drivers/net/wireless/ath/ath9k/htc_drv_init.c | 3 | ||||
| -rw-r--r-- | drivers/net/wireless/ath/ath9k/htc_drv_main.c | 21 | ||||
| -rw-r--r-- | drivers/net/wireless/ath/ath9k/init.c | 7 | ||||
| -rw-r--r-- | drivers/net/wireless/ath/ath9k/main.c | 21 | ||||
| -rw-r--r-- | drivers/net/wireless/ath/ath9k/xmit.c | 7 | ||||
| -rw-r--r-- | drivers/net/wireless/ath/carl9170/rx.c | 2 | ||||
| -rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-6000.c | 2 | ||||
| -rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-agn.c | 6 | ||||
| -rw-r--r-- | drivers/net/wireless/rt2x00/rt73usb.c | 1 | ||||
| -rw-r--r-- | drivers/net/wireless/rtlwifi/efuse.c | 40 | ||||
| -rw-r--r-- | drivers/net/wireless/wl1251/main.c | 3 | ||||
| -rw-r--r-- | drivers/net/wireless/wl12xx/spi.c | 3 | ||||
| -rw-r--r-- | drivers/ssb/pcmcia.c | 2 | ||||
| -rw-r--r-- | net/mac80211/cfg.c | 2 | ||||
| -rw-r--r-- | net/mac80211/ieee80211_i.h | 2 | ||||
| -rw-r--r-- | net/mac80211/status.c | 7 | ||||
| -rw-r--r-- | net/mac80211/tx.c | 5 |
22 files changed, 95 insertions, 59 deletions
diff --git a/MAINTAINERS b/MAINTAINERS index 23d04363a195..a5deb42c1b6c 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
| @@ -3209,7 +3209,6 @@ F: drivers/net/wimax/i2400m/ | |||
| 3209 | F: include/linux/wimax/i2400m.h | 3209 | F: include/linux/wimax/i2400m.h |
| 3210 | 3210 | ||
| 3211 | INTEL WIRELESS WIFI LINK (iwlwifi) | 3211 | INTEL WIRELESS WIFI LINK (iwlwifi) |
| 3212 | M: Reinette Chatre <reinette.chatre@intel.com> | ||
| 3213 | M: Wey-Yi Guy <wey-yi.w.guy@intel.com> | 3212 | M: Wey-Yi Guy <wey-yi.w.guy@intel.com> |
| 3214 | M: Intel Linux Wireless <ilw@linux.intel.com> | 3213 | M: Intel Linux Wireless <ilw@linux.intel.com> |
| 3215 | L: linux-wireless@vger.kernel.org | 3214 | L: linux-wireless@vger.kernel.org |
| @@ -6613,12 +6612,12 @@ S: Maintained | |||
| 6613 | F: drivers/net/wireless/wl1251/* | 6612 | F: drivers/net/wireless/wl1251/* |
| 6614 | 6613 | ||
| 6615 | WL1271 WIRELESS DRIVER | 6614 | WL1271 WIRELESS DRIVER |
| 6616 | M: Luciano Coelho <luciano.coelho@nokia.com> | 6615 | M: Luciano Coelho <coelho@ti.com> |
| 6617 | L: linux-wireless@vger.kernel.org | 6616 | L: linux-wireless@vger.kernel.org |
| 6618 | W: http://wireless.kernel.org | 6617 | W: http://wireless.kernel.org/en/users/Drivers/wl12xx |
| 6619 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/luca/wl12xx.git | 6618 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/luca/wl12xx.git |
| 6620 | S: Maintained | 6619 | S: Maintained |
| 6621 | F: drivers/net/wireless/wl12xx/wl1271* | 6620 | F: drivers/net/wireless/wl12xx/ |
| 6622 | F: include/linux/wl12xx.h | 6621 | F: include/linux/wl12xx.h |
| 6623 | 6622 | ||
| 6624 | WL3501 WIRELESS PCMCIA CARD DRIVER | 6623 | WL3501 WIRELESS PCMCIA CARD DRIVER |
diff --git a/drivers/net/wireless/ath/ath5k/dma.c b/drivers/net/wireless/ath/ath5k/dma.c index 0064be7ce5c9..21091c26a9a5 100644 --- a/drivers/net/wireless/ath/ath5k/dma.c +++ b/drivers/net/wireless/ath/ath5k/dma.c | |||
| @@ -838,9 +838,9 @@ int ath5k_hw_dma_stop(struct ath5k_hw *ah) | |||
| 838 | for (i = 0; i < qmax; i++) { | 838 | for (i = 0; i < qmax; i++) { |
| 839 | err = ath5k_hw_stop_tx_dma(ah, i); | 839 | err = ath5k_hw_stop_tx_dma(ah, i); |
| 840 | /* -EINVAL -> queue inactive */ | 840 | /* -EINVAL -> queue inactive */ |
| 841 | if (err != -EINVAL) | 841 | if (err && err != -EINVAL) |
| 842 | return err; | 842 | return err; |
| 843 | } | 843 | } |
| 844 | 844 | ||
| 845 | return err; | 845 | return 0; |
| 846 | } | 846 | } |
diff --git a/drivers/net/wireless/ath/ath5k/pcu.c b/drivers/net/wireless/ath/ath5k/pcu.c index e5f2b96a4c63..a702817daf72 100644 --- a/drivers/net/wireless/ath/ath5k/pcu.c +++ b/drivers/net/wireless/ath/ath5k/pcu.c | |||
| @@ -86,7 +86,7 @@ int ath5k_hw_get_frame_duration(struct ath5k_hw *ah, | |||
| 86 | if (!ah->ah_bwmode) { | 86 | if (!ah->ah_bwmode) { |
| 87 | dur = ieee80211_generic_frame_duration(sc->hw, | 87 | dur = ieee80211_generic_frame_duration(sc->hw, |
| 88 | NULL, len, rate); | 88 | NULL, len, rate); |
| 89 | return dur; | 89 | return le16_to_cpu(dur); |
| 90 | } | 90 | } |
| 91 | 91 | ||
| 92 | bitrate = rate->bitrate; | 92 | bitrate = rate->bitrate; |
| @@ -265,8 +265,6 @@ static inline void ath5k_hw_write_rate_duration(struct ath5k_hw *ah) | |||
| 265 | * what rate we should choose to TX ACKs. */ | 265 | * what rate we should choose to TX ACKs. */ |
| 266 | tx_time = ath5k_hw_get_frame_duration(ah, 10, rate); | 266 | tx_time = ath5k_hw_get_frame_duration(ah, 10, rate); |
| 267 | 267 | ||
| 268 | tx_time = le16_to_cpu(tx_time); | ||
| 269 | |||
| 270 | ath5k_hw_reg_write(ah, tx_time, reg); | 268 | ath5k_hw_reg_write(ah, tx_time, reg); |
| 271 | 269 | ||
| 272 | if (!(rate->flags & IEEE80211_RATE_SHORT_PREAMBLE)) | 270 | if (!(rate->flags & IEEE80211_RATE_SHORT_PREAMBLE)) |
diff --git a/drivers/net/wireless/ath/ath9k/ar9002_hw.c b/drivers/net/wireless/ath/ath9k/ar9002_hw.c index f8a7771faee2..f44c84ab5dce 100644 --- a/drivers/net/wireless/ath/ath9k/ar9002_hw.c +++ b/drivers/net/wireless/ath/ath9k/ar9002_hw.c | |||
| @@ -426,9 +426,8 @@ static void ar9002_hw_configpcipowersave(struct ath_hw *ah, | |||
| 426 | } | 426 | } |
| 427 | 427 | ||
| 428 | /* WAR for ASPM system hang */ | 428 | /* WAR for ASPM system hang */ |
| 429 | if (AR_SREV_9280(ah) || AR_SREV_9285(ah) || AR_SREV_9287(ah)) { | 429 | if (AR_SREV_9285(ah) || AR_SREV_9287(ah)) |
| 430 | val |= (AR_WA_BIT6 | AR_WA_BIT7); | 430 | val |= (AR_WA_BIT6 | AR_WA_BIT7); |
| 431 | } | ||
| 432 | 431 | ||
| 433 | if (AR_SREV_9285E_20(ah)) | 432 | if (AR_SREV_9285E_20(ah)) |
| 434 | val |= AR_WA_BIT23; | 433 | val |= AR_WA_BIT23; |
diff --git a/drivers/net/wireless/ath/ath9k/ath9k.h b/drivers/net/wireless/ath/ath9k/ath9k.h index 3681caf54282..23838e37d45f 100644 --- a/drivers/net/wireless/ath/ath9k/ath9k.h +++ b/drivers/net/wireless/ath/ath9k/ath9k.h | |||
| @@ -218,6 +218,7 @@ struct ath_frame_info { | |||
| 218 | struct ath_buf_state { | 218 | struct ath_buf_state { |
| 219 | u8 bf_type; | 219 | u8 bf_type; |
| 220 | u8 bfs_paprd; | 220 | u8 bfs_paprd; |
| 221 | unsigned long bfs_paprd_timestamp; | ||
| 221 | enum ath9k_internal_frame_type bfs_ftype; | 222 | enum ath9k_internal_frame_type bfs_ftype; |
| 222 | }; | 223 | }; |
| 223 | 224 | ||
| @@ -593,7 +594,6 @@ struct ath_softc { | |||
| 593 | struct work_struct paprd_work; | 594 | struct work_struct paprd_work; |
| 594 | struct work_struct hw_check_work; | 595 | struct work_struct hw_check_work; |
| 595 | struct completion paprd_complete; | 596 | struct completion paprd_complete; |
| 596 | bool paprd_pending; | ||
| 597 | 597 | ||
| 598 | u32 intrstatus; | 598 | u32 intrstatus; |
| 599 | u32 sc_flags; /* SC_OP_* */ | 599 | u32 sc_flags; /* SC_OP_* */ |
diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_init.c b/drivers/net/wireless/ath/ath9k/htc_drv_init.c index 38433f9bfe59..0352f0994caa 100644 --- a/drivers/net/wireless/ath/ath9k/htc_drv_init.c +++ b/drivers/net/wireless/ath/ath9k/htc_drv_init.c | |||
| @@ -142,9 +142,6 @@ static void ath9k_deinit_priv(struct ath9k_htc_priv *priv) | |||
| 142 | { | 142 | { |
| 143 | ath9k_htc_exit_debug(priv->ah); | 143 | ath9k_htc_exit_debug(priv->ah); |
| 144 | ath9k_hw_deinit(priv->ah); | 144 | ath9k_hw_deinit(priv->ah); |
| 145 | tasklet_kill(&priv->swba_tasklet); | ||
| 146 | tasklet_kill(&priv->rx_tasklet); | ||
| 147 | tasklet_kill(&priv->tx_tasklet); | ||
| 148 | kfree(priv->ah); | 145 | kfree(priv->ah); |
| 149 | priv->ah = NULL; | 146 | priv->ah = NULL; |
| 150 | } | 147 | } |
diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_main.c b/drivers/net/wireless/ath/ath9k/htc_drv_main.c index f4d576bc3ccd..6bb59958f71e 100644 --- a/drivers/net/wireless/ath/ath9k/htc_drv_main.c +++ b/drivers/net/wireless/ath/ath9k/htc_drv_main.c | |||
| @@ -1025,12 +1025,6 @@ static void ath9k_htc_stop(struct ieee80211_hw *hw) | |||
| 1025 | int ret = 0; | 1025 | int ret = 0; |
| 1026 | u8 cmd_rsp; | 1026 | u8 cmd_rsp; |
| 1027 | 1027 | ||
| 1028 | /* Cancel all the running timers/work .. */ | ||
| 1029 | cancel_work_sync(&priv->fatal_work); | ||
| 1030 | cancel_work_sync(&priv->ps_work); | ||
| 1031 | cancel_delayed_work_sync(&priv->ath9k_led_blink_work); | ||
| 1032 | ath9k_led_stop_brightness(priv); | ||
| 1033 | |||
| 1034 | mutex_lock(&priv->mutex); | 1028 | mutex_lock(&priv->mutex); |
| 1035 | 1029 | ||
| 1036 | if (priv->op_flags & OP_INVALID) { | 1030 | if (priv->op_flags & OP_INVALID) { |
| @@ -1044,8 +1038,23 @@ static void ath9k_htc_stop(struct ieee80211_hw *hw) | |||
| 1044 | WMI_CMD(WMI_DISABLE_INTR_CMDID); | 1038 | WMI_CMD(WMI_DISABLE_INTR_CMDID); |
| 1045 | WMI_CMD(WMI_DRAIN_TXQ_ALL_CMDID); | 1039 | WMI_CMD(WMI_DRAIN_TXQ_ALL_CMDID); |
| 1046 | WMI_CMD(WMI_STOP_RECV_CMDID); | 1040 | WMI_CMD(WMI_STOP_RECV_CMDID); |
| 1041 | |||
| 1042 | tasklet_kill(&priv->swba_tasklet); | ||
| 1043 | tasklet_kill(&priv->rx_tasklet); | ||
| 1044 | tasklet_kill(&priv->tx_tasklet); | ||
| 1045 | |||
| 1047 | skb_queue_purge(&priv->tx_queue); | 1046 | skb_queue_purge(&priv->tx_queue); |
| 1048 | 1047 | ||
| 1048 | mutex_unlock(&priv->mutex); | ||
| 1049 | |||
| 1050 | /* Cancel all the running timers/work .. */ | ||
| 1051 | cancel_work_sync(&priv->fatal_work); | ||
| 1052 | cancel_work_sync(&priv->ps_work); | ||
| 1053 | cancel_delayed_work_sync(&priv->ath9k_led_blink_work); | ||
| 1054 | ath9k_led_stop_brightness(priv); | ||
| 1055 | |||
| 1056 | mutex_lock(&priv->mutex); | ||
| 1057 | |||
| 1049 | /* Remove monitor interface here */ | 1058 | /* Remove monitor interface here */ |
| 1050 | if (ah->opmode == NL80211_IFTYPE_MONITOR) { | 1059 | if (ah->opmode == NL80211_IFTYPE_MONITOR) { |
| 1051 | if (ath9k_htc_remove_monitor_interface(priv)) | 1060 | if (ath9k_htc_remove_monitor_interface(priv)) |
diff --git a/drivers/net/wireless/ath/ath9k/init.c b/drivers/net/wireless/ath/ath9k/init.c index 767d8b86f1e1..087a6a95edd5 100644 --- a/drivers/net/wireless/ath/ath9k/init.c +++ b/drivers/net/wireless/ath/ath9k/init.c | |||
| @@ -598,8 +598,6 @@ err_btcoex: | |||
| 598 | err_queues: | 598 | err_queues: |
| 599 | ath9k_hw_deinit(ah); | 599 | ath9k_hw_deinit(ah); |
| 600 | err_hw: | 600 | err_hw: |
| 601 | tasklet_kill(&sc->intr_tq); | ||
| 602 | tasklet_kill(&sc->bcon_tasklet); | ||
| 603 | 601 | ||
| 604 | kfree(ah); | 602 | kfree(ah); |
| 605 | sc->sc_ah = NULL; | 603 | sc->sc_ah = NULL; |
| @@ -807,9 +805,6 @@ static void ath9k_deinit_softc(struct ath_softc *sc) | |||
| 807 | 805 | ||
| 808 | ath9k_hw_deinit(sc->sc_ah); | 806 | ath9k_hw_deinit(sc->sc_ah); |
| 809 | 807 | ||
| 810 | tasklet_kill(&sc->intr_tq); | ||
| 811 | tasklet_kill(&sc->bcon_tasklet); | ||
| 812 | |||
| 813 | kfree(sc->sc_ah); | 808 | kfree(sc->sc_ah); |
| 814 | sc->sc_ah = NULL; | 809 | sc->sc_ah = NULL; |
| 815 | } | 810 | } |
| @@ -824,6 +819,8 @@ void ath9k_deinit_device(struct ath_softc *sc) | |||
| 824 | wiphy_rfkill_stop_polling(sc->hw->wiphy); | 819 | wiphy_rfkill_stop_polling(sc->hw->wiphy); |
| 825 | ath_deinit_leds(sc); | 820 | ath_deinit_leds(sc); |
| 826 | 821 | ||
| 822 | ath9k_ps_restore(sc); | ||
| 823 | |||
| 827 | for (i = 0; i < sc->num_sec_wiphy; i++) { | 824 | for (i = 0; i < sc->num_sec_wiphy; i++) { |
| 828 | struct ath_wiphy *aphy = sc->sec_wiphy[i]; | 825 | struct ath_wiphy *aphy = sc->sec_wiphy[i]; |
| 829 | if (aphy == NULL) | 826 | if (aphy == NULL) |
diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c index c79c97be6cd4..da5c64597c1f 100644 --- a/drivers/net/wireless/ath/ath9k/main.c +++ b/drivers/net/wireless/ath/ath9k/main.c | |||
| @@ -325,6 +325,8 @@ static bool ath_paprd_send_frame(struct ath_softc *sc, struct sk_buff *skb, int | |||
| 325 | { | 325 | { |
| 326 | struct ieee80211_hw *hw = sc->hw; | 326 | struct ieee80211_hw *hw = sc->hw; |
| 327 | struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb); | 327 | struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb); |
| 328 | struct ath_hw *ah = sc->sc_ah; | ||
| 329 | struct ath_common *common = ath9k_hw_common(ah); | ||
| 328 | struct ath_tx_control txctl; | 330 | struct ath_tx_control txctl; |
| 329 | int time_left; | 331 | int time_left; |
| 330 | 332 | ||
| @@ -340,14 +342,16 @@ static bool ath_paprd_send_frame(struct ath_softc *sc, struct sk_buff *skb, int | |||
| 340 | tx_info->control.rates[1].idx = -1; | 342 | tx_info->control.rates[1].idx = -1; |
| 341 | 343 | ||
| 342 | init_completion(&sc->paprd_complete); | 344 | init_completion(&sc->paprd_complete); |
| 343 | sc->paprd_pending = true; | ||
| 344 | txctl.paprd = BIT(chain); | 345 | txctl.paprd = BIT(chain); |
| 345 | if (ath_tx_start(hw, skb, &txctl) != 0) | 346 | |
| 347 | if (ath_tx_start(hw, skb, &txctl) != 0) { | ||
| 348 | ath_dbg(common, ATH_DBG_XMIT, "PAPRD TX failed\n"); | ||
| 349 | dev_kfree_skb_any(skb); | ||
| 346 | return false; | 350 | return false; |
| 351 | } | ||
| 347 | 352 | ||
| 348 | time_left = wait_for_completion_timeout(&sc->paprd_complete, | 353 | time_left = wait_for_completion_timeout(&sc->paprd_complete, |
| 349 | msecs_to_jiffies(ATH_PAPRD_TIMEOUT)); | 354 | msecs_to_jiffies(ATH_PAPRD_TIMEOUT)); |
| 350 | sc->paprd_pending = false; | ||
| 351 | 355 | ||
| 352 | if (!time_left) | 356 | if (!time_left) |
| 353 | ath_dbg(ath9k_hw_common(sc->sc_ah), ATH_DBG_CALIBRATE, | 357 | ath_dbg(ath9k_hw_common(sc->sc_ah), ATH_DBG_CALIBRATE, |
| @@ -953,8 +957,6 @@ void ath_radio_disable(struct ath_softc *sc, struct ieee80211_hw *hw) | |||
| 953 | 957 | ||
| 954 | spin_unlock_bh(&sc->sc_pcu_lock); | 958 | spin_unlock_bh(&sc->sc_pcu_lock); |
| 955 | ath9k_ps_restore(sc); | 959 | ath9k_ps_restore(sc); |
| 956 | |||
| 957 | ath9k_setpower(sc, ATH9K_PM_FULL_SLEEP); | ||
| 958 | } | 960 | } |
| 959 | 961 | ||
| 960 | int ath_reset(struct ath_softc *sc, bool retry_tx) | 962 | int ath_reset(struct ath_softc *sc, bool retry_tx) |
| @@ -1309,6 +1311,9 @@ static void ath9k_stop(struct ieee80211_hw *hw) | |||
| 1309 | 1311 | ||
| 1310 | spin_lock_bh(&sc->sc_pcu_lock); | 1312 | spin_lock_bh(&sc->sc_pcu_lock); |
| 1311 | 1313 | ||
| 1314 | /* prevent tasklets to enable interrupts once we disable them */ | ||
| 1315 | ah->imask &= ~ATH9K_INT_GLOBAL; | ||
| 1316 | |||
| 1312 | /* make sure h/w will not generate any interrupt | 1317 | /* make sure h/w will not generate any interrupt |
| 1313 | * before setting the invalid flag. */ | 1318 | * before setting the invalid flag. */ |
| 1314 | ath9k_hw_disable_interrupts(ah); | 1319 | ath9k_hw_disable_interrupts(ah); |
| @@ -1326,6 +1331,12 @@ static void ath9k_stop(struct ieee80211_hw *hw) | |||
| 1326 | 1331 | ||
| 1327 | spin_unlock_bh(&sc->sc_pcu_lock); | 1332 | spin_unlock_bh(&sc->sc_pcu_lock); |
| 1328 | 1333 | ||
| 1334 | /* we can now sync irq and kill any running tasklets, since we already | ||
| 1335 | * disabled interrupts and not holding a spin lock */ | ||
| 1336 | synchronize_irq(sc->irq); | ||
| 1337 | tasklet_kill(&sc->intr_tq); | ||
| 1338 | tasklet_kill(&sc->bcon_tasklet); | ||
| 1339 | |||
| 1329 | ath9k_ps_restore(sc); | 1340 | ath9k_ps_restore(sc); |
| 1330 | 1341 | ||
| 1331 | sc->ps_idle = true; | 1342 | sc->ps_idle = true; |
diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c index 33a37edbaf79..07b7804aec5b 100644 --- a/drivers/net/wireless/ath/ath9k/xmit.c +++ b/drivers/net/wireless/ath/ath9k/xmit.c | |||
| @@ -1725,6 +1725,9 @@ static void ath_tx_start_dma(struct ath_softc *sc, struct ath_buf *bf, | |||
| 1725 | ar9003_hw_set_paprd_txdesc(sc->sc_ah, bf->bf_desc, | 1725 | ar9003_hw_set_paprd_txdesc(sc->sc_ah, bf->bf_desc, |
| 1726 | bf->bf_state.bfs_paprd); | 1726 | bf->bf_state.bfs_paprd); |
| 1727 | 1727 | ||
| 1728 | if (txctl->paprd) | ||
| 1729 | bf->bf_state.bfs_paprd_timestamp = jiffies; | ||
| 1730 | |||
| 1728 | ath_tx_send_normal(sc, txctl->txq, tid, &bf_head); | 1731 | ath_tx_send_normal(sc, txctl->txq, tid, &bf_head); |
| 1729 | } | 1732 | } |
| 1730 | 1733 | ||
| @@ -1886,7 +1889,9 @@ static void ath_tx_complete_buf(struct ath_softc *sc, struct ath_buf *bf, | |||
| 1886 | bf->bf_buf_addr = 0; | 1889 | bf->bf_buf_addr = 0; |
| 1887 | 1890 | ||
| 1888 | if (bf->bf_state.bfs_paprd) { | 1891 | if (bf->bf_state.bfs_paprd) { |
| 1889 | if (!sc->paprd_pending) | 1892 | if (time_after(jiffies, |
| 1893 | bf->bf_state.bfs_paprd_timestamp + | ||
| 1894 | msecs_to_jiffies(ATH_PAPRD_TIMEOUT))) | ||
| 1890 | dev_kfree_skb_any(skb); | 1895 | dev_kfree_skb_any(skb); |
| 1891 | else | 1896 | else |
| 1892 | complete(&sc->paprd_complete); | 1897 | complete(&sc->paprd_complete); |
diff --git a/drivers/net/wireless/ath/carl9170/rx.c b/drivers/net/wireless/ath/carl9170/rx.c index 939a0e96ed1f..84866a4b8350 100644 --- a/drivers/net/wireless/ath/carl9170/rx.c +++ b/drivers/net/wireless/ath/carl9170/rx.c | |||
| @@ -564,7 +564,7 @@ static void carl9170_ps_beacon(struct ar9170 *ar, void *data, unsigned int len) | |||
| 564 | cam = ieee80211_check_tim(tim_ie, tim_len, ar->common.curaid); | 564 | cam = ieee80211_check_tim(tim_ie, tim_len, ar->common.curaid); |
| 565 | 565 | ||
| 566 | /* 2. Maybe the AP wants to send multicast/broadcast data? */ | 566 | /* 2. Maybe the AP wants to send multicast/broadcast data? */ |
| 567 | cam = !!(tim_ie->bitmap_ctrl & 0x01); | 567 | cam |= !!(tim_ie->bitmap_ctrl & 0x01); |
| 568 | 568 | ||
| 569 | if (!cam) { | 569 | if (!cam) { |
| 570 | /* back to low-power land. */ | 570 | /* back to low-power land. */ |
diff --git a/drivers/net/wireless/iwlwifi/iwl-6000.c b/drivers/net/wireless/iwlwifi/iwl-6000.c index af505bcd7ae0..ef36aff1bb43 100644 --- a/drivers/net/wireless/iwlwifi/iwl-6000.c +++ b/drivers/net/wireless/iwlwifi/iwl-6000.c | |||
| @@ -681,6 +681,8 @@ struct iwl_cfg iwl6000i_2bg_cfg = { | |||
| 681 | .fw_name_pre = IWL6050_FW_PRE, \ | 681 | .fw_name_pre = IWL6050_FW_PRE, \ |
| 682 | .ucode_api_max = IWL6050_UCODE_API_MAX, \ | 682 | .ucode_api_max = IWL6050_UCODE_API_MAX, \ |
| 683 | .ucode_api_min = IWL6050_UCODE_API_MIN, \ | 683 | .ucode_api_min = IWL6050_UCODE_API_MIN, \ |
| 684 | .valid_tx_ant = ANT_AB, /* .cfg overwrite */ \ | ||
| 685 | .valid_rx_ant = ANT_AB, /* .cfg overwrite */ \ | ||
| 684 | .ops = &iwl6050_ops, \ | 686 | .ops = &iwl6050_ops, \ |
| 685 | .eeprom_ver = EEPROM_6050_EEPROM_VERSION, \ | 687 | .eeprom_ver = EEPROM_6050_EEPROM_VERSION, \ |
| 686 | .eeprom_calib_ver = EEPROM_6050_TX_POWER_VERSION, \ | 688 | .eeprom_calib_ver = EEPROM_6050_TX_POWER_VERSION, \ |
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c index f13a83a7e62b..a236b8b14da1 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn.c | |||
| @@ -1157,6 +1157,9 @@ static void iwl_irq_tasklet_legacy(struct iwl_priv *priv) | |||
| 1157 | /* only Re-enable if diabled by irq */ | 1157 | /* only Re-enable if diabled by irq */ |
| 1158 | if (test_bit(STATUS_INT_ENABLED, &priv->status)) | 1158 | if (test_bit(STATUS_INT_ENABLED, &priv->status)) |
| 1159 | iwl_enable_interrupts(priv); | 1159 | iwl_enable_interrupts(priv); |
| 1160 | /* Re-enable RF_KILL if it occurred */ | ||
| 1161 | else if (handled & CSR_INT_BIT_RF_KILL) | ||
| 1162 | iwl_enable_rfkill_int(priv); | ||
| 1160 | 1163 | ||
| 1161 | #ifdef CONFIG_IWLWIFI_DEBUG | 1164 | #ifdef CONFIG_IWLWIFI_DEBUG |
| 1162 | if (iwl_get_debug_level(priv) & (IWL_DL_ISR)) { | 1165 | if (iwl_get_debug_level(priv) & (IWL_DL_ISR)) { |
| @@ -1371,6 +1374,9 @@ static void iwl_irq_tasklet(struct iwl_priv *priv) | |||
| 1371 | /* only Re-enable if diabled by irq */ | 1374 | /* only Re-enable if diabled by irq */ |
| 1372 | if (test_bit(STATUS_INT_ENABLED, &priv->status)) | 1375 | if (test_bit(STATUS_INT_ENABLED, &priv->status)) |
| 1373 | iwl_enable_interrupts(priv); | 1376 | iwl_enable_interrupts(priv); |
| 1377 | /* Re-enable RF_KILL if it occurred */ | ||
| 1378 | else if (handled & CSR_INT_BIT_RF_KILL) | ||
| 1379 | iwl_enable_rfkill_int(priv); | ||
| 1374 | } | 1380 | } |
| 1375 | 1381 | ||
| 1376 | /* the threshold ratio of actual_ack_cnt to expected_ack_cnt in percent */ | 1382 | /* the threshold ratio of actual_ack_cnt to expected_ack_cnt in percent */ |
diff --git a/drivers/net/wireless/rt2x00/rt73usb.c b/drivers/net/wireless/rt2x00/rt73usb.c index 0b4e8590cbb7..029be3c6c030 100644 --- a/drivers/net/wireless/rt2x00/rt73usb.c +++ b/drivers/net/wireless/rt2x00/rt73usb.c | |||
| @@ -2446,6 +2446,7 @@ static struct usb_device_id rt73usb_device_table[] = { | |||
| 2446 | { USB_DEVICE(0x04bb, 0x093d), USB_DEVICE_DATA(&rt73usb_ops) }, | 2446 | { USB_DEVICE(0x04bb, 0x093d), USB_DEVICE_DATA(&rt73usb_ops) }, |
| 2447 | { USB_DEVICE(0x148f, 0x2573), USB_DEVICE_DATA(&rt73usb_ops) }, | 2447 | { USB_DEVICE(0x148f, 0x2573), USB_DEVICE_DATA(&rt73usb_ops) }, |
| 2448 | { USB_DEVICE(0x148f, 0x2671), USB_DEVICE_DATA(&rt73usb_ops) }, | 2448 | { USB_DEVICE(0x148f, 0x2671), USB_DEVICE_DATA(&rt73usb_ops) }, |
| 2449 | { USB_DEVICE(0x0812, 0x3101), USB_DEVICE_DATA(&rt73usb_ops) }, | ||
| 2449 | /* Qcom */ | 2450 | /* Qcom */ |
| 2450 | { USB_DEVICE(0x18e8, 0x6196), USB_DEVICE_DATA(&rt73usb_ops) }, | 2451 | { USB_DEVICE(0x18e8, 0x6196), USB_DEVICE_DATA(&rt73usb_ops) }, |
| 2451 | { USB_DEVICE(0x18e8, 0x6229), USB_DEVICE_DATA(&rt73usb_ops) }, | 2452 | { USB_DEVICE(0x18e8, 0x6229), USB_DEVICE_DATA(&rt73usb_ops) }, |
diff --git a/drivers/net/wireless/rtlwifi/efuse.c b/drivers/net/wireless/rtlwifi/efuse.c index b8433f3a9bc2..62876cd5c41a 100644 --- a/drivers/net/wireless/rtlwifi/efuse.c +++ b/drivers/net/wireless/rtlwifi/efuse.c | |||
| @@ -726,9 +726,9 @@ static int efuse_pg_packet_read(struct ieee80211_hw *hw, u8 offset, u8 *data) | |||
| 726 | } | 726 | } |
| 727 | 727 | ||
| 728 | static void efuse_write_data_case1(struct ieee80211_hw *hw, u16 *efuse_addr, | 728 | static void efuse_write_data_case1(struct ieee80211_hw *hw, u16 *efuse_addr, |
| 729 | u8 efuse_data, u8 offset, int *bcontinual, | 729 | u8 efuse_data, u8 offset, int *bcontinual, |
| 730 | u8 *write_state, struct pgpkt_struct target_pkt, | 730 | u8 *write_state, struct pgpkt_struct *target_pkt, |
| 731 | int *repeat_times, int *bresult, u8 word_en) | 731 | int *repeat_times, int *bresult, u8 word_en) |
| 732 | { | 732 | { |
| 733 | struct rtl_priv *rtlpriv = rtl_priv(hw); | 733 | struct rtl_priv *rtlpriv = rtl_priv(hw); |
| 734 | struct pgpkt_struct tmp_pkt; | 734 | struct pgpkt_struct tmp_pkt; |
| @@ -744,8 +744,8 @@ static void efuse_write_data_case1(struct ieee80211_hw *hw, u16 *efuse_addr, | |||
| 744 | tmp_pkt.word_en = tmp_header & 0x0F; | 744 | tmp_pkt.word_en = tmp_header & 0x0F; |
| 745 | tmp_word_cnts = efuse_calculate_word_cnts(tmp_pkt.word_en); | 745 | tmp_word_cnts = efuse_calculate_word_cnts(tmp_pkt.word_en); |
| 746 | 746 | ||
| 747 | if (tmp_pkt.offset != target_pkt.offset) { | 747 | if (tmp_pkt.offset != target_pkt->offset) { |
| 748 | efuse_addr = efuse_addr + (tmp_word_cnts * 2) + 1; | 748 | *efuse_addr = *efuse_addr + (tmp_word_cnts * 2) + 1; |
| 749 | *write_state = PG_STATE_HEADER; | 749 | *write_state = PG_STATE_HEADER; |
| 750 | } else { | 750 | } else { |
| 751 | for (tmpindex = 0; tmpindex < (tmp_word_cnts * 2); tmpindex++) { | 751 | for (tmpindex = 0; tmpindex < (tmp_word_cnts * 2); tmpindex++) { |
| @@ -756,23 +756,23 @@ static void efuse_write_data_case1(struct ieee80211_hw *hw, u16 *efuse_addr, | |||
| 756 | } | 756 | } |
| 757 | 757 | ||
| 758 | if (bdataempty == false) { | 758 | if (bdataempty == false) { |
| 759 | efuse_addr = efuse_addr + (tmp_word_cnts * 2) + 1; | 759 | *efuse_addr = *efuse_addr + (tmp_word_cnts * 2) + 1; |
| 760 | *write_state = PG_STATE_HEADER; | 760 | *write_state = PG_STATE_HEADER; |
| 761 | } else { | 761 | } else { |
| 762 | match_word_en = 0x0F; | 762 | match_word_en = 0x0F; |
| 763 | if (!((target_pkt.word_en & BIT(0)) | | 763 | if (!((target_pkt->word_en & BIT(0)) | |
| 764 | (tmp_pkt.word_en & BIT(0)))) | 764 | (tmp_pkt.word_en & BIT(0)))) |
| 765 | match_word_en &= (~BIT(0)); | 765 | match_word_en &= (~BIT(0)); |
| 766 | 766 | ||
| 767 | if (!((target_pkt.word_en & BIT(1)) | | 767 | if (!((target_pkt->word_en & BIT(1)) | |
| 768 | (tmp_pkt.word_en & BIT(1)))) | 768 | (tmp_pkt.word_en & BIT(1)))) |
| 769 | match_word_en &= (~BIT(1)); | 769 | match_word_en &= (~BIT(1)); |
| 770 | 770 | ||
| 771 | if (!((target_pkt.word_en & BIT(2)) | | 771 | if (!((target_pkt->word_en & BIT(2)) | |
| 772 | (tmp_pkt.word_en & BIT(2)))) | 772 | (tmp_pkt.word_en & BIT(2)))) |
| 773 | match_word_en &= (~BIT(2)); | 773 | match_word_en &= (~BIT(2)); |
| 774 | 774 | ||
| 775 | if (!((target_pkt.word_en & BIT(3)) | | 775 | if (!((target_pkt->word_en & BIT(3)) | |
| 776 | (tmp_pkt.word_en & BIT(3)))) | 776 | (tmp_pkt.word_en & BIT(3)))) |
| 777 | match_word_en &= (~BIT(3)); | 777 | match_word_en &= (~BIT(3)); |
| 778 | 778 | ||
| @@ -780,7 +780,7 @@ static void efuse_write_data_case1(struct ieee80211_hw *hw, u16 *efuse_addr, | |||
| 780 | badworden = efuse_word_enable_data_write( | 780 | badworden = efuse_word_enable_data_write( |
| 781 | hw, *efuse_addr + 1, | 781 | hw, *efuse_addr + 1, |
| 782 | tmp_pkt.word_en, | 782 | tmp_pkt.word_en, |
| 783 | target_pkt.data); | 783 | target_pkt->data); |
| 784 | 784 | ||
| 785 | if (0x0F != (badworden & 0x0F)) { | 785 | if (0x0F != (badworden & 0x0F)) { |
| 786 | u8 reorg_offset = offset; | 786 | u8 reorg_offset = offset; |
| @@ -791,26 +791,26 @@ static void efuse_write_data_case1(struct ieee80211_hw *hw, u16 *efuse_addr, | |||
| 791 | } | 791 | } |
| 792 | 792 | ||
| 793 | tmp_word_en = 0x0F; | 793 | tmp_word_en = 0x0F; |
| 794 | if ((target_pkt.word_en & BIT(0)) ^ | 794 | if ((target_pkt->word_en & BIT(0)) ^ |
| 795 | (match_word_en & BIT(0))) | 795 | (match_word_en & BIT(0))) |
| 796 | tmp_word_en &= (~BIT(0)); | 796 | tmp_word_en &= (~BIT(0)); |
| 797 | 797 | ||
| 798 | if ((target_pkt.word_en & BIT(1)) ^ | 798 | if ((target_pkt->word_en & BIT(1)) ^ |
| 799 | (match_word_en & BIT(1))) | 799 | (match_word_en & BIT(1))) |
| 800 | tmp_word_en &= (~BIT(1)); | 800 | tmp_word_en &= (~BIT(1)); |
| 801 | 801 | ||
| 802 | if ((target_pkt.word_en & BIT(2)) ^ | 802 | if ((target_pkt->word_en & BIT(2)) ^ |
| 803 | (match_word_en & BIT(2))) | 803 | (match_word_en & BIT(2))) |
| 804 | tmp_word_en &= (~BIT(2)); | 804 | tmp_word_en &= (~BIT(2)); |
| 805 | 805 | ||
| 806 | if ((target_pkt.word_en & BIT(3)) ^ | 806 | if ((target_pkt->word_en & BIT(3)) ^ |
| 807 | (match_word_en & BIT(3))) | 807 | (match_word_en & BIT(3))) |
| 808 | tmp_word_en &= (~BIT(3)); | 808 | tmp_word_en &= (~BIT(3)); |
| 809 | 809 | ||
| 810 | if ((tmp_word_en & 0x0F) != 0x0F) { | 810 | if ((tmp_word_en & 0x0F) != 0x0F) { |
| 811 | *efuse_addr = efuse_get_current_size(hw); | 811 | *efuse_addr = efuse_get_current_size(hw); |
| 812 | target_pkt.offset = offset; | 812 | target_pkt->offset = offset; |
| 813 | target_pkt.word_en = tmp_word_en; | 813 | target_pkt->word_en = tmp_word_en; |
| 814 | } else | 814 | } else |
| 815 | *bcontinual = false; | 815 | *bcontinual = false; |
| 816 | *write_state = PG_STATE_HEADER; | 816 | *write_state = PG_STATE_HEADER; |
| @@ -821,8 +821,8 @@ static void efuse_write_data_case1(struct ieee80211_hw *hw, u16 *efuse_addr, | |||
| 821 | } | 821 | } |
| 822 | } else { | 822 | } else { |
| 823 | *efuse_addr += (2 * tmp_word_cnts) + 1; | 823 | *efuse_addr += (2 * tmp_word_cnts) + 1; |
| 824 | target_pkt.offset = offset; | 824 | target_pkt->offset = offset; |
| 825 | target_pkt.word_en = word_en; | 825 | target_pkt->word_en = word_en; |
| 826 | *write_state = PG_STATE_HEADER; | 826 | *write_state = PG_STATE_HEADER; |
| 827 | } | 827 | } |
| 828 | } | 828 | } |
| @@ -938,7 +938,7 @@ static int efuse_pg_packet_write(struct ieee80211_hw *hw, | |||
| 938 | efuse_write_data_case1(hw, &efuse_addr, | 938 | efuse_write_data_case1(hw, &efuse_addr, |
| 939 | efuse_data, offset, | 939 | efuse_data, offset, |
| 940 | &bcontinual, | 940 | &bcontinual, |
| 941 | &write_state, target_pkt, | 941 | &write_state, &target_pkt, |
| 942 | &repeat_times, &bresult, | 942 | &repeat_times, &bresult, |
| 943 | word_en); | 943 | word_en); |
| 944 | else | 944 | else |
diff --git a/drivers/net/wireless/wl1251/main.c b/drivers/net/wireless/wl1251/main.c index 012e1a4016fe..40372bac9482 100644 --- a/drivers/net/wireless/wl1251/main.c +++ b/drivers/net/wireless/wl1251/main.c | |||
| @@ -1039,6 +1039,9 @@ static void wl1251_op_bss_info_changed(struct ieee80211_hw *hw, | |||
| 1039 | 1039 | ||
| 1040 | if (changed & BSS_CHANGED_BEACON) { | 1040 | if (changed & BSS_CHANGED_BEACON) { |
| 1041 | beacon = ieee80211_beacon_get(hw, vif); | 1041 | beacon = ieee80211_beacon_get(hw, vif); |
| 1042 | if (!beacon) | ||
| 1043 | goto out_sleep; | ||
| 1044 | |||
| 1042 | ret = wl1251_cmd_template_set(wl, CMD_BEACON, beacon->data, | 1045 | ret = wl1251_cmd_template_set(wl, CMD_BEACON, beacon->data, |
| 1043 | beacon->len); | 1046 | beacon->len); |
| 1044 | 1047 | ||
diff --git a/drivers/net/wireless/wl12xx/spi.c b/drivers/net/wireless/wl12xx/spi.c index 46714910f98c..7145ea543783 100644 --- a/drivers/net/wireless/wl12xx/spi.c +++ b/drivers/net/wireless/wl12xx/spi.c | |||
| @@ -110,9 +110,8 @@ static void wl1271_spi_reset(struct wl1271 *wl) | |||
| 110 | spi_message_add_tail(&t, &m); | 110 | spi_message_add_tail(&t, &m); |
| 111 | 111 | ||
| 112 | spi_sync(wl_to_spi(wl), &m); | 112 | spi_sync(wl_to_spi(wl), &m); |
| 113 | kfree(cmd); | ||
| 114 | |||
| 115 | wl1271_dump(DEBUG_SPI, "spi reset -> ", cmd, WSPI_INIT_CMD_LEN); | 113 | wl1271_dump(DEBUG_SPI, "spi reset -> ", cmd, WSPI_INIT_CMD_LEN); |
| 114 | kfree(cmd); | ||
| 116 | } | 115 | } |
| 117 | 116 | ||
| 118 | static void wl1271_spi_init(struct wl1271 *wl) | 117 | static void wl1271_spi_init(struct wl1271 *wl) |
diff --git a/drivers/ssb/pcmcia.c b/drivers/ssb/pcmcia.c index c7345dbf43fa..f8533795ee7f 100644 --- a/drivers/ssb/pcmcia.c +++ b/drivers/ssb/pcmcia.c | |||
| @@ -733,7 +733,7 @@ int ssb_pcmcia_get_invariants(struct ssb_bus *bus, | |||
| 733 | 733 | ||
| 734 | /* Fetch the vendor specific tuples. */ | 734 | /* Fetch the vendor specific tuples. */ |
| 735 | res = pcmcia_loop_tuple(bus->host_pcmcia, SSB_PCMCIA_CIS, | 735 | res = pcmcia_loop_tuple(bus->host_pcmcia, SSB_PCMCIA_CIS, |
| 736 | ssb_pcmcia_do_get_invariants, sprom); | 736 | ssb_pcmcia_do_get_invariants, iv); |
| 737 | if ((res == 0) || (res == -ENOSPC)) | 737 | if ((res == 0) || (res == -ENOSPC)) |
| 738 | return 0; | 738 | return 0; |
| 739 | 739 | ||
diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c index 4bc8a9250cfd..9cd73b11506e 100644 --- a/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c | |||
| @@ -1822,6 +1822,7 @@ static int ieee80211_mgmt_tx(struct wiphy *wiphy, struct net_device *dev, | |||
| 1822 | *cookie ^= 2; | 1822 | *cookie ^= 2; |
| 1823 | IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_CTL_TX_OFFCHAN; | 1823 | IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_CTL_TX_OFFCHAN; |
| 1824 | local->hw_roc_skb = skb; | 1824 | local->hw_roc_skb = skb; |
| 1825 | local->hw_roc_skb_for_status = skb; | ||
| 1825 | mutex_unlock(&local->mtx); | 1826 | mutex_unlock(&local->mtx); |
| 1826 | 1827 | ||
| 1827 | return 0; | 1828 | return 0; |
| @@ -1875,6 +1876,7 @@ static int ieee80211_mgmt_tx_cancel_wait(struct wiphy *wiphy, | |||
| 1875 | if (ret == 0) { | 1876 | if (ret == 0) { |
| 1876 | kfree_skb(local->hw_roc_skb); | 1877 | kfree_skb(local->hw_roc_skb); |
| 1877 | local->hw_roc_skb = NULL; | 1878 | local->hw_roc_skb = NULL; |
| 1879 | local->hw_roc_skb_for_status = NULL; | ||
| 1878 | } | 1880 | } |
| 1879 | 1881 | ||
| 1880 | mutex_unlock(&local->mtx); | 1882 | mutex_unlock(&local->mtx); |
diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h index c47d7c0e48a4..533fd32f49ff 100644 --- a/net/mac80211/ieee80211_i.h +++ b/net/mac80211/ieee80211_i.h | |||
| @@ -953,7 +953,7 @@ struct ieee80211_local { | |||
| 953 | 953 | ||
| 954 | struct ieee80211_channel *hw_roc_channel; | 954 | struct ieee80211_channel *hw_roc_channel; |
| 955 | struct net_device *hw_roc_dev; | 955 | struct net_device *hw_roc_dev; |
| 956 | struct sk_buff *hw_roc_skb; | 956 | struct sk_buff *hw_roc_skb, *hw_roc_skb_for_status; |
| 957 | struct work_struct hw_roc_start, hw_roc_done; | 957 | struct work_struct hw_roc_start, hw_roc_done; |
| 958 | enum nl80211_channel_type hw_roc_channel_type; | 958 | enum nl80211_channel_type hw_roc_channel_type; |
| 959 | unsigned int hw_roc_duration; | 959 | unsigned int hw_roc_duration; |
diff --git a/net/mac80211/status.c b/net/mac80211/status.c index 38a797217a91..071ac95c4aa0 100644 --- a/net/mac80211/status.c +++ b/net/mac80211/status.c | |||
| @@ -323,6 +323,7 @@ void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb) | |||
| 323 | 323 | ||
| 324 | if (info->flags & IEEE80211_TX_INTFL_NL80211_FRAME_TX) { | 324 | if (info->flags & IEEE80211_TX_INTFL_NL80211_FRAME_TX) { |
| 325 | struct ieee80211_work *wk; | 325 | struct ieee80211_work *wk; |
| 326 | u64 cookie = (unsigned long)skb; | ||
| 326 | 327 | ||
| 327 | rcu_read_lock(); | 328 | rcu_read_lock(); |
| 328 | list_for_each_entry_rcu(wk, &local->work_list, list) { | 329 | list_for_each_entry_rcu(wk, &local->work_list, list) { |
| @@ -334,8 +335,12 @@ void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb) | |||
| 334 | break; | 335 | break; |
| 335 | } | 336 | } |
| 336 | rcu_read_unlock(); | 337 | rcu_read_unlock(); |
| 338 | if (local->hw_roc_skb_for_status == skb) { | ||
| 339 | cookie = local->hw_roc_cookie ^ 2; | ||
| 340 | local->hw_roc_skb_for_status = NULL; | ||
| 341 | } | ||
| 337 | cfg80211_mgmt_tx_status( | 342 | cfg80211_mgmt_tx_status( |
| 338 | skb->dev, (unsigned long) skb, skb->data, skb->len, | 343 | skb->dev, cookie, skb->data, skb->len, |
| 339 | !!(info->flags & IEEE80211_TX_STAT_ACK), GFP_ATOMIC); | 344 | !!(info->flags & IEEE80211_TX_STAT_ACK), GFP_ATOMIC); |
| 340 | } | 345 | } |
| 341 | 346 | ||
diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c index 5950e3abead9..b0beaa58246b 100644 --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c | |||
| @@ -1547,7 +1547,7 @@ static int ieee80211_skb_resize(struct ieee80211_local *local, | |||
| 1547 | skb_orphan(skb); | 1547 | skb_orphan(skb); |
| 1548 | } | 1548 | } |
| 1549 | 1549 | ||
| 1550 | if (skb_header_cloned(skb)) | 1550 | if (skb_cloned(skb)) |
| 1551 | I802_DEBUG_INC(local->tx_expand_skb_head_cloned); | 1551 | I802_DEBUG_INC(local->tx_expand_skb_head_cloned); |
| 1552 | else if (head_need || tail_need) | 1552 | else if (head_need || tail_need) |
| 1553 | I802_DEBUG_INC(local->tx_expand_skb_head); | 1553 | I802_DEBUG_INC(local->tx_expand_skb_head); |
| @@ -2230,6 +2230,9 @@ struct sk_buff *ieee80211_beacon_get_tim(struct ieee80211_hw *hw, | |||
| 2230 | 2230 | ||
| 2231 | sdata = vif_to_sdata(vif); | 2231 | sdata = vif_to_sdata(vif); |
| 2232 | 2232 | ||
| 2233 | if (!ieee80211_sdata_running(sdata)) | ||
| 2234 | goto out; | ||
| 2235 | |||
| 2233 | if (tim_offset) | 2236 | if (tim_offset) |
| 2234 | *tim_offset = 0; | 2237 | *tim_offset = 0; |
| 2235 | if (tim_length) | 2238 | if (tim_length) |
