diff options
Diffstat (limited to 'drivers/net/wireless/ath/ath9k/gpio.c')
-rw-r--r-- | drivers/net/wireless/ath/ath9k/gpio.c | 30 |
1 files changed, 22 insertions, 8 deletions
diff --git a/drivers/net/wireless/ath/ath9k/gpio.c b/drivers/net/wireless/ath/ath9k/gpio.c index e204bd25ff65..deab8beb0680 100644 --- a/drivers/net/wireless/ath/ath9k/gpio.c +++ b/drivers/net/wireless/ath/ath9k/gpio.c | |||
@@ -230,12 +230,17 @@ static void ath_detect_bt_priority(struct ath_softc *sc) | |||
230 | 230 | ||
231 | if (time_after(jiffies, btcoex->bt_priority_time + | 231 | if (time_after(jiffies, btcoex->bt_priority_time + |
232 | msecs_to_jiffies(ATH_BT_PRIORITY_TIME_THRESHOLD))) { | 232 | msecs_to_jiffies(ATH_BT_PRIORITY_TIME_THRESHOLD))) { |
233 | if (btcoex->bt_priority_cnt >= ATH_BT_CNT_THRESHOLD) { | 233 | sc->sc_flags &= ~(SC_OP_BT_PRIORITY_DETECTED | SC_OP_BT_SCAN); |
234 | /* Detect if colocated bt started scanning */ | ||
235 | if (btcoex->bt_priority_cnt >= ATH_BT_CNT_SCAN_THRESHOLD) { | ||
236 | ath_print(ath9k_hw_common(sc->sc_ah), ATH_DBG_BTCOEX, | ||
237 | "BT scan detected"); | ||
238 | sc->sc_flags |= (SC_OP_BT_SCAN | | ||
239 | SC_OP_BT_PRIORITY_DETECTED); | ||
240 | } else if (btcoex->bt_priority_cnt >= ATH_BT_CNT_THRESHOLD) { | ||
234 | ath_print(ath9k_hw_common(sc->sc_ah), ATH_DBG_BTCOEX, | 241 | ath_print(ath9k_hw_common(sc->sc_ah), ATH_DBG_BTCOEX, |
235 | "BT priority traffic detected"); | 242 | "BT priority traffic detected"); |
236 | sc->sc_flags |= SC_OP_BT_PRIORITY_DETECTED; | 243 | sc->sc_flags |= SC_OP_BT_PRIORITY_DETECTED; |
237 | } else { | ||
238 | sc->sc_flags &= ~SC_OP_BT_PRIORITY_DETECTED; | ||
239 | } | 244 | } |
240 | 245 | ||
241 | btcoex->bt_priority_cnt = 0; | 246 | btcoex->bt_priority_cnt = 0; |
@@ -316,12 +321,17 @@ static void ath_btcoex_period_timer(unsigned long data) | |||
316 | struct ath_softc *sc = (struct ath_softc *) data; | 321 | struct ath_softc *sc = (struct ath_softc *) data; |
317 | struct ath_hw *ah = sc->sc_ah; | 322 | struct ath_hw *ah = sc->sc_ah; |
318 | struct ath_btcoex *btcoex = &sc->btcoex; | 323 | struct ath_btcoex *btcoex = &sc->btcoex; |
324 | u32 timer_period; | ||
325 | bool is_btscan; | ||
319 | 326 | ||
320 | ath_detect_bt_priority(sc); | 327 | ath_detect_bt_priority(sc); |
321 | 328 | ||
329 | is_btscan = sc->sc_flags & SC_OP_BT_SCAN; | ||
330 | |||
322 | spin_lock_bh(&btcoex->btcoex_lock); | 331 | spin_lock_bh(&btcoex->btcoex_lock); |
323 | 332 | ||
324 | ath9k_btcoex_bt_stomp(sc, btcoex->bt_stomp_type); | 333 | ath9k_btcoex_bt_stomp(sc, is_btscan ? ATH_BTCOEX_STOMP_ALL : |
334 | btcoex->bt_stomp_type); | ||
325 | 335 | ||
326 | spin_unlock_bh(&btcoex->btcoex_lock); | 336 | spin_unlock_bh(&btcoex->btcoex_lock); |
327 | 337 | ||
@@ -329,11 +339,12 @@ static void ath_btcoex_period_timer(unsigned long data) | |||
329 | if (btcoex->hw_timer_enabled) | 339 | if (btcoex->hw_timer_enabled) |
330 | ath9k_gen_timer_stop(ah, btcoex->no_stomp_timer); | 340 | ath9k_gen_timer_stop(ah, btcoex->no_stomp_timer); |
331 | 341 | ||
342 | timer_period = is_btscan ? btcoex->btscan_no_stomp : | ||
343 | btcoex->btcoex_no_stomp; | ||
332 | ath9k_gen_timer_start(ah, | 344 | ath9k_gen_timer_start(ah, |
333 | btcoex->no_stomp_timer, | 345 | btcoex->no_stomp_timer, |
334 | (ath9k_hw_gettsf32(ah) + | 346 | (ath9k_hw_gettsf32(ah) + |
335 | btcoex->btcoex_no_stomp), | 347 | timer_period), timer_period * 10); |
336 | btcoex->btcoex_no_stomp * 10); | ||
337 | btcoex->hw_timer_enabled = true; | 348 | btcoex->hw_timer_enabled = true; |
338 | } | 349 | } |
339 | 350 | ||
@@ -350,13 +361,14 @@ static void ath_btcoex_no_stomp_timer(void *arg) | |||
350 | struct ath_softc *sc = (struct ath_softc *)arg; | 361 | struct ath_softc *sc = (struct ath_softc *)arg; |
351 | struct ath_hw *ah = sc->sc_ah; | 362 | struct ath_hw *ah = sc->sc_ah; |
352 | struct ath_btcoex *btcoex = &sc->btcoex; | 363 | struct ath_btcoex *btcoex = &sc->btcoex; |
364 | bool is_btscan = sc->sc_flags & SC_OP_BT_SCAN; | ||
353 | 365 | ||
354 | ath_print(ath9k_hw_common(ah), ATH_DBG_BTCOEX, | 366 | ath_print(ath9k_hw_common(ah), ATH_DBG_BTCOEX, |
355 | "no stomp timer running \n"); | 367 | "no stomp timer running \n"); |
356 | 368 | ||
357 | spin_lock_bh(&btcoex->btcoex_lock); | 369 | spin_lock_bh(&btcoex->btcoex_lock); |
358 | 370 | ||
359 | if (btcoex->bt_stomp_type == ATH_BTCOEX_STOMP_LOW) | 371 | if (btcoex->bt_stomp_type == ATH_BTCOEX_STOMP_LOW || is_btscan) |
360 | ath9k_btcoex_bt_stomp(sc, ATH_BTCOEX_STOMP_NONE); | 372 | ath9k_btcoex_bt_stomp(sc, ATH_BTCOEX_STOMP_NONE); |
361 | else if (btcoex->bt_stomp_type == ATH_BTCOEX_STOMP_ALL) | 373 | else if (btcoex->bt_stomp_type == ATH_BTCOEX_STOMP_ALL) |
362 | ath9k_btcoex_bt_stomp(sc, ATH_BTCOEX_STOMP_LOW); | 374 | ath9k_btcoex_bt_stomp(sc, ATH_BTCOEX_STOMP_LOW); |
@@ -371,6 +383,8 @@ int ath_init_btcoex_timer(struct ath_softc *sc) | |||
371 | btcoex->btcoex_period = ATH_BTCOEX_DEF_BT_PERIOD * 1000; | 383 | btcoex->btcoex_period = ATH_BTCOEX_DEF_BT_PERIOD * 1000; |
372 | btcoex->btcoex_no_stomp = (100 - ATH_BTCOEX_DEF_DUTY_CYCLE) * | 384 | btcoex->btcoex_no_stomp = (100 - ATH_BTCOEX_DEF_DUTY_CYCLE) * |
373 | btcoex->btcoex_period / 100; | 385 | btcoex->btcoex_period / 100; |
386 | btcoex->btscan_no_stomp = (100 - ATH_BTCOEX_BTSCAN_DUTY_CYCLE) * | ||
387 | btcoex->btcoex_period / 100; | ||
374 | 388 | ||
375 | setup_timer(&btcoex->period_timer, ath_btcoex_period_timer, | 389 | setup_timer(&btcoex->period_timer, ath_btcoex_period_timer, |
376 | (unsigned long) sc); | 390 | (unsigned long) sc); |
@@ -405,7 +419,7 @@ void ath9k_btcoex_timer_resume(struct ath_softc *sc) | |||
405 | 419 | ||
406 | btcoex->bt_priority_cnt = 0; | 420 | btcoex->bt_priority_cnt = 0; |
407 | btcoex->bt_priority_time = jiffies; | 421 | btcoex->bt_priority_time = jiffies; |
408 | sc->sc_flags &= ~SC_OP_BT_PRIORITY_DETECTED; | 422 | sc->sc_flags &= ~(SC_OP_BT_PRIORITY_DETECTED | SC_OP_BT_SCAN); |
409 | 423 | ||
410 | mod_timer(&btcoex->period_timer, jiffies); | 424 | mod_timer(&btcoex->period_timer, jiffies); |
411 | } | 425 | } |