diff options
author | Sujith Manoharan <c_manoha@qca.qualcomm.com> | 2012-06-04 06:57:58 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2012-06-06 15:20:26 -0400 |
commit | e6930c4b32aaa30fb9510984509afcc9f61fa39c (patch) | |
tree | 952d8ef600b7e03509ec30b6e7a9fd85d9445b2f /drivers/net/wireless/ath/ath9k/gpio.c | |
parent | 4cb54fa3a2456e66d8e3bae663d66f00cbb9e483 (diff) |
ath9k: Use separate operational flags for BTCOEX
Also, use atomic operations to check the flags.
Signed-off-by: Sujith Manoharan <c_manoha@qca.qualcomm.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/ath/ath9k/gpio.c')
-rw-r--r-- | drivers/net/wireless/ath/ath9k/gpio.c | 23 |
1 files changed, 12 insertions, 11 deletions
diff --git a/drivers/net/wireless/ath/ath9k/gpio.c b/drivers/net/wireless/ath/ath9k/gpio.c index 281a9af0f1b6..9397a6d2ed5d 100644 --- a/drivers/net/wireless/ath/ath9k/gpio.c +++ b/drivers/net/wireless/ath/ath9k/gpio.c | |||
@@ -132,17 +132,18 @@ static void ath_detect_bt_priority(struct ath_softc *sc) | |||
132 | 132 | ||
133 | if (time_after(jiffies, btcoex->bt_priority_time + | 133 | if (time_after(jiffies, btcoex->bt_priority_time + |
134 | msecs_to_jiffies(ATH_BT_PRIORITY_TIME_THRESHOLD))) { | 134 | msecs_to_jiffies(ATH_BT_PRIORITY_TIME_THRESHOLD))) { |
135 | sc->sc_flags &= ~(SC_OP_BT_PRIORITY_DETECTED | SC_OP_BT_SCAN); | 135 | clear_bit(BT_OP_PRIORITY_DETECTED, &btcoex->op_flags); |
136 | clear_bit(BT_OP_SCAN, &btcoex->op_flags); | ||
136 | /* Detect if colocated bt started scanning */ | 137 | /* Detect if colocated bt started scanning */ |
137 | if (btcoex->bt_priority_cnt >= ATH_BT_CNT_SCAN_THRESHOLD) { | 138 | if (btcoex->bt_priority_cnt >= ATH_BT_CNT_SCAN_THRESHOLD) { |
138 | ath_dbg(ath9k_hw_common(sc->sc_ah), BTCOEX, | 139 | ath_dbg(ath9k_hw_common(sc->sc_ah), BTCOEX, |
139 | "BT scan detected\n"); | 140 | "BT scan detected\n"); |
140 | sc->sc_flags |= (SC_OP_BT_SCAN | | 141 | set_bit(BT_OP_PRIORITY_DETECTED, &btcoex->op_flags); |
141 | SC_OP_BT_PRIORITY_DETECTED); | 142 | set_bit(BT_OP_SCAN, &btcoex->op_flags); |
142 | } else if (btcoex->bt_priority_cnt >= ATH_BT_CNT_THRESHOLD) { | 143 | } else if (btcoex->bt_priority_cnt >= ATH_BT_CNT_THRESHOLD) { |
143 | ath_dbg(ath9k_hw_common(sc->sc_ah), BTCOEX, | 144 | ath_dbg(ath9k_hw_common(sc->sc_ah), BTCOEX, |
144 | "BT priority traffic detected\n"); | 145 | "BT priority traffic detected\n"); |
145 | sc->sc_flags |= SC_OP_BT_PRIORITY_DETECTED; | 146 | set_bit(BT_OP_PRIORITY_DETECTED, &btcoex->op_flags); |
146 | } | 147 | } |
147 | 148 | ||
148 | btcoex->bt_priority_cnt = 0; | 149 | btcoex->bt_priority_cnt = 0; |
@@ -196,7 +197,7 @@ static void ath_btcoex_period_timer(unsigned long data) | |||
196 | ath9k_ps_wakeup(sc); | 197 | ath9k_ps_wakeup(sc); |
197 | if (!(ah->caps.hw_caps & ATH9K_HW_CAP_MCI)) | 198 | if (!(ah->caps.hw_caps & ATH9K_HW_CAP_MCI)) |
198 | ath_detect_bt_priority(sc); | 199 | ath_detect_bt_priority(sc); |
199 | is_btscan = sc->sc_flags & SC_OP_BT_SCAN; | 200 | is_btscan = test_bit(BT_OP_SCAN, &btcoex->op_flags); |
200 | 201 | ||
201 | spin_lock_bh(&btcoex->btcoex_lock); | 202 | spin_lock_bh(&btcoex->btcoex_lock); |
202 | 203 | ||
@@ -219,8 +220,7 @@ static void ath_btcoex_period_timer(unsigned long data) | |||
219 | 220 | ||
220 | ath9k_ps_restore(sc); | 221 | ath9k_ps_restore(sc); |
221 | timer_period = btcoex->btcoex_period / 1000; | 222 | timer_period = btcoex->btcoex_period / 1000; |
222 | mod_timer(&btcoex->period_timer, jiffies + | 223 | mod_timer(&btcoex->period_timer, jiffies + msecs_to_jiffies(timer_period)); |
223 | msecs_to_jiffies(timer_period)); | ||
224 | } | 224 | } |
225 | 225 | ||
226 | /* | 226 | /* |
@@ -233,14 +233,14 @@ static void ath_btcoex_no_stomp_timer(void *arg) | |||
233 | struct ath_hw *ah = sc->sc_ah; | 233 | struct ath_hw *ah = sc->sc_ah; |
234 | struct ath_btcoex *btcoex = &sc->btcoex; | 234 | struct ath_btcoex *btcoex = &sc->btcoex; |
235 | struct ath_common *common = ath9k_hw_common(ah); | 235 | struct ath_common *common = ath9k_hw_common(ah); |
236 | bool is_btscan = sc->sc_flags & SC_OP_BT_SCAN; | ||
237 | 236 | ||
238 | ath_dbg(common, BTCOEX, "no stomp timer running\n"); | 237 | ath_dbg(common, BTCOEX, "no stomp timer running\n"); |
239 | 238 | ||
240 | ath9k_ps_wakeup(sc); | 239 | ath9k_ps_wakeup(sc); |
241 | spin_lock_bh(&btcoex->btcoex_lock); | 240 | spin_lock_bh(&btcoex->btcoex_lock); |
242 | 241 | ||
243 | if (btcoex->bt_stomp_type == ATH_BTCOEX_STOMP_LOW || is_btscan) | 242 | if (btcoex->bt_stomp_type == ATH_BTCOEX_STOMP_LOW || |
243 | test_bit(BT_OP_SCAN, &btcoex->op_flags)) | ||
244 | ath9k_hw_btcoex_bt_stomp(ah, ATH_BTCOEX_STOMP_NONE); | 244 | ath9k_hw_btcoex_bt_stomp(ah, ATH_BTCOEX_STOMP_NONE); |
245 | else if (btcoex->bt_stomp_type == ATH_BTCOEX_STOMP_ALL) | 245 | else if (btcoex->bt_stomp_type == ATH_BTCOEX_STOMP_ALL) |
246 | ath9k_hw_btcoex_bt_stomp(ah, ATH_BTCOEX_STOMP_LOW); | 246 | ath9k_hw_btcoex_bt_stomp(ah, ATH_BTCOEX_STOMP_LOW); |
@@ -292,7 +292,7 @@ void ath9k_btcoex_timer_resume(struct ath_softc *sc) | |||
292 | 292 | ||
293 | btcoex->bt_priority_cnt = 0; | 293 | btcoex->bt_priority_cnt = 0; |
294 | btcoex->bt_priority_time = jiffies; | 294 | btcoex->bt_priority_time = jiffies; |
295 | sc->sc_flags &= ~(SC_OP_BT_PRIORITY_DETECTED | SC_OP_BT_SCAN); | 295 | btcoex->op_flags &= ~(BT_OP_PRIORITY_DETECTED | BT_OP_SCAN); |
296 | 296 | ||
297 | mod_timer(&btcoex->period_timer, jiffies); | 297 | mod_timer(&btcoex->period_timer, jiffies); |
298 | } | 298 | } |
@@ -316,12 +316,13 @@ void ath9k_btcoex_timer_pause(struct ath_softc *sc) | |||
316 | 316 | ||
317 | u16 ath9k_btcoex_aggr_limit(struct ath_softc *sc, u32 max_4ms_framelen) | 317 | u16 ath9k_btcoex_aggr_limit(struct ath_softc *sc, u32 max_4ms_framelen) |
318 | { | 318 | { |
319 | struct ath_btcoex *btcoex = &sc->btcoex; | ||
319 | struct ath_mci_profile *mci = &sc->btcoex.mci; | 320 | struct ath_mci_profile *mci = &sc->btcoex.mci; |
320 | u16 aggr_limit = 0; | 321 | u16 aggr_limit = 0; |
321 | 322 | ||
322 | if ((sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_MCI) && mci->aggr_limit) | 323 | if ((sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_MCI) && mci->aggr_limit) |
323 | aggr_limit = (max_4ms_framelen * mci->aggr_limit) >> 4; | 324 | aggr_limit = (max_4ms_framelen * mci->aggr_limit) >> 4; |
324 | else if (sc->sc_flags & SC_OP_BT_PRIORITY_DETECTED) | 325 | else if (test_bit(BT_OP_PRIORITY_DETECTED, &btcoex->op_flags)) |
325 | aggr_limit = min((max_4ms_framelen * 3) / 8, | 326 | aggr_limit = min((max_4ms_framelen * 3) / 8, |
326 | (u32)ATH_AMPDU_LIMIT_MAX); | 327 | (u32)ATH_AMPDU_LIMIT_MAX); |
327 | 328 | ||