source: branches/backfire/package/mac80211/patches/573-ath9k_beacon_stop.patch @ 25989

Last change on this file since 25989 was 25989, checked in by nbd, 5 years ago

ath9k: backport tx dma stop fixes from r25988

File size: 4.5 KB
  • drivers/net/wireless/ath/ath9k/mac.c

    a b bool ath9k_hw_abort_tx_dma(struct ath_hw 
    174174} 
    175175EXPORT_SYMBOL(ath9k_hw_abort_tx_dma); 
    176176 
    177 bool ath9k_hw_stoptxdma(struct ath_hw *ah, u32 q) 
     177bool ath9k_hw_stop_dma_queue(struct ath_hw *ah, u32 q) 
    178178{ 
    179 #define ATH9K_TX_STOP_DMA_TIMEOUT       4000    /* usec */ 
     179#define ATH9K_TX_STOP_DMA_TIMEOUT       1000    /* usec */ 
    180180#define ATH9K_TIME_QUANTUM              100     /* usec */ 
    181         struct ath_common *common = ath9k_hw_common(ah); 
    182         struct ath9k_hw_capabilities *pCap = &ah->caps; 
    183         struct ath9k_tx_queue_info *qi; 
    184         u32 tsfLow, j, wait; 
    185         u32 wait_time = ATH9K_TX_STOP_DMA_TIMEOUT / ATH9K_TIME_QUANTUM; 
    186  
    187         if (q >= pCap->total_queues) { 
    188                 ath_dbg(common, ATH_DBG_QUEUE, 
    189                         "Stopping TX DMA, invalid queue: %u\n", q); 
    190                 return false; 
    191         } 
    192  
    193         qi = &ah->txq[q]; 
    194         if (qi->tqi_type == ATH9K_TX_QUEUE_INACTIVE) { 
    195                 ath_dbg(common, ATH_DBG_QUEUE, 
    196                         "Stopping TX DMA, inactive queue: %u\n", q); 
    197                 return false; 
    198         } 
     181        int wait_time = ATH9K_TX_STOP_DMA_TIMEOUT / ATH9K_TIME_QUANTUM; 
     182        int wait; 
    199183 
    200184        REG_WRITE(ah, AR_Q_TXD, 1 << q); 
    201185 
    202186        for (wait = wait_time; wait != 0; wait--) { 
    203187                if (ath9k_hw_numtxpending(ah, q) == 0) 
    204188                        break; 
    205                 udelay(ATH9K_TIME_QUANTUM); 
    206         } 
    207189 
    208         if (ath9k_hw_numtxpending(ah, q)) { 
    209                 ath_dbg(common, ATH_DBG_QUEUE, 
    210                         "%s: Num of pending TX Frames %d on Q %d\n", 
    211                         __func__, ath9k_hw_numtxpending(ah, q), q); 
    212  
    213                 for (j = 0; j < 2; j++) { 
    214                         tsfLow = REG_READ(ah, AR_TSF_L32); 
    215                         REG_WRITE(ah, AR_QUIET2, 
    216                                   SM(10, AR_QUIET2_QUIET_DUR)); 
    217                         REG_WRITE(ah, AR_QUIET_PERIOD, 100); 
    218                         REG_WRITE(ah, AR_NEXT_QUIET_TIMER, tsfLow >> 10); 
    219                         REG_SET_BIT(ah, AR_TIMER_MODE, 
    220                                        AR_QUIET_TIMER_EN); 
    221  
    222                         if ((REG_READ(ah, AR_TSF_L32) >> 10) == (tsfLow >> 10)) 
    223                                 break; 
    224  
    225                         ath_dbg(common, ATH_DBG_QUEUE, 
    226                                 "TSF has moved while trying to set quiet time TSF: 0x%08x\n", 
    227                                 tsfLow); 
    228                 } 
    229  
    230                 REG_SET_BIT(ah, AR_DIAG_SW, AR_DIAG_FORCE_CH_IDLE_HIGH); 
    231  
    232                 udelay(200); 
    233                 REG_CLR_BIT(ah, AR_TIMER_MODE, AR_QUIET_TIMER_EN); 
    234  
    235                 wait = wait_time; 
    236                 while (ath9k_hw_numtxpending(ah, q)) { 
    237                         if ((--wait) == 0) { 
    238                                 ath_err(common, 
    239                                         "Failed to stop TX DMA in 100 msec after killing last frame\n"); 
    240                                 break; 
    241                         } 
    242                         udelay(ATH9K_TIME_QUANTUM); 
    243                 } 
    244  
    245                 REG_CLR_BIT(ah, AR_DIAG_SW, AR_DIAG_FORCE_CH_IDLE_HIGH); 
     190                udelay(ATH9K_TIME_QUANTUM); 
    246191        } 
    247192 
    248193        REG_WRITE(ah, AR_Q_TXD, 0); 
     194 
    249195        return wait != 0; 
    250196 
    251197#undef ATH9K_TX_STOP_DMA_TIMEOUT 
    252198#undef ATH9K_TIME_QUANTUM 
    253199} 
    254 EXPORT_SYMBOL(ath9k_hw_stoptxdma); 
     200EXPORT_SYMBOL(ath9k_hw_stop_dma_queue); 
    255201 
    256202void ath9k_hw_gettxintrtxqs(struct ath_hw *ah, u32 *txqs) 
    257203{ 
  • 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); 
    679679bool 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.