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