net: wireless: rockchip_wlan: add rtl8723cs support
[firefly-linux-kernel-4.4.55.git] / drivers / net / wireless / rockchip_wlan / rtl8723cs / hal / phydm / txbf / halcomtxbf.c
1 /* ************************************************************
2  * Description:
3  *
4  * This file is for TXBF mechanism
5  *
6  * ************************************************************ */
7 #include "mp_precomp.h"
8 #include "../phydm_precomp.h"
9
10 #if (BEAMFORMING_SUPPORT == 1)
11 /*Beamforming halcomtxbf API create by YuChen 2015/05*/
12
13 void
14 hal_com_txbf_beamform_init(
15         void                    *p_dm_void
16 )
17 {
18         struct PHY_DM_STRUCT    *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
19         boolean         is_iqgen_setting_ok = false;
20
21         if (p_dm_odm->support_ic_type & ODM_RTL8814A) {
22                 is_iqgen_setting_ok = phydm_beamforming_set_iqgen_8814A(p_dm_odm);
23                 ODM_RT_TRACE(p_dm_odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("[%s] is_iqgen_setting_ok = %d\n", __func__, is_iqgen_setting_ok));
24         }
25 }
26
27 /*Only used for MU BFer Entry when get GID management frame (self is as MU STA)*/
28 void
29 hal_com_txbf_config_gtab(
30         void                    *p_dm_void
31 )
32 {
33         struct PHY_DM_STRUCT    *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
34
35         if (p_dm_odm->support_ic_type & ODM_RTL8822B)
36                 hal_txbf_8822b_config_gtab(p_dm_odm);
37 }
38
39 void
40 phydm_beamform_set_sounding_enter(
41         void                    *p_dm_void
42 )
43 {
44         struct PHY_DM_STRUCT    *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
45 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
46         struct _HAL_TXBF_INFO   *p_txbf_info = &p_dm_odm->beamforming_info.txbf_info;
47
48         if (odm_is_work_item_scheduled(&(p_txbf_info->txbf_enter_work_item)) == false)
49                 odm_schedule_work_item(&(p_txbf_info->txbf_enter_work_item));
50 #else
51         hal_com_txbf_enter_work_item_callback(p_dm_odm);
52 #endif
53 }
54
55 void
56 phydm_beamform_set_sounding_leave(
57         void                    *p_dm_void
58 )
59 {
60         struct PHY_DM_STRUCT    *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
61 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
62         struct _HAL_TXBF_INFO   *p_txbf_info = &p_dm_odm->beamforming_info.txbf_info;
63
64         if (odm_is_work_item_scheduled(&(p_txbf_info->txbf_leave_work_item)) == false)
65                 odm_schedule_work_item(&(p_txbf_info->txbf_leave_work_item));
66 #else
67         hal_com_txbf_leave_work_item_callback(p_dm_odm);
68 #endif
69 }
70
71 void
72 phydm_beamform_set_sounding_rate(
73         void                    *p_dm_void
74 )
75 {
76         struct PHY_DM_STRUCT    *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
77 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
78         struct _HAL_TXBF_INFO   *p_txbf_info = &p_dm_odm->beamforming_info.txbf_info;
79
80         if (odm_is_work_item_scheduled(&(p_txbf_info->txbf_rate_work_item)) == false)
81                 odm_schedule_work_item(&(p_txbf_info->txbf_rate_work_item));
82 #else
83         hal_com_txbf_rate_work_item_callback(p_dm_odm);
84 #endif
85 }
86
87 void
88 phydm_beamform_set_sounding_status(
89         void                    *p_dm_void
90 )
91 {
92         struct PHY_DM_STRUCT    *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
93 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
94         struct _HAL_TXBF_INFO   *p_txbf_info = &p_dm_odm->beamforming_info.txbf_info;
95
96         if (odm_is_work_item_scheduled(&(p_txbf_info->txbf_status_work_item)) == false)
97                 odm_schedule_work_item(&(p_txbf_info->txbf_status_work_item));
98 #else
99         hal_com_txbf_status_work_item_callback(p_dm_odm);
100 #endif
101 }
102
103 void
104 phydm_beamform_set_sounding_fw_ndpa(
105         void                    *p_dm_void
106 )
107 {
108         struct PHY_DM_STRUCT    *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
109 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
110         struct _HAL_TXBF_INFO   *p_txbf_info = &p_dm_odm->beamforming_info.txbf_info;
111
112         if (*p_dm_odm->p_is_fw_dw_rsvd_page_in_progress)
113                 odm_set_timer(p_dm_odm, &(p_txbf_info->txbf_fw_ndpa_timer), 5);
114         else
115                 odm_schedule_work_item(&(p_txbf_info->txbf_fw_ndpa_work_item));
116 #else
117         hal_com_txbf_fw_ndpa_work_item_callback(p_dm_odm);
118 #endif
119 }
120
121 void
122 phydm_beamform_set_sounding_clk(
123         void                    *p_dm_void
124 )
125 {
126         struct PHY_DM_STRUCT    *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
127 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
128         struct _HAL_TXBF_INFO   *p_txbf_info = &p_dm_odm->beamforming_info.txbf_info;
129
130         if (odm_is_work_item_scheduled(&(p_txbf_info->txbf_clk_work_item)) == false)
131                 odm_schedule_work_item(&(p_txbf_info->txbf_clk_work_item));
132 #elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
133         struct _ADAPTER *padapter = p_dm_odm->adapter;
134
135         rtw_run_in_thread_cmd(padapter, hal_com_txbf_clk_work_item_callback, padapter);
136 #else
137         hal_com_txbf_clk_work_item_callback(p_dm_odm);
138 #endif
139 }
140
141 void
142 phydm_beamform_set_reset_tx_path(
143         void                    *p_dm_void
144 )
145 {
146         struct PHY_DM_STRUCT    *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
147 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
148         struct _HAL_TXBF_INFO   *p_txbf_info = &p_dm_odm->beamforming_info.txbf_info;
149
150         if (odm_is_work_item_scheduled(&(p_txbf_info->txbf_reset_tx_path_work_item)) == false)
151                 odm_schedule_work_item(&(p_txbf_info->txbf_reset_tx_path_work_item));
152 #else
153         hal_com_txbf_reset_tx_path_work_item_callback(p_dm_odm);
154 #endif
155 }
156
157 void
158 phydm_beamform_set_get_tx_rate(
159         void                    *p_dm_void
160 )
161 {
162         struct PHY_DM_STRUCT    *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
163 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
164         struct _HAL_TXBF_INFO   *p_txbf_info = &p_dm_odm->beamforming_info.txbf_info;
165
166         if (odm_is_work_item_scheduled(&(p_txbf_info->txbf_get_tx_rate_work_item)) == false)
167                 odm_schedule_work_item(&(p_txbf_info->txbf_get_tx_rate_work_item));
168 #else
169         hal_com_txbf_get_tx_rate_work_item_callback(p_dm_odm);
170 #endif
171 }
172
173 void
174 hal_com_txbf_enter_work_item_callback(
175 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
176         struct _ADAPTER         *adapter
177 #else
178         void                    *p_dm_void
179 #endif
180 )
181 {
182 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
183         PHAL_DATA_TYPE  p_hal_data = GET_HAL_DATA(adapter);
184         struct PHY_DM_STRUCT            *p_dm_odm = &p_hal_data->DM_OutSrc;
185 #else
186         struct PHY_DM_STRUCT    *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
187 #endif
188         struct _HAL_TXBF_INFO   *p_txbf_info = &p_dm_odm->beamforming_info.txbf_info;
189         u8                      idx = p_txbf_info->txbf_idx;
190
191         ODM_RT_TRACE(p_dm_odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("[%s] Start!\n", __func__));
192
193         if (p_dm_odm->support_ic_type & (ODM_RTL8812 | ODM_RTL8821))
194                 hal_txbf_jaguar_enter(p_dm_odm, idx);
195         else if (p_dm_odm->support_ic_type & ODM_RTL8192E)
196                 hal_txbf_8192e_enter(p_dm_odm, idx);
197         else if (p_dm_odm->support_ic_type & ODM_RTL8814A)
198                 hal_txbf_8814a_enter(p_dm_odm, idx);
199         else if (p_dm_odm->support_ic_type & ODM_RTL8822B)
200                 hal_txbf_8822b_enter(p_dm_odm, idx);
201 }
202
203 void
204 hal_com_txbf_leave_work_item_callback(
205 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
206         struct _ADAPTER         *adapter
207 #else
208         void                    *p_dm_void
209 #endif
210 )
211 {
212 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
213         PHAL_DATA_TYPE  p_hal_data = GET_HAL_DATA(adapter);
214         struct PHY_DM_STRUCT            *p_dm_odm = &p_hal_data->DM_OutSrc;
215 #else
216         struct PHY_DM_STRUCT    *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
217 #endif
218         struct _HAL_TXBF_INFO   *p_txbf_info = &p_dm_odm->beamforming_info.txbf_info;
219
220         u8                      idx = p_txbf_info->txbf_idx;
221
222         ODM_RT_TRACE(p_dm_odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("[%s] Start!\n", __func__));
223
224         if (p_dm_odm->support_ic_type & (ODM_RTL8812 | ODM_RTL8821))
225                 hal_txbf_jaguar_leave(p_dm_odm, idx);
226         else if (p_dm_odm->support_ic_type & ODM_RTL8192E)
227                 hal_txbf_8192e_leave(p_dm_odm, idx);
228         else if (p_dm_odm->support_ic_type & ODM_RTL8814A)
229                 hal_txbf_8814a_leave(p_dm_odm, idx);
230         else if (p_dm_odm->support_ic_type & ODM_RTL8822B)
231                 hal_txbf_8822b_leave(p_dm_odm, idx);
232 }
233
234
235 void
236 hal_com_txbf_fw_ndpa_work_item_callback(
237 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
238         struct _ADAPTER         *adapter
239 #else
240         void                    *p_dm_void
241 #endif
242 )
243 {
244 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
245         PHAL_DATA_TYPE  p_hal_data = GET_HAL_DATA(adapter);
246         struct PHY_DM_STRUCT            *p_dm_odm = &p_hal_data->DM_OutSrc;
247 #else
248         struct PHY_DM_STRUCT    *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
249 #endif
250         struct _HAL_TXBF_INFO   *p_txbf_info = &p_dm_odm->beamforming_info.txbf_info;
251         u8      idx = p_txbf_info->ndpa_idx;
252
253         ODM_RT_TRACE(p_dm_odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("[%s] Start!\n", __func__));
254
255         if (p_dm_odm->support_ic_type & (ODM_RTL8812 | ODM_RTL8821))
256                 hal_txbf_jaguar_fw_txbf(p_dm_odm, idx);
257         else if (p_dm_odm->support_ic_type & ODM_RTL8192E)
258                 hal_txbf_8192e_fw_tx_bf(p_dm_odm, idx);
259         else if (p_dm_odm->support_ic_type & ODM_RTL8814A)
260                 hal_txbf_8814a_fw_txbf(p_dm_odm, idx);
261         else if (p_dm_odm->support_ic_type & ODM_RTL8822B)
262                 hal_txbf_8822b_fw_txbf(p_dm_odm, idx);
263 }
264
265 void
266 hal_com_txbf_clk_work_item_callback(
267 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
268         struct _ADAPTER         *adapter
269 #else
270         void                    *p_dm_void
271 #endif
272 )
273 {
274 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
275         PHAL_DATA_TYPE  p_hal_data = GET_HAL_DATA(adapter);
276         struct PHY_DM_STRUCT            *p_dm_odm = &p_hal_data->DM_OutSrc;
277 #else
278         struct PHY_DM_STRUCT    *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
279 #endif
280
281         ODM_RT_TRACE(p_dm_odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("[%s] Start!\n", __func__));
282
283         if (p_dm_odm->support_ic_type & ODM_RTL8812)
284                 hal_txbf_jaguar_clk_8812a(p_dm_odm);
285 }
286
287
288
289 void
290 hal_com_txbf_rate_work_item_callback(
291 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
292         struct _ADAPTER         *adapter
293 #else
294         void                    *p_dm_void
295 #endif
296 )
297 {
298 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
299         PHAL_DATA_TYPE  p_hal_data = GET_HAL_DATA(adapter);
300         struct PHY_DM_STRUCT            *p_dm_odm = &p_hal_data->DM_OutSrc;
301 #else
302         struct PHY_DM_STRUCT    *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
303 #endif
304         struct _HAL_TXBF_INFO   *p_txbf_info = &p_dm_odm->beamforming_info.txbf_info;
305         u8                      BW = p_txbf_info->BW;
306         u8                      rate = p_txbf_info->rate;
307
308         ODM_RT_TRACE(p_dm_odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("[%s] Start!\n", __func__));
309
310         if (p_dm_odm->support_ic_type & ODM_RTL8812)
311                 hal_txbf_8812a_set_ndpa_rate(p_dm_odm, BW, rate);
312         else if (p_dm_odm->support_ic_type & ODM_RTL8192E)
313                 hal_txbf_8192e_set_ndpa_rate(p_dm_odm, BW, rate);
314         else if (p_dm_odm->support_ic_type & ODM_RTL8814A)
315                 hal_txbf_8814a_set_ndpa_rate(p_dm_odm, BW, rate);
316
317 }
318
319
320 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
321 void
322 hal_com_txbf_fw_ndpa_timer_callback(
323         struct timer_list               *p_timer
324 )
325 {
326
327         struct _ADAPTER         *adapter = (struct _ADAPTER *)p_timer->Adapter;
328         PHAL_DATA_TYPE  p_hal_data = GET_HAL_DATA(adapter);
329         struct PHY_DM_STRUCT            *p_dm_odm = &p_hal_data->DM_OutSrc;
330
331         struct _HAL_TXBF_INFO   *p_txbf_info = &p_dm_odm->beamforming_info.txbf_info;
332
333
334         ODM_RT_TRACE(p_dm_odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("[%s] Start!\n", __func__));
335
336         if (*p_dm_odm->p_is_fw_dw_rsvd_page_in_progress)
337                 odm_set_timer(p_dm_odm, &(p_txbf_info->txbf_fw_ndpa_timer), 5);
338         else
339                 odm_schedule_work_item(&(p_txbf_info->txbf_fw_ndpa_work_item));
340 }
341 #endif
342
343
344 void
345 hal_com_txbf_status_work_item_callback(
346 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
347         struct _ADAPTER         *adapter
348 #else
349         void                    *p_dm_void
350 #endif
351 )
352 {
353 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
354         PHAL_DATA_TYPE  p_hal_data = GET_HAL_DATA(adapter);
355         struct PHY_DM_STRUCT            *p_dm_odm = &p_hal_data->DM_OutSrc;
356 #else
357         struct PHY_DM_STRUCT    *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
358 #endif
359         struct _HAL_TXBF_INFO   *p_txbf_info = &p_dm_odm->beamforming_info.txbf_info;
360
361         u8                      idx = p_txbf_info->txbf_idx;
362
363         ODM_RT_TRACE(p_dm_odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("[%s] Start!\n", __func__));
364
365         if (p_dm_odm->support_ic_type & (ODM_RTL8812 | ODM_RTL8821))
366                 hal_txbf_jaguar_status(p_dm_odm, idx);
367         else if (p_dm_odm->support_ic_type & ODM_RTL8192E)
368                 hal_txbf_8192e_status(p_dm_odm, idx);
369         else if (p_dm_odm->support_ic_type & ODM_RTL8814A)
370                 hal_txbf_8814a_status(p_dm_odm, idx);
371         else if (p_dm_odm->support_ic_type & ODM_RTL8822B)
372                 hal_txbf_8822b_status(p_dm_odm, idx);
373 }
374
375 void
376 hal_com_txbf_reset_tx_path_work_item_callback(
377 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
378         struct _ADAPTER         *adapter
379 #else
380         void                    *p_dm_void
381 #endif
382 )
383 {
384 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
385         PHAL_DATA_TYPE  p_hal_data = GET_HAL_DATA(adapter);
386         struct PHY_DM_STRUCT            *p_dm_odm = &p_hal_data->DM_OutSrc;
387 #else
388         struct PHY_DM_STRUCT    *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
389 #endif
390         struct _HAL_TXBF_INFO   *p_txbf_info = &p_dm_odm->beamforming_info.txbf_info;
391
392         u8                      idx = p_txbf_info->txbf_idx;
393
394         if (p_dm_odm->support_ic_type & ODM_RTL8814A)
395                 hal_txbf_8814a_reset_tx_path(p_dm_odm, idx);
396
397 }
398
399 void
400 hal_com_txbf_get_tx_rate_work_item_callback(
401 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
402         struct _ADAPTER         *adapter
403 #else
404         void                    *p_dm_void
405 #endif
406 )
407 {
408 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
409         PHAL_DATA_TYPE  p_hal_data = GET_HAL_DATA(adapter);
410         struct PHY_DM_STRUCT            *p_dm_odm = &p_hal_data->DM_OutSrc;
411 #else
412         struct PHY_DM_STRUCT    *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
413 #endif
414
415         if (p_dm_odm->support_ic_type & ODM_RTL8814A)
416                 hal_txbf_8814a_get_tx_rate(p_dm_odm);
417 }
418
419
420 boolean
421 hal_com_txbf_set(
422         void                    *p_dm_void,
423         u8                      set_type,
424         void                    *p_in_buf
425 )
426 {
427         struct PHY_DM_STRUCT    *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
428         u8                      *p_u1_tmp = (u8 *)p_in_buf;
429         struct _HAL_TXBF_INFO   *p_txbf_info = &p_dm_odm->beamforming_info.txbf_info;
430
431         ODM_RT_TRACE(p_dm_odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("[%s] set_type = 0x%X\n", __func__, set_type));
432
433         switch (set_type) {
434         case TXBF_SET_SOUNDING_ENTER:
435                 p_txbf_info->txbf_idx = *p_u1_tmp;
436                 phydm_beamform_set_sounding_enter(p_dm_odm);
437                 break;
438
439         case TXBF_SET_SOUNDING_LEAVE:
440                 p_txbf_info->txbf_idx = *p_u1_tmp;
441                 phydm_beamform_set_sounding_leave(p_dm_odm);
442                 break;
443
444         case TXBF_SET_SOUNDING_RATE:
445                 p_txbf_info->BW = p_u1_tmp[0];
446                 p_txbf_info->rate = p_u1_tmp[1];
447                 phydm_beamform_set_sounding_rate(p_dm_odm);
448                 break;
449
450         case TXBF_SET_SOUNDING_STATUS:
451                 p_txbf_info->txbf_idx = *p_u1_tmp;
452                 phydm_beamform_set_sounding_status(p_dm_odm);
453                 break;
454
455         case TXBF_SET_SOUNDING_FW_NDPA:
456                 p_txbf_info->ndpa_idx = *p_u1_tmp;
457                 phydm_beamform_set_sounding_fw_ndpa(p_dm_odm);
458                 break;
459
460         case TXBF_SET_SOUNDING_CLK:
461                 phydm_beamform_set_sounding_clk(p_dm_odm);
462                 break;
463
464         case TXBF_SET_TX_PATH_RESET:
465                 p_txbf_info->txbf_idx = *p_u1_tmp;
466                 phydm_beamform_set_reset_tx_path(p_dm_odm);
467                 break;
468
469         case TXBF_SET_GET_TX_RATE:
470                 phydm_beamform_set_get_tx_rate(p_dm_odm);
471                 break;
472
473         }
474
475         return true;
476 }
477
478 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
479 boolean
480 hal_com_txbf_get(
481         struct _ADAPTER         *adapter,
482         u8                      get_type,
483         void                    *p_out_buf
484 )
485 {
486         PHAL_DATA_TYPE          p_hal_data = GET_HAL_DATA(adapter);
487         struct PHY_DM_STRUCT                    *p_dm_odm = &p_hal_data->DM_OutSrc;
488         boolean                 *p_boolean = (boolean *)p_out_buf;
489
490         ODM_RT_TRACE(p_dm_odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("[%s] Start!\n", __func__));
491
492         if (get_type == TXBF_GET_EXPLICIT_BEAMFORMEE) {
493                 if (IS_HARDWARE_TYPE_OLDER_THAN_8812A(adapter))
494                         *p_boolean = false;
495                 else if (/*IS_HARDWARE_TYPE_8822B(adapter)      ||*/
496                         IS_HARDWARE_TYPE_8821B(adapter) ||
497                         IS_HARDWARE_TYPE_8192E(adapter) ||
498                         IS_HARDWARE_TYPE_JAGUAR(adapter) || IS_HARDWARE_TYPE_JAGUAR_AND_JAGUAR2(adapter))
499                         *p_boolean = true;
500                 else
501                         *p_boolean = false;
502         } else if (get_type == TXBF_GET_EXPLICIT_BEAMFORMER) {
503                 if (IS_HARDWARE_TYPE_OLDER_THAN_8812A(adapter))
504                         *p_boolean = false;
505                 else    if (/*IS_HARDWARE_TYPE_8822B(adapter)   ||*/
506                         IS_HARDWARE_TYPE_8821B(adapter) ||
507                         IS_HARDWARE_TYPE_8192E(adapter) ||
508                         IS_HARDWARE_TYPE_JAGUAR(adapter) || IS_HARDWARE_TYPE_JAGUAR_AND_JAGUAR2(adapter)) {
509                         if (p_hal_data->RF_Type == RF_2T2R || p_hal_data->RF_Type == RF_3T3R)
510                                 *p_boolean = true;
511                         else
512                                 *p_boolean = false;
513                 } else
514                         *p_boolean = false;
515         } else if (get_type == TXBF_GET_MU_MIMO_STA) {
516 #if ((RTL8822B_SUPPORT == 1) || (RTL8821C_SUPPORT == 1))
517                 if (IS_HARDWARE_TYPE_8822B(adapter) || IS_HARDWARE_TYPE_8821C(adapter))
518                         *p_boolean = true;
519                 else
520 #endif
521                         *p_boolean = false;
522
523
524         } else if (get_type == TXBF_GET_MU_MIMO_AP) {
525 #if (RTL8822B_SUPPORT == 1)
526                 if (IS_HARDWARE_TYPE_8822B(adapter))
527                         *p_boolean = true;
528                 else
529 #endif
530                         *p_boolean = false;
531         }
532
533         return true;
534 }
535 #endif
536
537
538 #endif