-@@ -2494,6 +2527,7 @@
- if (M_FLAG_GET(skb, M_UAPSD)) {
- /* bypass FF handling */
- ATH_HARDSTART_GET_TX_BUF_WITH_LOCK;
-+ ATH_HARDSTART_REL_TX_BUF_WITH_TXQLOCK_OFF;
- if (bf == NULL)
- goto hardstart_fail;
- goto ff_bypass;
-@@ -2515,7 +2549,7 @@
- /* NB: use this lock to protect an->an_ff_txbuf in athff_can_aggregate()
- * call too.
- */
-- ATH_TXQ_LOCK(txq);
-+ ATH_TXQ_LOCK_BH(txq);
- if (athff_can_aggregate(sc, eh, an, skb, vap->iv_fragthreshold, &ff_flush)) {
-
- if (an->an_tx_ffbuf[skb->priority]) { /* i.e., frame on the staging queue */
-@@ -2525,7 +2559,7 @@
- TAILQ_REMOVE(&txq->axq_stageq, bf, bf_stagelist);
- an->an_tx_ffbuf[skb->priority] = NULL;
-
-- ATH_TXQ_UNLOCK(txq);
-+ ATH_TXQ_UNLOCK_BH(txq);
-
- /*
- * chain skbs and add FF magic
-@@ -2552,6 +2586,7 @@
- * to give the buffer back.
- */
- ATH_HARDSTART_GET_TX_BUF_WITH_LOCK;
-+ ATH_HARDSTART_REL_TX_BUF_WITH_TXQLOCK_ON;
- if (bf == NULL) {
- ATH_TXQ_UNLOCK(txq);
- goto hardstart_fail;
-@@ -2566,7 +2601,7 @@
-
- TAILQ_INSERT_HEAD(&txq->axq_stageq, bf, bf_stagelist);
-
-- ATH_TXQ_UNLOCK(txq);
-+ ATH_TXQ_UNLOCK_BH(txq);
-
- return 0;
- }
-@@ -2577,7 +2612,7 @@
- TAILQ_REMOVE(&txq->axq_stageq, bf_ff, bf_stagelist);
- an->an_tx_ffbuf[skb->priority] = NULL;
-
-- ATH_TXQ_UNLOCK(txq);
-+ ATH_TXQ_UNLOCK_BH(txq);
-
- /* encap and xmit */
- bf_ff->bf_skb = ieee80211_encap(ni, bf_ff->bf_skb, &framecnt);
-@@ -2607,9 +2642,9 @@
- }
- bf_ff->bf_node = NULL;
-
-- ATH_TXBUF_LOCK(sc);
-+ ATH_TXBUF_LOCK_BH(sc);
- STAILQ_INSERT_TAIL(&sc->sc_txbuf, bf_ff, bf_list);
-- ATH_TXBUF_UNLOCK(sc);
-+ ATH_TXBUF_UNLOCK_BH(sc);
- goto ff_flushdone;
- }
- /*
-@@ -2619,14 +2654,13 @@
- else if (an->an_tx_ffbuf[skb->priority]) {
- DPRINTF(sc, ATH_DEBUG_XMIT | ATH_DEBUG_FF,
- "%s: Out-Of-Order fast-frame\n", __func__);
-- ATH_TXQ_UNLOCK(txq);
-+ ATH_TXQ_UNLOCK_BH(txq);
- } else
-- ATH_TXQ_UNLOCK(txq);
-+ ATH_TXQ_UNLOCK_BH(txq);
-
- ff_flushdone:
- ATH_HARDSTART_GET_TX_BUF_WITH_LOCK;
-- if (bf == NULL)
-- goto hardstart_fail;
-+ ATH_HARDSTART_REL_TX_BUF_WITH_TXQLOCK_OFF;
- }
-
- ff_bypass:
-@@ -2634,6 +2668,7 @@
- #else /* ATH_SUPERG_FF */
-
- ATH_HARDSTART_GET_TX_BUF_WITH_LOCK;
-+ ATH_HARDSTART_REL_TX_BUF_WITH_TXQLOCK_OFF;
-
- #endif /* ATH_SUPERG_FF */
-
-@@ -2655,7 +2690,7 @@
- * Allocate 1 ath_buf for each frame given 1 was
- * already alloc'd
- */
-- ATH_TXBUF_LOCK(sc);
-+ ATH_TXBUF_LOCK_BH(sc);
- for (bfcnt = 1; bfcnt < framecnt; ++bfcnt) {
- if ((tbf = STAILQ_FIRST(&sc->sc_txbuf)) != NULL) {
- STAILQ_REMOVE_HEAD(&sc->sc_txbuf, bf_list);
-@@ -2676,11 +2711,11 @@
- STAILQ_INSERT_TAIL(&sc->sc_txbuf, tbf, bf_list);
- }
- }
-- ATH_TXBUF_UNLOCK(sc);
-+ ATH_TXBUF_UNLOCK_BH(sc);
- STAILQ_INIT(&bf_head);
- goto hardstart_fail;
- }
-- ATH_TXBUF_UNLOCK(sc);
-+ ATH_TXBUF_UNLOCK_BH(sc);
-
- while ((bf = STAILQ_FIRST(&bf_head)) != NULL && skb != NULL) {
- unsigned int nextfraglen = 0;
-@@ -2716,7 +2751,7 @@
-
- hardstart_fail:
- if (!STAILQ_EMPTY(&bf_head)) {
-- ATH_TXBUF_LOCK(sc);
-+ ATH_TXBUF_LOCK_BH(sc);
- STAILQ_FOREACH_SAFE(tbf, &bf_head, bf_list, tempbf) {
- tbf->bf_skb = NULL;
- tbf->bf_node = NULL;
-@@ -2726,7 +2761,7 @@
-
- STAILQ_INSERT_TAIL(&sc->sc_txbuf, tbf, bf_list);
- }
-- ATH_TXBUF_UNLOCK(sc);
-+ ATH_TXBUF_UNLOCK_BH(sc);
- }
-
- /* free sk_buffs */
-@@ -2769,7 +2804,7 @@
- /*
- * Grab a TX buffer and associated resources.
- */
-- ATH_TXBUF_LOCK_IRQ(sc);
-+ ATH_TXBUF_LOCK_BH(sc);
- bf = STAILQ_FIRST(&sc->sc_txbuf);
- if (bf != NULL)
- STAILQ_REMOVE_HEAD(&sc->sc_txbuf, bf_list);
-@@ -2780,7 +2815,7 @@
- sc->sc_devstopped=1;
- ATH_SCHEDULE_TQUEUE(&sc->sc_txtq, NULL);
- }
-- ATH_TXBUF_UNLOCK_IRQ(sc);
-+ ATH_TXBUF_UNLOCK_BH(sc);
- if (bf == NULL) {
- printk("ath_mgtstart: discard, no xmit buf\n");
- sc->sc_stats.ast_tx_nobufmgt++;
-@@ -2809,9 +2844,9 @@
- bf->bf_skb = NULL;
- bf->bf_node = NULL;
-
-- ATH_TXBUF_LOCK_IRQ(sc);
-+ ATH_TXBUF_LOCK_BH(sc);
- STAILQ_INSERT_TAIL(&sc->sc_txbuf, bf, bf_list);
-- ATH_TXBUF_UNLOCK_IRQ(sc);
-+ ATH_TXBUF_UNLOCK_BH(sc);
- }
- dev_kfree_skb_any(skb);
- skb = NULL;
-@@ -3279,10 +3314,10 @@
- *
- * XXX Using in_softirq is not right since we might
- * be called from other soft irq contexts than