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
hal_btcoex_wifionly_scan_notify(PADAPTER padapter)137 void hal_btcoex_wifionly_scan_notify(PADAPTER padapter)
138 {
139 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
140 u8 is_5g = _FALSE;
141
142 if (pHalData->current_band_type == BAND_ON_5G)
143 is_5g = _TRUE;
144
145 if (IS_HARDWARE_TYPE_8822B(padapter)) {
146 #ifdef CONFIG_RTL8822B
147 ex_hal8822b_wifi_only_scannotify(&GLBtCoexistWifiOnly, is_5g);
148 #endif
149 }
150
151 #ifdef CONFIG_RTL8821C
152 else if (IS_HARDWARE_TYPE_8821C(padapter))
153 ex_hal8821c_wifi_only_scannotify(&GLBtCoexistWifiOnly, is_5g);
154 #endif
155
156 #ifdef CONFIG_RTL8822C
157 else if (IS_HARDWARE_TYPE_8822C(padapter))
158 ex_hal8822c_wifi_only_scannotify(&GLBtCoexistWifiOnly, is_5g);
159 #endif
160
161 #ifdef CONFIG_RTL8814B
162 else if (IS_HARDWARE_TYPE_8814B(padapter))
163 ex_hal8814b_wifi_only_scannotify(&GLBtCoexistWifiOnly, is_5g);
164 #endif
165 }
166
hal_btcoex_wifionly_connect_notify(PADAPTER padapter)167 void hal_btcoex_wifionly_connect_notify(PADAPTER padapter)
168 {
169 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
170 u8 is_5g = _FALSE;
171
172 if (pHalData->current_band_type == BAND_ON_5G)
173 is_5g = _TRUE;
174
175 if (IS_HARDWARE_TYPE_8822B(padapter)) {
176 #ifdef CONFIG_RTL8822B
177 ex_hal8822b_wifi_only_connectnotify(&GLBtCoexistWifiOnly, is_5g);
178 #endif
179 }
180
181 #ifdef CONFIG_RTL8821C
182 else if (IS_HARDWARE_TYPE_8821C(padapter))
183 ex_hal8821c_wifi_only_connectnotify(&GLBtCoexistWifiOnly, is_5g);
184 #endif
185
186 #ifdef CONFIG_RTL8822C
187 else if (IS_HARDWARE_TYPE_8822C(padapter))
188 ex_hal8822c_wifi_only_connectnotify(&GLBtCoexistWifiOnly, is_5g);
189 #endif
190
191 #ifdef CONFIG_RTL8814B
192 else if (IS_HARDWARE_TYPE_8814B(padapter))
193 ex_hal8814b_wifi_only_connectnotify(&GLBtCoexistWifiOnly, is_5g);
194 #endif
195 }
196
hal_btcoex_wifionly_hw_config(PADAPTER padapter)197 void hal_btcoex_wifionly_hw_config(PADAPTER padapter)
198 {
199 struct wifi_only_cfg *pwifionlycfg = &GLBtCoexistWifiOnly;
200
201 if (IS_HARDWARE_TYPE_8723B(padapter)) {
202 #ifdef CONFIG_RTL8723B
203 ex_hal8723b_wifi_only_hw_config(pwifionlycfg);
204 #endif
205 }
206
207 #ifdef CONFIG_RTL8822B
208 else if (IS_HARDWARE_TYPE_8822B(padapter))
209 ex_hal8822b_wifi_only_hw_config(pwifionlycfg);
210 #endif
211
212 #ifdef CONFIG_RTL8821C
213 else if (IS_HARDWARE_TYPE_8821C(padapter))
214 ex_hal8821c_wifi_only_hw_config(pwifionlycfg);
215 #endif
216
217 #ifdef CONFIG_RTL8822C
218 else if (IS_HARDWARE_TYPE_8822C(padapter))
219 ex_hal8822c_wifi_only_hw_config(pwifionlycfg);
220 #endif
221
222 #ifdef CONFIG_RTL8814B
223 else if (IS_HARDWARE_TYPE_8814B(padapter))
224 ex_hal8814b_wifi_only_hw_config(pwifionlycfg);
225 #endif
226 }
227
hal_btcoex_wifionly_initlizevariables(PADAPTER padapter)228 void hal_btcoex_wifionly_initlizevariables(PADAPTER padapter)
229 {
230 struct wifi_only_cfg *pwifionlycfg = &GLBtCoexistWifiOnly;
231 struct wifi_only_haldata *pwifionly_haldata = &pwifionlycfg->haldata_info;
232 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
233
234 _rtw_memset(&GLBtCoexistWifiOnly, 0, sizeof(GLBtCoexistWifiOnly));
235
236 pwifionlycfg->Adapter = padapter;
237
238 #ifdef CONFIG_PCI_HCI
239 pwifionlycfg->chip_interface = WIFIONLY_INTF_PCI;
240 #elif defined(CONFIG_USB_HCI)
241 pwifionlycfg->chip_interface = WIFIONLY_INTF_USB;
242 #elif defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
243 pwifionlycfg->chip_interface = WIFIONLY_INTF_SDIO;
244 #else
245 pwifionlycfg->chip_interface = WIFIONLY_INTF_UNKNOWN;
246 #endif
247
248 pwifionly_haldata->customer_id = CUSTOMER_NORMAL;
249 }
250
hal_btcoex_wifionly_AntInfoSetting(PADAPTER padapter)251 void hal_btcoex_wifionly_AntInfoSetting(PADAPTER padapter)
252 {
253 struct wifi_only_cfg *pwifionlycfg = &GLBtCoexistWifiOnly;
254 struct wifi_only_haldata *pwifionly_haldata = &pwifionlycfg->haldata_info;
255 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
256
257 pwifionly_haldata->efuse_pg_antnum = pHalData->EEPROMBluetoothAntNum;
258 pwifionly_haldata->efuse_pg_antpath = pHalData->ant_path;
259 pwifionly_haldata->rfe_type = pHalData->rfe_type;
260 pwifionly_haldata->ant_div_cfg = pHalData->AntDivCfg;
261 }
262
263 #endif
264
265