phydm_beamforming.h 9.5 KB

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