if (csa_err_mask & (CS_ERR_COUNT_ERROR |
                            CS_ERR_LONG_DELAY_AFTER_CS |
                            CS_ERR_TX_BLOCK_TIMER_EXPIRED))
-               ieee80211_channel_switch_disconnect(vif, true);
+               ieee80211_channel_switch_disconnect(vif);
        rcu_read_unlock();
 }
 
 
 /**
  * ieee80211_channel_switch_disconnect - disconnect due to channel switch error
  * @vif: &struct ieee80211_vif pointer from the add_interface callback.
- * @block_tx: if %true, do not send deauth frame.
  *
  * Instruct mac80211 to disconnect due to a channel switch error. The channel
  * switch can request to block the tx and so, we need to make sure we do not send
  * a deauth frame in this case.
  */
-void ieee80211_channel_switch_disconnect(struct ieee80211_vif *vif,
-                                        bool block_tx);
+void ieee80211_channel_switch_disconnect(struct ieee80211_vif *vif);
 
 /**
  * ieee80211_request_smps - request SM PS transition
 
 }
 EXPORT_SYMBOL(ieee80211_csa_finish);
 
-void ieee80211_channel_switch_disconnect(struct ieee80211_vif *vif, bool block_tx)
+void ieee80211_channel_switch_disconnect(struct ieee80211_vif *vif)
 {
        struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);
        struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
        struct ieee80211_local *local = sdata->local;
 
-       sdata->csa_blocked_queues = block_tx;
        sdata_info(sdata, "channel switch failed, disconnecting\n");
        wiphy_work_queue(local->hw.wiphy, &ifmgd->csa_connection_drop_work);
 }
 
 
        unsigned long state;
 
-       bool csa_blocked_queues;
-
        char name[IFNAMSIZ];
 
        struct ieee80211_fragment_cache frags;
                                   struct ieee80211_sub_if_data *sdata);
 void ieee80211_sta_tx_notify(struct ieee80211_sub_if_data *sdata,
                             struct ieee80211_hdr *hdr, bool ack, u16 tx_time);
-
+unsigned int
+ieee80211_get_vif_queues(struct ieee80211_local *local,
+                        struct ieee80211_sub_if_data *sdata);
 void ieee80211_wake_queues_by_reason(struct ieee80211_hw *hw,
                                     unsigned long queues,
                                     enum queue_stop_reason reason,
                                     bool refcounted);
-void ieee80211_stop_vif_queues(struct ieee80211_local *local,
-                              struct ieee80211_sub_if_data *sdata,
-                              enum queue_stop_reason reason);
-void ieee80211_wake_vif_queues(struct ieee80211_local *local,
-                              struct ieee80211_sub_if_data *sdata,
-                              enum queue_stop_reason reason);
 void ieee80211_stop_queues_by_reason(struct ieee80211_hw *hw,
                                     unsigned long queues,
                                     enum queue_stop_reason reason,
 void ieee80211_stop_queue_by_reason(struct ieee80211_hw *hw, int queue,
                                    enum queue_stop_reason reason,
                                    bool refcounted);
+static inline void
+ieee80211_stop_vif_queues(struct ieee80211_local *local,
+                         struct ieee80211_sub_if_data *sdata,
+                         enum queue_stop_reason reason)
+{
+       ieee80211_stop_queues_by_reason(&local->hw,
+                                       ieee80211_get_vif_queues(local, sdata),
+                                       reason, true);
+}
+
+static inline void
+ieee80211_wake_vif_queues(struct ieee80211_local *local,
+                         struct ieee80211_sub_if_data *sdata,
+                         enum queue_stop_reason reason)
+{
+       ieee80211_wake_queues_by_reason(&local->hw,
+                                       ieee80211_get_vif_queues(local, sdata),
+                                       reason, true);
+}
+static inline void
+ieee80211_stop_vif_queues_norefcount(struct ieee80211_local *local,
+                                    struct ieee80211_sub_if_data *sdata,
+                                    enum queue_stop_reason reason)
+{
+       ieee80211_stop_queues_by_reason(&local->hw,
+                                       ieee80211_get_vif_queues(local, sdata),
+                                       reason, false);
+}
+static inline void
+ieee80211_wake_vif_queues_norefcount(struct ieee80211_local *local,
+                                    struct ieee80211_sub_if_data *sdata,
+                                    enum queue_stop_reason reason)
+{
+       ieee80211_wake_queues_by_reason(&local->hw,
+                                       ieee80211_get_vif_queues(local, sdata),
+                                       reason, false);
+}
 void ieee80211_add_pending_skb(struct ieee80211_local *local,
                               struct sk_buff *skb);
 void ieee80211_add_pending_skbs(struct ieee80211_local *local,
 
        if (ieee80211_hw_check(&local->hw, HANDLES_QUIET_CSA))
                return;
 
-       ieee80211_stop_vif_queues(local, sdata,
-                                 IEEE80211_QUEUE_STOP_REASON_CSA);
-       sdata->csa_blocked_queues = true;
+       ieee80211_stop_vif_queues_norefcount(local, sdata,
+                                            IEEE80211_QUEUE_STOP_REASON_CSA);
 }
 
 void ieee80211_vif_unblock_queues_csa(struct ieee80211_sub_if_data *sdata)
 {
        struct ieee80211_local *local = sdata->local;
 
-       if (sdata->csa_blocked_queues) {
-               ieee80211_wake_vif_queues(local, sdata,
-                                         IEEE80211_QUEUE_STOP_REASON_CSA);
-               sdata->csa_blocked_queues = false;
-       }
+       ieee80211_wake_vif_queues_norefcount(local, sdata,
+                                            IEEE80211_QUEUE_STOP_REASON_CSA);
 }
 
         */
        link->conf->csa_active = true;
        link->u.mgd.csa.blocked_tx = csa_ie.mode;
-       sdata->csa_blocked_queues =
-               csa_ie.mode && !ieee80211_hw_check(&local->hw, HANDLES_QUIET_CSA);
 
        wiphy_work_queue(sdata->local->hw.wiphy,
                         &ifmgd->csa_connection_drop_work);
 
 }
 EXPORT_SYMBOL(ieee80211_wake_queues);
 
-static unsigned int
+unsigned int
 ieee80211_get_vif_queues(struct ieee80211_local *local,
                         struct ieee80211_sub_if_data *sdata)
 {
                queues = 0;
 
                for (ac = 0; ac < IEEE80211_NUM_ACS; ac++)
-                       queues |= BIT(sdata->vif.hw_queue[ac]);
+                       if (sdata->vif.hw_queue[ac] != IEEE80211_INVAL_HW_QUEUE)
+                               queues |= BIT(sdata->vif.hw_queue[ac]);
                if (sdata->vif.cab_queue != IEEE80211_INVAL_HW_QUEUE)
                        queues |= BIT(sdata->vif.cab_queue);
        } else {
        __ieee80211_flush_queues(local, sdata, 0, drop);
 }
 
-void ieee80211_stop_vif_queues(struct ieee80211_local *local,
-                              struct ieee80211_sub_if_data *sdata,
-                              enum queue_stop_reason reason)
-{
-       ieee80211_stop_queues_by_reason(&local->hw,
-                                       ieee80211_get_vif_queues(local, sdata),
-                                       reason, true);
-}
-
-void ieee80211_wake_vif_queues(struct ieee80211_local *local,
-                              struct ieee80211_sub_if_data *sdata,
-                              enum queue_stop_reason reason)
-{
-       ieee80211_wake_queues_by_reason(&local->hw,
-                                       ieee80211_get_vif_queues(local, sdata),
-                                       reason, true);
-}
-
 static void __iterate_interfaces(struct ieee80211_local *local,
                                 u32 iter_flags,
                                 void (*iterator)(void *data, u8 *mac,