/*
         * Stop TX on this interface first.
         */
-       if (sdata->dev)
+       if (!local->ops->wake_tx_queue && sdata->dev)
                netif_tx_stop_all_queues(sdata->dev);
 
        ieee80211_roc_purge(local, sdata);
                        sdata->vif.type != NL80211_IFTYPE_STATION);
        }
 
-       set_bit(SDATA_STATE_RUNNING, &sdata->state);
-
        switch (sdata->vif.type) {
        case NL80211_IFTYPE_P2P_DEVICE:
                rcu_assign_pointer(local->p2p_sdata, sdata);
                spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
        }
 
+       set_bit(SDATA_STATE_RUNNING, &sdata->state);
+
        return 0;
  err_del_interface:
        drv_remove_interface(local, sdata);
 
        u16 len_rthdr;
        int hdrlen;
 
+       sdata = IEEE80211_DEV_TO_SUB_IF(dev);
+       if (unlikely(!ieee80211_sdata_running(sdata)))
+               goto fail;
+
        memset(info, 0, sizeof(*info));
        info->flags = IEEE80211_TX_CTL_REQ_TX_STATUS |
                      IEEE80211_TX_CTL_INJECTED;
         * This is necessary, for example, for old hostapd versions that
         * don't use nl80211-based management TX/RX.
         */
-       sdata = IEEE80211_DEV_TO_SUB_IF(dev);
-
        list_for_each_entry_rcu(tmp_sdata, &local->interfaces, list) {
                if (!ieee80211_sdata_running(tmp_sdata))
                        continue;
        struct sk_buff *next;
        int len = skb->len;
 
-       if (unlikely(skb->len < ETH_HLEN)) {
+       if (unlikely(!ieee80211_sdata_running(sdata) || skb->len < ETH_HLEN)) {
                kfree_skb(skb);
                return;
        }
        struct ieee80211_key *key;
        struct sta_info *sta;
 
-       if (unlikely(skb->len < ETH_HLEN)) {
+       if (unlikely(!ieee80211_sdata_running(sdata) || skb->len < ETH_HLEN)) {
                kfree_skb(skb);
                return NETDEV_TX_OK;
        }