halrf_iqk_8821c.c 111 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777
  1. /******************************************************************************
  2. *
  3. * Copyright(c) 2016 - 2017 Realtek Corporation.
  4. *
  5. * This program is free software; you can redistribute it and/or modify it
  6. * under the terms of version 2 of the GNU General Public License as
  7. * published by the Free Software Foundation.
  8. *
  9. * This program is distributed in the hope that it will be useful, but WITHOUT
  10. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11. * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  12. * more details.
  13. *
  14. *****************************************************************************/
  15. #include "mp_precomp.h"
  16. #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
  17. #if RT_PLATFORM == PLATFORM_MACOSX
  18. #include "phydm_precomp.h"
  19. #else
  20. #include "../phydm_precomp.h"
  21. #endif
  22. #else
  23. #include "../../phydm_precomp.h"
  24. #endif
  25. #if (RTL8821C_SUPPORT == 1)
  26. /*---------------------------Define Local Constant---------------------------*/
  27. static u32 dpk_result[DPK_BACKUP_REG_NUM_8821C];
  28. static boolean txgap_done[3] = {false, false, false};
  29. static boolean overflowflag;
  30. #define dpk_forcein_sram4 1
  31. #define txgap_ref_index 0x0
  32. #define txgap_k_number 0x7
  33. /*---------------------------Define Local Constant---------------------------*/
  34. #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
  35. void do_iqk_8821c(void *dm_void, u8 delta_thermal_index, u8 thermal_value,
  36. u8 threshold)
  37. {
  38. struct dm_struct *dm = (struct dm_struct *)dm_void;
  39. struct dm_iqk_info *iqk_info = &dm->IQK_info;
  40. dm->rf_calibrate_info.thermal_value_iqk = thermal_value;
  41. halrf_segment_iqk_trigger(dm, true, iqk_info->segment_iqk);
  42. }
  43. #else
  44. /*Originally config->do_iqk is hooked phy_iq_calibrate_8821c, but do_iqk_8821c and phy_iq_calibrate_8821c have different arguments*/
  45. void do_iqk_8821c(void *dm_void, u8 delta_thermal_index, u8 thermal_value,
  46. u8 threshold)
  47. {
  48. struct dm_struct *dm = (struct dm_struct *)dm_void;
  49. struct dm_iqk_info *iqk_info = &dm->IQK_info;
  50. /*boolean is_recovery = (boolean) delta_thermal_index;*/
  51. halrf_segment_iqk_trigger(dm, true, iqk_info->segment_iqk);
  52. }
  53. #endif
  54. void do_dpk_8821c(void *dm_void, u8 delta_thermal_index, u8 thermal_value,
  55. u8 threshold)
  56. {
  57. struct dm_struct *dm = (struct dm_struct *)dm_void;
  58. /*boolean is_recovery = (boolean) delta_thermal_index;*/
  59. phy_dp_calibrate_8821c(dm, true);
  60. }
  61. boolean
  62. _iqk_check_nctl_done_8821c(struct dm_struct *dm, u8 path, u32 IQK_CMD)
  63. {
  64. /*this function is only used after the version of nctl8.0*/
  65. boolean notready = true;
  66. boolean fail = true;
  67. u32 delay_count = 0x0;
  68. while (notready) {
  69. if ((IQK_CMD & 0x00000f00) >> 8 == 0xc) {
  70. if (odm_get_rf_reg(dm, path, RF_0x08, RFREGOFFSETMASK) == 0x1a3b5)
  71. notready = false;
  72. else
  73. notready = true;
  74. } else {
  75. if (odm_get_rf_reg(dm, path, RF_0x08, RFREGOFFSETMASK) == 0x12345)
  76. notready = false;
  77. else
  78. notready = true;
  79. }
  80. if (notready) {
  81. /*ODM_sleep_ms(1);*/
  82. ODM_delay_ms(1);
  83. delay_count++;
  84. } else {
  85. fail = (boolean)odm_get_bb_reg(dm, R_0x1b08, BIT(26));
  86. if (fail) {
  87. RF_DBG(dm, DBG_RF_IQK,
  88. "[IQK](1)IQK_CMD =0x%x, Fail, 0x1b08=0x%x, RF08=0x%x, 1b00=0x%x,fail=0x%x, notready=0x%x!!!\n",
  89. IQK_CMD, odm_read_4byte(dm, 0x1b08),
  90. odm_get_rf_reg(dm, path, RF_0x08,
  91. RFREGOFFSETMASK),
  92. odm_read_4byte(dm, 0x1b00), fail,
  93. notready);
  94. }
  95. break;
  96. }
  97. if (delay_count >= 50) {
  98. RF_DBG(dm, DBG_RF_IQK, "[IQK]S%d IQK timeout!!!\n",
  99. path);
  100. break;
  101. }
  102. }
  103. odm_set_rf_reg(dm, path, RF_0x8, RFREGOFFSETMASK, 0x0);
  104. if (!fail) {
  105. RF_DBG(dm, DBG_RF_IQK,
  106. "[IQK]IQK_CMD =0x%x, delay_count =0x%x RF0x08=0x%x, 0x1b08=0x%x,RF0xef=0x%x,RF0xdf=0x%x, !!!\n",
  107. IQK_CMD, delay_count,
  108. odm_get_rf_reg(dm, path, RF_0x8, RFREGOFFSETMASK),
  109. odm_read_4byte(dm, 0x1b08),
  110. odm_get_rf_reg(dm, path, RF_0xef, RFREGOFFSETMASK),
  111. odm_get_rf_reg(dm, path, RF_0xdf, RFREGOFFSETMASK));
  112. } else {
  113. RF_DBG(dm, DBG_RF_IQK,
  114. "[IQK](2)IQK_CMD =0x%x, Fail, 0x1b08=0x%x, RF08=0x%x!!!\n",
  115. IQK_CMD, odm_read_4byte(dm, 0x1b08),
  116. odm_get_rf_reg(dm, path, RF_0x08, RFREGOFFSETMASK));
  117. }
  118. return fail;
  119. }
  120. void phydm_get_read_counter_8821c(struct dm_struct *dm)
  121. {
  122. u32 counter = 0x0;
  123. while (1) {
  124. if ((odm_get_rf_reg(dm, RF_PATH_A, RF_0x8, RFREGOFFSETMASK) == 0xabcde) || counter > 300)
  125. break;
  126. counter++;
  127. /*ODM_sleep_ms(1);*/
  128. ODM_delay_ms(1);
  129. };
  130. odm_set_rf_reg(dm, RF_PATH_A, RF_0x8, RFREGOFFSETMASK, 0x0);
  131. RF_DBG(dm, DBG_RF_IQK, "[IQK]counter = %d\n", counter);
  132. }
  133. void _iqk_check_coex_status(struct dm_struct *dm, boolean beforeK)
  134. {
  135. u8 u1b_tmp;
  136. u16 count = 0;
  137. u8 h2c_parameter;
  138. h2c_parameter = 1;
  139. if (beforeK) {
  140. u1b_tmp = odm_read_1byte(dm, 0x49c);
  141. RF_DBG(dm, DBG_RF_IQK,
  142. "[IQK]check 0x49c[0] = 0x%x before h2c 0x6d\n", u1b_tmp);
  143. /*check if BT IQK */
  144. u1b_tmp = odm_read_1byte(dm, 0x49c);
  145. while ((u1b_tmp & BIT(1)) && (count < 100)) {
  146. /*ODM_sleep_ms(10);*/
  147. ODM_delay_ms(10);
  148. u1b_tmp = odm_read_1byte(dm, 0x49c);
  149. count++;
  150. RF_DBG(dm, DBG_RF_IQK,
  151. "[IQK]check 0x49c[1]=0x%x, count = %d\n",
  152. u1b_tmp, count);
  153. }
  154. #if 1
  155. odm_fill_h2c_cmd(dm, ODM_H2C_WIFI_CALIBRATION, 1, &h2c_parameter);
  156. u1b_tmp = odm_read_1byte(dm, 0x49c);
  157. RF_DBG(dm, DBG_RF_IQK,
  158. "[IQK]check 0x49c[0] = 0x%x after h2c 0x6d\n", u1b_tmp);
  159. u1b_tmp = odm_read_1byte(dm, 0x49c);
  160. /*check if WL IQK available form WL FW */
  161. while ((!(u1b_tmp & BIT(0))) && (count < 100)) {
  162. #if 0
  163. /*ODM_sleep_ms(10);*/
  164. #endif
  165. ODM_delay_ms(10);
  166. u1b_tmp = odm_read_1byte(dm, 0x49c);
  167. count++;
  168. RF_DBG(dm, DBG_RF_IQK,
  169. "[IQK]check 0x49c[1]=0x%x, count = %d\n",
  170. u1b_tmp, count);
  171. }
  172. if (count >= 100)
  173. RF_DBG(dm, DBG_RF_IQK,
  174. "[IQK]Polling 0x49c to 1 for WiFi calibration H2C cmd FAIL! count(%d)\n",
  175. count);
  176. #endif
  177. } else {
  178. odm_set_bb_reg(dm, R_0x49c, BIT(0), 0x0);
  179. }
  180. }
  181. u32 _iqk_indirect_read_reg(struct dm_struct *dm, u16 reg_addr)
  182. {
  183. u32 j = 0;
  184. /*wait for ready bit before access 0x1700*/
  185. odm_write_4byte(dm, 0x1700, 0x800f0000 | reg_addr);
  186. do {
  187. j++;
  188. } while (((odm_read_1byte(dm, 0x1703) & BIT(5)) == 0) && (j < 30000));
  189. return odm_read_4byte(dm, 0x1708); /*get read data*/
  190. }
  191. void _iqk_indirect_write_reg(struct dm_struct *dm, u16 reg_addr, u32 bit_mask,
  192. u32 reg_value)
  193. {
  194. u32 val, i = 0, j = 0, bitpos = 0;
  195. if (bit_mask == 0x0)
  196. return;
  197. if (bit_mask == 0xffffffff) {
  198. odm_write_4byte(dm, 0x1704, reg_value); /*put write data*/
  199. /*wait for ready bit before access 0x1700*/
  200. do {
  201. j++;
  202. } while (((odm_read_1byte(dm, 0x1703) & BIT(5)) == 0) && (j < 30000));
  203. odm_write_4byte(dm, 0x1700, 0xc00f0000 | reg_addr);
  204. } else {
  205. for (i = 0; i <= 31; i++) {
  206. if (((bit_mask >> i) & 0x1) == 0x1) {
  207. bitpos = i;
  208. break;
  209. }
  210. }
  211. /*read back register value before write*/
  212. val = _iqk_indirect_read_reg(dm, reg_addr);
  213. val = (val & (~bit_mask)) | (reg_value << bitpos);
  214. odm_write_4byte(dm, 0x1704, val); /*put write data*/
  215. /*wait for ready bit before access 0x1700*/
  216. do {
  217. j++;
  218. } while (((odm_read_1byte(dm, 0x1703) & BIT(5)) == 0) && (j < 30000));
  219. odm_write_4byte(dm, 0x1700, 0xc00f0000 | reg_addr);
  220. }
  221. }
  222. void _iqk_set_gnt_wl_high(struct dm_struct *dm)
  223. {
  224. u32 val = 0;
  225. u8 state = 0x1, sw_control = 0x1;
  226. /*GNT_WL = 1*/
  227. val = (sw_control) ? ((state << 1) | 0x1) : 0;
  228. _iqk_indirect_write_reg(dm, 0x38, 0x3000, val); /*0x38[13:12]*/
  229. _iqk_indirect_write_reg(dm, 0x38, 0x0300, val); /*0x38[9:8]*/
  230. }
  231. void _iqk_set_gnt_bt_low(struct dm_struct *dm)
  232. {
  233. u32 val = 0;
  234. u8 state = 0x0, sw_control = 0x1;
  235. /*GNT_BT = 0*/
  236. val = (sw_control) ? ((state << 1) | 0x1) : 0;
  237. _iqk_indirect_write_reg(dm, 0x38, 0xc000, val); /*0x38[15:14]*/
  238. _iqk_indirect_write_reg(dm, 0x38, 0x0c00, val); /*0x38[11:10]*/
  239. }
  240. void _iqk_set_gnt_wl_gnt_bt(struct dm_struct *dm, boolean beforeK)
  241. {
  242. struct dm_iqk_info *iqk_info = &dm->IQK_info;
  243. if (beforeK) {
  244. _iqk_set_gnt_wl_high(dm);
  245. _iqk_set_gnt_bt_low(dm);
  246. } else {
  247. _iqk_indirect_write_reg(dm, 0x38, MASKDWORD, iqk_info->tmp_gntwl);
  248. }
  249. }
  250. void _iqk_fail_count_8821c(void *dm_void)
  251. {
  252. struct dm_struct *dm = (struct dm_struct *)dm_void;
  253. struct dm_iqk_info *iqk_info = &dm->IQK_info;
  254. u8 i;
  255. dm->n_iqk_cnt++;
  256. if (odm_get_rf_reg(dm, RF_PATH_A, RF_0x1bf0, BIT(16)) == 1)
  257. iqk_info->is_reload = true;
  258. else
  259. iqk_info->is_reload = false;
  260. if (!iqk_info->is_reload) {
  261. for (i = 0; i < 8; i++) {
  262. if (odm_get_bb_reg(dm, R_0x1bf0, BIT(i)) == 1)
  263. dm->n_iqk_fail_cnt++;
  264. }
  265. }
  266. RF_DBG(dm, DBG_RF_IQK, "[IQK]All/Fail = %d %d\n", dm->n_iqk_cnt,
  267. dm->n_iqk_fail_cnt);
  268. }
  269. void _iqk_fill_iqk_report_8821c(void *dm_void, u8 channel)
  270. {
  271. struct dm_struct *dm = (struct dm_struct *)dm_void;
  272. struct dm_iqk_info *iqk_info = &dm->IQK_info;
  273. u32 tmp1 = 0x0, tmp2 = 0x0, tmp3 = 0x0;
  274. u8 i;
  275. for (i = 0; i < SS_8821C; i++) {
  276. tmp1 = tmp1 + ((iqk_info->iqk_fail_report[channel][i][TX_IQK] & 0x1) << i);
  277. tmp2 = tmp2 + ((iqk_info->iqk_fail_report[channel][i][RX_IQK] & 0x1) << (i + 4));
  278. tmp3 = tmp3 + ((iqk_info->rxiqk_fail_code[channel][i] & 0x3) << (i * 2 + 8));
  279. }
  280. odm_write_4byte(dm, 0x1b00, 0xf8000008);
  281. odm_set_bb_reg(dm, R_0x1bf0, 0x00ffffff, tmp1 | tmp2 | tmp3);
  282. for (i = 0; i < SS_8821C; i++)
  283. odm_write_4byte(dm, 0x1be8 + (i * 4), (iqk_info->rxiqk_agc[channel][(i * 2) + 1] << 16) | iqk_info->rxiqk_agc[channel][i * 2]);
  284. RF_DBG(dm, DBG_RF_IQK, "[IQK] 0x1be8 = %x\n",
  285. odm_read_4byte(dm, 0x1be8));
  286. }
  287. void _iqk_iqk_fail_report_8821c(struct dm_struct *dm)
  288. {
  289. u32 tmp1bf0 = 0x0;
  290. u8 i;
  291. tmp1bf0 = odm_read_4byte(dm, 0x1bf0);
  292. for (i = 0; i < 4; i++) {
  293. if (tmp1bf0 & (0x1 << i))
  294. #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
  295. RF_DBG(dm, DBG_RF_IQK, "[IQK] please check S%d TXIQK\n",
  296. i);
  297. #else
  298. panic_printk("[IQK] please check S%d TXIQK\n", i);
  299. #endif
  300. if (tmp1bf0 & (0x1 << (i + 12)))
  301. #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
  302. RF_DBG(dm, DBG_RF_IQK, "[IQK] please check S%d RXIQK\n",
  303. i);
  304. #else
  305. panic_printk("[IQK] please check S%d RXIQK\n", i);
  306. #endif
  307. }
  308. }
  309. void _iqk_backup_mac_bb_8821c(struct dm_struct *dm, u32 *MAC_backup,
  310. u32 *BB_backup, u32 *backup_mac_reg,
  311. u32 *backup_bb_reg, u8 num_backup_bb_reg)
  312. {
  313. u32 i;
  314. for (i = 0; i < MAC_REG_NUM_8821C; i++)
  315. MAC_backup[i] = odm_read_4byte(dm, backup_mac_reg[i]);
  316. for (i = 0; i < num_backup_bb_reg; i++)
  317. BB_backup[i] = odm_read_4byte(dm, backup_bb_reg[i]);
  318. #if 0
  319. /* RF_DBG(dm, DBG_RF_IQK, "[IQK]BackupMacBB Success!!!!\n"); */
  320. #endif
  321. }
  322. void _iqk_backup_rf_8821c(struct dm_struct *dm, u32 RF_backup[][SS_8821C],
  323. u32 *backup_rf_reg)
  324. {
  325. u32 i, j;
  326. for (i = 0; i < RF_REG_NUM_8821C; i++)
  327. for (j = 0; j < SS_8821C; j++)
  328. RF_backup[i][j] = odm_get_rf_reg(dm, (u8)j, backup_rf_reg[i], RFREGOFFSETMASK);
  329. #if 0
  330. /* RF_DBG(dm, DBG_RF_IQK, "[IQK]BackupRF Success!!!!\n"); */
  331. #endif
  332. }
  333. void _iqk_agc_bnd_int_8821c(struct dm_struct *dm)
  334. {
  335. /*initialize RX AGC bnd, it must do after bbreset*/
  336. odm_write_4byte(dm, 0x1b00, 0xf8000008);
  337. odm_write_4byte(dm, 0x1b00, 0xf80a7008);
  338. odm_write_4byte(dm, 0x1b00, 0xf8015008);
  339. odm_write_4byte(dm, 0x1b00, 0xf8000008);
  340. #if 0
  341. /*RF_DBG(dm, DBG_RF_IQK, "[IQK]init. rx agc bnd\n");*/
  342. #endif
  343. }
  344. void _iqk_bb_reset_8821c(struct dm_struct *dm)
  345. {
  346. boolean cca_ing = false;
  347. u32 count = 0;
  348. odm_set_rf_reg(dm, RF_PATH_A, RF_0x0, RFREGOFFSETMASK, 0x10000);
  349. odm_set_bb_reg(dm, R_0x8f8,
  350. BIT(27) | BIT26 | BIT25 | BIT24 | BIT23 | BIT22 | BIT21 | BIT20, 0x0);
  351. while (1) {
  352. odm_write_4byte(dm, 0x8fc, 0x0);
  353. odm_set_bb_reg(dm, R_0x198c, 0x7, 0x7);
  354. cca_ing = (boolean)odm_get_bb_reg(dm, R_0xfa0, BIT(3));
  355. if (count > 30)
  356. cca_ing = false;
  357. if (cca_ing) {
  358. ODM_sleep_ms(1);
  359. count++;
  360. } else {
  361. odm_write_1byte(dm, 0x808, 0x0); /*RX ant off*/
  362. odm_set_bb_reg(dm, R_0xa04, BIT(27) | BIT26 | BIT25 | BIT24, 0x0); /*CCK RX path off*/
  363. /*BBreset*/
  364. odm_set_bb_reg(dm, R_0x0, BIT(16), 0x0);
  365. odm_set_bb_reg(dm, R_0x0, BIT(16), 0x1);
  366. if (odm_get_bb_reg(dm, R_0x660, BIT(16)))
  367. odm_write_4byte(dm, 0x6b4, 0x89000006);
  368. RF_DBG(dm, DBG_RF_IQK, "[IQK]BBreset!!!!\n");
  369. break;
  370. }
  371. }
  372. }
  373. void _iqk_afe_setting_8821c(struct dm_struct *dm, boolean do_iqk)
  374. {
  375. if (do_iqk) {
  376. /*IQK AFE setting RX_WAIT_CCA mode */
  377. odm_write_4byte(dm, 0xc60, 0x50000000);
  378. odm_write_4byte(dm, 0xc60, 0x700F0040);
  379. /*AFE setting*/
  380. odm_write_4byte(dm, 0xc58, 0xd8000402);
  381. odm_write_4byte(dm, 0xc5c, 0xd1000120);
  382. odm_write_4byte(dm, 0xc6c, 0x00000a15);
  383. _iqk_bb_reset_8821c(dm);
  384. #if 0
  385. /* RF_DBG(dm, DBG_RF_IQK, "[IQK]AFE setting for IQK mode!!!!\n"); */
  386. #endif
  387. } else {
  388. /*IQK AFE setting RX_WAIT_CCA mode */
  389. odm_write_4byte(dm, 0xc60, 0x50000000);
  390. odm_write_4byte(dm, 0xc60, 0x700B8040);
  391. /*AFE setting*/
  392. odm_write_4byte(dm, 0xc58, 0xd8020402);
  393. odm_write_4byte(dm, 0xc5c, 0xde000120);
  394. odm_write_4byte(dm, 0xc6c, 0x0000122a);
  395. #if 0
  396. /* RF_DBG(dm, DBG_RF_IQK, "[IQK]AFE setting for Normal mode!!!!\n"); */
  397. #endif
  398. }
  399. /*0x9a4[31]=0: Select da clock*/
  400. odm_set_bb_reg(dm, R_0x9a4, BIT(31), 0x0);
  401. }
  402. void _iqk_restore_mac_bb_8821c(struct dm_struct *dm, u32 *MAC_backup,
  403. u32 *BB_backup, u32 *backup_mac_reg,
  404. u32 *backup_bb_reg, u8 num_backup_bb_reg)
  405. {
  406. u32 i;
  407. for (i = 0; i < MAC_REG_NUM_8821C; i++)
  408. odm_write_4byte(dm, backup_mac_reg[i], MAC_backup[i]);
  409. for (i = 0; i < num_backup_bb_reg; i++)
  410. odm_write_4byte(dm, backup_bb_reg[i], BB_backup[i]);
  411. #if 0
  412. /* RF_DBG(dm, DBG_RF_IQK, "[IQK]RestoreMacBB Success!!!!\n"); */
  413. #endif
  414. }
  415. void _iqk_restore_rf_8821c(struct dm_struct *dm, u32 *backup_rf_reg,
  416. u32 RF_backup[][SS_8821C])
  417. {
  418. u32 i;
  419. odm_set_rf_reg(dm, RF_PATH_A, RF_0xef, RFREGOFFSETMASK, 0x0);
  420. odm_set_rf_reg(dm, RF_PATH_A, RF_0xee, RFREGOFFSETMASK, 0x0);
  421. odm_set_rf_reg(dm, RF_PATH_A, RF_0xdf, RFREGOFFSETMASK, RF_backup[0][RF_PATH_A] & (~BIT(4)));
  422. #if 0
  423. /*odm_set_rf_reg(dm, RF_PATH_A, RF_0xde, RFREGOFFSETMASK, RF_backup[1][RF_PATH_A]|BIT(4));*/
  424. #endif
  425. odm_set_rf_reg(dm, RF_PATH_A, RF_0xde, RFREGOFFSETMASK, RF_backup[1][RF_PATH_A] & (~BIT(4)));
  426. for (i = 2; i < (RF_REG_NUM_8821C - 1); i++)
  427. odm_set_rf_reg(dm, RF_PATH_A, backup_rf_reg[i], RFREGOFFSETMASK, RF_backup[i][RF_PATH_A]);
  428. odm_set_rf_reg(dm, RF_PATH_A, RF_0x1, RFREGOFFSETMASK, (RF_backup[4][RF_PATH_A] & (~BIT(0))));
  429. #if 0
  430. /*RF_DBG(dm, DBG_RF_IQK, "[IQK]RestoreRF Success!!!!\n"); */
  431. #endif
  432. }
  433. void _iqk_backup_iqk_8821c(struct dm_struct *dm, u8 step, u8 path)
  434. {
  435. struct dm_iqk_info *iqk_info = &dm->IQK_info;
  436. u8 i, j, k;
  437. #if 0
  438. /*u16 iqk_apply[2] = {0xc94, 0xe94};*/
  439. #endif
  440. switch (step) {
  441. case 0:
  442. iqk_info->iqk_channel[1] = iqk_info->iqk_channel[0];
  443. for (i = 0; i < SS_8821C; i++) {
  444. iqk_info->lok_idac[1][i] = iqk_info->lok_idac[0][i];
  445. iqk_info->rxiqk_agc[1][i] = iqk_info->rxiqk_agc[0][i];
  446. iqk_info->bypass_iqk[1][i] = iqk_info->bypass_iqk[0][i];
  447. iqk_info->rxiqk_fail_code[1][i] = iqk_info->rxiqk_fail_code[0][i];
  448. for (j = 0; j < 2; j++) {
  449. iqk_info->iqk_fail_report[1][i][j] = iqk_info->iqk_fail_report[0][i][j];
  450. for (k = 0; k < 8; k++) {
  451. iqk_info->iqk_cfir_real[1][i][j][k] = iqk_info->iqk_cfir_real[0][i][j][k];
  452. iqk_info->iqk_cfir_imag[1][i][j][k] = iqk_info->iqk_cfir_imag[0][i][j][k];
  453. }
  454. }
  455. }
  456. for (i = 0; i < 4; i++) {
  457. iqk_info->rxiqk_fail_code[0][i] = 0x0;
  458. iqk_info->rxiqk_agc[0][i] = 0x0;
  459. for (j = 0; j < 2; j++) {
  460. iqk_info->iqk_fail_report[0][i][j] = true;
  461. iqk_info->gs_retry_count[0][i][j] = 0x0;
  462. }
  463. for (j = 0; j < 3; j++)
  464. iqk_info->retry_count[0][i][j] = 0x0;
  465. }
  466. /*backup channel*/
  467. iqk_info->iqk_channel[0] = iqk_info->rf_reg18;
  468. break;
  469. case 1: /*LOK backup*/
  470. iqk_info->lok_idac[0][path] = odm_get_rf_reg(dm, (enum rf_path)path, RF_0x58, RFREGOFFSETMASK);
  471. break;
  472. case 2: /*TXIQK backup*/
  473. case 3: /*RXIQK backup*/
  474. phydm_get_iqk_cfir(dm, (step - 2), path, false);
  475. break;
  476. }
  477. }
  478. void _iqk_reload_iqk_setting_8821c(struct dm_struct *dm, u8 channel,
  479. u8 reload_idx
  480. /*1: reload TX, 2: reload TX, RX*/)
  481. {
  482. struct dm_iqk_info *iqk_info = &dm->IQK_info;
  483. u8 i, path, idx;
  484. u16 iqk_apply[2] = {0xc94, 0xe94};
  485. for (path = 0; path < SS_8821C; path++) {
  486. #if 0
  487. if (reload_idx == 2) {
  488. odm_set_rf_reg(dm, (enum rf_path)path, RF_0xdf, BIT(4), 0x1);
  489. odm_set_rf_reg(dm, (enum rf_path)path, RF_0x58, RFREGOFFSETMASK, iqk_info->lok_idac[channel][path]);
  490. }
  491. #endif
  492. for (idx = 0; idx < reload_idx; idx++) {
  493. odm_set_bb_reg(dm, R_0x1b00, MASKDWORD, 0xf8000008 | path << 1);
  494. odm_set_bb_reg(dm, R_0x1b2c, MASKDWORD, 0x7);
  495. odm_set_bb_reg(dm, R_0x1b38, MASKDWORD, 0x20000000);
  496. odm_set_bb_reg(dm, R_0x1b3c, MASKDWORD, 0x20000000);
  497. odm_set_bb_reg(dm, R_0x1bcc, MASKDWORD, 0x00000000);
  498. if (idx == 0)
  499. odm_set_bb_reg(dm, R_0x1b0c, BIT(13) | BIT(12), 0x3);
  500. else
  501. odm_set_bb_reg(dm, R_0x1b0c, BIT(13) | BIT(12), 0x1);
  502. odm_set_bb_reg(dm, R_0x1bd4, BIT(20) | BIT(19) | BIT(18) | BIT(17) | BIT(16), 0x10);
  503. for (i = 0; i < 8; i++) {
  504. odm_write_4byte(dm, 0x1bd8, ((0xc0000000 >> idx) + 0x3) + (i * 4) + (iqk_info->iqk_cfir_real[channel][path][idx][i] << 9));
  505. odm_write_4byte(dm, 0x1bd8, ((0xc0000000 >> idx) + 0x1) + (i * 4) + (iqk_info->iqk_cfir_imag[channel][path][idx][i] << 9));
  506. }
  507. if (idx == 0)
  508. odm_set_bb_reg(dm, iqk_apply[path], BIT(0), ~(u32)(iqk_info->iqk_fail_report[channel][path][idx]));
  509. else
  510. odm_set_bb_reg(dm, iqk_apply[path], BIT(10), ~(u32)(iqk_info->iqk_fail_report[channel][path][idx]));
  511. }
  512. odm_set_bb_reg(dm, R_0x1bd8, MASKDWORD, 0x0);
  513. odm_set_bb_reg(dm, R_0x1b0c, BIT(13) | BIT(12), 0x0);
  514. }
  515. }
  516. boolean
  517. _iqk_reload_iqk_8821c(struct dm_struct *dm, boolean reset)
  518. {
  519. struct dm_iqk_info *iqk_info = &dm->IQK_info;
  520. u8 i;
  521. iqk_info->is_reload = false;
  522. odm_set_bb_reg(dm, R_0x1bf0, BIT(16), 0x0); /*clear the reload flag*/
  523. if (reset) {
  524. for (i = 0; i < SS_8821C; i++)
  525. iqk_info->iqk_channel[i] = 0x0;
  526. } else {
  527. iqk_info->rf_reg18 = odm_get_rf_reg(dm, RF_PATH_A, RF_0x18, RFREGOFFSETMASK);
  528. for (i = 0; i < SS_8821C; i++) {
  529. if (iqk_info->rf_reg18 == iqk_info->iqk_channel[i]) {
  530. _iqk_reload_iqk_setting_8821c(dm, i, 2);
  531. _iqk_fill_iqk_report_8821c(dm, i);
  532. RF_DBG(dm, DBG_RF_IQK,
  533. "[IQK]reload IQK result before!!!!\n");
  534. odm_set_bb_reg(dm, R_0x1bf0, BIT(16), 0x1);
  535. iqk_info->is_reload = true;
  536. }
  537. }
  538. }
  539. return iqk_info->is_reload;
  540. }
  541. void _iqk_rfe_setting_8821c(struct dm_struct *dm, boolean ext_pa_on)
  542. {
  543. if (ext_pa_on) {
  544. /*RFE setting*/
  545. odm_write_4byte(dm, 0xcb0, 0x77777777);
  546. odm_write_4byte(dm, 0xcb4, 0x00007777);
  547. odm_write_4byte(dm, 0xcbc, 0x0000083B);
  548. #if 0
  549. /*odm_write_4byte(dm, 0x1990, 0x00000c30);*/
  550. #endif
  551. RF_DBG(dm, DBG_RF_IQK, "[IQK]external PA on!!!!\n");
  552. } else {
  553. /*RFE setting*/
  554. odm_write_4byte(dm, 0xcb0, 0x77171117);
  555. odm_write_4byte(dm, 0xcb4, 0x00001177);
  556. odm_write_4byte(dm, 0xcbc, 0x00000404);
  557. #if 0
  558. /*odm_write_4byte(dm, 0x1990, 0x00000c30);*/
  559. #endif
  560. RF_DBG(dm, DBG_RF_IQK, "[IQK]external PA off!!!!\n");
  561. }
  562. }
  563. void _iqk_rfsetting_8821c(struct dm_struct *dm)
  564. {
  565. struct dm_iqk_info *iqk_info = &dm->IQK_info;
  566. u8 path;
  567. u32 tmp;
  568. odm_write_4byte(dm, 0x1b00, 0xf8000008);
  569. odm_write_4byte(dm, 0x1bb8, 0x00000000);
  570. for (path = 0; path < SS_8821C; path++) {
  571. /*0xdf:B11 = 1,B4 = 0, B1 = 1*/
  572. tmp = odm_get_rf_reg(dm, (enum rf_path)path, RF_0xdf, RFREGOFFSETMASK);
  573. tmp = (tmp & (~BIT(4))) | BIT(1) | BIT(11);
  574. odm_set_rf_reg(dm, (enum rf_path)path, RF_0xdf, RFREGOFFSETMASK, tmp);
  575. if (iqk_info->is_btg) {
  576. tmp = odm_get_rf_reg(dm, RF_PATH_A, RF_0xde, RFREGOFFSETMASK);
  577. tmp = (tmp & (~BIT(4))) | BIT(15);
  578. #if 0
  579. /*tmp = tmp|BIT(4)|BIT(15); //manual LOK value for A-cut*/
  580. #endif
  581. odm_set_rf_reg(dm, RF_PATH_A, RF_0xde, RFREGOFFSETMASK, tmp);
  582. }
  583. if (!iqk_info->is_btg) {
  584. /*WLAN_AG*/
  585. /*TX IQK mode init*/
  586. odm_set_rf_reg(dm, (enum rf_path)path, RF_0xef, RFREGOFFSETMASK, 0x80000);
  587. odm_set_rf_reg(dm, (enum rf_path)path, RF_0x33, RFREGOFFSETMASK, 0x00024);
  588. odm_set_rf_reg(dm, (enum rf_path)path, RF_0x3e, RFREGOFFSETMASK, 0x0003f);
  589. #if 0
  590. /*odm_set_rf_reg(dm, (enum rf_path)path, RF_0x3f, RFREGOFFSETMASK, 0x60fde);*/
  591. #endif
  592. odm_set_rf_reg(dm, (enum rf_path)path, RF_0x3f, RFREGOFFSETMASK, 0xe0fde);
  593. odm_set_rf_reg(dm, (enum rf_path)path, RF_0xef, RFREGOFFSETMASK, 0x00000);
  594. if (*dm->band_type == ODM_BAND_5G) {
  595. odm_set_rf_reg(dm, (enum rf_path)path, RF_0xef, BIT(19), 0x1);
  596. odm_set_rf_reg(dm, (enum rf_path)path, RF_0x33, RFREGOFFSETMASK, 0x00026);
  597. odm_set_rf_reg(dm, (enum rf_path)path, RF_0x3e, RFREGOFFSETMASK, 0x00037);
  598. odm_set_rf_reg(dm, (enum rf_path)path, RF_0x3f, RFREGOFFSETMASK, 0xdefce);
  599. odm_set_rf_reg(dm, (enum rf_path)path, RF_0xef, BIT(19), 0x0);
  600. } else {
  601. odm_set_rf_reg(dm, (enum rf_path)path, RF_0xef, BIT(19), 0x1);
  602. odm_set_rf_reg(dm, (enum rf_path)path, RF_0x33, RFREGOFFSETMASK, 0x00026);
  603. odm_set_rf_reg(dm, (enum rf_path)path, RF_0x3e, RFREGOFFSETMASK, 0x00037);
  604. odm_set_rf_reg(dm, (enum rf_path)path, RF_0x3f, RFREGOFFSETMASK, 0x5efce);
  605. odm_set_rf_reg(dm, (enum rf_path)path, RF_0xef, BIT(19), 0x0);
  606. }
  607. } else {
  608. /*WLAN_BTG*/
  609. /*TX IQK mode init*/
  610. odm_set_rf_reg(dm, (enum rf_path)path, RF_0xee, RFREGOFFSETMASK, 0x01000);
  611. odm_set_rf_reg(dm, (enum rf_path)path, RF_0x33, RFREGOFFSETMASK, 0x00004);
  612. odm_set_rf_reg(dm, (enum rf_path)path, RF_0x3f, RFREGOFFSETMASK, 0x01ec1);
  613. odm_set_rf_reg(dm, (enum rf_path)path, RF_0xee, RFREGOFFSETMASK, 0x00000);
  614. }
  615. }
  616. }
  617. void _iqk_configure_macbb_8821c(struct dm_struct *dm)
  618. {
  619. /*MACBB register setting*/
  620. odm_write_1byte(dm, 0x522, 0x7f);
  621. odm_set_bb_reg(dm, R_0x1518, BIT(16), 0x1);
  622. odm_set_bb_reg(dm, R_0x550, BIT(11) | BIT(3), 0x0);
  623. odm_set_bb_reg(dm, R_0x90c, BIT(15), 0x1); /*0x90c[15]=1: dac_buf reset selection*/
  624. /*0xc94[0]=1, 0xe94[0]=1: Let tx from IQK*/
  625. odm_set_bb_reg(dm, R_0xc94, BIT(0), 0x1);
  626. odm_set_bb_reg(dm, R_0xc94, (BIT(11) | BIT(10)), 0x1);
  627. /* 3-wire off*/
  628. odm_write_4byte(dm, 0xc00, 0x00000004);
  629. /*disable PMAC*/
  630. odm_set_bb_reg(dm, R_0xb00, BIT(8), 0x0);
  631. #if 0
  632. /* RF_DBG(dm, DBG_RF_IQK, "[IQK]Set MACBB setting for IQK!!!!\n");*/
  633. #endif
  634. /*disable CCK block*/
  635. odm_set_bb_reg(dm, R_0x808, BIT(28), 0x0);
  636. /*disable OFDM CCA*/
  637. odm_set_bb_reg(dm, R_0x838, BIT(3) | BIT(2) | BIT(1), 0x7);
  638. }
  639. void _iqk_lok_setting_8821c(struct dm_struct *dm, u8 path, u8 pad_index)
  640. {
  641. u32 LOK0x56_2G = 0x50ef3;
  642. u32 LOK0x56_5G = 0x50ee8;
  643. u32 LOK0x33 = 0;
  644. u32 LOK0x78 = 0xbcbba;
  645. u32 tmp = 0;
  646. struct dm_iqk_info *iqk_info = &dm->IQK_info;
  647. LOK0x33 = pad_index;
  648. /*add delay of MAC send packet*/
  649. if (*dm->mp_mode)
  650. odm_set_bb_reg(dm, R_0x810, BIT(7) | BIT(6) | BIT(5) | BIT(4), 0x8);
  651. if (iqk_info->is_btg) {
  652. tmp = (LOK0x78 & 0x1c000) >> 14;
  653. odm_write_4byte(dm, 0x1b00, 0xf8000008 | path << 1);
  654. odm_write_4byte(dm, 0x1bcc, 0x1b);
  655. odm_write_1byte(dm, 0x1b23, 0x00);
  656. odm_write_1byte(dm, 0x1b2b, 0x80);
  657. /*0x78[11:0] = IDAC value*/
  658. LOK0x78 = LOK0x78 & (0xe3fff | ((u32)pad_index << 14));
  659. odm_set_rf_reg(dm, path, RF_0x78, RFREGOFFSETMASK, LOK0x78);
  660. odm_set_rf_reg(dm, path, RF_0x5c, RFREGOFFSETMASK, 0x05320);
  661. odm_set_rf_reg(dm, path, RF_0x8f, RFREGOFFSETMASK, 0xac018);
  662. odm_set_rf_reg(dm, RF_PATH_A, RF_0xee, BIT(4), 0x1);
  663. odm_set_rf_reg(dm, RF_PATH_A, RF_0x33, BIT(3), 0x0);
  664. RF_DBG(dm, DBG_RF_IQK, "[IQK] In the BTG\n");
  665. } else {
  666. /*tmp = (LOK0x56 & 0xe0) >> 5;*/
  667. odm_write_4byte(dm, 0x1b00, 0xf8000008 | path << 1);
  668. odm_write_4byte(dm, 0x1bcc, 0x9);
  669. odm_write_1byte(dm, 0x1b23, 0x00);
  670. switch (*dm->band_type) {
  671. case ODM_BAND_2_4G:
  672. odm_write_1byte(dm, 0x1b2b, 0x00);
  673. LOK0x56_2G = LOK0x56_2G & (0xfff1f | ((u32)pad_index << 5));
  674. odm_set_rf_reg(dm, path, RF_0x56, RFREGOFFSETMASK, LOK0x56_2G);
  675. odm_set_rf_reg(dm, path, RF_0x8f, RFREGOFFSETMASK, 0xadc18);
  676. odm_set_rf_reg(dm, RF_PATH_A, RF_0xef, BIT(4), 0x1);
  677. odm_set_rf_reg(dm, RF_PATH_A, RF_0x33, BIT(3), 0x0);
  678. break;
  679. case ODM_BAND_5G:
  680. odm_write_1byte(dm, 0x1b2b, 0x00);
  681. LOK0x56_5G = LOK0x56_5G & (0xfff1f | ((u32)pad_index << 5));
  682. odm_set_rf_reg(dm, path, RF_0x56, RFREGOFFSETMASK, LOK0x56_5G);
  683. odm_set_rf_reg(dm, path, RF_0x8f, RFREGOFFSETMASK, 0xadc18);
  684. odm_set_rf_reg(dm, RF_PATH_A, RF_0xef, BIT(4), 0x1);
  685. odm_set_rf_reg(dm, RF_PATH_A, RF_0x33, BIT(3), 0x1);
  686. break;
  687. }
  688. }
  689. /*for IDAC LUT by PAD idx*/
  690. odm_set_rf_reg(dm, path, RF_0x33, BIT(2) | BIT(1) | BIT(0), LOK0x33);
  691. #if 0
  692. /* RF_DBG(dm, DBG_RF_IQK, "[IQK]Set LOK setting!!!!\n");*/
  693. #endif
  694. }
  695. void _iqk_txk_setting_8821c(struct dm_struct *dm, u8 path)
  696. {
  697. struct dm_iqk_info *iqk_info = &dm->IQK_info;
  698. if (iqk_info->is_btg) {
  699. odm_write_4byte(dm, 0x1b00, 0xf8000008 | path << 1);
  700. odm_write_4byte(dm, 0x1bcc, 0x1b);
  701. odm_write_4byte(dm, 0x1b20, 0x00840008);
  702. /*0x78[11:0] = IDAC value*/
  703. odm_set_rf_reg(dm, path, RF_0x78, RFREGOFFSETMASK, 0xbcbba);
  704. odm_set_rf_reg(dm, path, RF_0x5c, RFREGOFFSETMASK, 0x04320);
  705. odm_set_rf_reg(dm, path, RF_0x8f, RFREGOFFSETMASK, 0xac018);
  706. odm_write_1byte(dm, 0x1b2b, 0x80);
  707. } else {
  708. odm_write_4byte(dm, 0x1b00, 0xf8000008 | path << 1);
  709. odm_write_4byte(dm, 0x1bcc, 0x9);
  710. odm_write_4byte(dm, 0x1b20, 0x01440008);
  711. switch (*dm->band_type) {
  712. case ODM_BAND_2_4G:
  713. odm_set_rf_reg(dm, path, RF_0x56, RFREGOFFSETMASK, 0x50EF3);
  714. odm_set_rf_reg(dm, path, RF_0x8f, RFREGOFFSETMASK, 0xadc18);
  715. odm_write_1byte(dm, 0x1b2b, 0x00);
  716. break;
  717. case ODM_BAND_5G:
  718. #if 0
  719. /*odm_set_rf_reg(dm, path, RF_0x56, RFREGOFFSETMASK, 0x50EF0);*/
  720. /*odm_set_rf_reg(dm, path, RF_0x56, RFREGOFFSETMASK, 0x50Ec8);*/
  721. #endif
  722. odm_set_rf_reg(dm, path, RF_0x56, RFREGOFFSETMASK, 0x5004e);
  723. odm_set_rf_reg(dm, path, RF_0x8f, RFREGOFFSETMASK, 0xa9c18);
  724. odm_write_1byte(dm, 0x1b2b, 0x00);
  725. break;
  726. }
  727. }
  728. #if 0
  729. /* RF_DBG(dm, DBG_RF_IQK, "[IQK]Set TXK setting!!!!\n");*/
  730. #endif
  731. }
  732. void _iqk_rxk1setting_8821c(struct dm_struct *dm, u8 path)
  733. {
  734. struct dm_iqk_info *iqk_info = &dm->IQK_info;
  735. if (iqk_info->is_btg) {
  736. odm_write_4byte(dm, 0x1b00, 0xf8000008 | path << 1);
  737. odm_write_1byte(dm, 0x1b2b, 0x80);
  738. odm_write_4byte(dm, 0x1bcc, 0x09);
  739. odm_write_4byte(dm, 0x1b20, 0x01450008);
  740. odm_write_4byte(dm, 0x1b24, 0x01460c88);
  741. /*0x78[11:0] = IDAC value*/
  742. odm_set_rf_reg(dm, path, RF_0x78, RFREGOFFSETMASK, 0x8cbba);
  743. odm_set_rf_reg(dm, path, RF_0x5c, RFREGOFFSETMASK, 0x00320);
  744. odm_set_rf_reg(dm, path, RF_0x8f, RFREGOFFSETMASK, 0xa8018);
  745. } else {
  746. odm_write_4byte(dm, 0x1b00, 0xf8000008 | path << 1);
  747. switch (*dm->band_type) {
  748. case ODM_BAND_2_4G:
  749. odm_write_1byte(dm, 0x1bcc, 0x12);
  750. odm_write_1byte(dm, 0x1b2b, 0x00);
  751. odm_write_4byte(dm, 0x1b20, 0x01450008);
  752. odm_write_4byte(dm, 0x1b24, 0x01461068);
  753. odm_set_rf_reg(dm, path, RF_0x56, RFREGOFFSETMASK, 0x510f3);
  754. odm_set_rf_reg(dm, path, RF_0x8f, RFREGOFFSETMASK, 0xa9c00);
  755. break;
  756. case ODM_BAND_5G:
  757. odm_write_1byte(dm, 0x1bcc, 0x9);
  758. odm_write_1byte(dm, 0x1b2b, 0x00);
  759. odm_write_4byte(dm, 0x1b20, 0x00450008);
  760. odm_write_4byte(dm, 0x1b24, 0x00461468);
  761. odm_set_rf_reg(dm, path, RF_0x56, RFREGOFFSETMASK, 0x510f3);
  762. odm_set_rf_reg(dm, path, RF_0x8f, RFREGOFFSETMASK, 0xa9c00);
  763. break;
  764. }
  765. }
  766. #if 0
  767. /*RF_DBG(dm, DBG_RF_IQK, "[IQK]Set RXK setting!!!!\n");*/
  768. #endif
  769. }
  770. static u8 btg_lna[5] = {0x0, 0x4, 0x8, 0xc, 0xf};
  771. static u8 wlg_lna[5] = {0x0, 0x1, 0x2, 0x3, 0x5};
  772. static u8 wla_lna[5] = {0x0, 0x1, 0x3, 0x4, 0x5};
  773. void _iqk_rxk2setting_8821c(struct dm_struct *dm, u8 path, boolean is_gs)
  774. {
  775. struct dm_iqk_info *iqk_info = &dm->IQK_info;
  776. if (iqk_info->is_btg) {
  777. if (is_gs) {
  778. iqk_info->tmp1bcc = 0x1b;
  779. iqk_info->lna_idx = 2;
  780. }
  781. odm_write_4byte(dm, 0x1b00, 0xf8000008 | path << 1);
  782. odm_write_1byte(dm, 0x1b2b, 0x80);
  783. odm_write_4byte(dm, 0x1bcc, iqk_info->tmp1bcc);
  784. odm_write_4byte(dm, 0x1b20, 0x01450008);
  785. odm_write_4byte(dm, 0x1b24, (0x01460048 | (btg_lna[iqk_info->lna_idx] << 10)));
  786. /*0x78[11:0] = IDAC value*/
  787. odm_set_rf_reg(dm, path, RF_0x78, RFREGOFFSETMASK, 0x8cbba);
  788. odm_set_rf_reg(dm, path, RF_0x5c, RFREGOFFSETMASK, 0x00320);
  789. odm_set_rf_reg(dm, path, RF_0x8f, RFREGOFFSETMASK, 0xa8018);
  790. } else {
  791. odm_write_4byte(dm, 0x1b00, 0xf8000008 | path << 1);
  792. switch (*dm->band_type) {
  793. case ODM_BAND_2_4G:
  794. if (is_gs) {
  795. iqk_info->tmp1bcc = 0x12;
  796. iqk_info->lna_idx = 2;
  797. }
  798. odm_write_1byte(dm, 0x1bcc, iqk_info->tmp1bcc);
  799. odm_write_1byte(dm, 0x1b2b, 0x00);
  800. odm_write_4byte(dm, 0x1b20, 0x01450008);
  801. odm_write_4byte(dm, 0x1b24, (0x01460048 | (wlg_lna[iqk_info->lna_idx] << 10)));
  802. odm_set_rf_reg(dm, path, RF_0x56, RFREGOFFSETMASK, 0x510f3);
  803. odm_set_rf_reg(dm, path, RF_0x8f, RFREGOFFSETMASK, 0xa9c00);
  804. break;
  805. case ODM_BAND_5G:
  806. if (is_gs) {
  807. /*iqk_info->tmp1bcc = 0x12;*/
  808. iqk_info->tmp1bcc = 0x09;
  809. iqk_info->lna_idx = 2;
  810. }
  811. odm_write_1byte(dm, 0x1bcc, iqk_info->tmp1bcc);
  812. odm_write_1byte(dm, 0x1b2b, 0x00);
  813. odm_write_4byte(dm, 0x1b20, 0x00450008);
  814. odm_write_4byte(dm, 0x1b24, (0x01460048 | (wla_lna[iqk_info->lna_idx] << 10)));
  815. #if 0
  816. /*odm_set_rf_reg(dm, path, RF_0x56, RFREGOFFSETMASK, 0x51000);*/
  817. #endif
  818. odm_set_rf_reg(dm, path, RF_0x56, RFREGOFFSETMASK, 0x51060);
  819. odm_set_rf_reg(dm, path, RF_0x8f, RFREGOFFSETMASK, 0xa9c00);
  820. break;
  821. }
  822. }
  823. #if 0
  824. /* RF_DBG(dm, DBG_RF_IQK, "[IQK]Set RXK setting!!!!\n");*/
  825. #endif
  826. }
  827. boolean
  828. _iqk_check_cal_8821c(struct dm_struct *dm, u32 IQK_CMD)
  829. {
  830. boolean notready = true, fail = true;
  831. u32 delay_count = 0x0;
  832. while (notready) {
  833. if (odm_read_4byte(dm, 0x1b00) == (IQK_CMD & 0xffffff0f)) {
  834. fail = (boolean)odm_get_bb_reg(dm, R_0x1b08, BIT(26));
  835. notready = false;
  836. } else {
  837. #if 0
  838. /*ODM_sleep_ms(1);*/
  839. #endif
  840. ODM_delay_ms(1);
  841. delay_count++;
  842. }
  843. if (delay_count >= 50) {
  844. fail = true;
  845. RF_DBG(dm, DBG_RF_IQK, "[IQK]IQK timeout!!!\n");
  846. break;
  847. }
  848. }
  849. #if 0
  850. /*
  851. RF_DBG(dm, DBG_RF_IQK,
  852. "[IQK]delay count = 0x%x!!!\n", delay_count);
  853. */
  854. #endif
  855. return fail;
  856. }
  857. boolean
  858. _iqk_rx_iqk_gain_search_fail_8821c(struct dm_struct *dm, u8 path, u8 step)
  859. {
  860. struct dm_iqk_info *iqk_info = &dm->IQK_info;
  861. boolean fail = true;
  862. u32 IQK_CMD = 0x0, rf_reg0, tmp, rxbb;
  863. u8 IQMUX[4] = {0x9, 0x12, 0x1b, 0x24}, *plna;
  864. u8 idx;
  865. /*u8 lna_setting[5];*/
  866. if (iqk_info->is_btg)
  867. plna = btg_lna;
  868. else if (*dm->band_type == ODM_BAND_2_4G)
  869. plna = wlg_lna;
  870. else
  871. plna = wla_lna;
  872. for (idx = 0; idx < 4; idx++)
  873. if (iqk_info->tmp1bcc == IQMUX[idx])
  874. break;
  875. odm_write_4byte(dm, 0x1b00, 0xf8000008 | path << 1);
  876. odm_write_4byte(dm, 0x1bcc, iqk_info->tmp1bcc);
  877. if (step == RXIQK1)
  878. RF_DBG(dm, DBG_RF_IQK,
  879. "[IQK]============ S%d RXIQK GainSearch ============\n",
  880. iqk_info->is_btg);
  881. if (step == RXIQK1)
  882. IQK_CMD = 0xf8000208 | (1 << (path + 4));
  883. else
  884. IQK_CMD = 0xf8000308 | (1 << (path + 4));
  885. RF_DBG(dm, DBG_RF_IQK, "[IQK]S%d GS%d_Trigger = 0x%x\n", path, step,
  886. IQK_CMD);
  887. _iqk_set_gnt_wl_gnt_bt(dm, true);
  888. odm_write_4byte(dm, 0x1b00, IQK_CMD);
  889. odm_write_4byte(dm, 0x1b00, IQK_CMD + 0x1);
  890. #if 0
  891. /*ODM_sleep_ms(GS_delay_8821C);*/
  892. #endif
  893. ODM_delay_ms(GS_delay_8821C);
  894. fail = _iqk_check_cal_8821c(dm, IQK_CMD);
  895. RF_DBG(dm, DBG_RF_IQK, "[IQK]check 0x49c = %x\n",
  896. odm_read_1byte(dm, 0x49c));
  897. _iqk_set_gnt_wl_gnt_bt(dm, false);
  898. if (step == RXIQK2) {
  899. rf_reg0 = odm_get_rf_reg(dm, (enum rf_path)path, RF_0x0, RFREGOFFSETMASK);
  900. odm_write_4byte(dm, 0x1b00, 0xf8000008 | path << 1);
  901. RF_DBG(dm, DBG_RF_IQK,
  902. "[IQK]S%d ==> RF0x0 = 0x%x, tmp1bcc = 0x%x, idx = %d, 0x1b3c = 0x%x\n",
  903. path, rf_reg0, iqk_info->tmp1bcc, idx,
  904. odm_read_4byte(dm, 0x1b3c));
  905. tmp = (rf_reg0 & 0x1fe0) >> 5;
  906. rxbb = tmp & 0x1f;
  907. #if 1
  908. if (rxbb == 0x1) {
  909. if (idx != 3)
  910. idx++;
  911. else if (iqk_info->lna_idx != 0x0)
  912. iqk_info->lna_idx--;
  913. else
  914. iqk_info->isbnd = true;
  915. fail = true;
  916. } else if (rxbb == 0xa) {
  917. if (idx != 0)
  918. idx--;
  919. else if (iqk_info->lna_idx != 0x4)
  920. iqk_info->lna_idx++;
  921. else
  922. iqk_info->isbnd = true;
  923. fail = true;
  924. } else {
  925. fail = false;
  926. }
  927. if (iqk_info->isbnd)
  928. fail = false;
  929. #endif
  930. #if 0
  931. if (rxbb == 0x1) {
  932. if (iqk_info->lna_idx != 0x0)
  933. iqk_info->lna_idx--;
  934. else if (idx != 3)
  935. idx++;
  936. else
  937. iqk_info->isbnd = true;
  938. fail = true;
  939. } else if (rxbb == 0xa) {
  940. if (idx != 0)
  941. idx--;
  942. else if (iqk_info->lna_idx != 0x7)
  943. iqk_info->lna_idx++;
  944. else
  945. iqk_info->isbnd = true;
  946. fail = true;
  947. } else
  948. fail = false;
  949. if (iqk_info->isbnd == true)
  950. fail = false;
  951. #endif
  952. iqk_info->tmp1bcc = IQMUX[idx];
  953. if (fail) {
  954. odm_write_4byte(dm, 0x1b00, 0xf8000008 | path << 1);
  955. odm_write_4byte(dm, 0x1b24, (odm_read_4byte(dm, 0x1b24) & 0xffffc3ff) | (*(plna + iqk_info->lna_idx) << 10));
  956. }
  957. }
  958. return fail;
  959. }
  960. void _iqk_rxk2setting_by_toneindex_8821c(struct dm_struct *dm, u8 path,
  961. boolean is_gs, u8 toneindex)
  962. {
  963. struct dm_iqk_info *iqk_info = &dm->IQK_info;
  964. if (iqk_info->is_btg) {
  965. iqk_info->tmp1bcc = 0x1b;
  966. iqk_info->lna_idx = 2;
  967. odm_write_4byte(dm, 0x1b00, 0xf8000008 | path << 1);
  968. odm_write_1byte(dm, 0x1b2b, 0x80);
  969. odm_write_4byte(dm, 0x1bcc, iqk_info->tmp1bcc);
  970. odm_write_4byte(dm, 0x1b20, 0x01450008);
  971. odm_write_4byte(dm, 0x1b24, (0x01460048 | (btg_lna[iqk_info->lna_idx] << 10)));
  972. /*0x78[11:0] = IDAC value*/
  973. odm_set_rf_reg(dm, path, RF_0x78, RFREGOFFSETMASK, 0x8cbba);
  974. odm_set_rf_reg(dm, path, RF_0x5c, RFREGOFFSETMASK, 0x00320);
  975. odm_set_rf_reg(dm, path, RF_0x8f, RFREGOFFSETMASK, 0xa8018);
  976. } else {
  977. odm_write_4byte(dm, 0x1b00, 0xf8000008 | path << 1);
  978. switch (*dm->band_type) {
  979. case ODM_BAND_2_4G:
  980. iqk_info->tmp1bcc = 0x12;
  981. iqk_info->lna_idx = 2;
  982. odm_write_1byte(dm, 0x1bcc, iqk_info->tmp1bcc);
  983. odm_write_1byte(dm, 0x1b2b, 0x00);
  984. odm_write_4byte(dm, 0x1b20, 0x01450008);
  985. odm_write_4byte(dm, 0x1b24, (0x01460048 | (wlg_lna[iqk_info->lna_idx] << 10)));
  986. odm_set_rf_reg(dm, path, RF_0x56, RFREGOFFSETMASK, 0x510f3);
  987. odm_set_rf_reg(dm, path, RF_0x8f, RFREGOFFSETMASK, 0xa9c00);
  988. break;
  989. case ODM_BAND_5G:
  990. iqk_info->tmp1bcc = 0x09;
  991. iqk_info->lna_idx = 2;
  992. odm_write_1byte(dm, 0x1bcc, iqk_info->tmp1bcc);
  993. odm_write_1byte(dm, 0x1b2b, 0x00);
  994. odm_write_4byte(dm, 0x1b20, 0x00450008);
  995. odm_write_4byte(dm, 0x1b24, (0x01460048 | (wla_lna[iqk_info->lna_idx] << 10)));
  996. #if 0
  997. /*odm_set_rf_reg(dm, path, RF_0x56, RFREGOFFSETMASK, 0x51000);*/
  998. #endif
  999. odm_set_rf_reg(dm, path, RF_0x56, RFREGOFFSETMASK, 0x51060);
  1000. odm_set_rf_reg(dm, path, RF_0x8f, RFREGOFFSETMASK, 0xa9c00);
  1001. break;
  1002. }
  1003. }
  1004. odm_write_4byte(dm, 0x1b20, (odm_read_4byte(dm, 0x1b20) & 0x000fffff) | toneindex << 20);
  1005. odm_write_4byte(dm, 0x1b24, (odm_read_4byte(dm, 0x1b24) & 0x000fffff) | toneindex << 20);
  1006. }
  1007. boolean
  1008. _iqk_rx_iqk_gain_search_fail_by_toneindex_8821c(struct dm_struct *dm, u8 path,
  1009. u8 step, u8 tone_index)
  1010. {
  1011. boolean fail = true;
  1012. u32 IQK_CMD;
  1013. #if 0
  1014. /*u8 lna_setting[5];*/
  1015. #endif
  1016. _iqk_rxk2setting_by_toneindex_8821c(dm, path, RXIQK1, tone_index);
  1017. odm_write_4byte(dm, 0x1b00, 0xf8000008 | path << 1);
  1018. IQK_CMD = 0xf8000208 | (1 << (path + 4));
  1019. _iqk_set_gnt_wl_gnt_bt(dm, true);
  1020. odm_write_4byte(dm, 0x1b00, IQK_CMD);
  1021. odm_write_4byte(dm, 0x1b00, IQK_CMD + 0x1);
  1022. #if 0
  1023. /*ODM_sleep_ms(GS_delay_8821C);*/
  1024. #endif
  1025. ODM_delay_ms(GS_delay_8821C);
  1026. fail = _iqk_check_cal_8821c(dm, IQK_CMD);
  1027. _iqk_set_gnt_wl_gnt_bt(dm, false);
  1028. return fail;
  1029. }
  1030. boolean
  1031. _lok_one_shot_8821c(void *dm_void, u8 path, u8 pad_index)
  1032. {
  1033. struct dm_struct *dm = (struct dm_struct *)dm_void;
  1034. struct dm_iqk_info *iqk_info = &dm->IQK_info;
  1035. u8 delay_count = 0;
  1036. boolean LOK_notready = false;
  1037. u32 LOK_temp2 = 0, LOK_temp3 = 0;
  1038. u32 IQK_CMD = 0x0;
  1039. #if 0
  1040. /*u8 LOKreg[] = {0x58, 0x78};*/
  1041. #endif
  1042. RF_DBG(dm, DBG_RF_IQK, "[IQK]==========S%d LOK ==========\n",
  1043. iqk_info->is_btg);
  1044. IQK_CMD = 0xf8000008 | (1 << (4 + path));
  1045. RF_DBG(dm, DBG_RF_IQK, "[IQK]LOK_Trigger = 0x%x\n", IQK_CMD);
  1046. _iqk_set_gnt_wl_gnt_bt(dm, true);
  1047. odm_write_4byte(dm, 0x1b00, IQK_CMD);
  1048. odm_write_4byte(dm, 0x1b00, IQK_CMD + 1);
  1049. /*LOK: CMD ID = 0 {0xf8000018, 0xf8000028}*/
  1050. /*LOK: CMD ID = 0 {0xf8000019, 0xf8000029}*/
  1051. #if 0
  1052. /*ODM_sleep_ms(LOK_delay_8821C);*/
  1053. #endif
  1054. ODM_delay_ms(LOK_delay_8821C);
  1055. delay_count = 0;
  1056. LOK_notready = true;
  1057. while (LOK_notready) {
  1058. if (odm_get_rf_reg(dm, path, RF_0x8, RFREGOFFSETMASK) == 0x12345)
  1059. LOK_notready = false;
  1060. else
  1061. LOK_notready = true;
  1062. if (LOK_notready) {
  1063. #if 0
  1064. /*ODM_sleep_ms(1);*/
  1065. #endif
  1066. ODM_delay_ms(1);
  1067. delay_count++;
  1068. }
  1069. if (delay_count >= 50) {
  1070. RF_DBG(dm, DBG_RF_IQK, "[IQK]S%d LOK timeout!!!\n",
  1071. path);
  1072. break;
  1073. }
  1074. }
  1075. odm_set_rf_reg(dm, path, RF_0x8, RFREGOFFSETMASK, 0x0);
  1076. _iqk_set_gnt_wl_gnt_bt(dm, false);
  1077. RF_DBG(dm, DBG_RF_IQK, "[IQK]S%d ==> delay_count = 0x%x\n", path,
  1078. delay_count);
  1079. if (!LOK_notready) {
  1080. LOK_temp2 = odm_get_rf_reg(dm, (enum rf_path)path, RF_0x8, RFREGOFFSETMASK);
  1081. LOK_temp3 = odm_get_rf_reg(dm, (enum rf_path)path, RF_0x58, RFREGOFFSETMASK);
  1082. RF_DBG(dm, DBG_RF_IQK, "[IQK]0x8 = 0x%x, 0x58 = 0x%x\n",
  1083. LOK_temp2, LOK_temp3);
  1084. } else {
  1085. RF_DBG(dm, DBG_RF_IQK, "[IQK]==>S%d LOK Fail!!!\n", path);
  1086. }
  1087. iqk_info->lok_fail[path] = LOK_notready;
  1088. /*fill IDAC LUT table*/
  1089. #if 0
  1090. /*
  1091. for (i = 0; i < 8; i++) {
  1092. odm_set_rf_reg(dm, path, RF_0x33, BIT(2)|BIT(1)|BIT(0), i);
  1093. odm_set_rf_reg(dm, path, RF_0x8, RFREGOFFSETMASK, LOK_temp2);
  1094. }
  1095. */
  1096. #endif
  1097. return LOK_notready;
  1098. }
  1099. boolean
  1100. _iqk_one_shot_8821c(void *dm_void, u8 path, u8 idx)
  1101. {
  1102. struct dm_struct *dm = (struct dm_struct *)dm_void;
  1103. struct dm_iqk_info *iqk_info = &dm->IQK_info;
  1104. u8 delay_count = 0;
  1105. boolean fail = true;
  1106. u32 IQK_CMD = 0x0;
  1107. u16 iqk_apply[2] = {0xc94, 0xe94};
  1108. if (idx == TX_IQK)
  1109. RF_DBG(dm, DBG_RF_IQK,
  1110. "[IQK]============ S%d WBTXIQK ============\n",
  1111. iqk_info->is_btg);
  1112. else if (idx == RXIQK1)
  1113. RF_DBG(dm, DBG_RF_IQK,
  1114. "[IQK]============ S%d WBRXIQK STEP1============\n",
  1115. iqk_info->is_btg);
  1116. else
  1117. RF_DBG(dm, DBG_RF_IQK,
  1118. "[IQK]============ S%d WBRXIQK STEP2============\n",
  1119. iqk_info->is_btg);
  1120. if (idx == TXIQK) {
  1121. IQK_CMD = 0xf8000008 | ((*dm->band_width + 4) << 8) | (1 << (path + 4));
  1122. RF_DBG(dm, DBG_RF_IQK, "[IQK]TXK_Trigger = 0x%x\n", IQK_CMD);
  1123. #if 0
  1124. /*{0xf8000418, 0xf800042a} ==> 20 WBTXK (CMD = 4)*/
  1125. /*{0xf8000518, 0xf800052a} ==> 40 WBTXK (CMD = 5)*/
  1126. /*{0xf8000618, 0xf800062a} ==> 80 WBTXK (CMD = 6)*/
  1127. #endif
  1128. } else if (idx == RXIQK1) {
  1129. if (*dm->band_width == 2)
  1130. IQK_CMD = 0xf8000808 | (1 << (path + 4));
  1131. else
  1132. IQK_CMD = 0xf8000708 | (1 << (path + 4));
  1133. RF_DBG(dm, DBG_RF_IQK, "[IQK]RXK1_Trigger = 0x%x\n", IQK_CMD);
  1134. #if 0
  1135. /*{0xf8000718, 0xf800072a} ==> 20 WBTXK (CMD = 7)*/
  1136. /*{0xf8000718, 0xf800072a} ==> 40 WBTXK (CMD = 7)*/
  1137. /*{0xf8000818, 0xf800082a} ==> 80 WBTXK (CMD = 8)*/
  1138. #endif
  1139. } else if (idx == RXIQK2) {
  1140. IQK_CMD = 0xf8000008 | ((*dm->band_width + 9) << 8) | (1 << (path + 4));
  1141. RF_DBG(dm, DBG_RF_IQK, "[IQK]RXK2_Trigger = 0x%x\n", IQK_CMD);
  1142. #if 0
  1143. /*{0xf8000918, 0xf800092a} ==> 20 WBRXK (CMD = 9)*/
  1144. /*{0xf8000a18, 0xf8000a2a} ==> 40 WBRXK (CMD = 10)*/
  1145. /*{0xf8000b18, 0xf8000b2a} ==> 80 WBRXK (CMD = 11)*/
  1146. #endif
  1147. }
  1148. _iqk_set_gnt_wl_gnt_bt(dm, true);
  1149. odm_write_4byte(dm, 0x1bc8, 0x80000000);
  1150. odm_write_4byte(dm, 0x8f8, 0x41400080);
  1151. if (odm_get_rf_reg(dm, path, RF_0x08, RFREGOFFSETMASK) != 0x0)
  1152. odm_set_rf_reg(dm, path, RF_0x8, RFREGOFFSETMASK, 0x0);
  1153. odm_write_4byte(dm, 0x1b00, IQK_CMD);
  1154. odm_write_4byte(dm, 0x1b00, IQK_CMD + 0x1);
  1155. #if 0
  1156. /*ODM_sleep_ms(WBIQK_delay_8821C);*/
  1157. #endif
  1158. ODM_delay_ms(WBIQK_delay_8821C);
  1159. fail = _iqk_check_nctl_done_8821c(dm, path, IQK_CMD);
  1160. RF_DBG(dm, DBG_RF_IQK, "[IQK]check 0x49c = %x\n",
  1161. odm_read_1byte(dm, 0x49c));
  1162. _iqk_set_gnt_wl_gnt_bt(dm, false);
  1163. if (dm->debug_components & DBG_RF_IQK) {
  1164. odm_write_4byte(dm, 0x1b00, 0xf8000008 | path << 1);
  1165. RF_DBG(dm, DBG_RF_IQK,
  1166. "[IQK]S%d ==> 0x1b00 = 0x%x, 0x1b08 = 0x%x\n", path,
  1167. odm_read_4byte(dm, 0x1b00), odm_read_4byte(dm, 0x1b08));
  1168. RF_DBG(dm, DBG_RF_IQK, "[IQK]S%d ==> delay_count = 0x%x\n",
  1169. path, delay_count);
  1170. if (idx != TXIQK)
  1171. RF_DBG(dm, DBG_RF_IQK,
  1172. "[IQK]S%d ==> RF0x0 = 0x%x, RF0x%x = 0x%x\n",
  1173. path,
  1174. odm_get_rf_reg(dm, path, RF_0x0,
  1175. RFREGOFFSETMASK),
  1176. (iqk_info->is_btg) ? 0x78 : 0x56,
  1177. (iqk_info->is_btg) ?
  1178. odm_get_rf_reg(dm, path, RF_0x78,
  1179. RFREGOFFSETMASK) :
  1180. odm_get_rf_reg(dm, path, RF_0x56,
  1181. RFREGOFFSETMASK));
  1182. }
  1183. odm_write_4byte(dm, 0x1b00, 0xf8000008 | path << 1);
  1184. if (idx == TXIQK) {
  1185. if (fail)
  1186. odm_set_bb_reg(dm, iqk_apply[path], BIT(0), 0x0);
  1187. else
  1188. _iqk_backup_iqk_8821c(dm, 0x2, path);
  1189. }
  1190. if (idx == RXIQK2) {
  1191. iqk_info->rxiqk_agc[0][path] =
  1192. (u16)(((odm_get_rf_reg(dm, (enum rf_path)path, RF_0x0, RFREGOFFSETMASK) >> 5) & 0xff) |
  1193. (iqk_info->tmp1bcc << 8));
  1194. odm_write_4byte(dm, 0x1b38, 0x20000000);
  1195. if (fail)
  1196. odm_set_bb_reg(dm, iqk_apply[path], (BIT(11) | BIT(10)), 0x0);
  1197. else
  1198. _iqk_backup_iqk_8821c(dm, 0x3, path);
  1199. }
  1200. if (idx == TXIQK)
  1201. iqk_info->iqk_fail_report[0][path][TXIQK] = fail;
  1202. else
  1203. iqk_info->iqk_fail_report[0][path][RXIQK] = fail;
  1204. return fail;
  1205. }
  1206. boolean
  1207. _iqk_rxiqkbystep_8821c(void *dm_void, u8 path)
  1208. {
  1209. struct dm_struct *dm = (struct dm_struct *)dm_void;
  1210. struct dm_iqk_info *iqk_info = &dm->IQK_info;
  1211. boolean KFAIL = true, gonext;
  1212. #if 1
  1213. switch (iqk_info->rxiqk_step) {
  1214. case 1: /*gain search_RXK1*/
  1215. _iqk_rxk1setting_8821c(dm, path);
  1216. gonext = false;
  1217. while (1) {
  1218. KFAIL = _iqk_rx_iqk_gain_search_fail_8821c(dm, path, RXIQK1);
  1219. if (KFAIL && iqk_info->gs_retry_count[0][path][0] < 2) {
  1220. iqk_info->gs_retry_count[0][path][0]++;
  1221. } else if (KFAIL) {
  1222. iqk_info->rxiqk_fail_code[0][path] = 0;
  1223. iqk_info->rxiqk_step = 5;
  1224. gonext = true;
  1225. } else {
  1226. iqk_info->rxiqk_step++;
  1227. gonext = true;
  1228. }
  1229. if (gonext)
  1230. break;
  1231. }
  1232. halrf_iqk_xym_read(dm, 0x0, 0x2);
  1233. break;
  1234. case 2: /*gain search_RXK2*/
  1235. _iqk_rxk2setting_8821c(dm, path, true);
  1236. iqk_info->isbnd = false;
  1237. while (1) {
  1238. KFAIL = _iqk_rx_iqk_gain_search_fail_8821c(dm, path, RXIQK2);
  1239. if (KFAIL && iqk_info->gs_retry_count[0][path][1] < rxiqk_gs_limit) {
  1240. iqk_info->gs_retry_count[0][path][1]++;
  1241. } else {
  1242. iqk_info->rxiqk_step++;
  1243. break;
  1244. }
  1245. }
  1246. halrf_iqk_xym_read(dm, 0x0, 0x3);
  1247. break;
  1248. case 3: /*RXK1*/
  1249. _iqk_rxk1setting_8821c(dm, path);
  1250. gonext = false;
  1251. while (1) {
  1252. KFAIL = _iqk_one_shot_8821c(dm, path, RXIQK1);
  1253. if (KFAIL && iqk_info->retry_count[0][path][RXIQK1] < 2) {
  1254. iqk_info->retry_count[0][path][RXIQK1]++;
  1255. } else if (KFAIL) {
  1256. iqk_info->rxiqk_fail_code[0][path] = 1;
  1257. iqk_info->rxiqk_step = 5;
  1258. gonext = true;
  1259. } else {
  1260. iqk_info->rxiqk_step++;
  1261. gonext = true;
  1262. }
  1263. if (gonext)
  1264. break;
  1265. }
  1266. halrf_iqk_xym_read(dm, 0x0, 0x4);
  1267. break;
  1268. case 4: /*RXK2*/
  1269. _iqk_rxk2setting_8821c(dm, path, false);
  1270. gonext = false;
  1271. while (1) {
  1272. KFAIL = _iqk_one_shot_8821c(dm, path, RXIQK2);
  1273. if (KFAIL && iqk_info->retry_count[0][path][RXIQK2] < 2) {
  1274. iqk_info->retry_count[0][path][RXIQK2]++;
  1275. } else if (KFAIL) {
  1276. iqk_info->rxiqk_fail_code[0][path] = 2;
  1277. iqk_info->rxiqk_step = 5;
  1278. gonext = true;
  1279. } else {
  1280. iqk_info->rxiqk_step++;
  1281. gonext = true;
  1282. }
  1283. if (gonext)
  1284. break;
  1285. }
  1286. halrf_iqk_xym_read(dm, 0x0, 0x0);
  1287. break;
  1288. }
  1289. return KFAIL;
  1290. #endif
  1291. }
  1292. void _iqk_iqk_by_path_8821c(void *dm_void, boolean segment_iqk)
  1293. {
  1294. struct dm_struct *dm = (struct dm_struct *)dm_void;
  1295. struct dm_iqk_info *iqk_info = &dm->IQK_info;
  1296. boolean KFAIL = true;
  1297. u8 i, kcount_limit;
  1298. #if 0
  1299. /* RF_DBG(dm, DBG_RF_IQK, "[IQK]iqk_step = 0x%x\n", dm->rf_calibrate_info.iqk_step); */
  1300. #endif
  1301. if (*dm->band_width == 2)
  1302. kcount_limit = kcount_limit_80m;
  1303. else
  1304. kcount_limit = kcount_limit_others;
  1305. while (1) {
  1306. switch (dm->rf_calibrate_info.iqk_step) {
  1307. case 1: /*S0 LOK*/
  1308. for (i = 0; i < 8; i++) { /* the LOK Cal in the each PAD stage*/
  1309. _iqk_lok_setting_8821c(dm, RF_PATH_A, i);
  1310. _lok_one_shot_8821c(dm, RF_PATH_A, i);
  1311. }
  1312. dm->rf_calibrate_info.iqk_step++;
  1313. break;
  1314. case 2: /*S0 TXIQK*/
  1315. _iqk_txk_setting_8821c(dm, RF_PATH_A);
  1316. KFAIL = _iqk_one_shot_8821c(dm, RF_PATH_A, TXIQK);
  1317. iqk_info->kcount++;
  1318. RF_DBG(dm, DBG_RF_IQK, "[IQK]KFail = 0x%x\n", KFAIL);
  1319. if (KFAIL && iqk_info->retry_count[0][RF_PATH_A][TXIQK] < 3)
  1320. iqk_info->retry_count[0][RF_PATH_A][TXIQK]++;
  1321. else
  1322. dm->rf_calibrate_info.iqk_step++;
  1323. halrf_iqk_xym_read(dm, 0x0, 0x1);
  1324. break;
  1325. case 3: /*S0 RXIQK*/
  1326. while (1) {
  1327. KFAIL = _iqk_rxiqkbystep_8821c(dm, RF_PATH_A);
  1328. RF_DBG(dm, DBG_RF_IQK,
  1329. "[IQK]S0RXK KFail = 0x%x\n", KFAIL);
  1330. if (iqk_info->rxiqk_step == 5) {
  1331. dm->rf_calibrate_info.iqk_step++;
  1332. iqk_info->rxiqk_step = 1;
  1333. if (KFAIL)
  1334. RF_DBG(dm, DBG_RF_IQK, "[IQK]S0RXK fail code: %d!!!\n", iqk_info->rxiqk_fail_code[0][RF_PATH_A]);
  1335. break;
  1336. }
  1337. }
  1338. iqk_info->kcount++;
  1339. break;
  1340. }
  1341. if (dm->rf_calibrate_info.iqk_step == 4) {
  1342. RF_DBG(dm, DBG_RF_IQK,
  1343. "[IQK]==========LOK summary ==========\n");
  1344. RF_DBG(dm, DBG_RF_IQK, "[IQK]PathA_LOK_notready = %d\n",
  1345. iqk_info->lok_fail[RF_PATH_A]);
  1346. RF_DBG(dm, DBG_RF_IQK,
  1347. "[IQK]==========IQK summary ==========\n");
  1348. RF_DBG(dm, DBG_RF_IQK, "[IQK]PathA_TXIQK_fail = %d\n",
  1349. iqk_info->iqk_fail_report[0][RF_PATH_A][TXIQK]);
  1350. RF_DBG(dm, DBG_RF_IQK, "[IQK]PathA_RXIQK_fail = %d\n",
  1351. iqk_info->iqk_fail_report[0][RF_PATH_A][RXIQK]);
  1352. RF_DBG(dm, DBG_RF_IQK, "[IQK]PathA_TXIQK_retry = %d\n",
  1353. iqk_info->retry_count[0][RF_PATH_A][TXIQK]);
  1354. RF_DBG(dm, DBG_RF_IQK,
  1355. "[IQK]PathA_RXK1_retry = %d, PathA_RXK2_retry = %d\n",
  1356. iqk_info->retry_count[0][RF_PATH_A][RXIQK1],
  1357. iqk_info->retry_count[0][RF_PATH_A][RXIQK2]);
  1358. RF_DBG(dm, DBG_RF_IQK,
  1359. "[IQK]PathA_GS1_retry = %d, PathA_GS2_retry = %d\n",
  1360. iqk_info->gs_retry_count[0][RF_PATH_A][0],
  1361. iqk_info->gs_retry_count[0][RF_PATH_A][1]);
  1362. for (i = 0; i < SS_8821C; i++) {
  1363. odm_write_4byte(dm, 0x1b00, 0xf8000008 | i << 1);
  1364. odm_write_4byte(dm, 0x1b2c, 0x7);
  1365. odm_write_4byte(dm, 0x1bcc, 0x0);
  1366. odm_write_4byte(dm, 0x1b38, 0x20000000);
  1367. }
  1368. break;
  1369. }
  1370. RF_DBG(dm, DBG_RF_IQK, "[IQK]segmentIQK = %d, Kcount = %d\n",
  1371. segment_iqk, iqk_info->kcount);
  1372. if (segment_iqk && iqk_info->kcount == kcount_limit)
  1373. break;
  1374. }
  1375. }
  1376. void _iqk_start_iqk_8821c(struct dm_struct *dm, boolean segment_iqk)
  1377. {
  1378. struct dm_iqk_info *iqk_info = &dm->IQK_info;
  1379. u32 tmp;
  1380. odm_write_4byte(dm, 0x1b00, 0xf8000008);
  1381. odm_write_4byte(dm, 0x1bb8, 0x00000000);
  1382. /*GNT_WL = 1*/
  1383. if (iqk_info->is_btg) {
  1384. tmp = odm_get_rf_reg(dm, RF_PATH_A, RF_0x1, RFREGOFFSETMASK);
  1385. tmp = (tmp & (~BIT(3))) | BIT(0) | BIT(2) | BIT(5);
  1386. odm_set_rf_reg(dm, RF_PATH_A, RF_0x1, RFREGOFFSETMASK, tmp);
  1387. } else {
  1388. tmp = odm_get_rf_reg(dm, RF_PATH_A, RF_0x1, RFREGOFFSETMASK);
  1389. tmp = ((tmp & (~BIT(3))) & (~BIT(5))) | BIT(0) | BIT(2);
  1390. odm_set_rf_reg(dm, RF_PATH_A, RF_0x1, RFREGOFFSETMASK, tmp);
  1391. RF_DBG(dm, DBG_RF_IQK, "[IQK]==> RF0x1 = 0x%x\n",
  1392. odm_get_rf_reg(dm, RF_PATH_A, RF_0x1, RFREGOFFSETMASK));
  1393. }
  1394. _iqk_iqk_by_path_8821c(dm, segment_iqk);
  1395. }
  1396. void _iq_calibrate_8821c_init(struct dm_struct *dm)
  1397. {
  1398. struct dm_iqk_info *iqk_info = &dm->IQK_info;
  1399. u8 i, j, k, m;
  1400. static boolean firstrun = true;
  1401. if (firstrun) {
  1402. firstrun = false;
  1403. RF_DBG(dm, DBG_RF_IQK,
  1404. "[IQK]=====>PHY_IQCalibrate_8821C_Init\n");
  1405. for (i = 0; i < SS_8821C; i++) {
  1406. for (j = 0; j < 2; j++) {
  1407. iqk_info->lok_fail[i] = true;
  1408. iqk_info->iqk_fail[j][i] = true;
  1409. iqk_info->iqc_matrix[j][i] = 0x20000000;
  1410. }
  1411. }
  1412. for (i = 0; i < 2; i++) {
  1413. iqk_info->iqk_channel[i] = 0x0;
  1414. for (j = 0; j < SS_8821C; j++) {
  1415. iqk_info->lok_idac[i][j] = 0x0;
  1416. iqk_info->rxiqk_agc[i][j] = 0x0;
  1417. iqk_info->bypass_iqk[i][j] = 0x0;
  1418. for (k = 0; k < 2; k++) {
  1419. iqk_info->iqk_fail_report[i][j][k] = true;
  1420. for (m = 0; m < 8; m++) {
  1421. iqk_info->iqk_cfir_real[i][j][k][m] = 0x0;
  1422. iqk_info->iqk_cfir_imag[i][j][k][m] = 0x0;
  1423. }
  1424. }
  1425. for (k = 0; k < 3; k++)
  1426. iqk_info->retry_count[i][j][k] = 0x0;
  1427. }
  1428. }
  1429. }
  1430. }
  1431. u8 _txgapk_txpower_compare_8821c(struct dm_struct *dm, u8 path, u32 pw1,
  1432. u32 pw2, u32 *pwr_table)
  1433. {
  1434. u8 pwr_delta;
  1435. u32 temp = 0x0;
  1436. temp = (u32)(pw1 / (pw2 / 1000));
  1437. if (temp < pwr_table[0]) /*<-3.5 dB*/
  1438. pwr_delta = 0x0;
  1439. else if (temp < pwr_table[1])
  1440. pwr_delta = 0x1;
  1441. else if (temp < pwr_table[2])
  1442. pwr_delta = 0x2;
  1443. else if (temp < pwr_table[3])
  1444. pwr_delta = 0x3;
  1445. else if (temp < pwr_table[4])
  1446. pwr_delta = 0x4;
  1447. else if (temp < pwr_table[5])
  1448. pwr_delta = 0x5;
  1449. else if (temp < pwr_table[6])
  1450. pwr_delta = 0x6;
  1451. else if (temp < pwr_table[7])
  1452. pwr_delta = 0x7;
  1453. else if (temp < pwr_table[8])
  1454. pwr_delta = 0x8;
  1455. else if (temp < pwr_table[9])
  1456. pwr_delta = 0x9;
  1457. else if (temp < pwr_table[0xa])
  1458. pwr_delta = 0xa;
  1459. else if (temp < pwr_table[0xb])
  1460. pwr_delta = 0xb;
  1461. else if (temp < pwr_table[0xc])
  1462. pwr_delta = 0xc;
  1463. else if (temp < pwr_table[0xd])
  1464. pwr_delta = 0xd;
  1465. else if (temp < pwr_table[0xe])
  1466. pwr_delta = 0xe;
  1467. else if (temp < pwr_table[0xf])
  1468. pwr_delta = 0xf;
  1469. else if (temp < pwr_table[0x10])
  1470. pwr_delta = 0x10;
  1471. else if (temp < pwr_table[0x11])
  1472. pwr_delta = 0x11;
  1473. else if (temp < pwr_table[0x12])
  1474. pwr_delta = 0x12;
  1475. else if (temp < pwr_table[0x13])
  1476. pwr_delta = 0x13;
  1477. else if (temp < pwr_table[0x14])
  1478. pwr_delta = 0x14;
  1479. else if (temp < pwr_table[0x15])
  1480. pwr_delta = 0x15;
  1481. else if (temp < pwr_table[0x16])
  1482. pwr_delta = 0x16;
  1483. else if (temp < pwr_table[0x17])
  1484. pwr_delta = 0x17;
  1485. else if (temp < pwr_table[0x18])
  1486. pwr_delta = 0x18;
  1487. else if (temp < pwr_table[0x19])
  1488. pwr_delta = 0x19;
  1489. else
  1490. pwr_delta = 0x1a;
  1491. RF_DBG(dm, DBG_RF_IQK, "[TXGAPK] temp =%d, pwr_delta =%x\n", temp,
  1492. pwr_delta);
  1493. return pwr_delta;
  1494. }
  1495. u32 _txgapk_txgap_compenstion_8821c(struct dm_struct *dm, u8 path,
  1496. u32 txgain_0x56, u8 pwr_delta)
  1497. {
  1498. u32 new_txgain_0x56;
  1499. /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 */
  1500. /* -3.5 -3 -2.5 -2 -1.5 -1 -0.5 0 0.5 1 1.5 2 2.5 3 3.5 (dB)*/
  1501. #if 0
  1502. /* pwr_table[0xf]={89,100,112,125,141,158,177,199,223,251,281,316,354,398,446}*/
  1503. #endif
  1504. switch (pwr_delta) {
  1505. case 0x1a:
  1506. case 0x19:
  1507. case 0x18:
  1508. case 0x17:
  1509. case 0x16:
  1510. case 0x15:
  1511. case 0x14:
  1512. #if 0
  1513. /*
  1514. if ((txgain_0x56 & 0x1f)<=0x1d)
  1515. new_txgain_0x56 = txgain_0x56 + 0x2; //< -1.5 ~ -2.5dB
  1516. else if ((txgain_0x56 & 0x1f)<= 0x1e)
  1517. new_txgain_0x56 = txgain_0x56 + 0x1;
  1518. else
  1519. new_txgain_0x56 = txgain_0x56;
  1520. break;
  1521. */
  1522. #endif
  1523. case 0x13:
  1524. case 0x12:
  1525. if ((txgain_0x56 & 0x1f) <= 0x1e)
  1526. new_txgain_0x56 = txgain_0x56 + 0x1;/*< -0.5 ~ -1.5dB*/
  1527. else
  1528. new_txgain_0x56 = txgain_0x56;
  1529. break;
  1530. case 0x11:
  1531. case 0x10:
  1532. case 0xf:
  1533. case 0xe:
  1534. case 0xd:
  1535. case 0xc:
  1536. new_txgain_0x56 = txgain_0x56; /*< -0.5~0.5dB*/
  1537. break;
  1538. case 0xb:
  1539. case 0xa:
  1540. case 0x9:
  1541. case 0x8:
  1542. case 0x7:
  1543. if ((txgain_0x56 & 0x1f) >= 0x01)
  1544. new_txgain_0x56 = txgain_0x56 - 0x1; /* >0.5~1.5dB */
  1545. else
  1546. new_txgain_0x56 = txgain_0x56;
  1547. break;
  1548. case 0x6:
  1549. case 0x5:
  1550. case 0x4:
  1551. case 0x3:
  1552. #if 0
  1553. /*
  1554. if ((txgain_0x56 & 0x1f)>= 0x02)
  1555. new_txgain_0x56 = txgain_0x56 - 0x2; //>1.5~2.5dB
  1556. else if ((txgain_0x56 & 0x1f)>= 0x01)
  1557. new_txgain_0x56 = txgain_0x56 - 0x1;
  1558. else
  1559. new_txgain_0x56 = txgain_0x56;
  1560. break;
  1561. */
  1562. #endif
  1563. case 0x2:
  1564. case 0x1:
  1565. case 0x0:
  1566. #if 0
  1567. /*
  1568. if ((txgain_0x56 & 0x1f)>= 0x03)
  1569. new_txgain_0x56 = txgain_0x56 - 0x3; //>2.5~3.5dB
  1570. else if ((txgain_0x56 & 0x1f)>= 0x02)
  1571. new_txgain_0x56 = txgain_0x56 - 0x2;
  1572. else if ((txgain_0x56 & 0x1f)>= 0x01)
  1573. new_txgain_0x56 = txgain_0x56 - 0x1;
  1574. else
  1575. new_txgain_0x56 = txgain_0x56;
  1576. break;
  1577. */
  1578. #endif
  1579. default:
  1580. new_txgain_0x56 = txgain_0x56;
  1581. break;
  1582. }
  1583. if ((new_txgain_0x56 & 0x1f) < 0x02)
  1584. new_txgain_0x56 = (new_txgain_0x56 & 0xffffc) + 0x2;
  1585. if ((new_txgain_0x56 & 0x1f) > 0x1d)
  1586. new_txgain_0x56 = (new_txgain_0x56 | 0x3) - 0x2;
  1587. return new_txgain_0x56;
  1588. }
  1589. void _txgapk_backup_8821c(struct dm_struct *dm, u32 *backup_txgap,
  1590. u32 *backup_txgap_reg, u8 txgapk_reg_num)
  1591. {
  1592. u32 i;
  1593. for (i = 0; i < txgapk_reg_num; i++)
  1594. backup_txgap[i] = odm_read_4byte(dm, backup_txgap_reg[i]);
  1595. }
  1596. u32 _txgapk_get_rf_tx_index_8821c(struct dm_struct *dm, u8 path,
  1597. u32 txgain_index)
  1598. {
  1599. u32 rf_backup_reg00, rf_backup_regdf, rf_reg56;
  1600. rf_backup_reg00 = odm_get_rf_reg(dm, RF_PATH_A, RF_0x00, RFREGOFFSETMASK);
  1601. rf_backup_regdf = odm_get_rf_reg(dm, RF_PATH_A, RF_0xdf, RFREGOFFSETMASK);
  1602. odm_set_rf_reg(dm, RF_PATH_A, RF_0xdf, RFREGOFFSETMASK, 0x08009);
  1603. odm_set_rf_reg(dm, RF_PATH_A, RF_0x00, RFREGOFFSETMASK, 0x20000 + txgain_index);
  1604. /*ODM_sleep_us(10);*/
  1605. ODM_delay_us(10);
  1606. rf_reg56 = odm_get_rf_reg(dm, RF_PATH_A, RF_0x56, RFREGOFFSETMASK);
  1607. RF_DBG(dm, DBG_RF_IQK,
  1608. "[TXGAPK](2) txgain_index =0x%x, rf_reg56=0x%x\n", txgain_index,
  1609. rf_reg56);
  1610. odm_set_rf_reg(dm, RF_PATH_A, RF_0x00, RFREGOFFSETMASK, rf_backup_reg00);
  1611. odm_set_rf_reg(dm, RF_PATH_A, RF_0xdf, RFREGOFFSETMASK, rf_backup_regdf);
  1612. return rf_reg56;
  1613. }
  1614. void _txgapk_restore_8821c(struct dm_struct *dm, u32 *backup_txgap,
  1615. u32 *backup_txgap_reg, u8 txgapk_reg_num)
  1616. {
  1617. u32 i;
  1618. for (i = 0; i < txgapk_reg_num; i++)
  1619. odm_write_4byte(dm, backup_txgap_reg[i], backup_txgap[i]);
  1620. }
  1621. void _txgapk_setting_8821c(struct dm_struct *dm, u8 path)
  1622. {
  1623. struct dm_iqk_info *iqk_info = &dm->IQK_info;
  1624. /*RF*/
  1625. odm_set_rf_reg(dm, RF_PATH_A, RF_0xef, RFREGOFFSETMASK, 0x80000);
  1626. odm_set_rf_reg(dm, RF_PATH_A, RF_0x33, RFREGOFFSETMASK, 0x00024);
  1627. odm_set_rf_reg(dm, RF_PATH_A, RF_0x3e, RFREGOFFSETMASK, 0x0003F);
  1628. odm_set_rf_reg(dm, RF_PATH_A, RF_0x3f, RFREGOFFSETMASK, 0xCBFCE);
  1629. odm_set_rf_reg(dm, RF_PATH_A, RF_0xef, RFREGOFFSETMASK, 0x00000);
  1630. if (iqk_info->is_btg) {
  1631. } else {
  1632. switch (*dm->band_type) {
  1633. case ODM_BAND_2_4G:
  1634. break;
  1635. case ODM_BAND_5G:
  1636. odm_set_rf_reg(dm, RF_PATH_A, RF_0x8f, RFREGOFFSETMASK, 0xA9C00);
  1637. odm_set_rf_reg(dm, RF_PATH_A, RF_0xdf, RFREGOFFSETMASK, 0x00809);
  1638. odm_set_rf_reg(dm, RF_PATH_A, RF_0x00, RFREGOFFSETMASK, 0x4001c);
  1639. odm_write_4byte(dm, 0x1bcc, 0x00000009); /*try the iqk swing*/
  1640. odm_write_4byte(dm, 0x1b20, 0x01040008);
  1641. odm_write_4byte(dm, 0x1b24, 0x01040848);
  1642. odm_write_4byte(dm, 0x1b14, 0x00001000);
  1643. odm_write_4byte(dm, 0x1b1c, 0x82193d31);
  1644. odm_write_1byte(dm, 0x1b22, 0x04); /*sync with RF0x33[3:0]*/
  1645. odm_write_1byte(dm, 0x1b26, 0x04); /*sync with RF0x33[3:0]*/
  1646. odm_write_1byte(dm, 0x1b2c, 0x03);
  1647. odm_write_4byte(dm, 0x1b38, 0x20000000);
  1648. odm_write_4byte(dm, 0x1b3c, 0x20000000);
  1649. odm_write_4byte(dm, 0xc00, 0x4);
  1650. RF_DBG(dm, DBG_RF_IQK,
  1651. "[IQK](1) txgap calibration setting!!!\n");
  1652. break;
  1653. }
  1654. }
  1655. }
  1656. u32 _txgapk_one_shot_8821c(struct dm_struct *dm_void, u8 path, u32 reg0x56)
  1657. {
  1658. struct dm_struct *dm = (struct dm_struct *)dm_void;
  1659. boolean txgap_k_notready = true;
  1660. u8 delay_count = 0x0;
  1661. u32 txgap_k_tmp1 = 0x1, txgap_k_tmp2 = 0x2;
  1662. u8 offset;
  1663. u32 reg_1bb8;
  1664. u32 rx_dsp_power;
  1665. reg_1bb8 = odm_read_4byte(dm, 0x1bb8);
  1666. /*clear the flag*/
  1667. odm_write_1byte(dm, 0x1bd6, 0x0b);
  1668. odm_set_bb_reg(dm, R_0x1bfc, BIT(1), 0x0);
  1669. txgap_k_notready = true;
  1670. delay_count = 0x0;
  1671. /* get tx gain*/
  1672. odm_write_1byte(dm, 0x1b2b, 0x00);
  1673. odm_write_1byte(dm, 0x1bb8, 0x00);
  1674. odm_set_rf_reg(dm, path, RF_0xdf, RFREGOFFSETMASK, 0x00802);
  1675. odm_set_rf_reg(dm, path, RF_0x8f, RFREGOFFSETMASK, 0xa9c00);
  1676. odm_set_rf_reg(dm, path, RF_0x56, RFREGOFFSETMASK, reg0x56);
  1677. odm_write_4byte(dm, 0x1bb8, 0x00100000);
  1678. #if 0
  1679. /*ODM_sleep_us(10);*/
  1680. #endif
  1681. ODM_delay_us(10);
  1682. /* one-shot-1*/
  1683. odm_write_4byte(dm, 0x1b34, 0x1);
  1684. odm_write_4byte(dm, 0x1b34, 0x0);
  1685. #if 1
  1686. while (txgap_k_notready) {
  1687. odm_write_1byte(dm, 0x1bd6, 0x0b);
  1688. if ((boolean)odm_get_bb_reg(dm, R_0x1bfc, BIT(1)))
  1689. txgap_k_notready = false;
  1690. else
  1691. txgap_k_notready = true;
  1692. if (txgap_k_notready) {
  1693. #if 0
  1694. /*ODM_sleep_us(100);*/
  1695. #endif
  1696. ODM_delay_us(100);
  1697. delay_count++;
  1698. }
  1699. if (delay_count >= 20) {
  1700. RF_DBG(dm, DBG_RF_IQK,
  1701. "[TXGAPK] (3)txgapktimeout,delay_count=0x%x !!!\n",
  1702. delay_count);
  1703. txgap_k_notready = false;
  1704. break;
  1705. }
  1706. }
  1707. #else
  1708. ODM_sleep_ms(1);
  1709. if ((boolean)odm_get_bb_reg(dm, R_0x1bfc, BIT(1)))
  1710. txgap_k_notready = false;
  1711. else
  1712. txgap_k_notready = true;
  1713. #endif
  1714. if (!txgap_k_notready) {
  1715. odm_write_1byte(dm, 0x1bd6, 0x5);
  1716. txgap_k_tmp1 = odm_read_4byte(dm, 0x1bfc) >> 27;
  1717. odm_write_1byte(dm, 0x1bd6, 0xe);
  1718. txgap_k_tmp2 = odm_read_4byte(dm, 0x1bfc);
  1719. RF_DBG(dm, DBG_RF_IQK,
  1720. "[TXGAPK] reg0x56 =0x%x, txgapK_tmp1 =0x%x, txgapK_tmp2 =0x%x!!!\n",
  1721. reg0x56, txgap_k_tmp1, txgap_k_tmp2);
  1722. if (txgap_k_tmp1 == 0)
  1723. offset = 0x0;
  1724. else if (txgap_k_tmp1 < 2)
  1725. offset = 0x1;
  1726. else if (txgap_k_tmp1 < 4)
  1727. offset = 0x2;
  1728. else
  1729. offset = 0x3;
  1730. if (txgap_k_tmp1 == 0x0) {
  1731. rx_dsp_power = txgap_k_tmp2;
  1732. } else {
  1733. txgap_k_tmp1 = txgap_k_tmp1 << (32 - offset);
  1734. txgap_k_tmp2 = txgap_k_tmp2 >> offset;
  1735. rx_dsp_power = txgap_k_tmp1 + txgap_k_tmp2;
  1736. overflowflag = true;
  1737. RF_DBG(dm, DBG_RF_IQK,
  1738. "[TXGAPK](3) (1)overflowflag = true, txgapK_tmp1 =0x%x, txgapK_tmp2 =0x%x!!!\n",
  1739. txgap_k_tmp1, txgap_k_tmp2);
  1740. }
  1741. } else {
  1742. RF_DBG(dm, DBG_RF_IQK, "[TXGAPK](3) txgapK Fail!!!\n");
  1743. }
  1744. odm_write_4byte(dm, 0x1bb8, reg_1bb8);
  1745. return rx_dsp_power;
  1746. }
  1747. void _phy_txgapk_calibrate_8821c(void *dm_void, u8 path)
  1748. {
  1749. struct dm_struct *dm = (struct dm_struct *)dm_void;
  1750. u32 txgain[txgap_k_number] = {0, 0, 0, 0, 0, 0, 0};
  1751. u32 txgain_rf56[txgap_k_number] = {0, 0, 0, 0, 0, 0, 0};
  1752. u8 add_base, txgapk_num = 0x0, psd_delta = 0x0;
  1753. u8 i, bandselect = 0x0;
  1754. u32 backup_txgap_reg[11] = {0x1b14, 0x1b1c, 0x1b20, 0x1b24, 0x1b28, 0x1b2c, 0x1b38, 0x1b3c, 0x1bd6, 0x1bb8, 0x1bcc};
  1755. u32 backup_txgap[11];
  1756. u8 gain_gap_index[txgap_k_number] = {0x13, 0x10, 0xd, 0xa, 0x7, 0x4, 0x1};
  1757. u32 txgainindex[txgap_k_number] = {0x26, 0x25, 0x24, 0x23, 0x22, 0x21, 0x20};
  1758. u32 tmp1, tmp2, tmp3, tmp4, tmp5;
  1759. u8 skip_low_power_index = 0x3;
  1760. s8 psd_single_tone_offset_1db[3][3] = {{-1, 0, 0}, {-2, -1, -1}, {-1, -1, -1} }; /*5G, L,M,H, index 32,26,20*/
  1761. static u32 pwr_table_1db[27] = {590, 630, 668, 707, 749, 794, 841, 891, 944, 1000, 1040, 1096, 1148, 1202, 1258, 1318,
  1762. 1380, 1412, 1513, 1584, 1678, 1778, 1888, 1995, 2113, 2387, 2391};
  1763. static u32 pwr_table_3db[27] = {944, 1000, 1059, 1122, 1185, 1258, 1333, 1412, 1496, 1584, 1659, 1737, 1819, 1905, 1995, 2089,
  1764. 2187, 2290, 2398, 2511, 2660, 2818, 2985, 3162, 3349, 3548, 3758};
  1765. boolean txgapkdone = false;
  1766. u8 txgap_changed = 0x0;
  1767. u8 ref_val = 0x0;
  1768. overflowflag = 0;
  1769. RF_DBG(dm, DBG_RF_IQK,
  1770. "[TXGAPK] (1) *dm->band_width = %x, *dm->channel =%d, *dm->band_type=%x\n",
  1771. *dm->band_width, *dm->channel, *dm->band_type);
  1772. if (!(*dm->mp_mode))
  1773. return;
  1774. if (!(*dm->band_type == ODM_BAND_5G))
  1775. return;
  1776. if (*dm->band_width == 0) {
  1777. #if 0
  1778. /* return;*/
  1779. #endif
  1780. if (*dm->channel < 64) {
  1781. bandselect = 0x0;
  1782. add_base = 0x0;
  1783. } else if (*dm->channel < 153) {
  1784. bandselect = 0x1;
  1785. add_base = 0x40;
  1786. #if 0
  1787. /*else if (*dm->channel ==153){*/
  1788. #endif
  1789. } else {
  1790. bandselect = 0x2;
  1791. add_base = 0x80;
  1792. }
  1793. } else if (*dm->band_width == 1) {
  1794. if (*dm->channel < 102) {
  1795. bandselect = 0x0;
  1796. add_base = 0x0;
  1797. } else if (*dm->channel < 151) {
  1798. bandselect = 0x1;
  1799. add_base = 0x40;
  1800. #if 0
  1801. /*else if (*dm->channel ==151){*/
  1802. #endif
  1803. } else {
  1804. bandselect = 0x2;
  1805. add_base = 0x80;
  1806. }
  1807. } else if (*dm->band_width == 2) {
  1808. /* return;*/
  1809. if (*dm->channel < 106) {
  1810. bandselect = 0x0;
  1811. add_base = 0x0;
  1812. } else if (*dm->channel < 155) {
  1813. bandselect = 0x1;
  1814. add_base = 0x40;
  1815. #if 0
  1816. /*else if (*dm->channel ==155){*/
  1817. #endif
  1818. } else {
  1819. bandselect = 0x2;
  1820. add_base = 0x80;
  1821. }
  1822. } else {
  1823. return;
  1824. }
  1825. if (txgap_done[bandselect])
  1826. return;
  1827. /*Step 1*/
  1828. _txgapk_backup_8821c(dm, backup_txgap, backup_txgap_reg, 0xb);
  1829. /*step 2*/
  1830. phydm_clear_kfree_to_rf(dm, RF_PATH_A, 1);
  1831. for (i = 0; i < txgap_k_number; i++) {
  1832. txgain_rf56[i] = _txgapk_get_rf_tx_index_8821c(dm, RF_PATH_A, gain_gap_index[i]);
  1833. txgain[i] = txgain_rf56[i];
  1834. }
  1835. for (i = 0; i < txgap_k_number; i++) {
  1836. RF_DBG(dm, DBG_RF_IQK, "[TXGAPK] start txgain1[%x]=0x%x\n", i,
  1837. txgain_rf56[i]);
  1838. }
  1839. _txgapk_setting_8821c(dm, RF_PATH_A);
  1840. /*step 3*/
  1841. /*1st*/
  1842. while (!txgapkdone) {
  1843. txgapk_num++;
  1844. if (txgapk_num > 2)
  1845. break;
  1846. for (i = 0; i < txgap_k_number - 1 - skip_low_power_index; i++) {
  1847. tmp1 = (txgain[i] & 0x000000e0) >> 5;
  1848. tmp2 = (txgain[i + 1] & 0x000000e0) >> 5;
  1849. tmp5 = txgain[i + 1];
  1850. #if 0
  1851. //if (tmp1 != tmp2){
  1852. #endif
  1853. if (true) {
  1854. tmp3 = _txgapk_one_shot_8821c(dm, RF_PATH_A, txgain[i] - 2);
  1855. tmp4 = _txgapk_one_shot_8821c(dm, RF_PATH_A, txgain[i + 1]);
  1856. if (overflowflag)
  1857. overflowflag = false;
  1858. #if 0
  1859. //tmp4 = tmp4>>1;
  1860. #endif
  1861. psd_delta =
  1862. _txgapk_txpower_compare_8821c(dm, RF_PATH_A, tmp3, tmp4, pwr_table_1db);
  1863. psd_delta = psd_delta + psd_single_tone_offset_1db[bandselect][i];
  1864. RF_DBG(dm, DBG_RF_IQK,
  1865. "[TXGAPK] new psd_detla = %x\n",
  1866. psd_delta);
  1867. if (psd_delta <= 0xb)
  1868. txgap_changed++;
  1869. else if (psd_delta <= 0x11)
  1870. ;
  1871. else
  1872. txgap_changed++;
  1873. txgain[i + 1] =
  1874. _txgapk_txgap_compenstion_8821c(dm, RF_PATH_A, txgain[i + 1], psd_delta);
  1875. } else {
  1876. RF_DBG(dm, DBG_RF_IQK,
  1877. "[TXGAPK]skip i=%d, txgain[%x]=0x%x\n",
  1878. i, i + 1, txgain[i + 1]);
  1879. }
  1880. }
  1881. /*2nd*/
  1882. if (txgap_changed > 0x0) {
  1883. RF_DBG(dm, DBG_RF_IQK, "[TXGAPK] do 3dB check\n");
  1884. for (i = 0; i < txgap_k_number - 1 - skip_low_power_index; i++) {
  1885. tmp1 = (txgain[i] & 0x000000e0) >> 5;
  1886. tmp2 = (txgain[i + 1] & 0x000000e0) >> 5;
  1887. if (tmp1 != tmp2) {
  1888. if (i == 0)
  1889. tmp3 = _txgapk_one_shot_8821c(dm, RF_PATH_A, txgain[i] - 2);
  1890. else
  1891. tmp3 = _txgapk_one_shot_8821c(dm, RF_PATH_A, txgain[i]);
  1892. tmp4 = _txgapk_one_shot_8821c(dm, RF_PATH_A, txgain[i + 1]);
  1893. if (overflowflag) {
  1894. overflowflag = false;
  1895. RF_DBG(dm, DBG_RF_IQK, "[IQK] tmp3= %x, tmp4= %x\n", tmp3, tmp4);
  1896. }
  1897. if (i == 0)
  1898. psd_delta =
  1899. _txgapk_txpower_compare_8821c(dm, RF_PATH_A, tmp3, tmp4, pwr_table_1db);
  1900. else
  1901. psd_delta =
  1902. _txgapk_txpower_compare_8821c(dm, RF_PATH_A, tmp3, tmp4, pwr_table_3db);
  1903. if (psd_delta <= 0xa)
  1904. ref_val++;
  1905. else if (psd_delta <= 0x12)
  1906. ;
  1907. else
  1908. ref_val++;
  1909. } else {
  1910. RF_DBG(dm, DBG_RF_IQK, "[TXGAPK]skip i=%d, txgain[%x]=0x%x\n", i, i + 1, txgain[i + 1]);
  1911. }
  1912. }
  1913. if (ref_val == 0x0) {
  1914. txgapkdone = true;
  1915. txgap_changed = 0x0;
  1916. } else {
  1917. /* restore default rf 0x56 */
  1918. for (i = 0; i < txgap_k_number; i++)
  1919. txgain[i] = txgain_rf56[i];
  1920. }
  1921. } else {
  1922. txgapkdone = true;
  1923. }
  1924. }
  1925. /*step 7*/
  1926. _txgapk_restore_8821c(dm, backup_txgap, backup_txgap_reg, 0xb);
  1927. /*step 8*/
  1928. RF_DBG(dm, DBG_RF_IQK,
  1929. "[TXGAPK]txgapkdone =%x, txgap_changed=0x%x, ref_val =0x%x\n",
  1930. txgapkdone, txgap_changed, ref_val);
  1931. if (txgapkdone) {
  1932. odm_set_rf_reg(dm, RF_PATH_A, RF_0xef, RFREGOFFSETMASK, 0x00800);
  1933. for (i = 0; i < txgap_k_number; i++) {
  1934. odm_set_rf_reg(dm, RF_PATH_A, RF_0x33, RFREGOFFSETMASK, txgainindex[i] + add_base);
  1935. odm_set_rf_reg(dm, RF_PATH_A, RF_0x3f, RFREGOFFSETMASK, txgain[i]);
  1936. }
  1937. odm_set_rf_reg(dm, RF_PATH_A, RF_0xef, RFREGOFFSETMASK, 0x00000);
  1938. txgap_done[bandselect] = true;
  1939. txgapkdone = false;
  1940. }
  1941. }
  1942. #if 0
  1943. /*
  1944. void
  1945. _DPK_BackupReg_8821C(
  1946. struct dm_struct* dm,
  1947. static u32* DPK_backup,
  1948. u32* backup_dpk_reg
  1949. )
  1950. {
  1951. u32 i;
  1952. for (i = 0; i < DPK_BACKUP_REG_NUM_8821C; i++)
  1953. DPK_backup[i] = odm_read_4byte(dm, backup_dpk_reg[i]);
  1954. }
  1955. void
  1956. _DPK_Restore_8821C(
  1957. struct dm_struct* dm,
  1958. static u32* DPK_backup,
  1959. u32* backup_dpk_reg
  1960. )
  1961. {
  1962. u32 i;
  1963. for (i = 0; i < DPK_BACKUP_REG_NUM_8821C; i++)
  1964. odm_write_4byte(dm, backup_dpk_reg[i], DPK_backup[i]);
  1965. }
  1966. */
  1967. #endif
  1968. void _dpk_toggle_rxagc(struct dm_struct *dm, boolean reset)
  1969. {
  1970. /*toggle RXAGC workaround method*/
  1971. u32 tmp1;
  1972. tmp1 = odm_read_4byte(dm, 0xc50);
  1973. odm_set_bb_reg(dm, R_0xc50, BIT(3) | BIT(2) | BIT(1) | BIT(0), 0x0);
  1974. #if 0
  1975. /* ODM_sleep_ms(2);*/
  1976. #endif
  1977. ODM_delay_ms(2);
  1978. odm_set_bb_reg(dm, R_0xc50, BIT(3) | BIT(2) | BIT(1) | BIT(0), 0x2);
  1979. #if 0
  1980. /* ODM_sleep_ms(2);*/
  1981. #endif
  1982. ODM_delay_ms(2);
  1983. odm_set_bb_reg(dm, R_0xc50, BIT(3) | BIT(2) | BIT(1) | BIT(0), 0x0);
  1984. odm_write_4byte(dm, 0xc50, tmp1);
  1985. }
  1986. void _dpk_set_gain_scaling(struct dm_struct *dm, u8 path)
  1987. {
  1988. u32 tmp1, tmp2, tmp3, tmp4, reg_1bfc;
  1989. u32 lut_i = 0x0, lut_q = 0x0, lut_pw = 0x0, lut_pw_avg = 0x0;
  1990. u16 gain_scaling = 0x0;
  1991. tmp1 = odm_read_4byte(dm, 0x1b00);
  1992. tmp2 = odm_read_4byte(dm, 0x1b08);
  1993. tmp3 = odm_read_4byte(dm, 0x1bd4);
  1994. tmp4 = odm_read_4byte(dm, 0x1bdc);
  1995. odm_write_4byte(dm, 0x1b00, 0xf8000008);
  1996. odm_write_4byte(dm, 0x1b08, 0x00000080);
  1997. odm_write_4byte(dm, 0x1bd4, 0x00040001);
  1998. odm_write_4byte(dm, 0x1bdc, 0xc0000081);
  1999. reg_1bfc = odm_read_4byte(dm, 0x1bfc);
  2000. lut_i = (reg_1bfc & 0x003ff800) >> 11;
  2001. lut_q = (reg_1bfc & 0x00007ff);
  2002. if ((lut_i & 0x400) == 0x400)
  2003. lut_i = 0x800 - lut_i;
  2004. if ((lut_q & 0x400) == 0x400)
  2005. lut_q = 0x800 - lut_q;
  2006. lut_pw = lut_i * lut_i + lut_q * lut_q;
  2007. lut_pw_avg = (u32)(lut_i + lut_q) >> 1;
  2008. gain_scaling = (u16)(0x800000 / lut_pw_avg);
  2009. odm_set_bb_reg(dm, R_0x1b98, 0x0000ffff, gain_scaling);
  2010. odm_set_bb_reg(dm, R_0x1b98, 0xffff0000, gain_scaling);
  2011. odm_write_4byte(dm, 0x1b00, tmp1);
  2012. odm_write_4byte(dm, 0x1b08, tmp2);
  2013. odm_write_4byte(dm, 0x1bd4, tmp3);
  2014. odm_write_4byte(dm, 0x1bdc, tmp4);
  2015. RF_DBG(dm, DBG_RF_IQK,
  2016. "[IQK] reg_1bfc =0x%x, lut_pw =0x%x, lut_i = 0x%x, lut_q = 0x%x, lut_pw_avg = 0x%x, gain_scaling = 0x%x, 0x1b98 =0x%x!!!\n",
  2017. reg_1bfc, lut_pw, lut_i, lut_q, lut_pw_avg, gain_scaling,
  2018. odm_read_4byte(dm, 0x1b98));
  2019. }
  2020. void _dpk_set_dpk_pa_scan(struct dm_struct *dm, u8 path)
  2021. {
  2022. u32 tmp1, tmp2, reg_1bfc;
  2023. u32 pa_scan_i = 0x0, pa_scan_q = 0x0, pa_scan_pw = 0x0;
  2024. u32 gainloss_back = 0x0;
  2025. #if 0
  2026. /* boolean pa_scan_search_fail = false;*/
  2027. #endif
  2028. tmp1 = odm_read_4byte(dm, 0x1bcf);
  2029. tmp2 = odm_read_4byte(dm, 0x1bd4);
  2030. odm_write_4byte(dm, 0x1bcf, 0x11);
  2031. odm_write_4byte(dm, 0x1bd4, 0x00060000);
  2032. reg_1bfc = odm_read_4byte(dm, 0x1bfc);
  2033. odm_write_4byte(dm, 0x1bcf, 0x15);
  2034. pa_scan_i = (reg_1bfc & 0xffff0000) >> 16;
  2035. pa_scan_q = (reg_1bfc & 0x0000ffff);
  2036. if ((pa_scan_i & 0x8000) == 0x8000)
  2037. pa_scan_i = 0x10000 - pa_scan_i;
  2038. if ((pa_scan_q & 0x8000) == 0x8000)
  2039. pa_scan_q = 0x10000 - pa_scan_q;
  2040. pa_scan_pw = pa_scan_i * pa_scan_i + pa_scan_q * pa_scan_q;
  2041. /*estimated pa_scan_pw*/
  2042. #if 0
  2043. /*0dB => (512^2) * 10^(0/10) = 262144*/
  2044. /*1dB => (512^2) * 10^(1/10) = 330019*/
  2045. /*2dB => (512^2) * 10^(2/10) = 415470*/
  2046. /*3dB => (512^2) * 10^(3/10) = 523046*/
  2047. /*4dB => (512^2) * 10^(4/10) = 658475*/
  2048. /*5dB => (512^2) * 10^(5/10) = 828972*/
  2049. /*6dB => (512^2) * 10^(6/10) = 1043614*/
  2050. /*7dB => (512^2) * 10^(7/10) = 1313832*/
  2051. /*8dB => (512^2) * 10^(0/10) = 1654016*/
  2052. /*9dB => (512^2) * 10^(1/10) = 2082283*/
  2053. /*10dB => (512^2) * 10^(2/10) = 2621440*/
  2054. /*11dB => (512^2) * 10^(3/10) = 3300197*/
  2055. /*12dB => (512^2) * 10^(4/10) = 4154702*/
  2056. /*13dB => (512^2) * 10^(5/10) = 5230460*/
  2057. /*14dB => (512^2) * 10^(6/10) = 6584759*/
  2058. /*15dB => (512^2) * 10^(7/10) = 8289721*/
  2059. #endif
  2060. if (pa_scan_pw >= 0x7e7db9)
  2061. pa_scan_pw = 0x0f;
  2062. else if (pa_scan_pw >= 0x6479b7)
  2063. pa_scan_pw = 0x0e;
  2064. else if (pa_scan_pw >= 0x4fcf7c)
  2065. pa_scan_pw = 0x0d;
  2066. else if (pa_scan_pw >= 0x3f654e)
  2067. pa_scan_pw = 0x0c;
  2068. else if (pa_scan_pw >= 0x325b65)
  2069. pa_scan_pw = 0x0b;
  2070. else if (pa_scan_pw >= 0x280000)
  2071. pa_scan_pw = 0x0a;
  2072. else if (pa_scan_pw >= 0x1fc5eb)
  2073. pa_scan_pw = 0x09;
  2074. else if (pa_scan_pw >= 0x193d00)
  2075. pa_scan_pw = 0x8;
  2076. else if (pa_scan_pw >= 0x140c28)
  2077. pa_scan_pw = 0x7;
  2078. else if (pa_scan_pw >= 0xefc9e)
  2079. pa_scan_pw = 0x6;
  2080. else if (pa_scan_pw >= 0xca62c)
  2081. pa_scan_pw = 0x5;
  2082. else if (pa_scan_pw > 0xa0c2b)
  2083. pa_scan_pw = 0x4;
  2084. else if (pa_scan_pw > 0x7fb26)
  2085. pa_scan_pw = 0x3;
  2086. else if (pa_scan_pw > 0x656ee)
  2087. pa_scan_pw = 0x2;
  2088. else if (pa_scan_pw > 0x50923)
  2089. pa_scan_pw = 0x1;
  2090. else /*262144 >= pa_scan_pw*/
  2091. pa_scan_pw = 0x0;
  2092. odm_write_4byte(dm, 0x1bd4, 0x00060001);
  2093. gainloss_back = (odm_read_4byte(dm, 0x1bfc) & 0x0000000f);
  2094. if (gainloss_back <= 0xa)
  2095. gainloss_back = 0xa - gainloss_back;
  2096. if (gainloss_back > pa_scan_pw + 0x8)
  2097. odm_set_rf_reg(dm, path, RF_0x8f, BIT(14) | BIT(13), 0x11);
  2098. else if ((pa_scan_pw + 0x8 - gainloss_back) >= 0x6)
  2099. odm_set_rf_reg(dm, path, RF_0x8f, BIT(14) | BIT(13), 0x00);
  2100. else
  2101. #if 0
  2102. /*if (0x6 >= (pa_scan_pw + 0x8 - gainloss_back)> 0x0 )*/
  2103. #endif
  2104. odm_set_rf_reg(dm, path, RF_0x8f, BIT(14) | BIT(13), 0x01);
  2105. RF_DBG(dm, DBG_RF_IQK,
  2106. "[IQK] reg_1bfc =0x%x, pa_scan_pw =0x%x, gainloss_back = 0x%x, pa_scan_i = 0x%x, pa_scan_q = 0x%x, RF0x8f = 0x%x, !!!\n",
  2107. reg_1bfc, pa_scan_pw, gainloss_back, pa_scan_i, pa_scan_q,
  2108. odm_get_rf_reg(dm, path, RF_0x8f, RFREGOFFSETMASK));
  2109. odm_write_4byte(dm, 0x1bcf, tmp1);
  2110. odm_write_4byte(dm, 0x1bd4, tmp2);
  2111. }
  2112. void _dpk_disable_bb_dynamic_pwr_threshold(struct dm_struct *dm, boolean flag)
  2113. {
  2114. if (flag) /*disable BB dynamic pwr threshold hold*/
  2115. odm_set_bb_reg(dm, R_0x1c74, BIT(31) | BIT(30) | BIT(29) | BIT(28), 0x0);
  2116. else
  2117. odm_set_bb_reg(dm, R_0x1c74, BIT(31) | BIT(30) | BIT(29) | BIT(28), 0x2);
  2118. RF_DBG(dm, DBG_RF_IQK, "[DPK]\nset 0x1c74 = 0x%x\n",
  2119. odm_read_4byte(dm, 0x1c74));
  2120. }
  2121. void _dpk_set_dpk_sram_to_10_8821c(struct dm_struct *dm, u8 path)
  2122. {
  2123. u32 tmp1, tmp2;
  2124. u8 i;
  2125. tmp1 = odm_read_4byte(dm, 0x1b00);
  2126. tmp2 = odm_read_4byte(dm, 0x1b08);
  2127. for (i = 0; i < 64; i++)
  2128. odm_write_4byte(dm, 0x1bdc, 0xd0000001 + (i * 2) + 1);
  2129. for (i = 0; i < 64; i++)
  2130. odm_write_4byte(dm, 0x1bdc, 0x90000080 + (i * 2) + 1);
  2131. #if 0
  2132. /*
  2133. RF_DBG(dm, DBG_RF_IQK,
  2134. "[DPK]return txagc = 0x%x , 1bfc = 0x%x,rf00=0x%x\n",
  2135. tmp4, odm_read_4byte(dm, 0x1bfc),
  2136. odm_get_rf_reg(dm, path, RF_0x00, RFREGOFFSETMASK));
  2137. */
  2138. #endif
  2139. odm_write_4byte(dm, 0x1bdc, 0x0);
  2140. odm_write_4byte(dm, 0x1b00, tmp1);
  2141. odm_write_4byte(dm, 0x1b08, tmp2);
  2142. }
  2143. void _dpk_set_bbtxagc_8821c(struct dm_struct *dm, u8 path)
  2144. {
  2145. u8 hw_rate, tmp;
  2146. for (hw_rate = 0; hw_rate < 0x53; hw_rate++) {
  2147. phydm_write_txagc_1byte_8821c(dm, 0x30, (enum rf_path)0x0, hw_rate);
  2148. tmp = config_phydm_read_txagc_8821c(dm, (enum rf_path)0x0, hw_rate);
  2149. #if 0
  2150. /*
  2151. RF_DBG(dm, DBG_RF_IQK,
  2152. "hw_rate =0x%x, tmp =0x%x \n", hw_rate, tmp);
  2153. */
  2154. #endif
  2155. }
  2156. }
  2157. u8 _dpk_get_txagcindpk_8821c(struct dm_struct *dm, u8 path)
  2158. {
  2159. u32 tmp1, tmp2, tmp3;
  2160. u8 tmp4;
  2161. tmp1 = odm_read_4byte(dm, 0x1bcc);
  2162. odm_set_bb_reg(dm, R_0x1bcc, BIT(26), 0x01);
  2163. tmp2 = odm_read_4byte(dm, 0x1bd4);
  2164. odm_set_bb_reg(dm, R_0x1bd4, BIT(20) | BIT(19) | BIT(18) | BIT(17) | BIT(16), 0x0a);
  2165. tmp3 = odm_read_4byte(dm, 0x1bfc);
  2166. tmp4 = ((u8)odm_get_bb_reg(dm, R_0x1bfc, MASKDWORD)) >> 2;
  2167. #if 0
  2168. /*
  2169. RF_DBG(dm, DBG_RF_IQK,
  2170. "[DPK]return txagc = 0x%x , 1bfc = 0x%x,rf00=0x%x\n",
  2171. tmp4, odm_read_4byte(dm, 0x1bfc),
  2172. odm_get_rf_reg(dm, path, RF_0x00, RFREGOFFSETMASK));
  2173. */
  2174. #endif
  2175. odm_write_4byte(dm, 0x1bcc, tmp1);
  2176. odm_write_4byte(dm, 0x1bd4, tmp2);
  2177. return tmp4;
  2178. }
  2179. void _dpk_ampmcurce_8821c(struct dm_struct *dm, u8 path)
  2180. {
  2181. u8 i;
  2182. RF_DBG(dm, DBG_RF_IQK, "[DPK] 0x1bcc = 0x%x, 0x1bb8 =0x%x\n",
  2183. odm_read_4byte(dm, 0x1bcc), odm_read_4byte(dm, 0x1bb8));
  2184. odm_write_4byte(dm, 0x1bcc, 0x118f8800);
  2185. for (i = 0; i < 8; i++) {
  2186. odm_write_4byte(dm, 0x1b90, 0x0101e018 + i);
  2187. odm_write_4byte(dm, 0x1bd4, 0x00060000);
  2188. RF_DBG(dm, DBG_RF_IQK, "0x%x\n", odm_read_4byte(dm, 0x1bfc));
  2189. odm_write_4byte(dm, 0x1bd4, 0x00070000);
  2190. RF_DBG(dm, DBG_RF_IQK, "0x%x\n", odm_read_4byte(dm, 0x1bfc));
  2191. odm_write_4byte(dm, 0x1bd4, 0x00080000);
  2192. RF_DBG(dm, DBG_RF_IQK, "0x%x\n", odm_read_4byte(dm, 0x1bfc));
  2193. odm_write_4byte(dm, 0x1bd4, 0x00090000);
  2194. RF_DBG(dm, DBG_RF_IQK, "0x%x\n", odm_read_4byte(dm, 0x1bfc));
  2195. }
  2196. odm_write_4byte(dm, 0x1b90, 0x0001e018);
  2197. }
  2198. void _dpk_readsram_8821c(struct dm_struct *dm, u8 path)
  2199. {
  2200. /* dbg message*/
  2201. u8 i;
  2202. odm_write_4byte(dm, 0x1b00, 0xf8000008);
  2203. odm_write_4byte(dm, 0x1b08, 0x00000080);
  2204. odm_write_4byte(dm, 0x1bd4, 0x00040001);
  2205. RF_DBG(dm, DBG_RF_IQK, "[DPK] SRAM value!!!\n");
  2206. for (i = 0; i < 64; i++) {
  2207. #if 0
  2208. /*odm_write_4byte(dm, 0x1b90, 0x0101e018+i);*/
  2209. #endif
  2210. odm_write_4byte(dm, 0x1bdc, 0xc0000081 + i * 2);
  2211. RF_DBG(dm, DBG_RF_IQK, "0x%x\n", odm_read_4byte(dm, 0x1bfc));
  2212. }
  2213. odm_write_4byte(dm, 0x1bd4, 0x00050001);
  2214. for (i = 0; i < 64; i++) {
  2215. #if 0
  2216. /*odm_write_4byte(dm, 0x1b90, 0x0101e018+i);*/
  2217. #endif
  2218. odm_write_4byte(dm, 0x1bdc, 0xc0000081 + i * 2);
  2219. RF_DBG(dm, DBG_RF_IQK, "0x%x\n", odm_read_4byte(dm, 0x1bfc));
  2220. }
  2221. #if 0
  2222. /*ODM_sleep_ms(200);*/
  2223. #endif
  2224. ODM_delay_ms(200);
  2225. #if 0
  2226. /*odm_write_4byte(dm, 0x1b08, 0x00000080);*/
  2227. #endif
  2228. odm_write_4byte(dm, 0x1bd4, 0xA0001);
  2229. odm_write_4byte(dm, 0x1bdc, 0x00000000);
  2230. }
  2231. void _dpk_restore_8821c(struct dm_struct *dm, u8 path)
  2232. {
  2233. odm_write_4byte(dm, 0xc60, 0x700B8040);
  2234. odm_write_4byte(dm, 0xc60, 0x700B8040);
  2235. odm_write_4byte(dm, 0xc60, 0x70146040);
  2236. odm_write_4byte(dm, 0xc60, 0x70246040);
  2237. odm_write_4byte(dm, 0xc60, 0x70346040);
  2238. odm_write_4byte(dm, 0xc60, 0x70446040);
  2239. odm_write_4byte(dm, 0xc60, 0x705B2040);
  2240. odm_write_4byte(dm, 0xc60, 0x70646040);
  2241. odm_write_4byte(dm, 0xc60, 0x707B8040);
  2242. odm_write_4byte(dm, 0xc60, 0x708B8040);
  2243. odm_write_4byte(dm, 0xc60, 0x709B8040);
  2244. odm_write_4byte(dm, 0xc60, 0x70aB8040);
  2245. odm_write_4byte(dm, 0xc60, 0x70bB6040);
  2246. odm_write_4byte(dm, 0xc60, 0x70c06040);
  2247. odm_write_4byte(dm, 0xc60, 0x70d06040);
  2248. odm_write_4byte(dm, 0xc60, 0x70eF6040);
  2249. odm_write_4byte(dm, 0xc60, 0x70f06040);
  2250. odm_write_4byte(dm, 0xc58, 0xd8020402);
  2251. odm_write_4byte(dm, 0xc5c, 0xde000120);
  2252. odm_write_4byte(dm, 0xc6c, 0x0000122a);
  2253. odm_write_4byte(dm, 0x808, 0x24028211);
  2254. #if 0
  2255. /*odm_write_4byte(dm, 0x810, 0x211042A5);*/
  2256. #endif
  2257. odm_write_4byte(dm, 0x90c, 0x13000000);
  2258. odm_write_4byte(dm, 0x9a4, 0x80000088);
  2259. odm_write_4byte(dm, 0xc94, 0x01000101);
  2260. odm_write_4byte(dm, 0x1904, 0x00238000);
  2261. odm_write_4byte(dm, 0x1904, 0x00228000);
  2262. odm_write_4byte(dm, 0xC00, 0x00000007);
  2263. }
  2264. void _dpk_clear_sram_8821c(struct dm_struct *dm, u8 path)
  2265. {
  2266. u8 i;
  2267. /* write pwsf*/
  2268. /*S3*/
  2269. odm_write_4byte(dm, 0x1bdc, 0x40caffe1);
  2270. odm_write_4byte(dm, 0x1bdc, 0x4080a1e3);
  2271. odm_write_4byte(dm, 0x1bdc, 0x405165e5);
  2272. odm_write_4byte(dm, 0x1bdc, 0x403340e7);
  2273. odm_write_4byte(dm, 0x1bdc, 0x402028e9);
  2274. odm_write_4byte(dm, 0x1bdc, 0x401419eb);
  2275. odm_write_4byte(dm, 0x1bdc, 0x400d10ed);
  2276. odm_write_4byte(dm, 0x1bdc, 0x40080aef);
  2277. odm_write_4byte(dm, 0x1bdc, 0x400506f1);
  2278. odm_write_4byte(dm, 0x1bdc, 0x400304f3);
  2279. odm_write_4byte(dm, 0x1bdc, 0x400203f5);
  2280. odm_write_4byte(dm, 0x1bdc, 0x400102f7);
  2281. odm_write_4byte(dm, 0x1bdc, 0x400101f9);
  2282. odm_write_4byte(dm, 0x1bdc, 0x400101fb);
  2283. odm_write_4byte(dm, 0x1bdc, 0x400101fd);
  2284. odm_write_4byte(dm, 0x1bdc, 0x400101ff);
  2285. /*S0*/
  2286. odm_write_4byte(dm, 0x1bdc, 0x40caff81);
  2287. odm_write_4byte(dm, 0x1bdc, 0x4080a183);
  2288. odm_write_4byte(dm, 0x1bdc, 0x40516585);
  2289. odm_write_4byte(dm, 0x1bdc, 0x40334087);
  2290. odm_write_4byte(dm, 0x1bdc, 0x40202889);
  2291. odm_write_4byte(dm, 0x1bdc, 0x4014198b);
  2292. odm_write_4byte(dm, 0x1bdc, 0x400d108d);
  2293. odm_write_4byte(dm, 0x1bdc, 0x40080a8f);
  2294. odm_write_4byte(dm, 0x1bdc, 0x40050691);
  2295. odm_write_4byte(dm, 0x1bdc, 0x40030493);
  2296. odm_write_4byte(dm, 0x1bdc, 0x40020395);
  2297. odm_write_4byte(dm, 0x1bdc, 0x40010297);
  2298. odm_write_4byte(dm, 0x1bdc, 0x40010199);
  2299. odm_write_4byte(dm, 0x1bdc, 0x4001019b);
  2300. odm_write_4byte(dm, 0x1bdc, 0x4001019d);
  2301. odm_write_4byte(dm, 0x1bdc, 0x4001019f);
  2302. odm_write_4byte(dm, 0x1bdc, 0x00000000);
  2303. /*clear sram even*/
  2304. for (i = 0; i < 0x40; i++)
  2305. odm_write_4byte(dm, 0x1bdc, 0xd0000000 + ((i * 2) + 1));
  2306. /*clear sram odd*/
  2307. for (i = 0; i < 0x40; i++)
  2308. odm_write_4byte(dm, 0x1bdc, 0x90000080 + ((i * 2) + 1));
  2309. odm_write_4byte(dm, 0x1bdc, 0x0);
  2310. RF_DBG(dm, DBG_RF_IQK, "[DPK]==========write pwsf and clear sram/n");
  2311. }
  2312. void _dpk_setting_8821c(struct dm_struct *dm, u8 path)
  2313. {
  2314. RF_DBG(dm, DBG_RF_IQK,
  2315. "[DPK]==========Start the DPD setting Initilaize/n");
  2316. /*AFE setting*/
  2317. odm_write_4byte(dm, 0xc60, 0x50000000);
  2318. odm_write_4byte(dm, 0xc60, 0x700F0040);
  2319. odm_write_4byte(dm, 0xc5c, 0xd1000120);
  2320. odm_write_4byte(dm, 0xc58, 0xd8000402);
  2321. odm_write_4byte(dm, 0xc6c, 0x00000a15);
  2322. odm_write_4byte(dm, 0xc00, 0x00000004);
  2323. #if 0
  2324. /*_iqk_bb_reset_8821c(dm);*/
  2325. #endif
  2326. odm_write_4byte(dm, 0xe5c, 0xD1000120);
  2327. odm_write_4byte(dm, 0xc6c, 0x00000A15);
  2328. odm_write_4byte(dm, 0xe6c, 0x00000A15);
  2329. odm_write_4byte(dm, 0x808, 0x2D028200);
  2330. #if 0
  2331. /*odm_write_4byte(dm, 0x810, 0x211042A5);*/
  2332. #endif
  2333. odm_write_4byte(dm, 0x8f4, 0x00d80fb1);
  2334. odm_write_4byte(dm, 0x90c, 0x0B00C000);
  2335. odm_write_4byte(dm, 0x9a4, 0x00000080);
  2336. odm_write_4byte(dm, 0xc94, 0x01000101);
  2337. odm_write_4byte(dm, 0xe94, 0x01000101);
  2338. odm_write_4byte(dm, 0xe5c, 0xD1000120);
  2339. odm_write_4byte(dm, 0xc6c, 0x00000A15);
  2340. odm_write_4byte(dm, 0xe6c, 0x00000A15);
  2341. odm_write_4byte(dm, 0x1904, 0x00020000);
  2342. /*path A*/
  2343. /*RF*/
  2344. odm_set_rf_reg(dm, RF_PATH_A, RF_0xef, RFREGOFFSETMASK, 0x80000);
  2345. odm_set_rf_reg(dm, RF_PATH_A, RF_0x33, RFREGOFFSETMASK, 0x00024);
  2346. odm_set_rf_reg(dm, RF_PATH_A, RF_0x3e, RFREGOFFSETMASK, 0x0003F);
  2347. odm_set_rf_reg(dm, RF_PATH_A, RF_0x3f, RFREGOFFSETMASK, 0xCBFCE);
  2348. odm_set_rf_reg(dm, RF_PATH_A, RF_0xef, RFREGOFFSETMASK, 0x00000);
  2349. /*AGC boundary selection*/
  2350. odm_write_4byte(dm, 0x1bbc, 0x0001abf6);
  2351. odm_write_4byte(dm, 0x1b90, 0x0001e018);
  2352. odm_write_4byte(dm, 0x1bb8, 0x000fffff);
  2353. odm_write_4byte(dm, 0x1bc8, 0x000c55aa);
  2354. #if 0
  2355. /*odm_write_4byte(dm, 0x1bcc, 0x11978200);*/
  2356. #endif
  2357. odm_write_4byte(dm, 0x1bcc, 0x11978800);
  2358. #if 0
  2359. /*odm_write_4byte(dm, 0xcb0, 0x77775747);*/
  2360. /*odm_write_4byte(dm, 0xcb4, 0x100000f7);*/
  2361. /*odm_write_4byte(dm, 0xcb4, 0x10000007);*/
  2362. /*odm_write_4byte(dm, 0xcbc, 0x0);*/
  2363. #endif
  2364. }
  2365. void _dpk_dynamic_bias_8821c(struct dm_struct *dm, u8 path, u8 dynamicbias)
  2366. {
  2367. u32 tmp;
  2368. tmp = odm_get_rf_reg(dm, RF_PATH_A, RF_0xdf, RFREGOFFSETMASK);
  2369. tmp = tmp | BIT(8);
  2370. odm_set_rf_reg(dm, RF_PATH_A, RF_0xdf, RFREGOFFSETMASK, tmp);
  2371. if ((*dm->band_type == ODM_BAND_5G) && (*dm->band_width == 1))
  2372. odm_set_rf_reg(dm, path, RF_0x61, BIT(7) | BIT(6) | BIT(5) | BIT(4), dynamicbias);
  2373. if ((*dm->band_type == ODM_BAND_5G) && (*dm->band_width == 2))
  2374. odm_set_rf_reg(dm, path, RF_0x61, BIT(7) | BIT(6) | BIT(5) | BIT(4), dynamicbias);
  2375. tmp = tmp & (~BIT(8));
  2376. odm_set_rf_reg(dm, RF_PATH_A, RF_0xdf, RFREGOFFSETMASK, tmp);
  2377. RF_DBG(dm, DBG_RF_IQK, "[DPK]Set DynamicBias 0xdf=0x%x, 0x61=0x%x\n",
  2378. odm_get_rf_reg(dm, RF_PATH_A, RF_0xdf, RFREGOFFSETMASK),
  2379. odm_get_rf_reg(dm, RF_PATH_A, RF_0x61, RFREGOFFSETMASK));
  2380. }
  2381. void _dpk_boundary_selection_8821c(struct dm_struct *dm, u8 path)
  2382. {
  2383. u8 tmp_pad, compared_pad, compared_txbb;
  2384. u32 rf_backup_reg00;
  2385. u8 i = 0;
  2386. u8 j = 1;
  2387. u32 boundaryselect = 0;
  2388. struct dm_iqk_info *iqk_info = &dm->IQK_info;
  2389. RF_DBG(dm, DBG_RF_IQK, "[DPK]Start the DPD boundary selection\n");
  2390. rf_backup_reg00 = odm_get_rf_reg(dm, (enum rf_path)path, RF_0x00, RFREGOFFSETMASK);
  2391. tmp_pad = 0;
  2392. compared_pad = 0;
  2393. boundaryselect = 0;
  2394. #if dpk_forcein_sram4
  2395. for (i = 0x1f; i > 0x0; i--) { /*i=tx index*/
  2396. odm_set_rf_reg(dm, RF_PATH_A, RF_0x00, RFREGOFFSETMASK, 0x20000 + i);
  2397. if (iqk_info->is_btg) {
  2398. compared_pad = (u8)((0x1c000 & odm_get_rf_reg(dm, (enum rf_path)path, RF_0x78, RFREGOFFSETMASK)) >> 14);
  2399. compared_txbb = (u8)((0x07C00 & odm_get_rf_reg(dm, (enum rf_path)path, RF_0x5c, RFREGOFFSETMASK)) >> 10);
  2400. } else {
  2401. compared_pad = (u8)((0xe0 & odm_get_rf_reg(dm, (enum rf_path)path, RF_0x56, RFREGOFFSETMASK)) >> 5);
  2402. compared_txbb = (u8)((0x1f & odm_get_rf_reg(dm, (enum rf_path)path, RF_0x56, RFREGOFFSETMASK)));
  2403. }
  2404. if (i == 0x1f) {
  2405. /*boundaryselect = compared_txbb;*/
  2406. boundaryselect = 0x1f;
  2407. tmp_pad = compared_pad;
  2408. }
  2409. if (compared_pad < tmp_pad) {
  2410. boundaryselect = boundaryselect + (i << (j * 5));
  2411. tmp_pad = compared_pad;
  2412. j++;
  2413. }
  2414. if (j >= 4)
  2415. break;
  2416. }
  2417. #else
  2418. boundaryselect = 0x0;
  2419. #endif
  2420. odm_set_rf_reg(dm, RF_PATH_A, RF_0x00, RFREGOFFSETMASK, rf_backup_reg00);
  2421. odm_write_4byte(dm, 0x1bbc, boundaryselect);
  2422. }
  2423. u8 _dpk_get_dpk_tx_agc_8821c(struct dm_struct *dm, u8 path)
  2424. {
  2425. u8 tx_agc_init_value = 0x1f; /* DPK TXAGC value*/
  2426. u32 rf_reg00 = 0x0;
  2427. u8 gainloss = 0x1;
  2428. u8 best_tx_agc, txagcindpk = 0x0;
  2429. u8 tmp;
  2430. boolean fail = true;
  2431. u32 IQK_CMD = 0xf8000d18;
  2432. /* rf_reg00 = 0x40000 + tx_agc_init_value; set TXAGC value */
  2433. if (*dm->band_type == ODM_BAND_5G) {
  2434. tx_agc_init_value = 0x1c;
  2435. rf_reg00 = 0x40000 + tx_agc_init_value; /* set TXAGC value*/
  2436. #if 0
  2437. /*rf_reg00 = 0x54000 + tx_agc_init_value;*/ /* set TXAGC value*/
  2438. #endif
  2439. odm_write_4byte(dm, 0x1bc8, 0x000c55aa);
  2440. odm_set_rf_reg(dm, RF_PATH_A, RF_0x8f, RFREGOFFSETMASK, 0xa9c00);
  2441. } else {
  2442. tx_agc_init_value = 0x17;
  2443. rf_reg00 = 0x44000 + tx_agc_init_value; /* set TXAGC value*/
  2444. #if 0
  2445. /*rf_reg00 = 0x54000 + tx_agc_init_value; */ /* set TXAGC value*/
  2446. #endif
  2447. odm_write_4byte(dm, 0x1bc8, 0x000c44aa);
  2448. odm_set_rf_reg(dm, RF_PATH_A, RF_0x8f, RFREGOFFSETMASK, 0xaec00);
  2449. }
  2450. odm_set_rf_reg(dm, RF_PATH_A, RF_0x00, RFREGOFFSETMASK, rf_reg00);
  2451. odm_set_bb_reg(dm, R_0x1b8c, BIT(15) | BIT(14) | BIT(13), gainloss);
  2452. odm_set_bb_reg(dm, R_0x1bc8, BIT(31), 0x1);
  2453. odm_set_bb_reg(dm, R_0x8f8, BIT(25) | BIT(24) | BIT(23) | BIT(22), 0x5);
  2454. _dpk_set_bbtxagc_8821c(dm, RF_PATH_A);
  2455. txagcindpk = _dpk_get_txagcindpk_8821c(dm, RF_PATH_A);
  2456. if (odm_get_rf_reg(dm, path, RF_0x08, RFREGOFFSETMASK) != 0x0)
  2457. odm_set_rf_reg(dm, path, RF_0x8, RFREGOFFSETMASK, 0x0);
  2458. ;
  2459. #if 0
  2460. /*ODM_sleep_ms(1);*/
  2461. #endif
  2462. ODM_delay_ms(1);
  2463. odm_write_4byte(dm, 0x1b00, IQK_CMD);
  2464. odm_write_4byte(dm, 0x1b00, IQK_CMD + 1);
  2465. fail = _iqk_check_nctl_done_8821c(dm, path, IQK_CMD);
  2466. odm_write_4byte(dm, 0x1b90, 0x0001e018);
  2467. #if 0
  2468. /*
  2469. RF_DBG(dm, DBG_RF_IQK,
  2470. "[DPK]rf_reg00 =0x%x, 0x8F =0x%x, txagcindpk =0x%x\n",
  2471. odm_get_rf_reg(dm, path, RF_0x00, RFREGOFFSETMASK),
  2472. odm_get_rf_reg(dm, path, RF_0x8f, RFREGOFFSETMASK),txagcindpk);
  2473. */
  2474. #endif
  2475. odm_write_4byte(dm, 0x1bd4, 0x60001);
  2476. tmp = (u8)odm_read_4byte(dm, 0x1bfc);
  2477. best_tx_agc = tx_agc_init_value - (0xa - tmp);
  2478. #if 0
  2479. /*
  2480. RF_DBG(dm, DBG_RF_IQK,
  2481. "[DPK](2), 0x1b8c =0x%x, rf_reg00 = 0x%x, 0x1b00 = 0x%x, 0x1bfc = 0x%x, 0x1bd4 = 0x%x,best_tx_agc =0x%x, 0x1bfc[7:0] =0x%x\n",
  2482. odm_read_4byte(dm, 0x1b8c),
  2483. odm_get_rf_reg(dm, path, RF_0x00, RFREGOFFSETMASK),
  2484. odm_read_4byte(dm, 0x1b00),
  2485. odm_read_4byte(dm, 0x1bfc), odm_read_4byte(dm, 0x1bd4),
  2486. best_tx_agc, tmp);
  2487. */
  2488. #endif
  2489. /* dbg message*/
  2490. #if 0
  2491. RF_DBG(dm, DBG_RF_IQK, "[DPK] 0x1bcc = 0x%x, 0x1bb8 =0x%x\n",
  2492. odm_read_4byte(dm, 0x1bcc), odm_read_4byte(dm, 0x1bb8));
  2493. odm_write_4byte(dm, 0x1bcc, 0x118f8800);
  2494. for (i = 0 ; i < 8; i++) {
  2495. odm_write_4byte(dm, 0x1b90, 0x0101e018 + i);
  2496. odm_write_4byte(dm, 0x1bd4, 0x00060000);
  2497. RF_DBG(dm, DBG_RF_IQK, "0x%x\n", odm_read_4byte(dm, 0x1bfc));
  2498. odm_write_4byte(dm, 0x1bd4, 0x00070000);
  2499. RF_DBG(dm, DBG_RF_IQK, "0x%x\n", odm_read_4byte(dm, 0x1bfc));
  2500. odm_write_4byte(dm, 0x1bd4, 0x00080000);
  2501. RF_DBG(dm, DBG_RF_IQK, "0x%x\n", odm_read_4byte(dm, 0x1bfc));
  2502. odm_write_4byte(dm, 0x1bd4, 0x00090000);
  2503. RF_DBG(dm, DBG_RF_IQK, "0x%x\n", odm_read_4byte(dm, 0x1bfc));
  2504. }
  2505. odm_write_4byte(dm, 0x1b90, 0x0001e018);
  2506. #endif
  2507. return best_tx_agc;
  2508. }
  2509. boolean
  2510. _dpk_enable_dpk_8821c(struct dm_struct *dm, u8 path, u8 best_tx_agc)
  2511. {
  2512. u32 rf_reg00 = 0x0;
  2513. boolean fail = true;
  2514. u32 IQK_CMD = 0xf8000e18;
  2515. if (*dm->band_type == ODM_BAND_5G)
  2516. rf_reg00 = 0x40000 + best_tx_agc; /* set TXAGC value*/
  2517. else
  2518. rf_reg00 = 0x44000 + best_tx_agc; /* set TXAGC value*/
  2519. odm_set_rf_reg(dm, RF_PATH_A, RF_0x00, RFREGOFFSETMASK, rf_reg00);
  2520. _dpk_set_dpk_pa_scan(dm, RF_PATH_A);
  2521. /*ODM_sleep_ms(1);*/
  2522. ODM_delay_ms(1);
  2523. odm_set_bb_reg(dm, R_0x1bc8, BIT(31), 0x1);
  2524. odm_write_4byte(dm, 0x8f8, 0x41400080);
  2525. if (odm_get_rf_reg(dm, path, RF_0x08, RFREGOFFSETMASK) != 0x0)
  2526. odm_set_rf_reg(dm, path, RF_0x8, RFREGOFFSETMASK, 0x0);
  2527. /*ODM_sleep_ms(1);*/
  2528. ODM_delay_ms(1);
  2529. odm_write_4byte(dm, 0x1b00, IQK_CMD);
  2530. odm_write_4byte(dm, 0x1b00, IQK_CMD + 1);
  2531. odm_write_4byte(dm, 0x1b90, 0x0001e018);
  2532. odm_write_4byte(dm, 0x1bd4, 0xA0001);
  2533. fail = _iqk_check_nctl_done_8821c(dm, path, IQK_CMD);
  2534. #if 0
  2535. /*
  2536. RF_DBG(dm, DBG_RF_IQK,
  2537. "[DPK] (3) 0x1b0b = 0x%x, 0x1bc8 = 0x%x, rf_reg00 = 0x%x, ,0x1bfc = 0x%x, 0x1b90=0x%x, 0x1b94=0x%x\n",
  2538. odm_read_1byte(dm, 0x1b0b), odm_read_4byte(dm, 0x1bc8), odm_get_rf_reg(dm, path, RF_0x00, RFREGOFFSETMASK),
  2539. odm_read_4byte(dm, 0x1bfc), odm_read_4byte(dm, 0x1b90), odm_read_4byte(dm, 0x1b94));
  2540. */
  2541. #endif
  2542. #if 0 /* dbg message*/
  2543. u8 delay_count = 0x0;
  2544. u8 i;
  2545. u32 tmp;
  2546. odm_write_4byte(dm, 0x1b00, 0xf8000008);
  2547. odm_write_4byte(dm, 0x1b08, 0x00000080);
  2548. odm_write_4byte(dm, 0x1bd4, 0x00040001);
  2549. RF_DBG(dm, DBG_RF_IQK, "[DPK] SRAM value!!!\n");
  2550. for (i = 0 ; i < 64; i++) {
  2551. /*odm_write_4byte(dm, 0x1b90, 0x0101e018+i);*/
  2552. odm_write_4byte(dm, 0x1bdc, 0xc0000081 + i * 2);
  2553. RF_DBG(dm, DBG_RF_IQK, "0x%x\n", odm_read_4byte(dm, 0x1bfc));
  2554. }
  2555. odm_write_4byte(dm, 0x1bd4, 0x00050001);
  2556. for (i = 0 ; i < 64; i++) {
  2557. /*odm_write_4byte(dm, 0x1b90, 0x0101e018+i);*/
  2558. odm_write_4byte(dm, 0x1bdc, 0xc0000081 + i * 2);
  2559. RF_DBG(dm, DBG_RF_IQK, "0x%x\n", odm_read_4byte(dm, 0x1bfc));
  2560. }
  2561. /*odm_write_4byte(dm, 0x1b08, 0x00000080);*/
  2562. odm_write_4byte(dm, 0x1bd4, 0xA0001);
  2563. odm_write_4byte(dm, 0x1bdc, 0x00000000);
  2564. #endif
  2565. return fail;
  2566. }
  2567. boolean
  2568. _dpk_enable_dpd_8821c(struct dm_struct *dm, u8 path, u8 best_tx_agc)
  2569. {
  2570. boolean fail = true;
  2571. u8 offset = 0x0;
  2572. u32 IQK_CMD = 0xf8000f18;
  2573. u8 external_pswf_gain;
  2574. boolean gain_scaling_enable = false;
  2575. odm_set_bb_reg(dm, R_0x1bc8, BIT(31), 0x1);
  2576. odm_write_4byte(dm, 0x8f8, 0x41400080);
  2577. if (odm_get_rf_reg(dm, path, RF_0x08, RFREGOFFSETMASK) != 0x0)
  2578. odm_set_rf_reg(dm, path, RF_0x8, RFREGOFFSETMASK, 0x0);
  2579. /*ODM_sleep_ms(1);*/
  2580. ODM_delay_ms(1);
  2581. odm_write_4byte(dm, 0x1b00, IQK_CMD);
  2582. odm_write_4byte(dm, 0x1b00, IQK_CMD + 1);
  2583. fail = _iqk_check_nctl_done_8821c(dm, path, IQK_CMD);
  2584. odm_write_4byte(dm, 0x1b90, 0x0001e018);
  2585. odm_write_4byte(dm, 0x1bd4, 0xA0001);
  2586. if (!fail) {
  2587. odm_write_4byte(dm, 0x1bcf, 0x19);
  2588. odm_write_4byte(dm, 0x1bdc, 0x0);
  2589. /*add 2db extrnal for compensate performnace, the reason is unknown*/
  2590. external_pswf_gain = 0x2;
  2591. best_tx_agc = best_tx_agc + external_pswf_gain;
  2592. if (best_tx_agc >= 0x19)
  2593. offset = best_tx_agc - 0x19;
  2594. else
  2595. offset = 0x20 - (0x19 - best_tx_agc);
  2596. odm_set_bb_reg(dm, R_0x1bd0, BIT(12) | BIT(11) | BIT(10) | BIT(9) | BIT(8), offset);
  2597. if (gain_scaling_enable)
  2598. _dpk_set_gain_scaling(dm, RF_PATH_A);
  2599. else
  2600. odm_write_4byte(dm, 0x1b98, 0x4c004c00);
  2601. } else {
  2602. RF_DBG(dm, DBG_RF_IQK,
  2603. "[DPK](4)0x1b08 =%x, 0x1bc8 = 0x%x,0x1bfc = 0x%x, ,0x1bd0 = 0x%x, offset =%x, 1bcc =%x\n",
  2604. odm_read_4byte(dm, 0x1b08), odm_read_4byte(dm, 0x1bc8),
  2605. odm_read_1byte(dm, 0x1bfc), odm_read_4byte(dm, 0x1bd0),
  2606. offset, odm_read_4byte(dm, 0x1bcc));
  2607. }
  2608. return fail;
  2609. }
  2610. void _phy_dpd_calibrate_8821c(struct dm_struct *dm, boolean reset)
  2611. {
  2612. u32 backup_dpdbb[3];
  2613. u8 best_tx_agc = 0x1c;
  2614. u32 MAC_backup[MAC_REG_NUM_8821C], RF_backup[RF_REG_NUM_8821C][1];
  2615. u32 backup_mac_reg[MAC_REG_NUM_8821C] = {0x520, 0x550, 0x1518};
  2616. u32 BB_backup[DPK_BB_REG_NUM_8821C];
  2617. u32 backup_bb_reg[DPK_BB_REG_NUM_8821C] = {0x808, 0x90c, 0xc00, 0xcb0, 0xcb4, 0xcbc, 0x1990, 0x9a4, 0xa04, 0xc58, 0xc5c, 0xe58, 0xe5c, 0xc6c, 0xe6c, 0x90c, 0xc94, 0xe94, 0x1904, 0xcb0, 0xcb4, 0xcbc, 0xc00};
  2618. u32 backup_rf_reg[RF_REG_NUM_8821C] = {0xdf, 0xde, 0x8f, 0x0, 0x1};
  2619. u8 i;
  2620. u32 backup_dpk_reg[3] = {0x1bd0, 0x1b98, 0x1bbc};
  2621. struct dm_iqk_info *iqk_info = &dm->IQK_info;
  2622. iqk_info->is_btg = (boolean)odm_get_bb_reg(dm, R_0xcb8, BIT(16));
  2623. if (!(*dm->mp_mode))
  2624. if (_iqk_reload_iqk_8821c(dm, reset))
  2625. return;
  2626. if (!(*dm->band_type == ODM_BAND_5G))
  2627. return;
  2628. RF_DBG(dm, DBG_RF_IQK, "[DPK]==========DPK strat!!!!!==========\n");
  2629. RF_DBG(dm, DBG_RF_IQK,
  2630. "[DPK]band_type = %s, band_width = %d, ExtPA2G = %d, ext_pa_5g = %d\n",
  2631. (*dm->band_type == ODM_BAND_5G) ? "5G" : "2G", *dm->band_width,
  2632. dm->ext_pa, dm->ext_pa_5g);
  2633. _iqk_backup_mac_bb_8821c(dm, MAC_backup, BB_backup, backup_mac_reg, backup_bb_reg, DPK_BB_REG_NUM_8821C);
  2634. _iqk_afe_setting_8821c(dm, true);
  2635. _iqk_backup_rf_8821c(dm, RF_backup, backup_rf_reg);
  2636. if (iqk_info->is_btg) {
  2637. } else {
  2638. if (*dm->band_type == ODM_BAND_2_4G)
  2639. odm_set_bb_reg(dm, R_0xcb8, BIT(8), 0x1);
  2640. else
  2641. odm_set_bb_reg(dm, R_0xcb8, BIT(8), 0x0);
  2642. }
  2643. /*backup 0x1b2c, 1b38,0x1b3c*/
  2644. backup_dpdbb[0] = odm_read_4byte(dm, 0x1b2c);
  2645. backup_dpdbb[1] = odm_read_4byte(dm, 0x1b38);
  2646. backup_dpdbb[2] = odm_read_4byte(dm, 0x1b3c);
  2647. RF_DBG(dm, DBG_RF_IQK, "[DPK]In DPD Process(1), Backup\n");
  2648. /*PDK Init Register setting*/
  2649. _dpk_clear_sram_8821c(dm, RF_PATH_A);
  2650. _dpk_setting_8821c(dm, RF_PATH_A);
  2651. _dpk_boundary_selection_8821c(dm, RF_PATH_A);
  2652. odm_set_bb_reg(dm, R_0x1bc8, BIT(31), 0x1);
  2653. odm_set_bb_reg(dm, R_0x8f8, BIT(25) | BIT(24) | BIT(23) | BIT(22), 0x5);
  2654. /* Get the best TXAGC*/
  2655. best_tx_agc = _dpk_get_dpk_tx_agc_8821c(dm, RF_PATH_A);
  2656. #if 0
  2657. /*ODM_sleep_ms(2);*/
  2658. #endif
  2659. ODM_delay_ms(2);
  2660. RF_DBG(dm, DBG_RF_IQK, "[DPK]In DPD Process(2), Best TXAGC = 0x%x\n",
  2661. best_tx_agc);
  2662. if (_dpk_enable_dpk_8821c(dm, RF_PATH_A, best_tx_agc)) {
  2663. RF_DBG(dm, DBG_RF_IQK,
  2664. "[DPK]In DPD Process(3), DPK process is Fail\n");
  2665. }
  2666. #if 0
  2667. /*ODM_sleep_ms(2);*/
  2668. #endif
  2669. ODM_delay_ms(2);
  2670. if (_dpk_enable_dpd_8821c(dm, RF_PATH_A, best_tx_agc)) {
  2671. RF_DBG(dm, DBG_RF_IQK,
  2672. "[DPK]In DPD Process(4), DPD process is Fail\n");
  2673. }
  2674. /* restore IQK */
  2675. iqk_info->rf_reg18 = odm_get_rf_reg(dm, RF_PATH_A, RF_0x18, RFREGOFFSETMASK);
  2676. _iqk_reload_iqk_setting_8821c(dm, 0, 2);
  2677. _iqk_fill_iqk_report_8821c(dm, 0);
  2678. #if 0
  2679. /*
  2680. RF_DBG(dm, DBG_RF_IQK,
  2681. "[DPK]reload IQK result before, iqk_info->rf_reg18=0x%x, iqk_info->iqk_channel[0]=0x%x, iqk_info->iqk_channel[1]=0x%x!!!!\n",
  2682. iqk_info->rf_reg18, iqk_info->iqk_channel[0], iqk_info->iqk_channel[1]);
  2683. */
  2684. #endif
  2685. /* Restore setup */
  2686. #if 0
  2687. /*_dpk_readsram_8821c(dm, RF_PATH_A);*/
  2688. #endif
  2689. _dpk_restore_8821c(dm, RF_PATH_A);
  2690. odm_set_bb_reg(dm, R_0x8f8, BIT(25) | BIT(24) | BIT(23) | BIT(22), 0x5);
  2691. odm_set_bb_reg(dm, R_0x1bd4, BIT(20) | BIT(19) | BIT(18) | BIT(17) | BIT(16), 0x0);
  2692. odm_set_bb_reg(dm, R_0x1b00, BIT(2) | BIT(1), 0x0);
  2693. odm_set_bb_reg(dm, R_0x1b08, BIT(6) | BIT(5), 0x2);
  2694. odm_write_4byte(dm, 0x1b2c, backup_dpdbb[0]);
  2695. odm_write_4byte(dm, 0x1b38, backup_dpdbb[1]);
  2696. odm_write_4byte(dm, 0x1b3c, backup_dpdbb[2]);
  2697. /*enable DPK*/
  2698. odm_set_bb_reg(dm, R_0x1b2c, BIT(7) | BIT(6) | BIT(5) | BIT(4) | BIT(3) | BIT(2) | BIT(1) | BIT(0), 0x5);
  2699. /*enable boundary condition*/
  2700. #if dpk_forcein_sram4 /* disable : froce in sram4*/
  2701. odm_set_bb_reg(dm, R_0x1bcc, BIT(27), 0x1);
  2702. #endif
  2703. odm_write_4byte(dm, 0x1bcc, 0x11868800);
  2704. RF_DBG(dm, DBG_RF_IQK, "[DPK]In DPD Process(5), Restore\n");
  2705. _iqk_restore_mac_bb_8821c(dm, MAC_backup, BB_backup, backup_mac_reg, backup_bb_reg, DPK_BB_REG_NUM_8821C);
  2706. _iqk_afe_setting_8821c(dm, false);
  2707. _iqk_restore_rf_8821c(dm, backup_rf_reg, RF_backup);
  2708. /*toggle dynamic_pwr_threshold*/
  2709. /* backup the DPK current result*/
  2710. for (i = 0; i < DPK_BACKUP_REG_NUM_8821C; i++)
  2711. dpk_result[i] = odm_read_4byte(dm, backup_dpk_reg[i]);
  2712. RF_DBG(dm, DBG_RF_IQK,
  2713. "[DPK]the DPD calibration Process Finish (6), 0x1bd0 = 0x%x, 0x1b98 = 0x%x, 0x1bbc0= 0x%x\n",
  2714. dpk_result[0], dpk_result[1], dpk_result[2]);
  2715. }
  2716. u32 _iqk_tximr_selfcheck_8821c(void *dm_void, u8 tone_index, u8 path)
  2717. {
  2718. u32 tx_ini_power_H[2], tx_ini_power_L[2];
  2719. u32 tmp1, tmp2, tmp3, tmp4, tmp5;
  2720. u32 IQK_CMD;
  2721. u32 tximr = 0x0;
  2722. u8 i;
  2723. struct dm_struct *dm = (struct dm_struct *)dm_void;
  2724. /*backup*/
  2725. odm_write_4byte(dm, 0x1b00, 0xf8000008 | path << 1);
  2726. odm_write_4byte(dm, 0x1bc8, 0x80000000);
  2727. odm_write_4byte(dm, 0x8f8, 0x41400080);
  2728. tmp1 = odm_read_4byte(dm, 0x1b0c);
  2729. tmp2 = odm_read_4byte(dm, 0x1b14);
  2730. tmp3 = odm_read_4byte(dm, 0x1b1c);
  2731. tmp4 = odm_read_4byte(dm, 0x1b20);
  2732. tmp5 = odm_read_4byte(dm, 0x1b24);
  2733. /*setup*/
  2734. odm_write_4byte(dm, 0x1b0c, 0x00003000);
  2735. odm_write_4byte(dm, 0x1b1c, 0xA2193C32);
  2736. odm_write_1byte(dm, 0x1b15, 0x00);
  2737. odm_write_4byte(dm, 0x1b20, (u32)(tone_index << 20 | 0x00040008));
  2738. odm_write_4byte(dm, 0x1b24, (u32)(tone_index << 20 | 0x00060008));
  2739. odm_write_4byte(dm, 0x1b2c, 0x07);
  2740. odm_write_4byte(dm, 0x1b38, 0x20000000);
  2741. odm_write_4byte(dm, 0x1b3c, 0x20000000);
  2742. /* ======derive pwr1========*/
  2743. for (i = 0; i < 2; i++) {
  2744. if (i == 0)
  2745. odm_write_4byte(dm, 0x1bcc, 0x0f);
  2746. else
  2747. odm_write_4byte(dm, 0x1bcc, 0x09);
  2748. /* One Shot*/
  2749. IQK_CMD = 0x00000800;
  2750. odm_write_4byte(dm, 0x1b34, IQK_CMD + 1);
  2751. odm_write_4byte(dm, 0x1b34, IQK_CMD);
  2752. ODM_delay_ms(1);
  2753. odm_write_4byte(dm, 0x1bd4, 0x00040001);
  2754. tx_ini_power_H[i] = odm_read_4byte(dm, 0x1bfc);
  2755. odm_write_4byte(dm, 0x1bd4, 0x000C0001);
  2756. tx_ini_power_L[i] = odm_read_4byte(dm, 0x1bfc);
  2757. }
  2758. /*restore*/
  2759. odm_write_4byte(dm, 0x1b0c, tmp1);
  2760. odm_write_4byte(dm, 0x1b14, tmp2);
  2761. odm_write_4byte(dm, 0x1b1c, tmp3);
  2762. odm_write_4byte(dm, 0x1b20, tmp4);
  2763. odm_write_4byte(dm, 0x1b24, tmp5);
  2764. if (tx_ini_power_H[1] == tx_ini_power_H[0])
  2765. tximr = (3 * (halrf_psd_log2base(tx_ini_power_L[0] << 2) - halrf_psd_log2base(tx_ini_power_L[1]))) / 100;
  2766. else
  2767. tximr = 0;
  2768. return tximr;
  2769. }
  2770. u32 _iqk_rximr_selfcheck_8821c(void *dm_void, u8 tone_index, u8 path,
  2771. u32 tmp1b38)
  2772. {
  2773. u32 rx_ini_power_H[2], rx_ini_power_L[2]; /*[0]: psd tone; [1]: image tone*/
  2774. u32 tmp1, tmp2, tmp3, tmp4, tmp5;
  2775. u32 IQK_CMD, tmp1bcc;
  2776. u8 i;
  2777. u32 rximr = 0x0;
  2778. struct dm_struct *dm = (struct dm_struct *)dm_void;
  2779. /*backup*/
  2780. odm_write_4byte(dm, 0x1b00, 0xf8000008 | path << 1);
  2781. tmp1 = odm_read_4byte(dm, 0x1b0c);
  2782. tmp2 = odm_read_4byte(dm, 0x1b14);
  2783. tmp3 = odm_read_4byte(dm, 0x1b1c);
  2784. tmp4 = odm_read_4byte(dm, 0x1b20);
  2785. tmp5 = odm_read_4byte(dm, 0x1b24);
  2786. tmp1bcc = (odm_read_4byte(dm, 0x1be8) & 0x0000ff00) >> 8;
  2787. odm_write_4byte(dm, 0x1b0c, 0x00001000);
  2788. odm_write_1byte(dm, 0x1b15, 0x00);
  2789. odm_write_4byte(dm, 0x1b1c, 0x82193d31);
  2790. odm_write_4byte(dm, 0x1b20, (u32)(tone_index << 20 | 0x00040008));
  2791. odm_write_4byte(dm, 0x1b24, (u32)(tone_index << 20 | 0x00060048));
  2792. odm_write_4byte(dm, 0x1b2c, 0x07);
  2793. #if 0
  2794. //odm_write_4byte(dm, 0x1b38, iqk_info->rxk1_tmp1b38[path][(tone_index&0xff0)>>4]);
  2795. #endif
  2796. odm_write_4byte(dm, 0x1b38, tmp1b38);
  2797. odm_write_4byte(dm, 0x1b3c, 0x20000000);
  2798. odm_write_4byte(dm, 0x1bcc, tmp1bcc);
  2799. for (i = 0; i < 2; i++) {
  2800. if (i == 0)
  2801. odm_write_4byte(dm, 0x1b1c, 0x82193d31);
  2802. else
  2803. odm_write_4byte(dm, 0x1b1c, 0xA2193d31);
  2804. IQK_CMD = 0x00000800;
  2805. odm_write_4byte(dm, 0x1b34, IQK_CMD + 1);
  2806. odm_write_4byte(dm, 0x1b34, IQK_CMD);
  2807. ODM_delay_us(2000);
  2808. odm_write_1byte(dm, 0x1bd6, 0xb);
  2809. #if 0
  2810. /*if ((boolean)odm_get_bb_reg(dm, R_0x1bfc, BIT(1))){*/
  2811. #endif
  2812. if (1) {
  2813. odm_write_1byte(dm, 0x1bd6, 0x5);
  2814. rx_ini_power_H[i] = odm_read_4byte(dm, 0x1bfc);
  2815. odm_write_1byte(dm, 0x1bd6, 0xe);
  2816. rx_ini_power_L[i] = odm_read_4byte(dm, 0x1bfc);
  2817. } else {
  2818. rx_ini_power_H[i] = 0x0;
  2819. rx_ini_power_L[i] = 0x0;
  2820. }
  2821. }
  2822. /*restore*/
  2823. odm_write_4byte(dm, 0x1b0c, tmp1);
  2824. odm_write_4byte(dm, 0x1b14, tmp2);
  2825. odm_write_4byte(dm, 0x1b1c, tmp3);
  2826. odm_write_4byte(dm, 0x1b20, tmp4);
  2827. odm_write_4byte(dm, 0x1b24, tmp5);
  2828. for (i = 0; i < 2; i++)
  2829. rx_ini_power_H[i] = (rx_ini_power_H[i] & 0xf8000000) >> 27;
  2830. if (rx_ini_power_H[0] != rx_ini_power_H[1])
  2831. switch (rx_ini_power_H[0]) {
  2832. case 1:
  2833. rx_ini_power_L[0] = (u32)((rx_ini_power_L[0] >> 1) | 0x80000000);
  2834. rx_ini_power_L[1] = (u32)rx_ini_power_L[1] >> 1;
  2835. break;
  2836. case 2:
  2837. rx_ini_power_L[0] = (u32)((rx_ini_power_L[0] >> 2) | 0x80000000);
  2838. rx_ini_power_L[1] = (u32)rx_ini_power_L[1] >> 2;
  2839. break;
  2840. case 3:
  2841. rx_ini_power_L[0] = (u32)((rx_ini_power_L[0] >> 2) | 0xc0000000);
  2842. rx_ini_power_L[1] = (u32)rx_ini_power_L[1] >> 2;
  2843. break;
  2844. case 4:
  2845. rx_ini_power_L[0] = (u32)((rx_ini_power_L[0] >> 3) | 0x80000000);
  2846. rx_ini_power_L[1] = (u32)rx_ini_power_L[1] >> 3;
  2847. break;
  2848. case 5:
  2849. rx_ini_power_L[0] = (u32)((rx_ini_power_L[0] >> 3) | 0xa0000000);
  2850. rx_ini_power_L[1] = (u32)rx_ini_power_L[1] >> 3;
  2851. break;
  2852. case 6:
  2853. rx_ini_power_L[0] = (u32)((rx_ini_power_L[0] >> 3) | 0xc0000000);
  2854. rx_ini_power_L[1] = (u32)rx_ini_power_L[1] >> 3;
  2855. break;
  2856. case 7:
  2857. rx_ini_power_L[0] = (u32)((rx_ini_power_L[0] >> 3) | 0xe0000000);
  2858. rx_ini_power_L[1] = (u32)rx_ini_power_L[1] >> 3;
  2859. break;
  2860. default:
  2861. break;
  2862. }
  2863. rximr = (u32)(3 * ((halrf_psd_log2base(rx_ini_power_L[0] / 100) - halrf_psd_log2base(rx_ini_power_L[1] / 100))) / 100);
  2864. #if 0
  2865. /*
  2866. RF_DBG(dm, DBG_RF_IQK, "%-20s: 0x%x, 0x%x, 0x%x, 0x%x,0x%x, tone_index=%x, rximr= %d\n",
  2867. (path == 0) ? "PATH A RXIMR ": "PATH B RXIMR",
  2868. rx_ini_power_H[0], rx_ini_power_L[0], rx_ini_power_H[1], rx_ini_power_L[1], tmp1bcc, tone_index, rximr);
  2869. */
  2870. #endif
  2871. return rximr;
  2872. }
  2873. void _iqk_start_imr_test_8821c(void *dm_void, u8 path)
  2874. {
  2875. u8 imr_limit, i, tone_index;
  2876. u32 tmp;
  2877. boolean KFAIL;
  2878. u32 rxk1_tmp1b38[2][15];
  2879. u32 imr_result[2];
  2880. struct dm_struct *dm = (struct dm_struct *)dm_void;
  2881. /*TX IMR*/
  2882. if (*dm->band_width == 2)
  2883. imr_limit = 0xe;
  2884. else if (*dm->band_width == 1)
  2885. imr_limit = 0x7;
  2886. else
  2887. imr_limit = 0x3;
  2888. _iqk_txk_setting_8821c(dm, RF_PATH_A);
  2889. KFAIL = _iqk_one_shot_8821c(dm, RF_PATH_A, TXIQK);
  2890. for (i = 0x0; i <= imr_limit; i++) {
  2891. tone_index = (u8)(0x08 | i << 4);
  2892. imr_result[RF_PATH_A] = _iqk_tximr_selfcheck_8821c(dm, tone_index, RF_PATH_A);
  2893. RF_DBG(dm, DBG_RF_IQK, "[IQK]toneindex = %x, TXIMR = %d\n",
  2894. tone_index, imr_result[RF_PATH_A]);
  2895. }
  2896. RF_DBG(dm, DBG_RF_IQK, "\n");
  2897. /*RX IMR*/
  2898. /*get the rxk1 tone index 0x1b38 setting*/
  2899. _iqk_rxk1setting_8821c(dm, path);
  2900. tmp = odm_read_4byte(dm, 0x1b1c);
  2901. for (path = 0; path < SS_8821C; path++) {
  2902. for (i = 0; i <= imr_limit; i++) {
  2903. tone_index = (u8)(0x08 | i << 4);
  2904. KFAIL = _iqk_rx_iqk_gain_search_fail_by_toneindex_8821c(dm, path, RXIQK1, tone_index);
  2905. if (!KFAIL) {
  2906. odm_write_4byte(dm, 0x1b1c, 0xa2193c32);
  2907. odm_write_4byte(dm, 0x1b14, 0xe5);
  2908. odm_write_4byte(dm, 0x1b14, 0x0);
  2909. rxk1_tmp1b38[path][i] = odm_read_4byte(dm, 0x1b38);
  2910. } else {
  2911. rxk1_tmp1b38[path][i] = 0x0;
  2912. }
  2913. }
  2914. }
  2915. _iqk_rxk2setting_8821c(dm, path, true);
  2916. for (path = 0; path < SS_8821C; path++) {
  2917. for (i = 0x0; i <= imr_limit; i++) {
  2918. tone_index = (u8)(0x08 | i << 4);
  2919. imr_result[RF_PATH_A] = _iqk_rximr_selfcheck_8821c(dm, tone_index, RF_PATH_A, rxk1_tmp1b38[path][i]);
  2920. RF_DBG(dm, DBG_RF_IQK,
  2921. "[IQK]toneindex = %x, RXIMR = %d\n", tone_index,
  2922. imr_result[RF_PATH_A]);
  2923. }
  2924. }
  2925. odm_write_4byte(dm, 0x1b1c, tmp);
  2926. odm_write_4byte(dm, 0x1b38, 0x20000000);
  2927. }
  2928. void _phy_iq_calibrate_8821c(struct dm_struct *dm, boolean reset,
  2929. boolean segment_iqk, boolean do_imr_test)
  2930. {
  2931. u32 MAC_backup[MAC_REG_NUM_8821C], BB_backup[BB_REG_NUM_8821C];
  2932. u32 RF_backup[RF_REG_NUM_8821C][1];
  2933. u32 backup_mac_reg[MAC_REG_NUM_8821C] = {0x520, 0x550, 0x1518};
  2934. u32 backup_bb_reg[BB_REG_NUM_8821C] = {0x808, 0x90c, 0xc00, 0xcb0,
  2935. 0xcb4, 0xcbc, 0x1990,
  2936. 0x9a4, 0xa04, 0x838};
  2937. u32 backup_rf_reg[RF_REG_NUM_8821C] = {0xdf, 0xde, 0x8f, 0x0, 0x1};
  2938. boolean is_mp = false;
  2939. struct dm_iqk_info *iqk_info = &dm->IQK_info;
  2940. if (*dm->mp_mode)
  2941. is_mp = true;
  2942. else if (dm->is_linked)
  2943. segment_iqk = false;
  2944. iqk_info->is_btg = (boolean)odm_get_bb_reg(dm, R_0xcb8, BIT(16));
  2945. if (!is_mp)
  2946. if (_iqk_reload_iqk_8821c(dm, reset))
  2947. return;
  2948. if (!do_imr_test)
  2949. RF_DBG(dm, DBG_RF_IQK,
  2950. "[IQK]==========IQK strat!!!!!==========\n");
  2951. RF_DBG(dm, DBG_RF_IQK,
  2952. "[IQK]band_type = %s, band_width = %d, ExtPA2G = %d, ext_pa_5g = %d\n",
  2953. (*dm->band_type == ODM_BAND_5G) ? "5G" : "2G", *dm->band_width,
  2954. dm->ext_pa, dm->ext_pa_5g);
  2955. RF_DBG(dm, DBG_RF_IQK, "[IQK]Interface = %d, cut_version = %x\n",
  2956. dm->support_interface, dm->cut_version);
  2957. iqk_info->tmp_gntwl = _iqk_indirect_read_reg(dm, 0x38);
  2958. iqk_info->iqk_times++;
  2959. iqk_info->kcount = 0;
  2960. dm->rf_calibrate_info.iqk_total_progressing_time = 0;
  2961. dm->rf_calibrate_info.iqk_step = 1;
  2962. iqk_info->rxiqk_step = 1;
  2963. iqk_info->is_reload = false;
  2964. _iqk_backup_iqk_8821c(dm, 0x0, 0x0);
  2965. _iqk_backup_mac_bb_8821c(dm, MAC_backup, BB_backup, backup_mac_reg, backup_bb_reg, BB_REG_NUM_8821C);
  2966. _iqk_backup_rf_8821c(dm, RF_backup, backup_rf_reg);
  2967. while (1) {
  2968. if (!is_mp)
  2969. dm->rf_calibrate_info.iqk_start_time = odm_get_current_time(dm);
  2970. _iqk_configure_macbb_8821c(dm);
  2971. _iqk_afe_setting_8821c(dm, true);
  2972. _iqk_rfe_setting_8821c(dm, false);
  2973. _iqk_agc_bnd_int_8821c(dm);
  2974. _iqk_rfsetting_8821c(dm);
  2975. if (do_imr_test) {
  2976. _iqk_start_imr_test_8821c(dm, 0x0);
  2977. dm->rf_calibrate_info.iqk_step = 4;
  2978. } else {
  2979. _iqk_start_iqk_8821c(dm, segment_iqk);
  2980. }
  2981. _iqk_afe_setting_8821c(dm, false);
  2982. _iqk_restore_mac_bb_8821c(dm, MAC_backup, BB_backup, backup_mac_reg, backup_bb_reg, BB_REG_NUM_8821C);
  2983. _iqk_restore_rf_8821c(dm, backup_rf_reg, RF_backup);
  2984. if (!is_mp) {
  2985. dm->rf_calibrate_info.iqk_progressing_time = odm_get_progressing_time(dm, dm->rf_calibrate_info.iqk_start_time);
  2986. dm->rf_calibrate_info.iqk_total_progressing_time += odm_get_progressing_time(dm, dm->rf_calibrate_info.iqk_start_time);
  2987. RF_DBG(dm, DBG_RF_IQK,
  2988. "[IQK]IQK progressing_time = %lld ms\n",
  2989. dm->rf_calibrate_info.iqk_progressing_time);
  2990. }
  2991. if (dm->rf_calibrate_info.iqk_step == 4)
  2992. break;
  2993. iqk_info->kcount = 0;
  2994. RF_DBG(dm, DBG_RF_IQK, "[IQK]delay 50ms!!!\n");
  2995. #if 0
  2996. /*ODM_sleep_ms(50);*/
  2997. #endif
  2998. ODM_delay_ms(50);
  2999. }
  3000. if (!do_imr_test) {
  3001. if (segment_iqk)
  3002. _iqk_reload_iqk_setting_8821c(dm, 0x0, 0x1);
  3003. _iqk_fill_iqk_report_8821c(dm, 0);
  3004. if (!is_mp)
  3005. RF_DBG(dm, DBG_RF_IQK,
  3006. "[IQK]Total IQK progressing_time = %lld ms\n",
  3007. dm->rf_calibrate_info.iqk_total_progressing_time)
  3008. ;
  3009. RF_DBG(dm, DBG_RF_IQK,
  3010. "[IQK]==========IQK end!!!!!==========\n");
  3011. RF_DBG(dm, DBG_RF_IQK, "[IQK]check 0x49c = %x\n",
  3012. odm_read_1byte(dm, 0x49c));
  3013. }
  3014. }
  3015. void _phy_iq_calibrate_by_fw_8821c(void *dm_void, u8 clear, u8 segment_iqk)
  3016. {
  3017. struct dm_struct *dm = (struct dm_struct *)dm_void;
  3018. enum hal_status status = HAL_STATUS_FAILURE;
  3019. if (*dm->mp_mode)
  3020. clear = 0x1;
  3021. else if (dm->is_linked)
  3022. segment_iqk = 0x1;
  3023. status = odm_iq_calibrate_by_fw(dm, clear, segment_iqk);
  3024. if (status == HAL_STATUS_SUCCESS)
  3025. RF_DBG(dm, DBG_RF_IQK, "[IQK]FWIQK OK!!!\n");
  3026. else
  3027. RF_DBG(dm, DBG_RF_IQK, "[IQK]FWIQK fail!!!\n");
  3028. }
  3029. /*********debug message start**************/
  3030. void _phy_iqk_XYM_Read_Using_0x1b38_8821c(struct dm_struct *dm, u8 path)
  3031. {
  3032. u32 tmp = 0x0;
  3033. u32 tmp2;
  3034. u8 i;
  3035. tmp = odm_read_4byte(dm, 0x1b1c);
  3036. odm_write_4byte(dm, 0x1b1c, 0xA2193C32);
  3037. RF_DBG(dm, DBG_RF_IQK, "\n");
  3038. for (i = 0; i < 0xa; i++) {
  3039. odm_write_4byte(dm, 0x1b14, 0xe6 + i);
  3040. odm_write_4byte(dm, 0x1b14, 0x0);
  3041. tmp2 = odm_read_4byte(dm, 0x1b38);
  3042. RF_DBG(dm, DBG_RF_IQK, "%x\n", tmp2);
  3043. }
  3044. odm_write_4byte(dm, 0x1b1c, tmp);
  3045. RF_DBG(dm, DBG_RF_IQK, "\n");
  3046. odm_write_4byte(dm, 0x1b38, 0x20000000);
  3047. }
  3048. void _phy_iqk_debug_inner_lpbk_psd_8821c(struct dm_struct *dm, u8 path)
  3049. {
  3050. s16 tx_x;
  3051. s16 tx_y;
  3052. u32 temp = 0x0;
  3053. u32 psd_pwr = 0x0;
  3054. u32 tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp8, tmp9, tmp10;
  3055. tmp1 = odm_read_4byte(dm, 0x1b20);
  3056. tmp2 = odm_read_4byte(dm, 0x1b24);
  3057. tmp3 = odm_read_4byte(dm, 0x1b15);
  3058. tmp4 = odm_read_4byte(dm, 0x1b18);
  3059. tmp5 = odm_read_4byte(dm, 0x1b1c);
  3060. tmp6 = odm_read_4byte(dm, 0x1b28);
  3061. tmp7 = odm_read_4byte(dm, 0x1b90);
  3062. tmp8 = odm_read_4byte(dm, 0x1bcc);
  3063. tmp9 = odm_read_4byte(dm, 0x1b2c);
  3064. tmp10 = odm_read_4byte(dm, 0x1b30);
  3065. odm_write_4byte(dm, 0x1b20, 0x03840008);
  3066. odm_write_4byte(dm, 0x1b24, 0x03860008);
  3067. odm_write_1byte(dm, 0x1b15, 0x00);
  3068. odm_write_4byte(dm, 0x1b18, 0x00010101);
  3069. odm_write_4byte(dm, 0x1b1c, 0x02effcb2);
  3070. odm_write_4byte(dm, 0x1b28, 0x00060c00);
  3071. odm_write_4byte(dm, 0x1b90, 0x00080003);
  3072. odm_write_4byte(dm, 0x1bcc, 0x00000009);
  3073. odm_write_4byte(dm, 0x1b2c, 0x20000003);
  3074. odm_write_4byte(dm, 0x1b30, 0x20000000);
  3075. RF_DBG(dm, DBG_RF_IQK, "\n");
  3076. for (tx_x = 507; tx_x <= 532; tx_x++) {
  3077. for (tx_y = 0; tx_y <= 10 + 20; tx_y++) {
  3078. if (tx_y < 0)
  3079. temp = (tx_x << 20) | (tx_y + 2048) << 8;
  3080. else
  3081. temp = (tx_x << 20) | (tx_y << 8);
  3082. odm_write_4byte(dm, 0x1b38, temp);
  3083. odm_write_4byte(dm, 0x1b3c, 0x20000000);
  3084. odm_write_4byte(dm, 0x1b34, 0x00000801);
  3085. odm_write_4byte(dm, 0x1b34, 0x00000800);
  3086. ODM_delay_ms(2);
  3087. /*PSD_bef_K*/
  3088. odm_write_4byte(dm, 0x1bd4, 0x000c0001);
  3089. psd_pwr = odm_read_4byte(dm, 0x1bfc);
  3090. RF_DBG(dm, DBG_RF_IQK, "%d ", psd_pwr);
  3091. }
  3092. }
  3093. RF_DBG(dm, DBG_RF_IQK, "\n");
  3094. odm_write_4byte(dm, 0x1b20, tmp1);
  3095. odm_write_4byte(dm, 0x1b24, tmp2);
  3096. odm_write_4byte(dm, 0x1b15, tmp3);
  3097. odm_write_4byte(dm, 0x1b18, tmp4);
  3098. odm_write_4byte(dm, 0x1b1c, tmp5);
  3099. odm_write_4byte(dm, 0x1b28, tmp6);
  3100. odm_write_4byte(dm, 0x1b90, tmp7);
  3101. odm_write_4byte(dm, 0x1bcc, tmp8);
  3102. odm_write_4byte(dm, 0x1b2c, tmp9);
  3103. odm_write_4byte(dm, 0x1b30, tmp10);
  3104. odm_write_4byte(dm, 0x1b38, 0x20000000);
  3105. }
  3106. void _iqk_readsram_8821c(struct dm_struct *dm, u8 path)
  3107. {
  3108. u32 tmp1bd4, tmp1bd8, tmp;
  3109. u8 i;
  3110. tmp1bd4 = odm_read_4byte(dm, 0x1bd4);
  3111. tmp1bd8 = odm_read_4byte(dm, 0x1bd8);
  3112. odm_write_4byte(dm, 0x1bd4, 0x00010001);
  3113. for (i = 0; i < 0x80; i++) {
  3114. odm_write_4byte(dm, 0x1bd8, 0xa0000101 + (u32)(i << 1));
  3115. tmp = (u32)odm_read_4byte(dm, 0x1bfc) & 0x3ff;
  3116. if (i < 0x40)
  3117. RF_DBG(dm, DBG_RF_IQK, "adc_i[%d] = %x\n", i, tmp);
  3118. else
  3119. RF_DBG(dm, DBG_RF_IQK, "adc_q[%d] = %x\n", i, tmp);
  3120. }
  3121. }
  3122. void do_imr_test_8821c(void *dm_void)
  3123. {
  3124. struct dm_struct *dm = (struct dm_struct *)dm_void;
  3125. RF_DBG(dm, DBG_RF_IQK,
  3126. "[IQK] ************IMR Test *****************\n");
  3127. _phy_iq_calibrate_8821c(dm, false, false, true);
  3128. RF_DBG(dm, DBG_RF_IQK,
  3129. "[IQK] **********End IMR Test *******************\n");
  3130. }
  3131. /*********debug message end***************/
  3132. /*IQK version:0x23, NCTL:0x8*/
  3133. /*1. modify the iqk counters for coex.*/
  3134. void phy_iq_calibrate_8821c(void *dm_void, boolean clear, boolean segment_iqk)
  3135. {
  3136. struct dm_struct *dm = (struct dm_struct *)dm_void;
  3137. struct _hal_rf_ *rf = &dm->rf_table;
  3138. if (!(*dm->mp_mode))
  3139. _iqk_check_coex_status(dm, true);
  3140. RF_DBG(dm, DBG_RF_IQK, "[IQK]fw_ver= 0x%x\n", rf->fw_ver);
  3141. if (*dm->mp_mode)
  3142. halrf_iqk_hwtx_check(dm, true);
  3143. /*FW IQK*/
  3144. if (dm->fw_offload_ability & PHYDM_RF_IQK_OFFLOAD) {
  3145. _phy_iq_calibrate_by_fw_8821c(dm, clear, segment_iqk);
  3146. phydm_get_read_counter_8821c(dm);
  3147. RF_DBG(dm, DBG_RF_IQK, "[IQK]0x38= 0x%x\n",
  3148. _iqk_indirect_read_reg(dm, 0x38));
  3149. } else {
  3150. _iq_calibrate_8821c_init(dm);
  3151. _phy_iq_calibrate_8821c(dm, clear, segment_iqk, false);
  3152. }
  3153. _iqk_fail_count_8821c(dm);
  3154. if (*dm->mp_mode)
  3155. halrf_iqk_hwtx_check(dm, false);
  3156. #if (DM_ODM_SUPPORT_TYPE & ODM_AP)
  3157. _iqk_iqk_fail_report_8821c(dm);
  3158. #endif
  3159. halrf_iqk_dbg(dm);
  3160. if (!(*dm->mp_mode))
  3161. _iqk_check_coex_status(dm, false);
  3162. RF_DBG(dm, DBG_RF_IQK, "[IQK]final 0x49c = %x\n",
  3163. odm_read_1byte(dm, 0x49c));
  3164. }
  3165. void phy_dp_calibrate_8821c(void *dm_void, boolean clear)
  3166. {
  3167. struct dm_struct *dm = (struct dm_struct *)dm_void;
  3168. struct _hal_rf_ *rf = &dm->rf_table;
  3169. #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN))
  3170. if (odm_check_power_status(dm) == false)
  3171. return;
  3172. #endif
  3173. #if (MP_DRIVER)
  3174. if ((dm->mp_mode != NULL) && (rf->is_con_tx != NULL) && (rf->is_single_tone != NULL) && (rf->is_carrier_suppresion != NULL))
  3175. if (*(dm->mp_mode) && ((*(rf->is_con_tx) || *(rf->is_single_tone) || *(rf->is_carrier_suppresion))))
  3176. return;
  3177. #endif
  3178. #if (DM_ODM_SUPPORT_TYPE == ODM_CE)
  3179. if (!(rf->rf_supportability & HAL_RF_DPK))
  3180. return;
  3181. #endif
  3182. #if DISABLE_BB_RF
  3183. return;
  3184. #endif
  3185. RF_DBG(dm, DBG_RF_IQK, "[DPK] In PHY, dm->dpk_en == %x\n", rf->dpk_en);
  3186. /*if dpk is not enable*/
  3187. if (rf->dpk_en == 0x0)
  3188. return;
  3189. /*start*/
  3190. if (!dm->rf_calibrate_info.is_iqk_in_progress) {
  3191. odm_acquire_spin_lock(dm, RT_IQK_SPINLOCK);
  3192. dm->rf_calibrate_info.is_iqk_in_progress = true;
  3193. odm_release_spin_lock(dm, RT_IQK_SPINLOCK);
  3194. if (*dm->mp_mode)
  3195. dm->rf_calibrate_info.iqk_start_time = odm_get_current_time(dm);
  3196. if (*dm->mp_mode) {
  3197. /*do DPK*/
  3198. _phy_dpd_calibrate_8821c(dm, clear);
  3199. _dpk_toggle_rxagc(dm, clear);
  3200. }
  3201. if (*dm->mp_mode) {
  3202. dm->rf_calibrate_info.iqk_progressing_time = odm_get_progressing_time(dm, dm->rf_calibrate_info.iqk_start_time);
  3203. RF_DBG(dm, DBG_RF_IQK,
  3204. "[DPK]DPK progressing_time = %lld ms\n",
  3205. dm->rf_calibrate_info.iqk_progressing_time);
  3206. }
  3207. odm_acquire_spin_lock(dm, RT_IQK_SPINLOCK);
  3208. dm->rf_calibrate_info.is_iqk_in_progress = false;
  3209. odm_release_spin_lock(dm, RT_IQK_SPINLOCK);
  3210. } else {
  3211. RF_DBG(dm, DBG_RF_IQK,
  3212. "[DPK]== Return the DPK CMD, because the DPK in Progress ==\n");
  3213. }
  3214. }
  3215. void phy_txtap_calibrate_8821c(void *dm_void, boolean clear)
  3216. {
  3217. u32 MAC_backup[MAC_REG_NUM_8821C], BB_backup[BB_REG_NUM_8821C], RF_backup[RF_REG_NUM_8821C][1];
  3218. u32 backup_mac_reg[MAC_REG_NUM_8821C] = {0x520, 0x550, 0x1518};
  3219. u32 backup_bb_reg[BB_REG_NUM_8821C] = {0x808, 0x90c, 0xc00, 0xcb0, 0xcb4, 0xcbc, 0x1990, 0x9a4, 0xa04};
  3220. u32 backup_rf_reg[RF_REG_NUM_8821C] = {0xdf, 0xde, 0x8f, 0x0, 0x1};
  3221. struct dm_struct *dm = (struct dm_struct *)dm_void;
  3222. struct dm_iqk_info *iqk_info = &dm->IQK_info;
  3223. #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
  3224. struct _ADAPTER *adapter = dm->adapter;
  3225. #if (MP_DRIVER == 1)
  3226. #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
  3227. PMPT_CONTEXT p_mpt_ctx = &(adapter->MptCtx);
  3228. #else
  3229. #ifdef CONFIG_MP_INCLUDED
  3230. PMPT_CONTEXT p_mpt_ctx = &(adapter->mppriv.mpt_ctx);
  3231. #endif
  3232. #endif
  3233. #endif
  3234. struct _hal_rf_ *rf = &dm->rf_table;
  3235. #if (DM_ODM_SUPPORT_TYPE == ODM_CE)
  3236. if (!(rf->rf_supportability & HAL_RF_IQK))
  3237. return;
  3238. #endif
  3239. #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN))
  3240. if (odm_check_power_status(adapter) == false)
  3241. return;
  3242. #endif
  3243. #if MP_DRIVER == 1
  3244. #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
  3245. if (p_mpt_ctx->bSingleTone || p_mpt_ctx->bCarrierSuppression)
  3246. return;
  3247. #else
  3248. #ifdef CONFIG_MP_INCLUDED
  3249. if (p_mpt_ctx->is_single_tone || p_mpt_ctx->is_carrier_suppression)
  3250. return;
  3251. #endif
  3252. #endif
  3253. #endif
  3254. #endif
  3255. if (!(*dm->mp_mode))
  3256. _iqk_check_coex_status(dm, true);
  3257. if ((dm->rf_table.rf_supportability & HAL_RF_TXGAPK))
  3258. if (iqk_info->lok_fail[RF_PATH_A] == 0 &&
  3259. iqk_info->iqk_fail_report[0][RF_PATH_A][TXIQK] == 0 &&
  3260. iqk_info->iqk_fail_report[0][RF_PATH_A][RXIQK] == 0) {
  3261. _iqk_backup_iqk_8821c(dm, 0x0, 0x0);
  3262. _iqk_backup_mac_bb_8821c(dm, MAC_backup, BB_backup, backup_mac_reg, backup_bb_reg, BB_REG_NUM_8821C);
  3263. _iqk_backup_rf_8821c(dm, RF_backup, backup_rf_reg);
  3264. _iqk_configure_macbb_8821c(dm);
  3265. _iqk_afe_setting_8821c(dm, true);
  3266. _iqk_rfe_setting_8821c(dm, false);
  3267. _iqk_agc_bnd_int_8821c(dm);
  3268. _iqk_rfsetting_8821c(dm);
  3269. _phy_txgapk_calibrate_8821c(dm, RF_PATH_A);
  3270. _iqk_afe_setting_8821c(dm, false);
  3271. _iqk_restore_mac_bb_8821c(dm, MAC_backup, BB_backup, backup_mac_reg, backup_bb_reg, BB_REG_NUM_8821C);
  3272. _iqk_restore_rf_8821c(dm, backup_rf_reg, RF_backup);
  3273. }
  3274. }
  3275. void dpk_temperature_compensate_8821c(void *dm_void)
  3276. {
  3277. struct dm_struct *dm = (struct dm_struct *)dm_void;
  3278. struct _hal_rf_ *rf = &dm->rf_table;
  3279. #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
  3280. void *adapter = dm->adapter;
  3281. HAL_DATA_TYPE *hal_data = GET_HAL_DATA(((PADAPTER)adapter));
  3282. u8 pgthermal = hal_data->eeprom_thermal_meter;
  3283. #else
  3284. struct rtl8192cd_priv *priv = dm->priv;
  3285. u8 pgthermal = (u8)priv->pmib->dot11RFEntry.ther;
  3286. #endif
  3287. static u8 dpk_tm_trigger;
  3288. u8 thermal_value = 0, delta_dpk, i = 0;
  3289. u8 thermal_value_avg_count = 0;
  3290. u8 thermal_value_avg_times = 2;
  3291. u32 thermal_value_avg = 0;
  3292. u8 tmp, abs_temperature;
  3293. /*if dpk is not enable*/
  3294. if (rf->dpk_en == 0x0)
  3295. return;
  3296. /*if ap mode, disable dpk*/
  3297. if (DM_ODM_SUPPORT_TYPE & ODM_AP)
  3298. return;
  3299. if (!dpk_tm_trigger) {
  3300. odm_set_rf_reg(dm, RF_PATH_A, RF_0x42, BIT(17) | BIT(16), 0x03);
  3301. #if 0
  3302. /*RF_DBG(dm, DBG_RF_IQK, "[DPK] (1) Trigger Thermal Meter!!\n");*/
  3303. #endif
  3304. dpk_tm_trigger = 1;
  3305. return;
  3306. }
  3307. /* Initialize */
  3308. dpk_tm_trigger = 0;
  3309. #if 0
  3310. /*RF_DBG(dm, DBG_RF_IQK, "[DPK] (2) calculate the thermal !!\n");
  3311. */
  3312. #endif
  3313. /* calculate average thermal meter */
  3314. thermal_value = (u8)odm_get_rf_reg(dm, RF_PATH_A, RF_0x42, 0xfc00); /*0x42: RF Reg[15:10] 88E*/
  3315. RF_DBG(dm, DBG_RF_IQK, "[DPK] (3) current Thermal Meter = %d\n",
  3316. thermal_value);
  3317. dm->rf_calibrate_info.thermal_value_dpk = thermal_value;
  3318. dm->rf_calibrate_info.thermal_value_avg[dm->rf_calibrate_info.thermal_value_avg_index] = thermal_value;
  3319. dm->rf_calibrate_info.thermal_value_avg_index++;
  3320. if (dm->rf_calibrate_info.thermal_value_avg_index == thermal_value_avg_times)
  3321. dm->rf_calibrate_info.thermal_value_avg_index = 0;
  3322. for (i = 0; i < thermal_value_avg_times; i++) {
  3323. if (dm->rf_calibrate_info.thermal_value_avg[i]) {
  3324. thermal_value_avg += dm->rf_calibrate_info.thermal_value_avg[i];
  3325. thermal_value_avg_count++;
  3326. }
  3327. }
  3328. if (thermal_value_avg_count) /*Calculate Average thermal_value after average enough times*/
  3329. thermal_value = (u8)(thermal_value_avg / thermal_value_avg_count);
  3330. /* compensate the DPK */
  3331. delta_dpk = (thermal_value > pgthermal) ? (thermal_value - pgthermal) : (pgthermal - thermal_value);
  3332. tmp = (u8)((dpk_result[0] & 0x00001f00) >> 8);
  3333. RF_DBG(dm, DBG_RF_IQK,
  3334. "[DPK] (5)delta_dpk = %d, eeprom_thermal_meter = %d, tmp=%d\n",
  3335. delta_dpk, pgthermal, tmp);
  3336. if (thermal_value > pgthermal) {
  3337. abs_temperature = thermal_value - pgthermal;
  3338. if (abs_temperature >= 20)
  3339. tmp = tmp + 4;
  3340. else if (abs_temperature >= 15)
  3341. tmp = tmp + 3;
  3342. else if (abs_temperature >= 10)
  3343. tmp = tmp + 2;
  3344. else if (abs_temperature >= 5)
  3345. tmp = tmp + 1;
  3346. } else { /*low temperature*/
  3347. abs_temperature = pgthermal - thermal_value;
  3348. if (abs_temperature >= 20)
  3349. tmp = tmp - 4;
  3350. else if (abs_temperature >= 15)
  3351. tmp = tmp - 3;
  3352. else if (abs_temperature >= 10)
  3353. tmp = tmp - 2;
  3354. else if (abs_temperature >= 5)
  3355. tmp = tmp - 1;
  3356. }
  3357. odm_set_bb_reg(dm, R_0x1bd0, BIT(12) | BIT(11) | BIT(10) | BIT(9) | BIT(8), tmp);
  3358. RF_DBG(dm, DBG_RF_IQK,
  3359. "[DPK] (6)delta_dpk = %d, eeprom_thermal_meter = %d, new tmp=%d, 0x1bd0=0x%x\n",
  3360. delta_dpk, pgthermal, tmp, odm_read_4byte(dm, 0x1bd0));
  3361. }
  3362. #endif