rtlwifi: btcoex: 23b 1ant: fine tune for wifi connected
authorPing-Ke Shih <pkshih@realtek.com>
Sat, 20 May 2017 15:49:04 +0000 (10:49 -0500)
committerKalle Valo <kvalo@codeaurora.org>
Wed, 24 May 2017 13:50:37 +0000 (16:50 +0300)
Fine tune the parameters in cases of bt_acl_busy and scan when wifi is
connected.

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/btcoexist/halbtc8723b1ant.c
drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8723b1ant.h

index 9c4feb89144de2b3ce3e379afc296bfd1b5f5dca..80522b91847ca89174b944be7b6d8ec091c262d0 100644 (file)
@@ -1869,9 +1869,9 @@ static void halbtc8723b1ant_action_wifi_connected_bt_acl_busy(
        } else if (bt_link_info->a2dp_only) { /* A2DP */
                if (wifi_status == BT_8723B_1ANT_WIFI_STATUS_CONNECTED_IDLE) {
                        halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
-                                               false, 8);
+                                               true, 32);
                        halbtc8723b1ant_coex_table_with_type(btcoexist,
-                                                            NORMAL_EXEC, 2);
+                                                            NORMAL_EXEC, 4);
                        coex_dm->auto_tdma_adjust = false;
                } else {
                        btc8723b1ant_tdma_dur_adj_for_acl(btcoexist,
@@ -1880,28 +1880,29 @@ static void halbtc8723b1ant_action_wifi_connected_bt_acl_busy(
                                                             NORMAL_EXEC, 1);
                        coex_dm->auto_tdma_adjust = true;
                }
-       } else if (bt_link_info->hid_exist &&
-               bt_link_info->a2dp_exist) { /* HID + A2DP */
+       } else if (((bt_link_info->a2dp_exist) && (bt_link_info->pan_exist)) ||
+                  (bt_link_info->hid_exist && bt_link_info->a2dp_exist &&
+                   bt_link_info->pan_exist)) {
+               /* A2DP + PAN(OPP,FTP), HID + A2DP + PAN(OPP,FTP) */
+               halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 13);
+               halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
+               coex_dm->auto_tdma_adjust = false;
+       } else if (bt_link_info->hid_exist && bt_link_info->a2dp_exist) {
+               /* HID + A2DP */
                halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 14);
                coex_dm->auto_tdma_adjust = false;
 
-               halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 6);
-        /* PAN(OPP,FTP), HID + PAN(OPP,FTP) */
+               halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
        } else if (bt_link_info->pan_only ||
-                  (bt_link_info->hid_exist && bt_link_info->pan_exist)) {
+                       (bt_link_info->hid_exist && bt_link_info->pan_exist)) {
+               /* PAN(OPP,FTP), HID + PAN(OPP,FTP) */
                halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 3);
-               halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 6);
-               coex_dm->auto_tdma_adjust = false;
-        /* A2DP + PAN(OPP,FTP), HID + A2DP + PAN(OPP,FTP) */
-       } else if ((bt_link_info->a2dp_exist && bt_link_info->pan_exist) ||
-                  (bt_link_info->hid_exist && bt_link_info->a2dp_exist &&
-                   bt_link_info->pan_exist)) {
-               halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 13);
-               halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 1);
+               halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
                coex_dm->auto_tdma_adjust = false;
        } else {
-               halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 11);
-               halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 1);
+               /* BT no-profile busy (0x9) */
+               halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 33);
+               halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
                coex_dm->auto_tdma_adjust = false;
        }
 }
@@ -1981,21 +1982,22 @@ static void btc8723b1ant_action_wifi_conn_scan(struct btc_coexist *btcoexist)
 
        /* tdma and coex table */
        if (coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_ACL_BUSY) {
-               if (bt_link_info->a2dp_exist && bt_link_info->pan_exist) {
+               if (bt_link_info->a2dp_exist) {
                        halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
-                                               true, 22);
+                                               true, 32);
                        halbtc8723b1ant_coex_table_with_type(btcoexist,
-                                                            NORMAL_EXEC, 1);
-               } else if (bt_link_info->pan_only) {
+                                                            NORMAL_EXEC, 4);
+               } else if (bt_link_info->a2dp_exist &&
+                          bt_link_info->pan_exist) {
                        halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
-                                               true, 20);
+                                               true, 22);
                        halbtc8723b1ant_coex_table_with_type(btcoexist,
-                                                            NORMAL_EXEC, 2);
+                                                            NORMAL_EXEC, 4);
                } else {
                        halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
                                                true, 20);
                        halbtc8723b1ant_coex_table_with_type(btcoexist,
-                                                            NORMAL_EXEC, 1);
+                                                            NORMAL_EXEC, 4);
                }
        } else if (coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_SCO_BUSY ||
                   coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY) {
@@ -2003,6 +2005,8 @@ static void btc8723b1ant_action_wifi_conn_scan(struct btc_coexist *btcoexist)
                                BT_8723B_1ANT_WIFI_STATUS_CONNECTED_SCAN);
        } else {
                halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
+               halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA,
+                                            NORMAL_EXEC, false, false);
                halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);
        }
 }
@@ -2010,23 +2014,34 @@ static void btc8723b1ant_action_wifi_conn_scan(struct btc_coexist *btcoexist)
 static void halbtc8723b1ant_action_wifi_connected_special_packet(
                                                struct btc_coexist *btcoexist)
 {
-       bool hs_connecting = false;
        struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
+       bool wifi_busy = false;
 
-       btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_CONNECTING, &hs_connecting);
+       btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
+
+       /* no special packet process for both WiFi and BT very busy */
+       if ((wifi_busy) &&
+           ((bt_link_info->pan_exist) || (coex_sta->num_of_profile >= 2)))
+               return;
 
        halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
                                         0x0, 0x0);
 
        /* tdma and coex table */
-       if ((BT_8723B_1ANT_BT_STATUS_CONNECTED_IDLE == coex_dm->bt_status) ||
-           (bt_link_info->sco_exist) || (bt_link_info->hid_only) ||
-           (bt_link_info->a2dp_only) || (bt_link_info->pan_only)) {
-               halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
-               halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);
-       } else {
+       if ((bt_link_info->sco_exist) || (bt_link_info->hid_exist)) {
+               halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 32);
+               halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 5);
+       } else if (bt_link_info->a2dp_exist) {
+               halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 32);
+               halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
+       } else if (bt_link_info->pan_exist) {
                halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 20);
-               halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 1);
+               halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
+       } else {
+               halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
+               halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA,
+                                            NORMAL_EXEC, false, false);
+               halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);
        }
 }
 
@@ -2071,10 +2086,29 @@ static void halbtc8723b1ant_action_wifi_connected(struct btc_coexist *btcoexist)
        if (!ap_enable &&
            coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_ACL_BUSY &&
            !btcoexist->bt_link_info.hid_only) {
-               if (!wifi_busy && btcoexist->bt_link_info.a2dp_only)
-                       halbtc8723b1ant_power_save_state(btcoexist,
+               if (btcoexist->bt_link_info.a2dp_only) {
+                       if (!wifi_busy) {
+                               halbtc8723b1ant_power_save_state(btcoexist,
                                                         BTC_PS_WIFI_NATIVE,
                                                         0x0, 0x0);
+                       } else { /* busy */
+                               if (coex_sta->scan_ap_num >=
+                                   BT_8723B_1ANT_WIFI_NOISY_THRESH)
+                                       /* no force LPS, no PS-TDMA,
+                                        * use pure TDMA
+                                        */
+                                       halbtc8723b1ant_power_save_state(
+                                               btcoexist, BTC_PS_WIFI_NATIVE,
+                                               0x0, 0x0);
+                               else
+                                       halbtc8723b1ant_power_save_state(
+                                               btcoexist, BTC_PS_LPS_ON, 0x50,
+                                               0x4);
+                       }
+               } else if ((!coex_sta->pan_exist) && (!coex_sta->a2dp_exist) &&
+                          (!coex_sta->hid_exist))
+                       halbtc8723b1ant_power_save_state(
+                               btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
                else
                        halbtc8723b1ant_power_save_state(btcoexist,
                                                         BTC_PS_LPS_ON,
@@ -2098,6 +2132,9 @@ static void halbtc8723b1ant_action_wifi_connected(struct btc_coexist *btcoexist)
                } else {
                        halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
                                                false, 8);
+                       halbtc8723b1ant_set_ant_path(btcoexist,
+                                                    BTC_ANT_PATH_PTA,
+                                                    NORMAL_EXEC, false, false);
                        halbtc8723b1ant_coex_table_with_type(btcoexist,
                                                             NORMAL_EXEC, 2);
                }
@@ -2114,9 +2151,12 @@ static void halbtc8723b1ant_action_wifi_connected(struct btc_coexist *btcoexist)
                                    BT_8723B_1ANT_WIFI_STATUS_CONNECTED_BUSY);
                } else {
                        halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
-                                               false, 8);
+                                               true, 32);
+                       halbtc8723b1ant_set_ant_path(btcoexist,
+                                                    BTC_ANT_PATH_PTA,
+                                                    NORMAL_EXEC, false, false);
                        halbtc8723b1ant_coex_table_with_type(btcoexist,
-                                                            NORMAL_EXEC, 2);
+                                                            NORMAL_EXEC, 4);
                }
        }
 }
index 3385a649d6c7fb94761e68caad2c0eadafa6e93f..506961a1ca567e3b728f36d4cf2fda4c96a7af55 100644 (file)
@@ -39,6 +39,8 @@
 
 #define        BTC_RSSI_COEX_THRESH_TOL_8723B_1ANT             2
 
+#define BT_8723B_1ANT_WIFI_NOISY_THRESH                        50
+
 enum _BT_INFO_SRC_8723B_1ANT {
        BT_INFO_SRC_8723B_1ANT_WIFI_FW                  = 0x0,
        BT_INFO_SRC_8723B_1ANT_BT_RSP                   = 0x1,