Changeset 29132


Ignore:
Timestamp:
2011-11-14T22:21:03+01:00 (6 years ago)
Author:
nbd
Message:

ath9k: rework radio stop/start cleanup, avoid duplicate rx/tx stop, avoid early phy stop

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

Legend:

Unmodified
Added
Removed
  • trunk/package/mac80211/patches/560-ath9k_fix_radio_stop.patch

    r28772 r29132  
    11--- a/drivers/net/wireless/ath/ath9k/main.c 
    22+++ b/drivers/net/wireless/ath/ath9k/main.c 
    3 @@ -124,14 +124,14 @@ void ath9k_ps_restore(struct ath_softc * 
    4                  !(sc->ps_flags & (PS_WAIT_FOR_BEACON | 
    5                               PS_WAIT_FOR_CAB | 
    6                               PS_WAIT_FOR_PSPOLL_DATA | 
    7 -                             PS_WAIT_FOR_TX_ACK))) 
    8 +                             PS_WAIT_FOR_TX_ACK))) { 
    9                 mode = ATH9K_PM_NETWORK_SLEEP; 
    10 -       else 
    11 -               goto unlock; 
    12   
    13 -       spin_lock(&common->cc_lock); 
    14 -       ath_hw_cycle_counters_update(common); 
    15 -       spin_unlock(&common->cc_lock); 
    16 +               spin_lock(&common->cc_lock); 
    17 +               ath_hw_cycle_counters_update(common); 
    18 +               spin_unlock(&common->cc_lock); 
    19 +       } else 
    20 +               goto unlock; 
    21   
    22         ath9k_hw_setpower(sc->sc_ah, mode); 
    23   
    243@@ -880,82 +880,6 @@ chip_reset: 
    254 #undef SCHED_INTR 
     
    132111  
    133112        if ((ah->btcoex_hw.scheme != ATH_BTCOEX_CFG_NONE) && 
    134 @@ -1260,9 +1197,6 @@ static void ath9k_stop(struct ieee80211_ 
     113@@ -1248,33 +1185,39 @@ static void ath9k_stop(struct ieee80211_ 
     114         * before setting the invalid flag. */ 
     115        ath9k_hw_disable_interrupts(ah); 
     116  
     117-       if (!(sc->sc_flags & SC_OP_INVALID)) { 
     118-               ath_drain_all_txq(sc, false); 
     119-               ath_stoprecv(sc); 
     120-               ath9k_hw_phy_disable(ah); 
     121-       } else 
     122-               sc->rx.rxlink = NULL; 
     123+       spin_unlock_bh(&sc->sc_pcu_lock); 
     124+ 
     125+       /* we can now sync irq and kill any running tasklets, since we already 
     126+        * disabled interrupts and not holding a spin lock */ 
     127+       synchronize_irq(sc->irq); 
     128+       tasklet_kill(&sc->intr_tq); 
     129+       tasklet_kill(&sc->bcon_tasklet); 
     130+ 
     131+       sc->ps_idle = true; 
     132+ 
     133+       spin_lock_bh(&sc->sc_pcu_lock); 
     134+ 
     135+       ath9k_hw_set_gpio(ah, ah->led_pin, 1); 
     136+       ath9k_hw_cfg_gpio_input(ah, ah->led_pin); 
     137+ 
     138+       ath_prepare_reset(sc, false, true); 
     139  
     140        if (sc->rx.frag) { 
     141                dev_kfree_skb_any(sc->rx.frag); 
    135142                sc->rx.frag = NULL; 
    136143        } 
     
    138145-       /* disable HAL and put h/w to sleep */ 
    139146-       ath9k_hw_disable(ah); 
    140 - 
    141         spin_unlock_bh(&sc->sc_pcu_lock); 
    142   
    143         /* we can now sync irq and kill any running tasklets, since we already 
    144 @@ -1271,10 +1205,27 @@ static void ath9k_stop(struct ieee80211_ 
    145         tasklet_kill(&sc->intr_tq); 
    146         tasklet_kill(&sc->bcon_tasklet); 
    147   
    148 -       ath9k_ps_restore(sc); 
    149 - 
    150         sc->ps_idle = true; 
    151 -       ath_radio_disable(sc, hw); 
    152 + 
    153 +       spin_lock_bh(&sc->sc_pcu_lock); 
    154 + 
    155 +       ath9k_hw_set_gpio(ah, ah->led_pin, 1); 
    156 +       ath9k_hw_cfg_gpio_input(ah, ah->led_pin); 
    157 + 
    158 +       ath_prepare_reset(sc, false, true); 
    159 + 
    160147+       if (!ah->curchan) 
    161148+               ah->curchan = ath9k_cmn_get_curchannel(hw, ah); 
    162 + 
     149  
     150-       spin_unlock_bh(&sc->sc_pcu_lock); 
    163151+       ath9k_hw_reset(ah, ah->curchan, ah->caldata, false); 
    164152+       ath9k_hw_phy_disable(ah); 
    165 +       ath9k_hw_disable(ah); 
    166 + 
     153  
     154-       /* we can now sync irq and kill any running tasklets, since we already 
     155-        * disabled interrupts and not holding a spin lock */ 
     156-       synchronize_irq(sc->irq); 
     157-       tasklet_kill(&sc->intr_tq); 
     158-       tasklet_kill(&sc->bcon_tasklet); 
    167159+       ath9k_hw_configpcipowersave(ah, true); 
    168 + 
     160  
     161-       ath9k_ps_restore(sc); 
    169162+       spin_unlock_bh(&sc->sc_pcu_lock); 
    170 + 
     163  
     164-       sc->ps_idle = true; 
     165-       ath_radio_disable(sc, hw); 
    171166+       ath9k_ps_restore(sc); 
    172167  
    173168        sc->sc_flags |= SC_OP_INVALID; 
    174169  
    175 @@ -1598,8 +1549,8 @@ static int ath9k_config(struct ieee80211 
     170@@ -1598,8 +1541,8 @@ static int ath9k_config(struct ieee80211 
    176171        struct ath_hw *ah = sc->sc_ah; 
    177172        struct ath_common *common = ath9k_hw_common(ah); 
     
    183178  
    184179        /* 
    185 @@ -1608,16 +1559,8 @@ static int ath9k_config(struct ieee80211 
     180@@ -1608,16 +1551,8 @@ static int ath9k_config(struct ieee80211 
    186181         * of the changes. Likewise we must only disable the radio towards 
    187182         * the end. 
     
    201196        /* 
    202197         * We just prepare to enable PS. We have to wait until our AP has 
    203 @@ -1742,19 +1685,13 @@ static int ath9k_config(struct ieee80211 
     198@@ -1742,19 +1677,13 @@ static int ath9k_config(struct ieee80211 
    204199                ath_dbg(common, ATH_DBG_CONFIG, 
    205200                        "Set power: %d\n", conf->power_level); 
     
    224219--- a/drivers/net/wireless/ath/ath9k/pci.c 
    225220+++ b/drivers/net/wireless/ath/ath9k/pci.c 
    226 @@ -302,26 +302,12 @@ static void ath_pci_remove(struct pci_de 
    227   
    228  static int ath_pci_suspend(struct device *device) 
    229  { 
    230 -       struct pci_dev *pdev = to_pci_dev(device); 
    231 -       struct ieee80211_hw *hw = pci_get_drvdata(pdev); 
    232 -       struct ath_softc *sc = hw->priv; 
    233 - 
     221@@ -306,12 +306,11 @@ static int ath_pci_suspend(struct device 
     222        struct ieee80211_hw *hw = pci_get_drvdata(pdev); 
     223        struct ath_softc *sc = hw->priv; 
     224  
    234225-       ath9k_hw_set_gpio(sc->sc_ah, sc->sc_ah->led_pin, 1); 
    235226- 
    236 -       /* The device has to be moved to FULLSLEEP forcibly. 
    237 -        * Otherwise the chip never moved to full sleep, 
    238 -        * when no interface is up. 
    239 -        */ 
    240 -       ath9k_hw_setpower(sc->sc_ah, ATH9K_PM_FULL_SLEEP); 
    241 - 
     227        /* The device has to be moved to FULLSLEEP forcibly. 
     228         * Otherwise the chip never moved to full sleep, 
     229         * when no interface is up. 
     230         */ 
     231+       ath9k_hw_disable(sc->sc_ah); 
     232        ath9k_hw_setpower(sc->sc_ah, ATH9K_PM_FULL_SLEEP); 
     233  
    242234        return 0; 
    243  } 
    244   
    245  static int ath_pci_resume(struct device *device) 
    246  { 
    247         struct pci_dev *pdev = to_pci_dev(device); 
    248 -       struct ieee80211_hw *hw = pci_get_drvdata(pdev); 
    249 -       struct ath_softc *sc = hw->priv; 
    250         u32 val; 
    251   
    252         /* 
    253 @@ -333,22 +319,6 @@ static int ath_pci_resume(struct device  
     235@@ -333,22 +332,6 @@ static int ath_pci_resume(struct device  
    254236        if ((val & 0x0000ff00) != 0) 
    255237                pci_write_config_dword(pdev, 0x40, val & 0xffff00ff); 
  • trunk/package/mac80211/patches/561-ath9k_fix_flush.patch

    r28772 r29132  
    11--- a/drivers/net/wireless/ath/ath9k/main.c 
    22+++ b/drivers/net/wireless/ath/ath9k/main.c 
    3 @@ -2259,9 +2259,6 @@ static void ath9k_flush(struct ieee80211 
     3@@ -2251,9 +2251,6 @@ static void ath9k_flush(struct ieee80211 
    44                return; 
    55        } 
     
    1111                bool npend = false; 
    1212  
    13 @@ -2279,21 +2276,22 @@ static void ath9k_flush(struct ieee80211 
     13@@ -2271,21 +2268,22 @@ static void ath9k_flush(struct ieee80211 
    1414                } 
    1515  
  • trunk/package/mac80211/patches/562-ath9k_fix_led.patch

    r28809 r29132  
    1616        /* 
    1717         * Reset key cache to sane defaults (all entries cleared) instead of 
    18 @@ -1209,8 +1211,10 @@ static void ath9k_stop(struct ieee80211_ 
     18@@ -1197,8 +1199,10 @@ static void ath9k_stop(struct ieee80211_ 
    1919  
    2020        spin_lock_bh(&sc->sc_pcu_lock); 
Note: See TracChangeset for help on using the changeset viewer.