phydm_beamforming.h 8.6 KB

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