xref: /OK3568_Linux_fs/external/rkwifibt/drivers/rtl8188fu/hal/hal_btcoex_wifionly.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /******************************************************************************
2*4882a593Smuzhiyun  *
3*4882a593Smuzhiyun  * Copyright(c) 2016 - 2017 Realtek Corporation.
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * This program is free software; you can redistribute it and/or modify it
6*4882a593Smuzhiyun  * under the terms of version 2 of the GNU General Public License as
7*4882a593Smuzhiyun  * published by the Free Software Foundation.
8*4882a593Smuzhiyun  *
9*4882a593Smuzhiyun  * This program is distributed in the hope that it will be useful, but WITHOUT
10*4882a593Smuzhiyun  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11*4882a593Smuzhiyun  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12*4882a593Smuzhiyun  * more details.
13*4882a593Smuzhiyun  *
14*4882a593Smuzhiyun  *****************************************************************************/
15*4882a593Smuzhiyun #include <hal_btcoex_wifionly.h>
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun #if (CONFIG_BTCOEX_SUPPORT_WIFI_ONLY_CFG == 1)
18*4882a593Smuzhiyun 
19*4882a593Smuzhiyun #include "btc/mp_precomp.h"
20*4882a593Smuzhiyun 
21*4882a593Smuzhiyun struct  wifi_only_cfg GLBtCoexistWifiOnly;
22*4882a593Smuzhiyun 
halwifionly_write1byte(void * pwifionlyContext,u32 RegAddr,u8 Data)23*4882a593Smuzhiyun void halwifionly_write1byte(void *pwifionlyContext, u32 RegAddr, u8 Data)
24*4882a593Smuzhiyun {
25*4882a593Smuzhiyun 	struct wifi_only_cfg *pwifionlycfg = (struct wifi_only_cfg *)pwifionlyContext;
26*4882a593Smuzhiyun 	PADAPTER		Adapter = pwifionlycfg->Adapter;
27*4882a593Smuzhiyun 
28*4882a593Smuzhiyun 	rtw_write8(Adapter, RegAddr, Data);
29*4882a593Smuzhiyun }
30*4882a593Smuzhiyun 
halwifionly_write2byte(void * pwifionlyContext,u32 RegAddr,u16 Data)31*4882a593Smuzhiyun void halwifionly_write2byte(void *pwifionlyContext, u32 RegAddr, u16 Data)
32*4882a593Smuzhiyun {
33*4882a593Smuzhiyun 	struct wifi_only_cfg *pwifionlycfg = (struct wifi_only_cfg *)pwifionlyContext;
34*4882a593Smuzhiyun 	PADAPTER		Adapter = pwifionlycfg->Adapter;
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun 	rtw_write16(Adapter, RegAddr, Data);
37*4882a593Smuzhiyun }
38*4882a593Smuzhiyun 
halwifionly_write4byte(void * pwifionlyContext,u32 RegAddr,u32 Data)39*4882a593Smuzhiyun void halwifionly_write4byte(void *pwifionlyContext, u32 RegAddr, u32 Data)
40*4882a593Smuzhiyun {
41*4882a593Smuzhiyun 	struct wifi_only_cfg *pwifionlycfg = (struct wifi_only_cfg *)pwifionlyContext;
42*4882a593Smuzhiyun 	PADAPTER		Adapter = pwifionlycfg->Adapter;
43*4882a593Smuzhiyun 
44*4882a593Smuzhiyun 	rtw_write32(Adapter, RegAddr, Data);
45*4882a593Smuzhiyun }
46*4882a593Smuzhiyun 
halwifionly_read1byte(void * pwifionlyContext,u32 RegAddr)47*4882a593Smuzhiyun u8 halwifionly_read1byte(void *pwifionlyContext, u32 RegAddr)
48*4882a593Smuzhiyun {
49*4882a593Smuzhiyun 	struct wifi_only_cfg *pwifionlycfg = (struct wifi_only_cfg *)pwifionlyContext;
50*4882a593Smuzhiyun 	PADAPTER		Adapter = pwifionlycfg->Adapter;
51*4882a593Smuzhiyun 
52*4882a593Smuzhiyun 	return rtw_read8(Adapter, RegAddr);
53*4882a593Smuzhiyun }
54*4882a593Smuzhiyun 
halwifionly_read2byte(void * pwifionlyContext,u32 RegAddr)55*4882a593Smuzhiyun u16 halwifionly_read2byte(void * pwifionlyContext, u32 RegAddr)
56*4882a593Smuzhiyun {
57*4882a593Smuzhiyun 	struct wifi_only_cfg *pwifionlycfg = (struct wifi_only_cfg *)pwifionlyContext;
58*4882a593Smuzhiyun 	PADAPTER		Adapter = pwifionlycfg->Adapter;
59*4882a593Smuzhiyun 
60*4882a593Smuzhiyun 	return rtw_read16(Adapter, RegAddr);
61*4882a593Smuzhiyun }
62*4882a593Smuzhiyun 
halwifionly_read4byte(void * pwifionlyContext,u32 RegAddr)63*4882a593Smuzhiyun u32 halwifionly_read4byte(void *pwifionlyContext, u32 RegAddr)
64*4882a593Smuzhiyun {
65*4882a593Smuzhiyun 	struct wifi_only_cfg *pwifionlycfg = (struct wifi_only_cfg *)pwifionlyContext;
66*4882a593Smuzhiyun 	PADAPTER		Adapter = pwifionlycfg->Adapter;
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun 	return rtw_read32(Adapter, RegAddr);
69*4882a593Smuzhiyun }
70*4882a593Smuzhiyun 
halwifionly_bitmaskwrite1byte(void * pwifionlyContext,u32 regAddr,u8 bitMask,u8 data)71*4882a593Smuzhiyun void halwifionly_bitmaskwrite1byte(void *pwifionlyContext, u32 regAddr, u8 bitMask, u8 data)
72*4882a593Smuzhiyun {
73*4882a593Smuzhiyun 	u8 originalValue, bitShift = 0;
74*4882a593Smuzhiyun 	u8 i;
75*4882a593Smuzhiyun 
76*4882a593Smuzhiyun 	struct wifi_only_cfg *pwifionlycfg = (struct wifi_only_cfg *)pwifionlyContext;
77*4882a593Smuzhiyun 	PADAPTER		Adapter = pwifionlycfg->Adapter;
78*4882a593Smuzhiyun 
79*4882a593Smuzhiyun 	if (bitMask != 0xff) {
80*4882a593Smuzhiyun 		originalValue = rtw_read8(Adapter, regAddr);
81*4882a593Smuzhiyun 		for (i = 0; i <= 7; i++) {
82*4882a593Smuzhiyun 			if ((bitMask >> i) & 0x1)
83*4882a593Smuzhiyun 				break;
84*4882a593Smuzhiyun 		}
85*4882a593Smuzhiyun 		bitShift = i;
86*4882a593Smuzhiyun 		data = ((originalValue) & (~bitMask)) | (((data << bitShift)) & bitMask);
87*4882a593Smuzhiyun 	}
88*4882a593Smuzhiyun 	rtw_write8(Adapter, regAddr, data);
89*4882a593Smuzhiyun }
90*4882a593Smuzhiyun 
halwifionly_phy_set_rf_reg(void * pwifionlyContext,enum rf_path eRFPath,u32 RegAddr,u32 BitMask,u32 Data)91*4882a593Smuzhiyun void halwifionly_phy_set_rf_reg(void *pwifionlyContext, enum rf_path eRFPath, u32 RegAddr, u32 BitMask, u32 Data)
92*4882a593Smuzhiyun {
93*4882a593Smuzhiyun 	struct wifi_only_cfg *pwifionlycfg = (struct wifi_only_cfg *)pwifionlyContext;
94*4882a593Smuzhiyun 	PADAPTER		Adapter = pwifionlycfg->Adapter;
95*4882a593Smuzhiyun 
96*4882a593Smuzhiyun 	phy_set_rf_reg(Adapter, eRFPath, RegAddr, BitMask, Data);
97*4882a593Smuzhiyun }
98*4882a593Smuzhiyun 
halwifionly_phy_set_bb_reg(void * pwifionlyContext,u32 RegAddr,u32 BitMask,u32 Data)99*4882a593Smuzhiyun void halwifionly_phy_set_bb_reg(void *pwifionlyContext, u32 RegAddr, u32 BitMask, u32 Data)
100*4882a593Smuzhiyun {
101*4882a593Smuzhiyun 	struct wifi_only_cfg *pwifionlycfg = (struct wifi_only_cfg *)pwifionlyContext;
102*4882a593Smuzhiyun 	PADAPTER		Adapter = pwifionlycfg->Adapter;
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun 	phy_set_bb_reg(Adapter, RegAddr, BitMask, Data);
105*4882a593Smuzhiyun }
106*4882a593Smuzhiyun 
hal_btcoex_wifionly_switchband_notify(PADAPTER padapter)107*4882a593Smuzhiyun void hal_btcoex_wifionly_switchband_notify(PADAPTER padapter)
108*4882a593Smuzhiyun {
109*4882a593Smuzhiyun 	HAL_DATA_TYPE	*pHalData = GET_HAL_DATA(padapter);
110*4882a593Smuzhiyun 	u8 is_5g = _FALSE;
111*4882a593Smuzhiyun 
112*4882a593Smuzhiyun 	if (pHalData->current_band_type == BAND_ON_5G)
113*4882a593Smuzhiyun 		is_5g = _TRUE;
114*4882a593Smuzhiyun 
115*4882a593Smuzhiyun 	if (IS_HARDWARE_TYPE_8822B(padapter)) {
116*4882a593Smuzhiyun #ifdef CONFIG_RTL8822B
117*4882a593Smuzhiyun 		ex_hal8822b_wifi_only_switchbandnotify(&GLBtCoexistWifiOnly, is_5g);
118*4882a593Smuzhiyun #endif
119*4882a593Smuzhiyun 	}
120*4882a593Smuzhiyun 
121*4882a593Smuzhiyun #ifdef CONFIG_RTL8821C
122*4882a593Smuzhiyun 	else if (IS_HARDWARE_TYPE_8821C(padapter))
123*4882a593Smuzhiyun 		ex_hal8821c_wifi_only_switchbandnotify(&GLBtCoexistWifiOnly, is_5g);
124*4882a593Smuzhiyun #endif
125*4882a593Smuzhiyun 
126*4882a593Smuzhiyun #ifdef CONFIG_RTL8822C
127*4882a593Smuzhiyun 	else if (IS_HARDWARE_TYPE_8822C(padapter))
128*4882a593Smuzhiyun 		ex_hal8822c_wifi_only_switchbandnotify(&GLBtCoexistWifiOnly, is_5g);
129*4882a593Smuzhiyun #endif
130*4882a593Smuzhiyun 
131*4882a593Smuzhiyun #ifdef CONFIG_RTL8814B
132*4882a593Smuzhiyun 	else if (IS_HARDWARE_TYPE_8814B(padapter))
133*4882a593Smuzhiyun 		ex_hal8814b_wifi_only_switchbandnotify(&GLBtCoexistWifiOnly, is_5g);
134*4882a593Smuzhiyun #endif
135*4882a593Smuzhiyun }
136*4882a593Smuzhiyun 
hal_btcoex_wifionly_scan_notify(PADAPTER padapter)137*4882a593Smuzhiyun void hal_btcoex_wifionly_scan_notify(PADAPTER padapter)
138*4882a593Smuzhiyun {
139*4882a593Smuzhiyun 	HAL_DATA_TYPE	*pHalData = GET_HAL_DATA(padapter);
140*4882a593Smuzhiyun 	u8 is_5g = _FALSE;
141*4882a593Smuzhiyun 
142*4882a593Smuzhiyun 	if (pHalData->current_band_type == BAND_ON_5G)
143*4882a593Smuzhiyun 		is_5g = _TRUE;
144*4882a593Smuzhiyun 
145*4882a593Smuzhiyun 	if (IS_HARDWARE_TYPE_8822B(padapter)) {
146*4882a593Smuzhiyun #ifdef CONFIG_RTL8822B
147*4882a593Smuzhiyun 		ex_hal8822b_wifi_only_scannotify(&GLBtCoexistWifiOnly, is_5g);
148*4882a593Smuzhiyun #endif
149*4882a593Smuzhiyun 	}
150*4882a593Smuzhiyun 
151*4882a593Smuzhiyun #ifdef CONFIG_RTL8821C
152*4882a593Smuzhiyun 	else if (IS_HARDWARE_TYPE_8821C(padapter))
153*4882a593Smuzhiyun 		ex_hal8821c_wifi_only_scannotify(&GLBtCoexistWifiOnly, is_5g);
154*4882a593Smuzhiyun #endif
155*4882a593Smuzhiyun 
156*4882a593Smuzhiyun #ifdef CONFIG_RTL8822C
157*4882a593Smuzhiyun 	else if (IS_HARDWARE_TYPE_8822C(padapter))
158*4882a593Smuzhiyun 		ex_hal8822c_wifi_only_scannotify(&GLBtCoexistWifiOnly, is_5g);
159*4882a593Smuzhiyun #endif
160*4882a593Smuzhiyun 
161*4882a593Smuzhiyun #ifdef CONFIG_RTL8814B
162*4882a593Smuzhiyun 	else if (IS_HARDWARE_TYPE_8814B(padapter))
163*4882a593Smuzhiyun 		ex_hal8814b_wifi_only_scannotify(&GLBtCoexistWifiOnly, is_5g);
164*4882a593Smuzhiyun #endif
165*4882a593Smuzhiyun }
166*4882a593Smuzhiyun 
hal_btcoex_wifionly_connect_notify(PADAPTER padapter)167*4882a593Smuzhiyun void hal_btcoex_wifionly_connect_notify(PADAPTER padapter)
168*4882a593Smuzhiyun {
169*4882a593Smuzhiyun 	HAL_DATA_TYPE	*pHalData = GET_HAL_DATA(padapter);
170*4882a593Smuzhiyun 	u8 is_5g = _FALSE;
171*4882a593Smuzhiyun 
172*4882a593Smuzhiyun 	if (pHalData->current_band_type == BAND_ON_5G)
173*4882a593Smuzhiyun 		is_5g = _TRUE;
174*4882a593Smuzhiyun 
175*4882a593Smuzhiyun 	if (IS_HARDWARE_TYPE_8822B(padapter)) {
176*4882a593Smuzhiyun #ifdef CONFIG_RTL8822B
177*4882a593Smuzhiyun 		ex_hal8822b_wifi_only_connectnotify(&GLBtCoexistWifiOnly, is_5g);
178*4882a593Smuzhiyun #endif
179*4882a593Smuzhiyun 	}
180*4882a593Smuzhiyun 
181*4882a593Smuzhiyun #ifdef CONFIG_RTL8821C
182*4882a593Smuzhiyun 	else if (IS_HARDWARE_TYPE_8821C(padapter))
183*4882a593Smuzhiyun 		ex_hal8821c_wifi_only_connectnotify(&GLBtCoexistWifiOnly, is_5g);
184*4882a593Smuzhiyun #endif
185*4882a593Smuzhiyun 
186*4882a593Smuzhiyun #ifdef CONFIG_RTL8822C
187*4882a593Smuzhiyun 	else if (IS_HARDWARE_TYPE_8822C(padapter))
188*4882a593Smuzhiyun 		ex_hal8822c_wifi_only_connectnotify(&GLBtCoexistWifiOnly, is_5g);
189*4882a593Smuzhiyun #endif
190*4882a593Smuzhiyun 
191*4882a593Smuzhiyun #ifdef CONFIG_RTL8814B
192*4882a593Smuzhiyun 	else if (IS_HARDWARE_TYPE_8814B(padapter))
193*4882a593Smuzhiyun 		ex_hal8814b_wifi_only_connectnotify(&GLBtCoexistWifiOnly, is_5g);
194*4882a593Smuzhiyun #endif
195*4882a593Smuzhiyun }
196*4882a593Smuzhiyun 
hal_btcoex_wifionly_hw_config(PADAPTER padapter)197*4882a593Smuzhiyun void hal_btcoex_wifionly_hw_config(PADAPTER padapter)
198*4882a593Smuzhiyun {
199*4882a593Smuzhiyun 	struct wifi_only_cfg *pwifionlycfg = &GLBtCoexistWifiOnly;
200*4882a593Smuzhiyun 
201*4882a593Smuzhiyun 	if (IS_HARDWARE_TYPE_8723B(padapter)) {
202*4882a593Smuzhiyun #ifdef CONFIG_RTL8723B
203*4882a593Smuzhiyun 		ex_hal8723b_wifi_only_hw_config(pwifionlycfg);
204*4882a593Smuzhiyun #endif
205*4882a593Smuzhiyun 	}
206*4882a593Smuzhiyun 
207*4882a593Smuzhiyun #ifdef CONFIG_RTL8822B
208*4882a593Smuzhiyun 	else if (IS_HARDWARE_TYPE_8822B(padapter))
209*4882a593Smuzhiyun 		ex_hal8822b_wifi_only_hw_config(pwifionlycfg);
210*4882a593Smuzhiyun #endif
211*4882a593Smuzhiyun 
212*4882a593Smuzhiyun #ifdef CONFIG_RTL8821C
213*4882a593Smuzhiyun 	else if (IS_HARDWARE_TYPE_8821C(padapter))
214*4882a593Smuzhiyun 		ex_hal8821c_wifi_only_hw_config(pwifionlycfg);
215*4882a593Smuzhiyun #endif
216*4882a593Smuzhiyun 
217*4882a593Smuzhiyun #ifdef CONFIG_RTL8822C
218*4882a593Smuzhiyun 	else if (IS_HARDWARE_TYPE_8822C(padapter))
219*4882a593Smuzhiyun 		ex_hal8822c_wifi_only_hw_config(pwifionlycfg);
220*4882a593Smuzhiyun #endif
221*4882a593Smuzhiyun 
222*4882a593Smuzhiyun #ifdef CONFIG_RTL8814B
223*4882a593Smuzhiyun 	else if (IS_HARDWARE_TYPE_8814B(padapter))
224*4882a593Smuzhiyun 		ex_hal8814b_wifi_only_hw_config(pwifionlycfg);
225*4882a593Smuzhiyun #endif
226*4882a593Smuzhiyun }
227*4882a593Smuzhiyun 
hal_btcoex_wifionly_initlizevariables(PADAPTER padapter)228*4882a593Smuzhiyun void hal_btcoex_wifionly_initlizevariables(PADAPTER padapter)
229*4882a593Smuzhiyun {
230*4882a593Smuzhiyun 	struct wifi_only_cfg		*pwifionlycfg = &GLBtCoexistWifiOnly;
231*4882a593Smuzhiyun 	struct wifi_only_haldata	*pwifionly_haldata = &pwifionlycfg->haldata_info;
232*4882a593Smuzhiyun 	HAL_DATA_TYPE	*pHalData = GET_HAL_DATA(padapter);
233*4882a593Smuzhiyun 
234*4882a593Smuzhiyun 	_rtw_memset(&GLBtCoexistWifiOnly, 0, sizeof(GLBtCoexistWifiOnly));
235*4882a593Smuzhiyun 
236*4882a593Smuzhiyun 	pwifionlycfg->Adapter = padapter;
237*4882a593Smuzhiyun 
238*4882a593Smuzhiyun #ifdef CONFIG_PCI_HCI
239*4882a593Smuzhiyun 	pwifionlycfg->chip_interface = WIFIONLY_INTF_PCI;
240*4882a593Smuzhiyun #elif defined(CONFIG_USB_HCI)
241*4882a593Smuzhiyun 	pwifionlycfg->chip_interface = WIFIONLY_INTF_USB;
242*4882a593Smuzhiyun #elif defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
243*4882a593Smuzhiyun 	pwifionlycfg->chip_interface = WIFIONLY_INTF_SDIO;
244*4882a593Smuzhiyun #else
245*4882a593Smuzhiyun 	pwifionlycfg->chip_interface = WIFIONLY_INTF_UNKNOWN;
246*4882a593Smuzhiyun #endif
247*4882a593Smuzhiyun 
248*4882a593Smuzhiyun 	pwifionly_haldata->customer_id = CUSTOMER_NORMAL;
249*4882a593Smuzhiyun }
250*4882a593Smuzhiyun 
hal_btcoex_wifionly_AntInfoSetting(PADAPTER padapter)251*4882a593Smuzhiyun void hal_btcoex_wifionly_AntInfoSetting(PADAPTER padapter)
252*4882a593Smuzhiyun {
253*4882a593Smuzhiyun 	struct wifi_only_cfg		*pwifionlycfg = &GLBtCoexistWifiOnly;
254*4882a593Smuzhiyun 	struct wifi_only_haldata	*pwifionly_haldata = &pwifionlycfg->haldata_info;
255*4882a593Smuzhiyun 	HAL_DATA_TYPE	*pHalData = GET_HAL_DATA(padapter);
256*4882a593Smuzhiyun 
257*4882a593Smuzhiyun 	pwifionly_haldata->efuse_pg_antnum = pHalData->EEPROMBluetoothAntNum;
258*4882a593Smuzhiyun 	pwifionly_haldata->efuse_pg_antpath = pHalData->ant_path;
259*4882a593Smuzhiyun 	pwifionly_haldata->rfe_type = pHalData->rfe_type;
260*4882a593Smuzhiyun 	pwifionly_haldata->ant_div_cfg = pHalData->AntDivCfg;
261*4882a593Smuzhiyun }
262*4882a593Smuzhiyun 
263*4882a593Smuzhiyun #endif
264*4882a593Smuzhiyun 
265