Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wirel...
[pandora-kernel.git] / drivers / net / wireless / ath / ath9k / xmit.c
index 7e79bba..cc59571 100644 (file)
@@ -566,11 +566,8 @@ static void ath_tx_complete_aggr(struct ath_softc *sc, struct ath_txq *txq,
 
        rcu_read_unlock();
 
-       if (needreset) {
-               spin_unlock_bh(&sc->sc_pcu_lock);
+       if (needreset)
                ath_reset(sc, false);
-               spin_lock_bh(&sc->sc_pcu_lock);
-       }
 }
 
 static u32 ath_lookup_rate(struct ath_softc *sc, struct ath_buf *bf,
@@ -665,7 +662,8 @@ static int ath_compute_num_delims(struct ath_softc *sc, struct ath_atx_tid *tid,
         * TODO - this could be improved to be dependent on the rate.
         *      The hardware can keep up at lower rates, but not higher rates
         */
-       if (fi->keyix != ATH9K_TXKEYIX_INVALID)
+       if ((fi->keyix != ATH9K_TXKEYIX_INVALID) &&
+           !(sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA))
                ndelim += ATH_AGGR_ENCRYPTDELIM;
 
        /*
@@ -1150,6 +1148,8 @@ static bool bf_is_ampdu_not_probing(struct ath_buf *bf)
 
 static void ath_drain_txq_list(struct ath_softc *sc, struct ath_txq *txq,
                               struct list_head *list, bool retry_tx)
+       __releases(txq->axq_lock)
+       __acquires(txq->axq_lock)
 {
        struct ath_buf *bf, *lastbf;
        struct list_head bf_head;
@@ -2038,6 +2038,8 @@ static void ath_tx_rc_status(struct ath_softc *sc, struct ath_buf *bf,
 static void ath_tx_process_buffer(struct ath_softc *sc, struct ath_txq *txq,
                                  struct ath_tx_status *ts, struct ath_buf *bf,
                                  struct list_head *bf_head)
+       __releases(txq->axq_lock)
+       __acquires(txq->axq_lock)
 {
        int txok;
 
@@ -2170,7 +2172,9 @@ static void ath_tx_complete_poll_work(struct work_struct *work)
        if (needreset) {
                ath_dbg(ath9k_hw_common(sc->sc_ah), ATH_DBG_RESET,
                        "tx hung, resetting the chip\n");
+               spin_lock_bh(&sc->sc_pcu_lock);
                ath_reset(sc, true);
+               spin_unlock_bh(&sc->sc_pcu_lock);
        }
 
        ieee80211_queue_delayed_work(sc->hw, &sc->tx_complete_work,