phydm.c 78 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168
  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. const u16 phy_rate_table[] = {
  31. /*@20M*/
  32. 1, 2, 5, 11,
  33. 6, 9, 12, 18, 24, 36, 48, 54,
  34. 6, 13, 19, 26, 39, 52, 58, 65, /*@MCS0~7*/
  35. 13, 26, 39, 52, 78, 104, 117, 130 /*@MCS8~15*/
  36. };
  37. void phydm_traffic_load_decision(void *dm_void)
  38. {
  39. struct dm_struct *dm = (struct dm_struct *)dm_void;
  40. u8 shift = 0;
  41. /*@---TP & Trafic-load calculation---*/
  42. if (dm->last_tx_ok_cnt > *dm->num_tx_bytes_unicast)
  43. dm->last_tx_ok_cnt = *dm->num_tx_bytes_unicast;
  44. if (dm->last_rx_ok_cnt > *dm->num_rx_bytes_unicast)
  45. dm->last_rx_ok_cnt = *dm->num_rx_bytes_unicast;
  46. dm->cur_tx_ok_cnt = *dm->num_tx_bytes_unicast - dm->last_tx_ok_cnt;
  47. dm->cur_rx_ok_cnt = *dm->num_rx_bytes_unicast - dm->last_rx_ok_cnt;
  48. dm->last_tx_ok_cnt = *dm->num_tx_bytes_unicast;
  49. dm->last_rx_ok_cnt = *dm->num_rx_bytes_unicast;
  50. /*@AP: <<3(8bit), >>20(10^6,M), >>0(1sec)*/
  51. shift = 17 + (PHYDM_WATCH_DOG_PERIOD - 1);
  52. /*@WIN&CE: <<3(8bit), >>20(10^6,M), >>1(2sec)*/
  53. dm->tx_tp = (dm->tx_tp >> 1) + (u32)((dm->cur_tx_ok_cnt >> shift) >> 1);
  54. dm->rx_tp = (dm->rx_tp >> 1) + (u32)((dm->cur_rx_ok_cnt >> shift) >> 1);
  55. dm->total_tp = dm->tx_tp + dm->rx_tp;
  56. /*@[Calculate TX/RX state]*/
  57. if (dm->tx_tp > (dm->rx_tp << 1))
  58. dm->txrx_state_all = TX_STATE;
  59. else if (dm->rx_tp > (dm->tx_tp << 1))
  60. dm->txrx_state_all = RX_STATE;
  61. else
  62. dm->txrx_state_all = BI_DIRECTION_STATE;
  63. /*@[Traffic load decision]*/
  64. dm->pre_traffic_load = dm->traffic_load;
  65. if (dm->cur_tx_ok_cnt > 1875000 || dm->cur_rx_ok_cnt > 1875000) {
  66. /* @( 1.875M * 8bit ) / 2sec= 7.5M bits /sec )*/
  67. dm->traffic_load = TRAFFIC_HIGH;
  68. } else if (dm->cur_tx_ok_cnt > 500000 || dm->cur_rx_ok_cnt > 500000) {
  69. /*@( 0.5M * 8bit ) / 2sec = 2M bits /sec )*/
  70. dm->traffic_load = TRAFFIC_MID;
  71. } else if (dm->cur_tx_ok_cnt > 100000 || dm->cur_rx_ok_cnt > 100000) {
  72. /*@( 0.1M * 8bit ) / 2sec = 0.4M bits /sec )*/
  73. dm->traffic_load = TRAFFIC_LOW;
  74. } else if (dm->cur_tx_ok_cnt > 25000 || dm->cur_rx_ok_cnt > 25000) {
  75. /*@( 0.025M * 8bit ) / 2sec = 0.1M bits /sec )*/
  76. dm->traffic_load = TRAFFIC_ULTRA_LOW;
  77. } else {
  78. dm->traffic_load = TRAFFIC_NO_TP;
  79. }
  80. /*@[Calculate consecutive idlel time]*/
  81. if (dm->traffic_load == 0)
  82. dm->consecutive_idlel_time += PHYDM_WATCH_DOG_PERIOD;
  83. else
  84. dm->consecutive_idlel_time = 0;
  85. #if 0
  86. PHYDM_DBG(dm, DBG_COMMON_FLOW,
  87. "cur_tx_ok_cnt = %d, cur_rx_ok_cnt = %d, last_tx_ok_cnt = %d, last_rx_ok_cnt = %d\n",
  88. dm->cur_tx_ok_cnt, dm->cur_rx_ok_cnt, dm->last_tx_ok_cnt,
  89. dm->last_rx_ok_cnt);
  90. PHYDM_DBG(dm, DBG_COMMON_FLOW, "tx_tp = %d, rx_tp = %d\n", dm->tx_tp,
  91. dm->rx_tp);
  92. #endif
  93. }
  94. void phydm_cck_new_agc_chk(struct dm_struct *dm)
  95. {
  96. dm->cck_new_agc = 0;
  97. #if ((RTL8723D_SUPPORT == 1) || (RTL8822B_SUPPORT == 1) || \
  98. (RTL8821C_SUPPORT == 1) || (RTL8197F_SUPPORT == 1) || \
  99. (RTL8710B_SUPPORT == 1) || (RTL8192F_SUPPORT == 1) || \
  100. (RTL8195B_SUPPORT == 1) || (RTL8198F_SUPPORT == 1) || \
  101. (RTL8822C_SUPPORT == 1))
  102. if (dm->support_ic_type &
  103. (ODM_RTL8723D | ODM_RTL8822B | ODM_RTL8821C | ODM_RTL8197F |
  104. ODM_RTL8710B | ODM_RTL8192F | ODM_RTL8195B)) {
  105. /*@1: new agc 0: old agc*/
  106. dm->cck_new_agc = (boolean)odm_get_bb_reg(dm, R_0xa9c, BIT(17));
  107. } else if (dm->support_ic_type & (ODM_RTL8198F | ODM_RTL8822C)) {
  108. /*@1: new agc 0: old agc*/
  109. dm->cck_new_agc = (boolean)odm_get_bb_reg(dm, R_0x1a9c,
  110. BIT(17));
  111. }
  112. #endif
  113. }
  114. /*select 3 or 4 bit LNA */
  115. void phydm_cck_lna_bit_num_chk(struct dm_struct *dm)
  116. {
  117. boolean report_type = 0;
  118. #if (RTL8192E_SUPPORT == 1)
  119. u32 value_824, value_82c;
  120. #endif
  121. #if (RTL8192E_SUPPORT == 1)
  122. if (dm->support_ic_type & (ODM_RTL8192E)) {
  123. /* @0x824[9] = 0x82C[9] = 0xA80[7] those registers setting
  124. * should be equal or CCK RSSI report may be incorrect
  125. */
  126. value_824 = odm_get_bb_reg(dm, R_0x824, BIT(9));
  127. value_82c = odm_get_bb_reg(dm, R_0x82c, BIT(9));
  128. if (value_824 != value_82c)
  129. odm_set_bb_reg(dm, R_0x82c, BIT(9), value_824);
  130. odm_set_bb_reg(dm, R_0xa80, BIT(7), value_824);
  131. report_type = (boolean)value_824;
  132. }
  133. #endif
  134. #if (RTL8703B_SUPPORT || RTL8723D_SUPPORT || RTL8710B_SUPPORT)
  135. if (dm->support_ic_type &
  136. (ODM_RTL8703B | ODM_RTL8723D | ODM_RTL8710B)) {
  137. report_type = (boolean)odm_get_bb_reg(dm, R_0x950, BIT(11));
  138. if (report_type != 1)
  139. pr_debug("[Warning] CCK should be 4bit LNA\n");
  140. }
  141. #endif
  142. #if (RTL8821C_SUPPORT == 1)
  143. if (dm->support_ic_type & ODM_RTL8821C) {
  144. if (dm->default_rf_set_8821c == SWITCH_TO_BTG)
  145. report_type = 1;
  146. }
  147. #endif
  148. dm->cck_agc_report_type = report_type;
  149. PHYDM_DBG(dm, ODM_COMP_INIT, "cck_agc_report_type=((%d))\n",
  150. dm->cck_agc_report_type);
  151. }
  152. void phydm_init_cck_setting(struct dm_struct *dm)
  153. {
  154. u32 reg_tmp = 0;
  155. u32 mask_tmp = 0;
  156. reg_tmp = ODM_REG(CCK_RPT_FORMAT, dm);
  157. mask_tmp = ODM_BIT(CCK_RPT_FORMAT, dm);
  158. dm->is_cck_high_power = (boolean)odm_get_bb_reg(dm, reg_tmp, mask_tmp);
  159. PHYDM_DBG(dm, ODM_COMP_INIT, "ext_lna_gain=((%d))\n", dm->ext_lna_gain);
  160. phydm_config_cck_rx_antenna_init(dm);
  161. if (dm->support_ic_type & (ODM_RTL8192F))
  162. phydm_config_cck_rx_path(dm, BB_PATH_AB);
  163. else
  164. phydm_config_cck_rx_path(dm, BB_PATH_A);
  165. phydm_cck_new_agc_chk(dm);
  166. phydm_cck_lna_bit_num_chk(dm);
  167. phydm_get_cck_rssi_table_from_reg(dm);
  168. }
  169. void phydm_init_hw_info_by_rfe(struct dm_struct *dm)
  170. {
  171. #if (RTL8822B_SUPPORT == 1)
  172. /*@if (dm->support_ic_type & ODM_RTL8822B)*/
  173. /*@phydm_init_hw_info_by_rfe_type_8822b(dm);*/
  174. #endif
  175. #if (RTL8821C_SUPPORT == 1)
  176. if (dm->support_ic_type & ODM_RTL8821C)
  177. phydm_init_hw_info_by_rfe_type_8821c(dm);
  178. #endif
  179. #if (RTL8197F_SUPPORT == 1)
  180. if (dm->support_ic_type & ODM_RTL8197F)
  181. phydm_init_hw_info_by_rfe_type_8197f(dm);
  182. #endif
  183. }
  184. void phydm_common_info_self_init(struct dm_struct *dm)
  185. {
  186. u32 reg_tmp = 0;
  187. u32 mask_tmp = 0;
  188. if (dm->support_ic_type & ODM_IC_JGR3_SERIES)
  189. dm->ic_ip_series = PHYDM_IC_JGR3;
  190. else if (dm->support_ic_type & ODM_IC_11AC_SERIES)
  191. dm->ic_ip_series = PHYDM_IC_AC;
  192. else if (dm->support_ic_type & ODM_IC_11N_SERIES)
  193. dm->ic_ip_series = PHYDM_IC_N;
  194. phydm_init_cck_setting(dm);
  195. reg_tmp = ODM_REG(BB_RX_PATH, dm);
  196. mask_tmp = ODM_BIT(BB_RX_PATH, dm);
  197. dm->rf_path_rx_enable = (u8)odm_get_bb_reg(dm, reg_tmp, mask_tmp);
  198. #if (DM_ODM_SUPPORT_TYPE != ODM_CE)
  199. dm->is_net_closed = &dm->BOOLEAN_temp;
  200. phydm_init_debug_setting(dm);
  201. #endif
  202. phydm_init_soft_ml_setting(dm);
  203. dm->phydm_sys_up_time = 0;
  204. if (dm->support_ic_type & ODM_IC_1SS)
  205. dm->num_rf_path = 1;
  206. else if (dm->support_ic_type & ODM_IC_2SS)
  207. dm->num_rf_path = 2;
  208. else if (dm->support_ic_type & ODM_IC_3SS)
  209. dm->num_rf_path = 3;
  210. else if (dm->support_ic_type & ODM_IC_4SS)
  211. dm->num_rf_path = 4;
  212. else
  213. dm->num_rf_path = 1;
  214. phydm_trx_antenna_setting_init(dm, dm->num_rf_path);
  215. dm->tx_rate = 0xFF;
  216. dm->rssi_min_by_path = 0xFF;
  217. dm->number_linked_client = 0;
  218. dm->pre_number_linked_client = 0;
  219. dm->number_active_client = 0;
  220. dm->pre_number_active_client = 0;
  221. dm->last_tx_ok_cnt = 0;
  222. dm->last_rx_ok_cnt = 0;
  223. dm->tx_tp = 0;
  224. dm->rx_tp = 0;
  225. dm->total_tp = 0;
  226. dm->traffic_load = TRAFFIC_LOW;
  227. dm->nbi_set_result = 0;
  228. dm->is_init_hw_info_by_rfe = false;
  229. dm->pre_dbg_priority = DBGPORT_RELEASE;
  230. dm->tp_active_th = 5;
  231. dm->disable_phydm_watchdog = 0;
  232. dm->u8_dummy = 0xf;
  233. dm->u16_dummy = 0xffff;
  234. dm->u32_dummy = 0xffffffff;
  235. dm->pause_lv_table.lv_cckpd = PHYDM_PAUSE_RELEASE;
  236. dm->pause_lv_table.lv_dig = PHYDM_PAUSE_RELEASE;
  237. }
  238. void phydm_cmn_sta_info_update(void *dm_void, u8 macid)
  239. {
  240. struct dm_struct *dm = (struct dm_struct *)dm_void;
  241. struct cmn_sta_info *sta = dm->phydm_sta_info[macid];
  242. struct ra_sta_info *ra = NULL;
  243. if (is_sta_active(sta)) {
  244. ra = &sta->ra_info;
  245. } else {
  246. PHYDM_DBG(dm, DBG_RA_MASK, "[Warning] %s invalid sta_info\n",
  247. __func__);
  248. return;
  249. }
  250. PHYDM_DBG(dm, DBG_RA_MASK, "%s ======>\n", __func__);
  251. PHYDM_DBG(dm, DBG_RA_MASK, "MACID=%d\n", sta->mac_id);
  252. /*@[Calculate TX/RX state]*/
  253. if (sta->tx_moving_average_tp > (sta->rx_moving_average_tp << 1))
  254. ra->txrx_state = TX_STATE;
  255. else if (sta->rx_moving_average_tp > (sta->tx_moving_average_tp << 1))
  256. ra->txrx_state = RX_STATE;
  257. else
  258. ra->txrx_state = BI_DIRECTION_STATE;
  259. ra->is_noisy = dm->noisy_decision;
  260. }
  261. void phydm_common_info_self_update(struct dm_struct *dm)
  262. {
  263. u8 sta_cnt = 0, num_active_client = 0;
  264. u32 i, one_entry_macid = 0;
  265. u32 ma_rx_tp = 0;
  266. u32 tp_diff = 0;
  267. struct cmn_sta_info *sta;
  268. #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
  269. PADAPTER adapter = (PADAPTER)dm->adapter;
  270. PMGNT_INFO mgnt_info = &((PADAPTER)adapter)->MgntInfo;
  271. sta = dm->phydm_sta_info[0];
  272. if (mgnt_info->mAssoc) {
  273. sta->dm_ctrl |= STA_DM_CTRL_ACTIVE;
  274. for (i = 0; i < 6; i++)
  275. sta->mac_addr[i] = mgnt_info->Bssid[i];
  276. } else if (GetFirstClientPort(adapter)) {
  277. //void *client_adapter = GetFirstClientPort(adapter);
  278. struct _ADAPTER *client_adapter = GetFirstClientPort(adapter);
  279. sta->dm_ctrl |= STA_DM_CTRL_ACTIVE;
  280. for (i = 0; i < 6; i++)
  281. sta->mac_addr[i] = client_adapter->MgntInfo.Bssid[i];
  282. } else {
  283. sta->dm_ctrl = sta->dm_ctrl & (~STA_DM_CTRL_ACTIVE);
  284. for (i = 0; i < 6; i++)
  285. sta->mac_addr[i] = 0;
  286. }
  287. /* STA mode is linked to AP */
  288. if (is_sta_active(sta) && !ACTING_AS_AP(adapter))
  289. dm->bsta_state = true;
  290. else
  291. dm->bsta_state = false;
  292. #endif
  293. for (i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++) {
  294. sta = dm->phydm_sta_info[i];
  295. if (is_sta_active(sta)) {
  296. sta_cnt++;
  297. if (sta_cnt == 1)
  298. one_entry_macid = i;
  299. phydm_cmn_sta_info_update(dm, (u8)i);
  300. #if (BEAMFORMING_SUPPORT == 1)
  301. #if 0
  302. /*phydm_get_txbf_device_num(dm, (u8)i);*/
  303. #endif
  304. #endif
  305. ma_rx_tp = sta->rx_moving_average_tp +
  306. sta->tx_moving_average_tp;
  307. PHYDM_DBG(dm, DBG_COMMON_FLOW,
  308. "TP[%d]: ((%d )) bit/sec\n", i, ma_rx_tp);
  309. if (ma_rx_tp > ACTIVE_TP_THRESHOLD)
  310. num_active_client++;
  311. }
  312. }
  313. #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
  314. dm->is_linked = (sta_cnt != 0) ? true : false;
  315. #endif
  316. if (sta_cnt == 1) {
  317. dm->is_one_entry_only = true;
  318. dm->one_entry_macid = one_entry_macid;
  319. dm->one_entry_tp = ma_rx_tp;
  320. dm->tp_active_occur = 0;
  321. PHYDM_DBG(dm, DBG_COMMON_FLOW,
  322. "one_entry_tp=((%d)), pre_one_entry_tp=((%d))\n",
  323. dm->one_entry_tp, dm->pre_one_entry_tp);
  324. if (dm->one_entry_tp > dm->pre_one_entry_tp &&
  325. dm->pre_one_entry_tp <= 2) {
  326. tp_diff = dm->one_entry_tp - dm->pre_one_entry_tp;
  327. if (tp_diff > dm->tp_active_th)
  328. dm->tp_active_occur = 1;
  329. }
  330. dm->pre_one_entry_tp = dm->one_entry_tp;
  331. } else {
  332. dm->is_one_entry_only = false;
  333. }
  334. dm->pre_number_linked_client = dm->number_linked_client;
  335. dm->pre_number_active_client = dm->number_active_client;
  336. dm->number_linked_client = sta_cnt;
  337. dm->number_active_client = num_active_client;
  338. /*Traffic load information update*/
  339. phydm_traffic_load_decision(dm);
  340. dm->phydm_sys_up_time += PHYDM_WATCH_DOG_PERIOD;
  341. dm->is_dfs_band = phydm_is_dfs_band(dm);
  342. dm->phy_dbg_info.show_phy_sts_cnt = 0;
  343. }
  344. void phydm_common_info_self_reset(struct dm_struct *dm)
  345. {
  346. struct odm_phy_dbg_info *dbg_t = &dm->phy_dbg_info;
  347. dbg_t->beacon_cnt_in_period = dbg_t->num_qry_beacon_pkt;
  348. dbg_t->num_qry_beacon_pkt = 0;
  349. dm->rxsc_l = 0xff;
  350. dm->rxsc_20 = 0xff;
  351. dm->rxsc_40 = 0xff;
  352. dm->rxsc_80 = 0xff;
  353. }
  354. void *
  355. phydm_get_structure(struct dm_struct *dm, u8 structure_type)
  356. {
  357. void *structure = NULL;
  358. switch (structure_type) {
  359. case PHYDM_FALSEALMCNT:
  360. structure = &dm->false_alm_cnt;
  361. break;
  362. case PHYDM_CFOTRACK:
  363. structure = &dm->dm_cfo_track;
  364. break;
  365. case PHYDM_ADAPTIVITY:
  366. structure = &dm->adaptivity;
  367. break;
  368. case PHYDM_DFS:
  369. structure = &dm->dfs;
  370. break;
  371. default:
  372. break;
  373. }
  374. return structure;
  375. }
  376. void phydm_phy_info_update(struct dm_struct *dm)
  377. {
  378. #if (RTL8822B_SUPPORT == 1)
  379. if (dm->support_ic_type == ODM_RTL8822B)
  380. dm->phy_dbg_info.condi_num = phydm_get_condi_num_8822b(dm);
  381. #endif
  382. }
  383. void phydm_hw_setting(struct dm_struct *dm)
  384. {
  385. #if (RTL8821A_SUPPORT == 1)
  386. if (dm->support_ic_type & ODM_RTL8821)
  387. odm_hw_setting_8821a(dm);
  388. #endif
  389. #if (RTL8814A_SUPPORT == 1)
  390. if (dm->support_ic_type & ODM_RTL8814A)
  391. phydm_hwsetting_8814a(dm);
  392. #endif
  393. #if (RTL8822B_SUPPORT == 1)
  394. if (dm->support_ic_type & ODM_RTL8822B)
  395. phydm_hwsetting_8822b(dm);
  396. #endif
  397. #if (RTL8812A_SUPPORT == 1)
  398. if (dm->support_ic_type & ODM_RTL8812)
  399. phydm_hwsetting_8812a(dm);
  400. #endif
  401. #if (RTL8197F_SUPPORT == 1)
  402. if (dm->support_ic_type & ODM_RTL8197F)
  403. phydm_hwsetting_8197f(dm);
  404. #endif
  405. #if (RTL8192F_SUPPORT == 1)
  406. if (dm->support_ic_type & ODM_RTL8192F)
  407. phydm_hwsetting_8192f(dm);
  408. #endif
  409. }
  410. #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN))
  411. u64 phydm_supportability_init_win(
  412. void *dm_void)
  413. {
  414. struct dm_struct *dm = (struct dm_struct *)dm_void;
  415. u64 support_ability = 0;
  416. switch (dm->support_ic_type) {
  417. /*@---------------N Series--------------------*/
  418. #if (RTL8188E_SUPPORT == 1)
  419. case ODM_RTL8188E:
  420. support_ability |=
  421. ODM_BB_DIG |
  422. ODM_BB_RA_MASK |
  423. /*ODM_BB_DYNAMIC_TXPWR |*/
  424. ODM_BB_FA_CNT |
  425. ODM_BB_RSSI_MONITOR |
  426. ODM_BB_CCK_PD |
  427. /*ODM_BB_PWR_TRAIN |*/
  428. ODM_BB_RATE_ADAPTIVE |
  429. ODM_BB_CFO_TRACKING |
  430. ODM_BB_ENV_MONITOR |
  431. ODM_BB_PRIMARY_CCA;
  432. break;
  433. #endif
  434. #if (RTL8192E_SUPPORT == 1)
  435. case ODM_RTL8192E:
  436. support_ability |=
  437. ODM_BB_DIG |
  438. ODM_BB_RA_MASK |
  439. /*ODM_BB_DYNAMIC_TXPWR |*/
  440. ODM_BB_FA_CNT |
  441. ODM_BB_RSSI_MONITOR |
  442. ODM_BB_CCK_PD |
  443. /*ODM_BB_PWR_TRAIN |*/
  444. ODM_BB_RATE_ADAPTIVE |
  445. ODM_BB_CFO_TRACKING |
  446. ODM_BB_ENV_MONITOR |
  447. ODM_BB_PRIMARY_CCA;
  448. break;
  449. #endif
  450. #if (RTL8723B_SUPPORT == 1)
  451. case ODM_RTL8723B:
  452. support_ability |=
  453. ODM_BB_DIG |
  454. ODM_BB_RA_MASK |
  455. /*ODM_BB_DYNAMIC_TXPWR |*/
  456. ODM_BB_FA_CNT |
  457. ODM_BB_RSSI_MONITOR |
  458. ODM_BB_CCK_PD |
  459. /*ODM_BB_PWR_TRAIN |*/
  460. ODM_BB_RATE_ADAPTIVE |
  461. ODM_BB_CFO_TRACKING |
  462. ODM_BB_ENV_MONITOR |
  463. ODM_BB_PRIMARY_CCA;
  464. break;
  465. #endif
  466. #if (RTL8703B_SUPPORT == 1)
  467. case ODM_RTL8703B:
  468. support_ability |=
  469. ODM_BB_DIG |
  470. ODM_BB_RA_MASK |
  471. /*ODM_BB_DYNAMIC_TXPWR |*/
  472. ODM_BB_FA_CNT |
  473. ODM_BB_RSSI_MONITOR |
  474. ODM_BB_CCK_PD |
  475. /*ODM_BB_PWR_TRAIN |*/
  476. ODM_BB_RATE_ADAPTIVE |
  477. ODM_BB_CFO_TRACKING |
  478. ODM_BB_ENV_MONITOR;
  479. break;
  480. #endif
  481. #if (RTL8723D_SUPPORT == 1)
  482. case ODM_RTL8723D:
  483. support_ability |=
  484. ODM_BB_DIG |
  485. ODM_BB_RA_MASK |
  486. /*ODM_BB_DYNAMIC_TXPWR |*/
  487. ODM_BB_FA_CNT |
  488. ODM_BB_RSSI_MONITOR |
  489. ODM_BB_CCK_PD |
  490. ODM_BB_PWR_TRAIN |
  491. ODM_BB_RATE_ADAPTIVE |
  492. ODM_BB_CFO_TRACKING |
  493. ODM_BB_ENV_MONITOR;
  494. break;
  495. #endif
  496. #if (RTL8710B_SUPPORT == 1)
  497. case ODM_RTL8710B:
  498. support_ability |=
  499. ODM_BB_DIG |
  500. ODM_BB_RA_MASK |
  501. /*ODM_BB_DYNAMIC_TXPWR |*/
  502. ODM_BB_FA_CNT |
  503. ODM_BB_RSSI_MONITOR |
  504. ODM_BB_CCK_PD |
  505. ODM_BB_PWR_TRAIN |
  506. ODM_BB_RATE_ADAPTIVE |
  507. ODM_BB_CFO_TRACKING |
  508. ODM_BB_ENV_MONITOR;
  509. break;
  510. #endif
  511. #if (RTL8188F_SUPPORT == 1)
  512. case ODM_RTL8188F:
  513. support_ability |=
  514. ODM_BB_DIG |
  515. ODM_BB_RA_MASK |
  516. /*ODM_BB_DYNAMIC_TXPWR |*/
  517. ODM_BB_FA_CNT |
  518. ODM_BB_RSSI_MONITOR |
  519. ODM_BB_CCK_PD |
  520. /*ODM_BB_PWR_TRAIN |*/
  521. ODM_BB_RATE_ADAPTIVE |
  522. ODM_BB_CFO_TRACKING |
  523. ODM_BB_ENV_MONITOR;
  524. break;
  525. #endif
  526. #if (RTL8192F_SUPPORT == 1)
  527. case ODM_RTL8192F:
  528. support_ability |=
  529. ODM_BB_DIG |
  530. ODM_BB_RA_MASK |
  531. ODM_BB_FA_CNT |
  532. ODM_BB_RSSI_MONITOR |
  533. ODM_BB_CCK_PD |
  534. ODM_BB_PWR_TRAIN |
  535. ODM_BB_RATE_ADAPTIVE |
  536. ODM_BB_CFO_TRACKING |
  537. ODM_BB_ADAPTIVE_SOML |
  538. ODM_BB_ENV_MONITOR;
  539. /*ODM_BB_LNA_SAT_CHK |*/
  540. /*ODM_BB_PRIMARY_CCA*/
  541. break;
  542. #endif
  543. /*@---------------AC Series-------------------*/
  544. #if ((RTL8812A_SUPPORT == 1) || (RTL8821A_SUPPORT == 1))
  545. case ODM_RTL8812:
  546. case ODM_RTL8821:
  547. support_ability |=
  548. ODM_BB_DIG |
  549. ODM_BB_RA_MASK |
  550. ODM_BB_DYNAMIC_TXPWR |
  551. ODM_BB_FA_CNT |
  552. ODM_BB_RSSI_MONITOR |
  553. ODM_BB_CCK_PD |
  554. /*ODM_BB_PWR_TRAIN |*/
  555. ODM_BB_RATE_ADAPTIVE |
  556. ODM_BB_CFO_TRACKING |
  557. ODM_BB_ENV_MONITOR;
  558. break;
  559. #endif
  560. #if (RTL8814A_SUPPORT == 1)
  561. case ODM_RTL8814A:
  562. support_ability |=
  563. ODM_BB_DIG |
  564. ODM_BB_RA_MASK |
  565. ODM_BB_DYNAMIC_TXPWR |
  566. ODM_BB_FA_CNT |
  567. ODM_BB_RSSI_MONITOR |
  568. ODM_BB_CCK_PD |
  569. /*ODM_BB_PWR_TRAIN |*/
  570. ODM_BB_RATE_ADAPTIVE |
  571. ODM_BB_CFO_TRACKING |
  572. ODM_BB_ENV_MONITOR;
  573. break;
  574. #endif
  575. #if (RTL8814B_SUPPORT == 1)
  576. case ODM_RTL8814B:
  577. support_ability |=
  578. ODM_BB_DIG |
  579. ODM_BB_RA_MASK |
  580. /*ODM_BB_DYNAMIC_TXPWR |*/
  581. ODM_BB_FA_CNT |
  582. ODM_BB_RSSI_MONITOR |
  583. ODM_BB_CCK_PD |
  584. /*ODM_BB_PWR_TRAIN |*/
  585. ODM_BB_RATE_ADAPTIVE |
  586. ODM_BB_CFO_TRACKING |
  587. ODM_BB_ENV_MONITOR;
  588. break;
  589. #endif
  590. #if (RTL8822B_SUPPORT == 1)
  591. case ODM_RTL8822B:
  592. support_ability |=
  593. ODM_BB_DIG |
  594. ODM_BB_RA_MASK |
  595. /*ODM_BB_DYNAMIC_TXPWR |*/
  596. ODM_BB_FA_CNT |
  597. ODM_BB_RSSI_MONITOR |
  598. ODM_BB_CCK_PD |
  599. /*ODM_BB_PWR_TRAIN |*/
  600. /*ODM_BB_ADAPTIVE_SOML |*/
  601. ODM_BB_RATE_ADAPTIVE |
  602. ODM_BB_CFO_TRACKING |
  603. ODM_BB_ENV_MONITOR;
  604. break;
  605. #endif
  606. #if (RTL8821C_SUPPORT == 1)
  607. case ODM_RTL8821C:
  608. support_ability |=
  609. ODM_BB_DIG |
  610. ODM_BB_RA_MASK |
  611. /*ODM_BB_DYNAMIC_TXPWR |*/
  612. ODM_BB_FA_CNT |
  613. ODM_BB_RSSI_MONITOR |
  614. ODM_BB_CCK_PD |
  615. /*ODM_BB_PWR_TRAIN |*/
  616. ODM_BB_RATE_ADAPTIVE |
  617. ODM_BB_CFO_TRACKING |
  618. ODM_BB_ENV_MONITOR;
  619. break;
  620. #endif
  621. default:
  622. support_ability |=
  623. ODM_BB_DIG |
  624. ODM_BB_RA_MASK |
  625. /*ODM_BB_DYNAMIC_TXPWR |*/
  626. ODM_BB_FA_CNT |
  627. ODM_BB_RSSI_MONITOR |
  628. ODM_BB_CCK_PD |
  629. /*ODM_BB_PWR_TRAIN |*/
  630. ODM_BB_RATE_ADAPTIVE |
  631. ODM_BB_CFO_TRACKING |
  632. ODM_BB_ENV_MONITOR;
  633. pr_debug("[Warning] Supportability Init Warning !!!\n");
  634. break;
  635. }
  636. return support_ability;
  637. }
  638. #endif
  639. #if (DM_ODM_SUPPORT_TYPE & (ODM_CE))
  640. u64 phydm_supportability_init_ce(void *dm_void)
  641. {
  642. struct dm_struct *dm = (struct dm_struct *)dm_void;
  643. u64 support_ability = 0;
  644. switch (dm->support_ic_type) {
  645. /*@---------------N Series--------------------*/
  646. #if (RTL8188E_SUPPORT == 1)
  647. case ODM_RTL8188E:
  648. support_ability |=
  649. ODM_BB_DIG |
  650. ODM_BB_RA_MASK |
  651. /*@ODM_BB_DYNAMIC_TXPWR |*/
  652. ODM_BB_FA_CNT |
  653. ODM_BB_RSSI_MONITOR |
  654. ODM_BB_CCK_PD |
  655. /*@ODM_BB_PWR_TRAIN |*/
  656. ODM_BB_RATE_ADAPTIVE |
  657. ODM_BB_CFO_TRACKING |
  658. ODM_BB_ENV_MONITOR |
  659. ODM_BB_PRIMARY_CCA;
  660. break;
  661. #endif
  662. #if (RTL8192E_SUPPORT == 1)
  663. case ODM_RTL8192E:
  664. support_ability |=
  665. ODM_BB_DIG |
  666. ODM_BB_RA_MASK |
  667. /*@ODM_BB_DYNAMIC_TXPWR |*/
  668. ODM_BB_FA_CNT |
  669. ODM_BB_RSSI_MONITOR |
  670. ODM_BB_CCK_PD |
  671. /*@ODM_BB_PWR_TRAIN |*/
  672. ODM_BB_RATE_ADAPTIVE |
  673. ODM_BB_CFO_TRACKING |
  674. ODM_BB_ENV_MONITOR |
  675. ODM_BB_PRIMARY_CCA;
  676. break;
  677. #endif
  678. #if (RTL8723B_SUPPORT == 1)
  679. case ODM_RTL8723B:
  680. support_ability |=
  681. ODM_BB_DIG |
  682. ODM_BB_RA_MASK |
  683. /*@ODM_BB_DYNAMIC_TXPWR |*/
  684. ODM_BB_FA_CNT |
  685. ODM_BB_RSSI_MONITOR |
  686. ODM_BB_CCK_PD |
  687. /*@ODM_BB_PWR_TRAIN |*/
  688. ODM_BB_RATE_ADAPTIVE |
  689. ODM_BB_CFO_TRACKING |
  690. ODM_BB_ENV_MONITOR |
  691. ODM_BB_PRIMARY_CCA;
  692. break;
  693. #endif
  694. #if (RTL8703B_SUPPORT == 1)
  695. case ODM_RTL8703B:
  696. support_ability |=
  697. ODM_BB_DIG |
  698. ODM_BB_RA_MASK |
  699. /*@ODM_BB_DYNAMIC_TXPWR |*/
  700. ODM_BB_FA_CNT |
  701. ODM_BB_RSSI_MONITOR |
  702. ODM_BB_CCK_PD |
  703. /*@ODM_BB_PWR_TRAIN |*/
  704. ODM_BB_RATE_ADAPTIVE |
  705. ODM_BB_CFO_TRACKING |
  706. ODM_BB_ENV_MONITOR;
  707. break;
  708. #endif
  709. #if (RTL8723D_SUPPORT == 1)
  710. case ODM_RTL8723D:
  711. support_ability |=
  712. ODM_BB_DIG |
  713. ODM_BB_RA_MASK |
  714. /*@ODM_BB_DYNAMIC_TXPWR |*/
  715. ODM_BB_FA_CNT |
  716. ODM_BB_RSSI_MONITOR |
  717. ODM_BB_CCK_PD |
  718. ODM_BB_PWR_TRAIN |
  719. ODM_BB_RATE_ADAPTIVE |
  720. ODM_BB_CFO_TRACKING |
  721. ODM_BB_ENV_MONITOR;
  722. break;
  723. #endif
  724. #if (RTL8710B_SUPPORT == 1)
  725. case ODM_RTL8710B:
  726. support_ability |=
  727. ODM_BB_DIG |
  728. ODM_BB_RA_MASK |
  729. /*@ODM_BB_DYNAMIC_TXPWR |*/
  730. ODM_BB_FA_CNT |
  731. ODM_BB_RSSI_MONITOR |
  732. ODM_BB_CCK_PD |
  733. /*@ODM_BB_PWR_TRAIN |*/
  734. ODM_BB_RATE_ADAPTIVE |
  735. ODM_BB_CFO_TRACKING |
  736. ODM_BB_ENV_MONITOR;
  737. break;
  738. #endif
  739. #if (RTL8188F_SUPPORT == 1)
  740. case ODM_RTL8188F:
  741. support_ability |=
  742. ODM_BB_DIG |
  743. ODM_BB_RA_MASK |
  744. /*@ODM_BB_DYNAMIC_TXPWR |*/
  745. ODM_BB_FA_CNT |
  746. ODM_BB_RSSI_MONITOR |
  747. ODM_BB_CCK_PD |
  748. /*@ODM_BB_PWR_TRAIN |*/
  749. ODM_BB_RATE_ADAPTIVE |
  750. ODM_BB_CFO_TRACKING |
  751. ODM_BB_ENV_MONITOR;
  752. break;
  753. #endif
  754. /*@jj add 20170822*/
  755. #if (RTL8192F_SUPPORT == 1)
  756. case ODM_RTL8192F:
  757. support_ability |=
  758. ODM_BB_DIG |
  759. ODM_BB_RA_MASK |
  760. ODM_BB_FA_CNT |
  761. ODM_BB_RSSI_MONITOR |
  762. ODM_BB_CCK_PD |
  763. ODM_BB_PWR_TRAIN |
  764. ODM_BB_RATE_ADAPTIVE |
  765. ODM_BB_CFO_TRACKING |
  766. /*@ODM_BB_ADAPTIVE_SOML |*/
  767. ODM_BB_ENV_MONITOR;
  768. /*@ODM_BB_LNA_SAT_CHK |*/
  769. /*@ODM_BB_PRIMARY_CCA*/
  770. break;
  771. #endif
  772. /*@---------------AC Series-------------------*/
  773. #if ((RTL8812A_SUPPORT == 1) || (RTL8821A_SUPPORT == 1))
  774. case ODM_RTL8812:
  775. case ODM_RTL8821:
  776. support_ability |=
  777. ODM_BB_DIG |
  778. ODM_BB_RA_MASK |
  779. /*@ODM_BB_DYNAMIC_TXPWR |*/
  780. ODM_BB_FA_CNT |
  781. ODM_BB_RSSI_MONITOR |
  782. ODM_BB_CCK_PD |
  783. /*@ODM_BB_PWR_TRAIN |*/
  784. ODM_BB_RATE_ADAPTIVE |
  785. ODM_BB_CFO_TRACKING |
  786. ODM_BB_ENV_MONITOR;
  787. break;
  788. #endif
  789. #if (RTL8814A_SUPPORT == 1)
  790. case ODM_RTL8814A:
  791. support_ability |=
  792. ODM_BB_DIG |
  793. ODM_BB_RA_MASK |
  794. /*@ODM_BB_DYNAMIC_TXPWR |*/
  795. ODM_BB_FA_CNT |
  796. ODM_BB_RSSI_MONITOR |
  797. ODM_BB_CCK_PD |
  798. /*@ODM_BB_PWR_TRAIN |*/
  799. ODM_BB_RATE_ADAPTIVE |
  800. ODM_BB_CFO_TRACKING |
  801. ODM_BB_ENV_MONITOR;
  802. break;
  803. #endif
  804. #if (RTL8814B_SUPPORT == 1)
  805. case ODM_RTL8814B:
  806. support_ability |=
  807. ODM_BB_DIG |
  808. ODM_BB_RA_MASK |
  809. /*@ODM_BB_DYNAMIC_TXPWR |*/
  810. ODM_BB_FA_CNT |
  811. ODM_BB_RSSI_MONITOR |
  812. ODM_BB_CCK_PD |
  813. /*@ODM_BB_PWR_TRAIN |*/
  814. ODM_BB_RATE_ADAPTIVE |
  815. ODM_BB_CFO_TRACKING |
  816. ODM_BB_ENV_MONITOR;
  817. break;
  818. #endif
  819. #if (RTL8822B_SUPPORT == 1)
  820. case ODM_RTL8822B:
  821. support_ability |=
  822. ODM_BB_DIG |
  823. ODM_BB_RA_MASK |
  824. /*@ODM_BB_DYNAMIC_TXPWR |*/
  825. ODM_BB_FA_CNT |
  826. ODM_BB_RSSI_MONITOR |
  827. ODM_BB_CCK_PD |
  828. /*@ODM_BB_PWR_TRAIN |*/
  829. ODM_BB_RATE_ADAPTIVE |
  830. ODM_BB_CFO_TRACKING |
  831. ODM_BB_ENV_MONITOR;
  832. break;
  833. #endif
  834. #if (RTL8821C_SUPPORT == 1)
  835. case ODM_RTL8821C:
  836. support_ability |=
  837. ODM_BB_DIG |
  838. ODM_BB_RA_MASK |
  839. /*@ODM_BB_DYNAMIC_TXPWR |*/
  840. ODM_BB_FA_CNT |
  841. ODM_BB_RSSI_MONITOR |
  842. ODM_BB_CCK_PD |
  843. /*@ODM_BB_PWR_TRAIN |*/
  844. ODM_BB_RATE_ADAPTIVE |
  845. ODM_BB_CFO_TRACKING |
  846. ODM_BB_ENV_MONITOR;
  847. break;
  848. #endif
  849. default:
  850. support_ability |=
  851. ODM_BB_DIG |
  852. ODM_BB_RA_MASK |
  853. /*@ODM_BB_DYNAMIC_TXPWR |*/
  854. ODM_BB_FA_CNT |
  855. ODM_BB_RSSI_MONITOR |
  856. ODM_BB_CCK_PD |
  857. /*@ODM_BB_PWR_TRAIN |*/
  858. ODM_BB_RATE_ADAPTIVE |
  859. ODM_BB_CFO_TRACKING |
  860. ODM_BB_ENV_MONITOR;
  861. pr_debug("[Warning] Supportability Init Warning !!!\n");
  862. break;
  863. }
  864. return support_ability;
  865. }
  866. #endif
  867. #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
  868. u64 phydm_supportability_init_ap(
  869. void *dm_void)
  870. {
  871. struct dm_struct *dm = (struct dm_struct *)dm_void;
  872. u64 support_ability = 0;
  873. switch (dm->support_ic_type) {
  874. /*@---------------N Series--------------------*/
  875. #if (RTL8188E_SUPPORT == 1)
  876. case ODM_RTL8188E:
  877. support_ability |=
  878. ODM_BB_DIG |
  879. ODM_BB_RA_MASK |
  880. ODM_BB_FA_CNT |
  881. ODM_BB_RSSI_MONITOR |
  882. ODM_BB_CCK_PD |
  883. /*ODM_BB_PWR_TRAIN |*/
  884. ODM_BB_RATE_ADAPTIVE |
  885. ODM_BB_CFO_TRACKING |
  886. ODM_BB_ENV_MONITOR |
  887. ODM_BB_PRIMARY_CCA;
  888. break;
  889. #endif
  890. #if (RTL8192E_SUPPORT == 1)
  891. case ODM_RTL8192E:
  892. support_ability |=
  893. ODM_BB_DIG |
  894. ODM_BB_RA_MASK |
  895. ODM_BB_FA_CNT |
  896. ODM_BB_RSSI_MONITOR |
  897. ODM_BB_CCK_PD |
  898. /*ODM_BB_PWR_TRAIN |*/
  899. ODM_BB_RATE_ADAPTIVE |
  900. ODM_BB_CFO_TRACKING |
  901. ODM_BB_ENV_MONITOR |
  902. ODM_BB_PRIMARY_CCA;
  903. break;
  904. #endif
  905. #if (RTL8723B_SUPPORT == 1)
  906. case ODM_RTL8723B:
  907. support_ability |=
  908. ODM_BB_DIG |
  909. ODM_BB_RA_MASK |
  910. ODM_BB_FA_CNT |
  911. ODM_BB_RSSI_MONITOR |
  912. ODM_BB_CCK_PD |
  913. /*ODM_BB_PWR_TRAIN |*/
  914. ODM_BB_RATE_ADAPTIVE |
  915. ODM_BB_CFO_TRACKING |
  916. ODM_BB_ENV_MONITOR;
  917. break;
  918. #endif
  919. #if ((RTL8198F_SUPPORT == 1) || (RTL8197F_SUPPORT == 1))
  920. case ODM_RTL8198F:
  921. support_ability |=
  922. /*ODM_BB_DIG |*/
  923. ODM_BB_RA_MASK |
  924. ODM_BB_FA_CNT |
  925. ODM_BB_RSSI_MONITOR;
  926. /*ODM_BB_CCK_PD |*/
  927. /*ODM_BB_PWR_TRAIN |*/
  928. /*ODM_BB_RATE_ADAPTIVE |*/
  929. /*ODM_BB_CFO_TRACKING |*/
  930. /*ODM_BB_ADAPTIVE_SOML |*/
  931. /*ODM_BB_ENV_MONITOR |*/
  932. /*ODM_BB_LNA_SAT_CHK |*/
  933. /*ODM_BB_PRIMARY_CCA;*/
  934. break;
  935. case ODM_RTL8197F:
  936. support_ability |=
  937. ODM_BB_DIG |
  938. ODM_BB_RA_MASK |
  939. ODM_BB_FA_CNT |
  940. ODM_BB_RSSI_MONITOR |
  941. ODM_BB_CCK_PD |
  942. /*ODM_BB_PWR_TRAIN |*/
  943. ODM_BB_RATE_ADAPTIVE |
  944. ODM_BB_CFO_TRACKING |
  945. ODM_BB_ADAPTIVE_SOML |
  946. ODM_BB_ENV_MONITOR |
  947. ODM_BB_LNA_SAT_CHK |
  948. ODM_BB_PRIMARY_CCA;
  949. break;
  950. #endif
  951. #if (RTL8192F_SUPPORT == 1)
  952. case ODM_RTL8192F:
  953. support_ability |=
  954. ODM_BB_DIG |
  955. ODM_BB_RA_MASK |
  956. ODM_BB_FA_CNT |
  957. ODM_BB_RSSI_MONITOR |
  958. ODM_BB_CCK_PD |
  959. /*ODM_BB_PWR_TRAIN |*/
  960. ODM_BB_RATE_ADAPTIVE |
  961. /*ODM_BB_CFO_TRACKING |*/
  962. ODM_BB_ADAPTIVE_SOML |
  963. /*ODM_BB_ENV_MONITOR |*/
  964. /*ODM_BB_LNA_SAT_CHK |*/
  965. /*ODM_BB_PRIMARY_CCA |*/
  966. 0;
  967. break;
  968. #endif
  969. /*@---------------AC Series-------------------*/
  970. #if (RTL8881A_SUPPORT == 1)
  971. case ODM_RTL8881A:
  972. support_ability |=
  973. ODM_BB_DIG |
  974. ODM_BB_RA_MASK |
  975. ODM_BB_FA_CNT |
  976. ODM_BB_RSSI_MONITOR |
  977. ODM_BB_CCK_PD |
  978. /*ODM_BB_PWR_TRAIN |*/
  979. ODM_BB_RATE_ADAPTIVE |
  980. ODM_BB_CFO_TRACKING |
  981. ODM_BB_ENV_MONITOR;
  982. break;
  983. #endif
  984. #if (RTL8814A_SUPPORT == 1)
  985. case ODM_RTL8814A:
  986. support_ability |=
  987. ODM_BB_DIG |
  988. ODM_BB_RA_MASK |
  989. ODM_BB_FA_CNT |
  990. ODM_BB_RSSI_MONITOR |
  991. ODM_BB_CCK_PD |
  992. /*ODM_BB_PWR_TRAIN |*/
  993. ODM_BB_RATE_ADAPTIVE |
  994. ODM_BB_CFO_TRACKING |
  995. ODM_BB_ENV_MONITOR;
  996. break;
  997. #endif
  998. #if (RTL8814B_SUPPORT == 1)
  999. case ODM_RTL8814B:
  1000. support_ability |=
  1001. ODM_BB_DIG |
  1002. ODM_BB_RA_MASK |
  1003. ODM_BB_FA_CNT |
  1004. ODM_BB_RSSI_MONITOR |
  1005. ODM_BB_CCK_PD |
  1006. /*ODM_BB_PWR_TRAIN |*/
  1007. ODM_BB_RATE_ADAPTIVE |
  1008. ODM_BB_CFO_TRACKING |
  1009. ODM_BB_ENV_MONITOR;
  1010. break;
  1011. #endif
  1012. #if (RTL8822B_SUPPORT == 1)
  1013. case ODM_RTL8822B:
  1014. support_ability |=
  1015. ODM_BB_DIG |
  1016. ODM_BB_RA_MASK |
  1017. ODM_BB_FA_CNT |
  1018. ODM_BB_RSSI_MONITOR |
  1019. ODM_BB_CCK_PD |
  1020. /*ODM_BB_PWR_TRAIN |*/
  1021. /*ODM_BB_ADAPTIVE_SOML |*/
  1022. ODM_BB_RATE_ADAPTIVE |
  1023. ODM_BB_CFO_TRACKING |
  1024. ODM_BB_ENV_MONITOR;
  1025. break;
  1026. #endif
  1027. #if (RTL8821C_SUPPORT == 1)
  1028. case ODM_RTL8821C:
  1029. support_ability |=
  1030. ODM_BB_DIG |
  1031. ODM_BB_RA_MASK |
  1032. ODM_BB_FA_CNT |
  1033. ODM_BB_RSSI_MONITOR |
  1034. ODM_BB_CCK_PD |
  1035. /*ODM_BB_PWR_TRAIN |*/
  1036. ODM_BB_RATE_ADAPTIVE |
  1037. ODM_BB_CFO_TRACKING |
  1038. ODM_BB_ENV_MONITOR;
  1039. break;
  1040. #endif
  1041. default:
  1042. support_ability |=
  1043. ODM_BB_DIG |
  1044. ODM_BB_RA_MASK |
  1045. ODM_BB_FA_CNT |
  1046. ODM_BB_RSSI_MONITOR |
  1047. ODM_BB_CCK_PD |
  1048. /*ODM_BB_PWR_TRAIN |*/
  1049. ODM_BB_RATE_ADAPTIVE |
  1050. ODM_BB_CFO_TRACKING |
  1051. ODM_BB_ENV_MONITOR;
  1052. pr_debug("[Warning] Supportability Init Warning !!!\n");
  1053. break;
  1054. }
  1055. #if 0
  1056. /*@[Config Antenna Diveristy]*/
  1057. if (*dm->enable_antdiv)
  1058. support_ability |= ODM_BB_ANT_DIV;
  1059. /*@[Config Adaptivity]*/
  1060. if (*dm->enable_adaptivity)
  1061. support_ability |= ODM_BB_ADAPTIVITY;
  1062. #endif
  1063. return support_ability;
  1064. }
  1065. #endif
  1066. #if (DM_ODM_SUPPORT_TYPE & (ODM_IOT))
  1067. u64 phydm_supportability_init_iot(
  1068. void *dm_void)
  1069. {
  1070. struct dm_struct *dm = (struct dm_struct *)dm_void;
  1071. u64 support_ability = 0;
  1072. switch (dm->support_ic_type) {
  1073. #if (RTL8710B_SUPPORT == 1)
  1074. case ODM_RTL8710B:
  1075. support_ability |=
  1076. ODM_BB_DIG |
  1077. ODM_BB_RA_MASK |
  1078. /*ODM_BB_DYNAMIC_TXPWR |*/
  1079. ODM_BB_FA_CNT |
  1080. ODM_BB_RSSI_MONITOR |
  1081. ODM_BB_CCK_PD |
  1082. /*ODM_BB_PWR_TRAIN |*/
  1083. ODM_BB_RATE_ADAPTIVE |
  1084. ODM_BB_CFO_TRACKING |
  1085. ODM_BB_ENV_MONITOR;
  1086. break;
  1087. #endif
  1088. #if (RTL8195A_SUPPORT == 1)
  1089. case ODM_RTL8195A:
  1090. support_ability |=
  1091. ODM_BB_DIG |
  1092. ODM_BB_RA_MASK |
  1093. /*ODM_BB_DYNAMIC_TXPWR |*/
  1094. ODM_BB_FA_CNT |
  1095. ODM_BB_RSSI_MONITOR |
  1096. ODM_BB_CCK_PD |
  1097. /*ODM_BB_PWR_TRAIN |*/
  1098. ODM_BB_RATE_ADAPTIVE |
  1099. ODM_BB_CFO_TRACKING |
  1100. ODM_BB_ENV_MONITOR;
  1101. break;
  1102. #endif
  1103. default:
  1104. support_ability |=
  1105. ODM_BB_DIG |
  1106. ODM_BB_RA_MASK |
  1107. /*ODM_BB_DYNAMIC_TXPWR |*/
  1108. ODM_BB_FA_CNT |
  1109. ODM_BB_RSSI_MONITOR |
  1110. ODM_BB_CCK_PD |
  1111. /*ODM_BB_PWR_TRAIN |*/
  1112. ODM_BB_RATE_ADAPTIVE |
  1113. ODM_BB_CFO_TRACKING |
  1114. ODM_BB_ENV_MONITOR;
  1115. pr_debug("[Warning] Supportability Init Warning !!!\n");
  1116. break;
  1117. }
  1118. return support_ability;
  1119. }
  1120. #endif
  1121. void phydm_fwoffload_ability_init(struct dm_struct *dm,
  1122. enum phydm_offload_ability offload_ability)
  1123. {
  1124. switch (offload_ability) {
  1125. case PHYDM_PHY_PARAM_OFFLOAD:
  1126. if (dm->support_ic_type &
  1127. (ODM_RTL8814A | ODM_RTL8822B | ODM_RTL8821C))
  1128. dm->fw_offload_ability |= PHYDM_PHY_PARAM_OFFLOAD;
  1129. break;
  1130. case PHYDM_RF_IQK_OFFLOAD:
  1131. dm->fw_offload_ability |= PHYDM_RF_IQK_OFFLOAD;
  1132. break;
  1133. default:
  1134. PHYDM_DBG(dm, ODM_COMP_INIT, "fwofflad, wrong init type!!\n");
  1135. break;
  1136. }
  1137. PHYDM_DBG(dm, ODM_COMP_INIT, "fw_offload_ability = %x\n",
  1138. dm->fw_offload_ability);
  1139. }
  1140. void phydm_fwoffload_ability_clear(struct dm_struct *dm,
  1141. enum phydm_offload_ability offload_ability)
  1142. {
  1143. switch (offload_ability) {
  1144. case PHYDM_PHY_PARAM_OFFLOAD:
  1145. if (dm->support_ic_type &
  1146. (ODM_RTL8814A | ODM_RTL8822B | ODM_RTL8821C))
  1147. dm->fw_offload_ability &= (~PHYDM_PHY_PARAM_OFFLOAD);
  1148. break;
  1149. case PHYDM_RF_IQK_OFFLOAD:
  1150. dm->fw_offload_ability &= (~PHYDM_RF_IQK_OFFLOAD);
  1151. break;
  1152. default:
  1153. PHYDM_DBG(dm, ODM_COMP_INIT, "fwofflad, wrong init type!!\n");
  1154. break;
  1155. }
  1156. PHYDM_DBG(dm, ODM_COMP_INIT, "fw_offload_ability = %x\n",
  1157. dm->fw_offload_ability);
  1158. }
  1159. void phydm_supportability_init(void *dm_void)
  1160. {
  1161. struct dm_struct *dm = (struct dm_struct *)dm_void;
  1162. u64 support_ability;
  1163. if (*dm->mp_mode) {
  1164. support_ability = 0;
  1165. } else {
  1166. #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN))
  1167. support_ability = phydm_supportability_init_win(dm);
  1168. #elif (DM_ODM_SUPPORT_TYPE & (ODM_AP))
  1169. support_ability = phydm_supportability_init_ap(dm);
  1170. #elif(DM_ODM_SUPPORT_TYPE & (ODM_CE))
  1171. support_ability = phydm_supportability_init_ce(dm);
  1172. #elif(DM_ODM_SUPPORT_TYPE & (ODM_IOT))
  1173. support_ability = phydm_supportability_init_iot(dm);
  1174. #endif
  1175. /*@[Config Antenna Diveristy]*/
  1176. if (IS_FUNC_EN(dm->enable_antdiv))
  1177. support_ability |= ODM_BB_ANT_DIV;
  1178. /*@[Config Adaptive SOML]*/
  1179. if (IS_FUNC_EN(dm->en_adap_soml))
  1180. support_ability |= ODM_BB_ADAPTIVE_SOML;
  1181. /*@[Config Adaptivity]*/
  1182. if (IS_FUNC_EN(dm->enable_adaptivity))
  1183. support_ability |= ODM_BB_ADAPTIVITY;
  1184. }
  1185. odm_cmn_info_init(dm, ODM_CMNINFO_ABILITY, support_ability);
  1186. PHYDM_DBG(dm, ODM_COMP_INIT,
  1187. "IC = ((0x%x)), Supportability Init = ((0x%llx))\n",
  1188. dm->support_ic_type, dm->support_ability);
  1189. }
  1190. void phydm_rfe_init(void *dm_void)
  1191. {
  1192. struct dm_struct *dm = (struct dm_struct *)dm_void;
  1193. PHYDM_DBG(dm, ODM_COMP_INIT, "RFE_Init\n");
  1194. #if (RTL8822B_SUPPORT == 1)
  1195. if (dm->support_ic_type == ODM_RTL8822B)
  1196. phydm_rfe_8822b_init(dm);
  1197. #endif
  1198. }
  1199. void phydm_dm_early_init(struct dm_struct *dm)
  1200. {
  1201. #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
  1202. halrf_init(dm);
  1203. #endif
  1204. }
  1205. void odm_dm_init(struct dm_struct *dm)
  1206. {
  1207. halrf_init(dm);
  1208. phydm_supportability_init(dm);
  1209. phydm_rfe_init(dm);
  1210. phydm_common_info_self_init(dm);
  1211. phydm_rx_phy_status_init(dm);
  1212. #ifdef PHYDM_AUTO_DEGBUG
  1213. phydm_auto_dbg_engine_init(dm);
  1214. #endif
  1215. phydm_dig_init(dm);
  1216. #ifdef PHYDM_SUPPORT_CCKPD
  1217. phydm_cck_pd_init(dm);
  1218. #endif
  1219. phydm_env_monitor_init(dm);
  1220. phydm_adaptivity_init(dm);
  1221. phydm_ra_info_init(dm);
  1222. phydm_rssi_monitor_init(dm);
  1223. phydm_cfo_tracking_init(dm);
  1224. phydm_rf_init(dm);
  1225. phydm_dc_cancellation(dm);
  1226. #ifdef PHYDM_TXA_CALIBRATION
  1227. phydm_txcurrentcalibration(dm);
  1228. phydm_get_pa_bias_offset(dm);
  1229. #endif
  1230. #ifdef CONFIG_PHYDM_ANTENNA_DIVERSITY
  1231. odm_antenna_diversity_init(dm);
  1232. #endif
  1233. #ifdef CONFIG_ADAPTIVE_SOML
  1234. phydm_adaptive_soml_init(dm);
  1235. #endif
  1236. #ifdef CONFIG_PATH_DIVERSITY
  1237. phydm_path_diversity_init(dm);
  1238. #endif
  1239. #ifdef CONFIG_DYNAMIC_TX_TWR
  1240. phydm_dynamic_tx_power_init(dm);
  1241. #endif
  1242. #if (PHYDM_LA_MODE_SUPPORT == 1)
  1243. adc_smp_init(dm);
  1244. #endif
  1245. #ifdef PHYDM_BEAMFORMING_VERSION1
  1246. phydm_beamforming_init(dm);
  1247. #endif
  1248. #if (RTL8188E_SUPPORT == 1)
  1249. odm_ra_info_init_all(dm);
  1250. #endif
  1251. #ifdef PHYDM_PRIMARY_CCA
  1252. phydm_primary_cca_init(dm);
  1253. #endif
  1254. #ifdef CONFIG_PSD_TOOL
  1255. phydm_psd_init(dm);
  1256. #endif
  1257. #ifdef CONFIG_SMART_ANTENNA
  1258. phydm_smt_ant_init(dm);
  1259. #endif
  1260. #ifdef PHYDM_LNA_SAT_CHK_SUPPORT
  1261. phydm_lna_sat_check_init(dm);
  1262. #endif
  1263. #ifdef CONFIG_MCC_DM
  1264. #if (RTL8822B_SUPPORT == 1)
  1265. phydm_mcc_init(dm);
  1266. #endif
  1267. #endif
  1268. }
  1269. void odm_dm_reset(struct dm_struct *dm)
  1270. {
  1271. struct phydm_dig_struct *dig_t = &dm->dm_dig_table;
  1272. #ifdef CONFIG_PHYDM_ANTENNA_DIVERSITY
  1273. odm_ant_div_reset(dm);
  1274. #endif
  1275. phydm_set_edcca_threshold_api(dm, dig_t->cur_ig_value);
  1276. }
  1277. void phydm_supportability_en(void *dm_void, char input[][16], u32 *_used,
  1278. char *output, u32 *_out_len)
  1279. {
  1280. struct dm_struct *dm = (struct dm_struct *)dm_void;
  1281. u32 dm_value[10] = {0};
  1282. u64 pre_support_ability, one = 1;
  1283. u64 comp = 0;
  1284. u32 used = *_used;
  1285. u32 out_len = *_out_len;
  1286. u8 i;
  1287. for (i = 0; i < 5; i++) {
  1288. if (input[i + 1])
  1289. PHYDM_SSCANF(input[i + 1], DCMD_DECIMAL, &dm_value[i]);
  1290. }
  1291. pre_support_ability = dm->support_ability;
  1292. comp = dm->support_ability;
  1293. PDM_SNPF(out_len, used, output + used, out_len - used,
  1294. "\n================================\n");
  1295. if (dm_value[0] == 100) {
  1296. PDM_SNPF(out_len, used, output + used, out_len - used,
  1297. "[Supportability] PhyDM Selection\n");
  1298. PDM_SNPF(out_len, used, output + used, out_len - used,
  1299. "================================\n");
  1300. PDM_SNPF(out_len, used, output + used, out_len - used,
  1301. "00. (( %s ))DIG\n",
  1302. ((comp & ODM_BB_DIG) ? ("V") : (".")));
  1303. PDM_SNPF(out_len, used, output + used, out_len - used,
  1304. "01. (( %s ))RA_MASK\n",
  1305. ((comp & ODM_BB_RA_MASK) ? ("V") : (".")));
  1306. PDM_SNPF(out_len, used, output + used, out_len - used,
  1307. "02. (( %s ))DYN_TXPWR\n",
  1308. ((comp & ODM_BB_DYNAMIC_TXPWR) ? ("V") : (".")));
  1309. PDM_SNPF(out_len, used, output + used, out_len - used,
  1310. "03. (( %s ))FA_CNT\n",
  1311. ((comp & ODM_BB_FA_CNT) ? ("V") : (".")));
  1312. PDM_SNPF(out_len, used, output + used, out_len - used,
  1313. "04. (( %s ))RSSI_MNTR\n",
  1314. ((comp & ODM_BB_RSSI_MONITOR) ? ("V") : (".")));
  1315. PDM_SNPF(out_len, used, output + used, out_len - used,
  1316. "05. (( %s ))CCK_PD\n",
  1317. ((comp & ODM_BB_CCK_PD) ? ("V") : (".")));
  1318. PDM_SNPF(out_len, used, output + used, out_len - used,
  1319. "06. (( %s ))ANT_DIV\n",
  1320. ((comp & ODM_BB_ANT_DIV) ? ("V") : (".")));
  1321. PDM_SNPF(out_len, used, output + used, out_len - used,
  1322. "07. (( %s ))SMT_ANT\n",
  1323. ((comp & ODM_BB_SMT_ANT) ? ("V") : (".")));
  1324. PDM_SNPF(out_len, used, output + used, out_len - used,
  1325. "08. (( %s ))PWR_TRAIN\n",
  1326. ((comp & ODM_BB_PWR_TRAIN) ? ("V") : (".")));
  1327. PDM_SNPF(out_len, used, output + used, out_len - used,
  1328. "09. (( %s ))RA\n",
  1329. ((comp & ODM_BB_RATE_ADAPTIVE) ? ("V") : (".")));
  1330. PDM_SNPF(out_len, used, output + used, out_len - used,
  1331. "10. (( %s ))PATH_DIV\n",
  1332. ((comp & ODM_BB_PATH_DIV) ? ("V") : (".")));
  1333. PDM_SNPF(out_len, used, output + used, out_len - used,
  1334. "11. (( %s ))DFS\n",
  1335. ((comp & ODM_BB_DFS) ? ("V") : (".")));
  1336. PDM_SNPF(out_len, used, output + used, out_len - used,
  1337. "12. (( %s ))DYN_ARFR\n",
  1338. ((comp & ODM_BB_DYNAMIC_ARFR) ? ("V") : (".")));
  1339. PDM_SNPF(out_len, used, output + used, out_len - used,
  1340. "13. (( %s ))ADAPTIVITY\n",
  1341. ((comp & ODM_BB_ADAPTIVITY) ? ("V") : (".")));
  1342. PDM_SNPF(out_len, used, output + used, out_len - used,
  1343. "14. (( %s ))CFO_TRACK\n",
  1344. ((comp & ODM_BB_CFO_TRACKING) ? ("V") : (".")));
  1345. PDM_SNPF(out_len, used, output + used, out_len - used,
  1346. "15. (( %s ))ENV_MONITOR\n",
  1347. ((comp & ODM_BB_ENV_MONITOR) ? ("V") : (".")));
  1348. PDM_SNPF(out_len, used, output + used, out_len - used,
  1349. "16. (( %s ))PRI_CCA\n",
  1350. ((comp & ODM_BB_PRIMARY_CCA) ? ("V") : (".")));
  1351. PDM_SNPF(out_len, used, output + used, out_len - used,
  1352. "17. (( %s ))ADPTV_SOML\n",
  1353. ((comp & ODM_BB_ADAPTIVE_SOML) ? ("V") : (".")));
  1354. PDM_SNPF(out_len, used, output + used, out_len - used,
  1355. "18. (( %s ))LNA_SAT_CHK\n",
  1356. ((comp & ODM_BB_LNA_SAT_CHK) ? ("V") : (".")));
  1357. PDM_SNPF(out_len, used, output + used, out_len - used,
  1358. "================================\n");
  1359. PDM_SNPF(out_len, used, output + used, out_len - used,
  1360. "[Supportability] PhyDM offload ability\n");
  1361. PDM_SNPF(out_len, used, output + used, out_len - used,
  1362. "================================\n");
  1363. PDM_SNPF(out_len, used, output + used, out_len - used,
  1364. "00. (( %s ))PHY PARAM OFFLOAD\n",
  1365. ((dm->fw_offload_ability & PHYDM_PHY_PARAM_OFFLOAD) ?
  1366. ("V") : (".")));
  1367. PDM_SNPF(out_len, used, output + used, out_len - used,
  1368. "01. (( %s ))RF IQK OFFLOAD\n",
  1369. ((dm->fw_offload_ability & PHYDM_RF_IQK_OFFLOAD) ?
  1370. ("V") : (".")));
  1371. PDM_SNPF(out_len, used, output + used, out_len - used,
  1372. "================================\n");
  1373. } else if (dm_value[0] == 101) {
  1374. dm->support_ability = 0;
  1375. PDM_SNPF(out_len, used, output + used, out_len - used,
  1376. "Disable all support_ability components\n");
  1377. } else {
  1378. if (dm_value[1] == 1) { /* @enable */
  1379. dm->support_ability |= (one << dm_value[0]);
  1380. } else if (dm_value[1] == 2) {/* @disable */
  1381. dm->support_ability &= ~(one << dm_value[0]);
  1382. } else {
  1383. PDM_SNPF(out_len, used, output + used, out_len - used,
  1384. "[Warning!!!] 1:enable, 2:disable\n");
  1385. }
  1386. }
  1387. PDM_SNPF(out_len, used, output + used, out_len - used,
  1388. "pre-supportability = 0x%llx\n", pre_support_ability);
  1389. PDM_SNPF(out_len, used, output + used, out_len - used,
  1390. "Cur-supportability = 0x%llx\n", dm->support_ability);
  1391. PDM_SNPF(out_len, used, output + used, out_len - used,
  1392. "================================\n");
  1393. *_used = used;
  1394. *_out_len = out_len;
  1395. }
  1396. void phydm_watchdog_lps_32k(struct dm_struct *dm)
  1397. {
  1398. PHYDM_DBG(dm, DBG_COMMON_FLOW, "%s ======>\n", __func__);
  1399. phydm_common_info_self_update(dm);
  1400. phydm_rssi_monitor_check(dm);
  1401. phydm_dig_lps_32k(dm);
  1402. phydm_common_info_self_reset(dm);
  1403. }
  1404. void phydm_watchdog_lps(struct dm_struct *dm)
  1405. {
  1406. #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))
  1407. PHYDM_DBG(dm, DBG_COMMON_FLOW, "%s ======>\n", __func__);
  1408. phydm_common_info_self_update(dm);
  1409. phydm_rssi_monitor_check(dm);
  1410. phydm_basic_dbg_message(dm);
  1411. phydm_receiver_blocking(dm);
  1412. phydm_false_alarm_counter_statistics(dm);
  1413. phydm_dig_by_rssi_lps(dm);
  1414. #ifdef PHYDM_SUPPORT_CCKPD
  1415. phydm_cck_pd_th(dm);
  1416. #endif
  1417. phydm_adaptivity(dm);
  1418. #if (DM_ODM_SUPPORT_TYPE & (ODM_CE))
  1419. #ifdef CONFIG_PHYDM_ANTENNA_DIVERSITY
  1420. /*@enable AntDiv in PS mode, request from SD4 Jeff*/
  1421. odm_antenna_diversity(dm);
  1422. #endif
  1423. #endif
  1424. phydm_common_info_self_reset(dm);
  1425. #endif
  1426. }
  1427. void phydm_watchdog_mp(struct dm_struct *dm)
  1428. {
  1429. }
  1430. void phydm_pause_dm_watchdog(void *dm_void, enum phydm_pause_type pause_type)
  1431. {
  1432. struct dm_struct *dm = (struct dm_struct *)dm_void;
  1433. if (pause_type == PHYDM_PAUSE) {
  1434. dm->disable_phydm_watchdog = 1;
  1435. PHYDM_DBG(dm, ODM_COMP_API, "PHYDM Stop\n");
  1436. } else {
  1437. dm->disable_phydm_watchdog = 0;
  1438. PHYDM_DBG(dm, ODM_COMP_API, "PHYDM Start\n");
  1439. }
  1440. }
  1441. u8 phydm_pause_func(void *dm_void, enum phydm_func_idx pause_func,
  1442. enum phydm_pause_type pause_type,
  1443. enum phydm_pause_level pause_lv, u8 val_lehgth,
  1444. u32 *val_buf)
  1445. {
  1446. struct dm_struct *dm = (struct dm_struct *)dm_void;
  1447. struct phydm_func_poiner *func_t = &dm->phydm_func_handler;
  1448. s8 *pause_lv_pre = &dm->s8_dummy;
  1449. u32 *bkp_val = &dm->u32_dummy;
  1450. u32 ori_val[5] = {0};
  1451. u64 pause_func_bitmap = (u64)BIT(pause_func);
  1452. u8 i;
  1453. u8 en_2rcca;
  1454. u8 en_bw40m;
  1455. u8 pause_result = PAUSE_FAIL;
  1456. PHYDM_DBG(dm, ODM_COMP_API, "\n");
  1457. PHYDM_DBG(dm, ODM_COMP_API, "[%s][%s] LV=%d, Len=%d\n", __func__,
  1458. ((pause_type == PHYDM_PAUSE) ? "Pause" :
  1459. ((pause_type == PHYDM_RESUME) ? "Resume" : "Pause no_set")),
  1460. pause_lv, val_lehgth);
  1461. if (pause_lv >= PHYDM_PAUSE_MAX_NUM) {
  1462. PHYDM_DBG(dm, ODM_COMP_API, "[WARNING]Wrong LV=%d\n", pause_lv);
  1463. return PAUSE_FAIL;
  1464. }
  1465. if (pause_func == F00_DIG) {
  1466. PHYDM_DBG(dm, ODM_COMP_API, "[DIG]\n");
  1467. if (val_lehgth != 1) {
  1468. PHYDM_DBG(dm, ODM_COMP_API, "[WARNING] length != 1\n");
  1469. return PAUSE_FAIL;
  1470. }
  1471. ori_val[0] = (u32)(dm->dm_dig_table.cur_ig_value); /*@0xc50*/
  1472. pause_lv_pre = &dm->pause_lv_table.lv_dig;
  1473. bkp_val = (u32 *)(&dm->dm_dig_table.rvrt_val);
  1474. /*@function pointer hook*/
  1475. func_t->pause_phydm_handler = phydm_set_dig_val;
  1476. #ifdef PHYDM_SUPPORT_CCKPD
  1477. } else if (pause_func == F05_CCK_PD) {
  1478. PHYDM_DBG(dm, ODM_COMP_API, "[CCK_PD]\n");
  1479. if (val_lehgth != 1) {
  1480. PHYDM_DBG(dm, ODM_COMP_API, "[WARNING] length != 1\n");
  1481. return PAUSE_FAIL;
  1482. }
  1483. ori_val[0] = (u32)dm->dm_cckpd_table.cck_pd_lv;
  1484. pause_lv_pre = &dm->pause_lv_table.lv_cckpd;
  1485. bkp_val = (u32 *)(&dm->dm_cckpd_table.rvrt_val);
  1486. /*@function pointer hook*/
  1487. func_t->pause_phydm_handler = phydm_set_cckpd_val;
  1488. #endif
  1489. #ifdef CONFIG_PHYDM_ANTENNA_DIVERSITY
  1490. } else if (pause_func == F06_ANT_DIV) {
  1491. PHYDM_DBG(dm, ODM_COMP_API, "[AntDiv]\n");
  1492. if (val_lehgth != 1) {
  1493. PHYDM_DBG(dm, ODM_COMP_API, "[WARNING] length != 1\n");
  1494. return PAUSE_FAIL;
  1495. }
  1496. /*@default antenna*/
  1497. ori_val[0] = (u32)(dm->dm_fat_table.rx_idle_ant);
  1498. pause_lv_pre = &dm->pause_lv_table.lv_antdiv;
  1499. bkp_val = (u32 *)(&dm->dm_fat_table.rvrt_val);
  1500. /*@function pointer hook*/
  1501. func_t->pause_phydm_handler = phydm_set_antdiv_val;
  1502. #endif
  1503. #ifdef PHYDM_SUPPORT_ADAPTIVITY
  1504. } else if (pause_func == F13_ADPTVTY) {
  1505. PHYDM_DBG(dm, ODM_COMP_API, "[Adaptivity]\n");
  1506. if (val_lehgth != 2) {
  1507. PHYDM_DBG(dm, ODM_COMP_API, "[WARNING] length != 2\n");
  1508. return PAUSE_FAIL;
  1509. }
  1510. ori_val[0] = (u32)(dm->adaptivity.th_l2h); /*th_l2h*/
  1511. ori_val[1] = (u32)(dm->adaptivity.th_h2l); /*th_h2l*/
  1512. pause_lv_pre = &dm->pause_lv_table.lv_adapt;
  1513. bkp_val = (u32 *)(&dm->adaptivity.rvrt_val);
  1514. /*@function pointer hook*/
  1515. func_t->pause_phydm_handler = phydm_set_edcca_val;
  1516. #endif
  1517. #ifdef CONFIG_ADAPTIVE_SOML
  1518. } else if (pause_func == F17_ADPTV_SOML) {
  1519. PHYDM_DBG(dm, ODM_COMP_API, "[AD-SOML]\n");
  1520. if (val_lehgth != 1) {
  1521. PHYDM_DBG(dm, ODM_COMP_API, "[WARNING] length != 1\n");
  1522. return PAUSE_FAIL;
  1523. }
  1524. /*SOML_ON/OFF*/
  1525. ori_val[0] = (u32)(dm->dm_soml_table.soml_on_off);
  1526. pause_lv_pre = &dm->pause_lv_table.lv_adsl;
  1527. bkp_val = (u32 *)(&dm->dm_soml_table.rvrt_val);
  1528. /*@function pointer hook*/
  1529. func_t->pause_phydm_handler = phydm_set_adsl_val;
  1530. #endif
  1531. } else {
  1532. PHYDM_DBG(dm, ODM_COMP_API, "[WARNING] error func idx\n");
  1533. return PAUSE_FAIL;
  1534. }
  1535. PHYDM_DBG(dm, ODM_COMP_API, "Pause_LV{new , pre} = {%d ,%d}\n",
  1536. pause_lv, *pause_lv_pre);
  1537. if (pause_type == PHYDM_PAUSE || pause_type == PHYDM_PAUSE_NO_SET) {
  1538. if (pause_lv <= *pause_lv_pre) {
  1539. PHYDM_DBG(dm, ODM_COMP_API,
  1540. "[PAUSE FAIL] Pre_LV >= Curr_LV\n");
  1541. return PAUSE_FAIL;
  1542. }
  1543. if (!(dm->pause_ability & pause_func_bitmap)) {
  1544. for (i = 0; i < val_lehgth; i++)
  1545. bkp_val[i] = ori_val[i];
  1546. }
  1547. dm->pause_ability |= pause_func_bitmap;
  1548. PHYDM_DBG(dm, ODM_COMP_API, "pause_ability=0x%llx\n",
  1549. dm->pause_ability);
  1550. if (pause_type == PHYDM_PAUSE) {
  1551. for (i = 0; i < val_lehgth; i++)
  1552. PHYDM_DBG(dm, ODM_COMP_API,
  1553. "[PAUSE SUCCESS] val_idx[%d]{New, Ori}={0x%x, 0x%x}\n",
  1554. i, val_buf[i], bkp_val[i]);
  1555. func_t->pause_phydm_handler(dm, val_buf, val_lehgth);
  1556. } else {
  1557. for (i = 0; i < val_lehgth; i++)
  1558. PHYDM_DBG(dm, ODM_COMP_API,
  1559. "[PAUSE NO Set: SUCCESS] val_idx[%d]{Ori}={0x%x}\n",
  1560. i, bkp_val[i]);
  1561. }
  1562. *pause_lv_pre = pause_lv;
  1563. pause_result = PAUSE_SUCCESS;
  1564. } else if (pause_type == PHYDM_RESUME) {
  1565. if ((dm->pause_ability & pause_func_bitmap) == 0) {
  1566. PHYDM_DBG(dm, ODM_COMP_API,
  1567. "[RESUME] No Need to Revert\n");
  1568. return PAUSE_SUCCESS;
  1569. }
  1570. dm->pause_ability &= ~pause_func_bitmap;
  1571. PHYDM_DBG(dm, ODM_COMP_API, "pause_ability=0x%llx\n",
  1572. dm->pause_ability);
  1573. *pause_lv_pre = PHYDM_PAUSE_RELEASE;
  1574. for (i = 0; i < val_lehgth; i++) {
  1575. PHYDM_DBG(dm, ODM_COMP_API,
  1576. "[RESUME] val_idx[%d]={0x%x}\n", i,
  1577. bkp_val[i]);
  1578. }
  1579. func_t->pause_phydm_handler(dm, bkp_val, val_lehgth);
  1580. pause_result = PAUSE_SUCCESS;
  1581. } else {
  1582. PHYDM_DBG(dm, ODM_COMP_API, "[WARNING] error pause_type\n");
  1583. pause_result = PAUSE_FAIL;
  1584. }
  1585. return pause_result;
  1586. }
  1587. void phydm_pause_func_console(void *dm_void, char input[][16], u32 *_used,
  1588. char *output, u32 *_out_len)
  1589. {
  1590. struct dm_struct *dm = (struct dm_struct *)dm_void;
  1591. char help[] = "-h";
  1592. u32 var1[10] = {0};
  1593. u32 used = *_used;
  1594. u32 out_len = *_out_len;
  1595. u32 i;
  1596. u8 length = 0;
  1597. u32 buf[5] = {0};
  1598. u8 set_result = 0;
  1599. enum phydm_func_idx func = 0;
  1600. enum phydm_pause_type type = 0;
  1601. enum phydm_pause_level lv = 0;
  1602. if ((strcmp(input[1], help) == 0)) {
  1603. PDM_SNPF(out_len, used, output + used, out_len - used,
  1604. "{Func} {1:pause,2:pause no set 3:Resume} {lv:0~3} Val[5:0]\n");
  1605. goto out;
  1606. }
  1607. for (i = 0; i < 10; i++) {
  1608. if (input[i + 1])
  1609. PHYDM_SSCANF(input[i + 1], DCMD_HEX, &var1[i]);
  1610. }
  1611. func = (enum phydm_func_idx)var1[0];
  1612. type = (enum phydm_pause_type)var1[1];
  1613. lv = (enum phydm_pause_level)var1[2];
  1614. for (i = 0; i < 5; i++)
  1615. buf[i] = var1[3 + i];
  1616. if (func == F00_DIG) {
  1617. PDM_SNPF(out_len, used, output + used, out_len - used,
  1618. "[DIG]\n");
  1619. length = 1;
  1620. } else if (func == F05_CCK_PD) {
  1621. PDM_SNPF(out_len, used, output + used, out_len - used,
  1622. "[CCK_PD]\n");
  1623. length = 1;
  1624. } else if (func == F06_ANT_DIV) {
  1625. PDM_SNPF(out_len, used, output + used, out_len - used,
  1626. "[Ant_Div]\n");
  1627. length = 1;
  1628. } else if (func == F13_ADPTVTY) {
  1629. PDM_SNPF(out_len, used, output + used, out_len - used,
  1630. "[Adaptivity]\n");
  1631. length = 2;
  1632. } else if (func == F17_ADPTV_SOML) {
  1633. PDM_SNPF(out_len, used, output + used, out_len - used,
  1634. "[ADSL]\n");
  1635. length = 1;
  1636. } else {
  1637. PDM_SNPF(out_len, used, output + used, out_len - used,
  1638. "[Set Function Error]\n");
  1639. length = 0;
  1640. }
  1641. if (length != 0) {
  1642. PDM_SNPF(out_len, used, output + used, out_len - used,
  1643. "{%s, lv=%d} val = %d, %d}\n",
  1644. ((type == PHYDM_PAUSE) ? "Pause" :
  1645. ((type == PHYDM_RESUME) ? "Resume" : "Pause no_set")),
  1646. lv, var1[3], var1[4]);
  1647. set_result = phydm_pause_func(dm, func, type, lv, length, buf);
  1648. }
  1649. PDM_SNPF(out_len, used, output + used, out_len - used,
  1650. "set_result = %d\n", set_result);
  1651. out:
  1652. *_used = used;
  1653. *_out_len = out_len;
  1654. }
  1655. u8 phydm_stop_dm_watchdog_check(void *dm_void)
  1656. {
  1657. struct dm_struct *dm = (struct dm_struct *)dm_void;
  1658. if (dm->disable_phydm_watchdog == 1) {
  1659. PHYDM_DBG(dm, DBG_COMMON_FLOW, "Disable phydm\n");
  1660. return true;
  1661. } else {
  1662. return false;
  1663. }
  1664. }
  1665. void phydm_watchdog(struct dm_struct *dm)
  1666. {
  1667. PHYDM_DBG(dm, DBG_COMMON_FLOW, "%s ======>\n", __func__);
  1668. phydm_common_info_self_update(dm);
  1669. phydm_phy_info_update(dm);
  1670. phydm_rssi_monitor_check(dm);
  1671. phydm_basic_dbg_message(dm);
  1672. phydm_dm_summary(dm, FIRST_MACID);
  1673. #ifdef PHYDM_AUTO_DEGBUG
  1674. phydm_auto_dbg_engine(dm);
  1675. #endif
  1676. phydm_receiver_blocking(dm);
  1677. if (phydm_stop_dm_watchdog_check(dm) == true)
  1678. return;
  1679. phydm_hw_setting(dm);
  1680. #ifdef PHYDM_TDMA_DIG_SUPPORT
  1681. if (dm->original_dig_restore == 0)
  1682. phydm_tdma_dig_timer_check(dm);
  1683. else
  1684. #endif
  1685. {
  1686. phydm_false_alarm_counter_statistics(dm);
  1687. phydm_noisy_detection(dm);
  1688. phydm_dig(dm);
  1689. #ifdef PHYDM_SUPPORT_CCKPD
  1690. phydm_cck_pd_th(dm);
  1691. #endif
  1692. }
  1693. #ifdef PHYDM_POWER_TRAINING_SUPPORT
  1694. phydm_update_power_training_state(dm);
  1695. #endif
  1696. phydm_adaptivity(dm);
  1697. phydm_ra_info_watchdog(dm);
  1698. #ifdef CONFIG_PATH_DIVERSITY
  1699. odm_path_diversity(dm);
  1700. #endif
  1701. phydm_cfo_tracking(dm);
  1702. #ifdef CONFIG_DYNAMIC_TX_TWR
  1703. phydm_dynamic_tx_power(dm);
  1704. #endif
  1705. #ifdef CONFIG_PHYDM_ANTENNA_DIVERSITY
  1706. odm_antenna_diversity(dm);
  1707. #endif
  1708. #ifdef CONFIG_ADAPTIVE_SOML
  1709. phydm_adaptive_soml(dm);
  1710. #endif
  1711. #ifdef PHYDM_BEAMFORMING_VERSION1
  1712. phydm_beamforming_watchdog(dm);
  1713. #endif
  1714. halrf_watchdog(dm);
  1715. #ifdef PHYDM_PRIMARY_CCA
  1716. phydm_primary_cca(dm);
  1717. #endif
  1718. #if (DM_ODM_SUPPORT_TYPE == ODM_CE)
  1719. odm_dtc(dm);
  1720. #endif
  1721. phydm_env_mntr_watchdog(dm);
  1722. #ifdef PHYDM_LNA_SAT_CHK_SUPPORT
  1723. phydm_lna_sat_chk_watchdog(dm);
  1724. #endif
  1725. #ifdef CONFIG_MCC_DM
  1726. #if (RTL8822B_SUPPORT == 1)
  1727. phydm_mcc_switch(dm);
  1728. #endif
  1729. #endif
  1730. phydm_common_info_self_reset(dm);
  1731. }
  1732. /*@
  1733. * Init /.. Fixed HW value. Only init time.
  1734. */
  1735. void odm_cmn_info_init(struct dm_struct *dm, enum odm_cmninfo cmn_info,
  1736. u64 value)
  1737. {
  1738. /* This section is used for init value */
  1739. switch (cmn_info) {
  1740. /* @Fixed ODM value. */
  1741. case ODM_CMNINFO_ABILITY:
  1742. dm->support_ability = (u64)value;
  1743. break;
  1744. case ODM_CMNINFO_RF_TYPE:
  1745. dm->rf_type = (u8)value;
  1746. break;
  1747. case ODM_CMNINFO_PLATFORM:
  1748. dm->support_platform = (u8)value;
  1749. break;
  1750. case ODM_CMNINFO_INTERFACE:
  1751. dm->support_interface = (u8)value;
  1752. break;
  1753. case ODM_CMNINFO_MP_TEST_CHIP:
  1754. dm->is_mp_chip = (u8)value;
  1755. break;
  1756. case ODM_CMNINFO_IC_TYPE:
  1757. dm->support_ic_type = (u32)value;
  1758. break;
  1759. case ODM_CMNINFO_CUT_VER:
  1760. dm->cut_version = (u8)value;
  1761. break;
  1762. case ODM_CMNINFO_FAB_VER:
  1763. dm->fab_version = (u8)value;
  1764. break;
  1765. case ODM_CMNINFO_FW_VER:
  1766. dm->fw_version = (u8)value;
  1767. break;
  1768. case ODM_CMNINFO_FW_SUB_VER:
  1769. dm->fw_sub_version = (u8)value;
  1770. break;
  1771. case ODM_CMNINFO_RFE_TYPE:
  1772. #if (RTL8821C_SUPPORT == 1)
  1773. if (dm->support_ic_type & ODM_RTL8821C)
  1774. dm->rfe_type_expand = (u8)value;
  1775. else
  1776. #endif
  1777. dm->rfe_type = (u8)value;
  1778. phydm_init_hw_info_by_rfe(dm);
  1779. break;
  1780. case ODM_CMNINFO_RF_ANTENNA_TYPE:
  1781. dm->ant_div_type = (u8)value;
  1782. break;
  1783. case ODM_CMNINFO_WITH_EXT_ANTENNA_SWITCH:
  1784. dm->with_extenal_ant_switch = (u8)value;
  1785. break;
  1786. #ifdef CONFIG_PHYDM_ANTENNA_DIVERSITY
  1787. case ODM_CMNINFO_BE_FIX_TX_ANT:
  1788. dm->dm_fat_table.b_fix_tx_ant = (u8)value;
  1789. break;
  1790. #endif
  1791. case ODM_CMNINFO_BOARD_TYPE:
  1792. if (!dm->is_init_hw_info_by_rfe)
  1793. dm->board_type = (u8)value;
  1794. break;
  1795. case ODM_CMNINFO_PACKAGE_TYPE:
  1796. if (!dm->is_init_hw_info_by_rfe)
  1797. dm->package_type = (u8)value;
  1798. break;
  1799. case ODM_CMNINFO_EXT_LNA:
  1800. if (!dm->is_init_hw_info_by_rfe)
  1801. dm->ext_lna = (u8)value;
  1802. break;
  1803. case ODM_CMNINFO_5G_EXT_LNA:
  1804. if (!dm->is_init_hw_info_by_rfe)
  1805. dm->ext_lna_5g = (u8)value;
  1806. break;
  1807. case ODM_CMNINFO_EXT_PA:
  1808. if (!dm->is_init_hw_info_by_rfe)
  1809. dm->ext_pa = (u8)value;
  1810. break;
  1811. case ODM_CMNINFO_5G_EXT_PA:
  1812. if (!dm->is_init_hw_info_by_rfe)
  1813. dm->ext_pa_5g = (u8)value;
  1814. break;
  1815. case ODM_CMNINFO_GPA:
  1816. if (!dm->is_init_hw_info_by_rfe)
  1817. dm->type_gpa = (u16)value;
  1818. break;
  1819. case ODM_CMNINFO_APA:
  1820. if (!dm->is_init_hw_info_by_rfe)
  1821. dm->type_apa = (u16)value;
  1822. break;
  1823. case ODM_CMNINFO_GLNA:
  1824. if (!dm->is_init_hw_info_by_rfe)
  1825. dm->type_glna = (u16)value;
  1826. break;
  1827. case ODM_CMNINFO_ALNA:
  1828. if (!dm->is_init_hw_info_by_rfe)
  1829. dm->type_alna = (u16)value;
  1830. break;
  1831. case ODM_CMNINFO_EXT_TRSW:
  1832. if (!dm->is_init_hw_info_by_rfe)
  1833. dm->ext_trsw = (u8)value;
  1834. break;
  1835. case ODM_CMNINFO_EXT_LNA_GAIN:
  1836. dm->ext_lna_gain = (u8)value;
  1837. break;
  1838. case ODM_CMNINFO_PATCH_ID:
  1839. dm->iot_table.win_patch_id = (u8)value;
  1840. break;
  1841. case ODM_CMNINFO_BINHCT_TEST:
  1842. dm->is_in_hct_test = (boolean)value;
  1843. break;
  1844. case ODM_CMNINFO_BWIFI_TEST:
  1845. dm->wifi_test = (u8)value;
  1846. break;
  1847. case ODM_CMNINFO_SMART_CONCURRENT:
  1848. dm->is_dual_mac_smart_concurrent = (boolean)value;
  1849. break;
  1850. #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
  1851. case ODM_CMNINFO_CONFIG_BB_RF:
  1852. dm->config_bbrf = (boolean)value;
  1853. break;
  1854. #endif
  1855. case ODM_CMNINFO_IQKPAOFF:
  1856. dm->rf_calibrate_info.is_iqk_pa_off = (boolean)value;
  1857. break;
  1858. case ODM_CMNINFO_REGRFKFREEENABLE:
  1859. dm->rf_calibrate_info.reg_rf_kfree_enable = (u8)value;
  1860. break;
  1861. case ODM_CMNINFO_RFKFREEENABLE:
  1862. dm->rf_calibrate_info.rf_kfree_enable = (u8)value;
  1863. break;
  1864. case ODM_CMNINFO_NORMAL_RX_PATH_CHANGE:
  1865. dm->normal_rx_path = (u8)value;
  1866. break;
  1867. case ODM_CMNINFO_EFUSE0X3D8:
  1868. dm->efuse0x3d8 = (u8)value;
  1869. break;
  1870. case ODM_CMNINFO_EFUSE0X3D7:
  1871. dm->efuse0x3d7 = (u8)value;
  1872. break;
  1873. case ODM_CMNINFO_ADVANCE_OTA:
  1874. dm->p_advance_ota = (u8)value;
  1875. break;
  1876. #ifdef CONFIG_PHYDM_DFS_MASTER
  1877. case ODM_CMNINFO_DFS_REGION_DOMAIN:
  1878. dm->dfs_region_domain = (u8)value;
  1879. break;
  1880. #endif
  1881. case ODM_CMNINFO_SOFT_AP_SPECIAL_SETTING:
  1882. dm->soft_ap_special_setting = (u32)value;
  1883. break;
  1884. case ODM_CMNINFO_X_CAP_SETTING:
  1885. dm->dm_cfo_track.crystal_cap_default = (u8)value;
  1886. break;
  1887. case ODM_CMNINFO_DPK_EN:
  1888. /*@dm->dpk_en = (u1Byte)value;*/
  1889. halrf_cmn_info_set(dm, HALRF_CMNINFO_DPK_EN, (u64)value);
  1890. break;
  1891. case ODM_CMNINFO_HP_HWID:
  1892. dm->hp_hw_id = (boolean)value;
  1893. break;
  1894. default:
  1895. break;
  1896. }
  1897. }
  1898. void odm_cmn_info_hook(struct dm_struct *dm, enum odm_cmninfo cmn_info,
  1899. void *value)
  1900. {
  1901. /* @Hook call by reference pointer. */
  1902. switch (cmn_info) {
  1903. /* @Dynamic call by reference pointer. */
  1904. case ODM_CMNINFO_TX_UNI:
  1905. dm->num_tx_bytes_unicast = (u64 *)value;
  1906. break;
  1907. case ODM_CMNINFO_RX_UNI:
  1908. dm->num_rx_bytes_unicast = (u64 *)value;
  1909. break;
  1910. case ODM_CMNINFO_BAND:
  1911. dm->band_type = (u8 *)value;
  1912. break;
  1913. case ODM_CMNINFO_SEC_CHNL_OFFSET:
  1914. dm->sec_ch_offset = (u8 *)value;
  1915. break;
  1916. case ODM_CMNINFO_SEC_MODE:
  1917. dm->security = (u8 *)value;
  1918. break;
  1919. case ODM_CMNINFO_BW:
  1920. dm->band_width = (u8 *)value;
  1921. break;
  1922. case ODM_CMNINFO_CHNL:
  1923. dm->channel = (u8 *)value;
  1924. break;
  1925. case ODM_CMNINFO_SCAN:
  1926. dm->is_scan_in_process = (boolean *)value;
  1927. break;
  1928. case ODM_CMNINFO_POWER_SAVING:
  1929. dm->is_power_saving = (boolean *)value;
  1930. break;
  1931. case ODM_CMNINFO_ONE_PATH_CCA:
  1932. dm->one_path_cca = (u8 *)value;
  1933. break;
  1934. case ODM_CMNINFO_DRV_STOP:
  1935. dm->is_driver_stopped = (boolean *)value;
  1936. break;
  1937. case ODM_CMNINFO_INIT_ON:
  1938. dm->pinit_adpt_in_progress = (boolean *)value;
  1939. break;
  1940. case ODM_CMNINFO_ANT_TEST:
  1941. dm->antenna_test = (u8 *)value;
  1942. break;
  1943. case ODM_CMNINFO_NET_CLOSED:
  1944. dm->is_net_closed = (boolean *)value;
  1945. break;
  1946. case ODM_CMNINFO_FORCED_RATE:
  1947. dm->forced_data_rate = (u16 *)value;
  1948. break;
  1949. case ODM_CMNINFO_ANT_DIV:
  1950. dm->enable_antdiv = (u8 *)value;
  1951. break;
  1952. case ODM_CMNINFO_ADAPTIVE_SOML:
  1953. dm->en_adap_soml = (u8 *)value;
  1954. break;
  1955. case ODM_CMNINFO_ADAPTIVITY:
  1956. dm->enable_adaptivity = (u8 *)value;
  1957. break;
  1958. case ODM_CMNINFO_P2P_LINK:
  1959. dm->dm_dig_table.is_p2p_in_process = (u8 *)value;
  1960. break;
  1961. case ODM_CMNINFO_IS1ANTENNA:
  1962. dm->is_1_antenna = (boolean *)value;
  1963. break;
  1964. case ODM_CMNINFO_RFDEFAULTPATH:
  1965. dm->rf_default_path = (u8 *)value;
  1966. break;
  1967. case ODM_CMNINFO_FCS_MODE:
  1968. dm->is_fcs_mode_enable = (boolean *)value;
  1969. break;
  1970. case ODM_CMNINFO_HUBUSBMODE:
  1971. dm->hub_usb_mode = (u8 *)value;
  1972. break;
  1973. case ODM_CMNINFO_FWDWRSVDPAGEINPROGRESS:
  1974. dm->is_fw_dw_rsvd_page_in_progress = (boolean *)value;
  1975. break;
  1976. case ODM_CMNINFO_TX_TP:
  1977. dm->current_tx_tp = (u32 *)value;
  1978. break;
  1979. case ODM_CMNINFO_RX_TP:
  1980. dm->current_rx_tp = (u32 *)value;
  1981. break;
  1982. case ODM_CMNINFO_SOUNDING_SEQ:
  1983. dm->sounding_seq = (u8 *)value;
  1984. break;
  1985. #ifdef CONFIG_PHYDM_DFS_MASTER
  1986. case ODM_CMNINFO_DFS_MASTER_ENABLE:
  1987. dm->dfs_master_enabled = (u8 *)value;
  1988. break;
  1989. #endif
  1990. #ifdef CONFIG_PHYDM_ANTENNA_DIVERSITY
  1991. case ODM_CMNINFO_FORCE_TX_ANT_BY_TXDESC:
  1992. dm->dm_fat_table.p_force_tx_ant_by_desc = (u8 *)value;
  1993. break;
  1994. case ODM_CMNINFO_SET_S0S1_DEFAULT_ANTENNA:
  1995. dm->dm_fat_table.p_default_s0_s1 = (u8 *)value;
  1996. break;
  1997. case ODM_CMNINFO_BF_ANTDIV_DECISION:
  1998. dm->dm_fat_table.is_no_csi_feedback = (boolean *)value;
  1999. break;
  2000. #endif
  2001. case ODM_CMNINFO_SOFT_AP_MODE:
  2002. dm->soft_ap_mode = (u32 *)value;
  2003. break;
  2004. case ODM_CMNINFO_MP_MODE:
  2005. dm->mp_mode = (u8 *)value;
  2006. break;
  2007. case ODM_CMNINFO_INTERRUPT_MASK:
  2008. dm->interrupt_mask = (u32 *)value;
  2009. break;
  2010. case ODM_CMNINFO_BB_OPERATION_MODE:
  2011. dm->bb_op_mode = (u8 *)value;
  2012. break;
  2013. default:
  2014. /*do nothing*/
  2015. break;
  2016. }
  2017. }
  2018. /*@
  2019. * Update band/CHannel/.. The values are dynamic but non-per-packet.
  2020. */
  2021. void odm_cmn_info_update(struct dm_struct *dm, u32 cmn_info, u64 value)
  2022. {
  2023. /* This init variable may be changed in run time. */
  2024. switch (cmn_info) {
  2025. case ODM_CMNINFO_LINK_IN_PROGRESS:
  2026. dm->is_link_in_process = (boolean)value;
  2027. break;
  2028. case ODM_CMNINFO_ABILITY:
  2029. dm->support_ability = (u64)value;
  2030. break;
  2031. case ODM_CMNINFO_RF_TYPE:
  2032. dm->rf_type = (u8)value;
  2033. break;
  2034. case ODM_CMNINFO_WIFI_DIRECT:
  2035. dm->is_wifi_direct = (boolean)value;
  2036. break;
  2037. case ODM_CMNINFO_WIFI_DISPLAY:
  2038. dm->is_wifi_display = (boolean)value;
  2039. break;
  2040. case ODM_CMNINFO_LINK:
  2041. dm->is_linked = (boolean)value;
  2042. break;
  2043. case ODM_CMNINFO_CMW500LINK:
  2044. dm->iot_table.is_linked_cmw500 = (boolean)value;
  2045. break;
  2046. case ODM_CMNINFO_STATION_STATE:
  2047. dm->bsta_state = (boolean)value;
  2048. break;
  2049. case ODM_CMNINFO_RSSI_MIN:
  2050. dm->rssi_min = (u8)value;
  2051. break;
  2052. case ODM_CMNINFO_RSSI_MIN_BY_PATH:
  2053. dm->rssi_min_by_path = (u8)value;
  2054. break;
  2055. case ODM_CMNINFO_DBG_COMP:
  2056. dm->debug_components = (u64)value;
  2057. break;
  2058. #ifdef ODM_CONFIG_BT_COEXIST
  2059. /* The following is for BT HS mode and BT coexist mechanism. */
  2060. case ODM_CMNINFO_BT_ENABLED:
  2061. dm->bt_info_table.is_bt_enabled = (boolean)value;
  2062. break;
  2063. case ODM_CMNINFO_BT_HS_CONNECT_PROCESS:
  2064. dm->bt_info_table.is_bt_connect_process = (boolean)value;
  2065. break;
  2066. case ODM_CMNINFO_BT_HS_RSSI:
  2067. dm->bt_info_table.bt_hs_rssi = (u8)value;
  2068. break;
  2069. case ODM_CMNINFO_BT_OPERATION:
  2070. dm->bt_info_table.is_bt_hs_operation = (boolean)value;
  2071. break;
  2072. case ODM_CMNINFO_BT_LIMITED_DIG:
  2073. dm->bt_info_table.is_bt_limited_dig = (boolean)value;
  2074. break;
  2075. #endif
  2076. case ODM_CMNINFO_AP_TOTAL_NUM:
  2077. dm->ap_total_num = (u8)value;
  2078. break;
  2079. #ifdef CONFIG_PHYDM_DFS_MASTER
  2080. case ODM_CMNINFO_DFS_REGION_DOMAIN:
  2081. dm->dfs_region_domain = (u8)value;
  2082. break;
  2083. #endif
  2084. case ODM_CMNINFO_BT_CONTINUOUS_TURN:
  2085. dm->is_bt_continuous_turn = (boolean)value;
  2086. break;
  2087. default:
  2088. break;
  2089. }
  2090. }
  2091. u32 phydm_cmn_info_query(struct dm_struct *dm, enum phydm_info_query info_type)
  2092. {
  2093. struct phydm_fa_struct *fa_t = &dm->false_alm_cnt;
  2094. struct phydm_dig_struct *dig_t = &dm->dm_dig_table;
  2095. struct ccx_info *ccx_info = &dm->dm_ccx_info;
  2096. switch (info_type) {
  2097. /*@=== [FA Relative] ===========================================*/
  2098. case PHYDM_INFO_FA_OFDM:
  2099. return fa_t->cnt_ofdm_fail;
  2100. case PHYDM_INFO_FA_CCK:
  2101. return fa_t->cnt_cck_fail;
  2102. case PHYDM_INFO_FA_TOTAL:
  2103. return fa_t->cnt_all;
  2104. case PHYDM_INFO_CCA_OFDM:
  2105. return fa_t->cnt_ofdm_cca;
  2106. case PHYDM_INFO_CCA_CCK:
  2107. return fa_t->cnt_cck_cca;
  2108. case PHYDM_INFO_CCA_ALL:
  2109. return fa_t->cnt_cca_all;
  2110. case PHYDM_INFO_CRC32_OK_VHT:
  2111. return fa_t->cnt_vht_crc32_ok;
  2112. case PHYDM_INFO_CRC32_OK_HT:
  2113. return fa_t->cnt_ht_crc32_ok;
  2114. case PHYDM_INFO_CRC32_OK_LEGACY:
  2115. return fa_t->cnt_ofdm_crc32_ok;
  2116. case PHYDM_INFO_CRC32_OK_CCK:
  2117. return fa_t->cnt_cck_crc32_ok;
  2118. case PHYDM_INFO_CRC32_ERROR_VHT:
  2119. return fa_t->cnt_vht_crc32_error;
  2120. case PHYDM_INFO_CRC32_ERROR_HT:
  2121. return fa_t->cnt_ht_crc32_error;
  2122. case PHYDM_INFO_CRC32_ERROR_LEGACY:
  2123. return fa_t->cnt_ofdm_crc32_error;
  2124. case PHYDM_INFO_CRC32_ERROR_CCK:
  2125. return fa_t->cnt_cck_crc32_error;
  2126. case PHYDM_INFO_EDCCA_FLAG:
  2127. return fa_t->edcca_flag;
  2128. case PHYDM_INFO_OFDM_ENABLE:
  2129. return fa_t->ofdm_block_enable;
  2130. case PHYDM_INFO_CCK_ENABLE:
  2131. return fa_t->cck_block_enable;
  2132. case PHYDM_INFO_DBG_PORT_0:
  2133. return fa_t->dbg_port0;
  2134. case PHYDM_INFO_CRC32_OK_HT_AGG:
  2135. return fa_t->cnt_ht_crc32_ok_agg;
  2136. case PHYDM_INFO_CRC32_ERROR_HT_AGG:
  2137. return fa_t->cnt_ht_crc32_error_agg;
  2138. /*@=== [DIG] ================================================*/
  2139. case PHYDM_INFO_CURR_IGI:
  2140. return dig_t->cur_ig_value;
  2141. /*@=== [RSSI] ===============================================*/
  2142. case PHYDM_INFO_RSSI_MIN:
  2143. return (u32)dm->rssi_min;
  2144. case PHYDM_INFO_RSSI_MAX:
  2145. return (u32)dm->rssi_max;
  2146. case PHYDM_INFO_CLM_RATIO:
  2147. return (u32)ccx_info->clm_ratio;
  2148. case PHYDM_INFO_NHM_RATIO:
  2149. return (u32)ccx_info->nhm_ratio;
  2150. default:
  2151. return 0xffffffff;
  2152. }
  2153. }
  2154. #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
  2155. void odm_init_all_work_items(struct dm_struct *dm)
  2156. {
  2157. void *adapter = dm->adapter;
  2158. #if USE_WORKITEM
  2159. #ifdef CONFIG_ADAPTIVE_SOML
  2160. odm_initialize_work_item(dm,
  2161. &dm->dm_soml_table.phydm_adaptive_soml_workitem,
  2162. (RT_WORKITEM_CALL_BACK)phydm_adaptive_soml_workitem_callback,
  2163. (void *)adapter,
  2164. "AdaptiveSOMLWorkitem");
  2165. #endif
  2166. #ifdef ODM_EVM_ENHANCE_ANTDIV
  2167. odm_initialize_work_item(dm,
  2168. &dm->phydm_evm_antdiv_workitem,
  2169. (RT_WORKITEM_CALL_BACK)phydm_evm_antdiv_workitem_callback,
  2170. (void *)adapter,
  2171. "EvmAntdivWorkitem");
  2172. #endif
  2173. #ifdef CONFIG_S0S1_SW_ANTENNA_DIVERSITY
  2174. odm_initialize_work_item(dm,
  2175. &dm->dm_swat_table.phydm_sw_antenna_switch_workitem,
  2176. (RT_WORKITEM_CALL_BACK)odm_sw_antdiv_workitem_callback,
  2177. (void *)adapter,
  2178. "AntennaSwitchWorkitem");
  2179. #endif
  2180. #if (defined(CONFIG_HL_SMART_ANTENNA))
  2181. odm_initialize_work_item(dm,
  2182. &dm->dm_sat_table.hl_smart_antenna_workitem,
  2183. (RT_WORKITEM_CALL_BACK)phydm_beam_switch_workitem_callback,
  2184. (void *)adapter,
  2185. "hl_smart_ant_workitem");
  2186. odm_initialize_work_item(dm,
  2187. &dm->dm_sat_table.hl_smart_antenna_decision_workitem,
  2188. (RT_WORKITEM_CALL_BACK)phydm_beam_decision_workitem_callback,
  2189. (void *)adapter,
  2190. "hl_smart_ant_decision_workitem");
  2191. #endif
  2192. odm_initialize_work_item(
  2193. dm,
  2194. &dm->ra_rpt_workitem,
  2195. (RT_WORKITEM_CALL_BACK)halrf_update_init_rate_work_item_callback,
  2196. (void *)adapter,
  2197. "ra_rpt_workitem");
  2198. #if (defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY)) || (defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY))
  2199. odm_initialize_work_item(
  2200. dm,
  2201. &dm->fast_ant_training_workitem,
  2202. (RT_WORKITEM_CALL_BACK)odm_fast_ant_training_work_item_callback,
  2203. (void *)adapter,
  2204. "fast_ant_training_workitem");
  2205. #endif
  2206. #endif /*#if USE_WORKITEM*/
  2207. #if (BEAMFORMING_SUPPORT == 1)
  2208. odm_initialize_work_item(
  2209. dm,
  2210. &dm->beamforming_info.txbf_info.txbf_enter_work_item,
  2211. (RT_WORKITEM_CALL_BACK)hal_com_txbf_enter_work_item_callback,
  2212. (void *)adapter,
  2213. "txbf_enter_work_item");
  2214. odm_initialize_work_item(
  2215. dm,
  2216. &dm->beamforming_info.txbf_info.txbf_leave_work_item,
  2217. (RT_WORKITEM_CALL_BACK)hal_com_txbf_leave_work_item_callback,
  2218. (void *)adapter,
  2219. "txbf_leave_work_item");
  2220. odm_initialize_work_item(
  2221. dm,
  2222. &dm->beamforming_info.txbf_info.txbf_fw_ndpa_work_item,
  2223. (RT_WORKITEM_CALL_BACK)hal_com_txbf_fw_ndpa_work_item_callback,
  2224. (void *)adapter,
  2225. "txbf_fw_ndpa_work_item");
  2226. odm_initialize_work_item(
  2227. dm,
  2228. &dm->beamforming_info.txbf_info.txbf_clk_work_item,
  2229. (RT_WORKITEM_CALL_BACK)hal_com_txbf_clk_work_item_callback,
  2230. (void *)adapter,
  2231. "txbf_clk_work_item");
  2232. odm_initialize_work_item(
  2233. dm,
  2234. &dm->beamforming_info.txbf_info.txbf_rate_work_item,
  2235. (RT_WORKITEM_CALL_BACK)hal_com_txbf_rate_work_item_callback,
  2236. (void *)adapter,
  2237. "txbf_rate_work_item");
  2238. odm_initialize_work_item(
  2239. dm,
  2240. &dm->beamforming_info.txbf_info.txbf_status_work_item,
  2241. (RT_WORKITEM_CALL_BACK)hal_com_txbf_status_work_item_callback,
  2242. (void *)adapter,
  2243. "txbf_status_work_item");
  2244. odm_initialize_work_item(
  2245. dm,
  2246. &dm->beamforming_info.txbf_info.txbf_reset_tx_path_work_item,
  2247. (RT_WORKITEM_CALL_BACK)hal_com_txbf_reset_tx_path_work_item_callback,
  2248. (void *)adapter,
  2249. "txbf_reset_tx_path_work_item");
  2250. odm_initialize_work_item(
  2251. dm,
  2252. &dm->beamforming_info.txbf_info.txbf_get_tx_rate_work_item,
  2253. (RT_WORKITEM_CALL_BACK)hal_com_txbf_get_tx_rate_work_item_callback,
  2254. (void *)adapter,
  2255. "txbf_get_tx_rate_work_item");
  2256. #endif
  2257. odm_initialize_work_item(
  2258. dm,
  2259. &dm->adaptivity.phydm_pause_edcca_work_item,
  2260. (RT_WORKITEM_CALL_BACK)phydm_pause_edcca_work_item_callback,
  2261. (void *)adapter,
  2262. "phydm_pause_edcca_work_item");
  2263. odm_initialize_work_item(
  2264. dm,
  2265. &dm->adaptivity.phydm_resume_edcca_work_item,
  2266. (RT_WORKITEM_CALL_BACK)phydm_resume_edcca_work_item_callback,
  2267. (void *)adapter,
  2268. "phydm_resume_edcca_work_item");
  2269. #if (PHYDM_LA_MODE_SUPPORT == 1)
  2270. odm_initialize_work_item(
  2271. dm,
  2272. &dm->adcsmp.adc_smp_work_item,
  2273. (RT_WORKITEM_CALL_BACK)adc_smp_work_item_callback,
  2274. (void *)adapter,
  2275. "adc_smp_work_item");
  2276. odm_initialize_work_item(
  2277. dm,
  2278. &dm->adcsmp.adc_smp_work_item_1,
  2279. (RT_WORKITEM_CALL_BACK)adc_smp_work_item_callback,
  2280. (void *)adapter,
  2281. "adc_smp_work_item_1");
  2282. #endif
  2283. }
  2284. void odm_free_all_work_items(struct dm_struct *dm)
  2285. {
  2286. #if USE_WORKITEM
  2287. #ifdef CONFIG_S0S1_SW_ANTENNA_DIVERSITY
  2288. odm_free_work_item(&dm->dm_swat_table.phydm_sw_antenna_switch_workitem);
  2289. #endif
  2290. #ifdef CONFIG_ADAPTIVE_SOML
  2291. odm_free_work_item(&dm->dm_soml_table.phydm_adaptive_soml_workitem);
  2292. #endif
  2293. #ifdef ODM_EVM_ENHANCE_ANTDIV
  2294. odm_free_work_item(&dm->phydm_evm_antdiv_workitem);
  2295. #endif
  2296. #if (defined(CONFIG_HL_SMART_ANTENNA))
  2297. odm_free_work_item(&dm->dm_sat_table.hl_smart_antenna_workitem);
  2298. odm_free_work_item(&dm->dm_sat_table.hl_smart_antenna_decision_workitem);
  2299. #endif
  2300. #if (defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY)) || (defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY))
  2301. odm_free_work_item(&dm->fast_ant_training_workitem);
  2302. #endif
  2303. odm_free_work_item(&dm->ra_rpt_workitem);
  2304. /*odm_free_work_item((&dm->sbdcnt_workitem));*/
  2305. #endif
  2306. #if (BEAMFORMING_SUPPORT == 1)
  2307. odm_free_work_item((&dm->beamforming_info.txbf_info.txbf_enter_work_item));
  2308. odm_free_work_item((&dm->beamforming_info.txbf_info.txbf_leave_work_item));
  2309. odm_free_work_item((&dm->beamforming_info.txbf_info.txbf_fw_ndpa_work_item));
  2310. odm_free_work_item((&dm->beamforming_info.txbf_info.txbf_clk_work_item));
  2311. odm_free_work_item((&dm->beamforming_info.txbf_info.txbf_rate_work_item));
  2312. odm_free_work_item((&dm->beamforming_info.txbf_info.txbf_status_work_item));
  2313. odm_free_work_item((&dm->beamforming_info.txbf_info.txbf_reset_tx_path_work_item));
  2314. odm_free_work_item((&dm->beamforming_info.txbf_info.txbf_get_tx_rate_work_item));
  2315. #endif
  2316. odm_free_work_item((&dm->adaptivity.phydm_pause_edcca_work_item));
  2317. odm_free_work_item((&dm->adaptivity.phydm_resume_edcca_work_item));
  2318. #if (PHYDM_LA_MODE_SUPPORT == 1)
  2319. odm_free_work_item((&dm->adcsmp.adc_smp_work_item));
  2320. odm_free_work_item((&dm->adcsmp.adc_smp_work_item_1));
  2321. #endif
  2322. }
  2323. #endif /*#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)*/
  2324. void odm_init_all_timers(struct dm_struct *dm)
  2325. {
  2326. #if (defined(CONFIG_PHYDM_ANTENNA_DIVERSITY))
  2327. odm_ant_div_timers(dm, INIT_ANTDIV_TIMMER);
  2328. #endif
  2329. #if (defined(PHYDM_TDMA_DIG_SUPPORT))
  2330. #ifdef IS_USE_NEW_TDMA
  2331. phydm_tdma_dig_timers(dm, INIT_TDMA_DIG_TIMMER);
  2332. #endif
  2333. #endif
  2334. #ifdef CONFIG_ADAPTIVE_SOML
  2335. phydm_adaptive_soml_timers(dm, INIT_SOML_TIMMER);
  2336. #endif
  2337. #ifdef PHYDM_LNA_SAT_CHK_SUPPORT
  2338. #ifdef PHYDM_LNA_SAT_CHK_TYPE1
  2339. phydm_lna_sat_chk_timers(dm, INIT_LNA_SAT_CHK_TIMMER);
  2340. #endif
  2341. #endif
  2342. #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
  2343. odm_initialize_timer(dm, &dm->sbdcnt_timer,
  2344. (void *)phydm_sbd_callback, NULL, "SbdTimer");
  2345. #if (BEAMFORMING_SUPPORT == 1)
  2346. odm_initialize_timer(dm, &dm->beamforming_info.txbf_info.txbf_fw_ndpa_timer,
  2347. (void *)hal_com_txbf_fw_ndpa_timer_callback, NULL,
  2348. "txbf_fw_ndpa_timer");
  2349. #endif
  2350. #endif
  2351. #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))
  2352. #if (BEAMFORMING_SUPPORT == 1)
  2353. odm_initialize_timer(dm, &dm->beamforming_info.beamforming_timer,
  2354. (void *)beamforming_sw_timer_callback, NULL,
  2355. "beamforming_timer");
  2356. #endif
  2357. #endif
  2358. }
  2359. void odm_cancel_all_timers(struct dm_struct *dm)
  2360. {
  2361. #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
  2362. /* @2012/01/12 MH Temp BSOD fix. We need to find NIC allocate mem fail reason in win7*/
  2363. if (dm->adapter == NULL)
  2364. return;
  2365. #endif
  2366. #if (defined(CONFIG_PHYDM_ANTENNA_DIVERSITY))
  2367. odm_ant_div_timers(dm, CANCEL_ANTDIV_TIMMER);
  2368. #endif
  2369. #ifdef CONFIG_ADAPTIVE_SOML
  2370. phydm_adaptive_soml_timers(dm, CANCEL_SOML_TIMMER);
  2371. #endif
  2372. #ifdef PHYDM_LNA_SAT_CHK_SUPPORT
  2373. #ifdef PHYDM_LNA_SAT_CHK_TYPE1
  2374. phydm_lna_sat_chk_timers(dm, CANCEL_LNA_SAT_CHK_TIMMER);
  2375. #endif
  2376. #endif
  2377. #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
  2378. odm_cancel_timer(dm, &dm->sbdcnt_timer);
  2379. #if (BEAMFORMING_SUPPORT == 1)
  2380. odm_cancel_timer(dm, &dm->beamforming_info.txbf_info.txbf_fw_ndpa_timer);
  2381. #endif
  2382. #endif
  2383. #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))
  2384. #if (BEAMFORMING_SUPPORT == 1)
  2385. odm_cancel_timer(dm, &dm->beamforming_info.beamforming_timer);
  2386. #endif
  2387. #endif
  2388. }
  2389. void odm_release_all_timers(struct dm_struct *dm)
  2390. {
  2391. #if (defined(CONFIG_PHYDM_ANTENNA_DIVERSITY))
  2392. odm_ant_div_timers(dm, RELEASE_ANTDIV_TIMMER);
  2393. #endif
  2394. #ifdef CONFIG_ADAPTIVE_SOML
  2395. phydm_adaptive_soml_timers(dm, RELEASE_SOML_TIMMER);
  2396. #endif
  2397. #ifdef PHYDM_LNA_SAT_CHK_SUPPORT
  2398. #ifdef PHYDM_LNA_SAT_CHK_TYPE1
  2399. phydm_lna_sat_chk_timers(dm, RELEASE_LNA_SAT_CHK_TIMMER);
  2400. #endif
  2401. #endif
  2402. #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
  2403. odm_release_timer(dm, &dm->sbdcnt_timer);
  2404. #if (BEAMFORMING_SUPPORT == 1)
  2405. odm_release_timer(dm, &dm->beamforming_info.txbf_info.txbf_fw_ndpa_timer);
  2406. #endif
  2407. #endif
  2408. #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))
  2409. #if (BEAMFORMING_SUPPORT == 1)
  2410. odm_release_timer(dm, &dm->beamforming_info.beamforming_timer);
  2411. #endif
  2412. #endif
  2413. }
  2414. #if (DM_ODM_SUPPORT_TYPE == ODM_AP)
  2415. void odm_init_all_threads(
  2416. struct dm_struct *dm)
  2417. {
  2418. #ifdef TPT_THREAD
  2419. k_tpt_task_init(dm->priv);
  2420. #endif
  2421. }
  2422. void odm_stop_all_threads(
  2423. struct dm_struct *dm)
  2424. {
  2425. #ifdef TPT_THREAD
  2426. k_tpt_task_stop(dm->priv);
  2427. #endif
  2428. }
  2429. #endif
  2430. #if (DM_ODM_SUPPORT_TYPE == ODM_CE)
  2431. /* @Justin: According to the current RRSI to adjust Response Frame TX power,
  2432. * 2012/11/05
  2433. */
  2434. void odm_dtc(struct dm_struct *dm)
  2435. {
  2436. #ifdef CONFIG_DM_RESP_TXAGC
  2437. /* RSSI higher than this value, start to decade TX power */
  2438. #define DTC_BASE 35
  2439. /* RSSI lower than this value, start to increase TX power */
  2440. #define DTC_DWN_BASE (DTC_BASE - 5)
  2441. /* RSSI vs TX power step mapping: decade TX power */
  2442. static const u8 dtc_table_down[] = {
  2443. DTC_BASE,
  2444. (DTC_BASE + 5),
  2445. (DTC_BASE + 10),
  2446. (DTC_BASE + 15),
  2447. (DTC_BASE + 20),
  2448. (DTC_BASE + 25)};
  2449. /* RSSI vs TX power step mapping: increase TX power */
  2450. static const u8 dtc_table_up[] = {
  2451. DTC_DWN_BASE,
  2452. (DTC_DWN_BASE - 5),
  2453. (DTC_DWN_BASE - 10),
  2454. (DTC_DWN_BASE - 15),
  2455. (DTC_DWN_BASE - 15),
  2456. (DTC_DWN_BASE - 20),
  2457. (DTC_DWN_BASE - 20),
  2458. (DTC_DWN_BASE - 25),
  2459. (DTC_DWN_BASE - 25),
  2460. (DTC_DWN_BASE - 30),
  2461. (DTC_DWN_BASE - 35)};
  2462. u8 i;
  2463. u8 dtc_steps = 0;
  2464. u8 sign;
  2465. u8 resp_txagc = 0;
  2466. #if 0
  2467. /* @As DIG is disabled, DTC is also disable */
  2468. if (!(dm->support_ability & ODM_XXXXXX))
  2469. return;
  2470. #endif
  2471. if (dm->rssi_min > DTC_BASE) {
  2472. /* need to decade the CTS TX power */
  2473. sign = 1;
  2474. for (i = 0; i < ARRAY_SIZE(dtc_table_down); i++) {
  2475. if (dtc_table_down[i] >= dm->rssi_min || dtc_steps >= 6)
  2476. break;
  2477. else
  2478. dtc_steps++;
  2479. }
  2480. }
  2481. #if 0
  2482. else if (dm->rssi_min > DTC_DWN_BASE) {
  2483. /* needs to increase the CTS TX power */
  2484. sign = 0;
  2485. dtc_steps = 1;
  2486. for (i = 0; i < ARRAY_SIZE(dtc_table_up); i++) {
  2487. if (dtc_table_up[i] <= dm->rssi_min || dtc_steps >= 10)
  2488. break;
  2489. else
  2490. dtc_steps++;
  2491. }
  2492. }
  2493. #endif
  2494. else {
  2495. sign = 0;
  2496. dtc_steps = 0;
  2497. }
  2498. resp_txagc = dtc_steps | (sign << 4);
  2499. resp_txagc = resp_txagc | (resp_txagc << 5);
  2500. odm_write_1byte(dm, 0x06d9, resp_txagc);
  2501. PHYDM_DBG(dm, ODM_COMP_PWR_TRAIN,
  2502. "%s rssi_min:%u, set RESP_TXAGC to %s %u\n", __func__,
  2503. dm->rssi_min, sign ? "minus" : "plus", dtc_steps);
  2504. #endif /* @CONFIG_RESP_TXAGC_ADJUST */
  2505. }
  2506. #endif /* @#if (DM_ODM_SUPPORT_TYPE == ODM_CE) */
  2507. /*@<20170126, BB-Kevin>8188F D-CUT DC cancellation and 8821C*/
  2508. void phydm_dc_cancellation(struct dm_struct *dm)
  2509. {
  2510. #ifdef PHYDM_DC_CANCELLATION
  2511. u32 offset_i_hex[PHYDM_MAX_RF_PATH] = {0};
  2512. u32 offset_q_hex[PHYDM_MAX_RF_PATH] = {0};
  2513. u32 reg_value32[PHYDM_MAX_RF_PATH] = {0};
  2514. u8 path = RF_PATH_A;
  2515. u8 set_result;
  2516. if (!(dm->support_ic_type & ODM_DC_CANCELLATION_SUPPORT))
  2517. return;
  2518. if ((dm->support_ic_type & ODM_RTL8188F) &&
  2519. dm->cut_version < ODM_CUT_D)
  2520. return;
  2521. if ((dm->support_ic_type & ODM_RTL8192F) &&
  2522. dm->cut_version == ODM_CUT_A)
  2523. return;
  2524. PHYDM_DBG(dm, ODM_COMP_API, "%s ======>\n", __func__);
  2525. /*@DC_Estimation (only for 2x2 ic now) */
  2526. for (path = RF_PATH_A; path < PHYDM_MAX_RF_PATH; path++) {
  2527. if (path > RF_PATH_A &&
  2528. dm->support_ic_type & (ODM_RTL8821C | ODM_RTL8188F |
  2529. ODM_RTL8710B))
  2530. break;
  2531. else if (path > RF_PATH_B &&
  2532. dm->support_ic_type & (ODM_RTL8822B | ODM_RTL8192F))
  2533. break;
  2534. if (phydm_stop_ic_trx(dm, PHYDM_SET) == PHYDM_SET_FAIL) {
  2535. PHYDM_DBG(dm, ODM_COMP_API, "STOP_TRX_FAIL\n");
  2536. return;
  2537. }
  2538. odm_write_dig(dm, 0x7e);
  2539. /*@Disable LNA*/
  2540. if (dm->support_ic_type & ODM_RTL8821C)
  2541. halrf_rf_lna_setting(dm, HALRF_LNA_DISABLE);
  2542. /*Turn off 3-wire*/
  2543. phydm_stop_3_wire(dm, PHYDM_SET);
  2544. if (dm->support_ic_type & (ODM_RTL8188F | ODM_RTL8710B)) {
  2545. /*set debug port to 0x235*/
  2546. if (!phydm_set_bb_dbg_port(dm, DBGPORT_PRI_2, 0x235)) {
  2547. PHYDM_DBG(dm, ODM_COMP_API,
  2548. "Set Debug port Fail\n");
  2549. return;
  2550. }
  2551. } else if (dm->support_ic_type & ODM_RTL8821C) {
  2552. if (!phydm_set_bb_dbg_port(dm, DBGPORT_PRI_2, 0x200)) {
  2553. /*set debug port to 0x200*/
  2554. PHYDM_DBG(dm, ODM_COMP_API,
  2555. "Set Debug port Fail\n");
  2556. return;
  2557. }
  2558. phydm_bb_dbg_port_header_sel(dm, 0x0);
  2559. } else if (dm->support_ic_type & ODM_RTL8822B) {
  2560. if (path == RF_PATH_A &&
  2561. !phydm_set_bb_dbg_port(dm, DBGPORT_PRI_2, 0x200)) {
  2562. /*set debug port to 0x200*/
  2563. PHYDM_DBG(dm, ODM_COMP_API,
  2564. "Set Debug port Fail\n");
  2565. return;
  2566. }
  2567. if (path == RF_PATH_B &&
  2568. !phydm_set_bb_dbg_port(dm, DBGPORT_PRI_2, 0x202)) {
  2569. /*set debug port to 0x200*/
  2570. PHYDM_DBG(dm, ODM_COMP_API,
  2571. "Set Debug port Fail\n");
  2572. return;
  2573. }
  2574. phydm_bb_dbg_port_header_sel(dm, 0x0);
  2575. } else if (dm->support_ic_type & ODM_RTL8192F) {
  2576. if (path == RF_PATH_A &&
  2577. !phydm_set_bb_dbg_port(dm, DBGPORT_PRI_2, 0x235)) {
  2578. /*set debug port to 0x235*/
  2579. PHYDM_DBG(dm, ODM_COMP_API,
  2580. "Set Debug port Fail\n");
  2581. return;
  2582. }
  2583. if (path == RF_PATH_B &&
  2584. !phydm_set_bb_dbg_port(dm, DBGPORT_PRI_2, 0x23d)) {
  2585. /*set debug port to 0x23d*/
  2586. PHYDM_DBG(dm, ODM_COMP_API,
  2587. "Set Debug port Fail\n");
  2588. return;
  2589. }
  2590. }
  2591. /*@disable CCK DCNF*/
  2592. odm_set_bb_reg(dm, R_0xa78, MASKBYTE1, 0x0);
  2593. PHYDM_DBG(dm, ODM_COMP_API, "DC cancellation Begin!!!\n");
  2594. phydm_stop_ck320(dm, true); /*stop ck320*/
  2595. /* the same debug port both for path-a and path-b*/
  2596. reg_value32[path] = phydm_get_bb_dbg_port_val(dm);
  2597. phydm_stop_ck320(dm, false); /*start ck320*/
  2598. phydm_release_bb_dbg_port(dm);
  2599. /*Turn on 3-wire*/
  2600. phydm_stop_3_wire(dm, PHYDM_REVERT);
  2601. /*@Enable LNA*/
  2602. if (dm->support_ic_type & ODM_RTL8821C)
  2603. halrf_rf_lna_setting(dm, HALRF_LNA_ENABLE);
  2604. odm_write_dig(dm, 0x20);
  2605. set_result = phydm_stop_ic_trx(dm, PHYDM_REVERT);
  2606. PHYDM_DBG(dm, ODM_COMP_API, "DC cancellation OK!!!\n");
  2607. }
  2608. /*@DC_Cancellation*/
  2609. /*@DC compensation to CCK data path*/
  2610. odm_set_bb_reg(dm, R_0xa9c, BIT(20), 0x1);
  2611. if (dm->support_ic_type & (ODM_RTL8188F | ODM_RTL8710B)) {
  2612. offset_i_hex[0] = (reg_value32[0] & 0xffc0000) >> 18;
  2613. offset_q_hex[0] = (reg_value32[0] & 0x3ff00) >> 8;
  2614. /*@Before filling into registers,
  2615. *offset should be multiplexed (-1)
  2616. */
  2617. offset_i_hex[0] = (offset_i_hex[0] >= 0x200) ?
  2618. (0x400 - offset_i_hex[0]) :
  2619. (0x1ff - offset_i_hex[0]);
  2620. offset_q_hex[0] = (offset_q_hex[0] >= 0x200) ?
  2621. (0x400 - offset_q_hex[0]) :
  2622. (0x1ff - offset_q_hex[0]);
  2623. odm_set_bb_reg(dm, R_0x950, 0x1ff, offset_i_hex[0]);
  2624. odm_set_bb_reg(dm, R_0x950, 0x1ff0000, offset_q_hex[0]);
  2625. } else if (dm->support_ic_type & (ODM_RTL8821C | ODM_RTL8822B)) {
  2626. /* Path-a */
  2627. offset_i_hex[0] = (reg_value32[0] & 0xffc00) >> 10;
  2628. offset_q_hex[0] = reg_value32[0] & 0x3ff;
  2629. /*@Before filling into registers,
  2630. *offset should be multiplexed (-1)
  2631. */
  2632. offset_i_hex[0] = 0x400 - offset_i_hex[0];
  2633. offset_q_hex[0] = 0x400 - offset_q_hex[0];
  2634. odm_set_bb_reg(dm, R_0xc10, 0x3c000000,
  2635. (0x3c0 & offset_i_hex[0]) >> 6);
  2636. odm_set_bb_reg(dm, R_0xc10, 0xfc00, 0x3f & offset_i_hex[0]);
  2637. odm_set_bb_reg(dm, R_0xc14, 0x3c000000,
  2638. (0x3c0 & offset_q_hex[0]) >> 6);
  2639. odm_set_bb_reg(dm, R_0xc14, 0xfc00, 0x3f & offset_q_hex[0]);
  2640. /* Path-b */
  2641. if (dm->rf_type > RF_1T1R) {
  2642. offset_i_hex[1] = (reg_value32[1] & 0xffc00) >> 10;
  2643. offset_q_hex[1] = reg_value32[1] & 0x3ff;
  2644. /*@Before filling into registers,
  2645. *offset should be multiplexed (-1)
  2646. */
  2647. offset_i_hex[1] = 0x400 - offset_i_hex[1];
  2648. offset_q_hex[1] = 0x400 - offset_q_hex[1];
  2649. odm_set_bb_reg(dm, R_0xe10, 0x3c000000,
  2650. (0x3c0 & offset_i_hex[1]) >> 6);
  2651. odm_set_bb_reg(dm, R_0xe10, 0xfc00,
  2652. 0x3f & offset_i_hex[1]);
  2653. odm_set_bb_reg(dm, R_0xe14, 0x3c000000,
  2654. (0x3c0 & offset_q_hex[1]) >> 6);
  2655. odm_set_bb_reg(dm, R_0xe14, 0xfc00,
  2656. 0x3f & offset_q_hex[1]);
  2657. }
  2658. } else if (dm->support_ic_type & (ODM_RTL8192F)) {
  2659. /* Path-a I:df4[27:18],Q:df4[17:8]*/
  2660. offset_i_hex[0] = (reg_value32[0] & 0xffc0000) >> 18;
  2661. offset_q_hex[0] = (reg_value32[0] & 0x3ff00) >> 8;
  2662. /*@Before filling into registers,
  2663. *offset should be multiplexed (-1)
  2664. */
  2665. offset_i_hex[0] = (offset_i_hex[0] >= 0x200) ?
  2666. (0x400 - offset_i_hex[0]) :
  2667. (0xff - offset_i_hex[0]);
  2668. offset_q_hex[0] = (offset_q_hex[0] >= 0x200) ?
  2669. (0x400 - offset_q_hex[0]) :
  2670. (0xff - offset_q_hex[0]);
  2671. /*Path-a I:c10[7:0],Q:c10[15:8]*/
  2672. odm_set_bb_reg(dm, R_0xc10, 0xff, offset_i_hex[0]);
  2673. odm_set_bb_reg(dm, R_0xc10, 0xff00, offset_q_hex[0]);
  2674. /* Path-b */
  2675. if (dm->rf_type > RF_1T1R) {
  2676. /* @I:df4[27:18],Q:df4[17:8]*/
  2677. offset_i_hex[1] = (reg_value32[1] & 0xffc0000) >> 18;
  2678. offset_q_hex[1] = (reg_value32[1] & 0x3ff00) >> 8;
  2679. /*@Before filling into registers,
  2680. *offset should be multiplexed (-1)
  2681. */
  2682. offset_i_hex[1] = (offset_i_hex[1] >= 0x200) ?
  2683. (0x400 - offset_i_hex[1]) :
  2684. (0xff - offset_i_hex[1]);
  2685. offset_q_hex[1] = (offset_q_hex[1] >= 0x200) ?
  2686. (0x400 - offset_q_hex[1]) :
  2687. (0xff - offset_q_hex[1]);
  2688. /*Path-b I:c18[7:0],Q:c18[15:8]*/
  2689. odm_set_bb_reg(dm, R_0xc18, 0xff, offset_i_hex[1]);
  2690. odm_set_bb_reg(dm, R_0xc18, 0xff00, offset_q_hex[1]);
  2691. }
  2692. }
  2693. #endif
  2694. }
  2695. void phydm_receiver_blocking(void *dm_void)
  2696. {
  2697. #ifdef CONFIG_RECEIVER_BLOCKING
  2698. struct dm_struct *dm = (struct dm_struct *)dm_void;
  2699. u32 chnl = *dm->channel;
  2700. u8 bw = *dm->band_width;
  2701. u32 bb_regf0 = odm_get_bb_reg(dm, R_0xf0, 0xf000);
  2702. if (!(dm->support_ic_type & ODM_RECEIVER_BLOCKING_SUPPORT) ||
  2703. !(dm->support_ability & ODM_BB_ADAPTIVITY))
  2704. return;
  2705. if ((dm->support_ic_type & ODM_RTL8188E && bb_regf0 < 8) ||
  2706. dm->support_ic_type & ODM_RTL8192E) {
  2707. /*@8188E_T version*/
  2708. if (dm->consecutive_idlel_time <= 10 || *dm->mp_mode)
  2709. goto end;
  2710. if (bw == CHANNEL_WIDTH_20 && chnl == 1) {
  2711. phydm_nbi_setting(dm, FUNC_ENABLE, chnl, 20, 2410,
  2712. PHYDM_DONT_CARE);
  2713. dm->is_rx_blocking_en = true;
  2714. } else if ((bw == CHANNEL_WIDTH_20) && (chnl == 13)) {
  2715. phydm_nbi_setting(dm, FUNC_ENABLE, chnl, 20, 2473,
  2716. PHYDM_DONT_CARE);
  2717. dm->is_rx_blocking_en = true;
  2718. } else if (dm->is_rx_blocking_en && chnl != 1 && chnl != 13) {
  2719. phydm_nbi_enable(dm, FUNC_DISABLE);
  2720. odm_set_bb_reg(dm, R_0xc40, 0x1f000000, 0x1f);
  2721. dm->is_rx_blocking_en = false;
  2722. }
  2723. return;
  2724. } else if ((dm->support_ic_type & ODM_RTL8188E && bb_regf0 >= 8)) {
  2725. /*@8188E_S version*/
  2726. if (dm->consecutive_idlel_time <= 10 || *dm->mp_mode)
  2727. goto end;
  2728. if (bw == CHANNEL_WIDTH_20 && chnl == 13) {
  2729. phydm_nbi_setting(dm, FUNC_ENABLE, chnl, 20, 2473,
  2730. PHYDM_DONT_CARE);
  2731. dm->is_rx_blocking_en = true;
  2732. } else if (dm->is_rx_blocking_en && chnl != 13) {
  2733. phydm_nbi_enable(dm, FUNC_DISABLE);
  2734. odm_set_bb_reg(dm, R_0xc40, 0x1f000000, 0x1f);
  2735. dm->is_rx_blocking_en = false;
  2736. }
  2737. return;
  2738. }
  2739. end:
  2740. if (dm->is_rx_blocking_en) {
  2741. phydm_nbi_enable(dm, FUNC_DISABLE);
  2742. odm_set_bb_reg(dm, R_0xc40, 0x1f000000, 0x1f);
  2743. dm->is_rx_blocking_en = false;
  2744. }
  2745. #endif
  2746. }