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