net: wireless: rockchip_wlan: add rtl8723cs support
[firefly-linux-kernel-4.4.55.git] / drivers / net / wireless / rockchip_wlan / rtl8723cs / include / rtw_beamforming.h
1 /******************************************************************************
2  *
3  * Copyright(c) 2007 - 2016 Realtek Corporation. All rights reserved.
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  * You should have received a copy of the GNU General Public License along with
15  * this program; if not, write to the Free Software Foundation, Inc.,
16  * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17  *
18  *
19  ******************************************************************************/
20 #ifndef __RTW_BEAMFORMING_H_
21 #define __RTW_BEAMFORMING_H_
22
23 #ifdef CONFIG_BEAMFORMING
24
25 #ifdef RTW_BEAMFORMING_VERSION_2
26 #define MAX_NUM_BEAMFORMEE_SU   2
27 #define MAX_NUM_BEAMFORMER_SU   2
28 #define MAX_NUM_BEAMFORMEE_MU   6
29 #define MAX_NUM_BEAMFORMER_MU   1
30
31 #define MAX_BEAMFORMEE_ENTRY_NUM        (MAX_NUM_BEAMFORMEE_SU + MAX_NUM_BEAMFORMEE_MU)
32 #define MAX_BEAMFORMER_ENTRY_NUM        (MAX_NUM_BEAMFORMER_SU + MAX_NUM_BEAMFORMER_MU)
33
34 /* <Note> Need to be defined by IC */
35 #define SU_SOUNDING_TIMEOUT     5       /* unit: ms */
36 #define MU_SOUNDING_TIMEOUT     8       /* unit: ms */
37
38 #define GET_BEAMFORM_INFO(adapter)      (&GET_HAL_DATA(adapter)->beamforming_info)
39 #define GetInitSoundCnt(_SoundPeriod, _MinSoundPeriod)  ((_SoundPeriod)/(_MinSoundPeriod))
40
41 enum BEAMFORMING_CTRL_TYPE {
42         BEAMFORMING_CTRL_ENTER = 0,
43         BEAMFORMING_CTRL_LEAVE = 1,
44         BEAMFORMING_CTRL_START_PERIOD = 2,
45         BEAMFORMING_CTRL_END_PERIOD = 3,
46         BEAMFORMING_CTRL_SOUNDING_FAIL = 4,
47         BEAMFORMING_CTRL_SOUNDING_CLK = 5,
48         BEAMFORMING_CTRL_SET_GID_TABLE = 6,
49         BEAMFORMING_CTRL_SET_CSI_REPORT = 7,
50 };
51
52 enum _BEAMFORMING_STATE {
53         BEAMFORMING_STATE_IDLE,
54         BEAMFORMING_STATE_START,
55         BEAMFORMING_STATE_END,
56 };
57
58 /*
59  * typedef BEAMFORMING_CAP for phydm
60  */
61 typedef enum beamforming_cap {
62         BEAMFORMING_CAP_NONE = 0x0,
63         BEAMFORMER_CAP_HT_EXPLICIT = 0x1,
64         BEAMFORMEE_CAP_HT_EXPLICIT = 0x2,
65         BEAMFORMER_CAP_VHT_SU = 0x4,                    /* Self has er Cap, because Reg er  & peer ee */
66         BEAMFORMEE_CAP_VHT_SU = 0x8,                    /* Self has ee Cap, because Reg ee & peer er */
67         BEAMFORMER_CAP_VHT_MU = 0x10,                   /* Self has er Cap, because Reg er & peer ee */
68         BEAMFORMEE_CAP_VHT_MU = 0x20,                   /* Self has ee Cap, because Reg ee & peer er */
69         BEAMFORMER_CAP = 0x40,
70         BEAMFORMEE_CAP = 0x80,
71 } BEAMFORMING_CAP;
72
73 enum _BEAMFORM_ENTRY_HW_STATE {
74         BEAMFORM_ENTRY_HW_STATE_NONE,
75         BEAMFORM_ENTRY_HW_STATE_ADD_INIT,
76         BEAMFORM_ENTRY_HW_STATE_ADDING,
77         BEAMFORM_ENTRY_HW_STATE_ADDED,
78         BEAMFORM_ENTRY_HW_STATE_DELETE_INIT,
79         BEAMFORM_ENTRY_HW_STATE_DELETING,
80         BEAMFORM_ENTRY_HW_STATE_MAX
81 };
82
83 /* The sounding state is recorded by BFer. */
84 enum _SOUNDING_STATE {
85         SOUNDING_STATE_NONE             = 0,
86         SOUNDING_STATE_INIT             = 1,
87         SOUNDING_STATE_SU_START         = 2,
88         SOUNDING_STATE_SU_SOUNDDOWN     = 3,
89         SOUNDING_STATE_MU_START         = 4,
90         SOUNDING_STATE_MU_SOUNDDOWN     = 5,
91         SOUNDING_STATE_SOUNDING_TIMEOUT = 6,
92         SOUNDING_STATE_MAX
93 };
94
95 struct beamformee_entry {
96         u8 used;        /* _TRUE/_FALSE */
97         u8 txbf;
98         u8 sounding;
99         /* Used to construct AID field of NDPA packet */
100         u16 aid;
101         /* Used to Set Reg42C in IBSS mode */
102         u16 mac_id;
103         /* Used to fill Reg42C & Reg714 to compare with P_AID of Tx DESC */
104         u16 p_aid;
105         u8 g_id;
106         /* Used to fill Reg6E4 to fill Mac address of CSI report frame */
107         u8 mac_addr[ETH_ALEN];
108         /* Sounding BandWidth */
109         CHANNEL_WIDTH sound_bw;
110         u16 sound_period;
111
112         enum beamforming_cap cap;
113         enum _BEAMFORM_ENTRY_HW_STATE state;
114
115         /* The BFee need to be sounded when count to zero */
116         u8 SoundCnt;
117         u8 bCandidateSoundingPeer;
118         u8 bSoundingTimeout;
119         u8 bDeleteSounding;
120         /* Get the result through throughput and Tx rate from BB API */
121         u8 bApplySounding;
122
123         /* information for sounding judgement */
124         u32 tx_timestamp;
125         u64 tx_bytes;
126
127         u16 LogStatusFailCnt:5; /* 0~21 */
128         u16 DefaultCSICnt:5; /* 0~21 */
129         u8 CSIMatrix[327];
130         u16 CSIMatrixLen;
131
132         u8 NumofSoundingDim;
133
134         u8 comp_steering_num_of_bfer;
135
136
137         /* SU-MIMO */
138         u8 su_reg_index;
139
140         /* MU-MIMO */
141         u8 mu_reg_index;
142         u8 gid_valid[8];
143         u8 user_position[16];
144
145         /* For 8822B C-cut workaround */
146         /* If the flag set to _TRUE, do not sound this STA */
147         u8 bSuspendSUCap;
148 };
149
150 struct beamformer_entry {
151         u8 used;
152         /* p_aid of BFer entry is probably not used */
153         /* Used to fill Reg42C & Reg714 to compare with p_aid of Tx DESC */
154         u16 p_aid;
155         u8 g_id;
156         u8 mac_addr[ETH_ALEN];
157
158         enum beamforming_cap cap;
159         enum _BEAMFORM_ENTRY_HW_STATE state;
160
161         u8 NumofSoundingDim;
162
163         /* SU-MIMO */
164         u8 su_reg_index;
165
166         /* MU-MIMO */
167         u8 gid_valid[8];
168         u8 user_position[16];
169         u16 aid;
170 };
171
172 struct sounding_info {
173         u8 su_sounding_list[MAX_NUM_BEAMFORMEE_SU];
174         u8 mu_sounding_list[MAX_NUM_BEAMFORMEE_MU];
175
176         enum _SOUNDING_STATE state;
177         /*
178          * su_bfee_curidx is index for beamforming_info.bfee_entry[]
179          * range: 0~MAX_BEAMFORMEE_ENTRY_NUM
180          */
181         u8 su_bfee_curidx;
182         u8 candidate_mu_bfee_cnt;
183
184         /* For sounding schedule maintenance */
185         u16 min_sounding_period;
186         /* Get from sounding list */
187         /* Ex: SU STA1, SU STA2, MU STA(1~n) => the value will be 2+1=3 */
188         u8 sound_remain_cnt_per_period;
189 };
190
191 struct _RT_CSI_INFO{
192         u8 Nc;
193         u8 Nr;
194         u8 Ng;
195         u8 CodeBook;
196         u8 ChnlWidth;
197         u8 bVHT;
198 };
199
200 struct beamforming_info {
201         enum beamforming_cap beamforming_cap;
202         enum _BEAMFORMING_STATE beamforming_state;
203         struct beamformee_entry bfee_entry[MAX_BEAMFORMEE_ENTRY_NUM];
204         struct beamformer_entry bfer_entry[MAX_BEAMFORMER_ENTRY_NUM];
205         u8 sounding_sequence;
206         u8 beamformee_su_cnt;
207         u8 beamformer_su_cnt;
208         u32 beamformee_su_reg_maping;
209         u32 beamformer_su_reg_maping;
210         /* For MU-MINO */
211         u8 beamformee_mu_cnt;
212         u8 beamformer_mu_cnt;
213         u32 beamformee_mu_reg_maping;
214         u8 first_mu_bfee_index;
215         u8 mu_bfer_curidx;
216
217         struct sounding_info sounding_info;
218         /* schedule regular timer for sounding */
219         _timer sounding_timer;
220         /* moniter if soudning too long */
221         _timer sounding_timeout_timer;
222
223         /* For HW configuration */
224         u8 SetHalBFEnterOnDemandCnt;
225         u8 SetHalBFLeaveOnDemandCnt;
226         u8 SetHalSoundownOnDemandCnt;
227         u8 bSetBFHwConfigInProgess;
228
229         /*
230          * Target CSI report info.
231          * Keep the first SU CSI report info for 8822B HW bug workaround.
232          */
233         u8 bEnableSUTxBFWorkAround;
234         struct _RT_CSI_INFO TargetCSIInfo;
235         /* Only peform sounding to the first SU BFee */
236         struct beamformee_entry *TargetSUBFee;
237
238         /* For debug */
239         s8 sounding_running;
240 };
241
242 enum beamforming_cap rtw_bf_bfee_get_entry_cap_by_macid(void *mlmepriv, u8 mac_id);
243 struct beamformer_entry *rtw_bf_bfer_get_entry_by_addr(PADAPTER, u8 *ra);
244 struct beamformee_entry *rtw_bf_bfee_get_entry_by_addr(PADAPTER, u8 *ra);
245 void rtw_bf_get_ndpa_packet(PADAPTER, union recv_frame *);
246 u32 rtw_bf_get_report_packet(PADAPTER, union recv_frame *);
247 u8 rtw_bf_send_vht_gid_mgnt_packet(PADAPTER, u8 *ra, u8 *gid, u8 *position);
248 void rtw_bf_get_vht_gid_mgnt_packet(PADAPTER, union recv_frame *);
249 void rtw_bf_init(PADAPTER);
250 void rtw_bf_cmd_hdl(PADAPTER, u8 type, u8 *pbuf);
251 u8 rtw_bf_cmd(PADAPTER, s32 type, u8 *pbuf, s32 size, u8 enqueue);
252 void rtw_bf_update_attrib(PADAPTER, struct pkt_attrib *, struct sta_info *);
253 void rtw_bf_c2h_handler(PADAPTER, u8 id, u8 *buf, u8 buf_len);
254 void rtw_bf_update_traffic(PADAPTER);
255
256 /* Compatible with old function name, only for using outside rtw_beamforming.c */
257 #define beamforming_get_entry_beam_cap_by_mac_id        rtw_bf_bfee_get_entry_cap_by_macid
258 #define rtw_beamforming_get_ndpa_frame                  rtw_bf_get_ndpa_packet
259 #define rtw_beamforming_get_report_frame                        rtw_bf_get_report_packet
260 #define rtw_beamforming_get_vht_gid_mgnt_frame          rtw_bf_get_vht_gid_mgnt_packet
261 #define beamforming_wk_hdl                              rtw_bf_cmd_hdl
262 #define beamforming_wk_cmd                              rtw_bf_cmd
263 #define update_attrib_txbf_info                         rtw_bf_update_attrib
264
265 #else /* !RTW_BEAMFORMING_VERSION_2 */
266
267 #if (BEAMFORMING_SUPPORT == 0) /*for diver defined beamforming*/
268 #define BEAMFORMING_ENTRY_NUM           2
269 #define GET_BEAMFORM_INFO(_pmlmepriv)   ((struct beamforming_info *)(&(_pmlmepriv)->beamforming_info))
270
271
272 typedef enum _BEAMFORMING_ENTRY_STATE {
273         BEAMFORMING_ENTRY_STATE_UNINITIALIZE,
274         BEAMFORMING_ENTRY_STATE_INITIALIZEING,
275         BEAMFORMING_ENTRY_STATE_INITIALIZED,
276         BEAMFORMING_ENTRY_STATE_PROGRESSING,
277         BEAMFORMING_ENTRY_STATE_PROGRESSED,
278 } BEAMFORMING_ENTRY_STATE, *PBEAMFORMING_ENTRY_STATE;
279
280
281 typedef enum _BEAMFORMING_STATE {
282         BEAMFORMING_STATE_IDLE,
283         BEAMFORMING_STATE_START,
284         BEAMFORMING_STATE_END,
285 } BEAMFORMING_STATE, *PBEAMFORMING_STATE;
286
287
288 typedef enum _BEAMFORMING_CAP {
289         BEAMFORMING_CAP_NONE = 0x0,
290         BEAMFORMER_CAP_HT_EXPLICIT = 0x1,
291         BEAMFORMEE_CAP_HT_EXPLICIT = 0x2,
292         BEAMFORMER_CAP_VHT_SU = 0x4,                    /* Self has er Cap, because Reg er  & peer ee */
293         BEAMFORMEE_CAP_VHT_SU = 0x8,                    /* Self has ee Cap, because Reg ee & peer er */
294         BEAMFORMER_CAP = 0x10,
295         BEAMFORMEE_CAP = 0x20,
296 } BEAMFORMING_CAP, *PBEAMFORMING_CAP;
297
298
299 typedef enum _SOUNDING_MODE {
300         SOUNDING_SW_VHT_TIMER = 0x0,
301         SOUNDING_SW_HT_TIMER = 0x1,
302         SOUNDING_STOP_All_TIMER = 0x2,
303         SOUNDING_HW_VHT_TIMER = 0x3,
304         SOUNDING_HW_HT_TIMER = 0x4,
305         SOUNDING_STOP_OID_TIMER = 0x5,
306         SOUNDING_AUTO_VHT_TIMER = 0x6,
307         SOUNDING_AUTO_HT_TIMER = 0x7,
308         SOUNDING_FW_VHT_TIMER = 0x8,
309         SOUNDING_FW_HT_TIMER = 0x9,
310 } SOUNDING_MODE, *PSOUNDING_MODE;
311
312 struct beamforming_entry {
313         BOOLEAN bUsed;
314         BOOLEAN bSound;
315         u16     aid;                    /* Used to construct AID field of NDPA packet. */
316         u16     mac_id;         /* Used to Set Reg42C in IBSS mode. */
317         u16     p_aid;          /* Used to fill Reg42C & Reg714 to compare with P_AID of Tx DESC. */
318         u16 g_id;
319         u8      mac_addr[6];/* Used to fill Reg6E4 to fill Mac address of CSI report frame. */
320         CHANNEL_WIDTH   sound_bw;       /* Sounding BandWidth */
321         u16     sound_period;
322         BEAMFORMING_CAP beamforming_entry_cap;
323         BEAMFORMING_ENTRY_STATE beamforming_entry_state;
324         u8                              ClockResetTimes;                        /*Modified by Jeffery @2015-04-10*/
325         u8                              PreLogSeq;                              /*Modified by Jeffery @2015-03-30*/
326         u8                              LogSeq;                                 /*Modified by Jeffery @2014-10-29*/
327         u16                             LogRetryCnt:3;                  /*Modified by Jeffery @2014-10-29*/
328         u16                             LogSuccess:2;                   /*Modified by Jeffery @2014-10-29*/
329
330         u8      LogStatusFailCnt;
331         u8      PreCsiReport[327];
332         u8      DefaultCsiCnt;
333         BOOLEAN bDefaultCSI;
334 };
335
336 struct sounding_info {
337         u8                              sound_idx;
338         CHANNEL_WIDTH   sound_bw;
339         SOUNDING_MODE   sound_mode;
340         u16                             sound_period;
341 };
342
343 struct beamforming_info {
344         BEAMFORMING_CAP         beamforming_cap;
345         BEAMFORMING_STATE               beamforming_state;
346         struct beamforming_entry        beamforming_entry[BEAMFORMING_ENTRY_NUM];
347         u8                                              beamforming_cur_idx;
348         u8                                              beamforming_in_progress;
349         u8                                              sounding_sequence;
350         struct sounding_info            sounding_info;
351 };
352
353 struct rtw_ndpa_sta_info {
354         u16     aid:12;
355         u16     feedback_type:1;
356         u16     nc_index:3;
357 };
358
359 BEAMFORMING_CAP beamforming_get_entry_beam_cap_by_mac_id(PVOID pmlmepriv , u8 mac_id);
360 void    beamforming_notify(PADAPTER adapter);
361 BEAMFORMING_CAP beamforming_get_beamform_cap(struct beamforming_info    *pBeamInfo);
362
363 BOOLEAN beamforming_send_ht_ndpa_packet(PADAPTER Adapter, u8 *ra, CHANNEL_WIDTH bw, u8 qidx);
364 BOOLEAN beamforming_send_vht_ndpa_packet(PADAPTER Adapter, u8 *ra, u16 aid, CHANNEL_WIDTH bw, u8 qidx);
365
366 void    beamforming_check_sounding_success(PADAPTER Adapter, BOOLEAN status);
367
368 void    beamforming_watchdog(PADAPTER Adapter);
369 #endif /*#if (BEAMFORMING_SUPPORT ==0)- for diver defined beamforming*/
370
371 enum BEAMFORMING_CTRL_TYPE {
372         BEAMFORMING_CTRL_ENTER = 0,
373         BEAMFORMING_CTRL_LEAVE = 1,
374         BEAMFORMING_CTRL_START_PERIOD = 2,
375         BEAMFORMING_CTRL_END_PERIOD = 3,
376         BEAMFORMING_CTRL_SOUNDING_FAIL = 4,
377         BEAMFORMING_CTRL_SOUNDING_CLK = 5,
378 };
379 u32     rtw_beamforming_get_report_frame(PADAPTER        Adapter, union recv_frame *precv_frame);
380 void    rtw_beamforming_get_ndpa_frame(PADAPTER  Adapter, union recv_frame *precv_frame);
381
382 void    beamforming_wk_hdl(_adapter *padapter, u8 type, u8 *pbuf);
383 u8      beamforming_wk_cmd(_adapter *padapter, s32 type, u8 *pbuf, s32 size, u8 enqueue);
384 void update_attrib_txbf_info(_adapter *padapter, struct pkt_attrib *pattrib, struct sta_info *psta);
385
386 #endif /* !RTW_BEAMFORMING_VERSION_2 */
387
388 #endif /*#ifdef CONFIG_BEAMFORMING */
389
390 #endif /*__RTW_BEAMFORMING_H_*/