Here is the scenario. This is happening with what we have in wireless-testing code When hw queue get full we call ieeee80211_stop_queue(dev, q); When this is happens in the middle of the fragmentation . This is easiest to reproduces with fragmentation but probably happens also in other cases. int __ieee80211_tx() .... if (netif_subqueue_stopped(local->mdev, tx->extra_frag[i])) return IEEE80211_TX_FRAG_AGAIN; The fragment should stored into local->queues_pending[queue] (Actually I'm not sure it is) now when we HW queue got cleared a bit we call wake queues where tx_pending_tasklet is woken up ( queue is not woken up here) void ieee80211_wake_queue(struct ieee80211_hw *hw, int queue) { struct ieee80211_local *local = hw_to_local(hw); if (test_bit(queue, local->queues_pending)) { tasklet_schedule(&local->tx_pending_tasklet); } ..... <snip> } The check if the queue is open causes that queue is actually never woken up so traffic is stalled. However removing this line causes some other panic I didn't have time to process. void ieee80211_tx_pending(unsigned long data) { <snip> netif_tx_lock_bh(dev); for (i = 0; i < ieee80211_num_regular_queues(&local->hw); i++) { /* Check that this queue is ok */ if (__netif_subqueue_stopped(local->mdev, i)) --- This line causes that fact that the actual wake queue is never called. continue; if (!test_bit(i, local->queues_pending)) { ieee80211_wake_queue(&local->hw, i); continue; } </snip> -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html