phydm_smt_ant.c 71 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253
  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. * when antenna test utility is on or some testing need to disable antenna diversity
  32. * call this function to disable all ODM related mechanisms which will switch antenna.
  33. ******************************************************/
  34. #if (defined(CONFIG_SMART_ANTENNA))
  35. #ifdef PHYDM_IC_JGR3_SERIES_SUPPORT
  36. #if (RTL8198F_SUPPORT == 1)
  37. void phydm_smt_ant_init_98f(void *dm_void)
  38. {
  39. struct dm_struct *dm = (struct dm_struct *)dm_void;
  40. u32 val = 0;
  41. #if 0
  42. odm_set_bb_reg(dm, R_0x1da4, 0x3c, 4); /*6.25*4 = 25ms*/
  43. odm_set_bb_reg(dm, R_0x1da4, BIT(6), 1);
  44. odm_set_bb_reg(dm, R_0x1da4, BIT(7), 1);
  45. #endif
  46. }
  47. #endif
  48. #endif
  49. #if (defined(CONFIG_CUMITEK_SMART_ANTENNA))
  50. void phydm_cumitek_smt_ant_mapping_table_8822b(
  51. void *dm_void,
  52. u8 *table_path_a,
  53. u8 *table_path_b)
  54. {
  55. struct dm_struct *dm = (struct dm_struct *)dm_void;
  56. u32 path_a_0to3_idx = 0;
  57. u32 path_b_0to3_idx = 0;
  58. u32 path_a_4to7_idx = 0;
  59. u32 path_b_4to7_idx = 0;
  60. path_a_0to3_idx = ((table_path_a[3] & 0xf) << 24) | ((table_path_a[2] & 0xf) << 16) | ((table_path_a[1] & 0xf) << 8) | (table_path_a[0] & 0xf);
  61. path_b_0to3_idx = ((table_path_b[3] & 0xf) << 28) | ((table_path_b[2] & 0xf) << 20) | ((table_path_b[1] & 0xf) << 12) | ((table_path_b[0] & 0xf) << 4);
  62. path_a_4to7_idx = ((table_path_a[7] & 0xf) << 24) | ((table_path_a[6] & 0xf) << 16) | ((table_path_a[5] & 0xf) << 8) | (table_path_a[4] & 0xf);
  63. path_b_4to7_idx = ((table_path_b[7] & 0xf) << 28) | ((table_path_b[6] & 0xf) << 20) | ((table_path_b[5] & 0xf) << 12) | ((table_path_b[4] & 0xf) << 4);
  64. #if 0
  65. /*PHYDM_DBG(dm, DBG_SMT_ANT, "mapping table{A, B} = {0x%x, 0x%x}\n", path_a_0to3_idx, path_b_0to3_idx);*/
  66. #endif
  67. /*pathA*/
  68. odm_set_bb_reg(dm, R_0xca4, MASKDWORD, path_a_0to3_idx); /*@ant map 1*/
  69. odm_set_bb_reg(dm, R_0xca8, MASKDWORD, path_a_4to7_idx); /*@ant map 2*/
  70. /*pathB*/
  71. odm_set_bb_reg(dm, R_0xea4, MASKDWORD, path_b_0to3_idx); /*@ant map 1*/
  72. odm_set_bb_reg(dm, R_0xea8, MASKDWORD, path_b_4to7_idx); /*@ant map 2*/
  73. }
  74. void phydm_cumitek_smt_ant_init_8822b(
  75. void *dm_void)
  76. {
  77. struct dm_struct *dm = (struct dm_struct *)dm_void;
  78. struct smt_ant *smtant_table = &dm->smtant_table;
  79. struct smt_ant_cumitek *cumi_smtant_table = &dm->smtant_table.cumi_smtant_table;
  80. u32 value32;
  81. PHYDM_DBG(dm, DBG_SMT_ANT, "[8822B Cumitek SmtAnt Int]\n");
  82. /*@========= MAC GPIO setting =================================*/
  83. /* Pin, pin_name, RFE_CTRL_NUM*/
  84. /* @A0, 55, 5G_TRSW, 3*/
  85. /* @A1, 52, 5G_TRSW, 0*/
  86. /* @A2, 25, 5G_TRSW, 8*/
  87. /* @B0, 16, 5G_TRSW, 4*/
  88. /* @B1, 13, 5G_TRSW, 11*/
  89. /* @B2, 24, 5G_TRSW, 9*/
  90. /*@for RFE_CTRL 8 & 9*/
  91. odm_set_mac_reg(dm, R_0x4c, BIT(24) | BIT(23), 2);
  92. odm_set_mac_reg(dm, R_0x44, BIT(27) | BIT(26), 0);
  93. /*@for RFE_CTRL 0*/
  94. odm_set_mac_reg(dm, R_0x4c, BIT(25), 0);
  95. odm_set_mac_reg(dm, R_0x64, BIT(29), 1);
  96. /*@for RFE_CTRL 2 & 3*/
  97. odm_set_mac_reg(dm, R_0x4c, BIT(26), 0);
  98. odm_set_mac_reg(dm, R_0x64, BIT(28), 1);
  99. /*@for RFE_CTRL 11*/
  100. odm_set_mac_reg(dm, R_0x40, BIT(3), 1);
  101. /*@0x604[25]=1 : 2bit mode for pathA&B&C&D*/
  102. /*@0x604[25]=0 : 3bit mode for pathA&B*/
  103. smtant_table->tx_desc_mode = 0;
  104. odm_set_mac_reg(dm, R_0x604, BIT(25), (u32)smtant_table->tx_desc_mode);
  105. /*@========= BB RFE setting =================================*/
  106. #if 0
  107. /*path A*/
  108. odm_set_bb_reg(dm, R_0x1990, BIT(3), 0); /*RFE_CTRL_3*/ /*A_0*/
  109. odm_set_bb_reg(dm, R_0xcbc, BIT(3), 0); /*@inv*/
  110. odm_set_bb_reg(dm, R_0xcb0, 0xf000, 8);
  111. odm_set_bb_reg(dm, R_0x1990, BIT(0), 0); /*RFE_CTRL_0*/ /*A_1*/
  112. odm_set_bb_reg(dm, R_0xcbc, BIT(0), 0); /*@inv*/
  113. odm_set_bb_reg(dm, R_0xcb0, 0xf, 0x9);
  114. odm_set_bb_reg(dm, R_0x1990, BIT(8), 0); /*RFE_CTRL_8*/ /*A_2*/
  115. odm_set_bb_reg(dm, R_0xcbc, BIT(8), 0); /*@inv*/
  116. odm_set_bb_reg(dm, R_0xcb4, 0xf, 0xa);
  117. /*path B*/
  118. odm_set_bb_reg(dm, R_0x1990, BIT(4), 1); /*RFE_CTRL_4*/ /*B_0*/
  119. odm_set_bb_reg(dm, R_0xdbc, BIT(4), 0); /*@inv*/
  120. odm_set_bb_reg(dm, R_0xdb0, 0xf0000, 0xb);
  121. odm_set_bb_reg(dm, R_0x1990, BIT(11), 1); /*RFE_CTRL_11*/ /*B_1*/
  122. odm_set_bb_reg(dm, R_0xdbc, BIT(11), 0); /*@inv*/
  123. odm_set_bb_reg(dm, R_0xdb4, 0xf000, 0xc);
  124. odm_set_bb_reg(dm, R_0x1990, BIT(9), 1); /*RFE_CTRL_9*/ /*B_2*/
  125. odm_set_bb_reg(dm, R_0xdbc, BIT(9), 0); /*@inv*/
  126. odm_set_bb_reg(dm, R_0xdb4, 0xf0, 0xd);
  127. #endif
  128. /*@========= BB SmtAnt setting =================================*/
  129. odm_set_mac_reg(dm, R_0x6d8, BIT(22) | BIT(21), 2); /*resp tx by register*/
  130. odm_set_mac_reg(dm, R_0x668, BIT(3), 1);
  131. odm_set_bb_reg(dm, R_0x804, BIT(4), 0); /*@lathch antsel*/
  132. odm_set_bb_reg(dm, R_0x818, 0xf00000, 0); /*@keep tx by rx*/
  133. odm_set_bb_reg(dm, R_0x900, BIT(19), 0); /*@fast train*/
  134. odm_set_bb_reg(dm, R_0x900, BIT(18), 1); /*@1: by TXDESC*/
  135. /*pathA*/
  136. odm_set_bb_reg(dm, R_0xca4, MASKDWORD, 0x03020100); /*@ant map 1*/
  137. odm_set_bb_reg(dm, R_0xca8, MASKDWORD, 0x07060504); /*@ant map 2*/
  138. odm_set_bb_reg(dm, R_0xcac, BIT(9), 0); /*@keep antsel map by GNT_BT*/
  139. /*pathB*/
  140. odm_set_bb_reg(dm, R_0xea4, MASKDWORD, 0x30201000); /*@ant map 1*/
  141. odm_set_bb_reg(dm, R_0xea8, MASKDWORD, 0x70605040); /*@ant map 2*/
  142. odm_set_bb_reg(dm, R_0xeac, BIT(9), 0); /*@keep antsel map by GNT_BT*/
  143. }
  144. void phydm_cumitek_smt_ant_init_8197f(
  145. void *dm_void)
  146. {
  147. struct dm_struct *dm = (struct dm_struct *)dm_void;
  148. struct smt_ant *smtant_table = &dm->smtant_table;
  149. struct smt_ant_cumitek *cumi_smtant_table = &dm->smtant_table.cumi_smtant_table;
  150. u32 value32;
  151. PHYDM_DBG(dm, DBG_SMT_ANT, "[8197F Cumitek SmtAnt Int]\n");
  152. /*@GPIO setting*/
  153. }
  154. void phydm_cumitek_smt_ant_init_8192f(
  155. void *dm_void)
  156. {
  157. struct dm_struct *dm = (struct dm_struct *)dm_void;
  158. struct smt_ant *smtant_table = &dm->smtant_table;
  159. struct smt_ant_cumitek *cumi_smtant_table = &dm->smtant_table.cumi_smtant_table;
  160. u32 value32;
  161. PHYDM_DBG(dm, DBG_SMT_ANT, "[8192F Cumitek SmtAnt Int]\n");
  162. /*@GPIO setting*/
  163. }
  164. void phydm_cumitek_smt_tx_ant_update(
  165. void *dm_void,
  166. u8 tx_ant_idx_path_a,
  167. u8 tx_ant_idx_path_b,
  168. u32 mac_id)
  169. {
  170. struct dm_struct *dm = (struct dm_struct *)dm_void;
  171. struct smt_ant *smtant_table = &dm->smtant_table;
  172. struct smt_ant_cumitek *cumi_smtant_table = &dm->smtant_table.cumi_smtant_table;
  173. PHYDM_DBG(dm, DBG_ANT_DIV,
  174. "[Cumitek] Set TX-ANT[%d] = (( A:0x%x , B:0x%x ))\n", mac_id,
  175. tx_ant_idx_path_a, tx_ant_idx_path_b);
  176. /*path-A*/
  177. cumi_smtant_table->tx_ant_idx[0][mac_id] = tx_ant_idx_path_a; /*@fill this value into TXDESC*/
  178. /*path-B*/
  179. cumi_smtant_table->tx_ant_idx[1][mac_id] = tx_ant_idx_path_b; /*@fill this value into TXDESC*/
  180. }
  181. void phydm_cumitek_smt_rx_default_ant_update(
  182. void *dm_void,
  183. u8 rx_ant_idx_path_a,
  184. u8 rx_ant_idx_path_b)
  185. {
  186. struct dm_struct *dm = (struct dm_struct *)dm_void;
  187. struct smt_ant *smtant_table = &dm->smtant_table;
  188. struct smt_ant_cumitek *cumi_smtant_table = &dm->smtant_table.cumi_smtant_table;
  189. PHYDM_DBG(dm, DBG_ANT_DIV,
  190. "[Cumitek] Set RX-ANT = (( A:0x%x, B:0x%x ))\n",
  191. rx_ant_idx_path_a, rx_ant_idx_path_b);
  192. /*path-A*/
  193. if (cumi_smtant_table->rx_default_ant_idx[0] != rx_ant_idx_path_a) {
  194. #if (RTL8822B_SUPPORT == 1)
  195. if (dm->support_ic_type == ODM_RTL8822B) {
  196. odm_set_bb_reg(dm, R_0xc08, BIT(21) | BIT(20) | BIT(19), rx_ant_idx_path_a); /*@default RX antenna*/
  197. odm_set_mac_reg(dm, R_0x6d8, BIT(2) | BIT(1) | BIT(0), rx_ant_idx_path_a); /*@default response TX antenna*/
  198. }
  199. #endif
  200. #if (RTL8197F_SUPPORT == 1)
  201. if (dm->support_ic_type == ODM_RTL8197F) {
  202. }
  203. #endif
  204. /*@jj add 20170822*/
  205. #if (RTL8192F_SUPPORT == 1)
  206. if (dm->support_ic_type == ODM_RTL8192F) {
  207. }
  208. #endif
  209. cumi_smtant_table->rx_default_ant_idx[0] = rx_ant_idx_path_a;
  210. }
  211. /*path-B*/
  212. if (cumi_smtant_table->rx_default_ant_idx[1] != rx_ant_idx_path_b) {
  213. #if (RTL8822B_SUPPORT == 1)
  214. if (dm->support_ic_type == ODM_RTL8822B) {
  215. odm_set_bb_reg(dm, R_0xe08, BIT(21) | BIT(20) | BIT(19), rx_ant_idx_path_b); /*@default antenna*/
  216. odm_set_mac_reg(dm, R_0x6d8, BIT(5) | BIT(4) | BIT(3), rx_ant_idx_path_b); /*@default response TX antenna*/
  217. }
  218. #endif
  219. #if (RTL8197F_SUPPORT == 1)
  220. if (dm->support_ic_type == ODM_RTL8197F) {
  221. }
  222. #endif
  223. /*@jj add 20170822*/
  224. #if (RTL8192F_SUPPORT == 1)
  225. if (dm->support_ic_type == ODM_RTL8192F) {
  226. }
  227. #endif
  228. cumi_smtant_table->rx_default_ant_idx[1] = rx_ant_idx_path_b;
  229. }
  230. }
  231. void phydm_cumitek_smt_ant_debug(
  232. void *dm_void,
  233. char input[][16],
  234. u32 *_used,
  235. char *output,
  236. u32 *_out_len)
  237. {
  238. struct dm_struct *dm = (struct dm_struct *)dm_void;
  239. struct smt_ant *smtant_table = &dm->smtant_table;
  240. struct smt_ant_cumitek *cumi_smtant_table = &dm->smtant_table.cumi_smtant_table;
  241. u32 used = *_used;
  242. u32 out_len = *_out_len;
  243. char help[] = "-h";
  244. u32 dm_value[10] = {0};
  245. u8 i;
  246. PHYDM_SSCANF(input[1], DCMD_DECIMAL, &dm_value[0]);
  247. if (strcmp(input[1], help) == 0) {
  248. PDM_SNPF(out_len, used, output + used, out_len - used,
  249. "{1} {PathA rx_ant_idx} {pathB rx_ant_idx}\n");
  250. PDM_SNPF(out_len, used, output + used, out_len - used,
  251. "{2} {PathA tx_ant_idx} {pathB tx_ant_idx} {macid}\n");
  252. PDM_SNPF(out_len, used, output + used, out_len - used,
  253. "{3} {PathA mapping table} {PathB mapping table}\n");
  254. PDM_SNPF(out_len, used, output + used, out_len - used,
  255. "{4} {txdesc_mode 0:3bit, 1:2bit}\n");
  256. } else if (dm_value[0] == 1) { /*@fix rx_idle pattern*/
  257. PHYDM_SSCANF(input[2], DCMD_DECIMAL, &dm_value[1]);
  258. PHYDM_SSCANF(input[3], DCMD_DECIMAL, &dm_value[2]);
  259. phydm_cumitek_smt_rx_default_ant_update(dm, (u8)dm_value[1], (u8)dm_value[2]);
  260. PDM_SNPF(out_len, used, output + used, out_len - used,
  261. "RX Ant{A, B}={%d, %d}\n", dm_value[1], dm_value[2]);
  262. } else if (dm_value[0] == 2) { /*@fix tx pattern*/
  263. for (i = 1; i < 4; i++) {
  264. if (input[i + 1])
  265. PHYDM_SSCANF(input[i + 1], DCMD_DECIMAL, &dm_value[i]);
  266. }
  267. PDM_SNPF(out_len, used, output + used, out_len - used,
  268. "STA[%d] TX Ant{A, B}={%d, %d}\n", dm_value[3],
  269. dm_value[1], dm_value[2]);
  270. phydm_cumitek_smt_tx_ant_update(dm, (u8)dm_value[1], (u8)dm_value[2], (u8)dm_value[3]);
  271. } else if (dm_value[0] == 3) {
  272. u8 table_path_a[8] = {0};
  273. u8 table_path_b[8] = {0};
  274. for (i = 1; i < 4; i++) {
  275. if (input[i + 1])
  276. PHYDM_SSCANF(input[i + 1], DCMD_HEX, &dm_value[i]);
  277. }
  278. PDM_SNPF(out_len, used, output + used, out_len - used,
  279. "Set Path-AB mapping table={%d, %d}\n", dm_value[1],
  280. dm_value[2]);
  281. for (i = 0; i < 8; i++) {
  282. table_path_a[i] = (u8)((dm_value[1] >> (4 * i)) & 0xf);
  283. table_path_b[i] = (u8)((dm_value[2] >> (4 * i)) & 0xf);
  284. }
  285. PDM_SNPF(out_len, used, output + used, out_len - used,
  286. "Ant_Table_A[7:0]={0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x}\n",
  287. table_path_a[7], table_path_a[6], table_path_a[5],
  288. table_path_a[4], table_path_a[3], table_path_a[2],
  289. table_path_a[1], table_path_a[0]);
  290. PDM_SNPF(out_len, used, output + used, out_len - used,
  291. "Ant_Table_B[7:0]={0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x}\n",
  292. table_path_b[7], table_path_b[6], table_path_b[5],
  293. table_path_b[4], table_path_b[3], table_path_b[2],
  294. table_path_b[1], table_path_b[0]);
  295. phydm_cumitek_smt_ant_mapping_table_8822b(dm, &table_path_a[0], &table_path_b[0]);
  296. } else if (dm_value[0] == 4) {
  297. smtant_table->tx_desc_mode = (u8)dm_value[1];
  298. odm_set_mac_reg(dm, R_0x604, BIT(25), (u32)smtant_table->tx_desc_mode);
  299. }
  300. *_used = used;
  301. *_out_len = out_len;
  302. }
  303. #endif
  304. #if (defined(CONFIG_HL_SMART_ANTENNA))
  305. #ifdef CONFIG_HL_SMART_ANTENNA_TYPE2
  306. #if (RTL8822B_SUPPORT == 1)
  307. void phydm_hl_smart_ant_type2_init_8822b(
  308. void *dm_void)
  309. {
  310. struct dm_struct *dm = (struct dm_struct *)dm_void;
  311. struct smt_ant_honbo *sat_tab = &dm->dm_sat_table;
  312. struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;
  313. u8 j;
  314. u8 rfu_codeword_table_init_2g[SUPPORT_BEAM_SET_PATTERN_NUM][MAX_PATH_NUM_8822B] = {
  315. {1, 1}, /*@0*/
  316. {1, 2},
  317. {2, 1},
  318. {2, 2},
  319. {4, 0},
  320. {5, 0},
  321. {6, 0},
  322. {7, 0},
  323. {8, 0}, /*@8*/
  324. {9, 0},
  325. {0xa, 0},
  326. {0xb, 0},
  327. {0xc, 0},
  328. {0xd, 0},
  329. {0xe, 0},
  330. {0xf, 0}};
  331. u8 rfu_codeword_table_init_5g[SUPPORT_BEAM_SET_PATTERN_NUM][MAX_PATH_NUM_8822B] = {
  332. #if 1
  333. {9, 1}, /*@0*/
  334. {9, 9},
  335. {1, 9},
  336. {9, 6},
  337. {2, 1},
  338. {2, 9},
  339. {9, 2},
  340. {2, 2}, /*@8*/
  341. {6, 1},
  342. {6, 9},
  343. {2, 9},
  344. {2, 2},
  345. {6, 2},
  346. {6, 6},
  347. {2, 6},
  348. {1, 1}
  349. #else
  350. {1, 1}, /*@0*/
  351. {9, 1},
  352. {9, 9},
  353. {1, 9},
  354. {1, 2},
  355. {9, 2},
  356. {9, 6},
  357. {1, 6},
  358. {2, 1}, /*@8*/
  359. {6, 1},
  360. {6, 9},
  361. {2, 9},
  362. {2, 2},
  363. {6, 2},
  364. {6, 6},
  365. {2, 6}
  366. #endif
  367. };
  368. PHYDM_DBG(dm, DBG_ANT_DIV,
  369. "***RTK 8822B SmartAnt_Init: Hong-Bo SmrtAnt Type2]\n");
  370. /* @---------------------------------------- */
  371. /* @GPIO 0-1 for Beam control */
  372. /* reg0x66[2:0]=0 */
  373. /* reg0x44[25:24] = 0 */
  374. /* reg0x44[23:16] enable_output for P_GPIO[7:0] */
  375. /* reg0x44[15:8] output_value for P_GPIO[7:0] */
  376. /* reg0x40[1:0] = 0 GPIO function */
  377. /* @------------------------------------------ */
  378. odm_move_memory(dm, sat_tab->rfu_codeword_table_2g, rfu_codeword_table_init_2g, (SUPPORT_BEAM_SET_PATTERN_NUM * MAX_PATH_NUM_8822B));
  379. odm_move_memory(dm, sat_tab->rfu_codeword_table_5g, rfu_codeword_table_init_5g, (SUPPORT_BEAM_SET_PATTERN_NUM * MAX_PATH_NUM_8822B));
  380. /*@GPIO setting*/
  381. odm_set_mac_reg(dm, R_0x64, (BIT(18) | BIT(17) | BIT(16)), 0);
  382. odm_set_mac_reg(dm, R_0x44, BIT(25) | BIT(24), 0); /*@config P_GPIO[3:2] to data port*/
  383. odm_set_mac_reg(dm, R_0x44, BIT(17) | BIT(16), 0x3); /*@enable_output for P_GPIO[3:2]*/
  384. #if 0
  385. /*odm_set_mac_reg(dm, R_0x44, BIT(9)|BIT(8), 0);*/ /*P_GPIO[3:2] output value*/
  386. #endif
  387. odm_set_mac_reg(dm, R_0x40, BIT(1) | BIT(0), 0); /*@GPIO function*/
  388. /*@Hong_lin smart antenna HW setting*/
  389. sat_tab->rfu_protocol_type = 2;
  390. sat_tab->rfu_protocol_delay_time = 45;
  391. sat_tab->rfu_codeword_total_bit_num = 16; /*@max=32bit*/
  392. sat_tab->rfu_each_ant_bit_num = 4;
  393. sat_tab->total_beam_set_num = 4;
  394. sat_tab->total_beam_set_num_2g = 4;
  395. sat_tab->total_beam_set_num_5g = 8;
  396. #if DEV_BUS_TYPE == RT_SDIO_INTERFACE
  397. sat_tab->latch_time = 100; /*@mu sec*/
  398. #elif DEV_BUS_TYPE == RT_USB_INTERFACE
  399. sat_tab->latch_time = 100; /*@mu sec*/
  400. #endif
  401. sat_tab->pkt_skip_statistic_en = 0;
  402. sat_tab->ant_num = 2;
  403. sat_tab->ant_num_total = MAX_PATH_NUM_8822B;
  404. sat_tab->first_train_ant = MAIN_ANT;
  405. sat_tab->fix_beam_pattern_en = 0;
  406. sat_tab->decision_holding_period = 0;
  407. /*@beam training setting*/
  408. sat_tab->pkt_counter = 0;
  409. sat_tab->per_beam_training_pkt_num = 10;
  410. /*set default beam*/
  411. sat_tab->fast_training_beam_num = 0;
  412. sat_tab->pre_fast_training_beam_num = sat_tab->fast_training_beam_num;
  413. for (j = 0; j < SUPPORT_BEAM_SET_PATTERN_NUM; j++) {
  414. sat_tab->beam_set_avg_rssi_pre[j] = 0;
  415. sat_tab->beam_set_train_val_diff[j] = 0;
  416. sat_tab->beam_set_train_cnt[j] = 0;
  417. }
  418. phydm_set_rfu_beam_pattern_type2(dm);
  419. fat_tab->fat_state = FAT_BEFORE_LINK_STATE;
  420. }
  421. #endif
  422. u32 phydm_construct_hb_rfu_codeword_type2(
  423. void *dm_void,
  424. u32 beam_set_idx)
  425. {
  426. struct dm_struct *dm = (struct dm_struct *)dm_void;
  427. struct smt_ant_honbo *sat_tab = &dm->dm_sat_table;
  428. u32 sync_codeword = 0x7f;
  429. u32 codeword = 0;
  430. u32 data_tmp = 0;
  431. u32 i;
  432. for (i = 0; i < sat_tab->ant_num_total; i++) {
  433. if (*dm->band_type == ODM_BAND_5G)
  434. data_tmp = sat_tab->rfu_codeword_table_5g[beam_set_idx][i];
  435. else
  436. data_tmp = sat_tab->rfu_codeword_table_2g[beam_set_idx][i];
  437. codeword |= (data_tmp << (i * sat_tab->rfu_each_ant_bit_num));
  438. }
  439. codeword = (codeword << 8) | sync_codeword;
  440. return codeword;
  441. }
  442. void phydm_update_beam_pattern_type2(
  443. void *dm_void,
  444. u32 codeword,
  445. u32 codeword_length)
  446. {
  447. struct dm_struct *dm = (struct dm_struct *)dm_void;
  448. struct smt_ant_honbo *sat_tab = &dm->dm_sat_table;
  449. u8 i;
  450. boolean beam_ctrl_signal;
  451. u32 one = 0x1;
  452. u32 reg44_tmp_p, reg44_tmp_n, reg44_ori;
  453. u8 devide_num = 4;
  454. PHYDM_DBG(dm, DBG_ANT_DIV, "Set codeword = ((0x%x))\n", codeword);
  455. reg44_ori = odm_get_mac_reg(dm, R_0x44, MASKDWORD);
  456. reg44_tmp_p = reg44_ori;
  457. #if 0
  458. /*PHYDM_DBG(dm, DBG_ANT_DIV, "reg44_ori =0x%x\n", reg44_ori);*/
  459. #endif
  460. /*@devide_num = (sat_tab->rfu_protocol_type == 2) ? 8 : 4;*/
  461. for (i = 0; i <= (codeword_length - 1); i++) {
  462. beam_ctrl_signal = (boolean)((codeword & BIT(i)) >> i);
  463. #if 1
  464. if (dm->debug_components & DBG_ANT_DIV) {
  465. if (i == (codeword_length - 1))
  466. pr_debug("%d ]\n", beam_ctrl_signal);
  467. else if (i == 0)
  468. pr_debug("Start sending codeword[1:%d] ---> [ %d ", codeword_length, beam_ctrl_signal);
  469. else if ((i % devide_num) == (devide_num - 1))
  470. pr_debug("%d | ", beam_ctrl_signal);
  471. else
  472. pr_debug("%d ", beam_ctrl_signal);
  473. }
  474. #endif
  475. if (dm->support_ic_type == ODM_RTL8821) {
  476. #if (RTL8821A_SUPPORT == 1)
  477. reg44_tmp_p = reg44_ori & (~(BIT(11) | BIT(10))); /*@clean bit 10 & 11*/
  478. reg44_tmp_p |= ((1 << 11) | (beam_ctrl_signal << 10));
  479. reg44_tmp_n = reg44_ori & (~(BIT(11) | BIT(10)));
  480. #if 0
  481. /*PHYDM_DBG(dm, DBG_ANT_DIV, "reg44_tmp_p =(( 0x%x )), reg44_tmp_n = (( 0x%x ))\n", reg44_tmp_p, reg44_tmp_n);*/
  482. #endif
  483. odm_set_mac_reg(dm, R_0x44, MASKDWORD, reg44_tmp_p);
  484. odm_set_mac_reg(dm, R_0x44, MASKDWORD, reg44_tmp_n);
  485. #endif
  486. }
  487. #if (RTL8822B_SUPPORT == 1)
  488. else if (dm->support_ic_type == ODM_RTL8822B) {
  489. if (sat_tab->rfu_protocol_type == 2) {
  490. reg44_tmp_p = reg44_tmp_p & ~(BIT(8)); /*@clean bit 8*/
  491. reg44_tmp_p = reg44_tmp_p ^ BIT(9); /*@get new clk high/low, exclusive-or*/
  492. reg44_tmp_p |= (beam_ctrl_signal << 8);
  493. odm_set_mac_reg(dm, R_0x44, MASKDWORD, reg44_tmp_p);
  494. ODM_delay_us(sat_tab->rfu_protocol_delay_time);
  495. #if 0
  496. /*PHYDM_DBG(dm, DBG_ANT_DIV, "reg44 =(( 0x%x )), reg44[9:8] = ((%x)), beam_ctrl_signal =((%x))\n", reg44_tmp_p, ((reg44_tmp_p & 0x300)>>8), beam_ctrl_signal);*/
  497. #endif
  498. } else {
  499. reg44_tmp_p = reg44_ori & (~(BIT(9) | BIT(8))); /*@clean bit 9 & 8*/
  500. reg44_tmp_p |= ((1 << 9) | (beam_ctrl_signal << 8));
  501. reg44_tmp_n = reg44_ori & (~(BIT(9) | BIT(8)));
  502. #if 0
  503. /*PHYDM_DBG(dm, DBG_ANT_DIV, "reg44_tmp_p =(( 0x%x )), reg44_tmp_n = (( 0x%x ))\n", reg44_tmp_p, reg44_tmp_n); */
  504. #endif
  505. odm_set_mac_reg(dm, R_0x44, MASKDWORD, reg44_tmp_p);
  506. ODM_delay_us(10);
  507. odm_set_mac_reg(dm, R_0x44, MASKDWORD, reg44_tmp_n);
  508. ODM_delay_us(10);
  509. }
  510. }
  511. #endif
  512. }
  513. }
  514. void phydm_update_rx_idle_beam_type2(
  515. void *dm_void)
  516. {
  517. struct dm_struct *dm = (struct dm_struct *)dm_void;
  518. struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;
  519. struct smt_ant_honbo *sat_tab = &dm->dm_sat_table;
  520. u32 i;
  521. sat_tab->update_beam_codeword = phydm_construct_hb_rfu_codeword_type2(dm, sat_tab->rx_idle_beam_set_idx);
  522. PHYDM_DBG(dm, DBG_ANT_DIV,
  523. "[ Update Rx-Idle-Beam ] BeamSet idx = ((%d))\n",
  524. sat_tab->rx_idle_beam_set_idx);
  525. #if DEV_BUS_TYPE == RT_PCI_INTERFACE
  526. phydm_update_beam_pattern_type2(dm, sat_tab->update_beam_codeword, sat_tab->rfu_codeword_total_bit_num);
  527. #else
  528. odm_schedule_work_item(&sat_tab->hl_smart_antenna_workitem);
  529. #if 0
  530. /*odm_stall_execution(1);*/
  531. #endif
  532. #endif
  533. sat_tab->pre_codeword = sat_tab->update_beam_codeword;
  534. }
  535. void phydm_hl_smt_ant_dbg_type2(
  536. void *dm_void,
  537. char input[][16],
  538. u32 *_used,
  539. char *output,
  540. u32 *_out_len
  541. )
  542. {
  543. struct dm_struct *dm = (struct dm_struct *)dm_void;
  544. struct smt_ant_honbo *sat_tab = &dm->dm_sat_table;
  545. u32 used = *_used;
  546. u32 out_len = *_out_len;
  547. u32 one = 0x1;
  548. u32 codeword_length = sat_tab->rfu_codeword_total_bit_num;
  549. u32 beam_ctrl_signal, i;
  550. u8 devide_num = 4;
  551. char help[] = "-h";
  552. u32 dm_value[10] = {0};
  553. PHYDM_SSCANF(input[1], DCMD_DECIMAL, &dm_value[0]);
  554. PHYDM_SSCANF(input[2], DCMD_DECIMAL, &dm_value[1]);
  555. PHYDM_SSCANF(input[3], DCMD_DECIMAL, &dm_value[2]);
  556. PHYDM_SSCANF(input[4], DCMD_DECIMAL, &dm_value[3]);
  557. PHYDM_SSCANF(input[5], DCMD_DECIMAL, &dm_value[4]);
  558. if (strcmp(input[1], help) == 0) {
  559. PDM_SNPF(out_len, used, output + used, out_len - used,
  560. " 1 {fix_en} {codeword(Hex)}\n");
  561. PDM_SNPF(out_len, used, output + used, out_len - used,
  562. " 3 {Fix_training_num_en} {Per_beam_training_pkt_num} {Decision_holding_period}\n");
  563. PDM_SNPF(out_len, used, output + used, out_len - used,
  564. " 5 {0:show, 1:2G, 2:5G} {beam_num} {idxA(Hex)} {idxB(Hex)}\n");
  565. PDM_SNPF(out_len, used, output + used, out_len - used,
  566. " 7 {0:show, 1:2G, 2:5G} {total_beam_set_num}\n");
  567. PDM_SNPF(out_len, used, output + used, out_len - used,
  568. " 8 {0:show, 1:set} {RFU delay time(us)}\n");
  569. } else if (dm_value[0] == 1) { /*@fix beam pattern*/
  570. sat_tab->fix_beam_pattern_en = dm_value[1];
  571. if (sat_tab->fix_beam_pattern_en == 1) {
  572. PHYDM_SSCANF(input[3], DCMD_HEX, &dm_value[2]);
  573. sat_tab->fix_beam_pattern_codeword = dm_value[2];
  574. if (sat_tab->fix_beam_pattern_codeword > (one << codeword_length)) {
  575. PHYDM_DBG(dm, DBG_ANT_DIV,
  576. "[ SmartAnt ] Codeword overflow, Current codeword is ((0x%x)), and should be less than ((%d))bit\n",
  577. sat_tab->fix_beam_pattern_codeword,
  578. codeword_length);
  579. (sat_tab->fix_beam_pattern_codeword) &= 0xffffff;
  580. PHYDM_DBG(dm, DBG_ANT_DIV,
  581. "[ SmartAnt ] Auto modify to (0x%x)\n",
  582. sat_tab->fix_beam_pattern_codeword);
  583. }
  584. sat_tab->update_beam_codeword = sat_tab->fix_beam_pattern_codeword;
  585. /*@---------------------------------------------------------*/
  586. PDM_SNPF(out_len, used, output + used, out_len - used,
  587. "Fix Beam Pattern\n");
  588. /*@devide_num = (sat_tab->rfu_protocol_type == 2) ? 8 : 4;*/
  589. for (i = 0; i <= (codeword_length - 1); i++) {
  590. beam_ctrl_signal = (boolean)((sat_tab->update_beam_codeword & BIT(i)) >> i);
  591. if (i == (codeword_length - 1))
  592. PDM_SNPF(out_len, used,
  593. output + used,
  594. out_len - used,
  595. "%d]\n",
  596. beam_ctrl_signal);
  597. else if (i == 0)
  598. PDM_SNPF(out_len, used,
  599. output + used,
  600. out_len - used,
  601. "Send Codeword[1:%d] to RFU -> [%d",
  602. sat_tab->rfu_codeword_total_bit_num,
  603. beam_ctrl_signal);
  604. else if ((i % devide_num) == (devide_num - 1))
  605. PDM_SNPF(out_len, used,
  606. output + used,
  607. out_len - used, "%d|",
  608. beam_ctrl_signal);
  609. else
  610. PDM_SNPF(out_len, used,
  611. output + used,
  612. out_len - used, "%d",
  613. beam_ctrl_signal);
  614. }
  615. /*@---------------------------------------------------------*/
  616. #if DEV_BUS_TYPE == RT_PCI_INTERFACE
  617. phydm_update_beam_pattern_type2(dm, sat_tab->update_beam_codeword, sat_tab->rfu_codeword_total_bit_num);
  618. #else
  619. odm_schedule_work_item(&sat_tab->hl_smart_antenna_workitem);
  620. #if 0
  621. /*odm_stall_execution(1);*/
  622. #endif
  623. #endif
  624. } else if (sat_tab->fix_beam_pattern_en == 0)
  625. PDM_SNPF(out_len, used, output + used, out_len - used,
  626. "[ SmartAnt ] Smart Antenna: Enable\n");
  627. } else if (dm_value[0] == 2) { /*set latch time*/
  628. sat_tab->latch_time = dm_value[1];
  629. PHYDM_DBG(dm, DBG_ANT_DIV, "[ SmartAnt ] latch_time =0x%x\n",
  630. sat_tab->latch_time);
  631. } else if (dm_value[0] == 3) {
  632. sat_tab->fix_training_num_en = dm_value[1];
  633. if (sat_tab->fix_training_num_en == 1) {
  634. sat_tab->per_beam_training_pkt_num = (u8)dm_value[2];
  635. sat_tab->decision_holding_period = (u8)dm_value[3];
  636. PDM_SNPF(out_len, used, output + used, out_len - used,
  637. "[SmtAnt] Fix_train_en = (( %d )), train_pkt_num = (( %d )), holding_period = (( %d )),\n",
  638. sat_tab->fix_training_num_en,
  639. sat_tab->per_beam_training_pkt_num,
  640. sat_tab->decision_holding_period);
  641. } else if (sat_tab->fix_training_num_en == 0) {
  642. PDM_SNPF(out_len, used, output + used, out_len - used,
  643. "[ SmartAnt ] AUTO per_beam_training_pkt_num\n");
  644. }
  645. } else if (dm_value[0] == 4) {
  646. #if 0
  647. if (dm_value[1] == 1) {
  648. sat_tab->ant_num = 1;
  649. sat_tab->first_train_ant = MAIN_ANT;
  650. } else if (dm_value[1] == 2) {
  651. sat_tab->ant_num = 1;
  652. sat_tab->first_train_ant = AUX_ANT;
  653. } else if (dm_value[1] == 3) {
  654. sat_tab->ant_num = 2;
  655. sat_tab->first_train_ant = MAIN_ANT;
  656. }
  657. PDM_SNPF((output + used, out_len - used,
  658. "[ SmartAnt ] Set ant Num = (( %d )), first_train_ant = (( %d ))\n",
  659. sat_tab->ant_num, (sat_tab->first_train_ant - 1)));
  660. #endif
  661. } else if (dm_value[0] == 5) { /*set beam set table*/
  662. PHYDM_SSCANF(input[4], DCMD_HEX, &dm_value[3]);
  663. PHYDM_SSCANF(input[5], DCMD_HEX, &dm_value[4]);
  664. if (dm_value[1] == 1) { /*@2G*/
  665. if (dm_value[2] < SUPPORT_BEAM_SET_PATTERN_NUM) {
  666. sat_tab->rfu_codeword_table_2g[dm_value[2]][0] = (u8)dm_value[3];
  667. sat_tab->rfu_codeword_table_2g[dm_value[2]][1] = (u8)dm_value[4];
  668. PDM_SNPF(out_len, used, output + used,
  669. out_len - used,
  670. "[SmtAnt] Set 2G Table[%d] = [A:0x%x, B:0x%x]\n",
  671. dm_value[2], dm_value[3], dm_value[4]);
  672. }
  673. } else if (dm_value[1] == 2) { /*@5G*/
  674. if (dm_value[2] < SUPPORT_BEAM_SET_PATTERN_NUM) {
  675. sat_tab->rfu_codeword_table_5g[dm_value[2]][0] = (u8)dm_value[3];
  676. sat_tab->rfu_codeword_table_5g[dm_value[2]][1] = (u8)dm_value[4];
  677. PDM_SNPF(out_len, used, output + used,
  678. out_len - used,
  679. "[SmtAnt] Set5G Table[%d] = [A:0x%x, B:0x%x]\n",
  680. dm_value[2], dm_value[3], dm_value[4]);
  681. }
  682. } else if (dm_value[1] == 0) {
  683. PDM_SNPF(out_len, used, output + used, out_len - used,
  684. "[SmtAnt] 2G Beam Table==============>\n");
  685. for (i = 0; i < sat_tab->total_beam_set_num_2g; i++) {
  686. PDM_SNPF(out_len, used, output + used,
  687. out_len - used,
  688. "2G Table[%d] = [A:0x%x, B:0x%x]\n", i,
  689. sat_tab->rfu_codeword_table_2g[i][0],
  690. sat_tab->rfu_codeword_table_2g[i][1]);
  691. }
  692. PDM_SNPF(out_len, used, output + used, out_len - used,
  693. "[SmtAnt] 5G Beam Table==============>\n");
  694. for (i = 0; i < sat_tab->total_beam_set_num_5g; i++) {
  695. PDM_SNPF(out_len, used, output + used,
  696. out_len - used,
  697. "5G Table[%d] = [A:0x%x, B:0x%x]\n", i,
  698. sat_tab->rfu_codeword_table_5g[i][0],
  699. sat_tab->rfu_codeword_table_5g[i][1]);
  700. }
  701. }
  702. } else if (dm_value[0] == 6) {
  703. #if 0
  704. if (dm_value[1] == 0) {
  705. if (dm_value[2] < SUPPORT_BEAM_SET_PATTERN_NUM) {
  706. sat_tab->rfu_codeword_table_5g[dm_value[2] ][0] = (u8)dm_value[3];
  707. sat_tab->rfu_codeword_table_5g[dm_value[2] ][1] = (u8)dm_value[4];
  708. PDM_SNPF((output + used, out_len - used,
  709. "[SmtAnt] Set5G Table[%d] = [A:0x%x, B:0x%x]\n",
  710. dm_value[2], dm_value[3],
  711. dm_value[4]));
  712. }
  713. } else {
  714. for (i = 0; i < sat_tab->total_beam_set_num_5g; i++) {
  715. PDM_SNPF((output + used, out_len - used,
  716. "[SmtAnt] Read 5G Table[%d] = [A:0x%x, B:0x%x]\n",
  717. i,
  718. sat_tab->rfu_codeword_table_5g[i][0],
  719. sat_tab->rfu_codeword_table_5g[i][1]));
  720. }
  721. }
  722. #endif
  723. } else if (dm_value[0] == 7) {
  724. if (dm_value[1] == 1) {
  725. sat_tab->total_beam_set_num_2g = (u8)(dm_value[2]);
  726. PDM_SNPF(out_len, used, output + used, out_len - used,
  727. "[ SmartAnt ] total_beam_set_num_2g = ((%d))\n",
  728. sat_tab->total_beam_set_num_2g);
  729. } else if (dm_value[1] == 2) {
  730. sat_tab->total_beam_set_num_5g = (u8)(dm_value[2]);
  731. PDM_SNPF(out_len, used, output + used, out_len - used,
  732. "[ SmartAnt ] total_beam_set_num_5g = ((%d))\n",
  733. sat_tab->total_beam_set_num_5g);
  734. } else if (dm_value[1] == 0) {
  735. PDM_SNPF(out_len, used, output + used, out_len - used,
  736. "[ SmartAnt ] Show total_beam_set_num{2g,5g} = {%d,%d}\n",
  737. sat_tab->total_beam_set_num_2g,
  738. sat_tab->total_beam_set_num_5g);
  739. }
  740. } else if (dm_value[0] == 8) {
  741. if (dm_value[1] == 1) {
  742. sat_tab->rfu_protocol_delay_time = (u16)(dm_value[2]);
  743. PDM_SNPF(out_len, used, output + used, out_len - used,
  744. "[SmtAnt] Set rfu_protocol_delay_time = ((%d))\n",
  745. sat_tab->rfu_protocol_delay_time);
  746. } else if (dm_value[1] == 0) {
  747. PDM_SNPF(out_len, used, output + used, out_len - used,
  748. "[SmtAnt] Read rfu_protocol_delay_time = ((%d))\n",
  749. sat_tab->rfu_protocol_delay_time);
  750. }
  751. }
  752. *_used = used;
  753. *_out_len = out_len;
  754. }
  755. void phydm_set_rfu_beam_pattern_type2(
  756. void *dm_void)
  757. {
  758. struct dm_struct *dm = (struct dm_struct *)dm_void;
  759. struct smt_ant_honbo *sat_tab = &dm->dm_sat_table;
  760. if (dm->ant_div_type != HL_SW_SMART_ANT_TYPE2)
  761. return;
  762. PHYDM_DBG(dm, DBG_ANT_DIV, "Training beam_set index = (( 0x%x ))\n",
  763. sat_tab->fast_training_beam_num);
  764. sat_tab->update_beam_codeword = phydm_construct_hb_rfu_codeword_type2(dm, sat_tab->fast_training_beam_num);
  765. #if DEV_BUS_TYPE == RT_PCI_INTERFACE
  766. phydm_update_beam_pattern_type2(dm, sat_tab->update_beam_codeword, sat_tab->rfu_codeword_total_bit_num);
  767. #else
  768. odm_schedule_work_item(&sat_tab->hl_smart_antenna_workitem);
  769. #if 0
  770. /*odm_stall_execution(1);*/
  771. #endif
  772. #endif
  773. }
  774. void phydm_fast_ant_training_hl_smart_antenna_type2(
  775. void *dm_void)
  776. {
  777. struct dm_struct *dm = (struct dm_struct *)dm_void;
  778. struct smt_ant_honbo *sat_tab = &dm->dm_sat_table;
  779. struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;
  780. struct sw_antenna_switch *dm_swat_table = &dm->dm_swat_table;
  781. u32 codeword = 0;
  782. u8 i = 0, j = 0;
  783. u8 avg_rssi_tmp;
  784. u8 avg_rssi_tmp_ma;
  785. u8 max_beam_ant_rssi = 0;
  786. u8 rssi_target_beam = 0, target_beam_max_rssi = 0;
  787. u8 evm1ss_target_beam = 0, evm2ss_target_beam = 0;
  788. u32 target_beam_max_evm1ss = 0, target_beam_max_evm2ss = 0;
  789. u32 beam_tmp;
  790. u8 per_beam_val_diff_tmp = 0, training_pkt_num_offset;
  791. u32 avg_evm2ss[2] = {0}, avg_evm2ss_sum = 0;
  792. u32 avg_evm1ss = 0;
  793. u32 beam_path_evm_2ss_cnt_all = 0; /*sum of all 2SS-pattern cnt*/
  794. u32 beam_path_evm_1ss_cnt_all = 0; /*sum of all 1SS-pattern cnt*/
  795. u8 decision_type;
  796. if (!dm->is_linked) {
  797. PHYDM_DBG(dm, DBG_ANT_DIV, "[No Link!!!]\n");
  798. if (fat_tab->is_become_linked == true) {
  799. sat_tab->decision_holding_period = 0;
  800. PHYDM_DBG(dm, DBG_ANT_DIV, "Link->no Link\n");
  801. fat_tab->fat_state = FAT_BEFORE_LINK_STATE;
  802. PHYDM_DBG(dm, DBG_ANT_DIV,
  803. "change to (( %d )) FAT_state\n",
  804. fat_tab->fat_state);
  805. fat_tab->is_become_linked = dm->is_linked;
  806. }
  807. return;
  808. } else {
  809. if (fat_tab->is_become_linked == false) {
  810. PHYDM_DBG(dm, DBG_ANT_DIV, "[Linked !!!]\n");
  811. fat_tab->fat_state = FAT_PREPARE_STATE;
  812. PHYDM_DBG(dm, DBG_ANT_DIV,
  813. "change to (( %d )) FAT_state\n",
  814. fat_tab->fat_state);
  815. /*sat_tab->fast_training_beam_num = 0;*/
  816. /*phydm_set_rfu_beam_pattern_type2(dm);*/
  817. fat_tab->is_become_linked = dm->is_linked;
  818. }
  819. }
  820. #if 0
  821. /*PHYDM_DBG(dm, DBG_ANT_DIV, "HL Smart ant Training: state (( %d ))\n", fat_tab->fat_state);*/
  822. #endif
  823. /* @[DECISION STATE] */
  824. /*@=======================================================================================*/
  825. if (fat_tab->fat_state == FAT_DECISION_STATE) {
  826. PHYDM_DBG(dm, DBG_ANT_DIV, "[ 3. In Decision state]\n");
  827. /*@compute target beam in each antenna*/
  828. for (j = 0; j < (sat_tab->total_beam_set_num); j++) {
  829. /*@[Decision1: RSSI]-------------------------------------------------------------------*/
  830. if (sat_tab->statistic_pkt_cnt[j] == 0) { /*@if new RSSI = 0 -> MA_RSSI-=2*/
  831. avg_rssi_tmp = sat_tab->beam_set_avg_rssi_pre[j];
  832. avg_rssi_tmp = (avg_rssi_tmp >= 2) ? (avg_rssi_tmp - 2) : avg_rssi_tmp;
  833. avg_rssi_tmp_ma = avg_rssi_tmp;
  834. } else {
  835. avg_rssi_tmp = (u8)((sat_tab->beam_set_rssi_avg_sum[j]) / (sat_tab->statistic_pkt_cnt[j]));
  836. avg_rssi_tmp_ma = (avg_rssi_tmp + sat_tab->beam_set_avg_rssi_pre[j]) >> 1;
  837. }
  838. sat_tab->beam_set_avg_rssi_pre[j] = avg_rssi_tmp;
  839. if (avg_rssi_tmp > target_beam_max_rssi) {
  840. rssi_target_beam = j;
  841. target_beam_max_rssi = avg_rssi_tmp;
  842. }
  843. /*@[Decision2: EVM 2ss]-------------------------------------------------------------------*/
  844. if (sat_tab->beam_path_evm_2ss_cnt[j] != 0) {
  845. avg_evm2ss[0] = sat_tab->beam_path_evm_2ss_sum[j][0] / sat_tab->beam_path_evm_2ss_cnt[j];
  846. avg_evm2ss[1] = sat_tab->beam_path_evm_2ss_sum[j][1] / sat_tab->beam_path_evm_2ss_cnt[j];
  847. avg_evm2ss_sum = avg_evm2ss[0] + avg_evm2ss[1];
  848. beam_path_evm_2ss_cnt_all += sat_tab->beam_path_evm_2ss_cnt[j];
  849. sat_tab->beam_set_avg_evm_2ss_pre[j] = (u8)avg_evm2ss_sum;
  850. }
  851. if (avg_evm2ss_sum > target_beam_max_evm2ss) {
  852. evm2ss_target_beam = j;
  853. target_beam_max_evm2ss = avg_evm2ss_sum;
  854. }
  855. /*@[Decision3: EVM 1ss]-------------------------------------------------------------------*/
  856. if (sat_tab->beam_path_evm_1ss_cnt[j] != 0) {
  857. avg_evm1ss = sat_tab->beam_path_evm_1ss_sum[j] / sat_tab->beam_path_evm_1ss_cnt[j];
  858. beam_path_evm_1ss_cnt_all += sat_tab->beam_path_evm_1ss_cnt[j];
  859. sat_tab->beam_set_avg_evm_1ss_pre[j] = (u8)avg_evm1ss;
  860. }
  861. if (avg_evm1ss > target_beam_max_evm1ss) {
  862. evm1ss_target_beam = j;
  863. target_beam_max_evm1ss = avg_evm1ss;
  864. }
  865. PHYDM_DBG(dm, DBG_ANT_DIV,
  866. "Beam[%d] Pkt_cnt=(( %d )), avg{MA,rssi}={%d, %d}, EVM1={%d}, EVM2={%d, %d, %d}\n",
  867. j, sat_tab->statistic_pkt_cnt[j],
  868. avg_rssi_tmp_ma, avg_rssi_tmp, avg_evm1ss,
  869. avg_evm2ss[0], avg_evm2ss[1], avg_evm2ss_sum);
  870. /*reset counter value*/
  871. sat_tab->beam_set_rssi_avg_sum[j] = 0;
  872. sat_tab->beam_path_rssi_sum[j][0] = 0;
  873. sat_tab->beam_path_rssi_sum[j][1] = 0;
  874. sat_tab->statistic_pkt_cnt[j] = 0;
  875. sat_tab->beam_path_evm_2ss_sum[j][0] = 0;
  876. sat_tab->beam_path_evm_2ss_sum[j][1] = 0;
  877. sat_tab->beam_path_evm_2ss_cnt[j] = 0;
  878. sat_tab->beam_path_evm_1ss_sum[j] = 0;
  879. sat_tab->beam_path_evm_1ss_cnt[j] = 0;
  880. }
  881. /*@[Joint Decision]-------------------------------------------------------------------*/
  882. PHYDM_DBG(dm, DBG_ANT_DIV,
  883. "--->1.[RSSI] Target Beam(( %d )) RSSI_max=((%d))\n",
  884. rssi_target_beam, target_beam_max_rssi);
  885. PHYDM_DBG(dm, DBG_ANT_DIV,
  886. "--->2.[Evm2SS] Target Beam(( %d )) EVM2SS_max=((%d))\n",
  887. evm2ss_target_beam, target_beam_max_evm2ss);
  888. PHYDM_DBG(dm, DBG_ANT_DIV,
  889. "--->3.[Evm1SS] Target Beam(( %d )) EVM1SS_max=((%d))\n",
  890. evm1ss_target_beam, target_beam_max_evm1ss);
  891. if (target_beam_max_rssi <= 10) {
  892. sat_tab->rx_idle_beam_set_idx = rssi_target_beam;
  893. decision_type = 1;
  894. } else {
  895. if (beam_path_evm_2ss_cnt_all != 0) {
  896. sat_tab->rx_idle_beam_set_idx = evm2ss_target_beam;
  897. decision_type = 2;
  898. } else if (beam_path_evm_1ss_cnt_all != 0) {
  899. sat_tab->rx_idle_beam_set_idx = evm1ss_target_beam;
  900. decision_type = 3;
  901. } else {
  902. sat_tab->rx_idle_beam_set_idx = rssi_target_beam;
  903. decision_type = 1;
  904. }
  905. }
  906. PHYDM_DBG(dm, DBG_ANT_DIV,
  907. "---> Decision_type=((%d)), Final Target Beam(( %d ))\n",
  908. decision_type, sat_tab->rx_idle_beam_set_idx);
  909. /*@Calculate packet counter offset*/
  910. for (j = 0; j < (sat_tab->total_beam_set_num); j++) {
  911. if (decision_type == 1) {
  912. per_beam_val_diff_tmp = target_beam_max_rssi - sat_tab->beam_set_avg_rssi_pre[j];
  913. } else if (decision_type == 2) {
  914. per_beam_val_diff_tmp = ((u8)target_beam_max_evm2ss - sat_tab->beam_set_avg_evm_2ss_pre[j]) >> 1;
  915. } else if (decision_type == 3) {
  916. per_beam_val_diff_tmp = (u8)target_beam_max_evm1ss - sat_tab->beam_set_avg_evm_1ss_pre[j];
  917. }
  918. sat_tab->beam_set_train_val_diff[j] = per_beam_val_diff_tmp;
  919. PHYDM_DBG(dm, DBG_ANT_DIV,
  920. "Beam_Set[%d]: diff= ((%d))\n", j,
  921. per_beam_val_diff_tmp);
  922. }
  923. /*set beam in each antenna*/
  924. phydm_update_rx_idle_beam_type2(dm);
  925. fat_tab->fat_state = FAT_PREPARE_STATE;
  926. }
  927. /* @[TRAINING STATE] */
  928. else if (fat_tab->fat_state == FAT_TRAINING_STATE) {
  929. PHYDM_DBG(dm, DBG_ANT_DIV, "[ 2. In Training state]\n");
  930. PHYDM_DBG(dm, DBG_ANT_DIV,
  931. "curr_beam_idx = (( %d )), pre_beam_idx = (( %d ))\n",
  932. sat_tab->fast_training_beam_num,
  933. sat_tab->pre_fast_training_beam_num);
  934. if (sat_tab->fast_training_beam_num > sat_tab->pre_fast_training_beam_num)
  935. sat_tab->force_update_beam_en = 0;
  936. else {
  937. sat_tab->force_update_beam_en = 1;
  938. sat_tab->pkt_counter = 0;
  939. beam_tmp = sat_tab->fast_training_beam_num;
  940. if (sat_tab->fast_training_beam_num >= ((u32)sat_tab->total_beam_set_num - 1)) {
  941. PHYDM_DBG(dm, DBG_ANT_DIV,
  942. "[Timeout Update] Beam_num (( %d )) -> (( decision ))\n",
  943. sat_tab->fast_training_beam_num);
  944. fat_tab->fat_state = FAT_DECISION_STATE;
  945. phydm_fast_ant_training_hl_smart_antenna_type2(dm);
  946. } else {
  947. sat_tab->fast_training_beam_num++;
  948. PHYDM_DBG(dm, DBG_ANT_DIV,
  949. "[Timeout Update] Beam_num (( %d )) -> (( %d ))\n",
  950. beam_tmp,
  951. sat_tab->fast_training_beam_num);
  952. phydm_set_rfu_beam_pattern_type2(dm);
  953. fat_tab->fat_state = FAT_TRAINING_STATE;
  954. }
  955. }
  956. sat_tab->pre_fast_training_beam_num = sat_tab->fast_training_beam_num;
  957. PHYDM_DBG(dm, DBG_ANT_DIV, "Update Pre_Beam =(( %d ))\n",
  958. sat_tab->pre_fast_training_beam_num);
  959. }
  960. /* @[Prepare state] */
  961. /*@=======================================================================================*/
  962. else if (fat_tab->fat_state == FAT_PREPARE_STATE) {
  963. PHYDM_DBG(dm, DBG_ANT_DIV, "\n\n[ 1. In Prepare state]\n");
  964. if (dm->pre_traffic_load == dm->traffic_load) {
  965. if (sat_tab->decision_holding_period != 0) {
  966. PHYDM_DBG(dm, DBG_ANT_DIV,
  967. "Holding_period = (( %d )), return!!!\n",
  968. sat_tab->decision_holding_period);
  969. sat_tab->decision_holding_period--;
  970. return;
  971. }
  972. }
  973. /* Set training packet number*/
  974. if (sat_tab->fix_training_num_en == 0) {
  975. switch (dm->traffic_load) {
  976. case TRAFFIC_HIGH:
  977. sat_tab->per_beam_training_pkt_num = 8;
  978. sat_tab->decision_holding_period = 2;
  979. break;
  980. case TRAFFIC_MID:
  981. sat_tab->per_beam_training_pkt_num = 6;
  982. sat_tab->decision_holding_period = 3;
  983. break;
  984. case TRAFFIC_LOW:
  985. sat_tab->per_beam_training_pkt_num = 3; /*ping 60000*/
  986. sat_tab->decision_holding_period = 4;
  987. break;
  988. case TRAFFIC_ULTRA_LOW:
  989. sat_tab->per_beam_training_pkt_num = 1;
  990. sat_tab->decision_holding_period = 6;
  991. break;
  992. default:
  993. break;
  994. }
  995. }
  996. PHYDM_DBG(dm, DBG_ANT_DIV,
  997. "TrafficLoad = (( %d )), Fix_beam = (( %d )), per_beam_training_pkt_num = (( %d )), decision_holding_period = ((%d))\n",
  998. dm->traffic_load, sat_tab->fix_training_num_en,
  999. sat_tab->per_beam_training_pkt_num,
  1000. sat_tab->decision_holding_period);
  1001. /*@Beam_set number*/
  1002. if (*dm->band_type == ODM_BAND_5G) {
  1003. sat_tab->total_beam_set_num = sat_tab->total_beam_set_num_5g;
  1004. PHYDM_DBG(dm, DBG_ANT_DIV, "5G beam_set num = ((%d))\n",
  1005. sat_tab->total_beam_set_num);
  1006. } else {
  1007. sat_tab->total_beam_set_num = sat_tab->total_beam_set_num_2g;
  1008. PHYDM_DBG(dm, DBG_ANT_DIV, "2G beam_set num = ((%d))\n",
  1009. sat_tab->total_beam_set_num);
  1010. }
  1011. for (j = 0; j < (sat_tab->total_beam_set_num); j++) {
  1012. training_pkt_num_offset = sat_tab->beam_set_train_val_diff[j];
  1013. if (sat_tab->per_beam_training_pkt_num > training_pkt_num_offset)
  1014. sat_tab->beam_set_train_cnt[j] = sat_tab->per_beam_training_pkt_num - training_pkt_num_offset;
  1015. else
  1016. sat_tab->beam_set_train_cnt[j] = 1;
  1017. PHYDM_DBG(dm, DBG_ANT_DIV,
  1018. "Beam_Set[ %d ] training_pkt_offset = ((%d)), training_pkt_num = ((%d))\n",
  1019. j, sat_tab->beam_set_train_val_diff[j],
  1020. sat_tab->beam_set_train_cnt[j]);
  1021. }
  1022. sat_tab->pre_beacon_counter = sat_tab->beacon_counter;
  1023. sat_tab->update_beam_idx = 0;
  1024. sat_tab->pkt_counter = 0;
  1025. sat_tab->fast_training_beam_num = 0;
  1026. phydm_set_rfu_beam_pattern_type2(dm);
  1027. sat_tab->pre_fast_training_beam_num = sat_tab->fast_training_beam_num;
  1028. fat_tab->fat_state = FAT_TRAINING_STATE;
  1029. }
  1030. }
  1031. #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
  1032. void phydm_beam_switch_workitem_callback(
  1033. void *context)
  1034. {
  1035. void *adapter = (void *)context;
  1036. HAL_DATA_TYPE *hal_data = GET_HAL_DATA(((PADAPTER)adapter));
  1037. struct dm_struct *dm = &hal_data->DM_OutSrc;
  1038. struct smt_ant_honbo *sat_tab = &dm->dm_sat_table;
  1039. #if DEV_BUS_TYPE != RT_PCI_INTERFACE
  1040. sat_tab->pkt_skip_statistic_en = 1;
  1041. #endif
  1042. PHYDM_DBG(dm, DBG_ANT_DIV,
  1043. "[ SmartAnt ] Beam Switch Workitem Callback, pkt_skip_statistic_en = (( %d ))\n",
  1044. sat_tab->pkt_skip_statistic_en);
  1045. phydm_update_beam_pattern_type2(dm, sat_tab->update_beam_codeword, sat_tab->rfu_codeword_total_bit_num);
  1046. #if DEV_BUS_TYPE != RT_PCI_INTERFACE
  1047. #if 0
  1048. /*odm_stall_execution(sat_tab->latch_time);*/
  1049. #endif
  1050. sat_tab->pkt_skip_statistic_en = 0;
  1051. #endif
  1052. PHYDM_DBG(dm, DBG_ANT_DIV,
  1053. "pkt_skip_statistic_en = (( %d )), latch_time = (( %d ))\n",
  1054. sat_tab->pkt_skip_statistic_en, sat_tab->latch_time);
  1055. }
  1056. void phydm_beam_decision_workitem_callback(
  1057. void *context)
  1058. {
  1059. void *adapter = (void *)context;
  1060. HAL_DATA_TYPE *hal_data = GET_HAL_DATA(((PADAPTER)adapter));
  1061. struct dm_struct *dm = &hal_data->DM_OutSrc;
  1062. PHYDM_DBG(dm, DBG_ANT_DIV,
  1063. "[ SmartAnt ] Beam decision Workitem Callback\n");
  1064. phydm_fast_ant_training_hl_smart_antenna_type2(dm);
  1065. }
  1066. #endif
  1067. void phydm_process_rssi_for_hb_smtant_type2(
  1068. void *dm_void,
  1069. void *phy_info_void,
  1070. void *pkt_info_void,
  1071. u8 rssi_avg)
  1072. {
  1073. struct dm_struct *dm = (struct dm_struct *)dm_void;
  1074. struct phydm_phyinfo_struct *phy_info = (struct phydm_phyinfo_struct *)phy_info_void;
  1075. struct phydm_perpkt_info_struct *pktinfo = (struct phydm_perpkt_info_struct *)pkt_info_void;
  1076. struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;
  1077. struct smt_ant_honbo *sat_tab = &dm->dm_sat_table;
  1078. u8 train_pkt_number;
  1079. u32 beam_tmp;
  1080. u8 rx_power_ant0 = phy_info->rx_mimo_signal_strength[0];
  1081. u8 rx_power_ant1 = phy_info->rx_mimo_signal_strength[1];
  1082. u8 rx_evm_ant0 = phy_info->rx_mimo_evm_dbm[0];
  1083. u8 rx_evm_ant1 = phy_info->rx_mimo_evm_dbm[1];
  1084. /*@[Beacon]*/
  1085. if (pktinfo->is_packet_beacon) {
  1086. sat_tab->beacon_counter++;
  1087. PHYDM_DBG(dm, DBG_ANT_DIV,
  1088. "MatchBSSID_beacon_counter = ((%d))\n",
  1089. sat_tab->beacon_counter);
  1090. if (sat_tab->beacon_counter >= sat_tab->pre_beacon_counter + 2) {
  1091. sat_tab->update_beam_idx++;
  1092. PHYDM_DBG(dm, DBG_ANT_DIV,
  1093. "pre_beacon_counter = ((%d)), pkt_counter = ((%d)), update_beam_idx = ((%d))\n",
  1094. sat_tab->pre_beacon_counter,
  1095. sat_tab->pkt_counter,
  1096. sat_tab->update_beam_idx);
  1097. sat_tab->pre_beacon_counter = sat_tab->beacon_counter;
  1098. sat_tab->pkt_counter = 0;
  1099. }
  1100. }
  1101. /*@[data]*/
  1102. else if (pktinfo->is_packet_to_self) {
  1103. if (sat_tab->pkt_skip_statistic_en == 0) {
  1104. PHYDM_DBG(dm, DBG_ANT_DIV,
  1105. "ID[%d] pkt_cnt=((%d)): Beam_set = ((%d)), RSSI{A,B,avg} = {%d, %d, %d}\n",
  1106. pktinfo->station_id, sat_tab->pkt_counter,
  1107. sat_tab->fast_training_beam_num,
  1108. rx_power_ant0, rx_power_ant1, rssi_avg);
  1109. PHYDM_DBG(dm, DBG_ANT_DIV,
  1110. "Rate_ss = ((%d)), EVM{A,B} = {%d, %d}, RX Rate =",
  1111. pktinfo->rate_ss, rx_evm_ant0, rx_evm_ant1);
  1112. phydm_print_rate(dm, dm->rx_rate, DBG_ANT_DIV);
  1113. if (sat_tab->pkt_counter >= 1) /*packet skip count*/
  1114. {
  1115. sat_tab->beam_set_rssi_avg_sum[sat_tab->fast_training_beam_num] += rssi_avg;
  1116. sat_tab->statistic_pkt_cnt[sat_tab->fast_training_beam_num]++;
  1117. sat_tab->beam_path_rssi_sum[sat_tab->fast_training_beam_num][0] += rx_power_ant0;
  1118. sat_tab->beam_path_rssi_sum[sat_tab->fast_training_beam_num][1] += rx_power_ant1;
  1119. if (pktinfo->rate_ss == 2) {
  1120. sat_tab->beam_path_evm_2ss_sum[sat_tab->fast_training_beam_num][0] += rx_evm_ant0;
  1121. sat_tab->beam_path_evm_2ss_sum[sat_tab->fast_training_beam_num][1] += rx_evm_ant1;
  1122. sat_tab->beam_path_evm_2ss_cnt[sat_tab->fast_training_beam_num]++;
  1123. } else {
  1124. sat_tab->beam_path_evm_1ss_sum[sat_tab->fast_training_beam_num] += rx_evm_ant0;
  1125. sat_tab->beam_path_evm_1ss_cnt[sat_tab->fast_training_beam_num]++;
  1126. }
  1127. }
  1128. sat_tab->pkt_counter++;
  1129. train_pkt_number = sat_tab->beam_set_train_cnt[sat_tab->fast_training_beam_num];
  1130. if (sat_tab->pkt_counter >= train_pkt_number) {
  1131. sat_tab->update_beam_idx++;
  1132. PHYDM_DBG(dm, DBG_ANT_DIV,
  1133. "pre_beacon_counter = ((%d)), Update_new_beam = ((%d))\n",
  1134. sat_tab->pre_beacon_counter,
  1135. sat_tab->update_beam_idx);
  1136. sat_tab->pre_beacon_counter = sat_tab->beacon_counter;
  1137. sat_tab->pkt_counter = 0;
  1138. }
  1139. }
  1140. }
  1141. if (sat_tab->update_beam_idx > 0) {
  1142. sat_tab->update_beam_idx = 0;
  1143. if (sat_tab->fast_training_beam_num >= ((u32)sat_tab->total_beam_set_num - 1)) {
  1144. fat_tab->fat_state = FAT_DECISION_STATE;
  1145. #if DEV_BUS_TYPE == RT_PCI_INTERFACE
  1146. phydm_fast_ant_training_hl_smart_antenna_type2(dm); /*@go to make decision*/
  1147. #else
  1148. odm_schedule_work_item(&sat_tab->hl_smart_antenna_decision_workitem);
  1149. #endif
  1150. } else {
  1151. beam_tmp = sat_tab->fast_training_beam_num;
  1152. sat_tab->fast_training_beam_num++;
  1153. PHYDM_DBG(dm, DBG_ANT_DIV,
  1154. "Update Beam_num (( %d )) -> (( %d ))\n",
  1155. beam_tmp, sat_tab->fast_training_beam_num);
  1156. phydm_set_rfu_beam_pattern_type2(dm);
  1157. sat_tab->pre_fast_training_beam_num = sat_tab->fast_training_beam_num;
  1158. fat_tab->fat_state = FAT_TRAINING_STATE;
  1159. }
  1160. }
  1161. }
  1162. #endif
  1163. #if (defined(CONFIG_HL_SMART_ANTENNA_TYPE1))
  1164. void phydm_hl_smart_ant_type1_init_8821a(
  1165. void *dm_void)
  1166. {
  1167. struct dm_struct *dm = (struct dm_struct *)dm_void;
  1168. struct smt_ant_honbo *sat_tab = &dm->dm_sat_table;
  1169. struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;
  1170. u32 value32;
  1171. PHYDM_DBG(dm, DBG_ANT_DIV,
  1172. "***8821A SmartAnt_Init => ant_div_type=[Hong-Lin Smart ant Type1]\n");
  1173. #if 0
  1174. /* @---------------------------------------- */
  1175. /* @GPIO 2-3 for Beam control */
  1176. /* reg0x66[2]=0 */
  1177. /* reg0x44[27:26] = 0 */
  1178. /* reg0x44[23:16] enable_output for P_GPIO[7:0] */
  1179. /* reg0x44[15:8] output_value for P_GPIO[7:0] */
  1180. /* reg0x40[1:0] = 0 GPIO function */
  1181. /* @------------------------------------------ */
  1182. #endif
  1183. /*@GPIO setting*/
  1184. odm_set_mac_reg(dm, R_0x64, BIT(18), 0);
  1185. odm_set_mac_reg(dm, R_0x44, BIT(27) | BIT(26), 0);
  1186. odm_set_mac_reg(dm, R_0x44, BIT(19) | BIT(18), 0x3); /*@enable_output for P_GPIO[3:2]*/
  1187. #if 0
  1188. /*odm_set_mac_reg(dm, R_0x44, BIT(11)|BIT(10), 0);*/ /*output value*/
  1189. #endif
  1190. odm_set_mac_reg(dm, R_0x40, BIT(1) | BIT(0), 0); /*@GPIO function*/
  1191. /*@Hong_lin smart antenna HW setting*/
  1192. sat_tab->rfu_codeword_total_bit_num = 24; /*@max=32*/
  1193. sat_tab->rfu_each_ant_bit_num = 4;
  1194. sat_tab->beam_patten_num_each_ant = 4;
  1195. #if DEV_BUS_TYPE == RT_SDIO_INTERFACE
  1196. sat_tab->latch_time = 100; /*@mu sec*/
  1197. #elif DEV_BUS_TYPE == RT_USB_INTERFACE
  1198. sat_tab->latch_time = 100; /*@mu sec*/
  1199. #endif
  1200. sat_tab->pkt_skip_statistic_en = 0;
  1201. sat_tab->ant_num = 1; /*@max=8*/
  1202. sat_tab->ant_num_total = NUM_ANTENNA_8821A;
  1203. sat_tab->first_train_ant = MAIN_ANT;
  1204. sat_tab->rfu_codeword_table[0] = 0x0;
  1205. sat_tab->rfu_codeword_table[1] = 0x4;
  1206. sat_tab->rfu_codeword_table[2] = 0x8;
  1207. sat_tab->rfu_codeword_table[3] = 0xc;
  1208. sat_tab->rfu_codeword_table_5g[0] = 0x1;
  1209. sat_tab->rfu_codeword_table_5g[1] = 0x2;
  1210. sat_tab->rfu_codeword_table_5g[2] = 0x4;
  1211. sat_tab->rfu_codeword_table_5g[3] = 0x8;
  1212. sat_tab->fix_beam_pattern_en = 0;
  1213. sat_tab->decision_holding_period = 0;
  1214. /*@beam training setting*/
  1215. sat_tab->pkt_counter = 0;
  1216. sat_tab->per_beam_training_pkt_num = 10;
  1217. /*set default beam*/
  1218. sat_tab->fast_training_beam_num = 0;
  1219. sat_tab->pre_fast_training_beam_num = sat_tab->fast_training_beam_num;
  1220. phydm_set_all_ant_same_beam_num(dm);
  1221. fat_tab->fat_state = FAT_BEFORE_LINK_STATE;
  1222. odm_set_bb_reg(dm, R_0xca4, MASKDWORD, 0x01000100);
  1223. odm_set_bb_reg(dm, R_0xca8, MASKDWORD, 0x01000100);
  1224. /*@[BB] FAT setting*/
  1225. odm_set_bb_reg(dm, R_0xc08, BIT(18) | BIT(17) | BIT(16), sat_tab->ant_num);
  1226. odm_set_bb_reg(dm, R_0xc08, BIT(31), 0); /*@increase ant num every FAT period 0:+1, 1+2*/
  1227. odm_set_bb_reg(dm, R_0x8c4, BIT(2) | BIT(1), 1); /*@change cca antenna timming threshold if no CCA occurred: 0:200ms / 1:100ms / 2:no use / 3: 300*/
  1228. odm_set_bb_reg(dm, R_0x8c4, BIT(0), 1); /*@FAT_watchdog_en*/
  1229. value32 = odm_get_mac_reg(dm, R_0x7b4, MASKDWORD);
  1230. odm_set_mac_reg(dm, R_0x7b4, MASKDWORD, value32 | (BIT(16) | BIT(17))); /*Reg7B4[16]=1 enable antenna training */
  1231. /*Reg7B4[17]=1 enable match MAC addr*/
  1232. odm_set_mac_reg(dm, R_0x7b4, 0xFFFF, 0); /*@Match MAC ADDR*/
  1233. odm_set_mac_reg(dm, R_0x7b0, MASKDWORD, 0);
  1234. }
  1235. u32 phydm_construct_hl_beam_codeword(
  1236. void *dm_void,
  1237. u32 *beam_pattern_idx,
  1238. u32 ant_num)
  1239. {
  1240. struct dm_struct *dm = (struct dm_struct *)dm_void;
  1241. struct smt_ant_honbo *sat_tab = &dm->dm_sat_table;
  1242. u32 codeword = 0;
  1243. u32 data_tmp;
  1244. u32 i;
  1245. u32 break_counter = 0;
  1246. if (ant_num < 8) {
  1247. for (i = 0; i < (sat_tab->ant_num_total); i++) {
  1248. #if 0
  1249. /*PHYDM_DBG(dm,DBG_ANT_DIV, "beam_pattern_num[%x] = %x\n",i,beam_pattern_num[i] );*/
  1250. #endif
  1251. if ((i < (sat_tab->first_train_ant - 1)) || break_counter >= sat_tab->ant_num) {
  1252. data_tmp = 0;
  1253. } else {
  1254. break_counter++;
  1255. if (beam_pattern_idx[i] == 0) {
  1256. if (*dm->band_type == ODM_BAND_5G)
  1257. data_tmp = sat_tab->rfu_codeword_table_5g[0];
  1258. else
  1259. data_tmp = sat_tab->rfu_codeword_table[0];
  1260. } else if (beam_pattern_idx[i] == 1) {
  1261. if (*dm->band_type == ODM_BAND_5G)
  1262. data_tmp = sat_tab->rfu_codeword_table_5g[1];
  1263. else
  1264. data_tmp = sat_tab->rfu_codeword_table[1];
  1265. } else if (beam_pattern_idx[i] == 2) {
  1266. if (*dm->band_type == ODM_BAND_5G)
  1267. data_tmp = sat_tab->rfu_codeword_table_5g[2];
  1268. else
  1269. data_tmp = sat_tab->rfu_codeword_table[2];
  1270. } else if (beam_pattern_idx[i] == 3) {
  1271. if (*dm->band_type == ODM_BAND_5G)
  1272. data_tmp = sat_tab->rfu_codeword_table_5g[3];
  1273. else
  1274. data_tmp = sat_tab->rfu_codeword_table[3];
  1275. }
  1276. }
  1277. codeword |= (data_tmp << (i * 4));
  1278. }
  1279. }
  1280. return codeword;
  1281. }
  1282. void phydm_update_beam_pattern(
  1283. void *dm_void,
  1284. u32 codeword,
  1285. u32 codeword_length)
  1286. {
  1287. struct dm_struct *dm = (struct dm_struct *)dm_void;
  1288. struct smt_ant_honbo *sat_tab = &dm->dm_sat_table;
  1289. u8 i;
  1290. boolean beam_ctrl_signal;
  1291. u32 one = 0x1;
  1292. u32 reg44_tmp_p, reg44_tmp_n, reg44_ori;
  1293. u8 devide_num = 4;
  1294. PHYDM_DBG(dm, DBG_ANT_DIV, "[ SmartAnt ] Set Beam Pattern =0x%x\n",
  1295. codeword);
  1296. reg44_ori = odm_get_mac_reg(dm, R_0x44, MASKDWORD);
  1297. reg44_tmp_p = reg44_ori;
  1298. #if 0
  1299. /*PHYDM_DBG(dm, DBG_ANT_DIV, "reg44_ori =0x%x\n", reg44_ori);*/
  1300. #endif
  1301. devide_num = (sat_tab->rfu_protocol_type == 2) ? 6 : 4;
  1302. for (i = 0; i <= (codeword_length - 1); i++) {
  1303. beam_ctrl_signal = (boolean)((codeword & BIT(i)) >> i);
  1304. if (dm->debug_components & DBG_ANT_DIV) {
  1305. if (i == (codeword_length - 1))
  1306. pr_debug("%d ]\n", beam_ctrl_signal);
  1307. else if (i == 0)
  1308. pr_debug("Send codeword[1:%d] ---> [ %d ", codeword_length, beam_ctrl_signal);
  1309. else if ((i % devide_num) == (devide_num - 1))
  1310. pr_debug("%d | ", beam_ctrl_signal);
  1311. else
  1312. pr_debug("%d ", beam_ctrl_signal);
  1313. }
  1314. if (dm->support_ic_type == ODM_RTL8821) {
  1315. #if (RTL8821A_SUPPORT == 1)
  1316. reg44_tmp_p = reg44_ori & (~(BIT(11) | BIT(10))); /*@clean bit 10 & 11*/
  1317. reg44_tmp_p |= ((1 << 11) | (beam_ctrl_signal << 10));
  1318. reg44_tmp_n = reg44_ori & (~(BIT(11) | BIT(10)));
  1319. #if 0
  1320. /*PHYDM_DBG(dm, DBG_ANT_DIV, "reg44_tmp_p =(( 0x%x )), reg44_tmp_n = (( 0x%x ))\n", reg44_tmp_p, reg44_tmp_n);*/
  1321. #endif
  1322. odm_set_mac_reg(dm, R_0x44, MASKDWORD, reg44_tmp_p);
  1323. odm_set_mac_reg(dm, R_0x44, MASKDWORD, reg44_tmp_n);
  1324. #endif
  1325. }
  1326. #if (RTL8822B_SUPPORT == 1)
  1327. else if (dm->support_ic_type == ODM_RTL8822B) {
  1328. if (sat_tab->rfu_protocol_type == 2) {
  1329. reg44_tmp_p = reg44_tmp_p & ~(BIT(8)); /*@clean bit 8*/
  1330. reg44_tmp_p = reg44_tmp_p ^ BIT(9); /*@get new clk high/low, exclusive-or*/
  1331. reg44_tmp_p |= (beam_ctrl_signal << 8);
  1332. odm_set_mac_reg(dm, R_0x44, MASKDWORD, reg44_tmp_p);
  1333. ODM_delay_us(10);
  1334. #if 0
  1335. /*PHYDM_DBG(dm, DBG_ANT_DIV, "reg44 =(( 0x%x )), reg44[9:8] = ((%x)), beam_ctrl_signal =((%x))\n", reg44_tmp_p, ((reg44_tmp_p & 0x300)>>8), beam_ctrl_signal);*/
  1336. #endif
  1337. } else {
  1338. reg44_tmp_p = reg44_ori & (~(BIT(9) | BIT(8))); /*@clean bit 9 & 8*/
  1339. reg44_tmp_p |= ((1 << 9) | (beam_ctrl_signal << 8));
  1340. reg44_tmp_n = reg44_ori & (~(BIT(9) | BIT(8)));
  1341. #if 0
  1342. /*PHYDM_DBG(dm, DBG_ANT_DIV, "reg44_tmp_p =(( 0x%x )), reg44_tmp_n = (( 0x%x ))\n", reg44_tmp_p, reg44_tmp_n); */
  1343. #endif
  1344. odm_set_mac_reg(dm, R_0x44, MASKDWORD, reg44_tmp_p);
  1345. ODM_delay_us(10);
  1346. odm_set_mac_reg(dm, R_0x44, MASKDWORD, reg44_tmp_n);
  1347. ODM_delay_us(10);
  1348. }
  1349. }
  1350. #endif
  1351. }
  1352. }
  1353. void phydm_update_rx_idle_beam(
  1354. void *dm_void)
  1355. {
  1356. struct dm_struct *dm = (struct dm_struct *)dm_void;
  1357. struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;
  1358. struct smt_ant_honbo *sat_tab = &dm->dm_sat_table;
  1359. u32 i;
  1360. sat_tab->update_beam_codeword = phydm_construct_hl_beam_codeword(dm,
  1361. &sat_tab->rx_idle_beam[0],
  1362. sat_tab->ant_num);
  1363. PHYDM_DBG(dm, DBG_ANT_DIV,
  1364. "Set target beam_pattern codeword = (( 0x%x ))\n",
  1365. sat_tab->update_beam_codeword);
  1366. for (i = 0; i < (sat_tab->ant_num); i++)
  1367. PHYDM_DBG(dm, DBG_ANT_DIV,
  1368. "[ Update Rx-Idle-Beam ] RxIdleBeam[%d] =%d\n", i,
  1369. sat_tab->rx_idle_beam[i]);
  1370. #if DEV_BUS_TYPE == RT_PCI_INTERFACE
  1371. phydm_update_beam_pattern(dm, sat_tab->update_beam_codeword, sat_tab->rfu_codeword_total_bit_num);
  1372. #else
  1373. odm_schedule_work_item(&sat_tab->hl_smart_antenna_workitem);
  1374. #if 0
  1375. /*odm_stall_execution(1);*/
  1376. #endif
  1377. #endif
  1378. sat_tab->pre_codeword = sat_tab->update_beam_codeword;
  1379. }
  1380. void phydm_hl_smart_ant_debug(
  1381. void *dm_void,
  1382. char input[][16],
  1383. u32 *_used,
  1384. char *output,
  1385. u32 *_out_len)
  1386. {
  1387. struct dm_struct *dm = (struct dm_struct *)dm_void;
  1388. struct smt_ant_honbo *sat_tab = &dm->dm_sat_table;
  1389. u32 used = *_used;
  1390. u32 out_len = *_out_len;
  1391. u32 one = 0x1;
  1392. u32 codeword_length = sat_tab->rfu_codeword_total_bit_num;
  1393. u32 beam_ctrl_signal, i;
  1394. u8 devide_num = 4;
  1395. if (dm_value[0] == 1) { /*@fix beam pattern*/
  1396. sat_tab->fix_beam_pattern_en = dm_value[1];
  1397. if (sat_tab->fix_beam_pattern_en == 1) {
  1398. sat_tab->fix_beam_pattern_codeword = dm_value[2];
  1399. if (sat_tab->fix_beam_pattern_codeword > (one << codeword_length)) {
  1400. PHYDM_DBG(dm, DBG_ANT_DIV,
  1401. "[ SmartAnt ] Codeword overflow, Current codeword is ((0x%x)), and should be less than ((%d))bit\n",
  1402. sat_tab->fix_beam_pattern_codeword,
  1403. codeword_length);
  1404. (sat_tab->fix_beam_pattern_codeword) &= 0xffffff;
  1405. PHYDM_DBG(dm, DBG_ANT_DIV,
  1406. "[ SmartAnt ] Auto modify to (0x%x)\n",
  1407. sat_tab->fix_beam_pattern_codeword);
  1408. }
  1409. sat_tab->update_beam_codeword = sat_tab->fix_beam_pattern_codeword;
  1410. /*@---------------------------------------------------------*/
  1411. PDM_SNPF(out_len, used, output + used, out_len - used,
  1412. "Fix Beam Pattern\n");
  1413. devide_num = (sat_tab->rfu_protocol_type == 2) ? 6 : 4;
  1414. for (i = 0; i <= (codeword_length - 1); i++) {
  1415. beam_ctrl_signal = (boolean)((sat_tab->update_beam_codeword & BIT(i)) >> i);
  1416. if (i == (codeword_length - 1))
  1417. PDM_SNPF(out_len, used,
  1418. output + used,
  1419. out_len - used,
  1420. "%d]\n",
  1421. beam_ctrl_signal);
  1422. else if (i == 0)
  1423. PDM_SNPF(out_len, used,
  1424. output + used,
  1425. out_len - used,
  1426. "Send Codeword[1:24] to RFU -> [%d",
  1427. beam_ctrl_signal);
  1428. else if ((i % devide_num) == (devide_num - 1))
  1429. PDM_SNPF(out_len, used,
  1430. output + used,
  1431. out_len - used, "%d|",
  1432. beam_ctrl_signal);
  1433. else
  1434. PDM_SNPF(out_len, used,
  1435. output + used,
  1436. out_len - used, "%d",
  1437. beam_ctrl_signal);
  1438. }
  1439. /*@---------------------------------------------------------*/
  1440. #if DEV_BUS_TYPE == RT_PCI_INTERFACE
  1441. phydm_update_beam_pattern(dm, sat_tab->update_beam_codeword, sat_tab->rfu_codeword_total_bit_num);
  1442. #else
  1443. odm_schedule_work_item(&sat_tab->hl_smart_antenna_workitem);
  1444. #if 0
  1445. /*odm_stall_execution(1);*/
  1446. #endif
  1447. #endif
  1448. } else if (sat_tab->fix_beam_pattern_en == 0)
  1449. PDM_SNPF(out_len, used, output + used, out_len - used,
  1450. "[ SmartAnt ] Smart Antenna: Enable\n");
  1451. } else if (dm_value[0] == 2) { /*set latch time*/
  1452. sat_tab->latch_time = dm_value[1];
  1453. PHYDM_DBG(dm, DBG_ANT_DIV, "[ SmartAnt ] latch_time =0x%x\n",
  1454. sat_tab->latch_time);
  1455. } else if (dm_value[0] == 3) {
  1456. sat_tab->fix_training_num_en = dm_value[1];
  1457. if (sat_tab->fix_training_num_en == 1) {
  1458. sat_tab->per_beam_training_pkt_num = (u8)dm_value[2];
  1459. sat_tab->decision_holding_period = (u8)dm_value[3];
  1460. PDM_SNPF(out_len, used, output + used, out_len - used,
  1461. "[SmartAnt][Dbg] Fix_train_en = (( %d )), train_pkt_num = (( %d )), holding_period = (( %d )),\n",
  1462. sat_tab->fix_training_num_en,
  1463. sat_tab->per_beam_training_pkt_num,
  1464. sat_tab->decision_holding_period);
  1465. } else if (sat_tab->fix_training_num_en == 0) {
  1466. PDM_SNPF(out_len, used, output + used, out_len - used,
  1467. "[ SmartAnt ] AUTO per_beam_training_pkt_num\n");
  1468. }
  1469. } else if (dm_value[0] == 4) {
  1470. if (dm_value[1] == 1) {
  1471. sat_tab->ant_num = 1;
  1472. sat_tab->first_train_ant = MAIN_ANT;
  1473. } else if (dm_value[1] == 2) {
  1474. sat_tab->ant_num = 1;
  1475. sat_tab->first_train_ant = AUX_ANT;
  1476. } else if (dm_value[1] == 3) {
  1477. sat_tab->ant_num = 2;
  1478. sat_tab->first_train_ant = MAIN_ANT;
  1479. }
  1480. PDM_SNPF(out_len, used, output + used, out_len - used,
  1481. "[ SmartAnt ] Set ant Num = (( %d )), first_train_ant = (( %d ))\n",
  1482. sat_tab->ant_num, (sat_tab->first_train_ant - 1));
  1483. } else if (dm_value[0] == 5) {
  1484. if (dm_value[1] <= 3) {
  1485. sat_tab->rfu_codeword_table[dm_value[1]] = dm_value[2];
  1486. PDM_SNPF(out_len, used, output + used, out_len - used,
  1487. "[ SmartAnt ] Set Beam_2G: (( %d )), RFU codeword table = (( 0x%x ))\n",
  1488. dm_value[1], dm_value[2]);
  1489. } else {
  1490. for (i = 0; i < 4; i++) {
  1491. PDM_SNPF(out_len, used, output + used,
  1492. out_len - used,
  1493. "[ SmartAnt ] Show Beam_2G: (( %d )), RFU codeword table = (( 0x%x ))\n",
  1494. i, sat_tab->rfu_codeword_table[i]);
  1495. }
  1496. }
  1497. } else if (dm_value[0] == 6) {
  1498. if (dm_value[1] <= 3) {
  1499. sat_tab->rfu_codeword_table_5g[dm_value[1]] = dm_value[2];
  1500. PDM_SNPF(out_len, used, output + used, out_len - used,
  1501. "[ SmartAnt ] Set Beam_5G: (( %d )), RFU codeword table = (( 0x%x ))\n",
  1502. dm_value[1], dm_value[2]);
  1503. } else {
  1504. for (i = 0; i < 4; i++) {
  1505. PDM_SNPF(out_len, used, output + used,
  1506. out_len - used,
  1507. "[ SmartAnt ] Show Beam_5G: (( %d )), RFU codeword table = (( 0x%x ))\n",
  1508. i, sat_tab->rfu_codeword_table_5g[i]);
  1509. }
  1510. }
  1511. } else if (dm_value[0] == 7) {
  1512. if (dm_value[1] <= 4) {
  1513. sat_tab->beam_patten_num_each_ant = dm_value[1];
  1514. PDM_SNPF(out_len, used, output + used, out_len - used,
  1515. "[ SmartAnt ] Set Beam number = (( %d ))\n",
  1516. sat_tab->beam_patten_num_each_ant);
  1517. } else {
  1518. PDM_SNPF(out_len, used, output + used, out_len - used,
  1519. "[ SmartAnt ] Show Beam number = (( %d ))\n",
  1520. sat_tab->beam_patten_num_each_ant);
  1521. }
  1522. }
  1523. *_used = used;
  1524. *_out_len = out_len;
  1525. }
  1526. void phydm_set_all_ant_same_beam_num(
  1527. void *dm_void)
  1528. {
  1529. struct dm_struct *dm = (struct dm_struct *)dm_void;
  1530. struct smt_ant_honbo *sat_tab = &dm->dm_sat_table;
  1531. if (dm->ant_div_type == HL_SW_SMART_ANT_TYPE1) { /*@2ant for 8821A*/
  1532. sat_tab->rx_idle_beam[0] = sat_tab->fast_training_beam_num;
  1533. sat_tab->rx_idle_beam[1] = sat_tab->fast_training_beam_num;
  1534. }
  1535. sat_tab->update_beam_codeword = phydm_construct_hl_beam_codeword(dm,
  1536. &sat_tab->rx_idle_beam[0],
  1537. sat_tab->ant_num);
  1538. PHYDM_DBG(dm, DBG_ANT_DIV,
  1539. "[ SmartAnt ] Set all ant beam_pattern: codeword = (( 0x%x ))\n",
  1540. sat_tab->update_beam_codeword);
  1541. #if DEV_BUS_TYPE == RT_PCI_INTERFACE
  1542. phydm_update_beam_pattern(dm, sat_tab->update_beam_codeword, sat_tab->rfu_codeword_total_bit_num);
  1543. #else
  1544. odm_schedule_work_item(&sat_tab->hl_smart_antenna_workitem);
  1545. /*odm_stall_execution(1);*/
  1546. #endif
  1547. }
  1548. void odm_fast_ant_training_hl_smart_antenna_type1(
  1549. void *dm_void)
  1550. {
  1551. struct dm_struct *dm = (struct dm_struct *)dm_void;
  1552. struct smt_ant_honbo *sat_tab = &dm->dm_sat_table;
  1553. struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;
  1554. struct sw_antenna_switch *dm_swat_table = &dm->dm_swat_table;
  1555. u32 codeword = 0, i, j;
  1556. u32 target_ant;
  1557. u32 avg_rssi_tmp, avg_rssi_tmp_ma;
  1558. u32 target_ant_beam_max_rssi[SUPPORT_RF_PATH_NUM] = {0};
  1559. u32 max_beam_ant_rssi = 0;
  1560. u32 target_ant_beam[SUPPORT_RF_PATH_NUM] = {0};
  1561. u32 beam_tmp;
  1562. u8 next_ant;
  1563. u32 rssi_sorting_seq[SUPPORT_BEAM_PATTERN_NUM] = {0};
  1564. u32 rank_idx_seq[SUPPORT_BEAM_PATTERN_NUM] = {0};
  1565. u32 rank_idx_out[SUPPORT_BEAM_PATTERN_NUM] = {0};
  1566. u8 per_beam_rssi_diff_tmp = 0, training_pkt_num_offset;
  1567. u32 break_counter = 0;
  1568. u32 used_ant;
  1569. if (!dm->is_linked) {
  1570. PHYDM_DBG(dm, DBG_ANT_DIV, "[No Link!!!]\n");
  1571. if (fat_tab->is_become_linked == true) {
  1572. PHYDM_DBG(dm, DBG_ANT_DIV, "Link->no Link\n");
  1573. fat_tab->fat_state = FAT_BEFORE_LINK_STATE;
  1574. odm_ant_div_on_off(dm, ANTDIV_OFF, ANT_PATH_A);
  1575. odm_tx_by_tx_desc_or_reg(dm, TX_BY_REG);
  1576. PHYDM_DBG(dm, DBG_ANT_DIV,
  1577. "change to (( %d )) FAT_state\n",
  1578. fat_tab->fat_state);
  1579. fat_tab->is_become_linked = dm->is_linked;
  1580. }
  1581. return;
  1582. } else {
  1583. if (fat_tab->is_become_linked == false) {
  1584. PHYDM_DBG(dm, DBG_ANT_DIV, "[Linked !!!]\n");
  1585. fat_tab->fat_state = FAT_PREPARE_STATE;
  1586. PHYDM_DBG(dm, DBG_ANT_DIV,
  1587. "change to (( %d )) FAT_state\n",
  1588. fat_tab->fat_state);
  1589. #if 0
  1590. /*sat_tab->fast_training_beam_num = 0;*/
  1591. /*phydm_set_all_ant_same_beam_num(dm);*/
  1592. #endif
  1593. fat_tab->is_become_linked = dm->is_linked;
  1594. }
  1595. }
  1596. if (*fat_tab->p_force_tx_ant_by_desc == false) {
  1597. if (dm->is_one_entry_only == true)
  1598. odm_tx_by_tx_desc_or_reg(dm, TX_BY_REG);
  1599. else
  1600. odm_tx_by_tx_desc_or_reg(dm, TX_BY_DESC);
  1601. }
  1602. #if 0
  1603. /*PHYDM_DBG(dm, DBG_ANT_DIV, "HL Smart ant Training: state (( %d ))\n", fat_tab->fat_state);*/
  1604. #endif
  1605. /* @[DECISION STATE] */
  1606. /*@=======================================================================================*/
  1607. if (fat_tab->fat_state == FAT_DECISION_STATE) {
  1608. PHYDM_DBG(dm, DBG_ANT_DIV, "[ 3. In Decision state]\n");
  1609. phydm_fast_training_enable(dm, FAT_OFF);
  1610. break_counter = 0;
  1611. /*@compute target beam in each antenna*/
  1612. for (i = (sat_tab->first_train_ant - 1); i < sat_tab->ant_num_total; i++) {
  1613. for (j = 0; j < (sat_tab->beam_patten_num_each_ant); j++) {
  1614. if (sat_tab->pkt_rssi_cnt[i][j] == 0) {
  1615. avg_rssi_tmp = sat_tab->pkt_rssi_pre[i][j];
  1616. avg_rssi_tmp = (avg_rssi_tmp >= 2) ? (avg_rssi_tmp - 2) : avg_rssi_tmp;
  1617. avg_rssi_tmp_ma = avg_rssi_tmp;
  1618. } else {
  1619. avg_rssi_tmp = (sat_tab->pkt_rssi_sum[i][j]) / (sat_tab->pkt_rssi_cnt[i][j]);
  1620. avg_rssi_tmp_ma = (avg_rssi_tmp + sat_tab->pkt_rssi_pre[i][j]) >> 1;
  1621. }
  1622. rssi_sorting_seq[j] = avg_rssi_tmp;
  1623. sat_tab->pkt_rssi_pre[i][j] = avg_rssi_tmp;
  1624. PHYDM_DBG(dm, DBG_ANT_DIV,
  1625. "ant[%d], Beam[%d]: pkt_cnt=(( %d )), avg_rssi_MA=(( %d )), avg_rssi=(( %d ))\n",
  1626. i, j, sat_tab->pkt_rssi_cnt[i][j],
  1627. avg_rssi_tmp_ma, avg_rssi_tmp);
  1628. if (avg_rssi_tmp > target_ant_beam_max_rssi[i]) {
  1629. target_ant_beam[i] = j;
  1630. target_ant_beam_max_rssi[i] = avg_rssi_tmp;
  1631. }
  1632. /*reset counter value*/
  1633. sat_tab->pkt_rssi_sum[i][j] = 0;
  1634. sat_tab->pkt_rssi_cnt[i][j] = 0;
  1635. }
  1636. sat_tab->rx_idle_beam[i] = target_ant_beam[i];
  1637. PHYDM_DBG(dm, DBG_ANT_DIV,
  1638. "---------> Target of ant[%d]: Beam_num-(( %d )) RSSI= ((%d))\n",
  1639. i, target_ant_beam[i],
  1640. target_ant_beam_max_rssi[i]);
  1641. #if 0
  1642. /*sorting*/
  1643. /*@
  1644. PHYDM_DBG(dm, DBG_ANT_DIV, "[Pre]rssi_sorting_seq = [%d, %d, %d, %d]\n", rssi_sorting_seq[0], rssi_sorting_seq[1], rssi_sorting_seq[2], rssi_sorting_seq[3]);
  1645. */
  1646. /*phydm_seq_sorting(dm, &rssi_sorting_seq[0], &rank_idx_seq[0], &rank_idx_out[0], SUPPORT_BEAM_PATTERN_NUM);*/
  1647. /*@
  1648. PHYDM_DBG(dm, DBG_ANT_DIV, "[Post]rssi_sorting_seq = [%d, %d, %d, %d]\n", rssi_sorting_seq[0], rssi_sorting_seq[1], rssi_sorting_seq[2], rssi_sorting_seq[3]);
  1649. PHYDM_DBG(dm, DBG_ANT_DIV, "[Post]rank_idx_seq = [%d, %d, %d, %d]\n", rank_idx_seq[0], rank_idx_seq[1], rank_idx_seq[2], rank_idx_seq[3]);
  1650. PHYDM_DBG(dm, DBG_ANT_DIV, "[Post]rank_idx_out = [%d, %d, %d, %d]\n", rank_idx_out[0], rank_idx_out[1], rank_idx_out[2], rank_idx_out[3]);
  1651. */
  1652. #endif
  1653. if (target_ant_beam_max_rssi[i] > max_beam_ant_rssi) {
  1654. target_ant = i;
  1655. max_beam_ant_rssi = target_ant_beam_max_rssi[i];
  1656. #if
  1657. /*PHYDM_DBG(dm, DBG_ANT_DIV, "Target of ant = (( %d )) max_beam_ant_rssi = (( %d ))\n",
  1658. target_ant, max_beam_ant_rssi);*/
  1659. #endif
  1660. }
  1661. break_counter++;
  1662. if (break_counter >= sat_tab->ant_num)
  1663. break;
  1664. }
  1665. #ifdef CONFIG_FAT_PATCH
  1666. break_counter = 0;
  1667. for (i = (sat_tab->first_train_ant - 1); i < sat_tab->ant_num_total; i++) {
  1668. for (j = 0; j < (sat_tab->beam_patten_num_each_ant); j++) {
  1669. per_beam_rssi_diff_tmp = (u8)(max_beam_ant_rssi - sat_tab->pkt_rssi_pre[i][j]);
  1670. sat_tab->beam_train_rssi_diff[i][j] = per_beam_rssi_diff_tmp;
  1671. PHYDM_DBG(dm, DBG_ANT_DIV,
  1672. "ant[%d], Beam[%d]: RSSI_diff= ((%d))\n",
  1673. i, j, per_beam_rssi_diff_tmp);
  1674. }
  1675. break_counter++;
  1676. if (break_counter >= sat_tab->ant_num)
  1677. break;
  1678. }
  1679. #endif
  1680. if (target_ant == 0)
  1681. target_ant = MAIN_ANT;
  1682. else if (target_ant == 1)
  1683. target_ant = AUX_ANT;
  1684. if (sat_tab->ant_num > 1) {
  1685. /* @[ update RX ant ]*/
  1686. odm_update_rx_idle_ant(dm, (u8)target_ant);
  1687. /* @[ update TX ant ]*/
  1688. odm_update_tx_ant(dm, (u8)target_ant, (fat_tab->train_idx));
  1689. }
  1690. /*set beam in each antenna*/
  1691. phydm_update_rx_idle_beam(dm);
  1692. odm_ant_div_on_off(dm, ANTDIV_ON, ANT_PATH_A);
  1693. fat_tab->fat_state = FAT_PREPARE_STATE;
  1694. return;
  1695. }
  1696. /* @[TRAINING STATE] */
  1697. else if (fat_tab->fat_state == FAT_TRAINING_STATE) {
  1698. PHYDM_DBG(dm, DBG_ANT_DIV, "[ 2. In Training state]\n");
  1699. PHYDM_DBG(dm, DBG_ANT_DIV,
  1700. "fat_beam_n = (( %d )), pre_fat_beam_n = (( %d ))\n",
  1701. sat_tab->fast_training_beam_num,
  1702. sat_tab->pre_fast_training_beam_num);
  1703. if (sat_tab->fast_training_beam_num > sat_tab->pre_fast_training_beam_num)
  1704. sat_tab->force_update_beam_en = 0;
  1705. else {
  1706. sat_tab->force_update_beam_en = 1;
  1707. sat_tab->pkt_counter = 0;
  1708. beam_tmp = sat_tab->fast_training_beam_num;
  1709. if (sat_tab->fast_training_beam_num >= (sat_tab->beam_patten_num_each_ant - 1)) {
  1710. PHYDM_DBG(dm, DBG_ANT_DIV,
  1711. "[Timeout Update] Beam_num (( %d )) -> (( decision ))\n",
  1712. sat_tab->fast_training_beam_num);
  1713. fat_tab->fat_state = FAT_DECISION_STATE;
  1714. odm_fast_ant_training_hl_smart_antenna_type1(dm);
  1715. } else {
  1716. sat_tab->fast_training_beam_num++;
  1717. PHYDM_DBG(dm, DBG_ANT_DIV,
  1718. "[Timeout Update] Beam_num (( %d )) -> (( %d ))\n",
  1719. beam_tmp,
  1720. sat_tab->fast_training_beam_num);
  1721. phydm_set_all_ant_same_beam_num(dm);
  1722. fat_tab->fat_state = FAT_TRAINING_STATE;
  1723. }
  1724. }
  1725. sat_tab->pre_fast_training_beam_num = sat_tab->fast_training_beam_num;
  1726. PHYDM_DBG(dm, DBG_ANT_DIV,
  1727. "[prepare state] Update Pre_Beam =(( %d ))\n",
  1728. sat_tab->pre_fast_training_beam_num);
  1729. }
  1730. /* @[Prepare state] */
  1731. /*@=======================================================================================*/
  1732. else if (fat_tab->fat_state == FAT_PREPARE_STATE) {
  1733. PHYDM_DBG(dm, DBG_ANT_DIV, "\n\n[ 1. In Prepare state]\n");
  1734. if (dm->pre_traffic_load == dm->traffic_load) {
  1735. if (sat_tab->decision_holding_period != 0) {
  1736. PHYDM_DBG(dm, DBG_ANT_DIV,
  1737. "Holding_period = (( %d )), return!!!\n",
  1738. sat_tab->decision_holding_period);
  1739. sat_tab->decision_holding_period--;
  1740. return;
  1741. }
  1742. }
  1743. /* Set training packet number*/
  1744. if (sat_tab->fix_training_num_en == 0) {
  1745. switch (dm->traffic_load) {
  1746. case TRAFFIC_HIGH:
  1747. sat_tab->per_beam_training_pkt_num = 8;
  1748. sat_tab->decision_holding_period = 2;
  1749. break;
  1750. case TRAFFIC_MID:
  1751. sat_tab->per_beam_training_pkt_num = 6;
  1752. sat_tab->decision_holding_period = 3;
  1753. break;
  1754. case TRAFFIC_LOW:
  1755. sat_tab->per_beam_training_pkt_num = 3; /*ping 60000*/
  1756. sat_tab->decision_holding_period = 4;
  1757. break;
  1758. case TRAFFIC_ULTRA_LOW:
  1759. sat_tab->per_beam_training_pkt_num = 1;
  1760. sat_tab->decision_holding_period = 6;
  1761. break;
  1762. default:
  1763. break;
  1764. }
  1765. }
  1766. PHYDM_DBG(dm, DBG_ANT_DIV,
  1767. "Fix_training_en = (( %d )), training_pkt_num_base = (( %d )), holding_period = ((%d))\n",
  1768. sat_tab->fix_training_num_en,
  1769. sat_tab->per_beam_training_pkt_num,
  1770. sat_tab->decision_holding_period);
  1771. #ifdef CONFIG_FAT_PATCH
  1772. break_counter = 0;
  1773. for (i = (sat_tab->first_train_ant - 1); i < sat_tab->ant_num_total; i++) {
  1774. for (j = 0; j < (sat_tab->beam_patten_num_each_ant); j++) {
  1775. per_beam_rssi_diff_tmp = sat_tab->beam_train_rssi_diff[i][j];
  1776. training_pkt_num_offset = per_beam_rssi_diff_tmp;
  1777. if (sat_tab->per_beam_training_pkt_num > training_pkt_num_offset)
  1778. sat_tab->beam_train_cnt[i][j] = sat_tab->per_beam_training_pkt_num - training_pkt_num_offset;
  1779. else
  1780. sat_tab->beam_train_cnt[i][j] = 1;
  1781. PHYDM_DBG(dm, DBG_ANT_DIV,
  1782. "ant[%d]: Beam_num-(( %d )) training_pkt_num = ((%d))\n",
  1783. i, j, sat_tab->beam_train_cnt[i][j]);
  1784. }
  1785. break_counter++;
  1786. if (break_counter >= sat_tab->ant_num)
  1787. break;
  1788. }
  1789. phydm_fast_training_enable(dm, FAT_OFF);
  1790. sat_tab->pre_beacon_counter = sat_tab->beacon_counter;
  1791. sat_tab->update_beam_idx = 0;
  1792. if (*dm->band_type == ODM_BAND_5G) {
  1793. PHYDM_DBG(dm, DBG_ANT_DIV, "Set 5G ant\n");
  1794. /*used_ant = (sat_tab->first_train_ant == MAIN_ANT) ? AUX_ANT : MAIN_ANT;*/
  1795. used_ant = sat_tab->first_train_ant;
  1796. } else {
  1797. PHYDM_DBG(dm, DBG_ANT_DIV, "Set 2.4G ant\n");
  1798. used_ant = sat_tab->first_train_ant;
  1799. }
  1800. odm_update_rx_idle_ant(dm, (u8)used_ant);
  1801. #else
  1802. /* Set training MAC addr. of target */
  1803. odm_set_next_mac_addr_target(dm);
  1804. phydm_fast_training_enable(dm, FAT_ON);
  1805. #endif
  1806. odm_ant_div_on_off(dm, ANTDIV_OFF, ANT_PATH_A);
  1807. sat_tab->pkt_counter = 0;
  1808. sat_tab->fast_training_beam_num = 0;
  1809. phydm_set_all_ant_same_beam_num(dm);
  1810. sat_tab->pre_fast_training_beam_num = sat_tab->fast_training_beam_num;
  1811. fat_tab->fat_state = FAT_TRAINING_STATE;
  1812. }
  1813. }
  1814. #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
  1815. void phydm_beam_switch_workitem_callback(
  1816. void *context)
  1817. {
  1818. void *adapter = (void *)context;
  1819. HAL_DATA_TYPE *hal_data = GET_HAL_DATA(((PADAPTER)adapter));
  1820. struct dm_struct *dm = &hal_data->DM_OutSrc;
  1821. struct smt_ant_honbo *sat_tab = &dm->dm_sat_table;
  1822. #if DEV_BUS_TYPE != RT_PCI_INTERFACE
  1823. sat_tab->pkt_skip_statistic_en = 1;
  1824. #endif
  1825. PHYDM_DBG(dm, DBG_ANT_DIV,
  1826. "[ SmartAnt ] Beam Switch Workitem Callback, pkt_skip_statistic_en = (( %d ))\n",
  1827. sat_tab->pkt_skip_statistic_en);
  1828. phydm_update_beam_pattern(dm, sat_tab->update_beam_codeword, sat_tab->rfu_codeword_total_bit_num);
  1829. #if DEV_BUS_TYPE != RT_PCI_INTERFACE
  1830. #if 0
  1831. /*odm_stall_execution(sat_tab->latch_time);*/
  1832. #endif
  1833. sat_tab->pkt_skip_statistic_en = 0;
  1834. #endif
  1835. PHYDM_DBG(dm, DBG_ANT_DIV,
  1836. "pkt_skip_statistic_en = (( %d )), latch_time = (( %d ))\n",
  1837. sat_tab->pkt_skip_statistic_en, sat_tab->latch_time);
  1838. }
  1839. void phydm_beam_decision_workitem_callback(
  1840. void *context)
  1841. {
  1842. void *adapter = (void *)context;
  1843. HAL_DATA_TYPE *hal_data = GET_HAL_DATA(((PADAPTER)adapter));
  1844. struct dm_struct *dm = &hal_data->DM_OutSrc;
  1845. PHYDM_DBG(dm, DBG_ANT_DIV,
  1846. "[ SmartAnt ] Beam decision Workitem Callback\n");
  1847. odm_fast_ant_training_hl_smart_antenna_type1(dm);
  1848. }
  1849. #endif
  1850. #endif /*@#ifdef CONFIG_HL_SMART_ANTENNA_TYPE1*/
  1851. #endif /*@#ifdef CONFIG_HL_SMART_ANTENNA*/
  1852. void phydm_smt_ant_config(
  1853. void *dm_void)
  1854. {
  1855. struct dm_struct *dm = (struct dm_struct *)dm_void;
  1856. struct smt_ant *smtant_table = &dm->smtant_table;
  1857. #if (defined(CONFIG_CUMITEK_SMART_ANTENNA))
  1858. dm->support_ability |= ODM_BB_SMT_ANT;
  1859. smtant_table->smt_ant_vendor = SMTANT_CUMITEK;
  1860. smtant_table->smt_ant_type = 1;
  1861. #if (RTL8822B_SUPPORT == 1)
  1862. dm->rfe_type = SMTANT_TMP_RFE_TYPE;
  1863. #endif
  1864. #elif (defined(CONFIG_HL_SMART_ANTENNA))
  1865. dm->support_ability |= ODM_BB_SMT_ANT;
  1866. smtant_table->smt_ant_vendor = SMTANT_HON_BO;
  1867. #ifdef CONFIG_HL_SMART_ANTENNA_TYPE1
  1868. smtant_table->smt_ant_type = 1;
  1869. #endif
  1870. #ifdef CONFIG_HL_SMART_ANTENNA_TYPE2
  1871. smtant_table->smt_ant_type = 2;
  1872. #endif
  1873. #endif
  1874. PHYDM_DBG(dm, DBG_SMT_ANT,
  1875. "[SmtAnt Config] Vendor=((%d)), Smt_ant_type =((%d))\n",
  1876. smtant_table->smt_ant_vendor, smtant_table->smt_ant_type);
  1877. }
  1878. void phydm_smt_ant_init(void *dm_void)
  1879. {
  1880. struct dm_struct *dm = (struct dm_struct *)dm_void;
  1881. struct smt_ant *smtant_table = &dm->smtant_table;
  1882. phydm_smt_ant_config(dm);
  1883. if (smtant_table->smt_ant_vendor == SMTANT_CUMITEK) {
  1884. #if (defined(CONFIG_CUMITEK_SMART_ANTENNA))
  1885. #if (RTL8822B_SUPPORT == 1)
  1886. if (dm->support_ic_type == ODM_RTL8822B)
  1887. phydm_cumitek_smt_ant_init_8822b(dm);
  1888. #endif
  1889. #if (RTL8197F_SUPPORT == 1)
  1890. if (dm->support_ic_type == ODM_RTL8197F)
  1891. phydm_cumitek_smt_ant_init_8197f(dm);
  1892. #endif
  1893. /*@jj add 20170822*/
  1894. #if (RTL8192F_SUPPORT == 1)
  1895. if (dm->support_ic_type == ODM_RTL8192F)
  1896. phydm_cumitek_smt_ant_init_8192f(dm);
  1897. #endif
  1898. #endif /*@#if (defined(CONFIG_CUMITEK_SMART_ANTENNA))*/
  1899. } else if (smtant_table->smt_ant_vendor == SMTANT_HON_BO) {
  1900. #if (defined(CONFIG_HL_SMART_ANTENNA))
  1901. #ifdef CONFIG_HL_SMART_ANTENNA_TYPE1
  1902. if (dm->support_ic_type == ODM_RTL8821)
  1903. phydm_hl_smart_ant_type1_init_8821a(dm);
  1904. #endif
  1905. #ifdef CONFIG_HL_SMART_ANTENNA_TYPE2
  1906. if (dm->support_ic_type == ODM_RTL8822B)
  1907. phydm_hl_smart_ant_type2_init_8822b(dm);
  1908. #endif
  1909. #endif /*@#if (defined(CONFIG_HL_SMART_ANTENNA))*/
  1910. }
  1911. }
  1912. #endif