ath9k: merge a fix for a race condition on init
authorFelix Fietkau <nbd@openwrt.org>
Tue, 29 Apr 2014 15:52:08 +0000 (15:52 +0000)
committerFelix Fietkau <nbd@openwrt.org>
Tue, 29 Apr 2014 15:52:08 +0000 (15:52 +0000)
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
SVN-Revision: 40591

package/kernel/mac80211/patches/300-pending_work.patch
package/kernel/mac80211/patches/502-ath9k_ahb_init.patch
package/kernel/mac80211/patches/530-ath9k_extra_leds.patch
package/kernel/mac80211/patches/550-ath9k_entropy_from_adc.patch
package/kernel/mac80211/patches/552-ath9k_p2p_ps_support.patch

index d6d042d460b23a99a947cdb6f95114890e2f5eee..1405cc3d720258c66652673b5d60ad24ec01a41e 100644 (file)
@@ -1,3 +1,18 @@
+commit 8c7ae357cc5b6bd037ad2d666e9f3789cf882925
+Author: Rajkumar Manoharan <rmanohar@qti.qualcomm.com>
+Date:   Wed Apr 23 15:07:57 2014 +0530
+
+    ath9k: fix race in setting ATH_OP_INVALID
+    
+    The commit "ath9k: move sc_flags to ath_common" moved setting
+    ATH_OP_INVALID flag below ieee80211_register_hw. This is causing
+    the flag never being cleared randomly as the drv_start is called
+    prior to setting flag. Fix this by setting the flag prior to
+    register_hw.
+    
+    Signed-off-by: Rajkumar Manoharan <rmanohar@qti.qualcomm.com>
+    Signed-off-by: John W. Linville <linville@tuxdriver.com>
+
 commit c82552c5b0cb1735dbcbad78b1ffc6d3c212dc56
 Author: Tim Harvey <tharvey@gateworks.com>
 Date:   Mon Apr 21 16:14:57 2014 -0700
@@ -308,3 +323,56 @@ Date:   Sun Apr 6 23:35:28 2014 +0200
        } while (1);
  
        if (!(ah->imask & ATH9K_INT_RXEOL)) {
+--- a/drivers/net/wireless/ath/ath9k/ahb.c
++++ b/drivers/net/wireless/ath/ath9k/ahb.c
+@@ -86,7 +86,6 @@ static int ath_ahb_probe(struct platform
+       int irq;
+       int ret = 0;
+       struct ath_hw *ah;
+-      struct ath_common *common;
+       char hw_name[64];
+       if (!dev_get_platdata(&pdev->dev)) {
+@@ -146,9 +145,6 @@ static int ath_ahb_probe(struct platform
+       wiphy_info(hw->wiphy, "%s mem=0x%lx, irq=%d\n",
+                  hw_name, (unsigned long)mem, irq);
+-      common = ath9k_hw_common(sc->sc_ah);
+-      /* Will be cleared in ath9k_start() */
+-      set_bit(ATH_OP_INVALID, &common->op_flags);
+       return 0;
+  err_irq:
+--- a/drivers/net/wireless/ath/ath9k/init.c
++++ b/drivers/net/wireless/ath/ath9k/init.c
+@@ -781,6 +781,9 @@ int ath9k_init_device(u16 devid, struct 
+       common = ath9k_hw_common(ah);
+       ath9k_set_hw_capab(sc, hw);
++      /* Will be cleared in ath9k_start() */
++      set_bit(ATH_OP_INVALID, &common->op_flags);
++
+       /* Initialize regulatory */
+       error = ath_regd_init(&common->regulatory, sc->hw->wiphy,
+                             ath9k_reg_notifier);
+--- a/drivers/net/wireless/ath/ath9k/pci.c
++++ b/drivers/net/wireless/ath/ath9k/pci.c
+@@ -784,7 +784,6 @@ static int ath_pci_probe(struct pci_dev 
+ {
+       struct ath_softc *sc;
+       struct ieee80211_hw *hw;
+-      struct ath_common *common;
+       u8 csz;
+       u32 val;
+       int ret = 0;
+@@ -877,10 +876,6 @@ static int ath_pci_probe(struct pci_dev 
+       wiphy_info(hw->wiphy, "%s mem=0x%lx, irq=%d\n",
+                  hw_name, (unsigned long)sc->mem, pdev->irq);
+-      /* Will be cleared in ath9k_start() */
+-      common = ath9k_hw_common(sc->sc_ah);
+-      set_bit(ATH_OP_INVALID, &common->op_flags);
+-
+       return 0;
+ err_init:
index 43c3260b8004531283e3ab8513a721fda8bedae1..c1bdc6f925fe7cc9c41b0926f8ed46d8c97b4458 100644 (file)
@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath9k/init.c
 +++ b/drivers/net/wireless/ath/ath9k/init.c
-@@ -892,23 +892,23 @@ static int __init ath9k_init(void)
+@@ -895,23 +895,23 @@ static int __init ath9k_init(void)
  {
        int error;
  
index fb24f03b0269799b8683e20c9ab2abccad1730ba..1174a47092763cbc9a1f30429ee68685b637e6f4 100644 (file)
  void ath_fill_led_pin(struct ath_softc *sc)
 --- a/drivers/net/wireless/ath/ath9k/init.c
 +++ b/drivers/net/wireless/ath/ath9k/init.c
-@@ -806,7 +806,7 @@ int ath9k_init_device(u16 devid, struct 
+@@ -809,7 +809,7 @@ int ath9k_init_device(u16 devid, struct 
  
  #ifdef CPTCFG_MAC80211_LEDS
        /* must be initialized before ieee80211_register_hw */
index 54f5ced4c2da36e40c9f0e9d300b5a19b333141e..513c48d799a268b1d2e443d893a2b2c406bd8166 100644 (file)
@@ -84,7 +84,7 @@
  int ath9k_init_device(u16 devid, struct ath_softc *sc,
                    const struct ath_bus_ops *bus_ops)
  {
-@@ -813,6 +826,8 @@ int ath9k_init_device(u16 devid, struct 
+@@ -816,6 +829,8 @@ int ath9k_init_device(u16 devid, struct 
                ARRAY_SIZE(ath9k_tpt_blink));
  #endif
  
index 1bd0a54112369dfa89ef0e12d9ec90ee5f78dadc..e066a3808c82f442793f150317b872d85b048f56 100644 (file)
@@ -225,7 +225,7 @@ Signed-off-by: Felix Fietkau <nbd@openwrt.org>
        ath9k_cmn_init_crypto(sc->sc_ah);
        ath9k_init_misc(sc);
        ath_fill_led_pin(sc);
-@@ -870,6 +873,9 @@ static void ath9k_deinit_softc(struct at
+@@ -873,6 +876,9 @@ static void ath9k_deinit_softc(struct at
  {
        int i = 0;