rtw_beamforming.h 12 KB

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