Changeset 38034


Ignore:
Timestamp:
2013-09-18T15:24:55+02:00 (4 years ago)
Author:
nbd
Message:

ath9k: add missing tx locking

Signed-off-by: Felix Fietkau <nbd@…>

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/package/kernel/mac80211/patches/300-pending_work.patch

    r38017 r38034  
    932932  
    933933                info.buf_addr[0] = bf->bf_buf_addr; 
    934 @@ -1188,53 +1304,86 @@ static void ath_tx_fill_desc(struct ath_ 
     934@@ -1188,64 +1304,101 @@ static void ath_tx_fill_desc(struct ath_ 
    935935        } 
    936936 } 
     
    10161016+ 
    10171017+       INIT_LIST_HEAD(&bf_q); 
    1018   
    1019 -               ath_tx_fill_desc(sc, bf, txq, aggr_len); 
    1020 -               ath_tx_txqaddbuf(sc, txq, &bf_q, false); 
    1021 -       } while (txq->axq_ampdu_depth < ATH_AGGR_MIN_QDEPTH && 
    1022 -                status != ATH_AGGR_BAW_CLOSED); 
     1018+ 
    10231019+       bf = ath_tx_get_tid_subframe(sc, txq, tid, &tid_q); 
    10241020+       if (!bf) 
     
    10471043+               tx_info->flags |= IEEE80211_TX_CTL_CLEAR_PS_FILT; 
    10481044+       } 
    1049 + 
     1045  
     1046-               ath_tx_fill_desc(sc, bf, txq, aggr_len); 
     1047-               ath_tx_txqaddbuf(sc, txq, &bf_q, false); 
     1048-       } while (txq->axq_ampdu_depth < ATH_AGGR_MIN_QDEPTH && 
     1049-                status != ATH_AGGR_BAW_CLOSED); 
    10501050+       ath_tx_fill_desc(sc, bf, txq, aggr_len); 
    10511051+       ath_tx_txqaddbuf(sc, txq, &bf_q, false); 
     
    10541054  
    10551055 int ath_tx_aggr_start(struct ath_softc *sc, struct ieee80211_sta *sta, 
    1056 @@ -1258,6 +1407,9 @@ int ath_tx_aggr_start(struct ath_softc * 
     1056                      u16 tid, u16 *ssn) 
     1057 { 
     1058        struct ath_atx_tid *txtid; 
     1059+       struct ath_txq *txq; 
     1060        struct ath_node *an; 
     1061        u8 density; 
     1062  
     1063        an = (struct ath_node *)sta->drv_priv; 
     1064        txtid = ATH_AN_2_TID(an, tid); 
     1065+       txq = txtid->ac->txq; 
     1066+ 
     1067+       ath_txq_lock(sc, txq); 
     1068  
     1069        /* update ampdu factor/density, they may have changed. This may happen 
     1070         * in HT IBSS when a beacon with HT-info is received after the station 
     1071@@ -1258,6 +1411,9 @@ int ath_tx_aggr_start(struct ath_softc * 
    10571072                an->mpdudensity = density; 
    10581073        } 
     
    10641079        txtid->paused = true; 
    10651080        *ssn = txtid->seq_start = txtid->seq_next; 
    1066 @@ -1277,8 +1429,9 @@ void ath_tx_aggr_stop(struct ath_softc * 
     1081@@ -1266,6 +1422,8 @@ int ath_tx_aggr_start(struct ath_softc * 
     1082        memset(txtid->tx_buf, 0, sizeof(txtid->tx_buf)); 
     1083        txtid->baw_head = txtid->baw_tail = 0; 
     1084  
     1085+       ath_txq_unlock_complete(sc, txq); 
     1086+ 
     1087        return 0; 
     1088 } 
     1089  
     1090@@ -1277,8 +1435,9 @@ void ath_tx_aggr_stop(struct ath_softc * 
    10671091  
    10681092        ath_txq_lock(sc, txq); 
     
    10751099 } 
    10761100  
    1077 @@ -1302,7 +1455,7 @@ void ath_tx_aggr_sleep(struct ieee80211_ 
     1101@@ -1302,7 +1461,7 @@ void ath_tx_aggr_sleep(struct ieee80211_ 
    10781102  
    10791103                ath_txq_lock(sc, txq); 
     
    10841108                tid->sched = false; 
    10851109                list_del(&tid->list); 
    1086 @@ -1334,7 +1487,7 @@ void ath_tx_aggr_wakeup(struct ath_softc 
     1110@@ -1334,7 +1493,7 @@ void ath_tx_aggr_wakeup(struct ath_softc 
    10871111                ath_txq_lock(sc, txq); 
    10881112                ac->clear_ps_filter = true; 
     
    10931117                        ath_txq_schedule(sc, txq); 
    10941118                } 
    1095 @@ -1359,7 +1512,7 @@ void ath_tx_aggr_resume(struct ath_softc 
     1119@@ -1359,7 +1518,7 @@ void ath_tx_aggr_resume(struct ath_softc 
    10961120        tid->baw_size = IEEE80211_MIN_AMPDU_BUF << sta->ht_cap.ampdu_factor; 
    10971121        tid->paused = false; 
     
    11021126                ath_txq_schedule(sc, txq); 
    11031127        } 
    1104 @@ -1379,6 +1532,7 @@ void ath9k_release_buffered_frames(struc 
     1128@@ -1379,6 +1538,7 @@ void ath9k_release_buffered_frames(struc 
    11051129        struct ieee80211_tx_info *info; 
    11061130        struct list_head bf_q; 
     
    11101134        int i; 
    11111135  
    1112 @@ -1394,16 +1548,18 @@ void ath9k_release_buffered_frames(struc 
     1136@@ -1394,16 +1554,18 @@ void ath9k_release_buffered_frames(struc 
    11131137                        continue; 
    11141138  
     
    11341158                                bf_tail->bf_next = bf; 
    11351159  
    1136 @@ -1412,7 +1568,7 @@ void ath9k_release_buffered_frames(struc 
     1160@@ -1412,7 +1574,7 @@ void ath9k_release_buffered_frames(struc 
    11371161                        sent++; 
    11381162                        TX_STAT_INC(txq->axq_qnum, a_queued_hw); 
     
    11431167                } 
    11441168                ath_txq_unlock_complete(sc, tid->ac->txq); 
    1145 @@ -1571,7 +1727,7 @@ static void ath_drain_txq_list(struct at 
     1169@@ -1571,7 +1733,7 @@ static void ath_drain_txq_list(struct at 
    11461170        while (!list_empty(list)) { 
    11471171                bf = list_first_entry(list, struct ath_buf, list); 
     
    11521176  
    11531177                        ath_tx_return_buffer(sc, bf); 
    1154 @@ -1665,25 +1821,27 @@ void ath_tx_cleanupq(struct ath_softc *s 
     1178@@ -1665,25 +1827,27 @@ void ath_tx_cleanupq(struct ath_softc *s 
    11551179  */ 
    11561180 void ath_txq_schedule(struct ath_softc *sc, struct ath_txq *txq) 
     
    11851209                                               list); 
    11861210                        list_del(&tid->list); 
    1187 @@ -1692,17 +1850,17 @@ void ath_txq_schedule(struct ath_softc * 
     1211@@ -1692,17 +1856,17 @@ void ath_txq_schedule(struct ath_softc * 
    11881212                        if (tid->paused) 
    11891213                                continue; 
     
    12071231                } 
    12081232  
    1209 @@ -1711,9 +1869,17 @@ void ath_txq_schedule(struct ath_softc * 
     1233@@ -1711,9 +1875,17 @@ void ath_txq_schedule(struct ath_softc * 
    12101234                        list_add_tail(&ac->list, &txq->axq_acq); 
    12111235                } 
     
    12271251  
    12281252        rcu_read_unlock(); 
    1229 @@ -1787,62 +1953,13 @@ static void ath_tx_txqaddbuf(struct ath_ 
     1253@@ -1787,62 +1959,13 @@ static void ath_tx_txqaddbuf(struct ath_ 
    12301254                        if (bf_is_ampdu_not_probing(bf)) 
    12311255                                txq->axq_ampdu_depth++; 
     
    12931317                               struct ath_atx_tid *tid, struct sk_buff *skb) 
    12941318 { 
    1295 @@ -1985,6 +2102,7 @@ static int ath_tx_prepare(struct ieee802 
     1319@@ -1985,6 +2108,7 @@ static int ath_tx_prepare(struct ieee802 
    12961320        struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 
    12971321        struct ieee80211_sta *sta = txctl->sta; 
     
    13011325        int frmlen = skb->len + FCS_LEN; 
    13021326        int padpos, padsize; 
    1303 @@ -1992,6 +2110,10 @@ static int ath_tx_prepare(struct ieee802 
     1327@@ -1992,6 +2116,10 @@ static int ath_tx_prepare(struct ieee802 
    13041328        /* NOTE:  sta can be NULL according to net/mac80211.h */ 
    13051329        if (sta) 
     
    13121336        if (info->control.hw_key) 
    13131337                frmlen += info->control.hw_key->icv_len; 
    1314 @@ -2041,7 +2163,6 @@ int ath_tx_start(struct ieee80211_hw *hw 
     1338@@ -2041,7 +2169,6 @@ int ath_tx_start(struct ieee80211_hw *hw 
    13151339        struct ath_txq *txq = txctl->txq; 
    13161340        struct ath_atx_tid *tid = NULL; 
     
    13201344        int ret; 
    13211345  
    1322 @@ -2069,27 +2190,31 @@ int ath_tx_start(struct ieee80211_hw *hw 
     1346@@ -2069,27 +2196,31 @@ int ath_tx_start(struct ieee80211_hw *hw 
    13231347                ath_txq_unlock(sc, txq); 
    13241348                txq = sc->tx.uapsdq; 
     
    13631387                        dev_kfree_skb_any(skb); 
    13641388                else 
    1365 @@ -2142,7 +2267,7 @@ void ath_tx_cabq(struct ieee80211_hw *hw 
     1389@@ -2142,7 +2273,7 @@ void ath_tx_cabq(struct ieee80211_hw *hw 
    13661390  
    13671391                bf->bf_lastbf = bf; 
     
    13721396                if (bf_tail) 
    13731397                        bf_tail->bf_next = bf; 
    1374 @@ -2189,7 +2314,7 @@ static void ath_tx_complete(struct ath_s 
     1398@@ -2189,7 +2320,7 @@ static void ath_tx_complete(struct ath_s 
    13751399        struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb); 
    13761400        struct ath_common *common = ath9k_hw_common(sc->sc_ah); 
     
    13811405  
    13821406        ath_dbg(common, XMIT, "TX complete: skb: %p\n", skb); 
    1383 @@ -2225,21 +2350,7 @@ static void ath_tx_complete(struct ath_s 
     1407@@ -2225,21 +2356,7 @@ static void ath_tx_complete(struct ath_s 
    13841408        spin_unlock_irqrestore(&sc->sc_pm_lock, flags); 
    13851409  
     
    14041428  
    14051429 static void ath_tx_complete_buf(struct ath_softc *sc, struct ath_buf *bf, 
    1406 @@ -2360,8 +2471,7 @@ static void ath_tx_processq(struct ath_s 
     1430@@ -2360,8 +2477,7 @@ static void ath_tx_processq(struct ath_s 
    14071431  
    14081432                if (list_empty(&txq->axq_q)) { 
     
    14141438                } 
    14151439                bf = list_first_entry(&txq->axq_q, struct ath_buf, list); 
    1416 @@ -2375,7 +2485,7 @@ static void ath_tx_processq(struct ath_s 
     1440@@ -2375,7 +2491,7 @@ static void ath_tx_processq(struct ath_s 
    14171441                 * it with the STALE flag. 
    14181442                 */ 
     
    14231447                        if (list_is_last(&bf_held->list, &txq->axq_q)) 
    14241448                                break; 
    1425 @@ -2399,7 +2509,7 @@ static void ath_tx_processq(struct ath_s 
     1449@@ -2399,7 +2515,7 @@ static void ath_tx_processq(struct ath_s 
    14261450                 * however leave the last descriptor back as the holding 
    14271451                 * descriptor for hw. 
     
    14321456                if (!list_is_singular(&lastbf->list)) 
    14331457                        list_cut_position(&bf_head, 
    1434 @@ -2470,7 +2580,7 @@ void ath_tx_edma_tasklet(struct ath_soft 
     1458@@ -2470,7 +2586,7 @@ void ath_tx_edma_tasklet(struct ath_soft 
    14351459                } 
    14361460  
     
    14411465                        ath_tx_return_buffer(sc, bf); 
    14421466                        bf = list_first_entry(fifo_list, struct ath_buf, list); 
    1443 @@ -2492,7 +2602,7 @@ void ath_tx_edma_tasklet(struct ath_soft 
     1467@@ -2492,7 +2608,7 @@ void ath_tx_edma_tasklet(struct ath_soft 
    14441468                                ath_tx_txqaddbuf(sc, txq, &bf_q, true); 
    14451469                        } 
     
    14501474                                list_cut_position(&bf_head, fifo_list, 
    14511475                                                  lastbf->list.prev); 
    1452 @@ -2583,6 +2693,7 @@ void ath_tx_node_init(struct ath_softc * 
     1476@@ -2583,6 +2699,7 @@ void ath_tx_node_init(struct ath_softc * 
    14531477                tid->paused    = false; 
    14541478                tid->active        = false; 
     
    14581482                tid->ac = &an->ac[acno]; 
    14591483        } 
    1460 @@ -2590,6 +2701,7 @@ void ath_tx_node_init(struct ath_softc * 
     1484@@ -2590,6 +2707,7 @@ void ath_tx_node_init(struct ath_softc * 
    14611485        for (acno = 0, ac = &an->ac[acno]; 
    14621486             acno < IEEE80211_NUM_ACS; acno++, ac++) { 
Note: See TracChangeset for help on using the changeset viewer.