halcomtxbf.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514
  1. /******************************************************************************
  2. *
  3. * Copyright(c) 2016 - 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. *****************************************************************************/
  15. /*@************************************************************
  16. * Description:
  17. *
  18. * This file is for TXBF mechanism
  19. *
  20. ************************************************************/
  21. #include "mp_precomp.h"
  22. #include "../phydm_precomp.h"
  23. #if (BEAMFORMING_SUPPORT == 1)
  24. /*@Beamforming halcomtxbf API create by YuChen 2015/05*/
  25. void hal_com_txbf_beamform_init(
  26. void *dm_void)
  27. {
  28. struct dm_struct *dm = (struct dm_struct *)dm_void;
  29. boolean is_iqgen_setting_ok = false;
  30. if (dm->support_ic_type & ODM_RTL8814A) {
  31. is_iqgen_setting_ok = phydm_beamforming_set_iqgen_8814A(dm);
  32. PHYDM_DBG(dm, DBG_TXBF, "[%s] is_iqgen_setting_ok = %d\n",
  33. __func__, is_iqgen_setting_ok);
  34. }
  35. }
  36. /*Only used for MU BFer Entry when get GID management frame (self as MU STA)*/
  37. void hal_com_txbf_config_gtab(
  38. void *dm_void)
  39. {
  40. struct dm_struct *dm = (struct dm_struct *)dm_void;
  41. if (dm->support_ic_type & ODM_RTL8822B)
  42. hal_txbf_8822b_config_gtab(dm);
  43. }
  44. void phydm_beamform_set_sounding_enter(
  45. void *dm_void)
  46. {
  47. struct dm_struct *dm = (struct dm_struct *)dm_void;
  48. #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
  49. struct _HAL_TXBF_INFO *p_txbf_info = &dm->beamforming_info.txbf_info;
  50. if (!odm_is_work_item_scheduled(&p_txbf_info->txbf_enter_work_item))
  51. odm_schedule_work_item(&p_txbf_info->txbf_enter_work_item);
  52. #else
  53. hal_com_txbf_enter_work_item_callback(dm);
  54. #endif
  55. }
  56. void phydm_beamform_set_sounding_leave(
  57. void *dm_void)
  58. {
  59. struct dm_struct *dm = (struct dm_struct *)dm_void;
  60. #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
  61. struct _HAL_TXBF_INFO *p_txbf_info = &dm->beamforming_info.txbf_info;
  62. if (!odm_is_work_item_scheduled(&p_txbf_info->txbf_leave_work_item))
  63. odm_schedule_work_item(&p_txbf_info->txbf_leave_work_item);
  64. #else
  65. hal_com_txbf_leave_work_item_callback(dm);
  66. #endif
  67. }
  68. void phydm_beamform_set_sounding_rate(
  69. void *dm_void)
  70. {
  71. struct dm_struct *dm = (struct dm_struct *)dm_void;
  72. #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
  73. struct _HAL_TXBF_INFO *p_txbf_info = &dm->beamforming_info.txbf_info;
  74. if (!odm_is_work_item_scheduled(&p_txbf_info->txbf_rate_work_item))
  75. odm_schedule_work_item(&p_txbf_info->txbf_rate_work_item);
  76. #else
  77. hal_com_txbf_rate_work_item_callback(dm);
  78. #endif
  79. }
  80. void phydm_beamform_set_sounding_status(
  81. void *dm_void)
  82. {
  83. struct dm_struct *dm = (struct dm_struct *)dm_void;
  84. #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
  85. struct _HAL_TXBF_INFO *p_txbf_info = &dm->beamforming_info.txbf_info;
  86. if (!odm_is_work_item_scheduled(&p_txbf_info->txbf_status_work_item))
  87. odm_schedule_work_item(&p_txbf_info->txbf_status_work_item);
  88. #else
  89. hal_com_txbf_status_work_item_callback(dm);
  90. #endif
  91. }
  92. void phydm_beamform_set_sounding_fw_ndpa(
  93. void *dm_void)
  94. {
  95. struct dm_struct *dm = (struct dm_struct *)dm_void;
  96. #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
  97. struct _HAL_TXBF_INFO *p_txbf_info = &dm->beamforming_info.txbf_info;
  98. if (*dm->is_fw_dw_rsvd_page_in_progress)
  99. odm_set_timer(dm, &p_txbf_info->txbf_fw_ndpa_timer, 5);
  100. else
  101. odm_schedule_work_item(&p_txbf_info->txbf_fw_ndpa_work_item);
  102. #else
  103. hal_com_txbf_fw_ndpa_work_item_callback(dm);
  104. #endif
  105. }
  106. void phydm_beamform_set_sounding_clk(
  107. void *dm_void)
  108. {
  109. struct dm_struct *dm = (struct dm_struct *)dm_void;
  110. #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
  111. struct _HAL_TXBF_INFO *p_txbf_info = &dm->beamforming_info.txbf_info;
  112. if (!odm_is_work_item_scheduled(&p_txbf_info->txbf_clk_work_item))
  113. odm_schedule_work_item(&p_txbf_info->txbf_clk_work_item);
  114. #elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
  115. phydm_run_in_thread_cmd(dm, hal_com_txbf_clk_work_item_callback, dm);
  116. #else
  117. hal_com_txbf_clk_work_item_callback(dm);
  118. #endif
  119. }
  120. void phydm_beamform_set_reset_tx_path(
  121. void *dm_void)
  122. {
  123. struct dm_struct *dm = (struct dm_struct *)dm_void;
  124. #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
  125. struct _HAL_TXBF_INFO *p_txbf_info = &dm->beamforming_info.txbf_info;
  126. struct _RT_WORK_ITEM *pwi = &p_txbf_info->txbf_reset_tx_path_work_item;
  127. if (!odm_is_work_item_scheduled(pwi))
  128. odm_schedule_work_item(pwi);
  129. #else
  130. hal_com_txbf_reset_tx_path_work_item_callback(dm);
  131. #endif
  132. }
  133. void phydm_beamform_set_get_tx_rate(
  134. void *dm_void)
  135. {
  136. struct dm_struct *dm = (struct dm_struct *)dm_void;
  137. #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
  138. struct _HAL_TXBF_INFO *p_txbf_info = &dm->beamforming_info.txbf_info;
  139. struct _RT_WORK_ITEM *pwi = &p_txbf_info->txbf_get_tx_rate_work_item;
  140. if (!odm_is_work_item_scheduled(pwi))
  141. odm_schedule_work_item(pwi);
  142. #else
  143. hal_com_txbf_get_tx_rate_work_item_callback(dm);
  144. #endif
  145. }
  146. void hal_com_txbf_enter_work_item_callback(
  147. #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
  148. void *adapter
  149. #else
  150. void *dm_void
  151. #endif
  152. )
  153. {
  154. #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
  155. PHAL_DATA_TYPE hal_data = GET_HAL_DATA(((PADAPTER)adapter));
  156. struct dm_struct *dm = &hal_data->DM_OutSrc;
  157. #else
  158. struct dm_struct *dm = (struct dm_struct *)dm_void;
  159. #endif
  160. struct _HAL_TXBF_INFO *p_txbf_info = &dm->beamforming_info.txbf_info;
  161. u8 idx = p_txbf_info->txbf_idx;
  162. PHYDM_DBG(dm, DBG_TXBF, "[%s] Start!\n", __func__);
  163. if (dm->support_ic_type & (ODM_RTL8812 | ODM_RTL8821))
  164. hal_txbf_jaguar_enter(dm, idx);
  165. else if (dm->support_ic_type & ODM_RTL8192E)
  166. hal_txbf_8192e_enter(dm, idx);
  167. else if (dm->support_ic_type & ODM_RTL8814A)
  168. hal_txbf_8814a_enter(dm, idx);
  169. else if (dm->support_ic_type & ODM_RTL8822B)
  170. hal_txbf_8822b_enter(dm, idx);
  171. }
  172. void hal_com_txbf_leave_work_item_callback(
  173. #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
  174. void *adapter
  175. #else
  176. void *dm_void
  177. #endif
  178. )
  179. {
  180. #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
  181. PHAL_DATA_TYPE hal_data = GET_HAL_DATA(((PADAPTER)adapter));
  182. struct dm_struct *dm = &hal_data->DM_OutSrc;
  183. #else
  184. struct dm_struct *dm = (struct dm_struct *)dm_void;
  185. #endif
  186. struct _HAL_TXBF_INFO *p_txbf_info = &dm->beamforming_info.txbf_info;
  187. u8 idx = p_txbf_info->txbf_idx;
  188. PHYDM_DBG(dm, DBG_TXBF, "[%s] Start!\n", __func__);
  189. if (dm->support_ic_type & (ODM_RTL8812 | ODM_RTL8821))
  190. hal_txbf_jaguar_leave(dm, idx);
  191. else if (dm->support_ic_type & ODM_RTL8192E)
  192. hal_txbf_8192e_leave(dm, idx);
  193. else if (dm->support_ic_type & ODM_RTL8814A)
  194. hal_txbf_8814a_leave(dm, idx);
  195. else if (dm->support_ic_type & ODM_RTL8822B)
  196. hal_txbf_8822b_leave(dm, idx);
  197. }
  198. void hal_com_txbf_fw_ndpa_work_item_callback(
  199. #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
  200. void *adapter
  201. #else
  202. void *dm_void
  203. #endif
  204. )
  205. {
  206. #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
  207. PHAL_DATA_TYPE hal_data = GET_HAL_DATA(((PADAPTER)adapter));
  208. struct dm_struct *dm = &hal_data->DM_OutSrc;
  209. #else
  210. struct dm_struct *dm = (struct dm_struct *)dm_void;
  211. #endif
  212. struct _HAL_TXBF_INFO *p_txbf_info = &dm->beamforming_info.txbf_info;
  213. u8 idx = p_txbf_info->ndpa_idx;
  214. PHYDM_DBG(dm, DBG_TXBF, "[%s] Start!\n", __func__);
  215. if (dm->support_ic_type & (ODM_RTL8812 | ODM_RTL8821))
  216. hal_txbf_jaguar_fw_txbf(dm, idx);
  217. else if (dm->support_ic_type & ODM_RTL8192E)
  218. hal_txbf_8192e_fw_tx_bf(dm, idx);
  219. else if (dm->support_ic_type & ODM_RTL8814A)
  220. hal_txbf_8814a_fw_txbf(dm, idx);
  221. else if (dm->support_ic_type & ODM_RTL8822B)
  222. hal_txbf_8822b_fw_txbf(dm, idx);
  223. }
  224. void hal_com_txbf_clk_work_item_callback(
  225. #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
  226. void *adapter
  227. #else
  228. void *dm_void
  229. #endif
  230. )
  231. {
  232. #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
  233. PHAL_DATA_TYPE hal_data = GET_HAL_DATA(((PADAPTER)adapter));
  234. struct dm_struct *dm = &hal_data->DM_OutSrc;
  235. #else
  236. struct dm_struct *dm = (struct dm_struct *)dm_void;
  237. #endif
  238. PHYDM_DBG(dm, DBG_TXBF, "[%s] Start!\n", __func__);
  239. if (dm->support_ic_type & ODM_RTL8812)
  240. hal_txbf_jaguar_clk_8812a(dm);
  241. }
  242. void hal_com_txbf_rate_work_item_callback(
  243. #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
  244. void *adapter
  245. #else
  246. void *dm_void
  247. #endif
  248. )
  249. {
  250. #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
  251. PHAL_DATA_TYPE hal_data = GET_HAL_DATA(((PADAPTER)adapter));
  252. struct dm_struct *dm = &hal_data->DM_OutSrc;
  253. #else
  254. struct dm_struct *dm = (struct dm_struct *)dm_void;
  255. #endif
  256. struct _HAL_TXBF_INFO *p_txbf_info = &dm->beamforming_info.txbf_info;
  257. u8 BW = p_txbf_info->BW;
  258. u8 rate = p_txbf_info->rate;
  259. PHYDM_DBG(dm, DBG_TXBF, "[%s] Start!\n", __func__);
  260. if (dm->support_ic_type & ODM_RTL8812)
  261. hal_txbf_8812a_set_ndpa_rate(dm, BW, rate);
  262. else if (dm->support_ic_type & ODM_RTL8192E)
  263. hal_txbf_8192e_set_ndpa_rate(dm, BW, rate);
  264. else if (dm->support_ic_type & ODM_RTL8814A)
  265. hal_txbf_8814a_set_ndpa_rate(dm, BW, rate);
  266. }
  267. #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
  268. void hal_com_txbf_fw_ndpa_timer_callback(
  269. struct phydm_timer_list *timer)
  270. {
  271. void *adapter = (void *)timer->Adapter;
  272. PHAL_DATA_TYPE hal_data = GET_HAL_DATA(((PADAPTER)adapter));
  273. struct dm_struct *dm = &hal_data->DM_OutSrc;
  274. struct _HAL_TXBF_INFO *p_txbf_info = &dm->beamforming_info.txbf_info;
  275. PHYDM_DBG(dm, DBG_TXBF, "[%s] Start!\n", __func__);
  276. if (*dm->is_fw_dw_rsvd_page_in_progress)
  277. odm_set_timer(dm, &(p_txbf_info->txbf_fw_ndpa_timer), 5);
  278. else
  279. odm_schedule_work_item(&(p_txbf_info->txbf_fw_ndpa_work_item));
  280. }
  281. #endif
  282. void hal_com_txbf_status_work_item_callback(
  283. #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
  284. void *adapter
  285. #else
  286. void *dm_void
  287. #endif
  288. )
  289. {
  290. #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
  291. PHAL_DATA_TYPE hal_data = GET_HAL_DATA(((PADAPTER)adapter));
  292. struct dm_struct *dm = &hal_data->DM_OutSrc;
  293. #else
  294. struct dm_struct *dm = (struct dm_struct *)dm_void;
  295. #endif
  296. struct _HAL_TXBF_INFO *p_txbf_info = &dm->beamforming_info.txbf_info;
  297. u8 idx = p_txbf_info->txbf_idx;
  298. PHYDM_DBG(dm, DBG_TXBF, "[%s] Start!\n", __func__);
  299. if (dm->support_ic_type & (ODM_RTL8812 | ODM_RTL8821))
  300. hal_txbf_jaguar_status(dm, idx);
  301. else if (dm->support_ic_type & ODM_RTL8192E)
  302. hal_txbf_8192e_status(dm, idx);
  303. else if (dm->support_ic_type & ODM_RTL8814A)
  304. hal_txbf_8814a_status(dm, idx);
  305. else if (dm->support_ic_type & ODM_RTL8822B)
  306. hal_txbf_8822b_status(dm, idx);
  307. }
  308. void hal_com_txbf_reset_tx_path_work_item_callback(
  309. #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
  310. void *adapter
  311. #else
  312. void *dm_void
  313. #endif
  314. )
  315. {
  316. #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
  317. PHAL_DATA_TYPE hal_data = GET_HAL_DATA(((PADAPTER)adapter));
  318. struct dm_struct *dm = &hal_data->DM_OutSrc;
  319. #else
  320. struct dm_struct *dm = (struct dm_struct *)dm_void;
  321. #endif
  322. struct _HAL_TXBF_INFO *p_txbf_info = &dm->beamforming_info.txbf_info;
  323. u8 idx = p_txbf_info->txbf_idx;
  324. if (dm->support_ic_type & ODM_RTL8814A)
  325. hal_txbf_8814a_reset_tx_path(dm, idx);
  326. }
  327. void hal_com_txbf_get_tx_rate_work_item_callback(
  328. #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
  329. void *adapter
  330. #else
  331. void *dm_void
  332. #endif
  333. )
  334. {
  335. #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
  336. PHAL_DATA_TYPE hal_data = GET_HAL_DATA(((PADAPTER)adapter));
  337. struct dm_struct *dm = &hal_data->DM_OutSrc;
  338. #else
  339. struct dm_struct *dm = (struct dm_struct *)dm_void;
  340. #endif
  341. if (dm->support_ic_type & ODM_RTL8814A)
  342. hal_txbf_8814a_get_tx_rate(dm);
  343. }
  344. boolean
  345. hal_com_txbf_set(
  346. void *dm_void,
  347. u8 set_type,
  348. void *p_in_buf)
  349. {
  350. struct dm_struct *dm = (struct dm_struct *)dm_void;
  351. u8 *p_u1_tmp = (u8 *)p_in_buf;
  352. struct _HAL_TXBF_INFO *p_txbf_info = &dm->beamforming_info.txbf_info;
  353. PHYDM_DBG(dm, DBG_TXBF, "[%s] set_type = 0x%X\n", __func__, set_type);
  354. switch (set_type) {
  355. case TXBF_SET_SOUNDING_ENTER:
  356. p_txbf_info->txbf_idx = *p_u1_tmp;
  357. phydm_beamform_set_sounding_enter(dm);
  358. break;
  359. case TXBF_SET_SOUNDING_LEAVE:
  360. p_txbf_info->txbf_idx = *p_u1_tmp;
  361. phydm_beamform_set_sounding_leave(dm);
  362. break;
  363. case TXBF_SET_SOUNDING_RATE:
  364. p_txbf_info->BW = p_u1_tmp[0];
  365. p_txbf_info->rate = p_u1_tmp[1];
  366. phydm_beamform_set_sounding_rate(dm);
  367. break;
  368. case TXBF_SET_SOUNDING_STATUS:
  369. p_txbf_info->txbf_idx = *p_u1_tmp;
  370. phydm_beamform_set_sounding_status(dm);
  371. break;
  372. case TXBF_SET_SOUNDING_FW_NDPA:
  373. p_txbf_info->ndpa_idx = *p_u1_tmp;
  374. phydm_beamform_set_sounding_fw_ndpa(dm);
  375. break;
  376. case TXBF_SET_SOUNDING_CLK:
  377. phydm_beamform_set_sounding_clk(dm);
  378. break;
  379. case TXBF_SET_TX_PATH_RESET:
  380. p_txbf_info->txbf_idx = *p_u1_tmp;
  381. phydm_beamform_set_reset_tx_path(dm);
  382. break;
  383. case TXBF_SET_GET_TX_RATE:
  384. phydm_beamform_set_get_tx_rate(dm);
  385. break;
  386. }
  387. return true;
  388. }
  389. #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
  390. boolean
  391. hal_com_txbf_get(
  392. void *adapter,
  393. u8 get_type,
  394. void *p_out_buf)
  395. {
  396. PHAL_DATA_TYPE hal_data = GET_HAL_DATA(((PADAPTER)adapter));
  397. struct dm_struct *dm = &hal_data->DM_OutSrc;
  398. boolean *p_boolean = (boolean *)p_out_buf;
  399. PHYDM_DBG(dm, DBG_TXBF, "[%s] Start!\n", __func__);
  400. if (get_type == TXBF_GET_EXPLICIT_BEAMFORMEE) {
  401. if (IS_HARDWARE_TYPE_OLDER_THAN_8812A(adapter))
  402. *p_boolean = false;
  403. else if (/*@IS_HARDWARE_TYPE_8822B(adapter) ||*/
  404. IS_HARDWARE_TYPE_8821B(adapter) ||
  405. IS_HARDWARE_TYPE_8192E(adapter) ||
  406. IS_HARDWARE_TYPE_8192F(adapter) ||
  407. IS_HARDWARE_TYPE_JAGUAR(adapter) ||
  408. IS_HARDWARE_TYPE_JAGUAR_AND_JAGUAR2(adapter))
  409. *p_boolean = true;
  410. else
  411. *p_boolean = false;
  412. } else if (get_type == TXBF_GET_EXPLICIT_BEAMFORMER) {
  413. if (IS_HARDWARE_TYPE_OLDER_THAN_8812A(adapter))
  414. *p_boolean = false;
  415. else if (/*@IS_HARDWARE_TYPE_8822B(adapter) ||*/
  416. IS_HARDWARE_TYPE_8821B(adapter) ||
  417. IS_HARDWARE_TYPE_8192E(adapter) ||
  418. IS_HARDWARE_TYPE_8192F(adapter) ||
  419. IS_HARDWARE_TYPE_JAGUAR(adapter) ||
  420. IS_HARDWARE_TYPE_JAGUAR_AND_JAGUAR2(adapter)) {
  421. if (hal_data->RF_Type == RF_2T2R ||
  422. hal_data->RF_Type == RF_3T3R)
  423. *p_boolean = true;
  424. else
  425. *p_boolean = false;
  426. } else
  427. *p_boolean = false;
  428. } else if (get_type == TXBF_GET_MU_MIMO_STA) {
  429. #if ((RTL8822B_SUPPORT == 1) || (RTL8821C_SUPPORT == 1))
  430. if (IS_HARDWARE_TYPE_8822B(adapter) ||
  431. IS_HARDWARE_TYPE_8821C(adapter))
  432. *p_boolean = true;
  433. else
  434. #endif
  435. *p_boolean = false;
  436. } else if (get_type == TXBF_GET_MU_MIMO_AP) {
  437. #if (RTL8822B_SUPPORT == 1)
  438. if (IS_HARDWARE_TYPE_8822B(adapter))
  439. *p_boolean = true;
  440. else
  441. #endif
  442. *p_boolean = false;
  443. }
  444. return true;
  445. }
  446. #endif
  447. #endif