Just discovered this while working on my follow-up: > void ath_tx_queue_tid(struct ath_softc *sc, struct ath_atx_tid *tid) > { > - struct ath_vif *avp = (struct ath_vif *) tid->an->vif->drv_priv; > - struct ath_chanctx *ctx = avp->chanctx; > - struct ath_acq *acq; > + struct ieee80211_txq *queue = > + container_of((void *)tid, struct ieee80211_txq, drv_priv); > > - if (!ctx || !list_empty(&tid->list)) > - return; > - > - acq = &ctx->acq[TID_TO_WME_AC(tid->tidno)]; > - spin_lock_bh(&acq->lock); > - __ath_tx_queue_tid(sc, tid); > - spin_unlock_bh(&acq->lock); > + ieee80211_return_txq(sc->hw, queue); > } After we evolved the API, this is now wrong, as ieee80211_return_txq() should only be called while holding the right lock. I'll post a fixed version tomorrow. -Toke