Changeset 40780


Ignore:
Timestamp:
2014-05-19T21:51:45+02:00 (4 years ago)
Author:
nbd
Message:

ath9k: add some rx path fixes

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

Location:
trunk/package/kernel/mac80211/patches
Files:
5 edited

Legend:

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

    r40696 r40780  
     1commit 230ab8c1880266c9cfceac962e2d48309dea79a7 
     2Author: Felix Fietkau <nbd@openwrt.org> 
     3Date:   Mon May 19 21:48:56 2014 +0200 
     4 
     5    ath9k: re-schedule rx processing after budget exceeded 
     6     
     7    Should improve rx stability under load 
     8     
     9    Signed-off-by: Felix Fietkau <nbd@openwrt.org> 
     10 
     11commit 27647baeaee1b12bc3c57ccf1c7eba53bcd7fe53 
     12Author: Felix Fietkau <nbd@openwrt.org> 
     13Date:   Mon May 19 21:20:49 2014 +0200 
     14 
     15    ath9k: avoid passing buffers to the hardware during flush 
     16     
     17    The commit "ath9k: fix possible hang on flush" changed the receive code 
     18    to always link rx descriptors of processed frames, even when flushing. 
     19    In some cases, this leads to flushed rx buffers being passed to the 
     20    hardware while rx is already stopped. 
     21     
     22    Signed-off-by: Felix Fietkau <nbd@openwrt.org> 
     23 
    124commit 92e9dd662542683856e62a5e7e43fcf5b9da5c4a 
    225Author: Henning Rogge <hrogge@gmail.com> 
     
    360383--- a/drivers/net/wireless/ath/ath9k/recv.c 
    361384+++ b/drivers/net/wireless/ath/ath9k/recv.c 
    362 @@ -975,6 +975,7 @@ int ath_rx_tasklet(struct ath_softc *sc, 
     385@@ -34,7 +34,8 @@ static inline bool ath9k_check_auto_slee 
     386  * buffer (or rx fifo). This can incorrectly acknowledge packets 
     387  * to a sender if last desc is self-linked. 
     388  */ 
     389-static void ath_rx_buf_link(struct ath_softc *sc, struct ath_rxbuf *bf) 
     390+static void ath_rx_buf_link(struct ath_softc *sc, struct ath_rxbuf *bf, 
     391+                           bool flush) 
     392 { 
     393        struct ath_hw *ah = sc->sc_ah; 
     394        struct ath_common *common = ath9k_hw_common(ah); 
     395@@ -59,18 +60,19 @@ static void ath_rx_buf_link(struct ath_s 
     396                             common->rx_bufsize, 
     397                             0); 
     398  
     399-       if (sc->rx.rxlink == NULL) 
     400-               ath9k_hw_putrxbuf(ah, bf->bf_daddr); 
     401-       else 
     402+       if (sc->rx.rxlink) 
     403                *sc->rx.rxlink = bf->bf_daddr; 
     404+       else if (!flush) 
     405+               ath9k_hw_putrxbuf(ah, bf->bf_daddr); 
     406  
     407        sc->rx.rxlink = &ds->ds_link; 
     408 } 
     409  
     410-static void ath_rx_buf_relink(struct ath_softc *sc, struct ath_rxbuf *bf) 
     411+static void ath_rx_buf_relink(struct ath_softc *sc, struct ath_rxbuf *bf, 
     412+                             bool flush) 
     413 { 
     414        if (sc->rx.buf_hold) 
     415-               ath_rx_buf_link(sc, sc->rx.buf_hold); 
     416+               ath_rx_buf_link(sc, sc->rx.buf_hold, flush); 
     417  
     418        sc->rx.buf_hold = bf; 
     419 } 
     420@@ -106,7 +108,7 @@ static void ath_opmode_init(struct ath_s 
     421 } 
     422  
     423 static bool ath_rx_edma_buf_link(struct ath_softc *sc, 
     424-                                enum ath9k_rx_qtype qtype) 
     425+                                enum ath9k_rx_qtype qtype, bool flush) 
     426 { 
     427        struct ath_hw *ah = sc->sc_ah; 
     428        struct ath_rx_edma *rx_edma; 
     429@@ -127,7 +129,8 @@ static bool ath_rx_edma_buf_link(struct  
     430                                ah->caps.rx_status_len, DMA_TO_DEVICE); 
     431  
     432        SKB_CB_ATHBUF(skb) = bf; 
     433-       ath9k_hw_addrxbuf_edma(ah, bf->bf_buf_addr, qtype); 
     434+       if (!flush) 
     435+               ath9k_hw_addrxbuf_edma(ah, bf->bf_buf_addr, qtype); 
     436        __skb_queue_tail(&rx_edma->rx_fifo, skb); 
     437  
     438        return true; 
     439@@ -145,7 +148,7 @@ static void ath_rx_addbuffer_edma(struct 
     440        } 
     441  
     442        list_for_each_entry_safe(bf, tbf, &sc->rx.rxbuf, list) 
     443-               if (!ath_rx_edma_buf_link(sc, qtype)) 
     444+               if (!ath_rx_edma_buf_link(sc, qtype, false)) 
     445                        break; 
     446  
     447 } 
     448@@ -442,7 +445,7 @@ int ath_startrecv(struct ath_softc *sc) 
     449        sc->rx.buf_hold = NULL; 
     450        sc->rx.rxlink = NULL; 
     451        list_for_each_entry_safe(bf, tbf, &sc->rx.rxbuf, list) { 
     452-               ath_rx_buf_link(sc, bf); 
     453+               ath_rx_buf_link(sc, bf, false); 
     454        } 
     455  
     456        /* We could have deleted elements so the list may be empty now */ 
     457@@ -636,7 +639,7 @@ static bool ath_edma_get_buffers(struct  
     458        if (ret == -EINVAL) { 
     459                /* corrupt descriptor, skip this one and the following one */ 
     460                list_add_tail(&bf->list, &sc->rx.rxbuf); 
     461-               ath_rx_edma_buf_link(sc, qtype); 
     462+               ath_rx_edma_buf_link(sc, qtype, false); 
     463  
     464                skb = skb_peek(&rx_edma->rx_fifo); 
     465                if (skb) { 
     466@@ -645,7 +648,7 @@ static bool ath_edma_get_buffers(struct  
     467  
     468                        __skb_unlink(skb, &rx_edma->rx_fifo); 
     469                        list_add_tail(&bf->list, &sc->rx.rxbuf); 
     470-                       ath_rx_edma_buf_link(sc, qtype); 
     471+                       ath_rx_edma_buf_link(sc, qtype, false); 
     472                } 
     473  
     474                bf = NULL; 
     475@@ -975,6 +978,7 @@ int ath_rx_tasklet(struct ath_softc *sc, 
    363476        u64 tsf = 0; 
    364477        unsigned long flags; 
     
    368481        if (edma) 
    369482                dma_type = DMA_BIDIRECTIONAL; 
    370 @@ -1113,15 +1114,17 @@ requeue_drop_frag: 
     483@@ -1113,15 +1117,17 @@ requeue_drop_frag: 
    371484                } 
    372485 requeue: 
     
    376489  
    377490                if (edma) { 
    378                         ath_rx_edma_buf_link(sc, qtype); 
     491-                       ath_rx_edma_buf_link(sc, qtype); 
     492+                       ath_rx_edma_buf_link(sc, qtype, flush); 
    379493                } else { 
    380                         ath_rx_buf_relink(sc, bf); 
     494-                       ath_rx_buf_relink(sc, bf); 
    381495-                       ath9k_hw_rxena(ah); 
     496+                       ath_rx_buf_relink(sc, bf, flush); 
    382497+                       if (!flush) 
    383498+                               ath9k_hw_rxena(ah); 
     
    389504  
    390505        if (!(ah->imask & ATH9K_INT_RXEOL)) { 
     506@@ -1129,5 +1135,5 @@ requeue: 
     507                ath9k_hw_set_interrupts(ah); 
     508        } 
     509  
     510-       return 0; 
     511+       return !budget; 
     512 } 
    391513--- a/drivers/net/wireless/ath/ath9k/ahb.c 
    392514+++ b/drivers/net/wireless/ath/ath9k/ahb.c 
     
    566688                                sta->last_rx_rate_flag = status->flag; 
    567689                                sta->last_rx_rate_vht_flag = status->vht_flag; 
     690--- a/drivers/net/wireless/ath/ath9k/main.c 
     691+++ b/drivers/net/wireless/ath/ath9k/main.c 
     692@@ -442,6 +442,8 @@ void ath9k_tasklet(unsigned long data) 
     693        ath9k_ps_wakeup(sc); 
     694        spin_lock(&sc->sc_pcu_lock); 
     695  
     696+       sc->intrstatus = 0; 
     697+ 
     698        if (status & ATH9K_INT_FATAL) { 
     699                type = RESET_TYPE_FATAL_INT; 
     700                ath9k_queue_reset(sc, type); 
     701@@ -510,10 +512,12 @@ void ath9k_tasklet(unsigned long data) 
     702        if (status & rxmask) { 
     703                /* Check for high priority Rx first */ 
     704                if ((ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) && 
     705-                   (status & ATH9K_INT_RXHP)) 
     706-                       ath_rx_tasklet(sc, 0, true); 
     707+                   (status & ATH9K_INT_RXHP) && 
     708+                   ath_rx_tasklet(sc, 0, true)) 
     709+                       sc->intrstatus |= ATH9K_INT_RXHP; 
     710  
     711-               ath_rx_tasklet(sc, 0, false); 
     712+               if (ath_rx_tasklet(sc, 0, false)) 
     713+                       sc->intrstatus |= ATH9K_INT_RXLP; 
     714        } 
     715  
     716        if (status & ATH9K_INT_TX) { 
     717@@ -541,6 +545,9 @@ void ath9k_tasklet(unsigned long data) 
     718  
     719        /* re-enable hardware interrupt */ 
     720        ath9k_hw_enable_interrupts(ah); 
     721+       if (sc->intrstatus) 
     722+               tasklet_schedule(&sc->intr_tq); 
     723+ 
     724 out: 
     725        spin_unlock(&sc->sc_pcu_lock); 
     726        ath9k_ps_restore(sc); 
     727@@ -607,7 +614,7 @@ irqreturn_t ath_isr(int irq, void *dev) 
     728                return IRQ_NONE; 
     729  
     730        /* Cache the status */ 
     731-       sc->intrstatus = status; 
     732+       sc->intrstatus |= status; 
     733  
     734        if (status & SCHED_INTR) 
     735                sched = true; 
  • trunk/package/kernel/mac80211/patches/521-ath9k_cur_txpower.patch

    r40393 r40780  
    1515 out: 
    1616        spin_unlock_bh(&sc->sc_pcu_lock); 
    17 @@ -1370,6 +1374,7 @@ static int ath9k_config(struct ieee80211 
     17@@ -1377,6 +1381,7 @@ static int ath9k_config(struct ieee80211 
    1818                sc->config.txpowlimit = 2 * conf->power_level; 
    1919                ath9k_cmn_update_txpow(ah, sc->curtxpow, 
  • trunk/package/kernel/mac80211/patches/523-ath9k_use_configured_antenna_gain.patch

    r40393 r40780  
    2222--- a/drivers/net/wireless/ath/ath9k/main.c 
    2323+++ b/drivers/net/wireless/ath/ath9k/main.c 
    24 @@ -1370,7 +1370,10 @@ static int ath9k_config(struct ieee80211 
     24@@ -1377,7 +1377,10 @@ static int ath9k_config(struct ieee80211 
    2525        } 
    2626  
  • trunk/package/kernel/mac80211/patches/542-ath9k_debugfs_diag.patch

    r40393 r40780  
    126126--- a/drivers/net/wireless/ath/ath9k/main.c 
    127127+++ b/drivers/net/wireless/ath/ath9k/main.c 
    128 @@ -603,6 +603,11 @@ irqreturn_t ath_isr(int irq, void *dev) 
     128@@ -610,6 +610,11 @@ irqreturn_t ath_isr(int irq, void *dev) 
    129129        ath9k_debug_sync_cause(sc, sync_cause); 
    130130        status &= ah->imask;    /* discard unasked-for bits */ 
  • trunk/package/kernel/mac80211/patches/552-ath9k_p2p_ps_support.patch

    r40687 r40780  
    2828 } 
    2929  
    30 @@ -1128,6 +1130,8 @@ static int ath9k_add_interface(struct ie 
     30@@ -1135,6 +1137,8 @@ static int ath9k_add_interface(struct ie 
    3131        if (ath9k_uses_beacons(vif->type)) 
    3232                ath9k_beacon_assign_slot(sc, vif); 
     
    3737        an->sta = NULL; 
    3838        an->vif = vif; 
    39 @@ -1172,6 +1176,29 @@ static int ath9k_change_interface(struct 
     39@@ -1179,6 +1183,29 @@ static int ath9k_change_interface(struct 
    4040        return 0; 
    4141 } 
     
    6767                                   struct ieee80211_vif *vif) 
    6868 { 
    69 @@ -1183,6 +1210,13 @@ static void ath9k_remove_interface(struc 
     69@@ -1190,6 +1217,13 @@ static void ath9k_remove_interface(struc 
    7070  
    7171        mutex_lock(&sc->mutex); 
     
    8181        sc->tx99_vif = NULL; 
    8282  
    83 @@ -1649,6 +1683,72 @@ static void ath9k_bss_assoc_iter(void *d 
     83@@ -1656,6 +1690,72 @@ static void ath9k_bss_assoc_iter(void *d 
    8484                ath9k_set_assoc_state(sc, vif); 
    8585 } 
     
    154154                                   struct ieee80211_vif *vif, 
    155155                                   struct ieee80211_bss_conf *bss_conf, 
    156 @@ -1723,6 +1823,12 @@ static void ath9k_bss_info_changed(struc 
     156@@ -1730,6 +1830,12 @@ static void ath9k_bss_info_changed(struc 
    157157                } 
    158158        } 
     
    238238--- a/drivers/net/wireless/ath/ath9k/recv.c 
    239239+++ b/drivers/net/wireless/ath/ath9k/recv.c 
    240 @@ -539,6 +539,9 @@ static void ath_rx_ps_beacon(struct ath_ 
     240@@ -542,6 +542,9 @@ static void ath_rx_ps_beacon(struct ath_ 
    241241                ath_dbg(common, PS, 
    242242                        "Reconfigure beacon timers based on synchronized timestamp\n"); 
Note: See TracChangeset for help on using the changeset viewer.