Ignore:
Timestamp:
2011-03-10T15:25:42+01:00 (6 years ago)
Author:
nbd
Message:

ath9k: backport tx dma stop changes from r26005

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/backfire/package/mac80211/patches/572-ath9k_fix_tx_flush.patch

    r25989 r26009  
    11--- a/drivers/net/wireless/ath/ath9k/main.c 
    22+++ b/drivers/net/wireless/ath/ath9k/main.c 
    3 @@ -2149,54 +2149,37 @@ static void ath9k_set_coverage_class(str 
     3@@ -2149,56 +2149,40 @@ static void ath9k_set_coverage_class(str 
    44  
    55 static void ath9k_flush(struct ieee80211_hw *hw, bool drop) 
     
    1111-       struct ath_common *common = ath9k_hw_common(ah); 
    1212-       int i, j, npend = 0; 
    13 +       int timeout = 60; /* ms */ 
     13+       int timeout = 200; /* ms */ 
    1414+       int i, j; 
    1515  
     16+       ath9k_ps_wakeup(sc); 
    1617        mutex_lock(&sc->mutex); 
    1718  
     
    5657+                       npend += ath9k_has_pending_frames(sc, &sc->tx.txq[i]); 
    5758                } 
    58 -       } 
    59   
    60 -       if (npend) { 
    61 -               ath_reset(sc, false); 
    62 -               txq->txq_flush_inprogress = false; 
     59+ 
    6360+               if (!npend) 
    6461+                   goto out; 
     
    6764        } 
    6865  
    69 +       ath9k_ps_wakeup(sc); 
    70 +       ath_drain_all_txq(sc, false); 
    71 +       ath9k_ps_restore(sc); 
    72 + 
     66-       if (npend) { 
     67+       if (!ath_drain_all_txq(sc, false)) 
     68                ath_reset(sc, false); 
     69-               txq->txq_flush_inprogress = false; 
     70-       } 
     71  
    7372+out: 
    7473        ieee80211_queue_delayed_work(hw, &sc->tx_complete_work, 0); 
    7574        mutex_unlock(&sc->mutex); 
     75+       ath9k_ps_restore(sc); 
    7676 } 
     77  
     78 struct ieee80211_ops ath9k_ops = { 
     79--- a/drivers/net/wireless/ath/ath9k/ath9k.h 
     80+++ b/drivers/net/wireless/ath/ath9k/ath9k.h 
     81@@ -189,7 +189,6 @@ struct ath_txq { 
     82        u32 axq_ampdu_depth; 
     83        bool stopped; 
     84        bool axq_tx_inprogress; 
     85-       bool txq_flush_inprogress; 
     86        struct list_head axq_acq; 
     87        struct list_head txq_fifo[ATH_TXFIFO_DEPTH]; 
     88        struct list_head txq_fifo_pending; 
     89--- a/drivers/net/wireless/ath/ath9k/xmit.c 
     90+++ b/drivers/net/wireless/ath/ath9k/xmit.c 
     91@@ -2091,8 +2091,7 @@ static void ath_tx_processq(struct ath_s 
     92                spin_lock_bh(&txq->axq_lock); 
     93                if (list_empty(&txq->axq_q)) { 
     94                        txq->axq_link = NULL; 
     95-                       if (sc->sc_flags & SC_OP_TXAGGR && 
     96-                           !txq->txq_flush_inprogress) 
     97+                       if (sc->sc_flags & SC_OP_TXAGGR) 
     98                                ath_txq_schedule(sc, txq); 
     99                        spin_unlock_bh(&txq->axq_lock); 
     100                        break; 
     101@@ -2173,7 +2172,7 @@ static void ath_tx_processq(struct ath_s 
     102  
     103                spin_lock_bh(&txq->axq_lock); 
     104  
     105-               if (sc->sc_flags & SC_OP_TXAGGR && !txq->txq_flush_inprogress) 
     106+               if (sc->sc_flags & SC_OP_TXAGGR) 
     107                        ath_txq_schedule(sc, txq); 
     108                spin_unlock_bh(&txq->axq_lock); 
     109        } 
     110@@ -2317,18 +2316,17 @@ void ath_tx_edma_tasklet(struct ath_soft 
     111  
     112                spin_lock_bh(&txq->axq_lock); 
     113  
     114-               if (!txq->txq_flush_inprogress) { 
     115-                       if (!list_empty(&txq->txq_fifo_pending)) { 
     116-                               INIT_LIST_HEAD(&bf_head); 
     117-                               bf = list_first_entry(&txq->txq_fifo_pending, 
     118-                                                     struct ath_buf, list); 
     119-                               list_cut_position(&bf_head, 
     120-                                                 &txq->txq_fifo_pending, 
     121-                                                 &bf->bf_lastbf->list); 
     122-                               ath_tx_txqaddbuf(sc, txq, &bf_head); 
     123-                       } else if (sc->sc_flags & SC_OP_TXAGGR) 
     124-                               ath_txq_schedule(sc, txq); 
     125-               } 
     126+               if (!list_empty(&txq->txq_fifo_pending)) { 
     127+                       INIT_LIST_HEAD(&bf_head); 
     128+                       bf = list_first_entry(&txq->txq_fifo_pending, 
     129+                                             struct ath_buf, list); 
     130+                       list_cut_position(&bf_head, 
     131+                                         &txq->txq_fifo_pending, 
     132+                                         &bf->bf_lastbf->list); 
     133+                       ath_tx_txqaddbuf(sc, txq, &bf_head); 
     134+               } else if (sc->sc_flags & SC_OP_TXAGGR) 
     135+                       ath_txq_schedule(sc, txq); 
     136+ 
     137                spin_unlock_bh(&txq->axq_lock); 
     138        } 
     139 } 
Note: See TracChangeset for help on using the changeset viewer.