if ((free_slots(ring) < TX_SLOTS_PER_FRAME) ||
            should_inject_overflow(ring)) {
                /* This TX ring is full. */
-               ieee80211_stop_queue(dev->wl->hw, skb_get_queue_mapping(skb));
+               unsigned int skb_mapping = skb_get_queue_mapping(skb);
+               ieee80211_stop_queue(dev->wl->hw, skb_mapping);
+               dev->wl->tx_queue_stopped[skb_mapping] = 1;
 -              ring->stopped = 1;
 +              ring->stopped = true;
                if (b43_debug(dev, B43_DBG_DMAVERBOSE)) {
                        b43dbg(dev->wl, "Stopped TX ring %d\n", ring->index);
                }
        }
        if (ring->stopped) {
                B43_WARN_ON(free_slots(ring) < TX_SLOTS_PER_FRAME);
-               ieee80211_wake_queue(dev->wl->hw, ring->queue_prio);
 -              ring->stopped = 0;
 +              ring->stopped = false;
+       }
+ 
+       if (dev->wl->tx_queue_stopped[ring->queue_prio]) {
+               dev->wl->tx_queue_stopped[ring->queue_prio] = 0;
+       } else {
+               /* If the driver queue is running wake the corresponding
+                * mac80211 queue. */
+               ieee80211_wake_queue(dev->wl->hw, ring->queue_prio);
                if (b43_debug(dev, B43_DBG_DMAVERBOSE)) {
                        b43dbg(dev->wl, "Woke up TX ring %d\n", ring->index);
                }
 
                return 0;
  
        /* Set state and stop OS transmissions */
-       drvr->up = false;
 -      drvr->bus_if->drvr_up = 0;
++      drvr->bus_if->drvr_up = false;
        netif_stop_queue(ndev);
  
        return 0;
        }
        /* Allow transmit calls */
        netif_start_queue(ndev);
-       drvr_priv->pub.up = true;
-       if (brcmf_cfg80211_up(drvr_priv->pub.config)) {
 -      drvr->bus_if->drvr_up = 1;
++      drvr->bus_if->drvr_up = true;
+       if (brcmf_cfg80211_up(drvr->config)) {
                brcmf_dbg(ERROR, "failed to bring up cfg80211\n");
                return -1;
        }