|
@@ -514,6 +514,10 @@ static struct sk_buff *wl12xx_lnk_skb_dequeue(struct wl1271 *wl,
|
|
|
spin_lock_irqsave(&wl->wl_lock, flags);
|
|
|
WARN_ON_ONCE(wl->tx_queue_count[q] <= 0);
|
|
|
wl->tx_queue_count[q]--;
|
|
|
+ if (lnk->wlvif) {
|
|
|
+ WARN_ON_ONCE(lnk->wlvif->tx_queue_count[q] <= 0);
|
|
|
+ lnk->wlvif->tx_queue_count[q]--;
|
|
|
+ }
|
|
|
spin_unlock_irqrestore(&wl->wl_lock, flags);
|
|
|
}
|
|
|
|
|
@@ -628,6 +632,8 @@ static void wl1271_skb_queue_head(struct wl1271 *wl, struct wl12xx_vif *wlvif,
|
|
|
|
|
|
spin_lock_irqsave(&wl->wl_lock, flags);
|
|
|
wl->tx_queue_count[q]++;
|
|
|
+ if (wlvif)
|
|
|
+ wlvif->tx_queue_count[q]++;
|
|
|
spin_unlock_irqrestore(&wl->wl_lock, flags);
|
|
|
}
|
|
|
|
|
@@ -977,10 +983,11 @@ void wl1271_tx_reset_link_queues(struct wl1271 *wl, u8 hlid)
|
|
|
unsigned long flags;
|
|
|
struct ieee80211_tx_info *info;
|
|
|
int total[NUM_TX_QUEUES];
|
|
|
+ struct wl1271_link *lnk = &wl->links[hlid];
|
|
|
|
|
|
for (i = 0; i < NUM_TX_QUEUES; i++) {
|
|
|
total[i] = 0;
|
|
|
- while ((skb = skb_dequeue(&wl->links[hlid].tx_queue[i]))) {
|
|
|
+ while ((skb = skb_dequeue(&lnk->tx_queue[i]))) {
|
|
|
wl1271_debug(DEBUG_TX, "link freeing skb 0x%p", skb);
|
|
|
|
|
|
if (!wl12xx_is_dummy_packet(wl, skb)) {
|
|
@@ -995,8 +1002,11 @@ void wl1271_tx_reset_link_queues(struct wl1271 *wl, u8 hlid)
|
|
|
}
|
|
|
|
|
|
spin_lock_irqsave(&wl->wl_lock, flags);
|
|
|
- for (i = 0; i < NUM_TX_QUEUES; i++)
|
|
|
+ for (i = 0; i < NUM_TX_QUEUES; i++) {
|
|
|
wl->tx_queue_count[i] -= total[i];
|
|
|
+ if (lnk->wlvif)
|
|
|
+ lnk->wlvif->tx_queue_count[i] -= total[i];
|
|
|
+ }
|
|
|
spin_unlock_irqrestore(&wl->wl_lock, flags);
|
|
|
|
|
|
wl1271_handle_tx_low_watermark(wl);
|
|
@@ -1020,6 +1030,8 @@ void wl12xx_tx_reset_wlvif(struct wl1271 *wl, struct wl12xx_vif *wlvif)
|
|
|
}
|
|
|
wlvif->last_tx_hlid = 0;
|
|
|
|
|
|
+ for (i = 0; i < NUM_TX_QUEUES; i++)
|
|
|
+ wlvif->tx_queue_count[i] = 0;
|
|
|
}
|
|
|
/* caller must hold wl->mutex and TX must be stopped */
|
|
|
void wl12xx_tx_reset(struct wl1271 *wl)
|