OSDN Git Service

Add rtl8821ce driver version 5.5.2
[android-x86/external-kernel-drivers.git] / rtl8821ce / include / rtw_beamforming.h
1 /******************************************************************************
2  *
3  * Copyright(c) 2007 - 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 #ifndef __RTW_BEAMFORMING_H_
16 #define __RTW_BEAMFORMING_H_
17
18 #ifdef CONFIG_BEAMFORMING
19
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
25
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)
28
29 /* <Note> Need to be defined by IC */
30 #define SU_SOUNDING_TIMEOUT     5       /* unit: ms */
31 #define MU_SOUNDING_TIMEOUT     8       /* unit: ms */
32
33 #define GET_BEAMFORM_INFO(adapter)      (&GET_HAL_DATA(adapter)->beamforming_info)
34 #define GetInitSoundCnt(_SoundPeriod, _MinSoundPeriod)  ((_SoundPeriod)/(_MinSoundPeriod))
35
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,
45 };
46
47 enum _BEAMFORMING_STATE {
48         BEAMFORMING_STATE_IDLE,
49         BEAMFORMING_STATE_START,
50         BEAMFORMING_STATE_END,
51 };
52
53 /*
54  * typedef BEAMFORMING_CAP for phydm
55  */
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,
66 } BEAMFORMING_CAP;
67
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
76 };
77
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,
87         SOUNDING_STATE_MAX
88 };
89
90 struct beamformee_entry {
91         u8 used;        /* _TRUE/_FALSE */
92         u8 txbf;
93         u8 sounding;
94         /* Used to construct AID field of NDPA packet */
95         u16 aid;
96         /* Used to Set Reg42C in IBSS mode */
97         u16 mac_id;
98         /* Used to fill Reg42C & Reg714 to compare with P_AID of Tx DESC */
99         u16 p_aid;
100         u8 g_id;
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;
105         u16 sound_period;
106
107         enum beamforming_cap cap;
108         enum _BEAMFORM_ENTRY_HW_STATE state;
109
110         /* The BFee need to be sounded when count to zero */
111         u8 SoundCnt;
112         u8 bCandidateSoundingPeer;
113         u8 bSoundingTimeout;
114         u8 bDeleteSounding;
115         /* Get the result through throughput and Tx rate from BB API */
116         u8 bApplySounding;
117
118         /* information for sounding judgement */
119         systime tx_timestamp;
120         u64 tx_bytes;
121
122         u16 LogStatusFailCnt:5; /* 0~21 */
123         u16 DefaultCSICnt:5; /* 0~21 */
124         u8 CSIMatrix[327];
125         u16 CSIMatrixLen;
126
127         u8 NumofSoundingDim;
128
129         u8 comp_steering_num_of_bfer;
130
131
132         /* SU-MIMO */
133         u8 su_reg_index;
134
135         /* MU-MIMO */
136         u8 mu_reg_index;
137         u8 gid_valid[8];
138         u8 user_position[16];
139
140         /* For 8822B C-cut workaround */
141         /* If the flag set to _TRUE, do not sound this STA */
142         u8 bSuspendSUCap;
143 };
144
145 struct beamformer_entry {
146         u8 used;
147         /* p_aid of BFer entry is probably not used */
148         /* Used to fill Reg42C & Reg714 to compare with p_aid of Tx DESC */
149         u16 p_aid;
150         u8 g_id;
151         u8 mac_addr[ETH_ALEN];
152
153         enum beamforming_cap cap;
154         enum _BEAMFORM_ENTRY_HW_STATE state;
155
156         u8 NumofSoundingDim;
157
158         /* SU-MIMO */
159         u8 su_reg_index;
160
161         /* MU-MIMO */
162         u8 gid_valid[8];
163         u8 user_position[16];
164         u16 aid;
165 };
166
167 struct sounding_info {
168         u8 su_sounding_list[MAX_NUM_BEAMFORMEE_SU];
169         u8 mu_sounding_list[MAX_NUM_BEAMFORMEE_MU];
170
171         enum _SOUNDING_STATE state;
172         /*
173          * su_bfee_curidx is index for beamforming_info.bfee_entry[]
174          * range: 0~MAX_BEAMFORMEE_ENTRY_NUM
175          */
176         u8 su_bfee_curidx;
177         u8 candidate_mu_bfee_cnt;
178
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;
184 };
185
186 struct _RT_CSI_INFO{
187         u8 Nc;
188         u8 Nr;
189         u8 Ng;
190         u8 CodeBook;
191         u8 ChnlWidth;
192         u8 bVHT;
193 };
194
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;
205         /* For MU-MINO */
206         u8 beamformee_mu_cnt;
207         u8 beamformer_mu_cnt;
208         u32 beamformee_mu_reg_maping;
209         u8 first_mu_bfee_index;
210         u8 mu_bfer_curidx;
211         u8 cur_csi_rpt_rate;
212
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;
218
219         /* For HW configuration */
220         u8 SetHalBFEnterOnDemandCnt;
221         u8 SetHalBFLeaveOnDemandCnt;
222         u8 SetHalSoundownOnDemandCnt;
223         u8 bSetBFHwConfigInProgess;
224
225         /*
226          * Target CSI report info.
227          * Keep the first SU CSI report info for 8822B HW bug workaround.
228          */
229         u8 bEnableSUTxBFWorkAround;
230         struct _RT_CSI_INFO TargetCSIInfo;
231         /* Only peform sounding to the first SU BFee */
232         struct beamformee_entry *TargetSUBFee;
233
234         /* For debug */
235         s8 sounding_running;
236 };
237
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);
251
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
260
261 #define HT_BF_CAP(adapter) ((adapter)->mlmepriv.htpriv.beamform_cap)
262 #define VHT_BF_CAP(adapter) ((adapter)->mlmepriv.vhtpriv.beamform_cap)
263
264 #define IS_HT_BEAMFORMEE(adapter) \
265                 (HT_BF_CAP(adapter) & \
266                 (BEAMFORMING_HT_BEAMFORMEE_ENABLE))
267
268 #define IS_VHT_BEAMFORMEE(adapter) \
269                 (VHT_BF_CAP(adapter) & \
270                 (BEAMFORMING_VHT_BEAMFORMEE_ENABLE | \
271                  BEAMFORMING_VHT_MU_MIMO_STA_ENABLE))
272
273 #define IS_BEAMFORMEE(adapter) (IS_HT_BEAMFORMEE(adapter) | \
274                                 IS_VHT_BEAMFORMEE(adapter))
275
276 #else /* !RTW_BEAMFORMING_VERSION_2 */
277
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))
281
282
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;
290
291
292 typedef enum _BEAMFORMING_STATE {
293         BEAMFORMING_STATE_IDLE,
294         BEAMFORMING_STATE_START,
295         BEAMFORMING_STATE_END,
296 } BEAMFORMING_STATE, *PBEAMFORMING_STATE;
297
298
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;
308
309
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;
322
323 struct beamforming_entry {
324         BOOLEAN bUsed;
325         BOOLEAN bSound;
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. */
329         u16 g_id;
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 */
332         u16     sound_period;
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*/
340
341         u8      LogStatusFailCnt;
342         u8      PreCsiReport[327];
343         u8      DefaultCsiCnt;
344         BOOLEAN bDefaultCSI;
345 };
346
347 struct sounding_info {
348         u8                              sound_idx;
349         enum channel_width      sound_bw;
350         SOUNDING_MODE   sound_mode;
351         u16                             sound_period;
352 };
353
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;
362 };
363
364 struct rtw_ndpa_sta_info {
365         u16     aid:12;
366         u16     feedback_type:1;
367         u16     nc_index:3;
368 };
369
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);
373
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);
376
377 void    beamforming_check_sounding_success(PADAPTER Adapter, BOOLEAN status);
378
379 void    beamforming_watchdog(PADAPTER Adapter);
380 #endif /*#if (BEAMFORMING_SUPPORT ==0)- for diver defined beamforming*/
381
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,
389 };
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);
392
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);
396
397 #endif /* !RTW_BEAMFORMING_VERSION_2 */
398
399 #endif /*#ifdef CONFIG_BEAMFORMING */
400
401 #endif /*__RTW_BEAMFORMING_H_*/