rtlwifi: btcoex: 23b 2ant: add pnp notidy to avoid LPS/IPS mismatch
authorYan-Hsuan Chuang <yhchuang@realtek.com>
Tue, 4 Apr 2017 16:49:59 +0000 (11:49 -0500)
committerKalle Valo <kvalo@codeaurora.org>
Thu, 13 Apr 2017 14:08:36 +0000 (17:08 +0300)
When driver is going to sleep, it does not leave LPS/IPS, thus the
BTCoex may have mismatch when driver wakes up. To avoid that, BTCoex
needs to clear the IPS/LPS state when it receives a pnp notify, then
it can properly set up the hw when driver wakes up.

Signed-off-by: Yan-Hsuan Chuang <yhchuang@realtek.com>
Cc: Pkshih <pkshih@realtek.com>
Cc: Birming Chiu <birming@realtek.com>
Cc: Shaofu <shaofu@realtek.com>
Cc: Steven Ting <steventing@realtek.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8723b2ant.c

index e0b6dfa938fa17fd0218b9e607c5d788aabce400..d599e659930c2f8090641aa9388b8b458dcf9c25 100644 (file)
@@ -3826,6 +3826,33 @@ void ex_btc8723b2ant_halt_notify(struct btc_coexist *btcoexist)
        ex_btc8723b2ant_media_status_notify(btcoexist, BTC_MEDIA_DISCONNECT);
 }
 
+void ex_btc8723b2ant_pnp_notify(struct btc_coexist *btcoexist, u8 pnp_state)
+{
+       struct rtl_priv *rtlpriv = btcoexist->adapter;
+
+       RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, "[BTCoex], Pnp notify\n");
+
+       if (pnp_state == BTC_WIFI_PNP_SLEEP) {
+               RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
+                        "[BTCoex], Pnp notify to SLEEP\n");
+
+               /* Driver do not leave IPS/LPS when driver is going to sleep, so
+                * BTCoexistence think wifi is still under IPS/LPS
+                *
+                * BT should clear UnderIPS/UnderLPS state to avoid mismatch
+                * state after wakeup.
+                */
+               coex_sta->under_ips = false;
+               coex_sta->under_lps = false;
+       } else if (pnp_state == BTC_WIFI_PNP_WAKE_UP) {
+               RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
+                        "[BTCoex], Pnp notify to WAKE UP\n");
+               ex_btc8723b2ant_init_hwconfig(btcoexist);
+               btc8723b2ant_init_coex_dm(btcoexist);
+               btc8723b2ant_query_bt_info(btcoexist);
+       }
+}
+
 void ex_btc8723b2ant_periodical(struct btc_coexist *btcoexist)
 {
        struct rtl_priv *rtlpriv = btcoexist->adapter;