phydm_interface.c 41 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425
  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. /*@************************************************************
  26. * include files
  27. ************************************************************/
  28. #include "mp_precomp.h"
  29. #include "phydm_precomp.h"
  30. /*@
  31. * ODM IO Relative API.
  32. */
  33. u8 odm_read_1byte(struct dm_struct *dm, u32 reg_addr)
  34. {
  35. #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
  36. struct rtl8192cd_priv *priv = dm->priv;
  37. return RTL_R8(reg_addr);
  38. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
  39. struct rtl_priv *rtlpriv = (struct rtl_priv *)dm->adapter;
  40. return rtl_read_byte(rtlpriv, reg_addr);
  41. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
  42. struct rtw_dev *rtwdev = dm->adapter;
  43. return rtw_read8(rtwdev, reg_addr);
  44. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
  45. void *adapter = dm->adapter;
  46. return rtw_read8(adapter, reg_addr);
  47. #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
  48. void *adapter = dm->adapter;
  49. return PlatformEFIORead1Byte(adapter, reg_addr);
  50. #elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)
  51. void *adapter = dm->adapter;
  52. return rtw_read8(adapter, reg_addr);
  53. #endif
  54. }
  55. u16 odm_read_2byte(struct dm_struct *dm, u32 reg_addr)
  56. {
  57. #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
  58. struct rtl8192cd_priv *priv = dm->priv;
  59. return RTL_R16(reg_addr);
  60. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
  61. struct rtl_priv *rtlpriv = (struct rtl_priv *)dm->adapter;
  62. return rtl_read_word(rtlpriv, reg_addr);
  63. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
  64. struct rtw_dev *rtwdev = dm->adapter;
  65. return rtw_read16(rtwdev, reg_addr);
  66. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
  67. void *adapter = dm->adapter;
  68. return rtw_read16(adapter, reg_addr);
  69. #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
  70. void *adapter = dm->adapter;
  71. return PlatformEFIORead2Byte(adapter, reg_addr);
  72. #elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)
  73. void *adapter = dm->adapter;
  74. return rtw_read16(adapter, reg_addr);
  75. #endif
  76. }
  77. u32 odm_read_4byte(struct dm_struct *dm, u32 reg_addr)
  78. {
  79. #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
  80. struct rtl8192cd_priv *priv = dm->priv;
  81. return RTL_R32(reg_addr);
  82. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
  83. struct rtl_priv *rtlpriv = (struct rtl_priv *)dm->adapter;
  84. return rtl_read_dword(rtlpriv, reg_addr);
  85. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
  86. struct rtw_dev *rtwdev = dm->adapter;
  87. return rtw_read32(rtwdev, reg_addr);
  88. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
  89. void *adapter = dm->adapter;
  90. return rtw_read32(adapter, reg_addr);
  91. #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
  92. void *adapter = dm->adapter;
  93. return PlatformEFIORead4Byte(adapter, reg_addr);
  94. #elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)
  95. void *adapter = dm->adapter;
  96. return rtw_read32(adapter, reg_addr);
  97. #endif
  98. }
  99. void odm_write_1byte(struct dm_struct *dm, u32 reg_addr, u8 data)
  100. {
  101. #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
  102. struct rtl8192cd_priv *priv = dm->priv;
  103. RTL_W8(reg_addr, data);
  104. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
  105. struct rtl_priv *rtlpriv = (struct rtl_priv *)dm->adapter;
  106. rtl_write_byte(rtlpriv, reg_addr, data);
  107. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
  108. struct rtw_dev *rtwdev = dm->adapter;
  109. rtw_write8(rtwdev, reg_addr, data);
  110. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
  111. void *adapter = dm->adapter;
  112. rtw_write8(adapter, reg_addr, data);
  113. #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
  114. void *adapter = dm->adapter;
  115. PlatformEFIOWrite1Byte(adapter, reg_addr, data);
  116. #elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)
  117. void *adapter = dm->adapter;
  118. rtw_write8(adapter, reg_addr, data);
  119. #endif
  120. }
  121. void odm_write_2byte(struct dm_struct *dm, u32 reg_addr, u16 data)
  122. {
  123. #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
  124. struct rtl8192cd_priv *priv = dm->priv;
  125. RTL_W16(reg_addr, data);
  126. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
  127. struct rtl_priv *rtlpriv = (struct rtl_priv *)dm->adapter;
  128. rtl_write_word(rtlpriv, reg_addr, data);
  129. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
  130. struct rtw_dev *rtwdev = dm->adapter;
  131. rtw_write16(rtwdev, reg_addr, data);
  132. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
  133. void *adapter = dm->adapter;
  134. rtw_write16(adapter, reg_addr, data);
  135. #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
  136. void *adapter = dm->adapter;
  137. PlatformEFIOWrite2Byte(adapter, reg_addr, data);
  138. #elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)
  139. void *adapter = dm->adapter;
  140. rtw_write16(adapter, reg_addr, data);
  141. #endif
  142. }
  143. void odm_write_4byte(struct dm_struct *dm, u32 reg_addr, u32 data)
  144. {
  145. #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
  146. struct rtl8192cd_priv *priv = dm->priv;
  147. RTL_W32(reg_addr, data);
  148. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
  149. struct rtl_priv *rtlpriv = (struct rtl_priv *)dm->adapter;
  150. rtl_write_dword(rtlpriv, reg_addr, data);
  151. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
  152. struct rtw_dev *rtwdev = dm->adapter;
  153. rtw_write32(rtwdev, reg_addr, data);
  154. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
  155. void *adapter = dm->adapter;
  156. rtw_write32(adapter, reg_addr, data);
  157. #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
  158. void *adapter = dm->adapter;
  159. PlatformEFIOWrite4Byte(adapter, reg_addr, data);
  160. #elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)
  161. void *adapter = dm->adapter;
  162. rtw_write32(adapter, reg_addr, data);
  163. #endif
  164. }
  165. void odm_set_mac_reg(struct dm_struct *dm, u32 reg_addr, u32 bit_mask, u32 data)
  166. {
  167. #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
  168. phy_set_bb_reg(dm->priv, reg_addr, bit_mask, data);
  169. #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
  170. void *adapter = dm->adapter;
  171. PHY_SetBBReg(adapter, reg_addr, bit_mask, data);
  172. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
  173. struct rtl_priv *rtlpriv = (struct rtl_priv *)dm->adapter;
  174. rtl_set_bbreg(rtlpriv->hw, reg_addr, bit_mask, data);
  175. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
  176. struct rtw_dev *rtwdev = dm->adapter;
  177. rtw_set_reg_with_mask(rtwdev, reg_addr, bit_mask, data);
  178. #elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)
  179. phy_set_bb_reg(dm->adapter, reg_addr, bit_mask, data);
  180. #else
  181. phy_set_bb_reg(dm->adapter, reg_addr, bit_mask, data);
  182. #endif
  183. }
  184. u32 odm_get_mac_reg(struct dm_struct *dm, u32 reg_addr, u32 bit_mask)
  185. {
  186. #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
  187. return phy_query_bb_reg(dm->priv, reg_addr, bit_mask);
  188. #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
  189. return PHY_QueryMacReg(dm->adapter, reg_addr, bit_mask);
  190. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
  191. struct rtl_priv *rtlpriv = (struct rtl_priv *)dm->adapter;
  192. return rtl_get_bbreg(rtlpriv->hw, reg_addr, bit_mask);
  193. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
  194. struct rtw_dev *rtwdev = dm->adapter;
  195. return rtw_get_reg_with_mask(rtwdev, reg_addr, bit_mask);
  196. #elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)
  197. return phy_query_bb_reg(dm->adapter, reg_addr, bit_mask);
  198. #else
  199. return phy_query_mac_reg(dm->adapter, reg_addr, bit_mask);
  200. #endif
  201. }
  202. void odm_set_bb_reg(struct dm_struct *dm, u32 reg_addr, u32 bit_mask, u32 data)
  203. {
  204. #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
  205. phy_set_bb_reg(dm->priv, reg_addr, bit_mask, data);
  206. #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
  207. void *adapter = dm->adapter;
  208. PHY_SetBBReg(adapter, reg_addr, bit_mask, data);
  209. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
  210. struct rtl_priv *rtlpriv = (struct rtl_priv *)dm->adapter;
  211. rtl_set_bbreg(rtlpriv->hw, reg_addr, bit_mask, data);
  212. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
  213. struct rtw_dev *rtwdev = dm->adapter;
  214. rtw_set_reg_with_mask(rtwdev, reg_addr, bit_mask, data);
  215. #elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)
  216. phy_set_bb_reg(dm->adapter, reg_addr, bit_mask, data);
  217. #else
  218. phy_set_bb_reg(dm->adapter, reg_addr, bit_mask, data);
  219. #endif
  220. }
  221. u32 odm_get_bb_reg(struct dm_struct *dm, u32 reg_addr, u32 bit_mask)
  222. {
  223. #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
  224. return phy_query_bb_reg(dm->priv, reg_addr, bit_mask);
  225. #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
  226. void *adapter = dm->adapter;
  227. return PHY_QueryBBReg(adapter, reg_addr, bit_mask);
  228. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
  229. struct rtl_priv *rtlpriv = (struct rtl_priv *)dm->adapter;
  230. return rtl_get_bbreg(rtlpriv->hw, reg_addr, bit_mask);
  231. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
  232. struct rtw_dev *rtwdev = dm->adapter;
  233. return rtw_get_reg_with_mask(rtwdev, reg_addr, bit_mask);
  234. #elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)
  235. return phy_query_bb_reg(dm->adapter, reg_addr, bit_mask);
  236. #else
  237. return phy_query_bb_reg(dm->adapter, reg_addr, bit_mask);
  238. #endif
  239. }
  240. void odm_set_rf_reg(struct dm_struct *dm, u8 e_rf_path, u32 reg_addr,
  241. u32 bit_mask, u32 data)
  242. {
  243. #if (DM_ODM_SUPPORT_TYPE & ODM_AP)
  244. phy_set_rf_reg(dm->priv, e_rf_path, reg_addr, bit_mask, data);
  245. #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
  246. void *adapter = dm->adapter;
  247. PHY_SetRFReg(adapter, e_rf_path, reg_addr, bit_mask, data);
  248. ODM_delay_us(2);
  249. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
  250. struct rtl_priv *rtlpriv = (struct rtl_priv *)dm->adapter;
  251. rtl_set_rfreg(rtlpriv->hw, e_rf_path, reg_addr, bit_mask, data);
  252. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
  253. struct rtw_dev *rtwdev = dm->adapter;
  254. rtw_write_rf(rtwdev, e_rf_path, reg_addr, bit_mask, data);
  255. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
  256. phy_set_rf_reg(dm->adapter, e_rf_path, reg_addr, bit_mask, data);
  257. #elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)
  258. phy_set_rf_reg(dm->adapter, e_rf_path, reg_addr, bit_mask, data);
  259. #endif
  260. }
  261. u32 odm_get_rf_reg(struct dm_struct *dm, u8 e_rf_path, u32 reg_addr,
  262. u32 bit_mask)
  263. {
  264. #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
  265. return phy_query_rf_reg(dm->priv, e_rf_path, reg_addr, bit_mask, 1);
  266. #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
  267. void *adapter = dm->adapter;
  268. return PHY_QueryRFReg(adapter, e_rf_path, reg_addr, bit_mask);
  269. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
  270. struct rtl_priv *rtlpriv = (struct rtl_priv *)dm->adapter;
  271. return rtl_get_rfreg(rtlpriv->hw, e_rf_path, reg_addr, bit_mask);
  272. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
  273. struct rtw_dev *rtwdev = dm->adapter;
  274. return rtw_read_rf(rtwdev, e_rf_path, reg_addr, bit_mask);
  275. #elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)
  276. return phy_query_rf_reg(dm->adapter, e_rf_path, reg_addr, bit_mask);
  277. #else
  278. return phy_query_rf_reg(dm->adapter, e_rf_path, reg_addr, bit_mask);
  279. #endif
  280. }
  281. enum hal_status
  282. phydm_set_reg_by_fw(struct dm_struct *dm, enum phydm_halmac_param config_type,
  283. u32 offset, u32 data, u32 mask, enum rf_path e_rf_path,
  284. u32 delay_time)
  285. {
  286. #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN))
  287. return HAL_MAC_Config_PHY_WriteNByte(dm,
  288. config_type,
  289. offset,
  290. data,
  291. mask,
  292. e_rf_path,
  293. delay_time);
  294. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
  295. #if (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
  296. PHYDM_DBG(dm, DBG_CMN, "Not support for CE MAC80211 driver!\n");
  297. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
  298. return -ENOTSUPP;
  299. #else
  300. return rtw_phydm_cfg_phy_para(dm,
  301. config_type,
  302. offset,
  303. data,
  304. mask,
  305. e_rf_path,
  306. delay_time);
  307. #endif
  308. #elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)
  309. PHYDM_DBG(dm, DBG_CMN, "Not support for CE MAC80211 driver!\n");
  310. #endif
  311. }
  312. /*@
  313. * ODM Memory relative API.
  314. */
  315. void odm_allocate_memory(struct dm_struct *dm, void **ptr, u32 length)
  316. {
  317. #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
  318. *ptr = kmalloc(length, GFP_ATOMIC);
  319. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
  320. *ptr = kmalloc(length, GFP_ATOMIC);
  321. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
  322. *ptr = kmalloc(length, GFP_ATOMIC);
  323. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
  324. *ptr = rtw_zvmalloc(length);
  325. #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
  326. void *adapter = dm->adapter;
  327. PlatformAllocateMemory(adapter, ptr, length);
  328. #elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)
  329. *ptr = rtw_zvmalloc(length);
  330. #endif
  331. }
  332. /* @length could be ignored, used to detect memory leakage. */
  333. void odm_free_memory(struct dm_struct *dm, void *ptr, u32 length)
  334. {
  335. #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
  336. kfree(ptr);
  337. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
  338. kfree(ptr);
  339. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
  340. kfree(ptr);
  341. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
  342. rtw_vmfree(ptr, length);
  343. #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
  344. /* struct void* adapter = dm->adapter; */
  345. PlatformFreeMemory(ptr, length);
  346. #elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)
  347. rtw_vmfree(ptr, length);
  348. #endif
  349. }
  350. void odm_move_memory(struct dm_struct *dm, void *dest, void *src, u32 length)
  351. {
  352. #if (DM_ODM_SUPPORT_TYPE & ODM_AP)
  353. memcpy(dest, src, length);
  354. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
  355. memcpy(dest, src, length);
  356. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
  357. memcpy(dest, src, length);
  358. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
  359. _rtw_memcpy(dest, src, length);
  360. #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
  361. PlatformMoveMemory(dest, src, length);
  362. #elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)
  363. rtw_memcpy(dest, src, length);
  364. #endif
  365. }
  366. void odm_memory_set(struct dm_struct *dm, void *pbuf, s8 value, u32 length)
  367. {
  368. #if (DM_ODM_SUPPORT_TYPE & ODM_AP)
  369. memset(pbuf, value, length);
  370. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
  371. memset(pbuf, value, length);
  372. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
  373. memset(pbuf, value, length);
  374. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
  375. _rtw_memset(pbuf, value, length);
  376. #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
  377. PlatformFillMemory(pbuf, length, value);
  378. #elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)
  379. rtw_memset(pbuf, value, length);
  380. #endif
  381. }
  382. s32 odm_compare_memory(struct dm_struct *dm, void *buf1, void *buf2, u32 length)
  383. {
  384. #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
  385. return memcmp(buf1, buf2, length);
  386. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
  387. return memcmp(buf1, buf2, length);
  388. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
  389. return memcmp(buf1, buf2, length);
  390. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
  391. return _rtw_memcmp(buf1, buf2, length);
  392. #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
  393. return PlatformCompareMemory(buf1, buf2, length);
  394. #elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)
  395. return rtw_memcmp(buf1, buf2, length);
  396. #endif
  397. }
  398. /*@
  399. * ODM MISC relative API.
  400. */
  401. void odm_acquire_spin_lock(struct dm_struct *dm, enum rt_spinlock_type type)
  402. {
  403. #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
  404. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
  405. struct rtl_priv *rtlpriv = (struct rtl_priv *)dm->adapter;
  406. rtl_odm_acquirespinlock(rtlpriv, type);
  407. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
  408. struct rtw_dev *rtwdev = dm->adapter;
  409. spin_lock(&rtwdev->hal.dm_lock);
  410. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
  411. void *adapter = dm->adapter;
  412. rtw_odm_acquirespinlock(adapter, type);
  413. #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
  414. void *adapter = dm->adapter;
  415. PlatformAcquireSpinLock(adapter, type);
  416. #elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)
  417. void *adapter = dm->adapter;
  418. rtw_odm_acquirespinlock(adapter, type);
  419. #endif
  420. }
  421. void odm_release_spin_lock(struct dm_struct *dm, enum rt_spinlock_type type)
  422. {
  423. #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
  424. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
  425. struct rtl_priv *rtlpriv = (struct rtl_priv *)dm->adapter;
  426. rtl_odm_releasespinlock(rtlpriv, type);
  427. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
  428. struct rtw_dev *rtwdev = dm->adapter;
  429. spin_unlock(&rtwdev->hal.dm_lock);
  430. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
  431. void *adapter = dm->adapter;
  432. rtw_odm_releasespinlock(adapter, type);
  433. #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
  434. void *adapter = dm->adapter;
  435. PlatformReleaseSpinLock(adapter, type);
  436. #elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)
  437. void *adapter = dm->adapter;
  438. rtw_odm_releasespinlock(adapter, type);
  439. #endif
  440. }
  441. #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
  442. /*@
  443. * Work item relative API. FOr MP driver only~!
  444. * */
  445. void odm_initialize_work_item(
  446. struct dm_struct *dm,
  447. PRT_WORK_ITEM work_item,
  448. RT_WORKITEM_CALL_BACK callback,
  449. void *context,
  450. const char *id)
  451. {
  452. #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
  453. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
  454. #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
  455. void *adapter = dm->adapter;
  456. PlatformInitializeWorkItem(adapter, work_item, callback, context, id);
  457. #endif
  458. }
  459. void odm_start_work_item(
  460. PRT_WORK_ITEM p_rt_work_item)
  461. {
  462. #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
  463. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
  464. #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
  465. PlatformStartWorkItem(p_rt_work_item);
  466. #endif
  467. }
  468. void odm_stop_work_item(
  469. PRT_WORK_ITEM p_rt_work_item)
  470. {
  471. #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
  472. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
  473. #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
  474. PlatformStopWorkItem(p_rt_work_item);
  475. #endif
  476. }
  477. void odm_free_work_item(
  478. PRT_WORK_ITEM p_rt_work_item)
  479. {
  480. #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
  481. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
  482. #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
  483. PlatformFreeWorkItem(p_rt_work_item);
  484. #endif
  485. }
  486. void odm_schedule_work_item(
  487. PRT_WORK_ITEM p_rt_work_item)
  488. {
  489. #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
  490. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
  491. #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
  492. PlatformScheduleWorkItem(p_rt_work_item);
  493. #endif
  494. }
  495. boolean
  496. odm_is_work_item_scheduled(
  497. PRT_WORK_ITEM p_rt_work_item)
  498. {
  499. #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
  500. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
  501. #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
  502. return PlatformIsWorkItemScheduled(p_rt_work_item);
  503. #endif
  504. }
  505. #endif
  506. /*@
  507. * ODM Timer relative API.
  508. */
  509. void ODM_delay_ms(u32 ms)
  510. {
  511. #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
  512. delay_ms(ms);
  513. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
  514. mdelay(ms);
  515. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
  516. mdelay(ms);
  517. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
  518. rtw_mdelay_os(ms);
  519. #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
  520. delay_ms(ms);
  521. #elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)
  522. rtw_mdelay_os(ms);
  523. #endif
  524. }
  525. void ODM_delay_us(u32 us)
  526. {
  527. #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
  528. delay_us(us);
  529. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
  530. udelay(us);
  531. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
  532. udelay(us);
  533. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
  534. rtw_udelay_os(us);
  535. #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
  536. PlatformStallExecution(us);
  537. #elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)
  538. rtw_udelay_os(us);
  539. #endif
  540. }
  541. void ODM_sleep_ms(u32 ms)
  542. {
  543. #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
  544. delay_ms(ms);
  545. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
  546. msleep(ms);
  547. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
  548. msleep(ms);
  549. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
  550. rtw_msleep_os(ms);
  551. #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
  552. delay_ms(ms);
  553. #elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)
  554. rtw_msleep_os(ms);
  555. #endif
  556. }
  557. void ODM_sleep_us(u32 us)
  558. {
  559. #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
  560. delay_us(us);
  561. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
  562. usleep_range(us, us + 1);
  563. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
  564. usleep_range(us, us + 1);
  565. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
  566. rtw_usleep_os(us);
  567. #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
  568. PlatformStallExecution(us);
  569. #elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)
  570. rtw_usleep_os(us);
  571. #endif
  572. }
  573. void odm_set_timer(struct dm_struct *dm, struct phydm_timer_list *timer,
  574. u32 ms_delay)
  575. {
  576. #if (DM_ODM_SUPPORT_TYPE & ODM_AP)
  577. mod_timer(timer, jiffies + RTL_MILISECONDS_TO_JIFFIES(ms_delay));
  578. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
  579. mod_timer(timer, jiffies + msecs_to_jiffies(ms_delay));
  580. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
  581. mod_timer(&timer->timer, jiffies + msecs_to_jiffies(ms_delay));
  582. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
  583. _set_timer(timer, ms_delay); /* @ms */
  584. #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
  585. void *adapter = dm->adapter;
  586. PlatformSetTimer(adapter, timer, ms_delay);
  587. #elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)
  588. rtw_set_timer(timer, ms_delay); /* @ms */
  589. #endif
  590. }
  591. void odm_initialize_timer(struct dm_struct *dm, struct phydm_timer_list *timer,
  592. void *call_back_func, void *context,
  593. const char *sz_id)
  594. {
  595. #if (DM_ODM_SUPPORT_TYPE & ODM_AP)
  596. init_timer(timer);
  597. timer->function = call_back_func;
  598. timer->data = (unsigned long)dm;
  599. #if 0
  600. /*@mod_timer(timer, jiffies+RTL_MILISECONDS_TO_JIFFIES(10)); */
  601. #endif
  602. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
  603. timer_setup(timer, call_back_func, 0);
  604. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
  605. struct _ADAPTER *adapter = dm->adapter;
  606. _init_timer(timer, adapter->pnetdev, call_back_func, dm);
  607. #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
  608. void *adapter = dm->adapter;
  609. PlatformInitializeTimer(adapter, timer, (RT_TIMER_CALL_BACK)call_back_func, context, sz_id);
  610. #elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)
  611. struct _ADAPTER *adapter = dm->adapter;
  612. rtw_init_timer(timer, adapter->pnetdev, (TIMER_FUN)call_back_func, dm, NULL);
  613. #endif
  614. }
  615. void odm_cancel_timer(struct dm_struct *dm, struct phydm_timer_list *timer)
  616. {
  617. #if (DM_ODM_SUPPORT_TYPE & ODM_AP)
  618. del_timer(timer);
  619. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
  620. del_timer(timer);
  621. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
  622. del_timer(&timer->timer);
  623. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
  624. _cancel_timer_ex(timer);
  625. #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
  626. void *adapter = dm->adapter;
  627. PlatformCancelTimer(adapter, timer);
  628. #elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)
  629. rtw_cancel_timer(timer);
  630. #endif
  631. }
  632. void odm_release_timer(struct dm_struct *dm, struct phydm_timer_list *timer)
  633. {
  634. #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
  635. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
  636. #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
  637. void *adapter = dm->adapter;
  638. /* @<20120301, Kordan> If the initilization fails,
  639. * InitializeAdapterXxx will return regardless of InitHalDm.
  640. * Hence, uninitialized timers cause BSOD when the driver
  641. * releases resources since the init fail.
  642. */
  643. if (timer == 0) {
  644. PHYDM_DBG(dm, ODM_COMP_INIT,
  645. "[%s] Timer is NULL! Please check!\n", __func__);
  646. return;
  647. }
  648. PlatformReleaseTimer(adapter, timer);
  649. #elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)
  650. rtw_del_timer(timer);
  651. #endif
  652. }
  653. u8 phydm_trans_h2c_id(struct dm_struct *dm, u8 phydm_h2c_id)
  654. {
  655. u8 platform_h2c_id = phydm_h2c_id;
  656. switch (phydm_h2c_id) {
  657. /* @1 [0] */
  658. case ODM_H2C_RSSI_REPORT:
  659. #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
  660. #if (RTL8188E_SUPPORT == 1)
  661. if (dm->support_ic_type == ODM_RTL8188E)
  662. platform_h2c_id = H2C_88E_RSSI_REPORT;
  663. else
  664. #endif
  665. platform_h2c_id = H2C_RSSI_REPORT;
  666. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
  667. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
  668. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
  669. platform_h2c_id = H2C_RSSI_SETTING;
  670. #elif (DM_ODM_SUPPORT_TYPE & ODM_AP)
  671. #if ((RTL8881A_SUPPORT == 1) || (RTL8192E_SUPPORT == 1) || (RTL8814A_SUPPORT == 1) || (RTL8822B_SUPPORT == 1) || (RTL8197F_SUPPORT == 1) || (RTL8192F_SUPPORT == 1)) /*@jj add 20170822*/
  672. if (dm->support_ic_type == ODM_RTL8881A || dm->support_ic_type == ODM_RTL8192E || dm->support_ic_type & PHYDM_IC_3081_SERIES)
  673. platform_h2c_id = H2C_88XX_RSSI_REPORT;
  674. else
  675. #endif
  676. #if (RTL8812A_SUPPORT == 1)
  677. if (dm->support_ic_type == ODM_RTL8812)
  678. platform_h2c_id = H2C_8812_RSSI_REPORT;
  679. else
  680. #endif
  681. {
  682. }
  683. #endif
  684. break;
  685. /* @1 [3] */
  686. case ODM_H2C_WIFI_CALIBRATION:
  687. #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
  688. platform_h2c_id = H2C_WIFI_CALIBRATION;
  689. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
  690. #if (RTL8723B_SUPPORT == 1)
  691. platform_h2c_id = H2C_8723B_BT_WLAN_CALIBRATION;
  692. #endif
  693. #elif (DM_ODM_SUPPORT_TYPE & ODM_AP)
  694. #endif
  695. break;
  696. /* @1 [4] */
  697. case ODM_H2C_IQ_CALIBRATION:
  698. #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
  699. platform_h2c_id = H2C_IQ_CALIBRATION;
  700. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
  701. #if ((RTL8812A_SUPPORT == 1) || (RTL8821A_SUPPORT == 1))
  702. platform_h2c_id = H2C_8812_IQ_CALIBRATION;
  703. #endif
  704. #elif (DM_ODM_SUPPORT_TYPE & ODM_AP)
  705. #endif
  706. break;
  707. /* @1 [5] */
  708. case ODM_H2C_RA_PARA_ADJUST:
  709. #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
  710. platform_h2c_id = H2C_RA_PARA_ADJUST;
  711. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
  712. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
  713. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
  714. #if ((RTL8812A_SUPPORT == 1) || (RTL8821A_SUPPORT == 1))
  715. platform_h2c_id = H2C_8812_RA_PARA_ADJUST;
  716. #elif ((RTL8814A_SUPPORT == 1) || (RTL8822B_SUPPORT == 1))
  717. platform_h2c_id = H2C_RA_PARA_ADJUST;
  718. #elif (RTL8192E_SUPPORT == 1)
  719. platform_h2c_id = H2C_8192E_RA_PARA_ADJUST;
  720. #elif (RTL8723B_SUPPORT == 1)
  721. platform_h2c_id = H2C_8723B_RA_PARA_ADJUST;
  722. #endif
  723. #elif (DM_ODM_SUPPORT_TYPE & ODM_AP)
  724. #if ((RTL8881A_SUPPORT == 1) || (RTL8192E_SUPPORT == 1) || (RTL8814A_SUPPORT == 1) || (RTL8822B_SUPPORT == 1) || (RTL8197F_SUPPORT == 1) || (RTL8192F_SUPPORT == 1)) /*@jj add 20170822*/
  725. if (dm->support_ic_type == ODM_RTL8881A || dm->support_ic_type == ODM_RTL8192E || dm->support_ic_type & PHYDM_IC_3081_SERIES)
  726. platform_h2c_id = H2C_88XX_RA_PARA_ADJUST;
  727. else
  728. #endif
  729. #if (RTL8812A_SUPPORT == 1)
  730. if (dm->support_ic_type == ODM_RTL8812)
  731. platform_h2c_id = H2C_8812_RA_PARA_ADJUST;
  732. else
  733. #endif
  734. {
  735. }
  736. #endif
  737. break;
  738. /* @1 [6] */
  739. case PHYDM_H2C_DYNAMIC_TX_PATH:
  740. #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
  741. #if (RTL8814A_SUPPORT == 1)
  742. if (dm->support_ic_type == ODM_RTL8814A)
  743. platform_h2c_id = H2C_8814A_DYNAMIC_TX_PATH;
  744. #endif
  745. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
  746. #if (RTL8814A_SUPPORT == 1)
  747. if (dm->support_ic_type == ODM_RTL8814A)
  748. platform_h2c_id = H2C_DYNAMIC_TX_PATH;
  749. #endif
  750. #elif (DM_ODM_SUPPORT_TYPE & ODM_AP)
  751. #if (RTL8814A_SUPPORT == 1)
  752. if (dm->support_ic_type == ODM_RTL8814A)
  753. platform_h2c_id = H2C_88XX_DYNAMIC_TX_PATH;
  754. #endif
  755. #endif
  756. break;
  757. /* @[7]*/
  758. case PHYDM_H2C_FW_TRACE_EN:
  759. #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
  760. platform_h2c_id = H2C_FW_TRACE_EN;
  761. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
  762. platform_h2c_id = 0x49;
  763. #elif (DM_ODM_SUPPORT_TYPE & ODM_AP)
  764. #if ((RTL8881A_SUPPORT == 1) || (RTL8192E_SUPPORT == 1) || (RTL8814A_SUPPORT == 1) || (RTL8822B_SUPPORT == 1) || (RTL8197F_SUPPORT == 1) || (RTL8192F_SUPPORT == 1)) /*@jj add 20170822*/
  765. if (dm->support_ic_type == ODM_RTL8881A || dm->support_ic_type == ODM_RTL8192E || dm->support_ic_type & PHYDM_IC_3081_SERIES)
  766. platform_h2c_id = H2C_88XX_FW_TRACE_EN;
  767. else
  768. #endif
  769. #if (RTL8812A_SUPPORT == 1)
  770. if (dm->support_ic_type == ODM_RTL8812)
  771. platform_h2c_id = H2C_8812_FW_TRACE_EN;
  772. else
  773. #endif
  774. {
  775. }
  776. #endif
  777. break;
  778. case PHYDM_H2C_TXBF:
  779. #if ((RTL8192E_SUPPORT == 1) || (RTL8812A_SUPPORT == 1))
  780. platform_h2c_id = 0x41; /*@H2C_TxBF*/
  781. #endif
  782. break;
  783. case PHYDM_H2C_MU:
  784. #if (RTL8822B_SUPPORT == 1)
  785. platform_h2c_id = 0x4a; /*@H2C_MU*/
  786. #endif
  787. break;
  788. default:
  789. platform_h2c_id = phydm_h2c_id;
  790. break;
  791. }
  792. return platform_h2c_id;
  793. }
  794. /*@ODM FW relative API.*/
  795. void odm_fill_h2c_cmd(struct dm_struct *dm, u8 phydm_h2c_id, u32 cmd_len,
  796. u8 *cmd_buf)
  797. {
  798. #if (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
  799. struct rtl_priv *rtlpriv = (struct rtl_priv *)dm->adapter;
  800. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
  801. struct rtw_dev *rtwdev = dm->adapter;
  802. u8 cmd_id, cmd_class;
  803. u8 h2c_pkt[8];
  804. #else
  805. void *adapter = dm->adapter;
  806. #endif
  807. u8 h2c_id = phydm_trans_h2c_id(dm, phydm_h2c_id);
  808. PHYDM_DBG(dm, DBG_RA, "[H2C] h2c_id=((0x%x))\n", h2c_id);
  809. #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
  810. if (dm->support_ic_type == ODM_RTL8188E) {
  811. if (!dm->ra_support88e)
  812. FillH2CCmd88E(adapter, h2c_id, cmd_len, cmd_buf);
  813. } else if (dm->support_ic_type == ODM_RTL8814A)
  814. FillH2CCmd8814A(adapter, h2c_id, cmd_len, cmd_buf);
  815. else if (dm->support_ic_type == ODM_RTL8822B)
  816. FillH2CCmd8822B(adapter, h2c_id, cmd_len, cmd_buf);
  817. else
  818. FillH2CCmd(adapter, h2c_id, cmd_len, cmd_buf);
  819. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
  820. #ifdef DM_ODM_CE_MAC80211
  821. rtlpriv->cfg->ops->fill_h2c_cmd(rtlpriv->hw, h2c_id, cmd_len, cmd_buf);
  822. #elif defined(DM_ODM_CE_MAC80211_V2)
  823. cmd_id = phydm_h2c_id & 0x1f;
  824. cmd_class = (phydm_h2c_id >> RTW_H2C_CLASS_OFFSET) & 0x7;
  825. memcpy(h2c_pkt + 1, cmd_buf, 7);
  826. h2c_pkt[0] = phydm_h2c_id;
  827. rtw_fw_send_h2c_packet(rtwdev, h2c_pkt, cmd_id, cmd_class);
  828. /* TODO: implement fill h2c command for rtwlan */
  829. #else
  830. rtw_hal_fill_h2c_cmd(adapter, h2c_id, cmd_len, cmd_buf);
  831. #endif
  832. #elif (DM_ODM_SUPPORT_TYPE & ODM_AP)
  833. #if (RTL8812A_SUPPORT == 1)
  834. if (dm->support_ic_type == ODM_RTL8812) {
  835. fill_h2c_cmd8812(dm->priv, h2c_id, cmd_len, cmd_buf);
  836. } else
  837. #endif
  838. {
  839. GET_HAL_INTERFACE(dm->priv)->fill_h2c_cmd_handler(dm->priv, h2c_id, cmd_len, cmd_buf);
  840. }
  841. #elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)
  842. rtw_hal_fill_h2c_cmd(adapter, h2c_id, cmd_len, cmd_buf);
  843. #endif
  844. }
  845. u8 phydm_c2H_content_parsing(void *dm_void, u8 c2h_cmd_id, u8 c2h_cmd_len,
  846. u8 *tmp_buf)
  847. {
  848. struct dm_struct *dm = (struct dm_struct *)dm_void;
  849. #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
  850. void *adapter = dm->adapter;
  851. #endif
  852. u8 extend_c2h_sub_id = 0;
  853. u8 find_c2h_cmd = true;
  854. if (c2h_cmd_len > 12 || c2h_cmd_len == 0) {
  855. pr_debug("[Warning] Error C2H ID=%d, len=%d\n",
  856. c2h_cmd_id, c2h_cmd_len);
  857. find_c2h_cmd = false;
  858. return find_c2h_cmd;
  859. }
  860. switch (c2h_cmd_id) {
  861. case PHYDM_C2H_DBG:
  862. phydm_fw_trace_handler(dm, tmp_buf, c2h_cmd_len);
  863. break;
  864. case PHYDM_C2H_RA_RPT:
  865. phydm_c2h_ra_report_handler(dm, tmp_buf, c2h_cmd_len);
  866. break;
  867. case PHYDM_C2H_RA_PARA_RPT:
  868. odm_c2h_ra_para_report_handler(dm, tmp_buf, c2h_cmd_len);
  869. break;
  870. #ifdef CONFIG_PATH_DIVERSITY
  871. case PHYDM_C2H_DYNAMIC_TX_PATH_RPT:
  872. if (dm->support_ic_type & (ODM_RTL8814A))
  873. phydm_c2h_dtp_handler(dm, tmp_buf, c2h_cmd_len);
  874. break;
  875. #endif
  876. case PHYDM_C2H_IQK_FINISH:
  877. #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
  878. if (dm->support_ic_type & (ODM_RTL8812 | ODM_RTL8821)) {
  879. RT_TRACE(COMP_MP, DBG_LOUD, ("== FW IQK Finish ==\n"));
  880. odm_acquire_spin_lock(dm, RT_IQK_SPINLOCK);
  881. dm->rf_calibrate_info.is_iqk_in_progress = false;
  882. odm_release_spin_lock(dm, RT_IQK_SPINLOCK);
  883. dm->rf_calibrate_info.iqk_progressing_time = 0;
  884. dm->rf_calibrate_info.iqk_progressing_time = odm_get_progressing_time(dm, dm->rf_calibrate_info.iqk_start_time);
  885. }
  886. #endif
  887. break;
  888. case PHYDM_C2H_CLM_MONITOR:
  889. phydm_clm_c2h_report_handler(dm, tmp_buf, c2h_cmd_len);
  890. break;
  891. case PHYDM_C2H_DBG_CODE:
  892. phydm_fw_trace_handler_code(dm, tmp_buf, c2h_cmd_len);
  893. break;
  894. case PHYDM_C2H_EXTEND:
  895. extend_c2h_sub_id = tmp_buf[0];
  896. if (extend_c2h_sub_id == PHYDM_EXTEND_C2H_DBG_PRINT)
  897. phydm_fw_trace_handler_8051(dm, tmp_buf, c2h_cmd_len);
  898. break;
  899. default:
  900. find_c2h_cmd = false;
  901. break;
  902. }
  903. return find_c2h_cmd;
  904. }
  905. u64 odm_get_current_time(struct dm_struct *dm)
  906. {
  907. #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
  908. return (u64)rtw_get_current_time();
  909. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
  910. return jiffies;
  911. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
  912. return jiffies;
  913. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
  914. return rtw_get_current_time();
  915. #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
  916. return PlatformGetCurrentTime();
  917. #elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)
  918. return rtw_get_current_time();
  919. #endif
  920. }
  921. u64 odm_get_progressing_time(struct dm_struct *dm, u64 start_time)
  922. {
  923. #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
  924. return rtw_get_passing_time_ms((u32)start_time);
  925. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
  926. return jiffies_to_msecs(jiffies - start_time);
  927. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
  928. return jiffies_to_msecs(jiffies - start_time);
  929. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
  930. return rtw_get_passing_time_ms((systime)start_time);
  931. #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
  932. return ((PlatformGetCurrentTime() - start_time) >> 10);
  933. #elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)
  934. return rtw_get_passing_time_ms(start_time);
  935. #endif
  936. }
  937. #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE)) && \
  938. (!defined(DM_ODM_CE_MAC80211) && !defined(DM_ODM_CE_MAC80211_V2))
  939. void phydm_set_hw_reg_handler_interface(struct dm_struct *dm, u8 RegName,
  940. u8 *val)
  941. {
  942. #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))
  943. struct _ADAPTER *adapter = dm->adapter;
  944. #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
  945. ((PADAPTER)adapter)->HalFunc.SetHwRegHandler(adapter, RegName, val);
  946. #else
  947. adapter->hal_func.set_hw_reg_handler(adapter, RegName, val);
  948. #endif
  949. #endif
  950. }
  951. void phydm_get_hal_def_var_handler_interface(struct dm_struct *dm,
  952. enum _HAL_DEF_VARIABLE e_variable,
  953. void *value)
  954. {
  955. #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))
  956. struct _ADAPTER *adapter = dm->adapter;
  957. #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
  958. ((PADAPTER)adapter)->HalFunc.GetHalDefVarHandler(adapter, e_variable, value);
  959. #else
  960. adapter->hal_func.get_hal_def_var_handler(adapter, e_variable, value);
  961. #endif
  962. #endif
  963. }
  964. #endif
  965. void odm_set_tx_power_index_by_rate_section(struct dm_struct *dm,
  966. enum rf_path path, u8 ch,
  967. u8 section)
  968. {
  969. #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
  970. void *adapter = dm->adapter;
  971. PHY_SetTxPowerIndexByRateSection(adapter, path, ch, section);
  972. #elif (DM_ODM_SUPPORT_TYPE == ODM_CE) && defined(DM_ODM_CE_MAC80211)
  973. void *adapter = dm->adapter;
  974. phy_set_tx_power_index_by_rs(adapter, ch, path, section);
  975. #elif (DM_ODM_SUPPORT_TYPE == ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
  976. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
  977. phy_set_tx_power_index_by_rate_section(dm->adapter, path, ch, section);
  978. #elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)
  979. void *adapter = dm->adapter;
  980. PHY_SetTxPowerIndexByRateSection(adapter, path, ch, section);
  981. #endif
  982. }
  983. u8 odm_get_tx_power_index(struct dm_struct *dm, enum rf_path path, u8 rate,
  984. u8 bw, u8 ch)
  985. {
  986. #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
  987. void *adapter = dm->adapter;
  988. return PHY_GetTxPowerIndex(dm->adapter, path, rate, (CHANNEL_WIDTH)bw, ch);
  989. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
  990. void *adapter = dm->adapter;
  991. return phy_get_tx_power_index(adapter, path, rate, bw, ch);
  992. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
  993. void *adapter = dm->adapter;
  994. return phy_get_tx_power_index(adapter, path, rate, bw, ch);
  995. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
  996. return phy_get_tx_power_index(dm->adapter, path, rate, bw, ch);
  997. #elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)
  998. void *adapter = dm->adapter;
  999. return PHY_GetTxPowerIndex(dm->adapter, path, rate, bw, ch);
  1000. #endif
  1001. }
  1002. u8 odm_efuse_one_byte_read(struct dm_struct *dm, u16 addr, u8 *data,
  1003. boolean b_pseu_do_test)
  1004. {
  1005. #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
  1006. void *adapter = dm->adapter;
  1007. return (u8)EFUSE_OneByteRead(adapter, addr, data, b_pseu_do_test);
  1008. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
  1009. void *adapter = dm->adapter;
  1010. return rtl_efuse_onebyte_read(adapter, addr, data, b_pseu_do_test);
  1011. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
  1012. return -1;
  1013. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
  1014. return efuse_onebyte_read(dm->adapter, addr, data, b_pseu_do_test);
  1015. #elif (DM_ODM_SUPPORT_TYPE & ODM_AP)
  1016. /*ReadEFuseByte(dm->priv, addr, data);*/
  1017. /*return true;*/
  1018. #elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)
  1019. void *adapter = dm->adapter;
  1020. return (u8)efuse_OneByteRead(adapter, addr, data, b_pseu_do_test);
  1021. #endif
  1022. }
  1023. void odm_efuse_logical_map_read(struct dm_struct *dm, u8 type, u16 offset,
  1024. u32 *data)
  1025. {
  1026. #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
  1027. void *adapter = dm->adapter;
  1028. EFUSE_ShadowRead(adapter, type, offset, data);
  1029. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
  1030. void *adapter = dm->adapter;
  1031. rtl_efuse_logical_map_read(adapter, type, offset, data);
  1032. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
  1033. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
  1034. efuse_logical_map_read(dm->adapter, type, offset, data);
  1035. #elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)
  1036. void *adapter = dm->adapter;
  1037. EFUSE_ShadowRead(adapter, type, offset, data);
  1038. #endif
  1039. }
  1040. enum hal_status
  1041. odm_iq_calibrate_by_fw(struct dm_struct *dm, u8 clear, u8 segment)
  1042. {
  1043. enum hal_status iqk_result = HAL_STATUS_FAILURE;
  1044. #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
  1045. struct _ADAPTER *adapter = dm->adapter;
  1046. if (HAL_MAC_FWIQK_Trigger(&GET_HAL_MAC_INFO(adapter), clear, segment) == 0)
  1047. iqk_result = HAL_STATUS_SUCCESS;
  1048. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
  1049. #if (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
  1050. void *adapter = dm->adapter;
  1051. iqk_result = rtl_phydm_fw_iqk(adapter, clear, segment);
  1052. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
  1053. #else
  1054. iqk_result = rtw_phydm_fw_iqk(dm, clear, segment);
  1055. #endif
  1056. #elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)
  1057. iqk_result = rtw_phydm_fw_iqk(dm, clear, segment);
  1058. #endif
  1059. return iqk_result;
  1060. }
  1061. void odm_cmn_info_ptr_array_hook(struct dm_struct *dm,
  1062. enum odm_cmninfo cmn_info, u16 index,
  1063. void *value)
  1064. {
  1065. switch (cmn_info) {
  1066. /*@Dynamic call by reference pointer. */
  1067. case ODM_CMNINFO_STA_STATUS:
  1068. dm->odm_sta_info[index] = (struct sta_info *)value;
  1069. break;
  1070. /* To remove the compiler warning,
  1071. * must add an empty default statement to handle the other values.
  1072. */
  1073. default:
  1074. /* @do nothing */
  1075. break;
  1076. }
  1077. }
  1078. void phydm_cmn_sta_info_hook(struct dm_struct *dm, u8 mac_id,
  1079. struct cmn_sta_info *pcmn_sta_info)
  1080. {
  1081. dm->phydm_sta_info[mac_id] = pcmn_sta_info;
  1082. if (is_sta_active(pcmn_sta_info))
  1083. dm->phydm_macid_table[pcmn_sta_info->mac_id] = mac_id;
  1084. }
  1085. void phydm_macid2sta_idx_table(struct dm_struct *dm, u8 entry_idx,
  1086. struct cmn_sta_info *pcmn_sta_info)
  1087. {
  1088. if (is_sta_active(pcmn_sta_info))
  1089. dm->phydm_macid_table[pcmn_sta_info->mac_id] = entry_idx;
  1090. }
  1091. void phydm_add_interrupt_mask_handler(struct dm_struct *dm, u8 interrupt_type)
  1092. {
  1093. #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
  1094. #elif (DM_ODM_SUPPORT_TYPE == ODM_AP)
  1095. struct rtl8192cd_priv *priv = dm->priv;
  1096. #if IS_EXIST_PCI || IS_EXIST_EMBEDDED
  1097. GET_HAL_INTERFACE(priv)->AddInterruptMaskHandler(priv, interrupt_type);
  1098. #endif
  1099. #elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
  1100. #endif
  1101. }
  1102. void phydm_enable_rx_related_interrupt_handler(struct dm_struct *dm)
  1103. {
  1104. #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
  1105. #elif (DM_ODM_SUPPORT_TYPE == ODM_AP)
  1106. struct rtl8192cd_priv *priv = dm->priv;
  1107. #if IS_EXIST_PCI || IS_EXIST_EMBEDDED
  1108. GET_HAL_INTERFACE(priv)->EnableRxRelatedInterruptHandler(priv);
  1109. #endif
  1110. #elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
  1111. #endif
  1112. }
  1113. #if 0
  1114. boolean
  1115. phydm_get_txbf_en(
  1116. struct dm_struct *dm,
  1117. u16 mac_id,
  1118. u8 i
  1119. )
  1120. {
  1121. boolean txbf_en = false;
  1122. #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
  1123. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && !defined(DM_ODM_CE_MAC80211)
  1124. #ifdef CONFIG_BEAMFORMING
  1125. enum beamforming_cap beamform_cap;
  1126. void *adapter = dm->adapter;
  1127. #if (BEAMFORMING_SUPPORT == 1)
  1128. beamform_cap =
  1129. phydm_beamforming_get_entry_beam_cap_by_mac_id(dm, mac_id);
  1130. #else/*@for drv beamforming*/
  1131. beamform_cap =
  1132. beamforming_get_entry_beam_cap_by_mac_id(&adapter->mlmepriv, mac_id);
  1133. #endif
  1134. if (beamform_cap & (BEAMFORMER_CAP_HT_EXPLICIT | BEAMFORMER_CAP_VHT_SU))
  1135. txbf_en = true;
  1136. else
  1137. txbf_en = false;
  1138. #endif /*@#ifdef CONFIG_BEAMFORMING*/
  1139. #elif (DM_ODM_SUPPORT_TYPE & ODM_AP)
  1140. #if (BEAMFORMING_SUPPORT == 1)
  1141. u8 idx = 0xff;
  1142. boolean act_bfer = false;
  1143. BEAMFORMING_CAP beamform_cap = BEAMFORMING_CAP_NONE;
  1144. PRT_BEAMFORMING_ENTRY entry = NULL;
  1145. struct rtl8192cd_priv *priv = dm->priv;
  1146. #if (defined(CONFIG_PHYDM_ANTENNA_DIVERSITY))
  1147. struct _BF_DIV_COEX_ *dm_bdc_table = &dm->dm_bdc_table;
  1148. dm_bdc_table->num_txbfee_client = 0;
  1149. dm_bdc_table->num_txbfer_client = 0;
  1150. #endif
  1151. #endif
  1152. #if (BEAMFORMING_SUPPORT == 1)
  1153. beamform_cap = Beamforming_GetEntryBeamCapByMacId(priv, mac_id);
  1154. entry = Beamforming_GetEntryByMacId(priv, mac_id, &idx);
  1155. if (beamform_cap & (BEAMFORMER_CAP_HT_EXPLICIT | BEAMFORMER_CAP_VHT_SU)) {
  1156. if (entry->Sounding_En)
  1157. txbf_en = true;
  1158. else
  1159. txbf_en = false;
  1160. act_bfer = true;
  1161. }
  1162. #if (defined(CONFIG_PHYDM_ANTENNA_DIVERSITY)) /*@BDC*/
  1163. if (act_bfer == true) {
  1164. dm_bdc_table->w_bfee_client[i] = true; /* @AP act as BFer */
  1165. dm_bdc_table->num_txbfee_client++;
  1166. } else
  1167. dm_bdc_table->w_bfee_client[i] = false; /* @AP act as BFer */
  1168. if (beamform_cap & (BEAMFORMEE_CAP_HT_EXPLICIT | BEAMFORMEE_CAP_VHT_SU)) {
  1169. dm_bdc_table->w_bfer_client[i] = true; /* @AP act as BFee */
  1170. dm_bdc_table->num_txbfer_client++;
  1171. } else
  1172. dm_bdc_table->w_bfer_client[i] = false; /* @AP act as BFer */
  1173. #endif
  1174. #endif
  1175. #endif
  1176. return txbf_en;
  1177. }
  1178. #endif
  1179. void phydm_iqk_wait(struct dm_struct *dm, u32 timeout)
  1180. {
  1181. #if (DM_ODM_SUPPORT_TYPE == ODM_CE)
  1182. #if (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
  1183. PHYDM_DBG(dm, DBG_CMN, "Not support for CE MAC80211 driver!\n");
  1184. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
  1185. #else
  1186. void *adapter = dm->adapter;
  1187. rtl8812_iqk_wait(adapter, timeout);
  1188. #endif
  1189. #endif
  1190. }
  1191. u8 phydm_get_hwrate_to_mrate(struct dm_struct *dm, u8 rate)
  1192. {
  1193. #if (DM_ODM_SUPPORT_TYPE == ODM_IOT)
  1194. return HwRateToMRate(rate);
  1195. #endif
  1196. return 0;
  1197. }
  1198. void phydm_set_crystalcap(struct dm_struct *dm, u8 crystal_cap)
  1199. {
  1200. #if (DM_ODM_SUPPORT_TYPE == ODM_IOT)
  1201. ROM_odm_SetCrystalCap(dm, crystal_cap);
  1202. #endif
  1203. }
  1204. void phydm_run_in_thread_cmd(struct dm_struct *dm, void (*func)(void *),
  1205. void *context)
  1206. {
  1207. #if (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
  1208. PHYDM_DBG(dm, DBG_CMN, "Not support for CE MAC80211 driver!\n");
  1209. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
  1210. void *adapter = dm->adapter;
  1211. rtw_run_in_thread_cmd(adapter, func, context);
  1212. #endif
  1213. }