net: wireless: rockchip_wlan: add rtl8723cs support
[firefly-linux-kernel-4.4.55.git] / drivers / net / wireless / rockchip_wlan / rtl8723cs / hal / phydm / phydm_beamforming.h
1 #ifndef __INC_PHYDM_BEAMFORMING_H
2 #define __INC_PHYDM_BEAMFORMING_H
3
4 #ifndef BEAMFORMING_SUPPORT
5         #define BEAMFORMING_SUPPORT             0
6 #endif
7
8 /*Beamforming Related*/
9 #include "txbf/halcomtxbf.h"
10 #include "txbf/haltxbfjaguar.h"
11 #include "txbf/haltxbf8192e.h"
12 #include "txbf/haltxbf8814a.h"
13 #include "txbf/haltxbf8822b.h"
14 #include "txbf/haltxbfinterface.h"
15
16 #if (BEAMFORMING_SUPPORT == 1)
17
18 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
19
20 #define eq_mac_addr(a,b)                                                ( ((a)[0]==(b)[0] && (a)[1]==(b)[1] && (a)[2]==(b)[2] && (a)[3]==(b)[3] && (a)[4]==(b)[4] && (a)[5]==(b)[5]) ? 1:0 )
21 #define cp_mac_addr(des,src)                                    ((des)[0]=(src)[0],(des)[1]=(src)[1],(des)[2]=(src)[2],(des)[3]=(src)[3],(des)[4]=(src)[4],(des)[5]=(src)[5])
22
23 #endif
24
25 #define MAX_BEAMFORMEE_SU       2
26 #define MAX_BEAMFORMER_SU       2
27 #if (RTL8822B_SUPPORT == 1)
28         #define MAX_BEAMFORMEE_MU       6
29         #define MAX_BEAMFORMER_MU       1
30 #else
31         #define MAX_BEAMFORMEE_MU       0
32         #define MAX_BEAMFORMER_MU       0
33 #endif
34
35 #define BEAMFORMEE_ENTRY_NUM            (MAX_BEAMFORMEE_SU + MAX_BEAMFORMEE_MU)
36 #define BEAMFORMER_ENTRY_NUM            (MAX_BEAMFORMER_SU + MAX_BEAMFORMER_MU)
37
38 #if (DM_ODM_SUPPORT_TYPE == ODM_CE)
39         /*for different naming between WIN and CE*/
40         #define BEACON_QUEUE    BCN_QUEUE_INX
41         #define NORMAL_QUEUE    MGT_QUEUE_INX
42         #define RT_DISABLE_FUNC RTW_DISABLE_FUNC
43         #define RT_ENABLE_FUNC RTW_ENABLE_FUNC
44 #endif
45
46 enum beamforming_entry_state {
47         BEAMFORMING_ENTRY_STATE_UNINITIALIZE,
48         BEAMFORMING_ENTRY_STATE_INITIALIZEING,
49         BEAMFORMING_ENTRY_STATE_INITIALIZED,
50         BEAMFORMING_ENTRY_STATE_PROGRESSING,
51         BEAMFORMING_ENTRY_STATE_PROGRESSED
52 };
53
54
55 enum beamforming_notify_state {
56         BEAMFORMING_NOTIFY_NONE,
57         BEAMFORMING_NOTIFY_ADD,
58         BEAMFORMING_NOTIFY_DELETE,
59         BEAMFORMEE_NOTIFY_ADD_SU,
60         BEAMFORMEE_NOTIFY_DELETE_SU,
61         BEAMFORMEE_NOTIFY_ADD_MU,
62         BEAMFORMEE_NOTIFY_DELETE_MU,
63         BEAMFORMING_NOTIFY_RESET
64 };
65
66 enum beamforming_cap {
67         BEAMFORMING_CAP_NONE = 0x0,
68         BEAMFORMER_CAP_HT_EXPLICIT = BIT(1),
69         BEAMFORMEE_CAP_HT_EXPLICIT = BIT(2),
70         BEAMFORMER_CAP_VHT_SU = BIT(5),                 /* Self has er Cap, because Reg er  & peer ee */
71         BEAMFORMEE_CAP_VHT_SU = BIT(6),                 /* Self has ee Cap, because Reg ee & peer er */
72         BEAMFORMER_CAP_VHT_MU = BIT(7),                 /* Self has er Cap, because Reg er  & peer ee */
73         BEAMFORMEE_CAP_VHT_MU = BIT(8),                 /* Self has ee Cap, because Reg ee & peer er */
74         BEAMFORMER_CAP = BIT(9),
75         BEAMFORMEE_CAP = BIT(10),
76 };
77
78
79 enum sounding_mode {
80         SOUNDING_SW_VHT_TIMER = 0x0,
81         SOUNDING_SW_HT_TIMER = 0x1,
82         sounding_stop_all_timer = 0x2,
83         SOUNDING_HW_VHT_TIMER = 0x3,
84         SOUNDING_HW_HT_TIMER = 0x4,
85         SOUNDING_STOP_OID_TIMER = 0x5,
86         SOUNDING_AUTO_VHT_TIMER = 0x6,
87         SOUNDING_AUTO_HT_TIMER = 0x7,
88         SOUNDING_FW_VHT_TIMER = 0x8,
89         SOUNDING_FW_HT_TIMER = 0x9,
90 };
91
92 struct _RT_BEAMFORM_STAINFO {
93         u8                                              *ra;
94         u16                                             aid;
95         u16                                             mac_id;
96         u8                                              my_mac_addr[6];
97         WIRELESS_MODE                           wireless_mode;
98         CHANNEL_WIDTH                           bw;
99         enum beamforming_cap                    beamform_cap;
100         u8                                              ht_beamform_cap;
101         u16                                             vht_beamform_cap;
102         u8                                              cur_beamform;
103         u16                                             cur_beamform_vht;
104 };
105
106
107 struct _RT_BEAMFORMEE_ENTRY {
108         boolean is_used;
109         boolean is_txbf;
110         boolean is_sound;
111         u16     aid;                            /*Used to construct AID field of NDPA packet.*/
112         u16     mac_id;                         /*Used to Set Reg42C in IBSS mode. */
113         u16     p_aid;                          /*Used to fill Reg42C & Reg714 to compare with P_AID of Tx DESC. */
114         u16     g_id;                           /*Used to fill Tx DESC*/
115         u8      my_mac_addr[6];
116         u8      mac_addr[6];                    /*Used to fill Reg6E4 to fill Mac address of CSI report frame.*/
117         CHANNEL_WIDTH                   sound_bw;               /*Sounding band_width*/
118         u16                                     sound_period;
119         enum beamforming_cap                    beamform_entry_cap;
120         enum beamforming_entry_state    beamform_entry_state;
121         boolean                                         is_beamforming_in_progress;
122         /*u8    log_seq;                                                                        // Move to _RT_BEAMFORMER_ENTRY*/
123         /*u16   log_retry_cnt:3;                // 0~4                          // Move to _RT_BEAMFORMER_ENTRY*/
124         /*u16   LogSuccessCnt:2;                // 0~2                          // Move to _RT_BEAMFORMER_ENTRY*/
125         u16     log_status_fail_cnt:5;  /* 0~21 */
126         u16     default_csi_cnt:5;              /* 0~21 */
127         u8      csi_matrix[327];
128         u16     csi_matrix_len;
129         u8      num_of_sounding_dim;
130         u8      comp_steering_num_of_bfer;
131         u8      su_reg_index;
132         /*For MU-MIMO*/
133         boolean is_mu_sta;
134         u8      mu_reg_index;
135         u8      gid_valid[8];
136         u8      user_position[16];
137 };
138
139 struct _RT_BEAMFORMER_ENTRY {
140         boolean                 is_used;
141         /*P_AID of BFer entry is probably not used*/
142         u16                             p_aid;                                  /*Used to fill Reg42C & Reg714 to compare with P_AID of Tx DESC. */
143         u16                             g_id;
144         u8                              my_mac_addr[6];
145         u8                              mac_addr[6];
146         enum beamforming_cap            beamform_entry_cap;
147         u8                              num_of_sounding_dim;
148         u8                              clock_reset_times;              /*Modified by Jeffery @2015-04-10*/
149         u8                              pre_log_seq;                            /*Modified by Jeffery @2015-03-30*/
150         u8                              log_seq;                                        /*Modified by Jeffery @2014-10-29*/
151         u16                             log_retry_cnt:3;                        /*Modified by Jeffery @2014-10-29*/
152         u16                             log_success:2;                  /*Modified by Jeffery @2014-10-29*/
153         u8                              su_reg_index;
154         /*For MU-MIMO*/
155         boolean                         is_mu_ap;
156         u8                              gid_valid[8];
157         u8                              user_position[16];
158         u16                             aid;
159 };
160
161 struct _RT_SOUNDING_INFO {
162         u8                      sound_idx;
163         CHANNEL_WIDTH   sound_bw;
164         enum sounding_mode      sound_mode;
165         u16                     sound_period;
166 };
167
168
169
170 struct _RT_BEAMFORMING_OID_INFO {
171         u8                      sound_oid_idx;
172         CHANNEL_WIDTH   sound_oid_bw;
173         enum sounding_mode      sound_oid_mode;
174         u16                     sound_oid_period;
175 };
176
177
178 struct _RT_BEAMFORMING_INFO {
179         enum beamforming_cap                    beamform_cap;
180         struct _RT_BEAMFORMEE_ENTRY             beamformee_entry[BEAMFORMEE_ENTRY_NUM];
181         struct _RT_BEAMFORMER_ENTRY             beamformer_entry[BEAMFORMER_ENTRY_NUM];
182         struct _RT_BEAMFORM_STAINFO             beamform_sta_info;
183         u8                                      beamformee_cur_idx;
184         struct timer_list                                       beamforming_timer;
185         struct timer_list                                       mu_timer;
186         struct _RT_SOUNDING_INFO                        sounding_info;
187         struct _RT_BEAMFORMING_OID_INFO beamforming_oid_info;
188         struct _HAL_TXBF_INFO                   txbf_info;
189         u8                                      sounding_sequence;
190         u8                                      beamformee_su_cnt;
191         u8                                      beamformer_su_cnt;
192         u32                                     beamformee_su_reg_maping;
193         u32                                     beamformer_su_reg_maping;
194         /*For MU-MINO*/
195         u8                                      beamformee_mu_cnt;
196         u8                                      beamformer_mu_cnt;
197         u32                                     beamformee_mu_reg_maping;
198         u8                                      mu_ap_index;
199         boolean                                 is_mu_sounding;
200         u8                                      first_mu_bfee_index;
201         boolean                                 is_mu_sounding_in_progress;
202         boolean                                 dbg_disable_mu_tx;
203         boolean                                 apply_v_matrix;
204         boolean                                 snding3ss;
205 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
206         struct _ADAPTER                         *source_adapter;
207 #endif
208         /* Control register */
209         u32                                     reg_mu_tx_ctrl;         /* For USB/SDIO interfaces aync I/O */
210 };
211
212
213 struct _RT_NDPA_STA_INFO {
214         u16     aid:12;
215         u16     feedback_type:1;
216         u16     nc_index:3;
217 };
218
219 enum phydm_acting_type {
220         phydm_acting_as_ibss = 0,
221         phydm_acting_as_ap = 1
222 };
223
224
225 enum beamforming_cap
226 phydm_beamforming_get_entry_beam_cap_by_mac_id(
227         void    *p_dm_void,
228         u8      mac_id
229 );
230
231 struct _RT_BEAMFORMEE_ENTRY *
232 phydm_beamforming_get_bfee_entry_by_addr(
233         void            *p_dm_void,
234         u8              *RA,
235         u8              *idx
236 );
237
238 struct _RT_BEAMFORMER_ENTRY *
239 phydm_beamforming_get_bfer_entry_by_addr(
240         void    *p_dm_void,
241         u8      *TA,
242         u8      *idx
243 );
244
245 void
246 phydm_beamforming_notify(
247         void    *p_dm_void
248 );
249
250 boolean
251 phydm_acting_determine(
252         void            *p_dm_void,
253         enum phydm_acting_type  type
254 );
255
256 void
257 beamforming_enter(
258         void            *p_dm_void,
259         u16     sta_idx
260 );
261
262 void
263 beamforming_leave(
264         void            *p_dm_void,
265         u8                      *RA
266 );
267
268 boolean
269 beamforming_start_fw(
270         void                    *p_dm_void,
271         u8                      idx
272 );
273
274 void
275 beamforming_check_sounding_success(
276         void                    *p_dm_void,
277         boolean                 status
278 );
279
280 void
281 phydm_beamforming_end_sw(
282         void            *p_dm_void,
283         boolean                 status
284 );
285
286 void
287 beamforming_timer_callback(
288         void                    *p_dm_void
289 );
290
291 void
292 phydm_beamforming_init(
293         void            *p_dm_void
294 );
295
296
297
298 enum beamforming_cap
299 phydm_beamforming_get_beam_cap(
300         void                    *p_dm_void,
301         struct _RT_BEAMFORMING_INFO     *p_beam_info
302 );
303
304
305 boolean
306 beamforming_control_v1(
307         void                    *p_dm_void,
308         u8                      *RA,
309         u8                      AID,
310         u8                      mode,
311         CHANNEL_WIDTH   BW,
312         u8                      rate
313 );
314
315
316 boolean
317 phydm_beamforming_control_v2(
318         void            *p_dm_void,
319         u8                      idx,
320         u8                      mode,
321         CHANNEL_WIDTH   BW,
322         u16                     period
323 );
324
325 void
326 phydm_beamforming_watchdog(
327         void            *p_dm_void
328 );
329
330 void
331 beamforming_sw_timer_callback(
332 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
333         struct timer_list               *p_timer
334 #elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
335         void *function_context
336 #endif
337 );
338
339 boolean
340 beamforming_send_ht_ndpa_packet(
341         void                    *p_dm_void,
342         u8                      *RA,
343         CHANNEL_WIDTH   BW,
344         u8                      q_idx
345 );
346
347
348 boolean
349 beamforming_send_vht_ndpa_packet(
350         void                    *p_dm_void,
351         u8                      *RA,
352         u16                     AID,
353         CHANNEL_WIDTH   BW,
354         u8                      q_idx
355 );
356
357 #else
358 #define beamforming_gid_paid(adapter, p_tcb)
359 #define phydm_acting_determine(p_dm_odm, type)  false
360 #define beamforming_enter(p_dm_odm, sta_idx)
361 #define beamforming_leave(p_dm_odm, RA)
362 #define beamforming_end_fw(p_dm_odm)
363 #define beamforming_control_v1(p_dm_odm, RA, AID, mode, BW, rate)               true
364 #define beamforming_control_v2(p_dm_odm, idx, mode, BW, period)         true
365 #define phydm_beamforming_end_sw(p_dm_odm, _status)
366 #define beamforming_timer_callback(p_dm_odm)
367 #define phydm_beamforming_init(p_dm_odm)
368 #define phydm_beamforming_control_v2(p_dm_odm, _idx, _mode, _BW, _period)       false
369 #define beamforming_watchdog(p_dm_odm)
370 #define phydm_beamforming_watchdog(p_dm_odm)
371
372
373 #endif
374 #endif