Re: 4.10.9 nok with realtek wlan, atom

2017-04-15 Thread Larry Finger

On 04/14/2017 03:26 PM, rupert THURNER wrote:

On Thu, Feb 9, 2017 at 9:09 PM, Larry Finger  wrote:

On 02/09/2017 01:43 PM, Bjorn Helgaas wrote:


[+cc rtl8192ce folks in case they've seen this]

On Thu, Feb 09, 2017 at 03:45:01PM +0100, rupert THURNER wrote:


hi,

not technical expert enough, i just wanted to give a short user
feedback. for realtek wlan on atom, kernels up to 4.9.5 are ok, and
kernel 4.10.0-rc7-g926af6273fc6 (arch linux-git version numbering) as
well. kernels 4.9.6, 4.9.7, and 4.9.8 fail, i.e. connection to a WLAN
hotspot is possible then drops, or connecting to wlan fails
alltogether.



Thanks very much for your report, and sorry for the inconvenience.

v4.10-rc7 works, so I guess we don't need to worry about fixing v4.10.

But the stable kernels v4.9.6, v4.9.7, and v4.9.8 are broken, so we
need to figure out why and make sure we fix the v4.9 stable series.

I can't tell yet whether this is PCI-related or not.  If it is,
4922a6a5cfa7 ("PCI: Enumerate switches below PCI-to-PCIe bridges")
appeared in v4.9.6, and there is a known issue with that.  The issue
should be fixed by 610c2b7ff8f6 ("PCI/ASPM: Handle PCI-to-PCIe bridges
as roots of PCIe hierarchies"), which appeared in v4.9.9, so I guess
the first thing to do would be to test v4.9.9.

If it's not fixed in v4.9.9, can you share the complete dmesg log
(output of "dmesg" command) and "lspci -vv" output for v4.9.5 (last
known working version) and v4.9.6 (first known broken version)?  On
v4.9.6, collect the dmesg output after the failure occurs.


24: PCI 300.0: 0282 WLAN controller
  [Created at pci.366]
  Model: "Realtek RTL8188CE 802.11b/g/n WiFi Adapter"
  Device: pci 0x8176 "RTL8188CE 802.11b/g/n WiFi Adapter"
  Revision: 0x01
  Driver: "rtl8192ce"
  Driver Modules: "rtl8192ce"
  Device File: wlp3s0
  Features: WLAN



It would be helpful if someone were to bisect this issue. The only issue
that comes to mind was fixed in commit 52f5631a4c05 ("rtlwifi: rtl8192ce:
Fix loading of incorrect firmware") which is in 4.10-rc7 and will be
backported to 4.9.

The above issue is one that could not be reproduced on my hardware, thus it
took Jurij Smakov to find the fix. Without his bisection of the problem, who
knows how long it would have taken to find my edit mistake.


larry, using the newest kernel 4.10.8 the network connection dropps
again irregular.

# dmesg
[0.00] Linux version 4.10.9-1-ARCH (builduser@tobias) (gcc
version 6.3.1 20170306 (GCC) ) #1 SMP PREEMPT Sat Apr 8 12:39:59 CEST
2017
[   11.933373] rtl8192ce: rtl8192ce: Power Save off (module option)
[   11.933396] rtl8192ce: Using firmware rtlwifi/rtl8192cfw.bin
[   11.978307] ieee80211 phy0: Selected rate control algorithm 'rtl_rc'
[   11.978945] rtlwifi: rtlwifi: wireless switch is on

# lspci -vv
Subsystem: Realtek Semiconductor Co., Ltd. RTL8188CE 802.11b/g/n WiFi Adapter
Kernel driver in use: rtl8192ce


Is firmware rtlwifi/rtl8192cfw.bin also used on kernels that work?

Larry




[PATCH 14/14] rtlwifi: btcoex: 21a 2ant: wifi is linking action

2017-04-15 Thread Larry Finger
From: Yan-Hsuan Chuang 

When wifi is under scanning/linking/roaming, do not run the reset of the
coex mechanism because these activities are important for wifi, just run
the linking process and return.

Signed-off-by: Yan-Hsuan Chuang 
Signed-off-by: Larry Finger 
Cc: Pkshih 
Cc: Birming Chiu 
Cc: Shaofu 
---
 .../net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a2ant.c | 12 
 1 file changed, 12 insertions(+)

diff --git a/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a2ant.c 
b/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a2ant.c
index 0aa36247e402..841b4a83ab70 100644
--- a/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a2ant.c
+++ b/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a2ant.c
@@ -3467,6 +3467,7 @@ static void btc8821a2ant_run_coexist_mechanism(struct 
btc_coexist *btcoexist)
u32 num_of_wifi_link = 0;
u32 wifi_link_status = 0;
bool miracast_plus_bt = false;
+   bool scan = false, link = false, roam = false;
 
if (btcoexist->manual_control) {
RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
@@ -3498,6 +3499,17 @@ static void btc8821a2ant_run_coexist_mechanism(struct 
btc_coexist *btcoexist)
return;
}
 
+   btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);
+   btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);
+   btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
+
+   if (scan || link || roam) {
+   RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
+"[BTCoex], WiFi is under Link Process !!\n");
+   btc8821a2ant_action_wifi_link_process(btcoexist);
+   return;
+   }
+
/* for P2P */
btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS,
   &wifi_link_status);
-- 
2.12.0



[PATCH 12/14] rtlwifi: btcoex: 21a 2ant: do not limit rx agg size

2017-04-15 Thread Larry Finger
From: Yan-Hsuan Chuang 

For bt profiling, we do not need to limit the rx agg size.

Signed-off-by: Yan-Hsuan Chuang 
Signed-off-by: Larry Finger 
Cc: Pkshih 
Cc: Birming Chiu 
Cc: Shaofu 
---
 drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a2ant.c | 1 -
 1 file changed, 1 deletion(-)

diff --git a/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a2ant.c 
b/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a2ant.c
index 5a8e4b80006b..22cb8aa8208d 100644
--- a/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a2ant.c
+++ b/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a2ant.c
@@ -3148,7 +3148,6 @@ static void btc8821a2ant_action_pan_edr_hid(struct 
btc_coexist *btcoexist)
bt_rssi_state = btc8821a2ant_bt_rssi_state(btcoexist,
2, BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);
 
-   btc8821a2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
btc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
 
if (BTC_RSSI_HIGH(bt_rssi_state))
-- 
2.12.0



[PATCH 05/14] rtlwifi: btcoex: 21a 2ant: fix some coding style issues

2017-04-15 Thread Larry Finger
From: Yan-Hsuan Chuang 

Fix some ident and naming for linux coding style.

Signed-off-by: Yan-Hsuan Chuang 
Signed-off-by: Larry Finger 
Cc: Pkshih 
Cc: Birming Chiu 
Cc: Shaofu 
---
 drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a2ant.c | 9 -
 1 file changed, 4 insertions(+), 5 deletions(-)

diff --git a/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a2ant.c 
b/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a2ant.c
index 62c3556e83b5..bbce0cbe2e9a 100644
--- a/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a2ant.c
+++ b/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a2ant.c
@@ -3512,8 +3512,7 @@ static void btc8821a2ant_run_coexist_mechanism(struct 
btc_coexist *btcoexist)
return;
}
 
-   btcoexist->btc_get(btcoexist,
-   BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
+   btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
 
if (wifi_under_5g) {
RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
@@ -3629,15 +3628,15 @@ void ex_btc8821a2ant_init_hwconfig(struct btc_coexist 
*btcoexist)
u1tmp |= 0x5;
btcoexist->btc_write_1byte(btcoexist, 0x790, u1tmp);
 
-   /*Antenna config */
+   /* Antenna config */
btc8821a2ant_set_ant_path(btcoexist, BTC_ANT_WIFI_AT_MAIN, true, false);
 
/* PTA parameter */
btc8821a2ant_coex_table_with_type(btcoexist, FORCE_EXEC, 0);
 
/* Enable counter statistics */
-   /*0x76e[3] = 1, WLAN_Act control by PTA*/
-   btcoexist->btc_write_1byte(btcoexist, 0x76e, 0xc);
+   /* 0x76e[3] = 1, WLAN_Act control by PTA */
+   btcoexist->btc_write_1byte(btcoexist, 0x76e, 0x4);
btcoexist->btc_write_1byte(btcoexist, 0x778, 0x3);
btcoexist->btc_write_1byte_bitmask(btcoexist, 0x40, 0x20, 0x1);
 }
-- 
2.12.0



[PATCH 06/14] rtlwifi: btcoex: 21a 2ant: set tdma based on rssi state amd limit rx agg size

2017-04-15 Thread Larry Finger
From: Yan-Hsuan Chuang 

Monitor the rssi state to set the tdma and limit rx aggregation size to
fit the bt profiling.

Signed-off-by: Yan-Hsuan Chuang 
Signed-off-by: Larry Finger 
Cc: Pkshih 
Cc: Birming Chiu 
Cc: Shaofu 
Cc: Steven Ting 
---
 .../realtek/rtlwifi/btcoexist/halbtc8821a2ant.c| 51 ++
 1 file changed, 23 insertions(+), 28 deletions(-)

diff --git a/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a2ant.c 
b/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a2ant.c
index bbce0cbe2e9a..9df5b4c195ff 100644
--- a/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a2ant.c
+++ b/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a2ant.c
@@ -2875,33 +2875,40 @@ static void btc8821a2ant_action_a2dp(struct btc_coexist 
*btcoexist)
 
 static void btc8821a2ant_action_a2dp_pan_hs(struct btc_coexist *btcoexist)
 {
-   u8 wifi_rssi_state, bt_rssi_state, bt_info_ext;
+   u8 wifi_rssi_state, wifi_rssi_state1, bt_rssi_state;
u32 wifi_bw;
 
-   bt_info_ext = coex_sta->bt_info_ext;
wifi_rssi_state = btc8821a2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);
-   bt_rssi_state = btc8821a2ant_bt_rssi_state(btcoexist, 2, 35, 0);
+   wifi_rssi_state1 = btc8821a2ant_wifi_rssi_state(btcoexist, 1, 2,
+   BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);
+   bt_rssi_state = btc8821a2ant_bt_rssi_state(btcoexist,
+   2, BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);
+
+   btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xf, 0x0);
+
+   btc8821a2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
+   btc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
 
if (BTC_RSSI_HIGH(bt_rssi_state))
btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
else
btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
 
-   btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
+   if (BTC_RSSI_HIGH(wifi_rssi_state1) && BTC_RSSI_HIGH(bt_rssi_state)) {
+   btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);
+   btc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
+ 0x0, 0x0);
+   } else {
+   btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 13);
+   btc8821a2ant_power_save_state(btcoexist, BTC_PS_LPS_ON, 0x50,
+ 0x4);
+   }
 
-   if (wifi_bw == BTC_WIFI_BW_HT40) {
-   /* fw mechanism */
-   if (bt_info_ext&BIT0) {
-   /* a2dp basic rate */
-   btc8821a2ant_tdma_duration_adjust(btcoexist, false,
- true, 2);
-   } else {
-   /* a2dp edr rate */
-   btc8821a2ant_tdma_duration_adjust(btcoexist, false,
- true, 1);
-   }
+   btc8821a2ant_tdma_duration_adjust(btcoexist, false, true, 2);
 
-   /* sw mechanism */
+   /* sw mechanism */
+   btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
+   if (wifi_bw == BTC_WIFI_BW_HT40) {
if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
(wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
btc8821a2ant_sw_mechanism1(btcoexist, true, false,
@@ -2915,18 +2922,6 @@ static void btc8821a2ant_action_a2dp_pan_hs(struct 
btc_coexist *btcoexist)
   false, 0x18);
}
} else {
-   /* fw mechanism */
-   if (bt_info_ext&BIT0) {
-   /* a2dp basic rate */
-   btc8821a2ant_tdma_duration_adjust(btcoexist, false,
- true, 2);
-   } else {
-   /* a2dp edr rate */
-   btc8821a2ant_tdma_duration_adjust(btcoexist, false,
- true, 1);
-   }
-
-   /* sw mechanism */
if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
(wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
btc8821a2ant_sw_mechanism1(btcoexist, false, false,
-- 
2.12.0



[PATCH 11/14] rtlwifi: btcoex: 21a 2ant: macro for bt rssi threshold

2017-04-15 Thread Larry Finger
From: Yan-Hsuan Chuang 

Using macro to control the bt threshold.

Signed-off-by: Yan-Hsuan Chuang 
Signed-off-by: Larry Finger 
Cc: Pkshih 
Cc: Birming Chiu 
Cc: Shaofu 
---
 drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a2ant.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a2ant.c 
b/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a2ant.c
index 626b73fd97a5..5a8e4b80006b 100644
--- a/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a2ant.c
+++ b/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a2ant.c
@@ -3145,7 +3145,8 @@ static void btc8821a2ant_action_pan_edr_hid(struct 
btc_coexist *btcoexist)
u32 wifi_bw;
 
wifi_rssi_state = btc8821a2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);
-   bt_rssi_state = btc8821a2ant_bt_rssi_state(btcoexist, 2, 35, 0);
+   bt_rssi_state = btc8821a2ant_bt_rssi_state(btcoexist,
+   2, BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);
 
btc8821a2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
btc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
-- 
2.12.0



[PATCH 04/14] rtlwifi: btcoex: 21a 2ant: more combinations of wifi/bt rssi state

2017-04-15 Thread Larry Finger
From: Yan-Hsuan Chuang 

For bt a2dp, we need to check more rssi state combinations to have
better voice quality.

Signed-off-by: Yan-Hsuan Chuang 
Signed-off-by: Larry Finger 
Cc: Pkshih 
Cc: Birming Chiu 
Cc: Shaofu 
---
 .../realtek/rtlwifi/btcoexist/halbtc8821a2ant.c| 97 +++---
 1 file changed, 65 insertions(+), 32 deletions(-)

diff --git a/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a2ant.c 
b/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a2ant.c
index 8437f1b6c108..62c3556e83b5 100644
--- a/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a2ant.c
+++ b/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a2ant.c
@@ -2771,36 +2771,80 @@ static void btc8821a2ant_action_hid(struct btc_coexist 
*btcoexist)
 /* A2DP only / PAN(EDR) only/ A2DP+PAN(HS) */
 static void btc8821a2ant_action_a2dp(struct btc_coexist *btcoexist)
 {
-   u8 wifi_rssi_state, bt_rssi_state;
+   u8 wifi_rssi_state, wifi_rssi_state1, bt_rssi_state;
+   u8 ap_num = 0;
u32 wifi_bw;
 
-   wifi_rssi_state = btc8821a2ant_wifi_rssi_state(btcoexist, 0, 2,
-  15, 0);
-   bt_rssi_state = btc8821a2ant_bt_rssi_state(btcoexist, 2, 35, 0);
+   wifi_rssi_state = btc8821a2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);
+   wifi_rssi_state1 = btc8821a2ant_wifi_rssi_state(btcoexist, 1, 2,
+   BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);
+   bt_rssi_state = btc8821a2ant_bt_rssi_state(btcoexist,
+   2, BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);
 
-   /* fw dac swing is called in btc8821a2ant_tdma_duration_adjust()
-* btc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
-*/
+   if ((ap_num >= 10) && BTC_RSSI_HIGH(wifi_rssi_state1) &&
+   BTC_RSSI_HIGH(bt_rssi_state)) {
+   btc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
+ 0x0, 0x0);
 
-   if (BTC_RSSI_HIGH(bt_rssi_state))
-   btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, true);
-   else
-   btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, false);
+   btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xf,
+ 0x0);
+   btc8821a2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false,
+   0x8);
+   btc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
+   btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
 
-   btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
+   btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
 
-   if (BTC_WIFI_BW_HT40 == wifi_bw) {
-   /* fw mechanism */
-   if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
-   (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
-   btc8821a2ant_tdma_duration_adjust(btcoexist, false,
- false, 1);
+   btc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
+ 0x0, 0x0);
+   btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 23);
+
+   /* sw mechanism */
+   btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
+   if (wifi_bw == BTC_WIFI_BW_HT40) {
+   btc8821a2ant_sw_mechanism1(btcoexist, true, false,
+  false, false);
+   btc8821a2ant_sw_mechanism2(btcoexist, true, false,
+  true, 0x6);
} else {
-   btc8821a2ant_tdma_duration_adjust(btcoexist, false,
- true, 1);
+   btc8821a2ant_sw_mechanism1(btcoexist, false, false,
+  false, false);
+   btc8821a2ant_sw_mechanism2(btcoexist, true, false,
+  true, 0x6);
}
+   return;
+   }
 
-   /* sw mechanism */
+   btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xf, 0x0);
+   btc8821a2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
+
+   btc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
+
+   if (BTC_RSSI_HIGH(bt_rssi_state))
+   btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
+   else
+   btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
+
+   if (BTC_RSSI_HIGH(wifi_rssi_state1) && BTC_RSSI_HIGH(bt_rssi_state)) {
+   btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);
+   btc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
+ 0x0, 0x0);
+

[PATCH 01/14] rtlwifi: btcoex: 21a 2ant: turn on sw dac swing and check if is sco_only

2017-04-15 Thread Larry Finger
From: Yan-Hsuan Chuang 

Use software dac swing and double check if it is sco_only to set the
tdma for voice quality.

Signed-off-by: Yan-Hsuan Chuang 
Signed-off-by: Larry Finger 
Cc: Pkshih 
Cc: Birming Chiu 
Cc: Shaofu 
---
 .../realtek/rtlwifi/btcoexist/halbtc8821a2ant.c| 55 ++
 1 file changed, 24 insertions(+), 31 deletions(-)

diff --git a/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a2ant.c 
b/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a2ant.c
index 0ef83727fdf4..7b5dbc62906e 100644
--- a/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a2ant.c
+++ b/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a2ant.c
@@ -2634,13 +2634,15 @@ static void btc8821a2ant_tdma_duration_adjust(struct 
btc_coexist *btcoexist,
 /* SCO only or SCO+PAN(HS)*/
 static void btc8821a2ant_action_sco(struct btc_coexist *btcoexist)
 {
+   struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
u8 wifi_rssi_state, bt_rssi_state;
u32 wifi_bw;
 
-   wifi_rssi_state = btc8821a2ant_wifi_rssi_state(btcoexist, 0, 2,
-  15, 0);
+   wifi_rssi_state = btc8821a2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);
bt_rssi_state = btc8821a2ant_bt_rssi_state(btcoexist, 2, 35, 0);
 
+   btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xf, 0x0);
+
btc8821a2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
btc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 4);
 
@@ -2656,58 +2658,49 @@ static void btc8821a2ant_action_sco(struct btc_coexist 
*btcoexist)
btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);
} else {
/* for SCO quality & wifi performance balance at 11n mode */
-   btc8821a2ant_coex_table(btcoexist, NORMAL_EXEC,
-   0x5aea5aea, 0x5aea5aea, 0x, 0x3);
-   }
-
-   if (wifi_bw == BTC_WIFI_BW_HT40) {
-
-   if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
-   (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
-   /* for voice quality */
-   btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC,
-false, 0);
+   if (wifi_bw == BTC_WIFI_BW_HT40) {
+   btc8821a2ant_coex_table_with_type(btcoexist,
+ NORMAL_EXEC, 8);
} else {
-   /* for voice quality */
-   btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC,
-false, 0);
+   if (bt_link_info->sco_only)
+   btc8821a2ant_coex_table_with_type(
+   btcoexist, NORMAL_EXEC, 17);
+   else
+   btc8821a2ant_coex_table_with_type(
+   btcoexist, NORMAL_EXEC, 12);
}
+   }
 
-   /* sw mechanism */
+   btc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
+   /* for voice quality */
+   btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0);
+
+   /* sw mechanism */
+   if (wifi_bw == BTC_WIFI_BW_HT40) {
if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
(wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
btc8821a2ant_sw_mechanism1(btcoexist, true, true,
   false, false);
btc8821a2ant_sw_mechanism2(btcoexist, true, false,
-  false, 0x18);
+  true, 0x18);
} else {
btc8821a2ant_sw_mechanism1(btcoexist, true, true,
   false, false);
btc8821a2ant_sw_mechanism2(btcoexist, false, false,
-  false, 0x18);
+  true, 0x18);
}
} else {
-   if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
-   (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
-   /* for voice quality */
-   btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0);
-   } else {
-   /* for voice quality */
-   btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0);
-   }
-
-   /* sw mechanism */
if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
(wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
btc8821a2ant_sw_mechanism1(btcoexist, false, true,
   false, false);
 

[PATCH 02/14] rtlwifi: btcoex: 21a 2ant: add threshold to examine bt rssi

2017-04-15 Thread Larry Finger
From: Yan-Hsuan Chuang 

The threshold is used to adjust the base line for the rssi state.

Signed-off-by: Yan-Hsuan Chuang 
Signed-off-by: Larry Finger 
Cc: Pkshih 
Cc: Birming Chiu 
Cc: Shaofu 
---
 drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a2ant.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a2ant.c 
b/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a2ant.c
index 7b5dbc62906e..b880bc2eaf85 100644
--- a/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a2ant.c
+++ b/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a2ant.c
@@ -2711,7 +2711,8 @@ static void btc8821a2ant_action_hid(struct btc_coexist 
*btcoexist)
u32 wifi_bw;
 
wifi_rssi_state = btc8821a2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);
-   bt_rssi_state = btc8821a2ant_bt_rssi_state(btcoexist, 2, 35, 0);
+   bt_rssi_state = btc8821a2ant_bt_rssi_state(btcoexist,
+   2, BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);
 
btc8821a2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
btc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
-- 
2.12.0



[PATCH 13/14] rtlwifi: btcoex: 21a 2ant: just return when wifi is under ips

2017-04-15 Thread Larry Finger
From: Yan-Hsuan Chuang 

If wifi is in power saving mode, do nothing.

Signed-off-by: Yan-Hsuan Chuang 
Signed-off-by: Larry Finger 
Cc: Pkshih 
Cc: Birming Chiu 
Cc: Shaofu 
  ---
 drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a2ant.c | 6 ++
 1 file changed, 6 insertions(+)
---
 drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a2ant.c | 6 ++
 1 file changed, 6 insertions(+)

diff --git a/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a2ant.c 
b/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a2ant.c
index 22cb8aa8208d..0aa36247e402 100644
--- a/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a2ant.c
+++ b/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a2ant.c
@@ -3483,6 +3483,12 @@ static void btc8821a2ant_run_coexist_mechanism(struct 
btc_coexist *btcoexist)
return;
}
 
+   if (coex_sta->under_ips) {
+   RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
+"[BTCoex], wifi is under IPS !!!\n");
+   return;
+   }
+
algorithm = btc8821a2ant_action_algorithm(btcoexist);
if (coex_sta->c2h_bt_inquiry_page &&
(BT_8821A_2ANT_COEX_ALGO_PANHS != algorithm)) {
-- 
2.12.0



[PATCH 10/14] rtlwifi: btcoex: 21a 2ant: dec bt power according to bt rssi and set tdma

2017-04-15 Thread Larry Finger
From: Yan-Hsuan Chuang 

Check the bt rssi first and decrease it if the bt rssi is too high.
Then set the tdma and coex table.

Signed-off-by: Yan-Hsuan Chuang 
Signed-off-by: Larry Finger 
Cc: Pkshih 
Cc: Birming Chiu 
Cc: Shaofu 
---
 .../realtek/rtlwifi/btcoexist/halbtc8821a2ant.c| 140 +++--
 1 file changed, 48 insertions(+), 92 deletions(-)

diff --git a/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a2ant.c 
b/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a2ant.c
index 9e152117730c..626b73fd97a5 100644
--- a/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a2ant.c
+++ b/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a2ant.c
@@ -3009,28 +3009,31 @@ static void btc8821a2ant_action_pan_edr(struct 
btc_coexist *btcoexist)
 /* PAN(HS) only */
 static void btc8821a2ant_action_pan_hs(struct btc_coexist *btcoexist)
 {
-   u8 wifi_rssi_state, bt_rssi_state;
+   u8 wifi_rssi_state, wifi_rssi_state1, bt_rssi_state;
u32 wifi_bw;
 
wifi_rssi_state = btc8821a2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);
-   bt_rssi_state = btc8821a2ant_bt_rssi_state(btcoexist, 2, 35, 0);
+   wifi_rssi_state1 = btc8821a2ant_wifi_rssi_state(btcoexist, 1, 2,
+   BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);
+   bt_rssi_state = btc8821a2ant_bt_rssi_state(btcoexist,
+   2, BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);
+
+   btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xf, 0x0);
 
btc8821a2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
btc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
 
-   btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
+   if (BTC_RSSI_HIGH(bt_rssi_state))
+   btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
+   else
+   btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
 
-   if (BTC_WIFI_BW_HT40 == wifi_bw) {
-   /* fw mechanism */
-   if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
-   (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
-   btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, true);
-   } else {
-   btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, false);
-   }
-   btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
+   btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);
+   btc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
+   btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
 
-   /* sw mechanism */
+   btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
+   if (wifi_bw == BTC_WIFI_BW_HT40) {
if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
(wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
btc8821a2ant_sw_mechanism1(btcoexist, true, false,
@@ -3044,22 +3047,6 @@ static void btc8821a2ant_action_pan_hs(struct 
btc_coexist *btcoexist)
   false, 0x18);
}
} else {
-   /* fw mechanism */
-   if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
-   (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
-   btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, true);
-   } else {
-   btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, false);
-   }
-
-   if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
-   (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
-   btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
-   } else {
-   btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
-   }
-
-   /* sw mechanism */
if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
(wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
btc8821a2ant_sw_mechanism1(btcoexist, false, false,
@@ -3078,12 +3065,18 @@ static void btc8821a2ant_action_pan_hs(struct 
btc_coexist *btcoexist)
 /* PAN(EDR)+A2DP */
 static void btc8821a2ant_action_pan_edr_a2dp(struct btc_coexist *btcoexist)
 {
-   u8  wifi_rssi_state, bt_rssi_state, bt_info_ext;
-   u32 wifi_bw;
+   u8 wifi_rssi_state, wifi_rssi_state1, bt_rssi_state;
+   u32 wifi_bw;
 
-   bt_info_ext = coex_sta->bt_info_ext;
wifi_rssi_state = btc8821a2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);
-   bt_rssi_state = btc8821a2ant_bt_rssi_state(btcoexist, 2, 35, 0);
+   wifi_rssi_state1 = btc8821a2ant_wifi_rssi_state(btcoexist, 1, 2,
+   BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);
+   bt_rssi_state = btc8821a2ant_bt_rssi_state(btcoexist,
+   2, BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);

[PATCH 07/14] rtlwifi: btcoex: 21a 2ant: add multiport action for p2p/miracast

2017-04-15 Thread Larry Finger
From: Yan-Hsuan Chuang 

For p2p/miracast, the wifi may have multiple ports for different roles.
Under this, we need extra settings for turning off the tdma and proper
coex table parameters.

We monnitor the number of links on a port to determine if it is for
p2p/miracast or not.

Signed-off-by: Yan-Hsuan Chuang 
Signed-off-by: Larry Finger 
Cc: Pkshih 
Cc: Birming Chiu 
Cc: Shaofu 
Cc: Steven Ting 
---
 .../realtek/rtlwifi/btcoexist/halbtc8821a2ant.c| 47 ++
 1 file changed, 47 insertions(+)

diff --git a/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a2ant.c 
b/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a2ant.c
index 9df5b4c195ff..4471bd66a2e5 100644
--- a/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a2ant.c
+++ b/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a2ant.c
@@ -3495,11 +3495,31 @@ static void btc8821a2ant_action_hid_a2dp(struct 
btc_coexist *btcoexist)
}
 }
 
+static void btc8821a2ant_action_wifi_multi_port(struct btc_coexist *btcoexist)
+{
+   btc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
+   btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
+
+   /* sw all off */
+   btc8821a2ant_sw_mechanism1(btcoexist, false, false, false, false);
+   btc8821a2ant_sw_mechanism2(btcoexist, false, false, false, 0x18);
+
+   /* hw all off */
+   btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
+
+   btc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
+   btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
+}
+
 static void btc8821a2ant_run_coexist_mechanism(struct btc_coexist *btcoexist)
 {
struct rtl_priv *rtlpriv = btcoexist->adapter;
+   struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
bool wifi_under_5g = false;
u8 algorithm = 0;
+   u32 num_of_wifi_link = 0;
+   u32 wifi_link_status = 0;
+   bool miracast_plus_bt = false;
 
if (btcoexist->manual_control) {
RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
@@ -3525,6 +3545,33 @@ static void btc8821a2ant_run_coexist_mechanism(struct 
btc_coexist *btcoexist)
return;
}
 
+   /* for P2P */
+   btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS,
+  &wifi_link_status);
+   num_of_wifi_link = wifi_link_status >> 16;
+
+   if ((num_of_wifi_link >= 2) ||
+   (wifi_link_status & WIFI_P2P_GO_CONNECTED)) {
+   RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
+"# [BTCoex],  Multi-Port num_of_wifi_link 
= %d, wifi_link_status = 0x%x\n",
+num_of_wifi_link, wifi_link_status);
+
+   if (bt_link_info->bt_link_exist)
+   miracast_plus_bt = true;
+   else
+   miracast_plus_bt = false;
+
+   btcoexist->btc_set(btcoexist, BTC_SET_BL_MIRACAST_PLUS_BT,
+  &miracast_plus_bt);
+   btc8821a2ant_action_wifi_multi_port(btcoexist);
+
+   return;
+   }
+
+   miracast_plus_bt = false;
+   btcoexist->btc_set(btcoexist, BTC_SET_BL_MIRACAST_PLUS_BT,
+  &miracast_plus_bt);
+
coex_dm->cur_algorithm = algorithm;
RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 "[BTCoex], Algorithm = %d\n", coex_dm->cur_algorithm);
-- 
2.12.0



[PATCH 03/14] rtlwifi: btcoex: 21a 2ant: force wifi to use RF path A

2017-04-15 Thread Larry Finger
From: Yan-Hsuan Chuang 

Let the wifi use main antenna to have higher power.

Signed-off-by: Yan-Hsuan Chuang 
Signed-off-by: Larry Finger 
Cc: Pkshih 
Cc: Birming Chiu 
Cc: Shaofu 
---
 drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a2ant.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a2ant.c 
b/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a2ant.c
index b880bc2eaf85..8437f1b6c108 100644
--- a/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a2ant.c
+++ b/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a2ant.c
@@ -2714,6 +2714,8 @@ static void btc8821a2ant_action_hid(struct btc_coexist 
*btcoexist)
bt_rssi_state = btc8821a2ant_bt_rssi_state(btcoexist,
2, BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);
 
+   btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xf, 0x0);
+
btc8821a2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
btc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
 
-- 
2.12.0



[PATCH 08/14] rtlwifi: btcoex: 21a 2ant: monitor extra wifi rssi to examine network status

2017-04-15 Thread Larry Finger
From: Yan-Hsuan Chuang 

Here we monitor one more wifi rssi to check the status of the network
and set the coex table instead of the legacy way.

Signed-off-by: Yan-Hsuan Chuang 
Signed-off-by: Larry Finger 
Cc: Pkshih 
Cc: Birming Chiu 
Cc: Shaofu 
Cc: Steven Ting 
---
 .../realtek/rtlwifi/btcoexist/halbtc8821a2ant.c| 51 +-
 1 file changed, 21 insertions(+), 30 deletions(-)

diff --git a/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a2ant.c 
b/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a2ant.c
index 4471bd66a2e5..b93a4f7ce17a 100644
--- a/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a2ant.c
+++ b/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a2ant.c
@@ -2939,11 +2939,18 @@ static void btc8821a2ant_action_a2dp_pan_hs(struct 
btc_coexist *btcoexist)
 
 static void btc8821a2ant_action_pan_edr(struct btc_coexist *btcoexist)
 {
-   u8 wifi_rssi_state, bt_rssi_state;
+   u8 wifi_rssi_state, wifi_rssi_state1, bt_rssi_state;
u32 wifi_bw;
 
wifi_rssi_state = btc8821a2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);
-   bt_rssi_state = btc8821a2ant_bt_rssi_state(btcoexist, 2, 35, 0);
+   wifi_rssi_state1 = btc8821a2ant_wifi_rssi_state(btcoexist, 1, 2,
+   BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);
+   bt_rssi_state = btc8821a2ant_bt_rssi_state(btcoexist,
+   2, BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);
+
+   btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xf, 0x0);
+
+   btc8821a2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
 
btc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
 
@@ -2952,30 +2959,25 @@ static void btc8821a2ant_action_pan_edr(struct 
btc_coexist *btcoexist)
else
btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, false);
 
-   btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
-
-   if (BTC_WIFI_BW_LEGACY == wifi_bw) {
-   /* for HID at 11b/g mode */
-   btc8821a2ant_coex_table(btcoexist, NORMAL_EXEC, 0x55ff55ff,
-   0x5aff5aff, 0x, 0x3);
+   if (BTC_RSSI_HIGH(wifi_rssi_state1) && BTC_RSSI_HIGH(bt_rssi_state)) {
+   btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 10);
+   btc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
+ 0x0, 0x0);
} else {
btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 13);
btc8821a2ant_power_save_state(btcoexist, BTC_PS_LPS_ON, 0x50,
  0x4);
}
 
-   if (BTC_WIFI_BW_HT40 == wifi_bw) {
-   /* fw mechanism */
-   if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
-   (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
-   btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC,
-true, 1);
-   } else {
-   btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC,
-true, 5);
-   }
+   if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
+   (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH))
+   btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 26);
+   else
+   btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 26);
 
-   /* sw mechanism */
+   /* sw mechanism */
+   btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
+   if (wifi_bw == BTC_WIFI_BW_HT40) {
if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
(wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
btc8821a2ant_sw_mechanism1(btcoexist, true, false,
@@ -2989,17 +2991,6 @@ static void btc8821a2ant_action_pan_edr(struct 
btc_coexist *btcoexist)
   false, 0x18);
}
} else {
-   /* fw mechanism */
-   if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
-   (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
-   btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC,
-true, 1);
-   } else {
-   btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC,
-true, 5);
-   }
-
-   /* sw mechanism */
if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
(wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
btc8821a2ant_sw_mechanism1(btcoexist, false, false,
-- 
2.12.0



[PATCH 00/14] rtlwifi: btcoex: Second set of changes for rtl8821ae 2ant

2017-04-15 Thread Larry Finger
These patches are the second set of patches for file
btcoexist/halbtc8821a2ant.c.

Signed-off-by: Yan-Hsuan Chuang 
Signed-off-by: Larry Finger 
Cc: Pkshih 
Cc: Birming Chiu 
Cc: Shaofu 
Cc: Steven Ting 

Yan-Hsuan Chuang (14):
  rtlwifi: btcoex: 21a 2ant: turn on sw dac swing and check if is
sco_only
  rtlwifi: btcoex: 21a 2ant: add threshold to examine bt rssi
  rtlwifi: btcoex: 21a 2ant: force wifi to use RF path A
  rtlwifi: btcoex: 21a 2ant: more combinations of wifi/bt rssi state
  rtlwifi: btcoex: 21a 2ant: fix some coding style issues
  rtlwifi: btcoex: 21a 2ant: set tdma based on rssi state amd limit rx
agg size
  rtlwifi: btcoex: 21a 2ant: add multiport action for p2p/miracast
  rtlwifi: btcoex: 21a 2ant: monitor extra wifi rssi to examine network
status
  rtlwifi: btcoex: 21a 2ant: notify fw the number of APs
  rtlwifi: btcoex: 21a 2ant: dec bt power according to bt rssi and set
tdma
  rtlwifi: btcoex: 21a 2ant: macro for bt rssi threshold
  rtlwifi: btcoex: 21a 2ant: do not limit rx agg size
  rtlwifi: btcoex: 21a 2ant: just return when wifi is under ips
  rtlwifi: btcoex: 21a 2ant: wifi is linking action

 .../realtek/rtlwifi/btcoexist/halbtc8821a2ant.c| 487 +++--
 1 file changed, 264 insertions(+), 223 deletions(-)

-- 
2.12.0



[PATCH 09/14] rtlwifi: btcoex: 21a 2ant: notify fw the number of APs

2017-04-15 Thread Larry Finger
From: Yan-Hsuan Chuang 

Use h2c to tell the firmware if the number of AP is more than 10 or
not.

Signed-off-by: Yan-Hsuan Chuang 
Signed-off-by: Larry Finger 
Cc: Pkshih 
Cc: Birming Chiu 
Cc: Shaofu 
Cc: Steven Ting 
---
 .../net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a2ant.c   | 10 --
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a2ant.c 
b/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a2ant.c
index b93a4f7ce17a..9e152117730c 100644
--- a/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a2ant.c
+++ b/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a2ant.c
@@ -3982,6 +3982,7 @@ void ex_btc8821a2ant_media_status_notify(struct 
btc_coexist *btcoexist,
u8 h2c_parameter[3] = {0};
u32 wifi_bw;
u8 wifi_central_chnl;
+   u8 ap_num = 0;
 
if (BTC_MEDIA_CONNECT == type) {
RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
@@ -3999,10 +4000,15 @@ void ex_btc8821a2ant_media_status_notify(struct 
btc_coexist *btcoexist,
h2c_parameter[0] = 0x1;
h2c_parameter[1] = wifi_central_chnl;
btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
-   if (BTC_WIFI_BW_HT40 == wifi_bw)
+   if (wifi_bw == BTC_WIFI_BW_HT40) {
h2c_parameter[2] = 0x30;
-   else
+   } else {
h2c_parameter[2] = 0x20;
+   if (ap_num < 10)
+   h2c_parameter[2] = 0x30;
+   else
+   h2c_parameter[2] = 0x20;
+   }
}
 
coex_dm->wifi_chnl_info[0] = h2c_parameter[0];
-- 
2.12.0



RE: [PATCH v5 4/4] mwifiex: pcie: extract wifi part from combo firmware during function level reset

2017-04-15 Thread Xinming Hu
Hi,

> -Original Message-
> From: Brian Norris [mailto:briannor...@chromium.org]
> Sent: 2017年4月14日 4:11
> To: Xinming Hu
> Cc: Linux Wireless; Kalle Valo; Dmitry Torokhov; raja...@google.com; Cathy 
> Luo;
> Xinming Hu; Ganapathi Bhat
> Subject: [EXT] [PATCH v5 4/4] mwifiex: pcie: extract wifi part from combo
> firmware during function level reset
> 
> External Email
> 
> --
> From: Xinming Hu 
> 
> A separate wifi-only firmware was download during pcie function level reset. 
> It
> is in fact the tail part of wifi/bt combo firmware. Per Brian's and Dmitry's
> suggestion, this patch extract the wifi part from combo firmware.
> 
> After that, the mrvl/pcie8997_wlan_v4.bin image in linux-firmware repo is
> redundant (though I guess we keep it around to support older kernels).
> 
> Signed-off-by: Xinming Hu 
> Signed-off-by: Ganapathi Bhat 
> Signed-off-by: Cathy Luo 
> Signed-off-by: Brian Norris 
> ---
> On Thu, Apr 13, 2017 at 11:46:30AM -0700, Brian Norris wrote:
> > I might just rewrite this and send it myself, if I get the time.
> 
> Done.
> 
> v2: extract wifi part from combo firmware(Dmitry and Brian)
> add more description(Kalle)
> v3: same as v2
> v4: add sequence comments, code enhance(Brian)
> v5: (Brian) fix overflow errors
> (Brian) add missing newline chars
> (Brian) consolidate header-skipping logic
> 
> Note: I only resubmitted the 4th patch, as the others look fine
> ---
>  drivers/net/wireless/marvell/mwifiex/fw.h   |  18 +
>  drivers/net/wireless/marvell/mwifiex/pcie.c | 114
> ++--
>  drivers/net/wireless/marvell/mwifiex/pcie.h |   3 +-
>  3 files changed, 127 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/net/wireless/marvell/mwifiex/fw.h
> b/drivers/net/wireless/marvell/mwifiex/fw.h
> index 0b683742e30c..6cf9ab9133ea 100644
> --- a/drivers/net/wireless/marvell/mwifiex/fw.h
> +++ b/drivers/net/wireless/marvell/mwifiex/fw.h
> @@ -43,6 +43,24 @@ struct tx_packet_hdr {
>   struct rfc_1042_hdr rfc1042_hdr;
>  } __packed;
> 
> +struct mwifiex_fw_header {
> + __le32 dnld_cmd;
> + __le32 base_addr;
> + __le32 data_length;
> + __le32 crc;
> +} __packed;
> +
> +struct mwifiex_fw_data {
> + struct mwifiex_fw_header header;
> + __le32 seq_num;
> + u8 data[1];
> +} __packed;
> +
> +#define MWIFIEX_FW_DNLD_CMD_1 0x1
> +#define MWIFIEX_FW_DNLD_CMD_5 0x5
> +#define MWIFIEX_FW_DNLD_CMD_6 0x6
> +#define MWIFIEX_FW_DNLD_CMD_7 0x7
> +
>  #define B_SUPPORTED_RATES   5
>  #define G_SUPPORTED_RATES   9
>  #define BG_SUPPORTED_RATES  13
> diff --git a/drivers/net/wireless/marvell/mwifiex/pcie.c
> b/drivers/net/wireless/marvell/mwifiex/pcie.c
> index 061223149bed..63102efb388e 100644
> --- a/drivers/net/wireless/marvell/mwifiex/pcie.c
> +++ b/drivers/net/wireless/marvell/mwifiex/pcie.c
> @@ -1956,6 +1956,94 @@ static int mwifiex_pcie_event_complete(struct
> mwifiex_adapter *adapter,
>   return ret;
>  }
> 
> +/* Combo firmware image is a combination of
> + * (1) combo crc heaer, start with CMD5
> + * (2) bluetooth image, start with CMD7, end with CMD6, data wrapped in
> CMD1.
> + * (3) wifi image.
> + *
> + * This function bypass the header and bluetooth part, return
> + * the offset of tail wifi-only part.
> + */
> +
> +static int mwifiex_extract_wifi_fw(struct mwifiex_adapter *adapter,
> +const void *firmware, u32 firmware_len) {
> + const struct mwifiex_fw_data *fwdata;
> + u32 offset = 0, data_len, dnld_cmd;
> + int ret = 0;
> + bool cmd7_before = false;
> +
> + while (1) {
> + /* Check for integer and buffer overflow */
> + if (offset + sizeof(fwdata->header) < sizeof(fwdata->header) ||
> + offset + sizeof(fwdata->header) >= firmware_len) {
> + mwifiex_dbg(adapter, ERROR,
> + "extract wifi-only fw failure!\n");
> + ret = -1;
> + goto done;
> + }
> +
> + fwdata = firmware + offset;
> + dnld_cmd = le32_to_cpu(fwdata->header.dnld_cmd);
> + data_len = le32_to_cpu(fwdata->header.data_length);
> +
> + /* Skip past header */
> + offset += sizeof(fwdata->header);
> +
> + switch (dnld_cmd) {
> + case MWIFIEX_FW_DNLD_CMD_1:
> + if (!cmd7_before) {
> + mwifiex_dbg(adapter, ERROR,
> + "no cmd7 before cmd1!\n");
> + ret = -1;
> + goto done;
> + }
> + if (offset + data_len < data_len) {
> + mwifiex_dbg(adapter, ERROR, "bad FW parse\n");
> + ret = -1;
> + goto done;
> + 

RE: Re: Re: Re: [PATCH v3 4/4] mwifiex: pcie: extract wifi part from combo firmware during function level reset

2017-04-15 Thread Xinming Hu
Hi Brain,

> -Original Message-
> From: Brian Norris [mailto:briannor...@chromium.org]
> Sent: 2017年4月15日 0:56
> To: Xinming Hu
> Cc: Linux Wireless; Kalle Valo; Dmitry Torokhov; raja...@google.com;
> Amitkumar Karwar; Cathy Luo; Ganapathi Bhat
> Subject: [EXT] Re: Re: Re: [PATCH v3 4/4] mwifiex: pcie: extract wifi part 
> from
> combo firmware during function level reset
> 
> External Email
> 
> --
> Hi,
> 
> On Fri, Apr 14, 2017 at 03:28:28AM +, Xinming Hu wrote:
> > According to the firmware download protocol, every CMD should not exceed
> MWIFIEX_UPLD_SIZE.
> > we can add a sanity check , like,
> > if (data_len > MWIFIEX_UPLD_SIZE - sizeof(fwdata->header))
> > *error*
> 
> I was primarily interested in protecting the kernel itself. Once the kernel 
> starts
> parsing the firmware, we have to make sure a bad firmware file won't end up
> with us looping infinitely, reading/writing invalid memory, or otherwise
> exposing security or stability issues. I wasn't necessarily interested in 
> validating
> every requirement of the end-point device. For example, we're not bothering
> checking the CRCs. I figured that this was all the job of your Wifi card's 
> boot
> ROM.
> 
> So, we *can* implement checks like this, but I'd really hope we don't need 
> this
> particular one, because your card should be taking care of that.
> 

Got it, we will keep in mind to check the possible overflow in future, either 
using general
protect or under limit by our device requirement.

> Please consider reviewing my latest submission.
> 

Sure.

Thanks,
Simon
> Regards,
> Brian


NFC-FDP: Completion of error handling around fdp_nci_i2c_read_device_properties()

2017-04-15 Thread SF Markus Elfring
Hello,

I have noticed that the function “fdp_nci_i2c_read_device_properties” does not
contain a null pointer check after a call of the function “devm_kmalloc”.
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/nfc/fdp/i2c.c?h=v4.10#n234

How do you think about to add a corresponding check and adjust the function
return type there?

Regards,
Markus