1 /* SPDX-License-Identifier: GPL-2.0 */
2 /******************************************************************************
3  *
4  * Copyright(c) 2007 - 2016  Realtek Corporation.
5  *
6  * Contact Information:
7  * wlanfae <wlanfae@realtek.com>
8  * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
9  * Hsinchu 300, Taiwan.
10  *
11  * Larry Finger <Larry.Finger@lwfinger.net>
12  *
13  *****************************************************************************/
14 
15 #ifndef __HALHWOUTSRC_H__
16 #define __HALHWOUTSRC_H__
17 
18 /*--------------------------Define -------------------------------------------*/
19 #define CCK_RSSI_INIT_COUNT 5
20 
21 #define RA_RSSI_STATE_INIT 0
22 #define RA_RSSI_STATE_SEND 1
23 #define RA_RSSI_STATE_HOLD 2
24 
25 #define CFO_HW_RPT_2_MHZ(val) ((val << 1) + (val >> 1))
26 /* ((X* 3125)  / 10)>>7 = (X*10)>>2 = X*2.5 = X<<1 + X>>1  */
27 
28 #define AGC_DIFF_CONFIG_MP(ic, band)                                           \
29 	(odm_read_and_config_mp_##ic##_agc_tab_diff(                           \
30 		dm, array_mp_##ic##_agc_tab_diff_##band,                       \
31 		sizeof(array_mp_##ic##_agc_tab_diff_##band) / sizeof(u32)))
32 #define AGC_DIFF_CONFIG_TC(ic, band)                                           \
33 	(odm_read_and_config_tc_##ic##_agc_tab_diff(                           \
34 		dm, array_tc_##ic##_agc_tab_diff_##band,                       \
35 		sizeof(array_tc_##ic##_agc_tab_diff_##band) / sizeof(u32)))
36 
37 #define AGC_DIFF_CONFIG(ic, band)                                              \
38 	do {                                                                   \
39 		if (dm->is_mp_chip)                                            \
40 			AGC_DIFF_CONFIG_MP(ic, band);                          \
41 		else                                                           \
42 			AGC_DIFF_CONFIG_TC(ic, band);                          \
43 	} while (0)
44 
45 /* ************************************************************
46  * structure and define
47  * *************************************************************/
48 
49 struct phy_rx_agc_info {
50 #if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
51 	u8 gain : 7, trsw : 1;
52 #else
53 	u8 trsw : 1, gain : 7;
54 #endif
55 };
56 
57 struct phy_status_rpt_8192cd {
58 	struct phy_rx_agc_info path_agc[2];
59 	u8 ch_corr[2];
60 	u8 cck_sig_qual_ofdm_pwdb_all;
61 	u8 cck_agc_rpt_ofdm_cfosho_a;
62 	u8 cck_rpt_b_ofdm_cfosho_b;
63 	u8 rsvd_1; /*ch_corr_msb;*/
64 	u8 noise_power_db_msb;
65 	s8 path_cfotail[2];
66 	u8 pcts_mask[2];
67 	s8 stream_rxevm[2];
68 	u8 path_rxsnr[2];
69 	u8 noise_power_db_lsb;
70 	u8 rsvd_2[3];
71 	u8 stream_csi[2];
72 	u8 stream_target_csi[2];
73 	s8 sig_evm;
74 	u8 rsvd_3;
75 
76 #if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
77 	u8 antsel_rx_keep_2 : 1; /*ex_intf_flg:1;*/
78 	u8 sgi_en : 1;
79 	u8 rxsc : 2;
80 	u8 idle_long : 1;
81 	u8 r_ant_train_en : 1;
82 	u8 ant_sel_b : 1;
83 	u8 ant_sel : 1;
84 #else /*_BIG_ENDIAN_	*/
85 	u8 ant_sel : 1;
86 	u8 ant_sel_b : 1;
87 	u8 r_ant_train_en : 1;
88 	u8 idle_long : 1;
89 	u8 rxsc : 2;
90 	u8 sgi_en : 1;
91 	u8 antsel_rx_keep_2 : 1; /*ex_intf_flg:1;*/
92 #endif
93 };
94 
95 struct phy_status_rpt_8812 {
96 	/*	DWORD 0*/
97 	u8 gain_trsw[2]; /*path-A and path-B {TRSW, gain[6:0] }*/
98 	u8 chl_num_LSB; /*channel number[7:0]*/
99 #if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
100 	u8 chl_num_MSB : 2; /*channel number[9:8]*/
101 	u8 sub_chnl : 4; /*sub-channel location[3:0]*/
102 	u8 r_RFMOD : 2; /*RF mode[1:0]*/
103 #else /*_BIG_ENDIAN_	*/
104 	u8 r_RFMOD : 2;
105 	u8 sub_chnl : 4;
106 	u8 chl_num_MSB : 2;
107 #endif
108 
109 	/*	DWORD 1*/
110 	u8 pwdb_all; /*CCK signal quality / OFDM pwdb all*/
111 	s8 cfosho[2]; /*DW1 byte 1 DW1 byte2 */
112 /*CCK AGC report and CCK_BB_Power / OFDM path-A and path-B short CFO*/
113 #if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
114 	/*this should be checked again
115 	 *because the definition of 8812 and 8814 is different
116 	 */
117 	u8 resvd_0 : 6;
118 	u8 bt_RF_ch_MSB : 2; /*8812A:2'b0, 8814A: bt rf channel keep[7:6]*/
119 #else /*_BIG_ENDIAN_*/
120 	u8 bt_RF_ch_MSB : 2;
121 	u8 resvd_0 : 6;
122 #endif
123 
124 /*	DWORD 2*/
125 #if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
126 	u8 ant_div_sw_a : 1; /*8812A: ant_div_sw_a, 8814A: 1'b0*/
127 	u8 ant_div_sw_b : 1; /*8812A: ant_div_sw_b, 8814A: 1'b0*/
128 	u8 bt_RF_ch_LSB : 6; /*8812A: 6'b0, 8814A: bt rf channel keep[5:0]*/
129 #else /*_BIG_ENDIAN_	*/
130 	u8 bt_RF_ch_LSB : 6;
131 	u8 ant_div_sw_b : 1;
132 	u8 ant_div_sw_a : 1;
133 #endif
134 	s8 cfotail[2]; /*DW2 byte 1 DW2 byte 2	path-A and path-B CFO tail*/
135 	u8 PCTS_MSK_RPT_0; /*PCTS mask report[7:0]*/
136 	u8 PCTS_MSK_RPT_1; /*PCTS mask report[15:8]*/
137 
138 	/*	DWORD 3*/
139 	s8 rxevm[2]; /*DW3 byte 1 DW3 byte 2	stream 1 and stream 2 RX EVM*/
140 	s8 rxsnr[2]; /*DW3 byte 3 DW4 byte 0	path-A and path-B RX SNR*/
141 
142 	/*	DWORD 4*/
143 	u8 PCTS_MSK_RPT_2; /*PCTS mask report[23:16]*/
144 #if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
145 	u8 PCTS_MSK_RPT_3 : 6; /*PCTS mask report[29:24]*/
146 	u8 pcts_rpt_valid : 1; /*pcts_rpt_valid*/
147 	u8 resvd_1 : 1; /*1'b0*/
148 #else /*_BIG_ENDIAN_*/
149 	u8 resvd_1 : 1;
150 	u8 pcts_rpt_valid : 1;
151 	u8 PCTS_MSK_RPT_3 : 6;
152 #endif
153 	s8 rxevm_cd[2]; /*DW 4 byte 3 DW5 byte 0 */
154 	/* 8812A: 16'b0, 8814A: stream 3 and stream 4 RX EVM*/
155 
156 	/*	DWORD 5*/
157 	u8 csi_current[2]; /*DW5 byte 1 DW5 byte 2 */
158 	/* 8812A: stream 1 and 2 CSI, 8814A: path-C and path-D RX SNR*/
159 	u8 gain_trsw_cd[2]; /*DW5 byte 3 DW6 byte 0 */
160 	/* path-C and path-D {TRSW, gain[6:0] }*/
161 
162 	/*	DWORD 6*/
163 	s8 sigevm; /*signal field EVM*/
164 #if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
165 	u8 antidx_antc : 3; /*8812A: 3'b0	8814A: antidx_antc[2:0]*/
166 	u8 antidx_antd : 3; /*8812A: 3'b0	8814A: antidx_antd[2:0]*/
167 	u8 dpdt_ctrl_keep : 1; /*8812A: 1'b0	8814A: dpdt_ctrl_keep*/
168 	u8 GNT_BT_keep : 1; /*8812A: 1'b0	8814A: GNT_BT_keep*/
169 #else /*_BIG_ENDIAN_*/
170 	u8 GNT_BT_keep : 1;
171 	u8 dpdt_ctrl_keep : 1;
172 	u8 antidx_antd : 3;
173 	u8 antidx_antc : 3;
174 #endif
175 #if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
176 	u8 antidx_anta : 3; /*antidx_anta[2:0]*/
177 	u8 antidx_antb : 3; /*antidx_antb[2:0]*/
178 	u8 hw_antsw_occur : 2; /*1'b0*/
179 #else /*_BIG_ENDIAN_*/
180 	u8 hw_antsw_occur : 2;
181 	u8 antidx_antb : 3;
182 	u8 antidx_anta : 3;
183 #endif
184 };
185 
186 void phydm_reset_rssi_for_dm(struct phy_dm_struct *dm, u8 station_id);
187 
188 void odm_init_rssi_for_dm(struct phy_dm_struct *dm);
189 
190 void odm_phy_status_query(struct phy_dm_struct *dm,
191 			  struct dm_phy_status_info *phy_info, u8 *phy_status,
192 			  struct dm_per_pkt_info *pktinfo);
193 
194 void odm_mac_status_query(struct phy_dm_struct *dm, u8 *mac_status, u8 mac_id,
195 			  bool is_packet_match_bssid, bool is_packet_to_self,
196 			  bool is_packet_beacon);
197 
198 enum hal_status
199 odm_config_rf_with_tx_pwr_track_header_file(struct phy_dm_struct *dm);
200 
201 enum hal_status
202 odm_config_rf_with_header_file(struct phy_dm_struct *dm,
203 			       enum odm_rf_config_type config_type,
204 			       enum odm_rf_radio_path e_rf_path);
205 
206 enum hal_status
207 odm_config_bb_with_header_file(struct phy_dm_struct *dm,
208 			       enum odm_bb_config_type config_type);
209 
210 enum hal_status odm_config_mac_with_header_file(struct phy_dm_struct *dm);
211 
212 enum hal_status
213 odm_config_fw_with_header_file(struct phy_dm_struct *dm,
214 			       enum odm_fw_config_type config_type,
215 			       u8 *p_firmware, u32 *size);
216 
217 u32 odm_get_hw_img_version(struct phy_dm_struct *dm);
218 
219 s32 odm_signal_scale_mapping(struct phy_dm_struct *dm, s32 curr_sig);
220 
221 /*For 8822B only!! need to move to FW finally */
222 /*==============================================*/
223 void phydm_rx_phy_status_new_type(struct phy_dm_struct *phydm, u8 *phy_status,
224 				  struct dm_per_pkt_info *pktinfo,
225 				  struct dm_phy_status_info *phy_info);
226 
227 bool phydm_query_is_mu_api(struct phy_dm_struct *phydm, u8 ppdu_idx,
228 			   u8 *p_data_rate, u8 *p_gid);
229 
230 struct phy_status_rpt_jaguar2_type0 {
231 	/* DW0 */
232 	u8 page_num;
233 	u8 pwdb;
234 #if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
235 	u8 gain : 6;
236 	u8 rsvd_0 : 1;
237 	u8 trsw : 1;
238 #else
239 	u8 trsw : 1;
240 	u8 rsvd_0 : 1;
241 	u8 gain : 6;
242 #endif
243 	u8 rsvd_1;
244 
245 	/* DW1 */
246 	u8 rsvd_2;
247 #if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
248 	u8 rxsc : 4;
249 	u8 agc_table : 4;
250 #else
251 	u8 agc_table : 4;
252 	u8 rxsc : 4;
253 #endif
254 	u8 channel;
255 	u8 band;
256 
257 	/* DW2 */
258 	u16 length;
259 #if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
260 	u8 antidx_a : 3;
261 	u8 antidx_b : 3;
262 	u8 rsvd_3 : 2;
263 	u8 antidx_c : 3;
264 	u8 antidx_d : 3;
265 	u8 rsvd_4 : 2;
266 #else
267 	u8 rsvd_3 : 2;
268 	u8 antidx_b : 3;
269 	u8 antidx_a : 3;
270 	u8 rsvd_4 : 2;
271 	u8 antidx_d : 3;
272 	u8 antidx_c : 3;
273 #endif
274 
275 	/* DW3 */
276 	u8 signal_quality;
277 #if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
278 	u8 vga : 5;
279 	u8 lna_l : 3;
280 	u8 bb_power : 6;
281 	u8 rsvd_9 : 1;
282 	u8 lna_h : 1;
283 #else
284 	u8 lna_l : 3;
285 	u8 vga : 5;
286 	u8 lna_h : 1;
287 	u8 rsvd_9 : 1;
288 	u8 bb_power : 6;
289 #endif
290 	u8 rsvd_5;
291 
292 	/* DW4 */
293 	u32 rsvd_6;
294 
295 	/* DW5 */
296 	u32 rsvd_7;
297 
298 	/* DW6 */
299 	u32 rsvd_8;
300 };
301 
302 struct phy_status_rpt_jaguar2_type1 {
303 	/* DW0 and DW1 */
304 	u8 page_num;
305 	u8 pwdb[4];
306 #if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
307 	u8 l_rxsc : 4;
308 	u8 ht_rxsc : 4;
309 #else
310 	u8 ht_rxsc : 4;
311 	u8 l_rxsc : 4;
312 #endif
313 	u8 channel;
314 #if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
315 	u8 band : 2;
316 	u8 rsvd_0 : 1;
317 	u8 hw_antsw_occu : 1;
318 	u8 gnt_bt : 1;
319 	u8 ldpc : 1;
320 	u8 stbc : 1;
321 	u8 beamformed : 1;
322 #else
323 	u8 beamformed : 1;
324 	u8 stbc : 1;
325 	u8 ldpc : 1;
326 	u8 gnt_bt : 1;
327 	u8 hw_antsw_occu : 1;
328 	u8 rsvd_0 : 1;
329 	u8 band : 2;
330 #endif
331 
332 	/* DW2 */
333 	u16 lsig_length;
334 #if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
335 	u8 antidx_a : 3;
336 	u8 antidx_b : 3;
337 	u8 rsvd_1 : 2;
338 	u8 antidx_c : 3;
339 	u8 antidx_d : 3;
340 	u8 rsvd_2 : 2;
341 #else
342 	u8 rsvd_1 : 2;
343 	u8 antidx_b : 3;
344 	u8 antidx_a : 3;
345 	u8 rsvd_2 : 2;
346 	u8 antidx_d : 3;
347 	u8 antidx_c : 3;
348 #endif
349 
350 	/* DW3 */
351 	u8 paid;
352 #if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
353 	u8 paid_msb : 1;
354 	u8 gid : 6;
355 	u8 rsvd_3 : 1;
356 #else
357 	u8 rsvd_3 : 1;
358 	u8 gid : 6;
359 	u8 paid_msb : 1;
360 #endif
361 	u8 intf_pos;
362 #if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
363 	u8 intf_pos_msb : 1;
364 	u8 rsvd_4 : 2;
365 	u8 nb_intf_flag : 1;
366 	u8 rf_mode : 2;
367 	u8 rsvd_5 : 2;
368 #else
369 	u8 rsvd_5 : 2;
370 	u8 rf_mode : 2;
371 	u8 nb_intf_flag : 1;
372 	u8 rsvd_4 : 2;
373 	u8 intf_pos_msb : 1;
374 #endif
375 
376 	/* DW4 */
377 	s8 rxevm[4]; /* s(8,1) */
378 
379 	/* DW5 */
380 	s8 cfo_tail[4]; /* s(8,7) */
381 
382 	/* DW6 */
383 	s8 rxsnr[4]; /* s(8,1) */
384 };
385 
386 struct phy_status_rpt_jaguar2_type2 {
387 	/* DW0 ane DW1 */
388 	u8 page_num;
389 	u8 pwdb[4];
390 #if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
391 	u8 l_rxsc : 4;
392 	u8 ht_rxsc : 4;
393 #else
394 	u8 ht_rxsc : 4;
395 	u8 l_rxsc : 4;
396 #endif
397 	u8 channel;
398 #if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
399 	u8 band : 2;
400 	u8 rsvd_0 : 1;
401 	u8 hw_antsw_occu : 1;
402 	u8 gnt_bt : 1;
403 	u8 ldpc : 1;
404 	u8 stbc : 1;
405 	u8 beamformed : 1;
406 #else
407 	u8 beamformed : 1;
408 	u8 stbc : 1;
409 	u8 ldpc : 1;
410 	u8 gnt_bt : 1;
411 	u8 hw_antsw_occu : 1;
412 	u8 rsvd_0 : 1;
413 	u8 band : 2;
414 #endif
415 
416 /* DW2 */
417 #if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
418 	u8 shift_l_map : 6;
419 	u8 rsvd_1 : 2;
420 #else
421 	u8 rsvd_1 : 2;
422 	u8 shift_l_map : 6;
423 #endif
424 	u8 cnt_pw2cca;
425 #if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
426 	u8 agc_table_a : 4;
427 	u8 agc_table_b : 4;
428 	u8 agc_table_c : 4;
429 	u8 agc_table_d : 4;
430 #else
431 	u8 agc_table_b : 4;
432 	u8 agc_table_a : 4;
433 	u8 agc_table_d : 4;
434 	u8 agc_table_c : 4;
435 #endif
436 
437 	/* DW3 ~ DW6*/
438 	u8 cnt_cca2agc_rdy;
439 #if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
440 	u8 gain_a : 6;
441 	u8 rsvd_2 : 1;
442 	u8 trsw_a : 1;
443 	u8 gain_b : 6;
444 	u8 rsvd_3 : 1;
445 	u8 trsw_b : 1;
446 	u8 gain_c : 6;
447 	u8 rsvd_4 : 1;
448 	u8 trsw_c : 1;
449 	u8 gain_d : 6;
450 	u8 rsvd_5 : 1;
451 	u8 trsw_d : 1;
452 	u8 aagc_step_a : 2;
453 	u8 aagc_step_b : 2;
454 	u8 aagc_step_c : 2;
455 	u8 aagc_step_d : 2;
456 #else
457 	u8 trsw_a : 1;
458 	u8 rsvd_2 : 1;
459 	u8 gain_a : 6;
460 	u8 trsw_b : 1;
461 	u8 rsvd_3 : 1;
462 	u8 gain_b : 6;
463 	u8 trsw_c : 1;
464 	u8 rsvd_4 : 1;
465 	u8 gain_c : 6;
466 	u8 trsw_d : 1;
467 	u8 rsvd_5 : 1;
468 	u8 gain_d : 6;
469 	u8 aagc_step_d : 2;
470 	u8 aagc_step_c : 2;
471 	u8 aagc_step_b : 2;
472 	u8 aagc_step_a : 2;
473 #endif
474 	u8 ht_aagc_gain[4];
475 	u8 dagc_gain[4];
476 #if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
477 	u8 counter : 6;
478 	u8 rsvd_6 : 2;
479 	u8 syn_count : 5;
480 	u8 rsvd_7 : 3;
481 #else
482 	u8 rsvd_6 : 2;
483 	u8 counter : 6;
484 	u8 rsvd_7 : 3;
485 	u8 syn_count : 5;
486 #endif
487 };
488 
489 u32 query_phydm_trx_capability(struct phy_dm_struct *dm);
490 
491 u32 query_phydm_stbc_capability(struct phy_dm_struct *dm);
492 
493 u32 query_phydm_ldpc_capability(struct phy_dm_struct *dm);
494 
495 u32 query_phydm_txbf_parameters(struct phy_dm_struct *dm);
496 
497 u32 query_phydm_txbf_capability(struct phy_dm_struct *dm);
498 
499 #endif /*#ifndef	__HALHWOUTSRC_H__*/
500