source: branches/backfire/package/mac80211/patches/573-ath9k_beacon_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: 4.5 KB
  • drivers/net/wireless/ath/ath9k/mac.c

    a b void ath9k_hw_abort_tx_dma(struct ath_hw 
    170170} 
    171171EXPORT_SYMBOL(ath9k_hw_abort_tx_dma); 
    172172 
    173 bool ath9k_hw_stoptxdma(struct ath_hw *ah, u32 q) 
     173bool ath9k_hw_stop_dma_queue(struct ath_hw *ah, u32 q) 
    174174{ 
    175 #define ATH9K_TX_STOP_DMA_TIMEOUT       4000    /* usec */ 
     175#define ATH9K_TX_STOP_DMA_TIMEOUT       1000    /* usec */ 
    176176#define ATH9K_TIME_QUANTUM              100     /* usec */ 
    177         struct ath_common *common = ath9k_hw_common(ah); 
    178         struct ath9k_hw_capabilities *pCap = &ah->caps; 
    179         struct ath9k_tx_queue_info *qi; 
    180         u32 tsfLow, j, wait; 
    181         u32 wait_time = ATH9K_TX_STOP_DMA_TIMEOUT / ATH9K_TIME_QUANTUM; 
    182  
    183         if (q >= pCap->total_queues) { 
    184                 ath_dbg(common, ATH_DBG_QUEUE, 
    185                         "Stopping TX DMA, invalid queue: %u\n", q); 
    186                 return false; 
    187         } 
    188  
    189         qi = &ah->txq[q]; 
    190         if (qi->tqi_type == ATH9K_TX_QUEUE_INACTIVE) { 
    191                 ath_dbg(common, ATH_DBG_QUEUE, 
    192                         "Stopping TX DMA, inactive queue: %u\n", q); 
    193                 return false; 
    194         } 
     177        int wait_time = ATH9K_TX_STOP_DMA_TIMEOUT / ATH9K_TIME_QUANTUM; 
     178        int wait; 
    195179 
    196180        REG_WRITE(ah, AR_Q_TXD, 1 << q); 
    197181 
    198182        for (wait = wait_time; wait != 0; wait--) { 
    199183                if (ath9k_hw_numtxpending(ah, q) == 0) 
    200184                        break; 
    201                 udelay(ATH9K_TIME_QUANTUM); 
    202         } 
    203185 
    204         if (ath9k_hw_numtxpending(ah, q)) { 
    205                 ath_dbg(common, ATH_DBG_QUEUE, 
    206                         "%s: Num of pending TX Frames %d on Q %d\n", 
    207                         __func__, ath9k_hw_numtxpending(ah, q), q); 
    208  
    209                 for (j = 0; j < 2; j++) { 
    210                         tsfLow = REG_READ(ah, AR_TSF_L32); 
    211                         REG_WRITE(ah, AR_QUIET2, 
    212                                   SM(10, AR_QUIET2_QUIET_DUR)); 
    213                         REG_WRITE(ah, AR_QUIET_PERIOD, 100); 
    214                         REG_WRITE(ah, AR_NEXT_QUIET_TIMER, tsfLow >> 10); 
    215                         REG_SET_BIT(ah, AR_TIMER_MODE, 
    216                                        AR_QUIET_TIMER_EN); 
    217  
    218                         if ((REG_READ(ah, AR_TSF_L32) >> 10) == (tsfLow >> 10)) 
    219                                 break; 
    220  
    221                         ath_dbg(common, ATH_DBG_QUEUE, 
    222                                 "TSF has moved while trying to set quiet time TSF: 0x%08x\n", 
    223                                 tsfLow); 
    224                 } 
    225  
    226                 REG_SET_BIT(ah, AR_DIAG_SW, AR_DIAG_FORCE_CH_IDLE_HIGH); 
    227  
    228                 udelay(200); 
    229                 REG_CLR_BIT(ah, AR_TIMER_MODE, AR_QUIET_TIMER_EN); 
    230  
    231                 wait = wait_time; 
    232                 while (ath9k_hw_numtxpending(ah, q)) { 
    233                         if ((--wait) == 0) { 
    234                                 ath_err(common, 
    235                                         "Failed to stop TX DMA in 100 msec after killing last frame\n"); 
    236                                 break; 
    237                         } 
    238                         udelay(ATH9K_TIME_QUANTUM); 
    239                 } 
    240  
    241                 REG_CLR_BIT(ah, AR_DIAG_SW, AR_DIAG_FORCE_CH_IDLE_HIGH); 
     186                udelay(ATH9K_TIME_QUANTUM); 
    242187        } 
    243188 
    244189        REG_WRITE(ah, AR_Q_TXD, 0); 
     190 
    245191        return wait != 0; 
    246192 
    247193#undef ATH9K_TX_STOP_DMA_TIMEOUT 
    248194#undef ATH9K_TIME_QUANTUM 
    249195} 
    250 EXPORT_SYMBOL(ath9k_hw_stoptxdma); 
     196EXPORT_SYMBOL(ath9k_hw_stop_dma_queue); 
    251197 
    252198void ath9k_hw_gettxintrtxqs(struct ath_hw *ah, u32 *txqs) 
    253199{ 
  • drivers/net/wireless/ath/ath9k/mac.h

    a b void ath9k_hw_txstart(struct ath_hw *ah, 
    675675void ath9k_hw_cleartxdesc(struct ath_hw *ah, void *ds); 
    676676u32 ath9k_hw_numtxpending(struct ath_hw *ah, u32 q); 
    677677bool ath9k_hw_updatetxtriglevel(struct ath_hw *ah, bool bIncTrigLevel); 
    678 bool ath9k_hw_stoptxdma(struct ath_hw *ah, u32 q); 
     678bool ath9k_hw_stop_dma_queue(struct ath_hw *ah, u32 q); 
    679679void ath9k_hw_abort_tx_dma(struct ath_hw *ah); 
    680680void ath9k_hw_gettxintrtxqs(struct ath_hw *ah, u32 *txqs); 
    681681bool ath9k_hw_set_txq_props(struct ath_hw *ah, int q, 
  • drivers/net/wireless/ath/ath9k/beacon.c

    a b void ath_beacon_tasklet(unsigned long da 
    373373                        ath_dbg(common, ATH_DBG_BSTUCK, 
    374374                                "missed %u consecutive beacons\n", 
    375375                                sc->beacon.bmisscnt); 
     376                        ath9k_hw_stop_dma_queue(ah, sc->beacon.beaconq); 
    376377                        ath9k_hw_bstuck_nfcal(ah); 
    377378                } else if (sc->beacon.bmisscnt >= BSTUCK_THRESH) { 
    378379                        ath_dbg(common, ATH_DBG_BSTUCK, 
    void ath_beacon_tasklet(unsigned long da 
    450451                sc->beacon.updateslot = OK; 
    451452        } 
    452453        if (bfaddr != 0) { 
    453                 /* 
    454                  * Stop any current dma and put the new frame(s) on the queue. 
    455                  * This should never fail since we check above that no frames 
    456                  * are still pending on the queue. 
    457                  */ 
    458                 if (!ath9k_hw_stoptxdma(ah, sc->beacon.beaconq)) { 
    459                         ath_err(common, "beacon queue %u did not stop?\n", 
    460                                 sc->beacon.beaconq); 
    461                 } 
    462  
    463454                /* NB: cabq traffic should already be queued and primed */ 
    464455                ath9k_hw_puttxbuf(ah, sc->beacon.beaconq, bfaddr); 
    465456                ath9k_hw_txstart(ah, sc->beacon.beaconq); 
    void ath9k_set_beaconing_status(struct a 
    780771                ah->imask &= ~ATH9K_INT_SWBA; 
    781772                ath9k_hw_set_interrupts(ah, ah->imask); 
    782773                tasklet_kill(&sc->bcon_tasklet); 
    783                 ath9k_hw_stoptxdma(ah, sc->beacon.beaconq); 
     774                ath9k_hw_stop_dma_queue(ah, sc->beacon.beaconq); 
    784775        } 
    785776        ath9k_ps_restore(sc); 
    786777} 
Note: See TracBrowser for help on using the repository browser.