diff options
author | Rajkumar Manoharan <rmanohar@qti.qualcomm.com> | 2014-04-23 05:37:57 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2014-04-24 21:46:22 -0400 |
commit | 8c7ae357cc5b6bd037ad2d666e9f3789cf882925 (patch) | |
tree | a4bce2f031a1ddc0120a5afd58eea55ed2dce55a /drivers/net/wireless | |
parent | c82552c5b0cb1735dbcbad78b1ffc6d3c212dc56 (diff) |
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>
Diffstat (limited to 'drivers/net/wireless')
-rw-r--r-- | drivers/net/wireless/ath/ath9k/ahb.c | 4 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/init.c | 3 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/pci.c | 5 |
3 files changed, 3 insertions, 9 deletions
diff --git a/drivers/net/wireless/ath/ath9k/ahb.c b/drivers/net/wireless/ath/ath9k/ahb.c index a0398fe3eb28..be3eb2a8d602 100644 --- 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_device *pdev) | |||
86 | int irq; | 86 | int irq; |
87 | int ret = 0; | 87 | int ret = 0; |
88 | struct ath_hw *ah; | 88 | struct ath_hw *ah; |
89 | struct ath_common *common; | ||
90 | char hw_name[64]; | 89 | char hw_name[64]; |
91 | 90 | ||
92 | if (!dev_get_platdata(&pdev->dev)) { | 91 | if (!dev_get_platdata(&pdev->dev)) { |
@@ -146,9 +145,6 @@ static int ath_ahb_probe(struct platform_device *pdev) | |||
146 | wiphy_info(hw->wiphy, "%s mem=0x%lx, irq=%d\n", | 145 | wiphy_info(hw->wiphy, "%s mem=0x%lx, irq=%d\n", |
147 | hw_name, (unsigned long)mem, irq); | 146 | hw_name, (unsigned long)mem, irq); |
148 | 147 | ||
149 | common = ath9k_hw_common(sc->sc_ah); | ||
150 | /* Will be cleared in ath9k_start() */ | ||
151 | set_bit(ATH_OP_INVALID, &common->op_flags); | ||
152 | return 0; | 148 | return 0; |
153 | 149 | ||
154 | err_irq: | 150 | err_irq: |
diff --git a/drivers/net/wireless/ath/ath9k/init.c b/drivers/net/wireless/ath/ath9k/init.c index cbbb02a6b13b..36ae6490e554 100644 --- a/drivers/net/wireless/ath/ath9k/init.c +++ b/drivers/net/wireless/ath/ath9k/init.c | |||
@@ -783,6 +783,9 @@ int ath9k_init_device(u16 devid, struct ath_softc *sc, | |||
783 | common = ath9k_hw_common(ah); | 783 | common = ath9k_hw_common(ah); |
784 | ath9k_set_hw_capab(sc, hw); | 784 | ath9k_set_hw_capab(sc, hw); |
785 | 785 | ||
786 | /* Will be cleared in ath9k_start() */ | ||
787 | set_bit(ATH_OP_INVALID, &common->op_flags); | ||
788 | |||
786 | /* Initialize regulatory */ | 789 | /* Initialize regulatory */ |
787 | error = ath_regd_init(&common->regulatory, sc->hw->wiphy, | 790 | error = ath_regd_init(&common->regulatory, sc->hw->wiphy, |
788 | ath9k_reg_notifier); | 791 | ath9k_reg_notifier); |
diff --git a/drivers/net/wireless/ath/ath9k/pci.c b/drivers/net/wireless/ath/ath9k/pci.c index 25304adece57..914dbc6b1720 100644 --- 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 *pdev, const struct pci_device_id *id) | |||
784 | { | 784 | { |
785 | struct ath_softc *sc; | 785 | struct ath_softc *sc; |
786 | struct ieee80211_hw *hw; | 786 | struct ieee80211_hw *hw; |
787 | struct ath_common *common; | ||
788 | u8 csz; | 787 | u8 csz; |
789 | u32 val; | 788 | u32 val; |
790 | int ret = 0; | 789 | int ret = 0; |
@@ -877,10 +876,6 @@ static int ath_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) | |||
877 | wiphy_info(hw->wiphy, "%s mem=0x%lx, irq=%d\n", | 876 | wiphy_info(hw->wiphy, "%s mem=0x%lx, irq=%d\n", |
878 | hw_name, (unsigned long)sc->mem, pdev->irq); | 877 | hw_name, (unsigned long)sc->mem, pdev->irq); |
879 | 878 | ||
880 | /* Will be cleared in ath9k_start() */ | ||
881 | common = ath9k_hw_common(sc->sc_ah); | ||
882 | set_bit(ATH_OP_INVALID, &common->op_flags); | ||
883 | |||
884 | return 0; | 879 | return 0; |
885 | 880 | ||
886 | err_init: | 881 | err_init: |