rtw_odm.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446
  1. /******************************************************************************
  2. *
  3. * Copyright(c) 2013 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. #include <rtw_odm.h>
  21. #include <hal_data.h>
  22. /* set ODM_CMNINFO_IC_TYPE based on chip_type */
  23. void rtw_odm_init_ic_type(_adapter *adapter)
  24. {
  25. HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
  26. struct PHY_DM_STRUCT *odm = &hal_data->odmpriv;
  27. u4Byte ic_type = chip_type_to_odm_ic_type(rtw_get_chip_type(adapter));
  28. rtw_warn_on(!ic_type);
  29. odm_cmn_info_init(odm, ODM_CMNINFO_IC_TYPE, ic_type);
  30. }
  31. inline void rtw_odm_set_force_igi_lb(_adapter *adapter, u8 lb)
  32. {
  33. HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
  34. hal_data->u1ForcedIgiLb = lb;
  35. }
  36. inline u8 rtw_odm_get_force_igi_lb(_adapter *adapter)
  37. {
  38. HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
  39. return hal_data->u1ForcedIgiLb;
  40. }
  41. void rtw_odm_adaptivity_ver_msg(void *sel, _adapter *adapter)
  42. {
  43. RTW_PRINT_SEL(sel, "ADAPTIVITY_VERSION "ADAPTIVITY_VERSION"\n");
  44. }
  45. #define RTW_ADAPTIVITY_EN_DISABLE 0
  46. #define RTW_ADAPTIVITY_EN_ENABLE 1
  47. void rtw_odm_adaptivity_en_msg(void *sel, _adapter *adapter)
  48. {
  49. struct registry_priv *regsty = &adapter->registrypriv;
  50. struct mlme_priv *mlme = &adapter->mlmepriv;
  51. HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
  52. struct PHY_DM_STRUCT *odm = &hal_data->odmpriv;
  53. RTW_PRINT_SEL(sel, "RTW_ADAPTIVITY_EN_");
  54. if (regsty->adaptivity_en == RTW_ADAPTIVITY_EN_DISABLE)
  55. _RTW_PRINT_SEL(sel, "DISABLE\n");
  56. else if (regsty->adaptivity_en == RTW_ADAPTIVITY_EN_ENABLE)
  57. _RTW_PRINT_SEL(sel, "ENABLE\n");
  58. else
  59. _RTW_PRINT_SEL(sel, "INVALID\n");
  60. }
  61. #define RTW_ADAPTIVITY_MODE_NORMAL 0
  62. #define RTW_ADAPTIVITY_MODE_CARRIER_SENSE 1
  63. void rtw_odm_adaptivity_mode_msg(void *sel, _adapter *adapter)
  64. {
  65. struct registry_priv *regsty = &adapter->registrypriv;
  66. RTW_PRINT_SEL(sel, "RTW_ADAPTIVITY_MODE_");
  67. if (regsty->adaptivity_mode == RTW_ADAPTIVITY_MODE_NORMAL)
  68. _RTW_PRINT_SEL(sel, "NORMAL\n");
  69. else if (regsty->adaptivity_mode == RTW_ADAPTIVITY_MODE_CARRIER_SENSE)
  70. _RTW_PRINT_SEL(sel, "CARRIER_SENSE\n");
  71. else
  72. _RTW_PRINT_SEL(sel, "INVALID\n");
  73. }
  74. #define RTW_ADAPTIVITY_DML_DISABLE 0
  75. #define RTW_ADAPTIVITY_DML_ENABLE 1
  76. void rtw_odm_adaptivity_dml_msg(void *sel, _adapter *adapter)
  77. {
  78. struct registry_priv *regsty = &adapter->registrypriv;
  79. RTW_PRINT_SEL(sel, "RTW_ADAPTIVITY_DML_");
  80. if (regsty->adaptivity_dml == RTW_ADAPTIVITY_DML_DISABLE)
  81. _RTW_PRINT_SEL(sel, "DISABLE\n");
  82. else if (regsty->adaptivity_dml == RTW_ADAPTIVITY_DML_ENABLE)
  83. _RTW_PRINT_SEL(sel, "ENABLE\n");
  84. else
  85. _RTW_PRINT_SEL(sel, "INVALID\n");
  86. }
  87. void rtw_odm_adaptivity_dc_backoff_msg(void *sel, _adapter *adapter)
  88. {
  89. struct registry_priv *regsty = &adapter->registrypriv;
  90. RTW_PRINT_SEL(sel, "RTW_ADAPTIVITY_DC_BACKOFF:%u\n", regsty->adaptivity_dc_backoff);
  91. }
  92. void rtw_odm_adaptivity_config_msg(void *sel, _adapter *adapter)
  93. {
  94. rtw_odm_adaptivity_ver_msg(sel, adapter);
  95. rtw_odm_adaptivity_en_msg(sel, adapter);
  96. rtw_odm_adaptivity_mode_msg(sel, adapter);
  97. rtw_odm_adaptivity_dml_msg(sel, adapter);
  98. rtw_odm_adaptivity_dc_backoff_msg(sel, adapter);
  99. }
  100. bool rtw_odm_adaptivity_needed(_adapter *adapter)
  101. {
  102. struct registry_priv *regsty = &adapter->registrypriv;
  103. struct mlme_priv *mlme = &adapter->mlmepriv;
  104. bool ret = _FALSE;
  105. if (regsty->adaptivity_en == RTW_ADAPTIVITY_EN_ENABLE)
  106. ret = _TRUE;
  107. return ret;
  108. }
  109. void rtw_odm_adaptivity_parm_msg(void *sel, _adapter *adapter)
  110. {
  111. HAL_DATA_TYPE *pHalData = GET_HAL_DATA(adapter);
  112. struct PHY_DM_STRUCT *odm = &pHalData->odmpriv;
  113. rtw_odm_adaptivity_config_msg(sel, adapter);
  114. RTW_PRINT_SEL(sel, "%10s %16s %16s %22s %12s\n"
  115. , "th_l2h_ini", "th_edcca_hl_diff", "th_l2h_ini_mode2", "th_edcca_hl_diff_mode2", "edcca_enable");
  116. RTW_PRINT_SEL(sel, "0x%-8x %-16d 0x%-14x %-22d %-12d\n"
  117. , (u8)odm->th_l2h_ini
  118. , odm->th_edcca_hl_diff
  119. , (u8)odm->th_l2h_ini_mode2
  120. , odm->th_edcca_hl_diff_mode2
  121. , odm->edcca_enable
  122. );
  123. RTW_PRINT_SEL(sel, "%15s %9s\n", "AdapEnableState", "Adap_Flag");
  124. RTW_PRINT_SEL(sel, "%-15x %-9x\n"
  125. , odm->adaptivity_enable
  126. , odm->adaptivity_flag
  127. );
  128. }
  129. void rtw_odm_adaptivity_parm_set(_adapter *adapter, s8 th_l2h_ini, s8 th_edcca_hl_diff, s8 th_l2h_ini_mode2, s8 th_edcca_hl_diff_mode2, u8 edcca_enable)
  130. {
  131. HAL_DATA_TYPE *pHalData = GET_HAL_DATA(adapter);
  132. struct PHY_DM_STRUCT *odm = &pHalData->odmpriv;
  133. odm->th_l2h_ini = th_l2h_ini;
  134. odm->th_edcca_hl_diff = th_edcca_hl_diff;
  135. odm->th_l2h_ini_mode2 = th_l2h_ini_mode2;
  136. odm->th_edcca_hl_diff_mode2 = th_edcca_hl_diff_mode2;
  137. odm->edcca_enable = edcca_enable;
  138. }
  139. void rtw_odm_get_perpkt_rssi(void *sel, _adapter *adapter)
  140. {
  141. HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
  142. struct PHY_DM_STRUCT *odm = &(hal_data->odmpriv);
  143. RTW_PRINT_SEL(sel, "rx_rate = %s, RSSI_A = %d(%%), RSSI_B = %d(%%)\n",
  144. HDATA_RATE(odm->rx_rate), odm->RSSI_A, odm->RSSI_B);
  145. }
  146. void rtw_odm_acquirespinlock(_adapter *adapter, enum rt_spinlock_type type)
  147. {
  148. PHAL_DATA_TYPE pHalData = GET_HAL_DATA(adapter);
  149. _irqL irqL;
  150. switch (type) {
  151. case RT_IQK_SPINLOCK:
  152. _enter_critical_bh(&pHalData->IQKSpinLock, &irqL);
  153. default:
  154. break;
  155. }
  156. }
  157. void rtw_odm_releasespinlock(_adapter *adapter, enum rt_spinlock_type type)
  158. {
  159. PHAL_DATA_TYPE pHalData = GET_HAL_DATA(adapter);
  160. _irqL irqL;
  161. switch (type) {
  162. case RT_IQK_SPINLOCK:
  163. _exit_critical_bh(&pHalData->IQKSpinLock, &irqL);
  164. default:
  165. break;
  166. }
  167. }
  168. inline u8 rtw_odm_get_dfs_domain(_adapter *adapter)
  169. {
  170. #ifdef CONFIG_DFS_MASTER
  171. HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
  172. struct PHY_DM_STRUCT *pDM_Odm = &(hal_data->odmpriv);
  173. return pDM_Odm->dfs_region_domain;
  174. #else
  175. return PHYDM_DFS_DOMAIN_UNKNOWN;
  176. #endif
  177. }
  178. inline u8 rtw_odm_dfs_domain_unknown(_adapter *adapter)
  179. {
  180. #ifdef CONFIG_DFS_MASTER
  181. return rtw_odm_get_dfs_domain(adapter) == PHYDM_DFS_DOMAIN_UNKNOWN;
  182. #else
  183. return 1;
  184. #endif
  185. }
  186. #ifdef CONFIG_DFS_MASTER
  187. inline VOID rtw_odm_radar_detect_reset(_adapter *adapter)
  188. {
  189. phydm_radar_detect_reset(GET_ODM(adapter));
  190. }
  191. inline VOID rtw_odm_radar_detect_disable(_adapter *adapter)
  192. {
  193. phydm_radar_detect_disable(GET_ODM(adapter));
  194. }
  195. /* called after ch, bw is set */
  196. inline VOID rtw_odm_radar_detect_enable(_adapter *adapter)
  197. {
  198. phydm_radar_detect_enable(GET_ODM(adapter));
  199. }
  200. inline BOOLEAN rtw_odm_radar_detect(_adapter *adapter)
  201. {
  202. return phydm_radar_detect(GET_ODM(adapter));
  203. }
  204. #endif /* CONFIG_DFS_MASTER */
  205. void rtw_odm_parse_rx_phy_status_chinfo(union recv_frame *rframe, u8 *phys)
  206. {
  207. #ifndef DBG_RX_PHYSTATUS_CHINFO
  208. #define DBG_RX_PHYSTATUS_CHINFO 0
  209. #endif
  210. #if (ODM_PHY_STATUS_NEW_TYPE_SUPPORT == 1)
  211. _adapter *adapter = rframe->u.hdr.adapter;
  212. struct PHY_DM_STRUCT *phydm = GET_ODM(adapter);
  213. struct rx_pkt_attrib *attrib = &rframe->u.hdr.attrib;
  214. u8 *wlanhdr = get_recvframe_data(rframe);
  215. if (phydm->support_ic_type & ODM_IC_PHY_STATUE_NEW_TYPE) {
  216. /*
  217. * 8723D:
  218. * type_0(CCK)
  219. * l_rxsc
  220. * is filled with primary channel SC, not real rxsc.
  221. * 0:LSC, 1:USC
  222. * type_1(OFDM)
  223. * rf_mode
  224. * RF bandwidth when RX
  225. * l_rxsc(legacy), ht_rxsc
  226. * see below RXSC N-series
  227. * type_2(Not used)
  228. */
  229. /*
  230. * 8821C, 8822B:
  231. * type_0(CCK)
  232. * l_rxsc
  233. * is filled with primary channel SC, not real rxsc.
  234. * 0:LSC, 1:USC
  235. * type_1(OFDM)
  236. * rf_mode
  237. * RF bandwidth when RX
  238. * l_rxsc(legacy), ht_rxsc
  239. * see below RXSC AC-series
  240. * type_2(Not used)
  241. */
  242. if ((*phys & 0xf) == 0) {
  243. struct _phy_status_rpt_jaguar2_type0 *phys_t0 = (struct _phy_status_rpt_jaguar2_type0 *)phys;
  244. if (DBG_RX_PHYSTATUS_CHINFO) {
  245. RTW_PRINT("phys_t%u ta="MAC_FMT" %s, %s(band:%u, ch:%u, l_rxsc:%u)\n"
  246. , *phys & 0xf
  247. , MAC_ARG(get_ta(wlanhdr))
  248. , is_broadcast_mac_addr(get_ra(wlanhdr)) ? "BC" : is_multicast_mac_addr(get_ra(wlanhdr)) ? "MC" : "UC"
  249. , HDATA_RATE(attrib->data_rate)
  250. , phys_t0->band, phys_t0->channel, phys_t0->rxsc
  251. );
  252. }
  253. } else if ((*phys & 0xf) == 1) {
  254. struct _phy_status_rpt_jaguar2_type1 *phys_t1 = (struct _phy_status_rpt_jaguar2_type1 *)phys;
  255. u8 rxsc = (attrib->data_rate > DESC_RATE11M && attrib->data_rate < DESC_RATEMCS0) ? phys_t1->l_rxsc : phys_t1->ht_rxsc;
  256. u8 pkt_cch = 0;
  257. u8 pkt_bw = CHANNEL_WIDTH_20;
  258. #if ODM_IC_11N_SERIES_SUPPORT
  259. if (phydm->support_ic_type & ODM_IC_11N_SERIES) {
  260. /* RXSC N-series */
  261. #define RXSC_DUP 0
  262. #define RXSC_LSC 1
  263. #define RXSC_USC 2
  264. #define RXSC_40M 3
  265. static const s8 cch_offset_by_rxsc[4] = {0, -2, 2, 0};
  266. if (phys_t1->rf_mode == 0) {
  267. pkt_cch = phys_t1->channel;
  268. pkt_bw = CHANNEL_WIDTH_20;
  269. } else if (phys_t1->rf_mode == 1) {
  270. if (rxsc == RXSC_LSC || rxsc == RXSC_USC) {
  271. pkt_cch = phys_t1->channel + cch_offset_by_rxsc[rxsc];
  272. pkt_bw = CHANNEL_WIDTH_20;
  273. } else if (rxsc == RXSC_40M) {
  274. pkt_cch = phys_t1->channel;
  275. pkt_bw = CHANNEL_WIDTH_40;
  276. }
  277. } else
  278. rtw_warn_on(1);
  279. goto type1_end;
  280. }
  281. #endif /* ODM_IC_11N_SERIES_SUPPORT */
  282. #if ODM_IC_11AC_SERIES_SUPPORT
  283. if (phydm->support_ic_type & ODM_IC_11AC_SERIES) {
  284. /* RXSC AC-series */
  285. #define RXSC_DUP 0 /* 0: RX from all SC of current rf_mode */
  286. #define RXSC_LL20M_OF_160M 8 /* 1~8: RX from 20MHz SC */
  287. #define RXSC_L20M_OF_160M 6
  288. #define RXSC_L20M_OF_80M 4
  289. #define RXSC_L20M_OF_40M 2
  290. #define RXSC_U20M_OF_40M 1
  291. #define RXSC_U20M_OF_80M 3
  292. #define RXSC_U20M_OF_160M 5
  293. #define RXSC_UU20M_OF_160M 7
  294. #define RXSC_L40M_OF_160M 12 /* 9~12: RX from 40MHz SC */
  295. #define RXSC_L40M_OF_80M 10
  296. #define RXSC_U40M_OF_80M 9
  297. #define RXSC_U40M_OF_160M 11
  298. #define RXSC_L80M_OF_160M 14 /* 13~14: RX from 80MHz SC */
  299. #define RXSC_U80M_OF_160M 13
  300. static const s8 cch_offset_by_rxsc[15] = {0, 2, -2, 6, -6, 10, -10, 14, -14, 4, -4, 12, -12, 8, -8};
  301. if (phys_t1->rf_mode > 3) {
  302. /* invalid rf_mode */
  303. rtw_warn_on(1);
  304. goto type1_end;
  305. }
  306. if (phys_t1->rf_mode == 0) {
  307. /* RF 20MHz */
  308. pkt_cch = phys_t1->channel;
  309. pkt_bw = CHANNEL_WIDTH_20;
  310. goto type1_end;
  311. }
  312. if (rxsc == 0) {
  313. /* RF and RX with same BW */
  314. if (attrib->data_rate >= DESC_RATEMCS0) {
  315. pkt_cch = phys_t1->channel;
  316. pkt_bw = phys_t1->rf_mode;
  317. }
  318. goto type1_end;
  319. }
  320. if ((phys_t1->rf_mode == 1 && rxsc >= 1 && rxsc <= 2) /* RF 40MHz, RX 20MHz */
  321. || (phys_t1->rf_mode == 2 && rxsc >= 1 && rxsc <= 4) /* RF 80MHz, RX 20MHz */
  322. || (phys_t1->rf_mode == 3 && rxsc >= 1 && rxsc <= 8) /* RF 160MHz, RX 20MHz */
  323. ) {
  324. pkt_cch = phys_t1->channel + cch_offset_by_rxsc[rxsc];
  325. pkt_bw = CHANNEL_WIDTH_20;
  326. } else if ((phys_t1->rf_mode == 2 && rxsc >= 9 && rxsc <= 10) /* RF 80MHz, RX 40MHz */
  327. || (phys_t1->rf_mode == 3 && rxsc >= 9 && rxsc <= 12) /* RF 160MHz, RX 40MHz */
  328. ) {
  329. if (attrib->data_rate >= DESC_RATEMCS0) {
  330. pkt_cch = phys_t1->channel + cch_offset_by_rxsc[rxsc];
  331. pkt_bw = CHANNEL_WIDTH_40;
  332. }
  333. } else if ((phys_t1->rf_mode == 3 && rxsc >= 13 && rxsc <= 14) /* RF 160MHz, RX 80MHz */
  334. ) {
  335. if (attrib->data_rate >= DESC_RATEMCS0) {
  336. pkt_cch = phys_t1->channel + cch_offset_by_rxsc[rxsc];
  337. pkt_bw = CHANNEL_WIDTH_80;
  338. }
  339. } else
  340. rtw_warn_on(1);
  341. }
  342. #endif /* ODM_IC_11AC_SERIES_SUPPORT */
  343. type1_end:
  344. if (DBG_RX_PHYSTATUS_CHINFO) {
  345. RTW_PRINT("phys_t%u ta="MAC_FMT" %s, %s(band:%u, ch:%u, rf_mode:%u, l_rxsc:%u, ht_rxsc:%u) => %u,%u\n"
  346. , *phys & 0xf
  347. , MAC_ARG(get_ta(wlanhdr))
  348. , is_broadcast_mac_addr(get_ra(wlanhdr)) ? "BC" : is_multicast_mac_addr(get_ra(wlanhdr)) ? "MC" : "UC"
  349. , HDATA_RATE(attrib->data_rate)
  350. , phys_t1->band, phys_t1->channel, phys_t1->rf_mode, phys_t1->l_rxsc, phys_t1->ht_rxsc
  351. , pkt_cch, pkt_bw
  352. );
  353. }
  354. /* for now, only return cneter channel of 20MHz packet */
  355. if (pkt_cch && pkt_bw == CHANNEL_WIDTH_20)
  356. attrib->ch = pkt_cch;
  357. } else {
  358. struct _phy_status_rpt_jaguar2_type2 *phys_t2 = (struct _phy_status_rpt_jaguar2_type2 *)phys;
  359. if (DBG_RX_PHYSTATUS_CHINFO) {
  360. RTW_PRINT("phys_t%u ta="MAC_FMT" %s, %s(band:%u, ch:%u, l_rxsc:%u, ht_rxsc:%u)\n"
  361. , *phys & 0xf
  362. , MAC_ARG(get_ta(wlanhdr))
  363. , is_broadcast_mac_addr(get_ra(wlanhdr)) ? "BC" : is_multicast_mac_addr(get_ra(wlanhdr)) ? "MC" : "UC"
  364. , HDATA_RATE(attrib->data_rate)
  365. , phys_t2->band, phys_t2->channel, phys_t2->l_rxsc, phys_t2->ht_rxsc
  366. );
  367. }
  368. }
  369. }
  370. #endif /* (ODM_PHY_STATUS_NEW_TYPE_SUPPORT == 1) */
  371. }