|
@@ -1270,7 +1270,11 @@ static void ieee80211_drv_tx(struct ieee80211_local *local,
|
|
|
if (atomic_read(&sdata->txqs_len[ac]) >= local->hw.txq_ac_max_pending)
|
|
|
netif_stop_subqueue(sdata->dev, ac);
|
|
|
|
|
|
- skb_queue_tail(&txqi->queue, skb);
|
|
|
+ spin_lock_bh(&txqi->queue.lock);
|
|
|
+ txqi->byte_cnt += skb->len;
|
|
|
+ __skb_queue_tail(&txqi->queue, skb);
|
|
|
+ spin_unlock_bh(&txqi->queue.lock);
|
|
|
+
|
|
|
drv_wake_tx_queue(local, txqi);
|
|
|
|
|
|
return;
|
|
@@ -1298,6 +1302,8 @@ struct sk_buff *ieee80211_tx_dequeue(struct ieee80211_hw *hw,
|
|
|
if (!skb)
|
|
|
goto out;
|
|
|
|
|
|
+ txqi->byte_cnt -= skb->len;
|
|
|
+
|
|
|
atomic_dec(&sdata->txqs_len[ac]);
|
|
|
if (__netif_subqueue_stopped(sdata->dev, ac))
|
|
|
ieee80211_propagate_queue_wake(local, sdata->vif.hw_queue[ac]);
|