1 /******************************************************************************
3 * Copyright(c) 2007 - 2017 Realtek Corporation.
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.
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
14 *****************************************************************************/
15 #ifndef __RTW_BEAMFORMING_H_
16 #define __RTW_BEAMFORMING_H_
18 #ifdef CONFIG_BEAMFORMING
20 #ifdef RTW_BEAMFORMING_VERSION_2
21 #define MAX_NUM_BEAMFORMEE_SU 2
22 #define MAX_NUM_BEAMFORMER_SU 2
23 #define MAX_NUM_BEAMFORMEE_MU 6
24 #define MAX_NUM_BEAMFORMER_MU 1
26 #define MAX_BEAMFORMEE_ENTRY_NUM (MAX_NUM_BEAMFORMEE_SU + MAX_NUM_BEAMFORMEE_MU)
27 #define MAX_BEAMFORMER_ENTRY_NUM (MAX_NUM_BEAMFORMER_SU + MAX_NUM_BEAMFORMER_MU)
29 /* <Note> Need to be defined by IC */
30 #define SU_SOUNDING_TIMEOUT 5 /* unit: ms */
31 #define MU_SOUNDING_TIMEOUT 8 /* unit: ms */
33 #define GET_BEAMFORM_INFO(adapter) (&GET_HAL_DATA(adapter)->beamforming_info)
34 #define GetInitSoundCnt(_SoundPeriod, _MinSoundPeriod) ((_SoundPeriod)/(_MinSoundPeriod))
36 enum BEAMFORMING_CTRL_TYPE {
37 BEAMFORMING_CTRL_ENTER = 0,
38 BEAMFORMING_CTRL_LEAVE = 1,
39 BEAMFORMING_CTRL_START_PERIOD = 2,
40 BEAMFORMING_CTRL_END_PERIOD = 3,
41 BEAMFORMING_CTRL_SOUNDING_FAIL = 4,
42 BEAMFORMING_CTRL_SOUNDING_CLK = 5,
43 BEAMFORMING_CTRL_SET_GID_TABLE = 6,
44 BEAMFORMING_CTRL_SET_CSI_REPORT = 7,
47 enum _BEAMFORMING_STATE {
48 BEAMFORMING_STATE_IDLE,
49 BEAMFORMING_STATE_START,
50 BEAMFORMING_STATE_END,
54 * typedef BEAMFORMING_CAP for phydm
56 typedef enum beamforming_cap {
57 BEAMFORMING_CAP_NONE = 0x0,
58 BEAMFORMER_CAP_HT_EXPLICIT = 0x1,
59 BEAMFORMEE_CAP_HT_EXPLICIT = 0x2,
60 BEAMFORMER_CAP_VHT_SU = 0x4, /* Self has er Cap, because Reg er & peer ee */
61 BEAMFORMEE_CAP_VHT_SU = 0x8, /* Self has ee Cap, because Reg ee & peer er */
62 BEAMFORMER_CAP_VHT_MU = 0x10, /* Self has er Cap, because Reg er & peer ee */
63 BEAMFORMEE_CAP_VHT_MU = 0x20, /* Self has ee Cap, because Reg ee & peer er */
64 BEAMFORMER_CAP = 0x40,
65 BEAMFORMEE_CAP = 0x80,
68 enum _BEAMFORM_ENTRY_HW_STATE {
69 BEAMFORM_ENTRY_HW_STATE_NONE,
70 BEAMFORM_ENTRY_HW_STATE_ADD_INIT,
71 BEAMFORM_ENTRY_HW_STATE_ADDING,
72 BEAMFORM_ENTRY_HW_STATE_ADDED,
73 BEAMFORM_ENTRY_HW_STATE_DELETE_INIT,
74 BEAMFORM_ENTRY_HW_STATE_DELETING,
75 BEAMFORM_ENTRY_HW_STATE_MAX
78 /* The sounding state is recorded by BFer. */
79 enum _SOUNDING_STATE {
80 SOUNDING_STATE_NONE = 0,
81 SOUNDING_STATE_INIT = 1,
82 SOUNDING_STATE_SU_START = 2,
83 SOUNDING_STATE_SU_SOUNDDOWN = 3,
84 SOUNDING_STATE_MU_START = 4,
85 SOUNDING_STATE_MU_SOUNDDOWN = 5,
86 SOUNDING_STATE_SOUNDING_TIMEOUT = 6,
90 struct beamformee_entry {
91 u8 used; /* _TRUE/_FALSE */
94 /* Used to construct AID field of NDPA packet */
96 /* Used to Set Reg42C in IBSS mode */
98 /* Used to fill Reg42C & Reg714 to compare with P_AID of Tx DESC */
101 /* Used to fill Reg6E4 to fill Mac address of CSI report frame */
102 u8 mac_addr[ETH_ALEN];
103 /* Sounding BandWidth */
104 enum channel_width sound_bw;
107 enum beamforming_cap cap;
108 enum _BEAMFORM_ENTRY_HW_STATE state;
110 /* The BFee need to be sounded when count to zero */
112 u8 bCandidateSoundingPeer;
115 /* Get the result through throughput and Tx rate from BB API */
118 /* information for sounding judgement */
119 systime tx_timestamp;
122 u16 LogStatusFailCnt:5; /* 0~21 */
123 u16 DefaultCSICnt:5; /* 0~21 */
129 u8 comp_steering_num_of_bfer;
138 u8 user_position[16];
140 /* For 8822B C-cut workaround */
141 /* If the flag set to _TRUE, do not sound this STA */
145 struct beamformer_entry {
147 /* p_aid of BFer entry is probably not used */
148 /* Used to fill Reg42C & Reg714 to compare with p_aid of Tx DESC */
151 u8 mac_addr[ETH_ALEN];
153 enum beamforming_cap cap;
154 enum _BEAMFORM_ENTRY_HW_STATE state;
163 u8 user_position[16];
167 struct sounding_info {
168 u8 su_sounding_list[MAX_NUM_BEAMFORMEE_SU];
169 u8 mu_sounding_list[MAX_NUM_BEAMFORMEE_MU];
171 enum _SOUNDING_STATE state;
173 * su_bfee_curidx is index for beamforming_info.bfee_entry[]
174 * range: 0~MAX_BEAMFORMEE_ENTRY_NUM
177 u8 candidate_mu_bfee_cnt;
179 /* For sounding schedule maintenance */
180 u16 min_sounding_period;
181 /* Get from sounding list */
182 /* Ex: SU STA1, SU STA2, MU STA(1~n) => the value will be 2+1=3 */
183 u8 sound_remain_cnt_per_period;
195 struct beamforming_info {
196 enum beamforming_cap beamforming_cap;
197 enum _BEAMFORMING_STATE beamforming_state;
198 struct beamformee_entry bfee_entry[MAX_BEAMFORMEE_ENTRY_NUM];
199 struct beamformer_entry bfer_entry[MAX_BEAMFORMER_ENTRY_NUM];
200 u8 sounding_sequence;
201 u8 beamformee_su_cnt;
202 u8 beamformer_su_cnt;
203 u32 beamformee_su_reg_maping;
204 u32 beamformer_su_reg_maping;
206 u8 beamformee_mu_cnt;
207 u8 beamformer_mu_cnt;
208 u32 beamformee_mu_reg_maping;
209 u8 first_mu_bfee_index;
213 struct sounding_info sounding_info;
214 /* schedule regular timer for sounding */
215 _timer sounding_timer;
216 /* moniter if soudning too long */
217 _timer sounding_timeout_timer;
219 /* For HW configuration */
220 u8 SetHalBFEnterOnDemandCnt;
221 u8 SetHalBFLeaveOnDemandCnt;
222 u8 SetHalSoundownOnDemandCnt;
223 u8 bSetBFHwConfigInProgess;
226 * Target CSI report info.
227 * Keep the first SU CSI report info for 8822B HW bug workaround.
229 u8 bEnableSUTxBFWorkAround;
230 struct _RT_CSI_INFO TargetCSIInfo;
231 /* Only peform sounding to the first SU BFee */
232 struct beamformee_entry *TargetSUBFee;
238 enum beamforming_cap rtw_bf_bfee_get_entry_cap_by_macid(void *mlmepriv, u8 mac_id);
239 struct beamformer_entry *rtw_bf_bfer_get_entry_by_addr(PADAPTER, u8 *ra);
240 struct beamformee_entry *rtw_bf_bfee_get_entry_by_addr(PADAPTER, u8 *ra);
241 void rtw_bf_get_ndpa_packet(PADAPTER, union recv_frame *);
242 u32 rtw_bf_get_report_packet(PADAPTER, union recv_frame *);
243 u8 rtw_bf_send_vht_gid_mgnt_packet(PADAPTER, u8 *ra, u8 *gid, u8 *position);
244 void rtw_bf_get_vht_gid_mgnt_packet(PADAPTER, union recv_frame *);
245 void rtw_bf_init(PADAPTER);
246 void rtw_bf_cmd_hdl(PADAPTER, u8 type, u8 *pbuf);
247 u8 rtw_bf_cmd(PADAPTER, s32 type, u8 *pbuf, s32 size, u8 enqueue);
248 void rtw_bf_update_attrib(PADAPTER, struct pkt_attrib *, struct sta_info *);
249 void rtw_bf_c2h_handler(PADAPTER, u8 id, u8 *buf, u8 buf_len);
250 void rtw_bf_update_traffic(PADAPTER);
252 /* Compatible with old function name, only for using outside rtw_beamforming.c */
253 #define beamforming_get_entry_beam_cap_by_mac_id rtw_bf_bfee_get_entry_cap_by_macid
254 #define rtw_beamforming_get_ndpa_frame rtw_bf_get_ndpa_packet
255 #define rtw_beamforming_get_report_frame rtw_bf_get_report_packet
256 #define rtw_beamforming_get_vht_gid_mgnt_frame rtw_bf_get_vht_gid_mgnt_packet
257 #define beamforming_wk_hdl rtw_bf_cmd_hdl
258 #define beamforming_wk_cmd rtw_bf_cmd
259 #define update_attrib_txbf_info rtw_bf_update_attrib
261 #define HT_BF_CAP(adapter) ((adapter)->mlmepriv.htpriv.beamform_cap)
262 #define VHT_BF_CAP(adapter) ((adapter)->mlmepriv.vhtpriv.beamform_cap)
264 #define IS_HT_BEAMFORMEE(adapter) \
265 (HT_BF_CAP(adapter) & \
266 (BEAMFORMING_HT_BEAMFORMEE_ENABLE))
268 #define IS_VHT_BEAMFORMEE(adapter) \
269 (VHT_BF_CAP(adapter) & \
270 (BEAMFORMING_VHT_BEAMFORMEE_ENABLE | \
271 BEAMFORMING_VHT_MU_MIMO_STA_ENABLE))
273 #define IS_BEAMFORMEE(adapter) (IS_HT_BEAMFORMEE(adapter) | \
274 IS_VHT_BEAMFORMEE(adapter))
276 #else /* !RTW_BEAMFORMING_VERSION_2 */
278 #if (BEAMFORMING_SUPPORT == 0) /*for diver defined beamforming*/
279 #define BEAMFORMING_ENTRY_NUM 2
280 #define GET_BEAMFORM_INFO(_pmlmepriv) ((struct beamforming_info *)(&(_pmlmepriv)->beamforming_info))
283 typedef enum _BEAMFORMING_ENTRY_STATE {
284 BEAMFORMING_ENTRY_STATE_UNINITIALIZE,
285 BEAMFORMING_ENTRY_STATE_INITIALIZEING,
286 BEAMFORMING_ENTRY_STATE_INITIALIZED,
287 BEAMFORMING_ENTRY_STATE_PROGRESSING,
288 BEAMFORMING_ENTRY_STATE_PROGRESSED,
289 } BEAMFORMING_ENTRY_STATE, *PBEAMFORMING_ENTRY_STATE;
292 typedef enum _BEAMFORMING_STATE {
293 BEAMFORMING_STATE_IDLE,
294 BEAMFORMING_STATE_START,
295 BEAMFORMING_STATE_END,
296 } BEAMFORMING_STATE, *PBEAMFORMING_STATE;
299 typedef enum _BEAMFORMING_CAP {
300 BEAMFORMING_CAP_NONE = 0x0,
301 BEAMFORMER_CAP_HT_EXPLICIT = 0x1,
302 BEAMFORMEE_CAP_HT_EXPLICIT = 0x2,
303 BEAMFORMER_CAP_VHT_SU = 0x4, /* Self has er Cap, because Reg er & peer ee */
304 BEAMFORMEE_CAP_VHT_SU = 0x8, /* Self has ee Cap, because Reg ee & peer er */
305 BEAMFORMER_CAP = 0x10,
306 BEAMFORMEE_CAP = 0x20,
307 } BEAMFORMING_CAP, *PBEAMFORMING_CAP;
310 typedef enum _SOUNDING_MODE {
311 SOUNDING_SW_VHT_TIMER = 0x0,
312 SOUNDING_SW_HT_TIMER = 0x1,
313 SOUNDING_STOP_All_TIMER = 0x2,
314 SOUNDING_HW_VHT_TIMER = 0x3,
315 SOUNDING_HW_HT_TIMER = 0x4,
316 SOUNDING_STOP_OID_TIMER = 0x5,
317 SOUNDING_AUTO_VHT_TIMER = 0x6,
318 SOUNDING_AUTO_HT_TIMER = 0x7,
319 SOUNDING_FW_VHT_TIMER = 0x8,
320 SOUNDING_FW_HT_TIMER = 0x9,
321 } SOUNDING_MODE, *PSOUNDING_MODE;
323 struct beamforming_entry {
326 u16 aid; /* Used to construct AID field of NDPA packet. */
327 u16 mac_id; /* Used to Set Reg42C in IBSS mode. */
328 u16 p_aid; /* Used to fill Reg42C & Reg714 to compare with P_AID of Tx DESC. */
330 u8 mac_addr[ETH_ALEN];/* Used to fill Reg6E4 to fill Mac address of CSI report frame. */
331 enum channel_width sound_bw; /* Sounding BandWidth */
333 BEAMFORMING_CAP beamforming_entry_cap;
334 BEAMFORMING_ENTRY_STATE beamforming_entry_state;
335 u8 ClockResetTimes; /*Modified by Jeffery @2015-04-10*/
336 u8 PreLogSeq; /*Modified by Jeffery @2015-03-30*/
337 u8 LogSeq; /*Modified by Jeffery @2014-10-29*/
338 u16 LogRetryCnt:3; /*Modified by Jeffery @2014-10-29*/
339 u16 LogSuccess:2; /*Modified by Jeffery @2014-10-29*/
342 u8 PreCsiReport[327];
347 struct sounding_info {
349 enum channel_width sound_bw;
350 SOUNDING_MODE sound_mode;
354 struct beamforming_info {
355 BEAMFORMING_CAP beamforming_cap;
356 BEAMFORMING_STATE beamforming_state;
357 struct beamforming_entry beamforming_entry[BEAMFORMING_ENTRY_NUM];
358 u8 beamforming_cur_idx;
359 u8 beamforming_in_progress;
360 u8 sounding_sequence;
361 struct sounding_info sounding_info;
364 struct rtw_ndpa_sta_info {
370 BEAMFORMING_CAP beamforming_get_entry_beam_cap_by_mac_id(PVOID pmlmepriv , u8 mac_id);
371 void beamforming_notify(PADAPTER adapter);
372 BEAMFORMING_CAP beamforming_get_beamform_cap(struct beamforming_info *pBeamInfo);
374 BOOLEAN beamforming_send_ht_ndpa_packet(PADAPTER Adapter, u8 *ra, enum channel_width bw, u8 qidx);
375 BOOLEAN beamforming_send_vht_ndpa_packet(PADAPTER Adapter, u8 *ra, u16 aid, enum channel_width bw, u8 qidx);
377 void beamforming_check_sounding_success(PADAPTER Adapter, BOOLEAN status);
379 void beamforming_watchdog(PADAPTER Adapter);
380 #endif /*#if (BEAMFORMING_SUPPORT ==0)- for diver defined beamforming*/
382 enum BEAMFORMING_CTRL_TYPE {
383 BEAMFORMING_CTRL_ENTER = 0,
384 BEAMFORMING_CTRL_LEAVE = 1,
385 BEAMFORMING_CTRL_START_PERIOD = 2,
386 BEAMFORMING_CTRL_END_PERIOD = 3,
387 BEAMFORMING_CTRL_SOUNDING_FAIL = 4,
388 BEAMFORMING_CTRL_SOUNDING_CLK = 5,
390 u32 rtw_beamforming_get_report_frame(PADAPTER Adapter, union recv_frame *precv_frame);
391 void rtw_beamforming_get_ndpa_frame(PADAPTER Adapter, union recv_frame *precv_frame);
393 void beamforming_wk_hdl(_adapter *padapter, u8 type, u8 *pbuf);
394 u8 beamforming_wk_cmd(_adapter *padapter, s32 type, u8 *pbuf, s32 size, u8 enqueue);
395 void update_attrib_txbf_info(_adapter *padapter, struct pkt_attrib *pattrib, struct sta_info *psta);
397 #endif /* !RTW_BEAMFORMING_VERSION_2 */
399 #endif /*#ifdef CONFIG_BEAMFORMING */
401 #endif /*__RTW_BEAMFORMING_H_*/