static int ar9003_hw_proc_txdesc(struct ath_hw *ah, void *ds,
                                 struct ath_tx_status *ts)
 {
+       struct ar9003_txc *txc = (struct ar9003_txc *) ds;
        struct ar9003_txs *ads;
        u32 status;
 
        if ((status & AR_TxDone) == 0)
                return -EINPROGRESS;
 
-       ah->ts_tail = (ah->ts_tail + 1) % ah->ts_size;
+       ts->qid = MS(ads->ds_info, AR_TxQcuNum);
+       if (!txc || (MS(txc->info, AR_TxQcuNum) == ts->qid))
+               ah->ts_tail = (ah->ts_tail + 1) % ah->ts_size;
+       else
+               return -ENOENT;
 
        if ((MS(ads->ds_info, AR_DescId) != ATHEROS_VENDOR_ID) ||
            (MS(ads->ds_info, AR_TxRxDesc) != 1)) {
        ts->ts_seqnum = MS(status, AR_SeqNum);
        ts->tid = MS(status, AR_TxTid);
 
-       ts->qid = MS(ads->ds_info, AR_TxQcuNum);
        ts->desc_id = MS(ads->status1, AR_TxDescId);
        ts->ts_tstamp = ads->status4;
        ts->ts_status = 0;
 
        struct ath_common *common = ath9k_hw_common(ah);
        struct ath_buf *bf = NULL;
        struct ieee80211_vif *vif;
+       struct ath_tx_status ts;
        int slot;
        u32 bfaddr, bc = 0;
 
                ath9k_hw_txstart(ah, sc->beacon.beaconq);
 
                sc->beacon.ast_be_xmit += bc;     /* XXX per-vif? */
+               if (ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) {
+                       spin_lock_bh(&sc->sc_pcu_lock);
+                       ath9k_hw_txprocdesc(ah, bf->bf_desc, (void *)&ts);
+                       spin_unlock_bh(&sc->sc_pcu_lock);
+               }
        }
 }