source: branches/backfire/package/mac80211/patches/571-ath9k_fix_dma_stop.patch @ 26009

Last change on this file since 26009 was 26009, checked in by nbd, 6 years ago

ath9k: backport tx dma stop changes from r26005

File size: 2.3 KB
  • drivers/net/wireless/ath/ath9k/xmit.c

    a b bool ath_drain_all_txq(struct ath_softc  
    12711271        if (sc->sc_flags & SC_OP_INVALID) 
    12721272                return true; 
    12731273 
    1274         /* Stop beacon queue */ 
    1275         ath9k_hw_stoptxdma(sc->sc_ah, sc->beacon.beaconq); 
     1274        ath9k_hw_abort_tx_dma(ah); 
    12761275 
    1277         /* Stop data queues */ 
     1276        /* Check if any queue remains active */ 
    12781277        for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) { 
    1279                 if (ATH_TXQ_SETUP(sc, i)) { 
    1280                         txq = &sc->tx.txq[i]; 
    1281                         ath9k_hw_stoptxdma(ah, txq->axq_qnum); 
    1282                         npend += ath9k_hw_numtxpending(ah, txq->axq_qnum); 
    1283                 } 
     1278                if (!ATH_TXQ_SETUP(sc, i)) 
     1279                        continue; 
     1280 
     1281                npend += ath9k_hw_numtxpending(ah, sc->tx.txq[i].axq_qnum); 
    12841282        } 
    12851283 
    12861284        if (npend) 
  • drivers/net/wireless/ath/ath9k/mac.c

    a b bool ath9k_hw_updatetxtriglevel(struct a 
    143143} 
    144144EXPORT_SYMBOL(ath9k_hw_updatetxtriglevel); 
    145145 
     146void ath9k_hw_abort_tx_dma(struct ath_hw *ah) 
     147{ 
     148        int i, q; 
     149 
     150        REG_WRITE(ah, AR_Q_TXD, AR_Q_TXD_M); 
     151 
     152        REG_SET_BIT(ah, AR_PCU_MISC, AR_PCU_FORCE_QUIET_COLL | AR_PCU_CLEAR_VMF); 
     153        REG_SET_BIT(ah, AR_DIAG_SW, AR_DIAG_FORCE_CH_IDLE_HIGH); 
     154        REG_SET_BIT(ah, AR_D_GBL_IFS_MISC, AR_D_GBL_IFS_MISC_IGNORE_BACKOFF); 
     155 
     156        for (q = 0; q < AR_NUM_QCU; q++) { 
     157                for (i = 1000; i > 0; i--) { 
     158                        if (!ath9k_hw_numtxpending(ah, q)) 
     159                                break; 
     160 
     161                        udelay(5); 
     162                } 
     163        } 
     164 
     165        REG_CLR_BIT(ah, AR_PCU_MISC, AR_PCU_FORCE_QUIET_COLL | AR_PCU_CLEAR_VMF); 
     166        REG_CLR_BIT(ah, AR_DIAG_SW, AR_DIAG_FORCE_CH_IDLE_HIGH); 
     167        REG_CLR_BIT(ah, AR_D_GBL_IFS_MISC, AR_D_GBL_IFS_MISC_IGNORE_BACKOFF); 
     168 
     169        REG_WRITE(ah, AR_Q_TXD, 0); 
     170} 
     171EXPORT_SYMBOL(ath9k_hw_abort_tx_dma); 
     172 
    146173bool ath9k_hw_stoptxdma(struct ath_hw *ah, u32 q) 
    147174{ 
    148175#define ATH9K_TX_STOP_DMA_TIMEOUT       4000    /* usec */ 
  • drivers/net/wireless/ath/ath9k/mac.h

    a b void ath9k_hw_cleartxdesc(struct ath_hw  
    676676u32 ath9k_hw_numtxpending(struct ath_hw *ah, u32 q); 
    677677bool ath9k_hw_updatetxtriglevel(struct ath_hw *ah, bool bIncTrigLevel); 
    678678bool ath9k_hw_stoptxdma(struct ath_hw *ah, u32 q); 
     679void ath9k_hw_abort_tx_dma(struct ath_hw *ah); 
    679680void ath9k_hw_gettxintrtxqs(struct ath_hw *ah, u32 *txqs); 
    680681bool ath9k_hw_set_txq_props(struct ath_hw *ah, int q, 
    681682                            const struct ath9k_tx_queue_info *qinfo); 
Note: See TracBrowser for help on using the repository browser.