Changeset 37982


Ignore:
Timestamp:
2013-09-14T16:46:39+02:00 (4 years ago)
Author:
nbd
Message:

ath9k: merge a fix for tx processing issues with aggregation

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

File:
1 edited

Legend:

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

    r37922 r37982  
    574574  
    575575 static void ath_tx_set_retry(struct ath_softc *sc, struct ath_txq *txq, 
    576 @@ -380,7 +456,6 @@ static void ath_tx_complete_aggr(struct  
     576@@ -323,6 +399,7 @@ static struct ath_buf* ath_clone_txbuf(s 
     577        tbf->bf_buf_addr = bf->bf_buf_addr; 
     578        memcpy(tbf->bf_desc, bf->bf_desc, sc->sc_ah->caps.tx_desc_len); 
     579        tbf->bf_state = bf->bf_state; 
     580+       tbf->bf_state.stale = false; 
     581  
     582        return tbf; 
     583 } 
     584@@ -380,7 +457,6 @@ static void ath_tx_complete_aggr(struct  
    577585        struct ieee80211_tx_rate rates[4]; 
    578586        struct ath_frame_info *fi; 
     
    582590        int i, retries; 
    583591        int bar_index = -1; 
    584 @@ -406,7 +481,7 @@ static void ath_tx_complete_aggr(struct  
     592@@ -406,7 +482,7 @@ static void ath_tx_complete_aggr(struct  
    585593                while (bf) { 
    586594                        bf_next = bf->bf_next; 
     
    591599  
    592600                        ath_tx_complete_buf(sc, bf, txq, &bf_head, ts, 0); 
    593 @@ -417,8 +492,7 @@ static void ath_tx_complete_aggr(struct  
     601@@ -417,8 +493,7 @@ static void ath_tx_complete_aggr(struct  
    594602        } 
    595603  
     
    601609        isba = ts->ts_flags & ATH9K_TX_BA; 
    602610  
    603 @@ -430,7 +504,7 @@ static void ath_tx_complete_aggr(struct  
     611@@ -430,7 +505,7 @@ static void ath_tx_complete_aggr(struct  
    604612         * Only BlockAcks have a TID and therefore normal Acks cannot be 
    605613         * checked 
     
    610618  
    611619        isaggr = bf_isaggr(bf); 
    612 @@ -466,7 +540,8 @@ static void ath_tx_complete_aggr(struct  
     620@@ -466,7 +541,8 @@ static void ath_tx_complete_aggr(struct  
    613621                tx_info = IEEE80211_SKB_CB(skb); 
    614622                fi = get_frame_info(skb); 
     
    620628                         * Outside of the current BlockAck window, 
    621629                         * maybe part of a previous session 
    622 @@ -499,7 +574,7 @@ static void ath_tx_complete_aggr(struct  
     630@@ -499,7 +575,7 @@ static void ath_tx_complete_aggr(struct  
    623631                 * not a holding desc. 
    624632                 */ 
     
    629637  
    630638                if (!txpending) { 
    631 @@ -523,7 +598,7 @@ static void ath_tx_complete_aggr(struct  
     639@@ -523,7 +599,7 @@ static void ath_tx_complete_aggr(struct  
    632640                                ieee80211_sta_eosp(sta); 
    633641                        } 
     
    638646  
    639647                                tbf = ath_clone_txbuf(sc, bf_last); 
    640 @@ -560,7 +635,7 @@ static void ath_tx_complete_aggr(struct  
     648@@ -560,7 +636,7 @@ static void ath_tx_complete_aggr(struct  
    641649                if (an->sleeping) 
    642650                        ieee80211_sta_set_buffered(sta, tid->tidno, true); 
     
    647655                        ath_tx_queue_tid(txq, tid); 
    648656  
    649 @@ -618,7 +693,7 @@ static void ath_tx_process_buffer(struct 
     657@@ -618,7 +694,7 @@ static void ath_tx_process_buffer(struct 
    650658        } else 
    651659                ath_tx_complete_aggr(sc, txq, bf, bf_head, ts, txok); 
     
    656664 } 
    657665  
    658 @@ -792,15 +867,20 @@ static int ath_compute_num_delims(struct 
     666@@ -792,15 +868,20 @@ static int ath_compute_num_delims(struct 
    659667  
    660668 static struct ath_buf * 
     
    679687                        break; 
    680688  
    681 @@ -808,13 +888,26 @@ ath_tx_get_tid_subframe(struct ath_softc 
     689@@ -808,13 +889,26 @@ ath_tx_get_tid_subframe(struct ath_softc 
    682690                bf = fi->bf; 
    683691                if (!fi->bf) 
     
    707715                seqno = bf->bf_state.seqno; 
    708716  
    709 @@ -828,73 +921,52 @@ ath_tx_get_tid_subframe(struct ath_softc 
     717@@ -828,73 +922,52 @@ ath_tx_get_tid_subframe(struct ath_softc 
    710718  
    711719                        INIT_LIST_HEAD(&bf_head); 
     
    802810  
    803811                /* add padding for previous frame to aggregation length */ 
    804 @@ -912,22 +984,37 @@ static enum ATH_AGGR_STATUS ath_tx_form_ 
     812@@ -912,22 +985,37 @@ static enum ATH_AGGR_STATUS ath_tx_form_ 
    805813                bf->bf_next = NULL; 
    806814  
     
    845853 } 
    846854  
    847 @@ -999,7 +1086,7 @@ void ath_update_max_aggr_framelen(struct 
     855@@ -999,7 +1087,7 @@ void ath_update_max_aggr_framelen(struct 
    848856 } 
    849857  
     
    854862        struct ath_hw *ah = sc->sc_ah; 
    855863        struct sk_buff *skb; 
    856 @@ -1008,6 +1095,7 @@ static void ath_buf_set_rate(struct ath_ 
     864@@ -1008,6 +1096,7 @@ static void ath_buf_set_rate(struct ath_ 
    857865        const struct ieee80211_rate *rate; 
    858866        struct ieee80211_hdr *hdr; 
     
    862870        u8 rix = 0; 
    863871  
    864 @@ -1030,7 +1118,17 @@ static void ath_buf_set_rate(struct ath_ 
     872@@ -1030,7 +1119,17 @@ static void ath_buf_set_rate(struct ath_ 
    865873                rix = rates[i].idx; 
    866874                info->rates[i].Tries = rates[i].count; 
     
    881889                        info->flags |= ATH9K_TXDESC_RTSENA; 
    882890                } else if (rates[i].flags & IEEE80211_TX_RC_USE_CTS_PROTECT) { 
    883 @@ -1123,6 +1221,8 @@ static void ath_tx_fill_desc(struct ath_ 
     891@@ -1123,6 +1222,8 @@ static void ath_tx_fill_desc(struct ath_ 
    884892        struct ath_hw *ah = sc->sc_ah; 
    885893        struct ath_buf *bf_first = NULL; 
     
    890898        memset(&info, 0, sizeof(info)); 
    891899        info.is_first = true; 
    892 @@ -1159,7 +1259,22 @@ static void ath_tx_fill_desc(struct ath_ 
     900@@ -1159,7 +1260,22 @@ static void ath_tx_fill_desc(struct ath_ 
    893901                                info.flags |= (u32) bf->bf_state.bfs_paprd << 
    894902                                              ATH9K_TXDESC_PAPRD_S; 
     
    914922  
    915923                info.buf_addr[0] = bf->bf_buf_addr; 
    916 @@ -1188,53 +1303,86 @@ static void ath_tx_fill_desc(struct ath_ 
     924@@ -1188,53 +1304,86 @@ static void ath_tx_fill_desc(struct ath_ 
    917925        } 
    918926 } 
     
    10361044  
    10371045 int ath_tx_aggr_start(struct ath_softc *sc, struct ieee80211_sta *sta, 
    1038 @@ -1258,6 +1406,9 @@ int ath_tx_aggr_start(struct ath_softc * 
     1046@@ -1258,6 +1407,9 @@ int ath_tx_aggr_start(struct ath_softc * 
    10391047                an->mpdudensity = density; 
    10401048        } 
     
    10461054        txtid->paused = true; 
    10471055        *ssn = txtid->seq_start = txtid->seq_next; 
    1048 @@ -1277,8 +1428,9 @@ void ath_tx_aggr_stop(struct ath_softc * 
     1056@@ -1277,8 +1429,9 @@ void ath_tx_aggr_stop(struct ath_softc * 
    10491057  
    10501058        ath_txq_lock(sc, txq); 
     
    10571065 } 
    10581066  
    1059 @@ -1302,7 +1454,7 @@ void ath_tx_aggr_sleep(struct ieee80211_ 
     1067@@ -1302,7 +1455,7 @@ void ath_tx_aggr_sleep(struct ieee80211_ 
    10601068  
    10611069                ath_txq_lock(sc, txq); 
     
    10661074                tid->sched = false; 
    10671075                list_del(&tid->list); 
    1068 @@ -1334,7 +1486,7 @@ void ath_tx_aggr_wakeup(struct ath_softc 
     1076@@ -1334,7 +1487,7 @@ void ath_tx_aggr_wakeup(struct ath_softc 
    10691077                ath_txq_lock(sc, txq); 
    10701078                ac->clear_ps_filter = true; 
     
    10751083                        ath_txq_schedule(sc, txq); 
    10761084                } 
    1077 @@ -1359,7 +1511,7 @@ void ath_tx_aggr_resume(struct ath_softc 
     1085@@ -1359,7 +1512,7 @@ void ath_tx_aggr_resume(struct ath_softc 
    10781086        tid->baw_size = IEEE80211_MIN_AMPDU_BUF << sta->ht_cap.ampdu_factor; 
    10791087        tid->paused = false; 
     
    10841092                ath_txq_schedule(sc, txq); 
    10851093        } 
    1086 @@ -1379,6 +1531,7 @@ void ath9k_release_buffered_frames(struc 
     1094@@ -1379,6 +1532,7 @@ void ath9k_release_buffered_frames(struc 
    10871095        struct ieee80211_tx_info *info; 
    10881096        struct list_head bf_q; 
     
    10921100        int i; 
    10931101  
    1094 @@ -1394,15 +1547,15 @@ void ath9k_release_buffered_frames(struc 
     1102@@ -1394,15 +1548,15 @@ void ath9k_release_buffered_frames(struc 
    10951103                        continue; 
    10961104  
     
    11121120                        if (bf_tail) 
    11131121                                bf_tail->bf_next = bf; 
    1114 @@ -1412,7 +1565,7 @@ void ath9k_release_buffered_frames(struc 
     1122@@ -1412,7 +1566,7 @@ void ath9k_release_buffered_frames(struc 
    11151123                        sent++; 
    11161124                        TX_STAT_INC(txq->axq_qnum, a_queued_hw); 
     
    11211129                } 
    11221130                ath_txq_unlock_complete(sc, tid->ac->txq); 
    1123 @@ -1571,7 +1724,7 @@ static void ath_drain_txq_list(struct at 
     1131@@ -1571,7 +1725,7 @@ static void ath_drain_txq_list(struct at 
    11241132        while (!list_empty(list)) { 
    11251133                bf = list_first_entry(list, struct ath_buf, list); 
     
    11301138  
    11311139                        ath_tx_return_buffer(sc, bf); 
    1132 @@ -1665,25 +1818,27 @@ void ath_tx_cleanupq(struct ath_softc *s 
     1140@@ -1665,25 +1819,27 @@ void ath_tx_cleanupq(struct ath_softc *s 
    11331141  */ 
    11341142 void ath_txq_schedule(struct ath_softc *sc, struct ath_txq *txq) 
     
    11631171                                               list); 
    11641172                        list_del(&tid->list); 
    1165 @@ -1692,17 +1847,17 @@ void ath_txq_schedule(struct ath_softc * 
     1173@@ -1692,17 +1848,17 @@ void ath_txq_schedule(struct ath_softc * 
    11661174                        if (tid->paused) 
    11671175                                continue; 
     
    11851193                } 
    11861194  
    1187 @@ -1711,9 +1866,17 @@ void ath_txq_schedule(struct ath_softc * 
     1195@@ -1711,9 +1867,17 @@ void ath_txq_schedule(struct ath_softc * 
    11881196                        list_add_tail(&ac->list, &txq->axq_acq); 
    11891197                } 
     
    12051213  
    12061214        rcu_read_unlock(); 
    1207 @@ -1792,57 +1955,6 @@ static void ath_tx_txqaddbuf(struct ath_ 
     1215@@ -1792,57 +1956,6 @@ static void ath_tx_txqaddbuf(struct ath_ 
    12081216        } 
    12091217 } 
     
    12631271                               struct ath_atx_tid *tid, struct sk_buff *skb) 
    12641272 { 
    1265 @@ -1985,6 +2097,7 @@ static int ath_tx_prepare(struct ieee802 
     1273@@ -1985,6 +2098,7 @@ static int ath_tx_prepare(struct ieee802 
    12661274        struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 
    12671275        struct ieee80211_sta *sta = txctl->sta; 
     
    12711279        int frmlen = skb->len + FCS_LEN; 
    12721280        int padpos, padsize; 
    1273 @@ -1992,6 +2105,10 @@ static int ath_tx_prepare(struct ieee802 
     1281@@ -1992,6 +2106,10 @@ static int ath_tx_prepare(struct ieee802 
    12741282        /* NOTE:  sta can be NULL according to net/mac80211.h */ 
    12751283        if (sta) 
     
    12821290        if (info->control.hw_key) 
    12831291                frmlen += info->control.hw_key->icv_len; 
    1284 @@ -2041,7 +2158,6 @@ int ath_tx_start(struct ieee80211_hw *hw 
     1292@@ -2041,7 +2159,6 @@ int ath_tx_start(struct ieee80211_hw *hw 
    12851293        struct ath_txq *txq = txctl->txq; 
    12861294        struct ath_atx_tid *tid = NULL; 
     
    12901298        int ret; 
    12911299  
    1292 @@ -2069,27 +2185,31 @@ int ath_tx_start(struct ieee80211_hw *hw 
     1300@@ -2069,27 +2186,31 @@ int ath_tx_start(struct ieee80211_hw *hw 
    12931301                ath_txq_unlock(sc, txq); 
    12941302                txq = sc->tx.uapsdq; 
     
    13331341                        dev_kfree_skb_any(skb); 
    13341342                else 
    1335 @@ -2142,7 +2262,7 @@ void ath_tx_cabq(struct ieee80211_hw *hw 
     1343@@ -2142,7 +2263,7 @@ void ath_tx_cabq(struct ieee80211_hw *hw 
    13361344  
    13371345                bf->bf_lastbf = bf; 
     
    13421350                if (bf_tail) 
    13431351                        bf_tail->bf_next = bf; 
    1344 @@ -2189,7 +2309,7 @@ static void ath_tx_complete(struct ath_s 
     1352@@ -2189,7 +2310,7 @@ static void ath_tx_complete(struct ath_s 
    13451353        struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb); 
    13461354        struct ath_common *common = ath9k_hw_common(sc->sc_ah); 
     
    13511359  
    13521360        ath_dbg(common, XMIT, "TX complete: skb: %p\n", skb); 
    1353 @@ -2225,21 +2345,7 @@ static void ath_tx_complete(struct ath_s 
     1361@@ -2225,21 +2346,7 @@ static void ath_tx_complete(struct ath_s 
    13541362        spin_unlock_irqrestore(&sc->sc_pm_lock, flags); 
    13551363  
     
    13741382  
    13751383 static void ath_tx_complete_buf(struct ath_softc *sc, struct ath_buf *bf, 
    1376 @@ -2360,8 +2466,7 @@ static void ath_tx_processq(struct ath_s 
     1384@@ -2360,8 +2467,7 @@ static void ath_tx_processq(struct ath_s 
    13771385  
    13781386                if (list_empty(&txq->axq_q)) { 
     
    13841392                } 
    13851393                bf = list_first_entry(&txq->axq_q, struct ath_buf, list); 
    1386 @@ -2375,7 +2480,7 @@ static void ath_tx_processq(struct ath_s 
     1394@@ -2375,7 +2481,7 @@ static void ath_tx_processq(struct ath_s 
    13871395                 * it with the STALE flag. 
    13881396                 */ 
     
    13931401                        if (list_is_last(&bf_held->list, &txq->axq_q)) 
    13941402                                break; 
    1395 @@ -2399,7 +2504,7 @@ static void ath_tx_processq(struct ath_s 
     1403@@ -2399,7 +2505,7 @@ static void ath_tx_processq(struct ath_s 
    13961404                 * however leave the last descriptor back as the holding 
    13971405                 * descriptor for hw. 
     
    14021410                if (!list_is_singular(&lastbf->list)) 
    14031411                        list_cut_position(&bf_head, 
    1404 @@ -2470,7 +2575,7 @@ void ath_tx_edma_tasklet(struct ath_soft 
     1412@@ -2470,7 +2576,7 @@ void ath_tx_edma_tasklet(struct ath_soft 
    14051413                } 
    14061414  
     
    14111419                        ath_tx_return_buffer(sc, bf); 
    14121420                        bf = list_first_entry(fifo_list, struct ath_buf, list); 
    1413 @@ -2492,7 +2597,7 @@ void ath_tx_edma_tasklet(struct ath_soft 
     1421@@ -2492,7 +2598,7 @@ void ath_tx_edma_tasklet(struct ath_soft 
    14141422                                ath_tx_txqaddbuf(sc, txq, &bf_q, true); 
    14151423                        } 
     
    14201428                                list_cut_position(&bf_head, fifo_list, 
    14211429                                                  lastbf->list.prev); 
    1422 @@ -2583,6 +2688,7 @@ void ath_tx_node_init(struct ath_softc * 
     1430@@ -2583,6 +2689,7 @@ void ath_tx_node_init(struct ath_softc * 
    14231431                tid->paused    = false; 
    14241432                tid->active        = false; 
     
    14281436                tid->ac = &an->ac[acno]; 
    14291437        } 
    1430 @@ -2590,6 +2696,7 @@ void ath_tx_node_init(struct ath_softc * 
     1438@@ -2590,6 +2697,7 @@ void ath_tx_node_init(struct ath_softc * 
    14311439        for (acno = 0, ac = &an->ac[acno]; 
    14321440             acno < IEEE80211_NUM_ACS; acno++, ac++) { 
Note: See TracChangeset for help on using the changeset viewer.