-@@ -2552,6 +2584,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;
-@@ -2573,7 +2606,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 */
-@@ -2583,7 +2616,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
-@@ -2610,6 +2643,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;
-@@ -2624,7 +2658,7 @@
-
- TAILQ_INSERT_HEAD(&txq->axq_stageq, bf, bf_stagelist);
-
-- ATH_TXQ_UNLOCK(txq);
-+ ATH_TXQ_UNLOCK_BH(txq);
-
- return 0;
- }
-@@ -2635,7 +2669,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);
-@@ -2665,9 +2699,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;
- }
- /*
-@@ -2676,14 +2677,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:
-@@ -2691,6 +2725,7 @@
- #else /* ATH_SUPERG_FF */
-
- ATH_HARDSTART_GET_TX_BUF_WITH_LOCK;
-+ ATH_HARDSTART_REL_TX_BUF_WITH_TXQLOCK_OFF;
-
- #endif /* ATH_SUPERG_FF */
-
-@@ -2712,7 +2747,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);
-@@ -2733,11 +2768,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;
-@@ -2773,7 +2808,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;
-@@ -2783,7 +2818,7 @@
-
- STAILQ_INSERT_TAIL(&sc->sc_txbuf, tbf, bf_list);
- }
-- ATH_TXBUF_UNLOCK(sc);
-+ ATH_TXBUF_UNLOCK_BH(sc);
- }
-
- /* free sk_buffs */
-@@ -2826,7 +2861,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);
-@@ -2837,7 +2872,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++;
-@@ -2866,9 +2901,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;
-@@ -3336,10 +3371,10 @@
- *
- * XXX Using in_softirq is not right since we might
- * be called from other soft irq contexts than