diff mbox

[v2,08/10] rtlwifi: btcoex: Remove global variables from btcoex

Message ID 20180111070932.9929-9-pkshih@realtek.com (mailing list archive)
State Changes Requested
Delegated to: Kalle Valo
Headers show

Commit Message

Ping-Ke Shih Jan. 11, 2018, 7:09 a.m. UTC
From: Ping-Ke Shih <pkshih@realtek.com>

Remove global variables, so btcoexist can support multiple instances
simultaneously.

Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
---
 .../realtek/rtlwifi/btcoexist/halbtcoutsrc.c       |  79 ++++-----
 .../realtek/rtlwifi/btcoexist/halbtcoutsrc.h       |  21 +--
 .../wireless/realtek/rtlwifi/btcoexist/rtl_btc.c   | 182 +++++++++++++++++----
 .../wireless/realtek/rtlwifi/btcoexist/rtl_btc.h   |   3 +-
 drivers/net/wireless/realtek/rtlwifi/pci.c         |   5 +-
 drivers/net/wireless/realtek/rtlwifi/wifi.h        |   5 +-
 6 files changed, 217 insertions(+), 78 deletions(-)

Comments

Larry Finger Jan. 15, 2018, 7:02 p.m. UTC | #1
On 01/11/2018 01:09 AM, pkshih@realtek.com wrote:
> From: Ping-Ke Shih <pkshih@realtek.com>
> 
> Remove global variables, so btcoexist can support multiple instances
> simultaneously.
> 
> Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
> ---
>   .../realtek/rtlwifi/btcoexist/halbtcoutsrc.c       |  79 ++++-----
>   .../realtek/rtlwifi/btcoexist/halbtcoutsrc.h       |  21 +--
>   .../wireless/realtek/rtlwifi/btcoexist/rtl_btc.c   | 182 +++++++++++++++++----
>   .../wireless/realtek/rtlwifi/btcoexist/rtl_btc.h   |   3 +-
>   drivers/net/wireless/realtek/rtlwifi/pci.c         |   5 +-
>   drivers/net/wireless/realtek/rtlwifi/wifi.h        |   5 +-
>   6 files changed, 217 insertions(+), 78 deletions(-)

I am very happy to see this change. Although a given box is unlikely to have 
more than one PCI wireless device, it is certainly possible for one of the PCI 
drivers and rtl8192cu to both be needed.

Acked-by: Larry Finger <Larry.Finger@lwfinger.net>

> 
> diff --git a/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.c b/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.c
> index 5f3eda31187a..2be81fec789a 100644
> --- a/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.c
> +++ b/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.c
> @@ -25,14 +25,6 @@
>   
>   #include "halbt_precomp.h"
>   
> -/***********************************************
> - *		Global variables
> - ***********************************************/
> -
> -struct btc_coexist gl_bt_coexist;
> -
> -u32 btc_dbg_type[BTC_MSG_MAX];
> -
>   /***************************************************
>    *		Debug related function
>    ***************************************************/
> @@ -971,9 +963,12 @@ bool halbtc_under_ips(struct btc_coexist *btcoexist)
>   /*****************************************************************
>    *         Extern functions called by other module
>    *****************************************************************/
> -bool exhalbtc_initlize_variables(void)
> +bool exhalbtc_initlize_variables(struct rtl_priv *rtlpriv)
>   {
> -	struct btc_coexist *btcoexist = &gl_bt_coexist;
> +	struct btc_coexist *btcoexist = rtl_btc_coexist(rtlpriv);
> +
> +	if (!btcoexist)
> +		return false;
>   
>   	halbtc_dbg_init();
>   
> @@ -1009,9 +1004,12 @@ bool exhalbtc_initlize_variables(void)
>   
>   bool exhalbtc_bind_bt_coex_withadapter(void *adapter)
>   {
> -	struct btc_coexist *btcoexist = &gl_bt_coexist;
>   	struct rtl_priv *rtlpriv = adapter;
> -	u8 ant_num = 2, chip_type;
> +	struct btc_coexist *btcoexist = rtl_btc_coexist(rtlpriv);
> +	u8 ant_num = 2, chip_type, single_ant_path = 0;
> +
> +	if (!btcoexist)
> +		return false;
>   
>   	if (btcoexist->binded)
>   		return false;
> @@ -1042,10 +1040,16 @@ bool exhalbtc_bind_bt_coex_withadapter(void *adapter)
>   	btcoexist->bt_info.miracast_plus_bt = false;
>   
>   	chip_type = rtl_get_hwpg_bt_type(rtlpriv);
> -	exhalbtc_set_chip_type(chip_type);
> +	exhalbtc_set_chip_type(btcoexist, chip_type);
>   	ant_num = rtl_get_hwpg_ant_num(rtlpriv);
>   	exhalbtc_set_ant_num(rtlpriv, BT_COEX_ANT_TYPE_PG, ant_num);
>   
> +	/* set default antenna position to main  port */
> +	btcoexist->board_info.btdm_ant_pos = BTC_ANTENNA_AT_MAIN_PORT;
> +
> +	single_ant_path = rtl_get_hwpg_single_ant_path(rtlpriv);
> +	exhalbtc_set_single_ant_path(btcoexist, single_ant_path);
> +
>   	if (rtl_get_hwpg_package_type(rtlpriv) == 0)
>   		btcoexist->board_info.tfbga_package = false;
>   	else if (rtl_get_hwpg_package_type(rtlpriv) == 1)
> @@ -1550,30 +1554,25 @@ void exhalbtc_stack_update_profile_info(void)
>   {
>   }
>   
> -void exhalbtc_update_min_bt_rssi(s8 bt_rssi)
> +void exhalbtc_update_min_bt_rssi(struct btc_coexist *btcoexist, s8 bt_rssi)
>   {
> -	struct btc_coexist *btcoexist = &gl_bt_coexist;
> -
>   	if (!halbtc_is_bt_coexist_available(btcoexist))
>   		return;
>   
>   	btcoexist->stack_info.min_bt_rssi = bt_rssi;
>   }
>   
> -void exhalbtc_set_hci_version(u16 hci_version)
> +void exhalbtc_set_hci_version(struct btc_coexist *btcoexist, u16 hci_version)
>   {
> -	struct btc_coexist *btcoexist = &gl_bt_coexist;
> -
>   	if (!halbtc_is_bt_coexist_available(btcoexist))
>   		return;
>   
>   	btcoexist->stack_info.hci_version = hci_version;
>   }
>   
> -void exhalbtc_set_bt_patch_version(u16 bt_hci_version, u16 bt_patch_version)
> +void exhalbtc_set_bt_patch_version(struct btc_coexist *btcoexist,
> +				   u16 bt_hci_version, u16 bt_patch_version)
>   {
> -	struct btc_coexist *btcoexist = &gl_bt_coexist;
> -
>   	if (!halbtc_is_bt_coexist_available(btcoexist))
>   		return;
>   
> @@ -1581,7 +1580,7 @@ void exhalbtc_set_bt_patch_version(u16 bt_hci_version, u16 bt_patch_version)
>   	btcoexist->bt_info.bt_hci_ver = bt_hci_version;
>   }
>   
> -void exhalbtc_set_chip_type(u8 chip_type)
> +void exhalbtc_set_chip_type(struct btc_coexist *btcoexist, u8 chip_type)
>   {
>   	switch (chip_type) {
>   	default:
> @@ -1589,48 +1588,54 @@ void exhalbtc_set_chip_type(u8 chip_type)
>   	case BT_ISSC_3WIRE:
>   	case BT_ACCEL:
>   	case BT_RTL8756:
> -		gl_bt_coexist.board_info.bt_chip_type = BTC_CHIP_UNDEF;
> +		btcoexist->board_info.bt_chip_type = BTC_CHIP_UNDEF;
>   		break;
>   	case BT_CSR_BC4:
> -		gl_bt_coexist.board_info.bt_chip_type = BTC_CHIP_CSR_BC4;
> +		btcoexist->board_info.bt_chip_type = BTC_CHIP_CSR_BC4;
>   		break;
>   	case BT_CSR_BC8:
> -		gl_bt_coexist.board_info.bt_chip_type = BTC_CHIP_CSR_BC8;
> +		btcoexist->board_info.bt_chip_type = BTC_CHIP_CSR_BC8;
>   		break;
>   	case BT_RTL8723A:
> -		gl_bt_coexist.board_info.bt_chip_type = BTC_CHIP_RTL8723A;
> +		btcoexist->board_info.bt_chip_type = BTC_CHIP_RTL8723A;
>   		break;
>   	case BT_RTL8821A:
> -		gl_bt_coexist.board_info.bt_chip_type = BTC_CHIP_RTL8821;
> +		btcoexist->board_info.bt_chip_type = BTC_CHIP_RTL8821;
>   		break;
>   	case BT_RTL8723B:
> -		gl_bt_coexist.board_info.bt_chip_type = BTC_CHIP_RTL8723B;
> +		btcoexist->board_info.bt_chip_type = BTC_CHIP_RTL8723B;
>   		break;
>   	}
>   }
>   
>   void exhalbtc_set_ant_num(struct rtl_priv *rtlpriv, u8 type, u8 ant_num)
>   {
> +	struct btc_coexist *btcoexist = rtl_btc_coexist(rtlpriv);
> +
> +	if (!btcoexist)
> +		return;
> +
>   	if (BT_COEX_ANT_TYPE_PG == type) {
> -		gl_bt_coexist.board_info.pg_ant_num = ant_num;
> -		gl_bt_coexist.board_info.btdm_ant_num = ant_num;
> +		btcoexist->board_info.pg_ant_num = ant_num;
> +		btcoexist->board_info.btdm_ant_num = ant_num;
>   	} else if (BT_COEX_ANT_TYPE_ANTDIV == type) {
> -		gl_bt_coexist.board_info.btdm_ant_num = ant_num;
> +		btcoexist->board_info.btdm_ant_num = ant_num;
>   	} else if (type == BT_COEX_ANT_TYPE_DETECTED) {
> -		gl_bt_coexist.board_info.btdm_ant_num = ant_num;
> +		btcoexist->board_info.btdm_ant_num = ant_num;
>   		if (rtlpriv->cfg->mod_params->ant_sel == 1)
> -			gl_bt_coexist.board_info.btdm_ant_pos =
> +			btcoexist->board_info.btdm_ant_pos =
>   				BTC_ANTENNA_AT_AUX_PORT;
>   		else
> -			gl_bt_coexist.board_info.btdm_ant_pos =
> +			btcoexist->board_info.btdm_ant_pos =
>   				BTC_ANTENNA_AT_MAIN_PORT;
>   	}
>   }
>   
>   /* Currently used by 8723b only, S0 or S1 */
> -void exhalbtc_set_single_ant_path(u8 single_ant_path)
> +void exhalbtc_set_single_ant_path(struct btc_coexist *btcoexist,
> +				  u8 single_ant_path)
>   {
> -	gl_bt_coexist.board_info.single_ant_path = single_ant_path;
> +	btcoexist->board_info.single_ant_path = single_ant_path;
>   }
>   
>   void exhalbtc_display_bt_coex_info(struct btc_coexist *btcoexist,
> diff --git a/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.h b/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.h
> index bc523af7ef88..5a7816ff6877 100644
> --- a/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.h
> +++ b/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.h
> @@ -103,8 +103,6 @@ enum btc_msg_type {
>   	BTC_MSG_MAX
>   };
>   
> -extern u32 btc_dbg_type[];
> -
>   /* following is for BTC_MSG_INTERFACE */
>   #define		INTF_INIT				BIT0
>   #define		INTF_NOTIFY				BIT2
> @@ -604,9 +602,10 @@ struct btc_coexist {
>   
>   bool halbtc_is_wifi_uplink(struct rtl_priv *adapter);
>   
> -extern struct btc_coexist gl_bt_coexist;
> +#define rtl_btc_coexist(rtlpriv)				\
> +	((struct btc_coexist *)((rtlpriv)->btcoexist.btc_context))
>   
> -bool exhalbtc_initlize_variables(void);
> +bool exhalbtc_initlize_variables(struct rtl_priv *rtlpriv);
>   bool exhalbtc_bind_bt_coex_withadapter(void *adapter);
>   void exhalbtc_power_on_setting(struct btc_coexist *btcoexist);
>   void exhalbtc_init_hw_config(struct btc_coexist *btcoexist, bool wifi_only);
> @@ -628,11 +627,12 @@ void exhalbtc_periodical(struct btc_coexist *btcoexist);
>   void exhalbtc_dbg_control(struct btc_coexist *btcoexist, u8 code, u8 len,
>   			  u8 *data);
>   void exhalbtc_stack_update_profile_info(void);
> -void exhalbtc_set_hci_version(u16 hci_version);
> -void exhalbtc_set_bt_patch_version(u16 bt_hci_version, u16 bt_patch_version);
> -void exhalbtc_update_min_bt_rssi(s8 bt_rssi);
> -void exhalbtc_set_bt_exist(bool bt_exist);
> -void exhalbtc_set_chip_type(u8 chip_type);
> +void exhalbtc_set_hci_version(struct btc_coexist *btcoexist, u16 hci_version);
> +void exhalbtc_set_bt_patch_version(struct btc_coexist *btcoexist,
> +				   u16 bt_hci_version, u16 bt_patch_version);
> +void exhalbtc_update_min_bt_rssi(struct btc_coexist *btcoexist, s8 bt_rssi);
> +void exhalbtc_set_bt_exist(struct btc_coexist *btcoexist, bool bt_exist);
> +void exhalbtc_set_chip_type(struct btc_coexist *btcoexist, u8 chip_type);
>   void exhalbtc_set_ant_num(struct rtl_priv *rtlpriv, u8 type, u8 ant_num);
>   void exhalbtc_display_bt_coex_info(struct btc_coexist *btcoexist,
>   				   struct seq_file *m);
> @@ -640,6 +640,7 @@ void exhalbtc_signal_compensation(struct btc_coexist *btcoexist,
>   				  u8 *rssi_wifi, u8 *rssi_bt);
>   void exhalbtc_lps_leave(struct btc_coexist *btcoexist);
>   void exhalbtc_low_wifi_traffic_notify(struct btc_coexist *btcoexist);
> -void exhalbtc_set_single_ant_path(u8 single_ant_path);
> +void exhalbtc_set_single_ant_path(struct btc_coexist *btcoexist,
> +				  u8 single_ant_path);
>   
>   #endif
> diff --git a/drivers/net/wireless/realtek/rtlwifi/btcoexist/rtl_btc.c b/drivers/net/wireless/realtek/rtlwifi/btcoexist/rtl_btc.c
> index 9e3623b0423c..ddbef65c3740 100644
> --- a/drivers/net/wireless/realtek/rtlwifi/btcoexist/rtl_btc.c
> +++ b/drivers/net/wireless/realtek/rtlwifi/btcoexist/rtl_btc.c
> @@ -31,6 +31,7 @@
>   
>   static struct rtl_btc_ops rtl_btc_operation = {
>   	.btc_init_variables = rtl_btc_init_variables,
> +	.btc_deinit_variables = rtl_btc_deinit_variables,
>   	.btc_init_hal_vars = rtl_btc_init_hal_vars,
>   	.btc_power_on_setting = rtl_btc_power_on_setting,
>   	.btc_init_hw_config = rtl_btc_init_hw_config,
> @@ -58,58 +59,116 @@ static struct rtl_btc_ops rtl_btc_operation = {
>   
>   void rtl_btc_display_bt_coex_info(struct rtl_priv *rtlpriv, struct seq_file *m)
>   {
> -	exhalbtc_display_bt_coex_info(&gl_bt_coexist, m);
> +	struct btc_coexist *btcoexist = rtl_btc_coexist(rtlpriv);
> +
> +	if (!btcoexist) {
> +		seq_puts(m, "btc_coexist context is NULL!\n");
> +		return;
> +	}
> +
> +	exhalbtc_display_bt_coex_info(btcoexist, m);
>   }
>   
>   void rtl_btc_record_pwr_mode(struct rtl_priv *rtlpriv, u8 *buf, u8 len)
>   {
> +	struct btc_coexist *btcoexist = rtl_btc_coexist(rtlpriv);
>   	u8 safe_len;
>   
> -	safe_len = sizeof(gl_bt_coexist.pwr_mode_val);
> +	if (!btcoexist)
> +		return;
> +
> +	safe_len = sizeof(btcoexist->pwr_mode_val);
>   
>   	if (safe_len > len)
>   		safe_len = len;
>   
> -	memcpy(gl_bt_coexist.pwr_mode_val, buf, safe_len);
> +	memcpy(btcoexist->pwr_mode_val, buf, safe_len);
>   }
>   
>   u8 rtl_btc_get_lps_val(struct rtl_priv *rtlpriv)
>   {
> -	return gl_bt_coexist.bt_info.lps_val;
> +	struct btc_coexist *btcoexist = rtl_btc_coexist(rtlpriv);
> +
> +	if (!btcoexist)
> +		return 0;
> +
> +	return btcoexist->bt_info.lps_val;
>   }
>   
>   u8 rtl_btc_get_rpwm_val(struct rtl_priv *rtlpriv)
>   {
> -	return gl_bt_coexist.bt_info.rpwm_val;
> +	struct btc_coexist *btcoexist = rtl_btc_coexist(rtlpriv);
> +
> +	if (!btcoexist)
> +		return 0;
> +
> +	return btcoexist->bt_info.rpwm_val;
>   }
>   
>   bool rtl_btc_is_bt_ctrl_lps(struct rtl_priv *rtlpriv)
>   {
> -	return gl_bt_coexist.bt_info.bt_ctrl_lps;
> +	struct btc_coexist *btcoexist = rtl_btc_coexist(rtlpriv);
> +
> +	if (!btcoexist)
> +		return false;
> +
> +	return btcoexist->bt_info.bt_ctrl_lps;
>   }
>   
>   bool rtl_btc_is_bt_lps_on(struct rtl_priv *rtlpriv)
>   {
> -	return gl_bt_coexist.bt_info.bt_lps_on;
> +	struct btc_coexist *btcoexist = rtl_btc_coexist(rtlpriv);
> +
> +	if (!btcoexist)
> +		return false;
> +
> +	return btcoexist->bt_info.bt_lps_on;
>   }
>   
>   void rtl_btc_get_ampdu_cfg(struct rtl_priv *rtlpriv, u8 *reject_agg,
>   			   u8 *ctrl_agg_size, u8 *agg_size)
>   {
> +	struct btc_coexist *btcoexist = rtl_btc_coexist(rtlpriv);
> +
> +	if (!btcoexist) {
> +		*reject_agg = false;
> +		*ctrl_agg_size = false;
> +		return;
> +	}
> +
>   	if (reject_agg)
> -		*reject_agg = gl_bt_coexist.bt_info.reject_agg_pkt;
> +		*reject_agg = btcoexist->bt_info.reject_agg_pkt;
>   	if (ctrl_agg_size)
> -		*ctrl_agg_size = gl_bt_coexist.bt_info.bt_ctrl_agg_buf_size;
> +		*ctrl_agg_size = btcoexist->bt_info.bt_ctrl_agg_buf_size;
>   	if (agg_size)
> -		*agg_size = gl_bt_coexist.bt_info.agg_buf_size;
> +		*agg_size = btcoexist->bt_info.agg_buf_size;
> +}
> +
> +static void rtl_btc_alloc_variable(struct rtl_priv *rtlpriv, bool wifi_only)
> +{
> +	rtlpriv->btcoexist.btc_context =
> +			kzalloc(sizeof(struct btc_coexist), GFP_KERNEL);
> +}
> +
> +static void rtl_btc_free_variable(struct rtl_priv *rtlpriv)
> +{
> +	kfree(rtlpriv->btcoexist.btc_context);
> +	rtlpriv->btcoexist.btc_context = NULL;
>   }
>   
>   void rtl_btc_init_variables(struct rtl_priv *rtlpriv)
>   {
> -	exhalbtc_initlize_variables();
> +	rtl_btc_alloc_variable(rtlpriv, false);
> +
> +	exhalbtc_initlize_variables(rtlpriv);
>   	exhalbtc_bind_bt_coex_withadapter(rtlpriv);
>   }
>   
> +void rtl_btc_deinit_variables(struct rtl_priv *rtlpriv)
> +{
> +	rtl_btc_free_variable(rtlpriv);
> +}
> +
>   void rtl_btc_init_hal_vars(struct rtl_priv *rtlpriv)
>   {
>   	/* move ant_num, bt_type and single_ant_path to
> @@ -119,71 +178,123 @@ void rtl_btc_init_hal_vars(struct rtl_priv *rtlpriv)
>   
>   void rtl_btc_power_on_setting(struct rtl_priv *rtlpriv)
>   {
> -	exhalbtc_power_on_setting(&gl_bt_coexist);
> +	struct btc_coexist *btcoexist = rtl_btc_coexist(rtlpriv);
> +
> +	if (!btcoexist)
> +		return;
> +
> +	exhalbtc_power_on_setting(btcoexist);
>   }
>   
>   void rtl_btc_init_hw_config(struct rtl_priv *rtlpriv)
>   {
> +	struct btc_coexist *btcoexist = rtl_btc_coexist(rtlpriv);
> +
>   	u8 bt_exist;
>   
>   	bt_exist = rtl_get_hwpg_bt_exist(rtlpriv);
>   	RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
>   		"%s, bt_exist is %d\n", __func__, bt_exist);
>   
> -	exhalbtc_init_hw_config(&gl_bt_coexist, !bt_exist);
> -	exhalbtc_init_coex_dm(&gl_bt_coexist);
> +	if (!btcoexist)
> +		return;
> +
> +	exhalbtc_init_hw_config(btcoexist, !bt_exist);
> +	exhalbtc_init_coex_dm(btcoexist);
>   }
>   
>   void rtl_btc_ips_notify(struct rtl_priv *rtlpriv, u8 type)
>   {
> -	exhalbtc_ips_notify(&gl_bt_coexist, type);
> +	struct btc_coexist *btcoexist = rtl_btc_coexist(rtlpriv);
> +
> +	if (!btcoexist)
> +		return;
> +
> +	exhalbtc_ips_notify(btcoexist, type);
>   }
>   
>   void rtl_btc_lps_notify(struct rtl_priv *rtlpriv, u8 type)
>   {
> -	exhalbtc_lps_notify(&gl_bt_coexist, type);
> +	struct btc_coexist *btcoexist = rtl_btc_coexist(rtlpriv);
> +
> +	if (!btcoexist)
> +		return;
> +
> +	exhalbtc_lps_notify(btcoexist, type);
>   }
>   
>   void rtl_btc_scan_notify(struct rtl_priv *rtlpriv, u8 scantype)
>   {
> -	exhalbtc_scan_notify(&gl_bt_coexist, scantype);
> +	struct btc_coexist *btcoexist = rtl_btc_coexist(rtlpriv);
> +
> +	if (!btcoexist)
> +		return;
> +
> +	exhalbtc_scan_notify(btcoexist, scantype);
>   }
>   
>   void rtl_btc_connect_notify(struct rtl_priv *rtlpriv, u8 action)
>   {
> -	exhalbtc_connect_notify(&gl_bt_coexist, action);
> +	struct btc_coexist *btcoexist = rtl_btc_coexist(rtlpriv);
> +
> +	if (!btcoexist)
> +		return;
> +
> +	exhalbtc_connect_notify(btcoexist, action);
>   }
>   
>   void rtl_btc_mediastatus_notify(struct rtl_priv *rtlpriv,
>   				enum rt_media_status mstatus)
>   {
> -	exhalbtc_mediastatus_notify(&gl_bt_coexist, mstatus);
> +	struct btc_coexist *btcoexist = rtl_btc_coexist(rtlpriv);
> +
> +	if (!btcoexist)
> +		return;
> +
> +	exhalbtc_mediastatus_notify(btcoexist, mstatus);
>   }
>   
>   void rtl_btc_periodical(struct rtl_priv *rtlpriv)
>   {
> +	struct btc_coexist *btcoexist = rtl_btc_coexist(rtlpriv);
> +
> +	if (!btcoexist)
> +		return;
> +
>   	/*rtl_bt_dm_monitor();*/
> -	exhalbtc_periodical(&gl_bt_coexist);
> +	exhalbtc_periodical(btcoexist);
>   }
>   
> -void rtl_btc_halt_notify(void)
> +void rtl_btc_halt_notify(struct rtl_priv *rtlpriv)
>   {
> -	struct btc_coexist *btcoexist = &gl_bt_coexist;
> +	struct btc_coexist *btcoexist = rtl_btc_coexist(rtlpriv);
> +
> +	if (!btcoexist)
> +		return;
>   
>   	exhalbtc_halt_notify(btcoexist);
>   }
>   
>   void rtl_btc_btinfo_notify(struct rtl_priv *rtlpriv, u8 *tmp_buf, u8 length)
>   {
> -	exhalbtc_bt_info_notify(&gl_bt_coexist, tmp_buf, length);
> +	struct btc_coexist *btcoexist = rtl_btc_coexist(rtlpriv);
> +
> +	if (!btcoexist)
> +		return;
> +
> +	exhalbtc_bt_info_notify(btcoexist, tmp_buf, length);
>   }
>   
>   void rtl_btc_btmpinfo_notify(struct rtl_priv *rtlpriv, u8 *tmp_buf, u8 length)
>   {
> +	struct btc_coexist *btcoexist = rtl_btc_coexist(rtlpriv);
>   	u8 extid, seq, len;
>   	u16 bt_real_fw_ver;
>   	u8 bt_fw_ver;
>   
> +	if (!btcoexist)
> +		return;
> +
>   	if ((length < 4) || (!tmp_buf))
>   		return;
>   
> @@ -200,14 +311,19 @@ void rtl_btc_btmpinfo_notify(struct rtl_priv *rtlpriv, u8 *tmp_buf, u8 length)
>   		bt_real_fw_ver = tmp_buf[3] | (tmp_buf[4] << 8);
>   		bt_fw_ver = tmp_buf[5];
>   
> -		gl_bt_coexist.bt_info.bt_real_fw_ver = bt_real_fw_ver;
> -		gl_bt_coexist.bt_info.bt_fw_ver = bt_fw_ver;
> +		btcoexist->bt_info.bt_real_fw_ver = bt_real_fw_ver;
> +		btcoexist->bt_info.bt_fw_ver = bt_fw_ver;
>   	}
>   }
>   
>   bool rtl_btc_is_limited_dig(struct rtl_priv *rtlpriv)
>   {
> -	return gl_bt_coexist.bt_info.limited_dig;
> +	struct btc_coexist *btcoexist = rtl_btc_coexist(rtlpriv);
> +
> +	if (!btcoexist)
> +		return false;
> +
> +	return btcoexist->bt_info.limited_dig;
>   }
>   
>   bool rtl_btc_is_disable_edca_turbo(struct rtl_priv *rtlpriv)
> @@ -239,8 +355,13 @@ bool rtl_btc_is_disable_edca_turbo(struct rtl_priv *rtlpriv)
>   
>   bool rtl_btc_is_bt_disabled(struct rtl_priv *rtlpriv)
>   {
> +	struct btc_coexist *btcoexist = rtl_btc_coexist(rtlpriv);
> +
> +	if (!btcoexist)
> +		return true;
> +
>   	/* It seems 'bt_disabled' is never be initialized or set. */
> -	if (gl_bt_coexist.bt_info.bt_disabled)
> +	if (btcoexist->bt_info.bt_disabled)
>   		return true;
>   	else
>   		return false;
> @@ -248,7 +369,12 @@ bool rtl_btc_is_bt_disabled(struct rtl_priv *rtlpriv)
>   
>   void rtl_btc_special_packet_notify(struct rtl_priv *rtlpriv, u8 pkt_type)
>   {
> -	return exhalbtc_special_packet_notify(&gl_bt_coexist, pkt_type);
> +	struct btc_coexist *btcoexist = rtl_btc_coexist(rtlpriv);
> +
> +	if (!btcoexist)
> +		return;
> +
> +	return exhalbtc_special_packet_notify(btcoexist, pkt_type);
>   }
>   
>   struct rtl_btc_ops *rtl_btc_get_ops_pointer(void)
> diff --git a/drivers/net/wireless/realtek/rtlwifi/btcoexist/rtl_btc.h b/drivers/net/wireless/realtek/rtlwifi/btcoexist/rtl_btc.h
> index 9becfa59407d..8c5098266039 100644
> --- a/drivers/net/wireless/realtek/rtlwifi/btcoexist/rtl_btc.h
> +++ b/drivers/net/wireless/realtek/rtlwifi/btcoexist/rtl_btc.h
> @@ -28,6 +28,7 @@
>   #include "halbt_precomp.h"
>   
>   void rtl_btc_init_variables(struct rtl_priv *rtlpriv);
> +void rtl_btc_deinit_variables(struct rtl_priv *rtlpriv);
>   void rtl_btc_init_hal_vars(struct rtl_priv *rtlpriv);
>   void rtl_btc_power_on_setting(struct rtl_priv *rtlpriv);
>   void rtl_btc_init_hw_config(struct rtl_priv *rtlpriv);
> @@ -38,7 +39,7 @@ void rtl_btc_connect_notify(struct rtl_priv *rtlpriv, u8 action);
>   void rtl_btc_mediastatus_notify(struct rtl_priv *rtlpriv,
>   				enum rt_media_status mstatus);
>   void rtl_btc_periodical(struct rtl_priv *rtlpriv);
> -void rtl_btc_halt_notify(void);
> +void rtl_btc_halt_notify(struct rtl_priv *rtlpriv);
>   void rtl_btc_btinfo_notify(struct rtl_priv *rtlpriv, u8 *tmpbuf, u8 length);
>   void rtl_btc_btmpinfo_notify(struct rtl_priv *rtlpriv, u8 *tmp_buf, u8 length);
>   bool rtl_btc_is_limited_dig(struct rtl_priv *rtlpriv);
> diff --git a/drivers/net/wireless/realtek/rtlwifi/pci.c b/drivers/net/wireless/realtek/rtlwifi/pci.c
> index c1833a501be4..aa1d3ae4937f 100644
> --- a/drivers/net/wireless/realtek/rtlwifi/pci.c
> +++ b/drivers/net/wireless/realtek/rtlwifi/pci.c
> @@ -1841,7 +1841,10 @@ static void rtl_pci_stop(struct ieee80211_hw *hw)
>   	u8 rf_timeout = 0;
>   
>   	if (rtlpriv->cfg->ops->get_btc_status())
> -		rtlpriv->btcoexist.btc_ops->btc_halt_notify();
> +		rtlpriv->btcoexist.btc_ops->btc_halt_notify(rtlpriv);
> +
> +	if (rtlpriv->btcoexist.btc_ops)
> +		rtlpriv->btcoexist.btc_ops->btc_deinit_variables(rtlpriv);
>   
>   	/*should be before disable interrupt&adapter
>   	 *and will do it immediately.
> diff --git a/drivers/net/wireless/realtek/rtlwifi/wifi.h b/drivers/net/wireless/realtek/rtlwifi/wifi.h
> index b27dbe10b163..531c86df54d4 100644
> --- a/drivers/net/wireless/realtek/rtlwifi/wifi.h
> +++ b/drivers/net/wireless/realtek/rtlwifi/wifi.h
> @@ -2500,6 +2500,8 @@ struct rtl_btc_info {
>   struct bt_coexist_info {
>   	struct rtl_btc_ops *btc_ops;
>   	struct rtl_btc_info btc_info;
> +	/* btc context */
> +	void *btc_context;
>   	/* EEPROM BT info. */
>   	u8 eeprom_bt_coexist;
>   	u8 eeprom_bt_type;
> @@ -2556,6 +2558,7 @@ struct bt_coexist_info {
>   
>   struct rtl_btc_ops {
>   	void (*btc_init_variables) (struct rtl_priv *rtlpriv);
> +	void (*btc_deinit_variables)(struct rtl_priv *rtlpriv);
>   	void (*btc_init_hal_vars) (struct rtl_priv *rtlpriv);
>   	void (*btc_power_on_setting)(struct rtl_priv *rtlpriv);
>   	void (*btc_init_hw_config) (struct rtl_priv *rtlpriv);
> @@ -2566,7 +2569,7 @@ struct rtl_btc_ops {
>   	void (*btc_mediastatus_notify) (struct rtl_priv *rtlpriv,
>   					enum rt_media_status mstatus);
>   	void (*btc_periodical) (struct rtl_priv *rtlpriv);
> -	void (*btc_halt_notify) (void);
> +	void (*btc_halt_notify)(struct rtl_priv *rtlpriv);
>   	void (*btc_btinfo_notify) (struct rtl_priv *rtlpriv,
>   				   u8 *tmp_buf, u8 length);
>   	void (*btc_btmpinfo_notify)(struct rtl_priv *rtlpriv,
>
diff mbox

Patch

diff --git a/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.c b/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.c
index 5f3eda31187a..2be81fec789a 100644
--- a/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.c
+++ b/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.c
@@ -25,14 +25,6 @@ 
 
 #include "halbt_precomp.h"
 
-/***********************************************
- *		Global variables
- ***********************************************/
-
-struct btc_coexist gl_bt_coexist;
-
-u32 btc_dbg_type[BTC_MSG_MAX];
-
 /***************************************************
  *		Debug related function
  ***************************************************/
@@ -971,9 +963,12 @@  bool halbtc_under_ips(struct btc_coexist *btcoexist)
 /*****************************************************************
  *         Extern functions called by other module
  *****************************************************************/
-bool exhalbtc_initlize_variables(void)
+bool exhalbtc_initlize_variables(struct rtl_priv *rtlpriv)
 {
-	struct btc_coexist *btcoexist = &gl_bt_coexist;
+	struct btc_coexist *btcoexist = rtl_btc_coexist(rtlpriv);
+
+	if (!btcoexist)
+		return false;
 
 	halbtc_dbg_init();
 
@@ -1009,9 +1004,12 @@  bool exhalbtc_initlize_variables(void)
 
 bool exhalbtc_bind_bt_coex_withadapter(void *adapter)
 {
-	struct btc_coexist *btcoexist = &gl_bt_coexist;
 	struct rtl_priv *rtlpriv = adapter;
-	u8 ant_num = 2, chip_type;
+	struct btc_coexist *btcoexist = rtl_btc_coexist(rtlpriv);
+	u8 ant_num = 2, chip_type, single_ant_path = 0;
+
+	if (!btcoexist)
+		return false;
 
 	if (btcoexist->binded)
 		return false;
@@ -1042,10 +1040,16 @@  bool exhalbtc_bind_bt_coex_withadapter(void *adapter)
 	btcoexist->bt_info.miracast_plus_bt = false;
 
 	chip_type = rtl_get_hwpg_bt_type(rtlpriv);
-	exhalbtc_set_chip_type(chip_type);
+	exhalbtc_set_chip_type(btcoexist, chip_type);
 	ant_num = rtl_get_hwpg_ant_num(rtlpriv);
 	exhalbtc_set_ant_num(rtlpriv, BT_COEX_ANT_TYPE_PG, ant_num);
 
+	/* set default antenna position to main  port */
+	btcoexist->board_info.btdm_ant_pos = BTC_ANTENNA_AT_MAIN_PORT;
+
+	single_ant_path = rtl_get_hwpg_single_ant_path(rtlpriv);
+	exhalbtc_set_single_ant_path(btcoexist, single_ant_path);
+
 	if (rtl_get_hwpg_package_type(rtlpriv) == 0)
 		btcoexist->board_info.tfbga_package = false;
 	else if (rtl_get_hwpg_package_type(rtlpriv) == 1)
@@ -1550,30 +1554,25 @@  void exhalbtc_stack_update_profile_info(void)
 {
 }
 
-void exhalbtc_update_min_bt_rssi(s8 bt_rssi)
+void exhalbtc_update_min_bt_rssi(struct btc_coexist *btcoexist, s8 bt_rssi)
 {
-	struct btc_coexist *btcoexist = &gl_bt_coexist;
-
 	if (!halbtc_is_bt_coexist_available(btcoexist))
 		return;
 
 	btcoexist->stack_info.min_bt_rssi = bt_rssi;
 }
 
-void exhalbtc_set_hci_version(u16 hci_version)
+void exhalbtc_set_hci_version(struct btc_coexist *btcoexist, u16 hci_version)
 {
-	struct btc_coexist *btcoexist = &gl_bt_coexist;
-
 	if (!halbtc_is_bt_coexist_available(btcoexist))
 		return;
 
 	btcoexist->stack_info.hci_version = hci_version;
 }
 
-void exhalbtc_set_bt_patch_version(u16 bt_hci_version, u16 bt_patch_version)
+void exhalbtc_set_bt_patch_version(struct btc_coexist *btcoexist,
+				   u16 bt_hci_version, u16 bt_patch_version)
 {
-	struct btc_coexist *btcoexist = &gl_bt_coexist;
-
 	if (!halbtc_is_bt_coexist_available(btcoexist))
 		return;
 
@@ -1581,7 +1580,7 @@  void exhalbtc_set_bt_patch_version(u16 bt_hci_version, u16 bt_patch_version)
 	btcoexist->bt_info.bt_hci_ver = bt_hci_version;
 }
 
-void exhalbtc_set_chip_type(u8 chip_type)
+void exhalbtc_set_chip_type(struct btc_coexist *btcoexist, u8 chip_type)
 {
 	switch (chip_type) {
 	default:
@@ -1589,48 +1588,54 @@  void exhalbtc_set_chip_type(u8 chip_type)
 	case BT_ISSC_3WIRE:
 	case BT_ACCEL:
 	case BT_RTL8756:
-		gl_bt_coexist.board_info.bt_chip_type = BTC_CHIP_UNDEF;
+		btcoexist->board_info.bt_chip_type = BTC_CHIP_UNDEF;
 		break;
 	case BT_CSR_BC4:
-		gl_bt_coexist.board_info.bt_chip_type = BTC_CHIP_CSR_BC4;
+		btcoexist->board_info.bt_chip_type = BTC_CHIP_CSR_BC4;
 		break;
 	case BT_CSR_BC8:
-		gl_bt_coexist.board_info.bt_chip_type = BTC_CHIP_CSR_BC8;
+		btcoexist->board_info.bt_chip_type = BTC_CHIP_CSR_BC8;
 		break;
 	case BT_RTL8723A:
-		gl_bt_coexist.board_info.bt_chip_type = BTC_CHIP_RTL8723A;
+		btcoexist->board_info.bt_chip_type = BTC_CHIP_RTL8723A;
 		break;
 	case BT_RTL8821A:
-		gl_bt_coexist.board_info.bt_chip_type = BTC_CHIP_RTL8821;
+		btcoexist->board_info.bt_chip_type = BTC_CHIP_RTL8821;
 		break;
 	case BT_RTL8723B:
-		gl_bt_coexist.board_info.bt_chip_type = BTC_CHIP_RTL8723B;
+		btcoexist->board_info.bt_chip_type = BTC_CHIP_RTL8723B;
 		break;
 	}
 }
 
 void exhalbtc_set_ant_num(struct rtl_priv *rtlpriv, u8 type, u8 ant_num)
 {
+	struct btc_coexist *btcoexist = rtl_btc_coexist(rtlpriv);
+
+	if (!btcoexist)
+		return;
+
 	if (BT_COEX_ANT_TYPE_PG == type) {
-		gl_bt_coexist.board_info.pg_ant_num = ant_num;
-		gl_bt_coexist.board_info.btdm_ant_num = ant_num;
+		btcoexist->board_info.pg_ant_num = ant_num;
+		btcoexist->board_info.btdm_ant_num = ant_num;
 	} else if (BT_COEX_ANT_TYPE_ANTDIV == type) {
-		gl_bt_coexist.board_info.btdm_ant_num = ant_num;
+		btcoexist->board_info.btdm_ant_num = ant_num;
 	} else if (type == BT_COEX_ANT_TYPE_DETECTED) {
-		gl_bt_coexist.board_info.btdm_ant_num = ant_num;
+		btcoexist->board_info.btdm_ant_num = ant_num;
 		if (rtlpriv->cfg->mod_params->ant_sel == 1)
-			gl_bt_coexist.board_info.btdm_ant_pos =
+			btcoexist->board_info.btdm_ant_pos =
 				BTC_ANTENNA_AT_AUX_PORT;
 		else
-			gl_bt_coexist.board_info.btdm_ant_pos =
+			btcoexist->board_info.btdm_ant_pos =
 				BTC_ANTENNA_AT_MAIN_PORT;
 	}
 }
 
 /* Currently used by 8723b only, S0 or S1 */
-void exhalbtc_set_single_ant_path(u8 single_ant_path)
+void exhalbtc_set_single_ant_path(struct btc_coexist *btcoexist,
+				  u8 single_ant_path)
 {
-	gl_bt_coexist.board_info.single_ant_path = single_ant_path;
+	btcoexist->board_info.single_ant_path = single_ant_path;
 }
 
 void exhalbtc_display_bt_coex_info(struct btc_coexist *btcoexist,
diff --git a/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.h b/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.h
index bc523af7ef88..5a7816ff6877 100644
--- a/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.h
+++ b/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.h
@@ -103,8 +103,6 @@  enum btc_msg_type {
 	BTC_MSG_MAX
 };
 
-extern u32 btc_dbg_type[];
-
 /* following is for BTC_MSG_INTERFACE */
 #define		INTF_INIT				BIT0
 #define		INTF_NOTIFY				BIT2
@@ -604,9 +602,10 @@  struct btc_coexist {
 
 bool halbtc_is_wifi_uplink(struct rtl_priv *adapter);
 
-extern struct btc_coexist gl_bt_coexist;
+#define rtl_btc_coexist(rtlpriv)				\
+	((struct btc_coexist *)((rtlpriv)->btcoexist.btc_context))
 
-bool exhalbtc_initlize_variables(void);
+bool exhalbtc_initlize_variables(struct rtl_priv *rtlpriv);
 bool exhalbtc_bind_bt_coex_withadapter(void *adapter);
 void exhalbtc_power_on_setting(struct btc_coexist *btcoexist);
 void exhalbtc_init_hw_config(struct btc_coexist *btcoexist, bool wifi_only);
@@ -628,11 +627,12 @@  void exhalbtc_periodical(struct btc_coexist *btcoexist);
 void exhalbtc_dbg_control(struct btc_coexist *btcoexist, u8 code, u8 len,
 			  u8 *data);
 void exhalbtc_stack_update_profile_info(void);
-void exhalbtc_set_hci_version(u16 hci_version);
-void exhalbtc_set_bt_patch_version(u16 bt_hci_version, u16 bt_patch_version);
-void exhalbtc_update_min_bt_rssi(s8 bt_rssi);
-void exhalbtc_set_bt_exist(bool bt_exist);
-void exhalbtc_set_chip_type(u8 chip_type);
+void exhalbtc_set_hci_version(struct btc_coexist *btcoexist, u16 hci_version);
+void exhalbtc_set_bt_patch_version(struct btc_coexist *btcoexist,
+				   u16 bt_hci_version, u16 bt_patch_version);
+void exhalbtc_update_min_bt_rssi(struct btc_coexist *btcoexist, s8 bt_rssi);
+void exhalbtc_set_bt_exist(struct btc_coexist *btcoexist, bool bt_exist);
+void exhalbtc_set_chip_type(struct btc_coexist *btcoexist, u8 chip_type);
 void exhalbtc_set_ant_num(struct rtl_priv *rtlpriv, u8 type, u8 ant_num);
 void exhalbtc_display_bt_coex_info(struct btc_coexist *btcoexist,
 				   struct seq_file *m);
@@ -640,6 +640,7 @@  void exhalbtc_signal_compensation(struct btc_coexist *btcoexist,
 				  u8 *rssi_wifi, u8 *rssi_bt);
 void exhalbtc_lps_leave(struct btc_coexist *btcoexist);
 void exhalbtc_low_wifi_traffic_notify(struct btc_coexist *btcoexist);
-void exhalbtc_set_single_ant_path(u8 single_ant_path);
+void exhalbtc_set_single_ant_path(struct btc_coexist *btcoexist,
+				  u8 single_ant_path);
 
 #endif
diff --git a/drivers/net/wireless/realtek/rtlwifi/btcoexist/rtl_btc.c b/drivers/net/wireless/realtek/rtlwifi/btcoexist/rtl_btc.c
index 9e3623b0423c..ddbef65c3740 100644
--- a/drivers/net/wireless/realtek/rtlwifi/btcoexist/rtl_btc.c
+++ b/drivers/net/wireless/realtek/rtlwifi/btcoexist/rtl_btc.c
@@ -31,6 +31,7 @@ 
 
 static struct rtl_btc_ops rtl_btc_operation = {
 	.btc_init_variables = rtl_btc_init_variables,
+	.btc_deinit_variables = rtl_btc_deinit_variables,
 	.btc_init_hal_vars = rtl_btc_init_hal_vars,
 	.btc_power_on_setting = rtl_btc_power_on_setting,
 	.btc_init_hw_config = rtl_btc_init_hw_config,
@@ -58,58 +59,116 @@  static struct rtl_btc_ops rtl_btc_operation = {
 
 void rtl_btc_display_bt_coex_info(struct rtl_priv *rtlpriv, struct seq_file *m)
 {
-	exhalbtc_display_bt_coex_info(&gl_bt_coexist, m);
+	struct btc_coexist *btcoexist = rtl_btc_coexist(rtlpriv);
+
+	if (!btcoexist) {
+		seq_puts(m, "btc_coexist context is NULL!\n");
+		return;
+	}
+
+	exhalbtc_display_bt_coex_info(btcoexist, m);
 }
 
 void rtl_btc_record_pwr_mode(struct rtl_priv *rtlpriv, u8 *buf, u8 len)
 {
+	struct btc_coexist *btcoexist = rtl_btc_coexist(rtlpriv);
 	u8 safe_len;
 
-	safe_len = sizeof(gl_bt_coexist.pwr_mode_val);
+	if (!btcoexist)
+		return;
+
+	safe_len = sizeof(btcoexist->pwr_mode_val);
 
 	if (safe_len > len)
 		safe_len = len;
 
-	memcpy(gl_bt_coexist.pwr_mode_val, buf, safe_len);
+	memcpy(btcoexist->pwr_mode_val, buf, safe_len);
 }
 
 u8 rtl_btc_get_lps_val(struct rtl_priv *rtlpriv)
 {
-	return gl_bt_coexist.bt_info.lps_val;
+	struct btc_coexist *btcoexist = rtl_btc_coexist(rtlpriv);
+
+	if (!btcoexist)
+		return 0;
+
+	return btcoexist->bt_info.lps_val;
 }
 
 u8 rtl_btc_get_rpwm_val(struct rtl_priv *rtlpriv)
 {
-	return gl_bt_coexist.bt_info.rpwm_val;
+	struct btc_coexist *btcoexist = rtl_btc_coexist(rtlpriv);
+
+	if (!btcoexist)
+		return 0;
+
+	return btcoexist->bt_info.rpwm_val;
 }
 
 bool rtl_btc_is_bt_ctrl_lps(struct rtl_priv *rtlpriv)
 {
-	return gl_bt_coexist.bt_info.bt_ctrl_lps;
+	struct btc_coexist *btcoexist = rtl_btc_coexist(rtlpriv);
+
+	if (!btcoexist)
+		return false;
+
+	return btcoexist->bt_info.bt_ctrl_lps;
 }
 
 bool rtl_btc_is_bt_lps_on(struct rtl_priv *rtlpriv)
 {
-	return gl_bt_coexist.bt_info.bt_lps_on;
+	struct btc_coexist *btcoexist = rtl_btc_coexist(rtlpriv);
+
+	if (!btcoexist)
+		return false;
+
+	return btcoexist->bt_info.bt_lps_on;
 }
 
 void rtl_btc_get_ampdu_cfg(struct rtl_priv *rtlpriv, u8 *reject_agg,
 			   u8 *ctrl_agg_size, u8 *agg_size)
 {
+	struct btc_coexist *btcoexist = rtl_btc_coexist(rtlpriv);
+
+	if (!btcoexist) {
+		*reject_agg = false;
+		*ctrl_agg_size = false;
+		return;
+	}
+
 	if (reject_agg)
-		*reject_agg = gl_bt_coexist.bt_info.reject_agg_pkt;
+		*reject_agg = btcoexist->bt_info.reject_agg_pkt;
 	if (ctrl_agg_size)
-		*ctrl_agg_size = gl_bt_coexist.bt_info.bt_ctrl_agg_buf_size;
+		*ctrl_agg_size = btcoexist->bt_info.bt_ctrl_agg_buf_size;
 	if (agg_size)
-		*agg_size = gl_bt_coexist.bt_info.agg_buf_size;
+		*agg_size = btcoexist->bt_info.agg_buf_size;
+}
+
+static void rtl_btc_alloc_variable(struct rtl_priv *rtlpriv, bool wifi_only)
+{
+	rtlpriv->btcoexist.btc_context =
+			kzalloc(sizeof(struct btc_coexist), GFP_KERNEL);
+}
+
+static void rtl_btc_free_variable(struct rtl_priv *rtlpriv)
+{
+	kfree(rtlpriv->btcoexist.btc_context);
+	rtlpriv->btcoexist.btc_context = NULL;
 }
 
 void rtl_btc_init_variables(struct rtl_priv *rtlpriv)
 {
-	exhalbtc_initlize_variables();
+	rtl_btc_alloc_variable(rtlpriv, false);
+
+	exhalbtc_initlize_variables(rtlpriv);
 	exhalbtc_bind_bt_coex_withadapter(rtlpriv);
 }
 
+void rtl_btc_deinit_variables(struct rtl_priv *rtlpriv)
+{
+	rtl_btc_free_variable(rtlpriv);
+}
+
 void rtl_btc_init_hal_vars(struct rtl_priv *rtlpriv)
 {
 	/* move ant_num, bt_type and single_ant_path to
@@ -119,71 +178,123 @@  void rtl_btc_init_hal_vars(struct rtl_priv *rtlpriv)
 
 void rtl_btc_power_on_setting(struct rtl_priv *rtlpriv)
 {
-	exhalbtc_power_on_setting(&gl_bt_coexist);
+	struct btc_coexist *btcoexist = rtl_btc_coexist(rtlpriv);
+
+	if (!btcoexist)
+		return;
+
+	exhalbtc_power_on_setting(btcoexist);
 }
 
 void rtl_btc_init_hw_config(struct rtl_priv *rtlpriv)
 {
+	struct btc_coexist *btcoexist = rtl_btc_coexist(rtlpriv);
+
 	u8 bt_exist;
 
 	bt_exist = rtl_get_hwpg_bt_exist(rtlpriv);
 	RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
 		"%s, bt_exist is %d\n", __func__, bt_exist);
 
-	exhalbtc_init_hw_config(&gl_bt_coexist, !bt_exist);
-	exhalbtc_init_coex_dm(&gl_bt_coexist);
+	if (!btcoexist)
+		return;
+
+	exhalbtc_init_hw_config(btcoexist, !bt_exist);
+	exhalbtc_init_coex_dm(btcoexist);
 }
 
 void rtl_btc_ips_notify(struct rtl_priv *rtlpriv, u8 type)
 {
-	exhalbtc_ips_notify(&gl_bt_coexist, type);
+	struct btc_coexist *btcoexist = rtl_btc_coexist(rtlpriv);
+
+	if (!btcoexist)
+		return;
+
+	exhalbtc_ips_notify(btcoexist, type);
 }
 
 void rtl_btc_lps_notify(struct rtl_priv *rtlpriv, u8 type)
 {
-	exhalbtc_lps_notify(&gl_bt_coexist, type);
+	struct btc_coexist *btcoexist = rtl_btc_coexist(rtlpriv);
+
+	if (!btcoexist)
+		return;
+
+	exhalbtc_lps_notify(btcoexist, type);
 }
 
 void rtl_btc_scan_notify(struct rtl_priv *rtlpriv, u8 scantype)
 {
-	exhalbtc_scan_notify(&gl_bt_coexist, scantype);
+	struct btc_coexist *btcoexist = rtl_btc_coexist(rtlpriv);
+
+	if (!btcoexist)
+		return;
+
+	exhalbtc_scan_notify(btcoexist, scantype);
 }
 
 void rtl_btc_connect_notify(struct rtl_priv *rtlpriv, u8 action)
 {
-	exhalbtc_connect_notify(&gl_bt_coexist, action);
+	struct btc_coexist *btcoexist = rtl_btc_coexist(rtlpriv);
+
+	if (!btcoexist)
+		return;
+
+	exhalbtc_connect_notify(btcoexist, action);
 }
 
 void rtl_btc_mediastatus_notify(struct rtl_priv *rtlpriv,
 				enum rt_media_status mstatus)
 {
-	exhalbtc_mediastatus_notify(&gl_bt_coexist, mstatus);
+	struct btc_coexist *btcoexist = rtl_btc_coexist(rtlpriv);
+
+	if (!btcoexist)
+		return;
+
+	exhalbtc_mediastatus_notify(btcoexist, mstatus);
 }
 
 void rtl_btc_periodical(struct rtl_priv *rtlpriv)
 {
+	struct btc_coexist *btcoexist = rtl_btc_coexist(rtlpriv);
+
+	if (!btcoexist)
+		return;
+
 	/*rtl_bt_dm_monitor();*/
-	exhalbtc_periodical(&gl_bt_coexist);
+	exhalbtc_periodical(btcoexist);
 }
 
-void rtl_btc_halt_notify(void)
+void rtl_btc_halt_notify(struct rtl_priv *rtlpriv)
 {
-	struct btc_coexist *btcoexist = &gl_bt_coexist;
+	struct btc_coexist *btcoexist = rtl_btc_coexist(rtlpriv);
+
+	if (!btcoexist)
+		return;
 
 	exhalbtc_halt_notify(btcoexist);
 }
 
 void rtl_btc_btinfo_notify(struct rtl_priv *rtlpriv, u8 *tmp_buf, u8 length)
 {
-	exhalbtc_bt_info_notify(&gl_bt_coexist, tmp_buf, length);
+	struct btc_coexist *btcoexist = rtl_btc_coexist(rtlpriv);
+
+	if (!btcoexist)
+		return;
+
+	exhalbtc_bt_info_notify(btcoexist, tmp_buf, length);
 }
 
 void rtl_btc_btmpinfo_notify(struct rtl_priv *rtlpriv, u8 *tmp_buf, u8 length)
 {
+	struct btc_coexist *btcoexist = rtl_btc_coexist(rtlpriv);
 	u8 extid, seq, len;
 	u16 bt_real_fw_ver;
 	u8 bt_fw_ver;
 
+	if (!btcoexist)
+		return;
+
 	if ((length < 4) || (!tmp_buf))
 		return;
 
@@ -200,14 +311,19 @@  void rtl_btc_btmpinfo_notify(struct rtl_priv *rtlpriv, u8 *tmp_buf, u8 length)
 		bt_real_fw_ver = tmp_buf[3] | (tmp_buf[4] << 8);
 		bt_fw_ver = tmp_buf[5];
 
-		gl_bt_coexist.bt_info.bt_real_fw_ver = bt_real_fw_ver;
-		gl_bt_coexist.bt_info.bt_fw_ver = bt_fw_ver;
+		btcoexist->bt_info.bt_real_fw_ver = bt_real_fw_ver;
+		btcoexist->bt_info.bt_fw_ver = bt_fw_ver;
 	}
 }
 
 bool rtl_btc_is_limited_dig(struct rtl_priv *rtlpriv)
 {
-	return gl_bt_coexist.bt_info.limited_dig;
+	struct btc_coexist *btcoexist = rtl_btc_coexist(rtlpriv);
+
+	if (!btcoexist)
+		return false;
+
+	return btcoexist->bt_info.limited_dig;
 }
 
 bool rtl_btc_is_disable_edca_turbo(struct rtl_priv *rtlpriv)
@@ -239,8 +355,13 @@  bool rtl_btc_is_disable_edca_turbo(struct rtl_priv *rtlpriv)
 
 bool rtl_btc_is_bt_disabled(struct rtl_priv *rtlpriv)
 {
+	struct btc_coexist *btcoexist = rtl_btc_coexist(rtlpriv);
+
+	if (!btcoexist)
+		return true;
+
 	/* It seems 'bt_disabled' is never be initialized or set. */
-	if (gl_bt_coexist.bt_info.bt_disabled)
+	if (btcoexist->bt_info.bt_disabled)
 		return true;
 	else
 		return false;
@@ -248,7 +369,12 @@  bool rtl_btc_is_bt_disabled(struct rtl_priv *rtlpriv)
 
 void rtl_btc_special_packet_notify(struct rtl_priv *rtlpriv, u8 pkt_type)
 {
-	return exhalbtc_special_packet_notify(&gl_bt_coexist, pkt_type);
+	struct btc_coexist *btcoexist = rtl_btc_coexist(rtlpriv);
+
+	if (!btcoexist)
+		return;
+
+	return exhalbtc_special_packet_notify(btcoexist, pkt_type);
 }
 
 struct rtl_btc_ops *rtl_btc_get_ops_pointer(void)
diff --git a/drivers/net/wireless/realtek/rtlwifi/btcoexist/rtl_btc.h b/drivers/net/wireless/realtek/rtlwifi/btcoexist/rtl_btc.h
index 9becfa59407d..8c5098266039 100644
--- a/drivers/net/wireless/realtek/rtlwifi/btcoexist/rtl_btc.h
+++ b/drivers/net/wireless/realtek/rtlwifi/btcoexist/rtl_btc.h
@@ -28,6 +28,7 @@ 
 #include "halbt_precomp.h"
 
 void rtl_btc_init_variables(struct rtl_priv *rtlpriv);
+void rtl_btc_deinit_variables(struct rtl_priv *rtlpriv);
 void rtl_btc_init_hal_vars(struct rtl_priv *rtlpriv);
 void rtl_btc_power_on_setting(struct rtl_priv *rtlpriv);
 void rtl_btc_init_hw_config(struct rtl_priv *rtlpriv);
@@ -38,7 +39,7 @@  void rtl_btc_connect_notify(struct rtl_priv *rtlpriv, u8 action);
 void rtl_btc_mediastatus_notify(struct rtl_priv *rtlpriv,
 				enum rt_media_status mstatus);
 void rtl_btc_periodical(struct rtl_priv *rtlpriv);
-void rtl_btc_halt_notify(void);
+void rtl_btc_halt_notify(struct rtl_priv *rtlpriv);
 void rtl_btc_btinfo_notify(struct rtl_priv *rtlpriv, u8 *tmpbuf, u8 length);
 void rtl_btc_btmpinfo_notify(struct rtl_priv *rtlpriv, u8 *tmp_buf, u8 length);
 bool rtl_btc_is_limited_dig(struct rtl_priv *rtlpriv);
diff --git a/drivers/net/wireless/realtek/rtlwifi/pci.c b/drivers/net/wireless/realtek/rtlwifi/pci.c
index c1833a501be4..aa1d3ae4937f 100644
--- a/drivers/net/wireless/realtek/rtlwifi/pci.c
+++ b/drivers/net/wireless/realtek/rtlwifi/pci.c
@@ -1841,7 +1841,10 @@  static void rtl_pci_stop(struct ieee80211_hw *hw)
 	u8 rf_timeout = 0;
 
 	if (rtlpriv->cfg->ops->get_btc_status())
-		rtlpriv->btcoexist.btc_ops->btc_halt_notify();
+		rtlpriv->btcoexist.btc_ops->btc_halt_notify(rtlpriv);
+
+	if (rtlpriv->btcoexist.btc_ops)
+		rtlpriv->btcoexist.btc_ops->btc_deinit_variables(rtlpriv);
 
 	/*should be before disable interrupt&adapter
 	 *and will do it immediately.
diff --git a/drivers/net/wireless/realtek/rtlwifi/wifi.h b/drivers/net/wireless/realtek/rtlwifi/wifi.h
index b27dbe10b163..531c86df54d4 100644
--- a/drivers/net/wireless/realtek/rtlwifi/wifi.h
+++ b/drivers/net/wireless/realtek/rtlwifi/wifi.h
@@ -2500,6 +2500,8 @@  struct rtl_btc_info {
 struct bt_coexist_info {
 	struct rtl_btc_ops *btc_ops;
 	struct rtl_btc_info btc_info;
+	/* btc context */
+	void *btc_context;
 	/* EEPROM BT info. */
 	u8 eeprom_bt_coexist;
 	u8 eeprom_bt_type;
@@ -2556,6 +2558,7 @@  struct bt_coexist_info {
 
 struct rtl_btc_ops {
 	void (*btc_init_variables) (struct rtl_priv *rtlpriv);
+	void (*btc_deinit_variables)(struct rtl_priv *rtlpriv);
 	void (*btc_init_hal_vars) (struct rtl_priv *rtlpriv);
 	void (*btc_power_on_setting)(struct rtl_priv *rtlpriv);
 	void (*btc_init_hw_config) (struct rtl_priv *rtlpriv);
@@ -2566,7 +2569,7 @@  struct rtl_btc_ops {
 	void (*btc_mediastatus_notify) (struct rtl_priv *rtlpriv,
 					enum rt_media_status mstatus);
 	void (*btc_periodical) (struct rtl_priv *rtlpriv);
-	void (*btc_halt_notify) (void);
+	void (*btc_halt_notify)(struct rtl_priv *rtlpriv);
 	void (*btc_btinfo_notify) (struct rtl_priv *rtlpriv,
 				   u8 *tmp_buf, u8 length);
 	void (*btc_btmpinfo_notify)(struct rtl_priv *rtlpriv,