rtlwifi: Fix a2dp choppy while BT RSSI stays on threshold.
authorPing-Ke Shih <pkshih@realtek.com>
Wed, 21 Jun 2017 17:15:31 +0000 (12:15 -0500)
committerKalle Valo <kvalo@codeaurora.org>
Wed, 28 Jun 2017 17:50:58 +0000 (20:50 +0300)
In this case, BTC asks to enter/leave PS mode frequently to cause A2DP
choppy.

Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net>
Cc: Yan-Hsuan Chuang <yhchuang@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/ps.c
drivers/net/wireless/realtek/rtlwifi/rtl8192ee/fw.c
drivers/net/wireless/realtek/rtlwifi/rtl8723be/fw.c
drivers/net/wireless/realtek/rtlwifi/rtl8821ae/fw.c

index 0d152877d9698e47e222d7509179855f3f43c0d1..07ee3096f50e25f2a6cc264c9341982277f1017a 100644 (file)
@@ -356,7 +356,7 @@ void rtl_lps_set_psmode(struct ieee80211_hw *hw, u8 rt_psmode)
        if (mac->link_state != MAC80211_LINKED)
                return;
 
-       if (ppsc->dot11_psmode == rt_psmode)
+       if (ppsc->dot11_psmode == rt_psmode && rt_psmode == EACTIVE)
                return;
 
        /* Update power save mode configured. */
@@ -438,11 +438,13 @@ static void rtl_lps_enter_core(struct ieee80211_hw *hw)
 
        spin_lock_irqsave(&rtlpriv->locks.lps_lock, flag);
 
-       if (ppsc->dot11_psmode == EACTIVE) {
-               RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
-                        "Enter 802.11 power save mode...\n");
-               rtl_lps_set_psmode(hw, EAUTOPS);
-       }
+       /* Don't need to check (ppsc->dot11_psmode == EACTIVE), because
+        * bt_ccoexist may ask to enter lps.
+        * In normal case, this constraint move to rtl_lps_set_psmode().
+        */
+       RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
+                "Enter 802.11 power save mode...\n");
+       rtl_lps_set_psmode(hw, EAUTOPS);
 
        spin_unlock_irqrestore(&rtlpriv->locks.lps_lock, flag);
 }
index 379dbc158dfcf118473402335882a06419f76aa0..f5d4df985c37361b35e2fd1cd082e519b7256004 100644 (file)
@@ -427,6 +427,11 @@ void rtl92ee_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode)
        struct rtl_btc_ops *btc_ops = rtlpriv->btcoexist.btc_ops;
        bool bt_ctrl_lps = (rtlpriv->cfg->ops->get_btc_status() ?
                            btc_ops->btc_is_bt_ctrl_lps(rtlpriv) : false);
+       bool bt_lps_on = (rtlpriv->cfg->ops->get_btc_status() ?
+                         btc_ops->btc_is_bt_lps_on(rtlpriv) : false);
+
+       if (bt_ctrl_lps)
+               mode = (bt_lps_on ? FW_PS_MIN_MODE : FW_PS_ACTIVE_MODE);
 
        RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG, "FW LPS mode = %d (coex:%d)\n",
                 mode, bt_ctrl_lps);
@@ -482,8 +487,9 @@ void rtl92ee_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode)
        SET_H2CCMD_PWRMODE_PARM_MODE(u1_h2c_set_pwrmode, ((mode) ? 1 : 0));
        SET_H2CCMD_PWRMODE_PARM_RLBM(u1_h2c_set_pwrmode, rlbm);
        SET_H2CCMD_PWRMODE_PARM_SMART_PS(u1_h2c_set_pwrmode,
-                                        (rtlpriv->mac80211.p2p) ?
-                                        ppsc->smart_ps : 1);
+                                        bt_ctrl_lps ? 0 :
+                                        ((rtlpriv->mac80211.p2p) ?
+                                         ppsc->smart_ps : 1));
        SET_H2CCMD_PWRMODE_PARM_AWAKE_INTERVAL(u1_h2c_set_pwrmode,
                                               awake_intvl);
        SET_H2CCMD_PWRMODE_PARM_ALL_QUEUE_UAPSD(u1_h2c_set_pwrmode, 0);
index eb440a850643c9ff55f23487beaf560e5c6604a8..dd6f95cfaec98ec924210b2be441a75a863eb517 100644 (file)
@@ -245,6 +245,11 @@ void rtl8723be_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode)
        struct rtl_btc_ops *btc_ops = rtlpriv->btcoexist.btc_ops;
        bool bt_ctrl_lps = (rtlpriv->cfg->ops->get_btc_status() ?
                            btc_ops->btc_is_bt_ctrl_lps(rtlpriv) : false);
+       bool bt_lps_on = (rtlpriv->cfg->ops->get_btc_status() ?
+                         btc_ops->btc_is_bt_lps_on(rtlpriv) : false);
+
+       if (bt_ctrl_lps)
+               mode = (bt_lps_on ? FW_PS_MIN_MODE : FW_PS_ACTIVE_MODE);
 
        RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG, "FW LPS mode = %d (coex:%d)\n",
                 mode, bt_ctrl_lps);
@@ -300,8 +305,7 @@ void rtl8723be_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode)
        SET_H2CCMD_PWRMODE_PARM_MODE(u1_h2c_set_pwrmode, ((mode) ? 1 : 0));
        SET_H2CCMD_PWRMODE_PARM_RLBM(u1_h2c_set_pwrmode, rlbm);
        SET_H2CCMD_PWRMODE_PARM_SMART_PS(u1_h2c_set_pwrmode,
-                                        (rtlpriv->mac80211.p2p) ?
-                                         ppsc->smart_ps : 1);
+                                        bt_ctrl_lps ? 0 : ppsc->smart_ps);
        SET_H2CCMD_PWRMODE_PARM_AWAKE_INTERVAL(u1_h2c_set_pwrmode,
                                               awake_intvl);
        SET_H2CCMD_PWRMODE_PARM_ALL_QUEUE_UAPSD(u1_h2c_set_pwrmode, 0);
index 87818d2ccc4e37a0072870ad6ba715ba49b25be8..03259aa150fdd1a35125780579427f600be7ff72 100644 (file)
@@ -494,6 +494,11 @@ void rtl8821ae_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode)
        struct rtl_btc_ops *btc_ops = rtlpriv->btcoexist.btc_ops;
        bool bt_ctrl_lps = (rtlpriv->cfg->ops->get_btc_status() ?
                            btc_ops->btc_is_bt_ctrl_lps(rtlpriv) : false);
+       bool bt_lps_on = (rtlpriv->cfg->ops->get_btc_status() ?
+                         btc_ops->btc_is_bt_lps_on(rtlpriv) : false);
+
+       if (bt_ctrl_lps)
+               mode = (bt_lps_on ? FW_PS_MIN_MODE : FW_PS_ACTIVE_MODE);
 
        RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG, "FW LPS mode = %d (coex:%d)\n",
                 mode, bt_ctrl_lps);
@@ -549,8 +554,9 @@ void rtl8821ae_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode)
        SET_H2CCMD_PWRMODE_PARM_MODE(u1_h2c_set_pwrmode, ((mode) ? 1 : 0));
        SET_H2CCMD_PWRMODE_PARM_RLBM(u1_h2c_set_pwrmode, rlbm);
        SET_H2CCMD_PWRMODE_PARM_SMART_PS(u1_h2c_set_pwrmode,
-                                        (rtlpriv->mac80211.p2p) ?
-                                        ppsc->smart_ps : 1);
+                                        bt_ctrl_lps ? 0 :
+                                        ((rtlpriv->mac80211.p2p) ?
+                                         ppsc->smart_ps : 1));
        SET_H2CCMD_PWRMODE_PARM_AWAKE_INTERVAL(u1_h2c_set_pwrmode,
                                               awake_intvl);
        SET_H2CCMD_PWRMODE_PARM_ALL_QUEUE_UAPSD(u1_h2c_set_pwrmode, 0);