Changeset 28114


Ignore:
Timestamp:
2011-08-29T11:55:16+02:00 (6 years ago)
Author:
nbd
Message:

ath9k: fix processing of rx frames on channel change

Location:
trunk/package/mac80211/patches
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/package/mac80211/patches/581-ath9k_merge_reset_functions.patch

    r28108 r28114  
    11--- a/drivers/net/wireless/ath/ath9k/main.c 
    22+++ b/drivers/net/wireless/ath/ath9k/main.c 
    3 @@ -212,83 +212,39 @@ static int ath_update_survey_stats(struc 
     3@@ -212,83 +212,45 @@ static int ath_update_survey_stats(struc 
    44        return ret; 
    55 } 
     
    1212-static int ath_set_channel(struct ath_softc *sc, struct ieee80211_hw *hw, 
    1313-                   struct ath9k_channel *hchan) 
    14 +static bool ath_prepare_reset(struct ath_softc *sc, bool retry_tx) 
     14+static bool ath_prepare_reset(struct ath_softc *sc, bool retry_tx, bool flush) 
    1515 { 
    1616        struct ath_hw *ah = sc->sc_ah; 
     
    5353-       if (!ath_stoprecv(sc)) 
    5454-               stopped = false; 
    55 - 
     55+       ret = ath_drain_all_txq(sc, retry_tx); 
     56  
    5657-       if (!ath9k_hw_check_alive(ah)) 
    5758-               stopped = false; 
     
    6061-        * to flush data frames already in queue because of 
    6162-        * changing channel. */ 
    62 +       ret = ath_drain_all_txq(sc, retry_tx); 
    63   
     63- 
    6464-       if (!stopped || !(sc->sc_flags & SC_OP_OFFCHANNEL)) 
    6565-               fastcc = false; 
     
    6969-       if (!(sc->sc_flags & SC_OP_OFFCHANNEL)) 
    7070-               caldata = &sc->caldata; 
    71 +       ath_flushrecv(sc); 
     71+       if (!flush) { 
     72+               if (ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) 
     73+                       ath_rx_tasklet(sc, 0, true); 
     74+               ath_rx_tasklet(sc, 0, false); 
     75+       } else { 
     76+               ath_flushrecv(sc); 
     77+       } 
    7278  
    7379-       ath_dbg(common, ATH_DBG_CONFIG, 
     
    99105  
    100106        ath9k_cmn_update_txpow(ah, sc->curtxpow, 
    101 @@ -296,21 +252,87 @@ static int ath_set_channel(struct ath_so 
     107@@ -296,21 +258,89 @@ static int ath_set_channel(struct ath_so 
    102108        ath9k_hw_set_interrupts(ah, ah->imask); 
    103109        ath9k_hw_enable_interrupts(ah); 
     
    128134+       struct ath9k_hw_cal_data *caldata = NULL; 
    129135+       bool fastcc = true; 
     136+       bool flush = false; 
    130137+       int r; 
    131138+ 
     
    134141+               caldata = &sc->caldata; 
    135142+       } 
    136   
     143+ 
    137144+       if (!hchan) { 
    138145+               fastcc = false; 
     146+               flush = true; 
    139147+               hchan = ah->curchan; 
    140148+       } 
     
    143151+               fastcc = false; 
    144152+ 
    145 +       if (!ath_prepare_reset(sc, retry_tx)) 
     153+       if (!ath_prepare_reset(sc, retry_tx, flush)) 
    146154+               fastcc = false; 
    147155+ 
     
    165173+} 
    166174+ 
    167 + 
     175  
    168176+/* 
    169177+ * Set/change channels.  If the channel is really being changed, it's done 
     
    190198 } 
    191199  
    192 @@ -893,28 +915,13 @@ static void ath_radio_enable(struct ath_ 
     200@@ -893,28 +923,13 @@ static void ath_radio_enable(struct ath_ 
    193201                        channel->center_freq, r); 
    194202        } 
     
    220228  
    221229        ath9k_ps_restore(sc); 
    222 @@ -942,13 +949,7 @@ void ath_radio_disable(struct ath_softc  
     230@@ -927,12 +942,8 @@ void ath_radio_disable(struct ath_softc  
     231        int r; 
     232  
     233        ath9k_ps_wakeup(sc); 
     234-       cancel_delayed_work_sync(&sc->hw_pll_work); 
     235- 
     236        spin_lock_bh(&sc->sc_pcu_lock); 
     237  
     238-       ieee80211_stop_queues(hw); 
     239- 
     240        /* 
     241         * Keep the LED on when the radio is disabled 
     242         * during idle unassociated state. 
     243@@ -942,13 +953,7 @@ void ath_radio_disable(struct ath_softc  
    223244                ath9k_hw_cfg_gpio_input(ah, ah->led_pin); 
    224245        } 
     
    231252-       ath_stoprecv(sc);               /* turn off frame recv */ 
    232253-       ath_flushrecv(sc);              /* flush recv queue */ 
    233 +       ath_prepare_reset(sc, false); 
     254+       ath_prepare_reset(sc, false, true); 
    234255  
    235256        if (!ah->curchan) 
    236257                ah->curchan = ath9k_cmn_get_curchannel(hw, ah); 
    237 @@ -970,48 +971,11 @@ void ath_radio_disable(struct ath_softc  
     258@@ -970,48 +975,11 @@ void ath_radio_disable(struct ath_softc  
    238259  
    239260 int ath_reset(struct ath_softc *sc, bool retry_tx) 
     
    285306        if (retry_tx) { 
    286307                int i; 
    287 @@ -1024,12 +988,6 @@ int ath_reset(struct ath_softc *sc, bool 
     308@@ -1024,12 +992,6 @@ int ath_reset(struct ath_softc *sc, bool 
    288309                } 
    289310        } 
     
    298319  
    299320        return r; 
    300 @@ -1081,28 +1039,6 @@ static int ath9k_start(struct ieee80211_ 
     321@@ -1081,28 +1043,6 @@ static int ath9k_start(struct ieee80211_ 
    301322                goto mutex_unlock; 
    302323        } 
     
    327348        ah->imask = ATH9K_INT_TX | ATH9K_INT_RXEOL | 
    328349                    ATH9K_INT_RXORN | ATH9K_INT_FATAL | 
    329 @@ -1125,12 +1061,14 @@ static int ath9k_start(struct ieee80211_ 
     350@@ -1125,12 +1065,14 @@ static int ath9k_start(struct ieee80211_ 
    330351  
    331352        /* Disable BMISS interrupt when we're not associated */ 
  • trunk/package/mac80211/patches/582-ath9k_antenna_control.patch

    r28109 r28114  
    7676--- a/drivers/net/wireless/ath/ath9k/main.c 
    7777+++ b/drivers/net/wireless/ath/ath9k/main.c 
    78 @@ -262,6 +262,22 @@ static bool ath_complete_reset(struct at 
     78@@ -268,6 +268,22 @@ static bool ath_complete_reset(struct at 
    7979                        ath_start_ani(common); 
    8080        } 
     
    9999  
    100100        return true; 
    101 @@ -2360,6 +2376,59 @@ static int ath9k_get_stats(struct ieee80 
     101@@ -2364,6 +2380,59 @@ static int ath9k_get_stats(struct ieee80 
    102102        return 0; 
    103103 } 
     
    159159        .tx                 = ath9k_tx, 
    160160        .start              = ath9k_start, 
    161 @@ -2386,4 +2455,6 @@ struct ieee80211_ops ath9k_ops = { 
     161@@ -2390,4 +2459,6 @@ struct ieee80211_ops ath9k_ops = { 
    162162        .tx_frames_pending  = ath9k_tx_frames_pending, 
    163163        .tx_last_beacon     = ath9k_tx_last_beacon, 
Note: See TracChangeset for help on using the changeset viewer.