phy.c 77 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676
  1. /******************************************************************************
  2. *
  3. * Copyright(c) 2009-2010 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. * You should have received a copy of the GNU General Public License along with
  15. * this program; if not, write to the Free Software Foundation, Inc.,
  16. * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  17. *
  18. * The full GNU General Public License is included in this distribution in the
  19. * file called LICENSE.
  20. *
  21. * Contact Information:
  22. * wlanfae <wlanfae@realtek.com>
  23. * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
  24. * Hsinchu 300, Taiwan.
  25. *
  26. * Larry Finger <Larry.Finger@lwfinger.net>
  27. *
  28. *****************************************************************************/
  29. #include "../wifi.h"
  30. #include "../pci.h"
  31. #include "../ps.h"
  32. #include "reg.h"
  33. #include "def.h"
  34. #include "phy.h"
  35. #include "rf.h"
  36. #include "dm.h"
  37. #include "table.h"
  38. static u32 _rtl92c_phy_fw_rf_serial_read(struct ieee80211_hw *hw,
  39. enum radio_path rfpath, u32 offset);
  40. static void _rtl92c_phy_fw_rf_serial_write(struct ieee80211_hw *hw,
  41. enum radio_path rfpath, u32 offset,
  42. u32 data);
  43. static u32 _rtl92c_phy_rf_serial_read(struct ieee80211_hw *hw,
  44. enum radio_path rfpath, u32 offset);
  45. static void _rtl92c_phy_rf_serial_write(struct ieee80211_hw *hw,
  46. enum radio_path rfpath, u32 offset,
  47. u32 data);
  48. static u32 _rtl92c_phy_calculate_bit_shift(u32 bitmask);
  49. static bool _rtl92c_phy_bb8192c_config_parafile(struct ieee80211_hw *hw);
  50. static bool _rtl92c_phy_config_mac_with_headerfile(struct ieee80211_hw *hw);
  51. static bool _rtl92c_phy_config_bb_with_headerfile(struct ieee80211_hw *hw,
  52. u8 configtype);
  53. static bool _rtl92c_phy_config_bb_with_pgheaderfile(struct ieee80211_hw *hw,
  54. u8 configtype);
  55. static void _rtl92c_phy_init_bb_rf_register_definition(struct ieee80211_hw *hw);
  56. static bool _rtl92c_phy_set_sw_chnl_cmdarray(struct swchnlcmd *cmdtable,
  57. u32 cmdtableidx, u32 cmdtablesz,
  58. enum swchnlcmd_id cmdid, u32 para1,
  59. u32 para2, u32 msdelay);
  60. static bool _rtl92c_phy_sw_chnl_step_by_step(struct ieee80211_hw *hw,
  61. u8 channel, u8 *stage, u8 *step,
  62. u32 *delay);
  63. static u8 _rtl92c_phy_dbm_to_txpwr_Idx(struct ieee80211_hw *hw,
  64. enum wireless_mode wirelessmode,
  65. long power_indbm);
  66. static bool _rtl92c_phy_config_rf_external_pa(struct ieee80211_hw *hw,
  67. enum radio_path rfpath);
  68. static long _rtl92c_phy_txpwr_idx_to_dbm(struct ieee80211_hw *hw,
  69. enum wireless_mode wirelessmode,
  70. u8 txpwridx);
  71. u32 rtl92c_phy_query_bb_reg(struct ieee80211_hw *hw, u32 regaddr, u32 bitmask)
  72. {
  73. struct rtl_priv *rtlpriv = rtl_priv(hw);
  74. u32 returnvalue, originalvalue, bitshift;
  75. RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("regaddr(%#x), "
  76. "bitmask(%#x)\n", regaddr,
  77. bitmask));
  78. originalvalue = rtl_read_dword(rtlpriv, regaddr);
  79. bitshift = _rtl92c_phy_calculate_bit_shift(bitmask);
  80. returnvalue = (originalvalue & bitmask) >> bitshift;
  81. RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("BBR MASK=0x%x "
  82. "Addr[0x%x]=0x%x\n", bitmask,
  83. regaddr, originalvalue));
  84. return returnvalue;
  85. }
  86. void rtl92c_phy_set_bb_reg(struct ieee80211_hw *hw,
  87. u32 regaddr, u32 bitmask, u32 data)
  88. {
  89. struct rtl_priv *rtlpriv = rtl_priv(hw);
  90. u32 originalvalue, bitshift;
  91. RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("regaddr(%#x), bitmask(%#x),"
  92. " data(%#x)\n", regaddr, bitmask,
  93. data));
  94. if (bitmask != MASKDWORD) {
  95. originalvalue = rtl_read_dword(rtlpriv, regaddr);
  96. bitshift = _rtl92c_phy_calculate_bit_shift(bitmask);
  97. data = ((originalvalue & (~bitmask)) | (data << bitshift));
  98. }
  99. rtl_write_dword(rtlpriv, regaddr, data);
  100. RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("regaddr(%#x), bitmask(%#x),"
  101. " data(%#x)\n", regaddr, bitmask,
  102. data));
  103. }
  104. u32 rtl92c_phy_query_rf_reg(struct ieee80211_hw *hw,
  105. enum radio_path rfpath, u32 regaddr, u32 bitmask)
  106. {
  107. struct rtl_priv *rtlpriv = rtl_priv(hw);
  108. u32 original_value, readback_value, bitshift;
  109. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  110. unsigned long flags;
  111. RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("regaddr(%#x), "
  112. "rfpath(%#x), bitmask(%#x)\n",
  113. regaddr, rfpath, bitmask));
  114. spin_lock_irqsave(&rtlpriv->locks.rf_lock, flags);
  115. if (rtlphy->rf_mode != RF_OP_BY_FW) {
  116. original_value = _rtl92c_phy_rf_serial_read(hw,
  117. rfpath, regaddr);
  118. } else {
  119. original_value = _rtl92c_phy_fw_rf_serial_read(hw,
  120. rfpath, regaddr);
  121. }
  122. bitshift = _rtl92c_phy_calculate_bit_shift(bitmask);
  123. readback_value = (original_value & bitmask) >> bitshift;
  124. spin_unlock_irqrestore(&rtlpriv->locks.rf_lock, flags);
  125. RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
  126. ("regaddr(%#x), rfpath(%#x), "
  127. "bitmask(%#x), original_value(%#x)\n",
  128. regaddr, rfpath, bitmask, original_value));
  129. return readback_value;
  130. }
  131. void rtl92c_phy_set_rf_reg(struct ieee80211_hw *hw,
  132. enum radio_path rfpath,
  133. u32 regaddr, u32 bitmask, u32 data)
  134. {
  135. struct rtl_priv *rtlpriv = rtl_priv(hw);
  136. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  137. u32 original_value, bitshift;
  138. unsigned long flags;
  139. RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
  140. ("regaddr(%#x), bitmask(%#x), data(%#x), rfpath(%#x)\n",
  141. regaddr, bitmask, data, rfpath));
  142. spin_lock_irqsave(&rtlpriv->locks.rf_lock, flags);
  143. if (rtlphy->rf_mode != RF_OP_BY_FW) {
  144. if (bitmask != RFREG_OFFSET_MASK) {
  145. original_value = _rtl92c_phy_rf_serial_read(hw,
  146. rfpath,
  147. regaddr);
  148. bitshift = _rtl92c_phy_calculate_bit_shift(bitmask);
  149. data =
  150. ((original_value & (~bitmask)) |
  151. (data << bitshift));
  152. }
  153. _rtl92c_phy_rf_serial_write(hw, rfpath, regaddr, data);
  154. } else {
  155. if (bitmask != RFREG_OFFSET_MASK) {
  156. original_value = _rtl92c_phy_fw_rf_serial_read(hw,
  157. rfpath,
  158. regaddr);
  159. bitshift = _rtl92c_phy_calculate_bit_shift(bitmask);
  160. data =
  161. ((original_value & (~bitmask)) |
  162. (data << bitshift));
  163. }
  164. _rtl92c_phy_fw_rf_serial_write(hw, rfpath, regaddr, data);
  165. }
  166. spin_unlock_irqrestore(&rtlpriv->locks.rf_lock, flags);
  167. RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("regaddr(%#x), "
  168. "bitmask(%#x), data(%#x), "
  169. "rfpath(%#x)\n", regaddr,
  170. bitmask, data, rfpath));
  171. }
  172. static u32 _rtl92c_phy_fw_rf_serial_read(struct ieee80211_hw *hw,
  173. enum radio_path rfpath, u32 offset)
  174. {
  175. RT_ASSERT(false, ("deprecated!\n"));
  176. return 0;
  177. }
  178. static void _rtl92c_phy_fw_rf_serial_write(struct ieee80211_hw *hw,
  179. enum radio_path rfpath, u32 offset,
  180. u32 data)
  181. {
  182. RT_ASSERT(false, ("deprecated!\n"));
  183. }
  184. static u32 _rtl92c_phy_rf_serial_read(struct ieee80211_hw *hw,
  185. enum radio_path rfpath, u32 offset)
  186. {
  187. struct rtl_priv *rtlpriv = rtl_priv(hw);
  188. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  189. struct bb_reg_def *pphyreg = &rtlphy->phyreg_def[rfpath];
  190. u32 newoffset;
  191. u32 tmplong, tmplong2;
  192. u8 rfpi_enable = 0;
  193. u32 retvalue;
  194. offset &= 0x3f;
  195. newoffset = offset;
  196. if (RT_CANNOT_IO(hw)) {
  197. RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, ("return all one\n"));
  198. return 0xFFFFFFFF;
  199. }
  200. tmplong = rtl_get_bbreg(hw, RFPGA0_XA_HSSIPARAMETER2, MASKDWORD);
  201. if (rfpath == RF90_PATH_A)
  202. tmplong2 = tmplong;
  203. else
  204. tmplong2 = rtl_get_bbreg(hw, pphyreg->rfhssi_para2, MASKDWORD);
  205. tmplong2 = (tmplong2 & (~BLSSIREADADDRESS)) |
  206. (newoffset << 23) | BLSSIREADEDGE;
  207. rtl_set_bbreg(hw, RFPGA0_XA_HSSIPARAMETER2, MASKDWORD,
  208. tmplong & (~BLSSIREADEDGE));
  209. mdelay(1);
  210. rtl_set_bbreg(hw, pphyreg->rfhssi_para2, MASKDWORD, tmplong2);
  211. mdelay(1);
  212. rtl_set_bbreg(hw, RFPGA0_XA_HSSIPARAMETER2, MASKDWORD,
  213. tmplong | BLSSIREADEDGE);
  214. mdelay(1);
  215. if (rfpath == RF90_PATH_A)
  216. rfpi_enable = (u8) rtl_get_bbreg(hw, RFPGA0_XA_HSSIPARAMETER1,
  217. BIT(8));
  218. else if (rfpath == RF90_PATH_B)
  219. rfpi_enable = (u8) rtl_get_bbreg(hw, RFPGA0_XB_HSSIPARAMETER1,
  220. BIT(8));
  221. if (rfpi_enable)
  222. retvalue = rtl_get_bbreg(hw, pphyreg->rflssi_readbackpi,
  223. BLSSIREADBACKDATA);
  224. else
  225. retvalue = rtl_get_bbreg(hw, pphyreg->rflssi_readback,
  226. BLSSIREADBACKDATA);
  227. RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("RFR-%d Addr[0x%x]=0x%x\n",
  228. rfpath, pphyreg->rflssi_readback,
  229. retvalue));
  230. return retvalue;
  231. }
  232. static void _rtl92c_phy_rf_serial_write(struct ieee80211_hw *hw,
  233. enum radio_path rfpath, u32 offset,
  234. u32 data)
  235. {
  236. u32 data_and_addr;
  237. u32 newoffset;
  238. struct rtl_priv *rtlpriv = rtl_priv(hw);
  239. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  240. struct bb_reg_def *pphyreg = &rtlphy->phyreg_def[rfpath];
  241. if (RT_CANNOT_IO(hw)) {
  242. RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, ("stop\n"));
  243. return;
  244. }
  245. offset &= 0x3f;
  246. newoffset = offset;
  247. data_and_addr = ((newoffset << 20) | (data & 0x000fffff)) & 0x0fffffff;
  248. rtl_set_bbreg(hw, pphyreg->rf3wire_offset, MASKDWORD, data_and_addr);
  249. RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("RFW-%d Addr[0x%x]=0x%x\n",
  250. rfpath, pphyreg->rf3wire_offset,
  251. data_and_addr));
  252. }
  253. static u32 _rtl92c_phy_calculate_bit_shift(u32 bitmask)
  254. {
  255. u32 i;
  256. for (i = 0; i <= 31; i++) {
  257. if (((bitmask >> i) & 0x1) == 1)
  258. break;
  259. }
  260. return i;
  261. }
  262. static void _rtl92c_phy_bb_config_1t(struct ieee80211_hw *hw)
  263. {
  264. rtl_set_bbreg(hw, RFPGA0_TXINFO, 0x3, 0x2);
  265. rtl_set_bbreg(hw, RFPGA1_TXINFO, 0x300033, 0x200022);
  266. rtl_set_bbreg(hw, RCCK0_AFESETTING, MASKBYTE3, 0x45);
  267. rtl_set_bbreg(hw, ROFDM0_TRXPATHENABLE, MASKBYTE0, 0x23);
  268. rtl_set_bbreg(hw, ROFDM0_AGCPARAMETER1, 0x30, 0x1);
  269. rtl_set_bbreg(hw, 0xe74, 0x0c000000, 0x2);
  270. rtl_set_bbreg(hw, 0xe78, 0x0c000000, 0x2);
  271. rtl_set_bbreg(hw, 0xe7c, 0x0c000000, 0x2);
  272. rtl_set_bbreg(hw, 0xe80, 0x0c000000, 0x2);
  273. rtl_set_bbreg(hw, 0xe88, 0x0c000000, 0x2);
  274. }
  275. bool rtl92c_phy_mac_config(struct ieee80211_hw *hw)
  276. {
  277. struct rtl_priv *rtlpriv = rtl_priv(hw);
  278. struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
  279. bool is92c = IS_92C_SERIAL(rtlhal->version);
  280. bool rtstatus = _rtl92c_phy_config_mac_with_headerfile(hw);
  281. if (is92c)
  282. rtl_write_byte(rtlpriv, 0x14, 0x71);
  283. return rtstatus;
  284. }
  285. bool rtl92c_phy_bb_config(struct ieee80211_hw *hw)
  286. {
  287. bool rtstatus = true;
  288. struct rtl_priv *rtlpriv = rtl_priv(hw);
  289. u16 regval;
  290. u32 regvaldw;
  291. u8 b_reg_hwparafile = 1;
  292. _rtl92c_phy_init_bb_rf_register_definition(hw);
  293. regval = rtl_read_word(rtlpriv, REG_SYS_FUNC_EN);
  294. rtl_write_word(rtlpriv, REG_SYS_FUNC_EN,
  295. regval | BIT(13) | BIT(0) | BIT(1));
  296. rtl_write_byte(rtlpriv, REG_AFE_PLL_CTRL, 0x83);
  297. rtl_write_byte(rtlpriv, REG_AFE_PLL_CTRL + 1, 0xdb);
  298. rtl_write_byte(rtlpriv, REG_RF_CTRL, RF_EN | RF_RSTB | RF_SDMRSTB);
  299. rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN,
  300. FEN_PPLL | FEN_PCIEA | FEN_DIO_PCIE |
  301. FEN_BB_GLB_RSTn | FEN_BBRSTB);
  302. rtl_write_byte(rtlpriv, REG_AFE_XTAL_CTRL + 1, 0x80);
  303. regvaldw = rtl_read_dword(rtlpriv, REG_LEDCFG0);
  304. rtl_write_dword(rtlpriv, REG_LEDCFG0, regvaldw | BIT(23));
  305. if (b_reg_hwparafile == 1)
  306. rtstatus = _rtl92c_phy_bb8192c_config_parafile(hw);
  307. return rtstatus;
  308. }
  309. bool rtl92c_phy_rf_config(struct ieee80211_hw *hw)
  310. {
  311. return rtl92c_phy_rf6052_config(hw);
  312. }
  313. static bool _rtl92c_phy_bb8192c_config_parafile(struct ieee80211_hw *hw)
  314. {
  315. struct rtl_priv *rtlpriv = rtl_priv(hw);
  316. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  317. struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
  318. bool rtstatus;
  319. RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, ("==>\n"));
  320. rtstatus = _rtl92c_phy_config_bb_with_headerfile(hw,
  321. BASEBAND_CONFIG_PHY_REG);
  322. if (rtstatus != true) {
  323. RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, ("Write BB Reg Fail!!"));
  324. return false;
  325. }
  326. if (rtlphy->rf_type == RF_1T2R) {
  327. _rtl92c_phy_bb_config_1t(hw);
  328. RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, ("Config to 1T!!\n"));
  329. }
  330. if (rtlefuse->autoload_failflag == false) {
  331. rtlphy->pwrgroup_cnt = 0;
  332. rtstatus = _rtl92c_phy_config_bb_with_pgheaderfile(hw,
  333. BASEBAND_CONFIG_PHY_REG);
  334. }
  335. if (rtstatus != true) {
  336. RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, ("BB_PG Reg Fail!!"));
  337. return false;
  338. }
  339. rtstatus = _rtl92c_phy_config_bb_with_headerfile(hw,
  340. BASEBAND_CONFIG_AGC_TAB);
  341. if (rtstatus != true) {
  342. RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, ("AGC Table Fail\n"));
  343. return false;
  344. }
  345. rtlphy->bcck_high_power = (bool) (rtl_get_bbreg(hw,
  346. RFPGA0_XA_HSSIPARAMETER2,
  347. 0x200));
  348. return true;
  349. }
  350. static bool _rtl92c_phy_config_mac_with_headerfile(struct ieee80211_hw *hw)
  351. {
  352. struct rtl_priv *rtlpriv = rtl_priv(hw);
  353. u32 i;
  354. u32 arraylength;
  355. u32 *ptrarray;
  356. RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, ("Read Rtl819XMACPHY_Array\n"));
  357. arraylength = MAC_2T_ARRAYLENGTH;
  358. ptrarray = RTL8192CEMAC_2T_ARRAY;
  359. RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
  360. ("Img:RTL8192CEMAC_2T_ARRAY\n"));
  361. for (i = 0; i < arraylength; i = i + 2)
  362. rtl_write_byte(rtlpriv, ptrarray[i], (u8) ptrarray[i + 1]);
  363. return true;
  364. }
  365. void rtl92c_phy_config_bb_external_pa(struct ieee80211_hw *hw)
  366. {
  367. }
  368. static bool _rtl92c_phy_config_bb_with_headerfile(struct ieee80211_hw *hw,
  369. u8 configtype)
  370. {
  371. int i;
  372. u32 *phy_regarray_table;
  373. u32 *agctab_array_table;
  374. u16 phy_reg_arraylen, agctab_arraylen;
  375. struct rtl_priv *rtlpriv = rtl_priv(hw);
  376. struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
  377. if (IS_92C_SERIAL(rtlhal->version)) {
  378. agctab_arraylen = AGCTAB_2TARRAYLENGTH;
  379. agctab_array_table = RTL8192CEAGCTAB_2TARRAY;
  380. phy_reg_arraylen = PHY_REG_2TARRAY_LENGTH;
  381. phy_regarray_table = RTL8192CEPHY_REG_2TARRAY;
  382. } else {
  383. agctab_arraylen = AGCTAB_1TARRAYLENGTH;
  384. agctab_array_table = RTL8192CEAGCTAB_1TARRAY;
  385. phy_reg_arraylen = PHY_REG_1TARRAY_LENGTH;
  386. phy_regarray_table = RTL8192CEPHY_REG_1TARRAY;
  387. }
  388. if (configtype == BASEBAND_CONFIG_PHY_REG) {
  389. for (i = 0; i < phy_reg_arraylen; i = i + 2) {
  390. if (phy_regarray_table[i] == 0xfe)
  391. mdelay(50);
  392. else if (phy_regarray_table[i] == 0xfd)
  393. mdelay(5);
  394. else if (phy_regarray_table[i] == 0xfc)
  395. mdelay(1);
  396. else if (phy_regarray_table[i] == 0xfb)
  397. udelay(50);
  398. else if (phy_regarray_table[i] == 0xfa)
  399. udelay(5);
  400. else if (phy_regarray_table[i] == 0xf9)
  401. udelay(1);
  402. rtl_set_bbreg(hw, phy_regarray_table[i], MASKDWORD,
  403. phy_regarray_table[i + 1]);
  404. udelay(1);
  405. RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
  406. ("The phy_regarray_table[0] is %x"
  407. " Rtl819XPHY_REGArray[1] is %x\n",
  408. phy_regarray_table[i],
  409. phy_regarray_table[i + 1]));
  410. }
  411. rtl92c_phy_config_bb_external_pa(hw);
  412. } else if (configtype == BASEBAND_CONFIG_AGC_TAB) {
  413. for (i = 0; i < agctab_arraylen; i = i + 2) {
  414. rtl_set_bbreg(hw, agctab_array_table[i], MASKDWORD,
  415. agctab_array_table[i + 1]);
  416. udelay(1);
  417. RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
  418. ("The agctab_array_table[0] is "
  419. "%x Rtl819XPHY_REGArray[1] is %x\n",
  420. agctab_array_table[i],
  421. agctab_array_table[i + 1]));
  422. }
  423. }
  424. return true;
  425. }
  426. static void _rtl92c_store_pwrIndex_diffrate_offset(struct ieee80211_hw *hw,
  427. u32 regaddr, u32 bitmask,
  428. u32 data)
  429. {
  430. struct rtl_priv *rtlpriv = rtl_priv(hw);
  431. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  432. if (regaddr == RTXAGC_A_RATE18_06) {
  433. rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][0] =
  434. data;
  435. RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
  436. ("MCSTxPowerLevelOriginalOffset[%d][0] = 0x%x\n",
  437. rtlphy->pwrgroup_cnt,
  438. rtlphy->mcs_txpwrlevel_origoffset[rtlphy->
  439. pwrgroup_cnt][0]));
  440. }
  441. if (regaddr == RTXAGC_A_RATE54_24) {
  442. rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][1] =
  443. data;
  444. RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
  445. ("MCSTxPowerLevelOriginalOffset[%d][1] = 0x%x\n",
  446. rtlphy->pwrgroup_cnt,
  447. rtlphy->mcs_txpwrlevel_origoffset[rtlphy->
  448. pwrgroup_cnt][1]));
  449. }
  450. if (regaddr == RTXAGC_A_CCK1_MCS32) {
  451. rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][6] =
  452. data;
  453. RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
  454. ("MCSTxPowerLevelOriginalOffset[%d][6] = 0x%x\n",
  455. rtlphy->pwrgroup_cnt,
  456. rtlphy->mcs_txpwrlevel_origoffset[rtlphy->
  457. pwrgroup_cnt][6]));
  458. }
  459. if (regaddr == RTXAGC_B_CCK11_A_CCK2_11 && bitmask == 0xffffff00) {
  460. rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][7] =
  461. data;
  462. RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
  463. ("MCSTxPowerLevelOriginalOffset[%d][7] = 0x%x\n",
  464. rtlphy->pwrgroup_cnt,
  465. rtlphy->mcs_txpwrlevel_origoffset[rtlphy->
  466. pwrgroup_cnt][7]));
  467. }
  468. if (regaddr == RTXAGC_A_MCS03_MCS00) {
  469. rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][2] =
  470. data;
  471. RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
  472. ("MCSTxPowerLevelOriginalOffset[%d][2] = 0x%x\n",
  473. rtlphy->pwrgroup_cnt,
  474. rtlphy->mcs_txpwrlevel_origoffset[rtlphy->
  475. pwrgroup_cnt][2]));
  476. }
  477. if (regaddr == RTXAGC_A_MCS07_MCS04) {
  478. rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][3] =
  479. data;
  480. RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
  481. ("MCSTxPowerLevelOriginalOffset[%d][3] = 0x%x\n",
  482. rtlphy->pwrgroup_cnt,
  483. rtlphy->mcs_txpwrlevel_origoffset[rtlphy->
  484. pwrgroup_cnt][3]));
  485. }
  486. if (regaddr == RTXAGC_A_MCS11_MCS08) {
  487. rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][4] =
  488. data;
  489. RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
  490. ("MCSTxPowerLevelOriginalOffset[%d][4] = 0x%x\n",
  491. rtlphy->pwrgroup_cnt,
  492. rtlphy->mcs_txpwrlevel_origoffset[rtlphy->
  493. pwrgroup_cnt][4]));
  494. }
  495. if (regaddr == RTXAGC_A_MCS15_MCS12) {
  496. rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][5] =
  497. data;
  498. RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
  499. ("MCSTxPowerLevelOriginalOffset[%d][5] = 0x%x\n",
  500. rtlphy->pwrgroup_cnt,
  501. rtlphy->mcs_txpwrlevel_origoffset[rtlphy->
  502. pwrgroup_cnt][5]));
  503. }
  504. if (regaddr == RTXAGC_B_RATE18_06) {
  505. rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][8] =
  506. data;
  507. RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
  508. ("MCSTxPowerLevelOriginalOffset[%d][8] = 0x%x\n",
  509. rtlphy->pwrgroup_cnt,
  510. rtlphy->mcs_txpwrlevel_origoffset[rtlphy->
  511. pwrgroup_cnt][8]));
  512. }
  513. if (regaddr == RTXAGC_B_RATE54_24) {
  514. rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][9] =
  515. data;
  516. RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
  517. ("MCSTxPowerLevelOriginalOffset[%d][9] = 0x%x\n",
  518. rtlphy->pwrgroup_cnt,
  519. rtlphy->mcs_txpwrlevel_origoffset[rtlphy->
  520. pwrgroup_cnt][9]));
  521. }
  522. if (regaddr == RTXAGC_B_CCK1_55_MCS32) {
  523. rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][14] =
  524. data;
  525. RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
  526. ("MCSTxPowerLevelOriginalOffset[%d][14] = 0x%x\n",
  527. rtlphy->pwrgroup_cnt,
  528. rtlphy->mcs_txpwrlevel_origoffset[rtlphy->
  529. pwrgroup_cnt][14]));
  530. }
  531. if (regaddr == RTXAGC_B_CCK11_A_CCK2_11 && bitmask == 0x000000ff) {
  532. rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][15] =
  533. data;
  534. RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
  535. ("MCSTxPowerLevelOriginalOffset[%d][15] = 0x%x\n",
  536. rtlphy->pwrgroup_cnt,
  537. rtlphy->mcs_txpwrlevel_origoffset[rtlphy->
  538. pwrgroup_cnt][15]));
  539. }
  540. if (regaddr == RTXAGC_B_MCS03_MCS00) {
  541. rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][10] =
  542. data;
  543. RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
  544. ("MCSTxPowerLevelOriginalOffset[%d][10] = 0x%x\n",
  545. rtlphy->pwrgroup_cnt,
  546. rtlphy->mcs_txpwrlevel_origoffset[rtlphy->
  547. pwrgroup_cnt][10]));
  548. }
  549. if (regaddr == RTXAGC_B_MCS07_MCS04) {
  550. rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][11] =
  551. data;
  552. RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
  553. ("MCSTxPowerLevelOriginalOffset[%d][11] = 0x%x\n",
  554. rtlphy->pwrgroup_cnt,
  555. rtlphy->mcs_txpwrlevel_origoffset[rtlphy->
  556. pwrgroup_cnt][11]));
  557. }
  558. if (regaddr == RTXAGC_B_MCS11_MCS08) {
  559. rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][12] =
  560. data;
  561. RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
  562. ("MCSTxPowerLevelOriginalOffset[%d][12] = 0x%x\n",
  563. rtlphy->pwrgroup_cnt,
  564. rtlphy->mcs_txpwrlevel_origoffset[rtlphy->
  565. pwrgroup_cnt][12]));
  566. }
  567. if (regaddr == RTXAGC_B_MCS15_MCS12) {
  568. rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][13] =
  569. data;
  570. RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
  571. ("MCSTxPowerLevelOriginalOffset[%d][13] = 0x%x\n",
  572. rtlphy->pwrgroup_cnt,
  573. rtlphy->mcs_txpwrlevel_origoffset[rtlphy->
  574. pwrgroup_cnt][13]));
  575. rtlphy->pwrgroup_cnt++;
  576. }
  577. }
  578. static bool _rtl92c_phy_config_bb_with_pgheaderfile(struct ieee80211_hw *hw,
  579. u8 configtype)
  580. {
  581. struct rtl_priv *rtlpriv = rtl_priv(hw);
  582. int i;
  583. u32 *phy_regarray_table_pg;
  584. u16 phy_regarray_pg_len;
  585. phy_regarray_pg_len = PHY_REG_ARRAY_PGLENGTH;
  586. phy_regarray_table_pg = RTL8192CEPHY_REG_ARRAY_PG;
  587. if (configtype == BASEBAND_CONFIG_PHY_REG) {
  588. for (i = 0; i < phy_regarray_pg_len; i = i + 3) {
  589. if (phy_regarray_table_pg[i] == 0xfe)
  590. mdelay(50);
  591. else if (phy_regarray_table_pg[i] == 0xfd)
  592. mdelay(5);
  593. else if (phy_regarray_table_pg[i] == 0xfc)
  594. mdelay(1);
  595. else if (phy_regarray_table_pg[i] == 0xfb)
  596. udelay(50);
  597. else if (phy_regarray_table_pg[i] == 0xfa)
  598. udelay(5);
  599. else if (phy_regarray_table_pg[i] == 0xf9)
  600. udelay(1);
  601. _rtl92c_store_pwrIndex_diffrate_offset(hw,
  602. phy_regarray_table_pg[i],
  603. phy_regarray_table_pg[i + 1],
  604. phy_regarray_table_pg[i + 2]);
  605. }
  606. } else {
  607. RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE,
  608. ("configtype != BaseBand_Config_PHY_REG\n"));
  609. }
  610. return true;
  611. }
  612. static bool _rtl92c_phy_config_rf_external_pa(struct ieee80211_hw *hw,
  613. enum radio_path rfpath)
  614. {
  615. return true;
  616. }
  617. bool rtl92c_phy_config_rf_with_headerfile(struct ieee80211_hw *hw,
  618. enum radio_path rfpath)
  619. {
  620. int i;
  621. bool rtstatus = true;
  622. u32 *radioa_array_table;
  623. u32 *radiob_array_table;
  624. u16 radioa_arraylen, radiob_arraylen;
  625. struct rtl_priv *rtlpriv = rtl_priv(hw);
  626. struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
  627. if (IS_92C_SERIAL(rtlhal->version)) {
  628. radioa_arraylen = RADIOA_2TARRAYLENGTH;
  629. radioa_array_table = RTL8192CERADIOA_2TARRAY;
  630. radiob_arraylen = RADIOB_2TARRAYLENGTH;
  631. radiob_array_table = RTL8192CE_RADIOB_2TARRAY;
  632. RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
  633. ("Radio_A:RTL8192CERADIOA_2TARRAY\n"));
  634. RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
  635. ("Radio_B:RTL8192CE_RADIOB_2TARRAY\n"));
  636. } else {
  637. radioa_arraylen = RADIOA_1TARRAYLENGTH;
  638. radioa_array_table = RTL8192CE_RADIOA_1TARRAY;
  639. radiob_arraylen = RADIOB_1TARRAYLENGTH;
  640. radiob_array_table = RTL8192CE_RADIOB_1TARRAY;
  641. RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
  642. ("Radio_A:RTL8192CE_RADIOA_1TARRAY\n"));
  643. RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
  644. ("Radio_B:RTL8192CE_RADIOB_1TARRAY\n"));
  645. }
  646. RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, ("Radio No %x\n", rfpath));
  647. rtstatus = true;
  648. switch (rfpath) {
  649. case RF90_PATH_A:
  650. for (i = 0; i < radioa_arraylen; i = i + 2) {
  651. if (radioa_array_table[i] == 0xfe)
  652. mdelay(50);
  653. else if (radioa_array_table[i] == 0xfd)
  654. mdelay(5);
  655. else if (radioa_array_table[i] == 0xfc)
  656. mdelay(1);
  657. else if (radioa_array_table[i] == 0xfb)
  658. udelay(50);
  659. else if (radioa_array_table[i] == 0xfa)
  660. udelay(5);
  661. else if (radioa_array_table[i] == 0xf9)
  662. udelay(1);
  663. else {
  664. rtl_set_rfreg(hw, rfpath, radioa_array_table[i],
  665. RFREG_OFFSET_MASK,
  666. radioa_array_table[i + 1]);
  667. udelay(1);
  668. }
  669. }
  670. _rtl92c_phy_config_rf_external_pa(hw, rfpath);
  671. break;
  672. case RF90_PATH_B:
  673. for (i = 0; i < radiob_arraylen; i = i + 2) {
  674. if (radiob_array_table[i] == 0xfe) {
  675. mdelay(50);
  676. } else if (radiob_array_table[i] == 0xfd)
  677. mdelay(5);
  678. else if (radiob_array_table[i] == 0xfc)
  679. mdelay(1);
  680. else if (radiob_array_table[i] == 0xfb)
  681. udelay(50);
  682. else if (radiob_array_table[i] == 0xfa)
  683. udelay(5);
  684. else if (radiob_array_table[i] == 0xf9)
  685. udelay(1);
  686. else {
  687. rtl_set_rfreg(hw, rfpath, radiob_array_table[i],
  688. RFREG_OFFSET_MASK,
  689. radiob_array_table[i + 1]);
  690. udelay(1);
  691. }
  692. }
  693. break;
  694. case RF90_PATH_C:
  695. RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
  696. ("switch case not process\n"));
  697. break;
  698. case RF90_PATH_D:
  699. RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
  700. ("switch case not process\n"));
  701. break;
  702. }
  703. return true;
  704. }
  705. void rtl92c_phy_get_hw_reg_originalvalue(struct ieee80211_hw *hw)
  706. {
  707. struct rtl_priv *rtlpriv = rtl_priv(hw);
  708. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  709. rtlphy->default_initialgain[0] =
  710. (u8) rtl_get_bbreg(hw, ROFDM0_XAAGCCORE1, MASKBYTE0);
  711. rtlphy->default_initialgain[1] =
  712. (u8) rtl_get_bbreg(hw, ROFDM0_XBAGCCORE1, MASKBYTE0);
  713. rtlphy->default_initialgain[2] =
  714. (u8) rtl_get_bbreg(hw, ROFDM0_XCAGCCORE1, MASKBYTE0);
  715. rtlphy->default_initialgain[3] =
  716. (u8) rtl_get_bbreg(hw, ROFDM0_XDAGCCORE1, MASKBYTE0);
  717. RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
  718. ("Default initial gain (c50=0x%x, "
  719. "c58=0x%x, c60=0x%x, c68=0x%x\n",
  720. rtlphy->default_initialgain[0],
  721. rtlphy->default_initialgain[1],
  722. rtlphy->default_initialgain[2],
  723. rtlphy->default_initialgain[3]));
  724. rtlphy->framesync = (u8) rtl_get_bbreg(hw,
  725. ROFDM0_RXDETECTOR3, MASKBYTE0);
  726. rtlphy->framesync_c34 = rtl_get_bbreg(hw,
  727. ROFDM0_RXDETECTOR2, MASKDWORD);
  728. RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
  729. ("Default framesync (0x%x) = 0x%x\n",
  730. ROFDM0_RXDETECTOR3, rtlphy->framesync));
  731. }
  732. static void _rtl92c_phy_init_bb_rf_register_definition(struct ieee80211_hw *hw)
  733. {
  734. struct rtl_priv *rtlpriv = rtl_priv(hw);
  735. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  736. rtlphy->phyreg_def[RF90_PATH_A].rfintfs = RFPGA0_XAB_RFINTERFACESW;
  737. rtlphy->phyreg_def[RF90_PATH_B].rfintfs = RFPGA0_XAB_RFINTERFACESW;
  738. rtlphy->phyreg_def[RF90_PATH_C].rfintfs = RFPGA0_XCD_RFINTERFACESW;
  739. rtlphy->phyreg_def[RF90_PATH_D].rfintfs = RFPGA0_XCD_RFINTERFACESW;
  740. rtlphy->phyreg_def[RF90_PATH_A].rfintfi = RFPGA0_XAB_RFINTERFACERB;
  741. rtlphy->phyreg_def[RF90_PATH_B].rfintfi = RFPGA0_XAB_RFINTERFACERB;
  742. rtlphy->phyreg_def[RF90_PATH_C].rfintfi = RFPGA0_XCD_RFINTERFACERB;
  743. rtlphy->phyreg_def[RF90_PATH_D].rfintfi = RFPGA0_XCD_RFINTERFACERB;
  744. rtlphy->phyreg_def[RF90_PATH_A].rfintfo = RFPGA0_XA_RFINTERFACEOE;
  745. rtlphy->phyreg_def[RF90_PATH_B].rfintfo = RFPGA0_XB_RFINTERFACEOE;
  746. rtlphy->phyreg_def[RF90_PATH_A].rfintfe = RFPGA0_XA_RFINTERFACEOE;
  747. rtlphy->phyreg_def[RF90_PATH_B].rfintfe = RFPGA0_XB_RFINTERFACEOE;
  748. rtlphy->phyreg_def[RF90_PATH_A].rf3wire_offset =
  749. RFPGA0_XA_LSSIPARAMETER;
  750. rtlphy->phyreg_def[RF90_PATH_B].rf3wire_offset =
  751. RFPGA0_XB_LSSIPARAMETER;
  752. rtlphy->phyreg_def[RF90_PATH_A].rflssi_select = rFPGA0_XAB_RFPARAMETER;
  753. rtlphy->phyreg_def[RF90_PATH_B].rflssi_select = rFPGA0_XAB_RFPARAMETER;
  754. rtlphy->phyreg_def[RF90_PATH_C].rflssi_select = rFPGA0_XCD_RFPARAMETER;
  755. rtlphy->phyreg_def[RF90_PATH_D].rflssi_select = rFPGA0_XCD_RFPARAMETER;
  756. rtlphy->phyreg_def[RF90_PATH_A].rftxgain_stage = RFPGA0_TXGAINSTAGE;
  757. rtlphy->phyreg_def[RF90_PATH_B].rftxgain_stage = RFPGA0_TXGAINSTAGE;
  758. rtlphy->phyreg_def[RF90_PATH_C].rftxgain_stage = RFPGA0_TXGAINSTAGE;
  759. rtlphy->phyreg_def[RF90_PATH_D].rftxgain_stage = RFPGA0_TXGAINSTAGE;
  760. rtlphy->phyreg_def[RF90_PATH_A].rfhssi_para1 = RFPGA0_XA_HSSIPARAMETER1;
  761. rtlphy->phyreg_def[RF90_PATH_B].rfhssi_para1 = RFPGA0_XB_HSSIPARAMETER1;
  762. rtlphy->phyreg_def[RF90_PATH_A].rfhssi_para2 = RFPGA0_XA_HSSIPARAMETER2;
  763. rtlphy->phyreg_def[RF90_PATH_B].rfhssi_para2 = RFPGA0_XB_HSSIPARAMETER2;
  764. rtlphy->phyreg_def[RF90_PATH_A].rfswitch_control =
  765. RFPGA0_XAB_SWITCHCONTROL;
  766. rtlphy->phyreg_def[RF90_PATH_B].rfswitch_control =
  767. RFPGA0_XAB_SWITCHCONTROL;
  768. rtlphy->phyreg_def[RF90_PATH_C].rfswitch_control =
  769. RFPGA0_XCD_SWITCHCONTROL;
  770. rtlphy->phyreg_def[RF90_PATH_D].rfswitch_control =
  771. RFPGA0_XCD_SWITCHCONTROL;
  772. rtlphy->phyreg_def[RF90_PATH_A].rfagc_control1 = ROFDM0_XAAGCCORE1;
  773. rtlphy->phyreg_def[RF90_PATH_B].rfagc_control1 = ROFDM0_XBAGCCORE1;
  774. rtlphy->phyreg_def[RF90_PATH_C].rfagc_control1 = ROFDM0_XCAGCCORE1;
  775. rtlphy->phyreg_def[RF90_PATH_D].rfagc_control1 = ROFDM0_XDAGCCORE1;
  776. rtlphy->phyreg_def[RF90_PATH_A].rfagc_control2 = ROFDM0_XAAGCCORE2;
  777. rtlphy->phyreg_def[RF90_PATH_B].rfagc_control2 = ROFDM0_XBAGCCORE2;
  778. rtlphy->phyreg_def[RF90_PATH_C].rfagc_control2 = ROFDM0_XCAGCCORE2;
  779. rtlphy->phyreg_def[RF90_PATH_D].rfagc_control2 = ROFDM0_XDAGCCORE2;
  780. rtlphy->phyreg_def[RF90_PATH_A].rfrxiq_imbalance =
  781. ROFDM0_XARXIQIMBALANCE;
  782. rtlphy->phyreg_def[RF90_PATH_B].rfrxiq_imbalance =
  783. ROFDM0_XBRXIQIMBALANCE;
  784. rtlphy->phyreg_def[RF90_PATH_C].rfrxiq_imbalance =
  785. ROFDM0_XCRXIQIMBANLANCE;
  786. rtlphy->phyreg_def[RF90_PATH_D].rfrxiq_imbalance =
  787. ROFDM0_XDRXIQIMBALANCE;
  788. rtlphy->phyreg_def[RF90_PATH_A].rfrx_afe = ROFDM0_XARXAFE;
  789. rtlphy->phyreg_def[RF90_PATH_B].rfrx_afe = ROFDM0_XBRXAFE;
  790. rtlphy->phyreg_def[RF90_PATH_C].rfrx_afe = ROFDM0_XCRXAFE;
  791. rtlphy->phyreg_def[RF90_PATH_D].rfrx_afe = ROFDM0_XDRXAFE;
  792. rtlphy->phyreg_def[RF90_PATH_A].rftxiq_imbalance =
  793. ROFDM0_XATXIQIMBALANCE;
  794. rtlphy->phyreg_def[RF90_PATH_B].rftxiq_imbalance =
  795. ROFDM0_XBTXIQIMBALANCE;
  796. rtlphy->phyreg_def[RF90_PATH_C].rftxiq_imbalance =
  797. ROFDM0_XCTXIQIMBALANCE;
  798. rtlphy->phyreg_def[RF90_PATH_D].rftxiq_imbalance =
  799. ROFDM0_XDTXIQIMBALANCE;
  800. rtlphy->phyreg_def[RF90_PATH_A].rftx_afe = ROFDM0_XATXAFE;
  801. rtlphy->phyreg_def[RF90_PATH_B].rftx_afe = ROFDM0_XBTXAFE;
  802. rtlphy->phyreg_def[RF90_PATH_C].rftx_afe = ROFDM0_XCTXAFE;
  803. rtlphy->phyreg_def[RF90_PATH_D].rftx_afe = ROFDM0_XDTXAFE;
  804. rtlphy->phyreg_def[RF90_PATH_A].rflssi_readback =
  805. RFPGA0_XA_LSSIREADBACK;
  806. rtlphy->phyreg_def[RF90_PATH_B].rflssi_readback =
  807. RFPGA0_XB_LSSIREADBACK;
  808. rtlphy->phyreg_def[RF90_PATH_C].rflssi_readback =
  809. RFPGA0_XC_LSSIREADBACK;
  810. rtlphy->phyreg_def[RF90_PATH_D].rflssi_readback =
  811. RFPGA0_XD_LSSIREADBACK;
  812. rtlphy->phyreg_def[RF90_PATH_A].rflssi_readbackpi =
  813. TRANSCEIVEA_HSPI_READBACK;
  814. rtlphy->phyreg_def[RF90_PATH_B].rflssi_readbackpi =
  815. TRANSCEIVEB_HSPI_READBACK;
  816. }
  817. void rtl92c_phy_get_txpower_level(struct ieee80211_hw *hw, long *powerlevel)
  818. {
  819. struct rtl_priv *rtlpriv = rtl_priv(hw);
  820. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  821. struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
  822. u8 txpwr_level;
  823. long txpwr_dbm;
  824. txpwr_level = rtlphy->cur_cck_txpwridx;
  825. txpwr_dbm = _rtl92c_phy_txpwr_idx_to_dbm(hw,
  826. WIRELESS_MODE_B, txpwr_level);
  827. txpwr_level = rtlphy->cur_ofdm24g_txpwridx +
  828. rtlefuse->legacy_ht_txpowerdiff;
  829. if (_rtl92c_phy_txpwr_idx_to_dbm(hw,
  830. WIRELESS_MODE_G,
  831. txpwr_level) > txpwr_dbm)
  832. txpwr_dbm =
  833. _rtl92c_phy_txpwr_idx_to_dbm(hw, WIRELESS_MODE_G,
  834. txpwr_level);
  835. txpwr_level = rtlphy->cur_ofdm24g_txpwridx;
  836. if (_rtl92c_phy_txpwr_idx_to_dbm(hw,
  837. WIRELESS_MODE_N_24G,
  838. txpwr_level) > txpwr_dbm)
  839. txpwr_dbm =
  840. _rtl92c_phy_txpwr_idx_to_dbm(hw, WIRELESS_MODE_N_24G,
  841. txpwr_level);
  842. *powerlevel = txpwr_dbm;
  843. }
  844. static void _rtl92c_get_txpower_index(struct ieee80211_hw *hw, u8 channel,
  845. u8 *cckpowerlevel, u8 *ofdmpowerlevel)
  846. {
  847. struct rtl_priv *rtlpriv = rtl_priv(hw);
  848. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  849. struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
  850. u8 index = (channel - 1);
  851. cckpowerlevel[RF90_PATH_A] =
  852. rtlefuse->txpwrlevel_cck[RF90_PATH_A][index];
  853. cckpowerlevel[RF90_PATH_B] =
  854. rtlefuse->txpwrlevel_cck[RF90_PATH_B][index];
  855. if (get_rf_type(rtlphy) == RF_1T2R || get_rf_type(rtlphy) == RF_1T1R) {
  856. ofdmpowerlevel[RF90_PATH_A] =
  857. rtlefuse->txpwrlevel_ht40_1s[RF90_PATH_A][index];
  858. ofdmpowerlevel[RF90_PATH_B] =
  859. rtlefuse->txpwrlevel_ht40_1s[RF90_PATH_B][index];
  860. } else if (get_rf_type(rtlphy) == RF_2T2R) {
  861. ofdmpowerlevel[RF90_PATH_A] =
  862. rtlefuse->txpwrlevel_ht40_2s[RF90_PATH_A][index];
  863. ofdmpowerlevel[RF90_PATH_B] =
  864. rtlefuse->txpwrlevel_ht40_2s[RF90_PATH_B][index];
  865. }
  866. }
  867. static void _rtl92c_ccxpower_index_check(struct ieee80211_hw *hw,
  868. u8 channel, u8 *cckpowerlevel,
  869. u8 *ofdmpowerlevel)
  870. {
  871. struct rtl_priv *rtlpriv = rtl_priv(hw);
  872. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  873. rtlphy->cur_cck_txpwridx = cckpowerlevel[0];
  874. rtlphy->cur_ofdm24g_txpwridx = ofdmpowerlevel[0];
  875. }
  876. void rtl92c_phy_set_txpower_level(struct ieee80211_hw *hw, u8 channel)
  877. {
  878. struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
  879. u8 cckpowerlevel[2], ofdmpowerlevel[2];
  880. if (rtlefuse->b_txpwr_fromeprom == false)
  881. return;
  882. _rtl92c_get_txpower_index(hw, channel,
  883. &cckpowerlevel[0], &ofdmpowerlevel[0]);
  884. _rtl92c_ccxpower_index_check(hw,
  885. channel, &cckpowerlevel[0],
  886. &ofdmpowerlevel[0]);
  887. rtl92c_phy_rf6052_set_cck_txpower(hw, &cckpowerlevel[0]);
  888. rtl92c_phy_rf6052_set_ofdm_txpower(hw, &ofdmpowerlevel[0], channel);
  889. }
  890. bool rtl92c_phy_update_txpower_dbm(struct ieee80211_hw *hw, long power_indbm)
  891. {
  892. struct rtl_priv *rtlpriv = rtl_priv(hw);
  893. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  894. struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
  895. u8 idx;
  896. u8 rf_path;
  897. u8 ccktxpwridx = _rtl92c_phy_dbm_to_txpwr_Idx(hw,
  898. WIRELESS_MODE_B,
  899. power_indbm);
  900. u8 ofdmtxpwridx = _rtl92c_phy_dbm_to_txpwr_Idx(hw,
  901. WIRELESS_MODE_N_24G,
  902. power_indbm);
  903. if (ofdmtxpwridx - rtlefuse->legacy_ht_txpowerdiff > 0)
  904. ofdmtxpwridx -= rtlefuse->legacy_ht_txpowerdiff;
  905. else
  906. ofdmtxpwridx = 0;
  907. RT_TRACE(rtlpriv, COMP_TXAGC, DBG_TRACE,
  908. ("%lx dBm, ccktxpwridx = %d, ofdmtxpwridx = %d\n",
  909. power_indbm, ccktxpwridx, ofdmtxpwridx));
  910. for (idx = 0; idx < 14; idx++) {
  911. for (rf_path = 0; rf_path < 2; rf_path++) {
  912. rtlefuse->txpwrlevel_cck[rf_path][idx] = ccktxpwridx;
  913. rtlefuse->txpwrlevel_ht40_1s[rf_path][idx] =
  914. ofdmtxpwridx;
  915. rtlefuse->txpwrlevel_ht40_2s[rf_path][idx] =
  916. ofdmtxpwridx;
  917. }
  918. }
  919. rtl92c_phy_set_txpower_level(hw, rtlphy->current_channel);
  920. return true;
  921. }
  922. void rtl92c_phy_set_beacon_hw_reg(struct ieee80211_hw *hw, u16 beaconinterval)
  923. {
  924. }
  925. static u8 _rtl92c_phy_dbm_to_txpwr_Idx(struct ieee80211_hw *hw,
  926. enum wireless_mode wirelessmode,
  927. long power_indbm)
  928. {
  929. u8 txpwridx;
  930. long offset;
  931. switch (wirelessmode) {
  932. case WIRELESS_MODE_B:
  933. offset = -7;
  934. break;
  935. case WIRELESS_MODE_G:
  936. case WIRELESS_MODE_N_24G:
  937. offset = -8;
  938. break;
  939. default:
  940. offset = -8;
  941. break;
  942. }
  943. if ((power_indbm - offset) > 0)
  944. txpwridx = (u8) ((power_indbm - offset) * 2);
  945. else
  946. txpwridx = 0;
  947. if (txpwridx > MAX_TXPWR_IDX_NMODE_92S)
  948. txpwridx = MAX_TXPWR_IDX_NMODE_92S;
  949. return txpwridx;
  950. }
  951. static long _rtl92c_phy_txpwr_idx_to_dbm(struct ieee80211_hw *hw,
  952. enum wireless_mode wirelessmode,
  953. u8 txpwridx)
  954. {
  955. long offset;
  956. long pwrout_dbm;
  957. switch (wirelessmode) {
  958. case WIRELESS_MODE_B:
  959. offset = -7;
  960. break;
  961. case WIRELESS_MODE_G:
  962. case WIRELESS_MODE_N_24G:
  963. offset = -8;
  964. break;
  965. default:
  966. offset = -8;
  967. break;
  968. }
  969. pwrout_dbm = txpwridx / 2 + offset;
  970. return pwrout_dbm;
  971. }
  972. void rtl92c_phy_scan_operation_backup(struct ieee80211_hw *hw, u8 operation)
  973. {
  974. struct rtl_priv *rtlpriv = rtl_priv(hw);
  975. struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
  976. enum io_type iotype;
  977. if (!is_hal_stop(rtlhal)) {
  978. switch (operation) {
  979. case SCAN_OPT_BACKUP:
  980. iotype = IO_CMD_PAUSE_DM_BY_SCAN;
  981. rtlpriv->cfg->ops->set_hw_reg(hw,
  982. HW_VAR_IO_CMD,
  983. (u8 *)&iotype);
  984. break;
  985. case SCAN_OPT_RESTORE:
  986. iotype = IO_CMD_RESUME_DM_BY_SCAN;
  987. rtlpriv->cfg->ops->set_hw_reg(hw,
  988. HW_VAR_IO_CMD,
  989. (u8 *)&iotype);
  990. break;
  991. default:
  992. RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
  993. ("Unknown Scan Backup operation.\n"));
  994. break;
  995. }
  996. }
  997. }
  998. void rtl92c_phy_set_bw_mode_callback(struct ieee80211_hw *hw)
  999. {
  1000. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1001. struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
  1002. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  1003. struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
  1004. u8 reg_bw_opmode;
  1005. u8 reg_prsr_rsc;
  1006. RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE,
  1007. ("Switch to %s bandwidth\n",
  1008. rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20 ?
  1009. "20MHz" : "40MHz"))
  1010. if (is_hal_stop(rtlhal))
  1011. return;
  1012. reg_bw_opmode = rtl_read_byte(rtlpriv, REG_BWOPMODE);
  1013. reg_prsr_rsc = rtl_read_byte(rtlpriv, REG_RRSR + 2);
  1014. switch (rtlphy->current_chan_bw) {
  1015. case HT_CHANNEL_WIDTH_20:
  1016. reg_bw_opmode |= BW_OPMODE_20MHZ;
  1017. rtl_write_byte(rtlpriv, REG_BWOPMODE, reg_bw_opmode);
  1018. break;
  1019. case HT_CHANNEL_WIDTH_20_40:
  1020. reg_bw_opmode &= ~BW_OPMODE_20MHZ;
  1021. rtl_write_byte(rtlpriv, REG_BWOPMODE, reg_bw_opmode);
  1022. reg_prsr_rsc =
  1023. (reg_prsr_rsc & 0x90) | (mac->cur_40_prime_sc << 5);
  1024. rtl_write_byte(rtlpriv, REG_RRSR + 2, reg_prsr_rsc);
  1025. break;
  1026. default:
  1027. RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
  1028. ("unknown bandwidth: %#X\n", rtlphy->current_chan_bw));
  1029. break;
  1030. }
  1031. switch (rtlphy->current_chan_bw) {
  1032. case HT_CHANNEL_WIDTH_20:
  1033. rtl_set_bbreg(hw, RFPGA0_RFMOD, BRFMOD, 0x0);
  1034. rtl_set_bbreg(hw, RFPGA1_RFMOD, BRFMOD, 0x0);
  1035. rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER2, BIT(10), 1);
  1036. break;
  1037. case HT_CHANNEL_WIDTH_20_40:
  1038. rtl_set_bbreg(hw, RFPGA0_RFMOD, BRFMOD, 0x1);
  1039. rtl_set_bbreg(hw, RFPGA1_RFMOD, BRFMOD, 0x1);
  1040. rtl_set_bbreg(hw, RCCK0_SYSTEM, BCCK_SIDEBAND,
  1041. (mac->cur_40_prime_sc >> 1));
  1042. rtl_set_bbreg(hw, ROFDM1_LSTF, 0xC00, mac->cur_40_prime_sc);
  1043. rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER2, BIT(10), 0);
  1044. rtl_set_bbreg(hw, 0x818, (BIT(26) | BIT(27)),
  1045. (mac->cur_40_prime_sc ==
  1046. HAL_PRIME_CHNL_OFFSET_LOWER) ? 2 : 1);
  1047. break;
  1048. default:
  1049. RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
  1050. ("unknown bandwidth: %#X\n", rtlphy->current_chan_bw));
  1051. break;
  1052. }
  1053. rtl92c_phy_rf6052_set_bandwidth(hw, rtlphy->current_chan_bw);
  1054. rtlphy->set_bwmode_inprogress = false;
  1055. RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, ("<==\n"));
  1056. }
  1057. void rtl92c_phy_set_bw_mode(struct ieee80211_hw *hw,
  1058. enum nl80211_channel_type ch_type)
  1059. {
  1060. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1061. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  1062. struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
  1063. u8 tmp_bw = rtlphy->current_chan_bw;
  1064. if (rtlphy->set_bwmode_inprogress)
  1065. return;
  1066. rtlphy->set_bwmode_inprogress = true;
  1067. if ((!is_hal_stop(rtlhal)) && !(RT_CANNOT_IO(hw)))
  1068. rtl92c_phy_set_bw_mode_callback(hw);
  1069. else {
  1070. RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
  1071. ("FALSE driver sleep or unload\n"));
  1072. rtlphy->set_bwmode_inprogress = false;
  1073. rtlphy->current_chan_bw = tmp_bw;
  1074. }
  1075. }
  1076. void rtl92c_phy_sw_chnl_callback(struct ieee80211_hw *hw)
  1077. {
  1078. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1079. struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
  1080. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  1081. u32 delay;
  1082. RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE,
  1083. ("switch to channel%d\n", rtlphy->current_channel));
  1084. if (is_hal_stop(rtlhal))
  1085. return;
  1086. do {
  1087. if (!rtlphy->sw_chnl_inprogress)
  1088. break;
  1089. if (!_rtl92c_phy_sw_chnl_step_by_step
  1090. (hw, rtlphy->current_channel, &rtlphy->sw_chnl_stage,
  1091. &rtlphy->sw_chnl_step, &delay)) {
  1092. if (delay > 0)
  1093. mdelay(delay);
  1094. else
  1095. continue;
  1096. } else
  1097. rtlphy->sw_chnl_inprogress = false;
  1098. break;
  1099. } while (true);
  1100. RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, ("<==\n"));
  1101. }
  1102. u8 rtl92c_phy_sw_chnl(struct ieee80211_hw *hw)
  1103. {
  1104. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1105. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  1106. struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
  1107. if (rtlphy->sw_chnl_inprogress)
  1108. return 0;
  1109. if (rtlphy->set_bwmode_inprogress)
  1110. return 0;
  1111. RT_ASSERT((rtlphy->current_channel <= 14),
  1112. ("WIRELESS_MODE_G but channel>14"));
  1113. rtlphy->sw_chnl_inprogress = true;
  1114. rtlphy->sw_chnl_stage = 0;
  1115. rtlphy->sw_chnl_step = 0;
  1116. if (!(is_hal_stop(rtlhal)) && !(RT_CANNOT_IO(hw))) {
  1117. rtl92c_phy_sw_chnl_callback(hw);
  1118. RT_TRACE(rtlpriv, COMP_CHAN, DBG_LOUD,
  1119. ("sw_chnl_inprogress false schdule workitem\n"));
  1120. rtlphy->sw_chnl_inprogress = false;
  1121. } else {
  1122. RT_TRACE(rtlpriv, COMP_CHAN, DBG_LOUD,
  1123. ("sw_chnl_inprogress false driver sleep or"
  1124. " unload\n"));
  1125. rtlphy->sw_chnl_inprogress = false;
  1126. }
  1127. return 1;
  1128. }
  1129. static bool _rtl92c_phy_sw_chnl_step_by_step(struct ieee80211_hw *hw,
  1130. u8 channel, u8 *stage, u8 *step,
  1131. u32 *delay)
  1132. {
  1133. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1134. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  1135. struct swchnlcmd precommoncmd[MAX_PRECMD_CNT];
  1136. u32 precommoncmdcnt;
  1137. struct swchnlcmd postcommoncmd[MAX_POSTCMD_CNT];
  1138. u32 postcommoncmdcnt;
  1139. struct swchnlcmd rfdependcmd[MAX_RFDEPENDCMD_CNT];
  1140. u32 rfdependcmdcnt;
  1141. struct swchnlcmd *currentcmd = NULL;
  1142. u8 rfpath;
  1143. u8 num_total_rfpath = rtlphy->num_total_rfpath;
  1144. precommoncmdcnt = 0;
  1145. _rtl92c_phy_set_sw_chnl_cmdarray(precommoncmd, precommoncmdcnt++,
  1146. MAX_PRECMD_CNT,
  1147. CMDID_SET_TXPOWEROWER_LEVEL, 0, 0, 0);
  1148. _rtl92c_phy_set_sw_chnl_cmdarray(precommoncmd, precommoncmdcnt++,
  1149. MAX_PRECMD_CNT, CMDID_END, 0, 0, 0);
  1150. postcommoncmdcnt = 0;
  1151. _rtl92c_phy_set_sw_chnl_cmdarray(postcommoncmd, postcommoncmdcnt++,
  1152. MAX_POSTCMD_CNT, CMDID_END, 0, 0, 0);
  1153. rfdependcmdcnt = 0;
  1154. RT_ASSERT((channel >= 1 && channel <= 14),
  1155. ("illegal channel for Zebra: %d\n", channel));
  1156. _rtl92c_phy_set_sw_chnl_cmdarray(rfdependcmd, rfdependcmdcnt++,
  1157. MAX_RFDEPENDCMD_CNT, CMDID_RF_WRITEREG,
  1158. RF_CHNLBW, channel, 10);
  1159. _rtl92c_phy_set_sw_chnl_cmdarray(rfdependcmd, rfdependcmdcnt++,
  1160. MAX_RFDEPENDCMD_CNT, CMDID_END, 0, 0,
  1161. 0);
  1162. do {
  1163. switch (*stage) {
  1164. case 0:
  1165. currentcmd = &precommoncmd[*step];
  1166. break;
  1167. case 1:
  1168. currentcmd = &rfdependcmd[*step];
  1169. break;
  1170. case 2:
  1171. currentcmd = &postcommoncmd[*step];
  1172. break;
  1173. }
  1174. if (currentcmd->cmdid == CMDID_END) {
  1175. if ((*stage) == 2) {
  1176. return true;
  1177. } else {
  1178. (*stage)++;
  1179. (*step) = 0;
  1180. continue;
  1181. }
  1182. }
  1183. switch (currentcmd->cmdid) {
  1184. case CMDID_SET_TXPOWEROWER_LEVEL:
  1185. rtl92c_phy_set_txpower_level(hw, channel);
  1186. break;
  1187. case CMDID_WRITEPORT_ULONG:
  1188. rtl_write_dword(rtlpriv, currentcmd->para1,
  1189. currentcmd->para2);
  1190. break;
  1191. case CMDID_WRITEPORT_USHORT:
  1192. rtl_write_word(rtlpriv, currentcmd->para1,
  1193. (u16) currentcmd->para2);
  1194. break;
  1195. case CMDID_WRITEPORT_UCHAR:
  1196. rtl_write_byte(rtlpriv, currentcmd->para1,
  1197. (u8) currentcmd->para2);
  1198. break;
  1199. case CMDID_RF_WRITEREG:
  1200. for (rfpath = 0; rfpath < num_total_rfpath; rfpath++) {
  1201. rtlphy->rfreg_chnlval[rfpath] =
  1202. ((rtlphy->rfreg_chnlval[rfpath] &
  1203. 0xfffffc00) | currentcmd->para2);
  1204. rtl_set_rfreg(hw, (enum radio_path)rfpath,
  1205. currentcmd->para1,
  1206. RFREG_OFFSET_MASK,
  1207. rtlphy->rfreg_chnlval[rfpath]);
  1208. }
  1209. break;
  1210. default:
  1211. RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
  1212. ("switch case not process\n"));
  1213. break;
  1214. }
  1215. break;
  1216. } while (true);
  1217. (*delay) = currentcmd->msdelay;
  1218. (*step)++;
  1219. return false;
  1220. }
  1221. static bool _rtl92c_phy_set_sw_chnl_cmdarray(struct swchnlcmd *cmdtable,
  1222. u32 cmdtableidx, u32 cmdtablesz,
  1223. enum swchnlcmd_id cmdid,
  1224. u32 para1, u32 para2, u32 msdelay)
  1225. {
  1226. struct swchnlcmd *pcmd;
  1227. if (cmdtable == NULL) {
  1228. RT_ASSERT(false, ("cmdtable cannot be NULL.\n"));
  1229. return false;
  1230. }
  1231. if (cmdtableidx >= cmdtablesz)
  1232. return false;
  1233. pcmd = cmdtable + cmdtableidx;
  1234. pcmd->cmdid = cmdid;
  1235. pcmd->para1 = para1;
  1236. pcmd->para2 = para2;
  1237. pcmd->msdelay = msdelay;
  1238. return true;
  1239. }
  1240. bool rtl8192_phy_check_is_legal_rfpath(struct ieee80211_hw *hw, u32 rfpath)
  1241. {
  1242. return true;
  1243. }
  1244. static u8 _rtl92c_phy_path_a_iqk(struct ieee80211_hw *hw, bool config_pathb)
  1245. {
  1246. u32 reg_eac, reg_e94, reg_e9c, reg_ea4;
  1247. u8 result = 0x00;
  1248. rtl_set_bbreg(hw, 0xe30, MASKDWORD, 0x10008c1f);
  1249. rtl_set_bbreg(hw, 0xe34, MASKDWORD, 0x10008c1f);
  1250. rtl_set_bbreg(hw, 0xe38, MASKDWORD, 0x82140102);
  1251. rtl_set_bbreg(hw, 0xe3c, MASKDWORD,
  1252. config_pathb ? 0x28160202 : 0x28160502);
  1253. if (config_pathb) {
  1254. rtl_set_bbreg(hw, 0xe50, MASKDWORD, 0x10008c22);
  1255. rtl_set_bbreg(hw, 0xe54, MASKDWORD, 0x10008c22);
  1256. rtl_set_bbreg(hw, 0xe58, MASKDWORD, 0x82140102);
  1257. rtl_set_bbreg(hw, 0xe5c, MASKDWORD, 0x28160202);
  1258. }
  1259. rtl_set_bbreg(hw, 0xe4c, MASKDWORD, 0x001028d1);
  1260. rtl_set_bbreg(hw, 0xe48, MASKDWORD, 0xf9000000);
  1261. rtl_set_bbreg(hw, 0xe48, MASKDWORD, 0xf8000000);
  1262. mdelay(IQK_DELAY_TIME);
  1263. reg_eac = rtl_get_bbreg(hw, 0xeac, MASKDWORD);
  1264. reg_e94 = rtl_get_bbreg(hw, 0xe94, MASKDWORD);
  1265. reg_e9c = rtl_get_bbreg(hw, 0xe9c, MASKDWORD);
  1266. reg_ea4 = rtl_get_bbreg(hw, 0xea4, MASKDWORD);
  1267. if (!(reg_eac & BIT(28)) &&
  1268. (((reg_e94 & 0x03FF0000) >> 16) != 0x142) &&
  1269. (((reg_e9c & 0x03FF0000) >> 16) != 0x42))
  1270. result |= 0x01;
  1271. else
  1272. return result;
  1273. if (!(reg_eac & BIT(27)) &&
  1274. (((reg_ea4 & 0x03FF0000) >> 16) != 0x132) &&
  1275. (((reg_eac & 0x03FF0000) >> 16) != 0x36))
  1276. result |= 0x02;
  1277. return result;
  1278. }
  1279. static u8 _rtl92c_phy_path_b_iqk(struct ieee80211_hw *hw)
  1280. {
  1281. u32 reg_eac, reg_eb4, reg_ebc, reg_ec4, reg_ecc;
  1282. u8 result = 0x00;
  1283. rtl_set_bbreg(hw, 0xe60, MASKDWORD, 0x00000002);
  1284. rtl_set_bbreg(hw, 0xe60, MASKDWORD, 0x00000000);
  1285. mdelay(IQK_DELAY_TIME);
  1286. reg_eac = rtl_get_bbreg(hw, 0xeac, MASKDWORD);
  1287. reg_eb4 = rtl_get_bbreg(hw, 0xeb4, MASKDWORD);
  1288. reg_ebc = rtl_get_bbreg(hw, 0xebc, MASKDWORD);
  1289. reg_ec4 = rtl_get_bbreg(hw, 0xec4, MASKDWORD);
  1290. reg_ecc = rtl_get_bbreg(hw, 0xecc, MASKDWORD);
  1291. if (!(reg_eac & BIT(31)) &&
  1292. (((reg_eb4 & 0x03FF0000) >> 16) != 0x142) &&
  1293. (((reg_ebc & 0x03FF0000) >> 16) != 0x42))
  1294. result |= 0x01;
  1295. else
  1296. return result;
  1297. if (!(reg_eac & BIT(30)) &&
  1298. (((reg_ec4 & 0x03FF0000) >> 16) != 0x132) &&
  1299. (((reg_ecc & 0x03FF0000) >> 16) != 0x36))
  1300. result |= 0x02;
  1301. return result;
  1302. }
  1303. static void _rtl92c_phy_path_a_fill_iqk_matrix(struct ieee80211_hw *hw,
  1304. bool b_iqk_ok, long result[][8],
  1305. u8 final_candidate, bool btxonly)
  1306. {
  1307. u32 oldval_0, x, tx0_a, reg;
  1308. long y, tx0_c;
  1309. if (final_candidate == 0xFF)
  1310. return;
  1311. else if (b_iqk_ok) {
  1312. oldval_0 = (rtl_get_bbreg(hw, ROFDM0_XATXIQIMBALANCE,
  1313. MASKDWORD) >> 22) & 0x3FF;
  1314. x = result[final_candidate][0];
  1315. if ((x & 0x00000200) != 0)
  1316. x = x | 0xFFFFFC00;
  1317. tx0_a = (x * oldval_0) >> 8;
  1318. rtl_set_bbreg(hw, ROFDM0_XATXIQIMBALANCE, 0x3FF, tx0_a);
  1319. rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(31),
  1320. ((x * oldval_0 >> 7) & 0x1));
  1321. y = result[final_candidate][1];
  1322. if ((y & 0x00000200) != 0)
  1323. y = y | 0xFFFFFC00;
  1324. tx0_c = (y * oldval_0) >> 8;
  1325. rtl_set_bbreg(hw, ROFDM0_XCTXAFE, 0xF0000000,
  1326. ((tx0_c & 0x3C0) >> 6));
  1327. rtl_set_bbreg(hw, ROFDM0_XATXIQIMBALANCE, 0x003F0000,
  1328. (tx0_c & 0x3F));
  1329. rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(29),
  1330. ((y * oldval_0 >> 7) & 0x1));
  1331. if (btxonly)
  1332. return;
  1333. reg = result[final_candidate][2];
  1334. rtl_set_bbreg(hw, ROFDM0_XARXIQIMBALANCE, 0x3FF, reg);
  1335. reg = result[final_candidate][3] & 0x3F;
  1336. rtl_set_bbreg(hw, ROFDM0_XARXIQIMBALANCE, 0xFC00, reg);
  1337. reg = (result[final_candidate][3] >> 6) & 0xF;
  1338. rtl_set_bbreg(hw, 0xca0, 0xF0000000, reg);
  1339. }
  1340. }
  1341. static void _rtl92c_phy_path_b_fill_iqk_matrix(struct ieee80211_hw *hw,
  1342. bool b_iqk_ok, long result[][8],
  1343. u8 final_candidate, bool btxonly)
  1344. {
  1345. u32 oldval_1, x, tx1_a, reg;
  1346. long y, tx1_c;
  1347. if (final_candidate == 0xFF)
  1348. return;
  1349. else if (b_iqk_ok) {
  1350. oldval_1 = (rtl_get_bbreg(hw, ROFDM0_XBTXIQIMBALANCE,
  1351. MASKDWORD) >> 22) & 0x3FF;
  1352. x = result[final_candidate][4];
  1353. if ((x & 0x00000200) != 0)
  1354. x = x | 0xFFFFFC00;
  1355. tx1_a = (x * oldval_1) >> 8;
  1356. rtl_set_bbreg(hw, ROFDM0_XBTXIQIMBALANCE, 0x3FF, tx1_a);
  1357. rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(27),
  1358. ((x * oldval_1 >> 7) & 0x1));
  1359. y = result[final_candidate][5];
  1360. if ((y & 0x00000200) != 0)
  1361. y = y | 0xFFFFFC00;
  1362. tx1_c = (y * oldval_1) >> 8;
  1363. rtl_set_bbreg(hw, ROFDM0_XDTXAFE, 0xF0000000,
  1364. ((tx1_c & 0x3C0) >> 6));
  1365. rtl_set_bbreg(hw, ROFDM0_XBTXIQIMBALANCE, 0x003F0000,
  1366. (tx1_c & 0x3F));
  1367. rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(25),
  1368. ((y * oldval_1 >> 7) & 0x1));
  1369. if (btxonly)
  1370. return;
  1371. reg = result[final_candidate][6];
  1372. rtl_set_bbreg(hw, ROFDM0_XBRXIQIMBALANCE, 0x3FF, reg);
  1373. reg = result[final_candidate][7] & 0x3F;
  1374. rtl_set_bbreg(hw, ROFDM0_XBRXIQIMBALANCE, 0xFC00, reg);
  1375. reg = (result[final_candidate][7] >> 6) & 0xF;
  1376. rtl_set_bbreg(hw, ROFDM0_AGCRSSITABLE, 0x0000F000, reg);
  1377. }
  1378. }
  1379. static void _rtl92c_phy_save_adda_registers(struct ieee80211_hw *hw,
  1380. u32 *addareg, u32 *addabackup,
  1381. u32 registernum)
  1382. {
  1383. u32 i;
  1384. for (i = 0; i < registernum; i++)
  1385. addabackup[i] = rtl_get_bbreg(hw, addareg[i], MASKDWORD);
  1386. }
  1387. static void _rtl92c_phy_save_mac_registers(struct ieee80211_hw *hw,
  1388. u32 *macreg, u32 *macbackup)
  1389. {
  1390. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1391. u32 i;
  1392. for (i = 0; i < (IQK_MAC_REG_NUM - 1); i++)
  1393. macbackup[i] = rtl_read_byte(rtlpriv, macreg[i]);
  1394. macbackup[i] = rtl_read_dword(rtlpriv, macreg[i]);
  1395. }
  1396. static void _rtl92c_phy_reload_adda_registers(struct ieee80211_hw *hw,
  1397. u32 *addareg, u32 *addabackup,
  1398. u32 regiesternum)
  1399. {
  1400. u32 i;
  1401. for (i = 0; i < regiesternum; i++)
  1402. rtl_set_bbreg(hw, addareg[i], MASKDWORD, addabackup[i]);
  1403. }
  1404. static void _rtl92c_phy_reload_mac_registers(struct ieee80211_hw *hw,
  1405. u32 *macreg, u32 *macbackup)
  1406. {
  1407. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1408. u32 i;
  1409. for (i = 0; i < (IQK_MAC_REG_NUM - 1); i++)
  1410. rtl_write_byte(rtlpriv, macreg[i], (u8) macbackup[i]);
  1411. rtl_write_dword(rtlpriv, macreg[i], macbackup[i]);
  1412. }
  1413. static void _rtl92c_phy_path_adda_on(struct ieee80211_hw *hw,
  1414. u32 *addareg, bool is_patha_on, bool is2t)
  1415. {
  1416. u32 pathOn;
  1417. u32 i;
  1418. pathOn = is_patha_on ? 0x04db25a4 : 0x0b1b25a4;
  1419. if (false == is2t) {
  1420. pathOn = 0x0bdb25a0;
  1421. rtl_set_bbreg(hw, addareg[0], MASKDWORD, 0x0b1b25a0);
  1422. } else {
  1423. rtl_set_bbreg(hw, addareg[0], MASKDWORD, pathOn);
  1424. }
  1425. for (i = 1; i < IQK_ADDA_REG_NUM; i++)
  1426. rtl_set_bbreg(hw, addareg[i], MASKDWORD, pathOn);
  1427. }
  1428. static void _rtl92c_phy_mac_setting_calibration(struct ieee80211_hw *hw,
  1429. u32 *macreg, u32 *macbackup)
  1430. {
  1431. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1432. u32 i;
  1433. rtl_write_byte(rtlpriv, macreg[0], 0x3F);
  1434. for (i = 1; i < (IQK_MAC_REG_NUM - 1); i++)
  1435. rtl_write_byte(rtlpriv, macreg[i],
  1436. (u8) (macbackup[i] & (~BIT(3))));
  1437. rtl_write_byte(rtlpriv, macreg[i], (u8) (macbackup[i] & (~BIT(5))));
  1438. }
  1439. static void _rtl92c_phy_path_a_standby(struct ieee80211_hw *hw)
  1440. {
  1441. rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x0);
  1442. rtl_set_bbreg(hw, 0x840, MASKDWORD, 0x00010000);
  1443. rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x80800000);
  1444. }
  1445. static void _rtl92c_phy_pi_mode_switch(struct ieee80211_hw *hw, bool pi_mode)
  1446. {
  1447. u32 mode;
  1448. mode = pi_mode ? 0x01000100 : 0x01000000;
  1449. rtl_set_bbreg(hw, 0x820, MASKDWORD, mode);
  1450. rtl_set_bbreg(hw, 0x828, MASKDWORD, mode);
  1451. }
  1452. static bool _rtl92c_phy_simularity_compare(struct ieee80211_hw *hw,
  1453. long result[][8], u8 c1, u8 c2)
  1454. {
  1455. u32 i, j, diff, simularity_bitmap, bound;
  1456. struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
  1457. u8 final_candidate[2] = { 0xFF, 0xFF };
  1458. bool bresult = true, is2t = IS_92C_SERIAL(rtlhal->version);
  1459. if (is2t)
  1460. bound = 8;
  1461. else
  1462. bound = 4;
  1463. simularity_bitmap = 0;
  1464. for (i = 0; i < bound; i++) {
  1465. diff = (result[c1][i] > result[c2][i]) ?
  1466. (result[c1][i] - result[c2][i]) :
  1467. (result[c2][i] - result[c1][i]);
  1468. if (diff > MAX_TOLERANCE) {
  1469. if ((i == 2 || i == 6) && !simularity_bitmap) {
  1470. if (result[c1][i] + result[c1][i + 1] == 0)
  1471. final_candidate[(i / 4)] = c2;
  1472. else if (result[c2][i] + result[c2][i + 1] == 0)
  1473. final_candidate[(i / 4)] = c1;
  1474. else
  1475. simularity_bitmap = simularity_bitmap |
  1476. (1 << i);
  1477. } else
  1478. simularity_bitmap =
  1479. simularity_bitmap | (1 << i);
  1480. }
  1481. }
  1482. if (simularity_bitmap == 0) {
  1483. for (i = 0; i < (bound / 4); i++) {
  1484. if (final_candidate[i] != 0xFF) {
  1485. for (j = i * 4; j < (i + 1) * 4 - 2; j++)
  1486. result[3][j] =
  1487. result[final_candidate[i]][j];
  1488. bresult = false;
  1489. }
  1490. }
  1491. return bresult;
  1492. } else if (!(simularity_bitmap & 0x0F)) {
  1493. for (i = 0; i < 4; i++)
  1494. result[3][i] = result[c1][i];
  1495. return false;
  1496. } else if (!(simularity_bitmap & 0xF0) && is2t) {
  1497. for (i = 4; i < 8; i++)
  1498. result[3][i] = result[c1][i];
  1499. return false;
  1500. } else {
  1501. return false;
  1502. }
  1503. }
  1504. static void _rtl92c_phy_iq_calibrate(struct ieee80211_hw *hw,
  1505. long result[][8], u8 t, bool is2t)
  1506. {
  1507. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1508. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  1509. u32 i;
  1510. u8 patha_ok, pathb_ok;
  1511. u32 adda_reg[IQK_ADDA_REG_NUM] = {
  1512. 0x85c, 0xe6c, 0xe70, 0xe74,
  1513. 0xe78, 0xe7c, 0xe80, 0xe84,
  1514. 0xe88, 0xe8c, 0xed0, 0xed4,
  1515. 0xed8, 0xedc, 0xee0, 0xeec
  1516. };
  1517. u32 iqk_mac_reg[IQK_MAC_REG_NUM] = {
  1518. 0x522, 0x550, 0x551, 0x040
  1519. };
  1520. const u32 retrycount = 2;
  1521. u32 bbvalue;
  1522. if (t == 0) {
  1523. bbvalue = rtl_get_bbreg(hw, 0x800, MASKDWORD);
  1524. _rtl92c_phy_save_adda_registers(hw, adda_reg,
  1525. rtlphy->adda_backup, 16);
  1526. _rtl92c_phy_save_mac_registers(hw, iqk_mac_reg,
  1527. rtlphy->iqk_mac_backup);
  1528. }
  1529. _rtl92c_phy_path_adda_on(hw, adda_reg, true, is2t);
  1530. if (t == 0) {
  1531. rtlphy->b_rfpi_enable = (u8) rtl_get_bbreg(hw,
  1532. RFPGA0_XA_HSSIPARAMETER1,
  1533. BIT(8));
  1534. }
  1535. if (!rtlphy->b_rfpi_enable)
  1536. _rtl92c_phy_pi_mode_switch(hw, true);
  1537. if (t == 0) {
  1538. rtlphy->reg_c04 = rtl_get_bbreg(hw, 0xc04, MASKDWORD);
  1539. rtlphy->reg_c08 = rtl_get_bbreg(hw, 0xc08, MASKDWORD);
  1540. rtlphy->reg_874 = rtl_get_bbreg(hw, 0x874, MASKDWORD);
  1541. }
  1542. rtl_set_bbreg(hw, 0xc04, MASKDWORD, 0x03a05600);
  1543. rtl_set_bbreg(hw, 0xc08, MASKDWORD, 0x000800e4);
  1544. rtl_set_bbreg(hw, 0x874, MASKDWORD, 0x22204000);
  1545. if (is2t) {
  1546. rtl_set_bbreg(hw, 0x840, MASKDWORD, 0x00010000);
  1547. rtl_set_bbreg(hw, 0x844, MASKDWORD, 0x00010000);
  1548. }
  1549. _rtl92c_phy_mac_setting_calibration(hw, iqk_mac_reg,
  1550. rtlphy->iqk_mac_backup);
  1551. rtl_set_bbreg(hw, 0xb68, MASKDWORD, 0x00080000);
  1552. if (is2t)
  1553. rtl_set_bbreg(hw, 0xb6c, MASKDWORD, 0x00080000);
  1554. rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x80800000);
  1555. rtl_set_bbreg(hw, 0xe40, MASKDWORD, 0x01007c00);
  1556. rtl_set_bbreg(hw, 0xe44, MASKDWORD, 0x01004800);
  1557. for (i = 0; i < retrycount; i++) {
  1558. patha_ok = _rtl92c_phy_path_a_iqk(hw, is2t);
  1559. if (patha_ok == 0x03) {
  1560. result[t][0] = (rtl_get_bbreg(hw, 0xe94, MASKDWORD) &
  1561. 0x3FF0000) >> 16;
  1562. result[t][1] = (rtl_get_bbreg(hw, 0xe9c, MASKDWORD) &
  1563. 0x3FF0000) >> 16;
  1564. result[t][2] = (rtl_get_bbreg(hw, 0xea4, MASKDWORD) &
  1565. 0x3FF0000) >> 16;
  1566. result[t][3] = (rtl_get_bbreg(hw, 0xeac, MASKDWORD) &
  1567. 0x3FF0000) >> 16;
  1568. break;
  1569. } else if (i == (retrycount - 1) && patha_ok == 0x01)
  1570. result[t][0] = (rtl_get_bbreg(hw, 0xe94,
  1571. MASKDWORD) & 0x3FF0000) >>
  1572. 16;
  1573. result[t][1] =
  1574. (rtl_get_bbreg(hw, 0xe9c, MASKDWORD) & 0x3FF0000) >> 16;
  1575. }
  1576. if (is2t) {
  1577. _rtl92c_phy_path_a_standby(hw);
  1578. _rtl92c_phy_path_adda_on(hw, adda_reg, false, is2t);
  1579. for (i = 0; i < retrycount; i++) {
  1580. pathb_ok = _rtl92c_phy_path_b_iqk(hw);
  1581. if (pathb_ok == 0x03) {
  1582. result[t][4] = (rtl_get_bbreg(hw,
  1583. 0xeb4,
  1584. MASKDWORD) &
  1585. 0x3FF0000) >> 16;
  1586. result[t][5] =
  1587. (rtl_get_bbreg(hw, 0xebc, MASKDWORD) &
  1588. 0x3FF0000) >> 16;
  1589. result[t][6] =
  1590. (rtl_get_bbreg(hw, 0xec4, MASKDWORD) &
  1591. 0x3FF0000) >> 16;
  1592. result[t][7] =
  1593. (rtl_get_bbreg(hw, 0xecc, MASKDWORD) &
  1594. 0x3FF0000) >> 16;
  1595. break;
  1596. } else if (i == (retrycount - 1) && pathb_ok == 0x01) {
  1597. result[t][4] = (rtl_get_bbreg(hw,
  1598. 0xeb4,
  1599. MASKDWORD) &
  1600. 0x3FF0000) >> 16;
  1601. }
  1602. result[t][5] = (rtl_get_bbreg(hw, 0xebc, MASKDWORD) &
  1603. 0x3FF0000) >> 16;
  1604. }
  1605. }
  1606. rtl_set_bbreg(hw, 0xc04, MASKDWORD, rtlphy->reg_c04);
  1607. rtl_set_bbreg(hw, 0x874, MASKDWORD, rtlphy->reg_874);
  1608. rtl_set_bbreg(hw, 0xc08, MASKDWORD, rtlphy->reg_c08);
  1609. rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0);
  1610. rtl_set_bbreg(hw, 0x840, MASKDWORD, 0x00032ed3);
  1611. if (is2t)
  1612. rtl_set_bbreg(hw, 0x844, MASKDWORD, 0x00032ed3);
  1613. if (t != 0) {
  1614. if (!rtlphy->b_rfpi_enable)
  1615. _rtl92c_phy_pi_mode_switch(hw, false);
  1616. _rtl92c_phy_reload_adda_registers(hw, adda_reg,
  1617. rtlphy->adda_backup, 16);
  1618. _rtl92c_phy_reload_mac_registers(hw, iqk_mac_reg,
  1619. rtlphy->iqk_mac_backup);
  1620. }
  1621. }
  1622. static void _rtl92c_phy_lc_calibrate(struct ieee80211_hw *hw, bool is2t)
  1623. {
  1624. u8 tmpreg;
  1625. u32 rf_a_mode = 0, rf_b_mode = 0, lc_cal;
  1626. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1627. tmpreg = rtl_read_byte(rtlpriv, 0xd03);
  1628. if ((tmpreg & 0x70) != 0)
  1629. rtl_write_byte(rtlpriv, 0xd03, tmpreg & 0x8F);
  1630. else
  1631. rtl_write_byte(rtlpriv, REG_TXPAUSE, 0xFF);
  1632. if ((tmpreg & 0x70) != 0) {
  1633. rf_a_mode = rtl_get_rfreg(hw, RF90_PATH_A, 0x00, MASK12BITS);
  1634. if (is2t)
  1635. rf_b_mode = rtl_get_rfreg(hw, RF90_PATH_B, 0x00,
  1636. MASK12BITS);
  1637. rtl_set_rfreg(hw, RF90_PATH_A, 0x00, MASK12BITS,
  1638. (rf_a_mode & 0x8FFFF) | 0x10000);
  1639. if (is2t)
  1640. rtl_set_rfreg(hw, RF90_PATH_B, 0x00, MASK12BITS,
  1641. (rf_b_mode & 0x8FFFF) | 0x10000);
  1642. }
  1643. lc_cal = rtl_get_rfreg(hw, RF90_PATH_A, 0x18, MASK12BITS);
  1644. rtl_set_rfreg(hw, RF90_PATH_A, 0x18, MASK12BITS, lc_cal | 0x08000);
  1645. mdelay(100);
  1646. if ((tmpreg & 0x70) != 0) {
  1647. rtl_write_byte(rtlpriv, 0xd03, tmpreg);
  1648. rtl_set_rfreg(hw, RF90_PATH_A, 0x00, MASK12BITS, rf_a_mode);
  1649. if (is2t)
  1650. rtl_set_rfreg(hw, RF90_PATH_B, 0x00, MASK12BITS,
  1651. rf_b_mode);
  1652. } else {
  1653. rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00);
  1654. }
  1655. }
  1656. static void _rtl92c_phy_ap_calibrate(struct ieee80211_hw *hw,
  1657. char delta, bool is2t)
  1658. {
  1659. /* This routine is deliberately dummied out for later fixes */
  1660. #if 0
  1661. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1662. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  1663. struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
  1664. u32 reg_d[PATH_NUM];
  1665. u32 tmpreg, index, offset, path, i, pathbound = PATH_NUM, apkbound;
  1666. u32 bb_backup[APK_BB_REG_NUM];
  1667. u32 bb_reg[APK_BB_REG_NUM] = {
  1668. 0x904, 0xc04, 0x800, 0xc08, 0x874
  1669. };
  1670. u32 bb_ap_mode[APK_BB_REG_NUM] = {
  1671. 0x00000020, 0x00a05430, 0x02040000,
  1672. 0x000800e4, 0x00204000
  1673. };
  1674. u32 bb_normal_ap_mode[APK_BB_REG_NUM] = {
  1675. 0x00000020, 0x00a05430, 0x02040000,
  1676. 0x000800e4, 0x22204000
  1677. };
  1678. u32 afe_backup[APK_AFE_REG_NUM];
  1679. u32 afe_reg[APK_AFE_REG_NUM] = {
  1680. 0x85c, 0xe6c, 0xe70, 0xe74, 0xe78,
  1681. 0xe7c, 0xe80, 0xe84, 0xe88, 0xe8c,
  1682. 0xed0, 0xed4, 0xed8, 0xedc, 0xee0,
  1683. 0xeec
  1684. };
  1685. u32 mac_backup[IQK_MAC_REG_NUM];
  1686. u32 mac_reg[IQK_MAC_REG_NUM] = {
  1687. 0x522, 0x550, 0x551, 0x040
  1688. };
  1689. u32 apk_rf_init_value[PATH_NUM][APK_BB_REG_NUM] = {
  1690. {0x0852c, 0x1852c, 0x5852c, 0x1852c, 0x5852c},
  1691. {0x2852e, 0x0852e, 0x3852e, 0x0852e, 0x0852e}
  1692. };
  1693. u32 apk_normal_rf_init_value[PATH_NUM][APK_BB_REG_NUM] = {
  1694. {0x0852c, 0x0a52c, 0x3a52c, 0x5a52c, 0x5a52c},
  1695. {0x0852c, 0x0a52c, 0x5a52c, 0x5a52c, 0x5a52c}
  1696. };
  1697. u32 apk_rf_value_0[PATH_NUM][APK_BB_REG_NUM] = {
  1698. {0x52019, 0x52014, 0x52013, 0x5200f, 0x5208d},
  1699. {0x5201a, 0x52019, 0x52016, 0x52033, 0x52050}
  1700. };
  1701. u32 apk_normal_rf_value_0[PATH_NUM][APK_BB_REG_NUM] = {
  1702. {0x52019, 0x52017, 0x52010, 0x5200d, 0x5206a},
  1703. {0x52019, 0x52017, 0x52010, 0x5200d, 0x5206a}
  1704. };
  1705. u32 afe_on_off[PATH_NUM] = {
  1706. 0x04db25a4, 0x0b1b25a4
  1707. };
  1708. u32 apk_offset[PATH_NUM] = { 0xb68, 0xb6c };
  1709. u32 apk_normal_offset[PATH_NUM] = { 0xb28, 0xb98 };
  1710. u32 apk_value[PATH_NUM] = { 0x92fc0000, 0x12fc0000 };
  1711. u32 apk_normal_value[PATH_NUM] = { 0x92680000, 0x12680000 };
  1712. const char apk_delta_mapping[APK_BB_REG_NUM][13] = {
  1713. {-4, -3, -2, -2, -1, -1, 0, 1, 2, 3, 4, 5, 6},
  1714. {-4, -3, -2, -2, -1, -1, 0, 1, 2, 3, 4, 5, 6},
  1715. {-6, -4, -2, -2, -1, -1, 0, 1, 2, 3, 4, 5, 6},
  1716. {-1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6},
  1717. {-11, -9, -7, -5, -3, -1, 0, 0, 0, 0, 0, 0, 0}
  1718. };
  1719. const u32 apk_normal_setting_value_1[13] = {
  1720. 0x01017018, 0xf7ed8f84, 0x1b1a1816, 0x2522201e, 0x322e2b28,
  1721. 0x433f3a36, 0x5b544e49, 0x7b726a62, 0xa69a8f84, 0xdfcfc0b3,
  1722. 0x12680000, 0x00880000, 0x00880000
  1723. };
  1724. const u32 apk_normal_setting_value_2[16] = {
  1725. 0x01c7021d, 0x01670183, 0x01000123, 0x00bf00e2, 0x008d00a3,
  1726. 0x0068007b, 0x004d0059, 0x003a0042, 0x002b0031, 0x001f0025,
  1727. 0x0017001b, 0x00110014, 0x000c000f, 0x0009000b, 0x00070008,
  1728. 0x00050006
  1729. };
  1730. const u32 apk_result[PATH_NUM][APK_BB_REG_NUM];
  1731. long bb_offset, delta_v, delta_offset;
  1732. if (!is2t)
  1733. pathbound = 1;
  1734. for (index = 0; index < PATH_NUM; index++) {
  1735. apk_offset[index] = apk_normal_offset[index];
  1736. apk_value[index] = apk_normal_value[index];
  1737. afe_on_off[index] = 0x6fdb25a4;
  1738. }
  1739. for (index = 0; index < APK_BB_REG_NUM; index++) {
  1740. for (path = 0; path < pathbound; path++) {
  1741. apk_rf_init_value[path][index] =
  1742. apk_normal_rf_init_value[path][index];
  1743. apk_rf_value_0[path][index] =
  1744. apk_normal_rf_value_0[path][index];
  1745. }
  1746. bb_ap_mode[index] = bb_normal_ap_mode[index];
  1747. apkbound = 6;
  1748. }
  1749. for (index = 0; index < APK_BB_REG_NUM; index++) {
  1750. if (index == 0)
  1751. continue;
  1752. bb_backup[index] = rtl_get_bbreg(hw, bb_reg[index], MASKDWORD);
  1753. }
  1754. _rtl92c_phy_save_mac_registers(hw, mac_reg, mac_backup);
  1755. _rtl92c_phy_save_adda_registers(hw, afe_reg, afe_backup, 16);
  1756. for (path = 0; path < pathbound; path++) {
  1757. if (path == RF90_PATH_A) {
  1758. offset = 0xb00;
  1759. for (index = 0; index < 11; index++) {
  1760. rtl_set_bbreg(hw, offset, MASKDWORD,
  1761. apk_normal_setting_value_1
  1762. [index]);
  1763. offset += 0x04;
  1764. }
  1765. rtl_set_bbreg(hw, 0xb98, MASKDWORD, 0x12680000);
  1766. offset = 0xb68;
  1767. for (; index < 13; index++) {
  1768. rtl_set_bbreg(hw, offset, MASKDWORD,
  1769. apk_normal_setting_value_1
  1770. [index]);
  1771. offset += 0x04;
  1772. }
  1773. rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x40000000);
  1774. offset = 0xb00;
  1775. for (index = 0; index < 16; index++) {
  1776. rtl_set_bbreg(hw, offset, MASKDWORD,
  1777. apk_normal_setting_value_2
  1778. [index]);
  1779. offset += 0x04;
  1780. }
  1781. rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x00000000);
  1782. } else if (path == RF90_PATH_B) {
  1783. offset = 0xb70;
  1784. for (index = 0; index < 10; index++) {
  1785. rtl_set_bbreg(hw, offset, MASKDWORD,
  1786. apk_normal_setting_value_1
  1787. [index]);
  1788. offset += 0x04;
  1789. }
  1790. rtl_set_bbreg(hw, 0xb28, MASKDWORD, 0x12680000);
  1791. rtl_set_bbreg(hw, 0xb98, MASKDWORD, 0x12680000);
  1792. offset = 0xb68;
  1793. index = 11;
  1794. for (; index < 13; index++) {
  1795. rtl_set_bbreg(hw, offset, MASKDWORD,
  1796. apk_normal_setting_value_1
  1797. [index]);
  1798. offset += 0x04;
  1799. }
  1800. rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x40000000);
  1801. offset = 0xb60;
  1802. for (index = 0; index < 16; index++) {
  1803. rtl_set_bbreg(hw, offset, MASKDWORD,
  1804. apk_normal_setting_value_2
  1805. [index]);
  1806. offset += 0x04;
  1807. }
  1808. rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x00000000);
  1809. }
  1810. reg_d[path] = rtl_get_rfreg(hw, (enum radio_path)path,
  1811. 0xd, MASKDWORD);
  1812. for (index = 0; index < APK_AFE_REG_NUM; index++)
  1813. rtl_set_bbreg(hw, afe_reg[index], MASKDWORD,
  1814. afe_on_off[path]);
  1815. if (path == RF90_PATH_A) {
  1816. for (index = 0; index < APK_BB_REG_NUM; index++) {
  1817. if (index == 0)
  1818. continue;
  1819. rtl_set_bbreg(hw, bb_reg[index], MASKDWORD,
  1820. bb_ap_mode[index]);
  1821. }
  1822. }
  1823. _rtl92c_phy_mac_setting_calibration(hw, mac_reg, mac_backup);
  1824. if (path == 0) {
  1825. rtl_set_rfreg(hw, RF90_PATH_B, 0x0, MASKDWORD, 0x10000);
  1826. } else {
  1827. rtl_set_rfreg(hw, RF90_PATH_A, 0x00, MASKDWORD,
  1828. 0x10000);
  1829. rtl_set_rfreg(hw, RF90_PATH_A, 0x10, MASKDWORD,
  1830. 0x1000f);
  1831. rtl_set_rfreg(hw, RF90_PATH_A, 0x11, MASKDWORD,
  1832. 0x20103);
  1833. }
  1834. delta_offset = ((delta + 14) / 2);
  1835. if (delta_offset < 0)
  1836. delta_offset = 0;
  1837. else if (delta_offset > 12)
  1838. delta_offset = 12;
  1839. for (index = 0; index < APK_BB_REG_NUM; index++) {
  1840. if (index != 1)
  1841. continue;
  1842. tmpreg = apk_rf_init_value[path][index];
  1843. if (!rtlefuse->b_apk_thermalmeterignore) {
  1844. bb_offset = (tmpreg & 0xF0000) >> 16;
  1845. if (!(tmpreg & BIT(15)))
  1846. bb_offset = -bb_offset;
  1847. delta_v =
  1848. apk_delta_mapping[index][delta_offset];
  1849. bb_offset += delta_v;
  1850. if (bb_offset < 0) {
  1851. tmpreg = tmpreg & (~BIT(15));
  1852. bb_offset = -bb_offset;
  1853. } else {
  1854. tmpreg = tmpreg | BIT(15);
  1855. }
  1856. tmpreg =
  1857. (tmpreg & 0xFFF0FFFF) | (bb_offset << 16);
  1858. }
  1859. rtl_set_rfreg(hw, (enum radio_path)path, 0xc,
  1860. MASKDWORD, 0x8992e);
  1861. rtl_set_rfreg(hw, (enum radio_path)path, 0x0,
  1862. MASKDWORD, apk_rf_value_0[path][index]);
  1863. rtl_set_rfreg(hw, (enum radio_path)path, 0xd,
  1864. MASKDWORD, tmpreg);
  1865. i = 0;
  1866. do {
  1867. rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x80000000);
  1868. rtl_set_bbreg(hw, apk_offset[path],
  1869. MASKDWORD, apk_value[0]);
  1870. RTPRINT(rtlpriv, FINIT, INIT_IQK,
  1871. ("PHY_APCalibrate() offset 0x%x "
  1872. "value 0x%x\n",
  1873. apk_offset[path],
  1874. rtl_get_bbreg(hw, apk_offset[path],
  1875. MASKDWORD)));
  1876. mdelay(3);
  1877. rtl_set_bbreg(hw, apk_offset[path],
  1878. MASKDWORD, apk_value[1]);
  1879. RTPRINT(rtlpriv, FINIT, INIT_IQK,
  1880. ("PHY_APCalibrate() offset 0x%x "
  1881. "value 0x%x\n",
  1882. apk_offset[path],
  1883. rtl_get_bbreg(hw, apk_offset[path],
  1884. MASKDWORD)));
  1885. mdelay(20);
  1886. rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x00000000);
  1887. if (path == RF90_PATH_A)
  1888. tmpreg = rtl_get_bbreg(hw, 0xbd8,
  1889. 0x03E00000);
  1890. else
  1891. tmpreg = rtl_get_bbreg(hw, 0xbd8,
  1892. 0xF8000000);
  1893. RTPRINT(rtlpriv, FINIT, INIT_IQK,
  1894. ("PHY_APCalibrate() offset "
  1895. "0xbd8[25:21] %x\n", tmpreg));
  1896. i++;
  1897. } while (tmpreg > apkbound && i < 4);
  1898. apk_result[path][index] = tmpreg;
  1899. }
  1900. }
  1901. _rtl92c_phy_reload_mac_registers(hw, mac_reg, mac_backup);
  1902. for (index = 0; index < APK_BB_REG_NUM; index++) {
  1903. if (index == 0)
  1904. continue;
  1905. rtl_set_bbreg(hw, bb_reg[index], MASKDWORD, bb_backup[index]);
  1906. }
  1907. _rtl92c_phy_reload_adda_registers(hw, afe_reg, afe_backup, 16);
  1908. for (path = 0; path < pathbound; path++) {
  1909. rtl_set_rfreg(hw, (enum radio_path)path, 0xd,
  1910. MASKDWORD, reg_d[path]);
  1911. if (path == RF90_PATH_B) {
  1912. rtl_set_rfreg(hw, RF90_PATH_A, 0x10, MASKDWORD,
  1913. 0x1000f);
  1914. rtl_set_rfreg(hw, RF90_PATH_A, 0x11, MASKDWORD,
  1915. 0x20101);
  1916. }
  1917. if (apk_result[path][1] > 6)
  1918. apk_result[path][1] = 6;
  1919. }
  1920. for (path = 0; path < pathbound; path++) {
  1921. rtl_set_rfreg(hw, (enum radio_path)path, 0x3, MASKDWORD,
  1922. ((apk_result[path][1] << 15) |
  1923. (apk_result[path][1] << 10) |
  1924. (apk_result[path][1] << 5) |
  1925. apk_result[path][1]));
  1926. if (path == RF90_PATH_A)
  1927. rtl_set_rfreg(hw, (enum radio_path)path, 0x4, MASKDWORD,
  1928. ((apk_result[path][1] << 15) |
  1929. (apk_result[path][1] << 10) |
  1930. (0x00 << 5) | 0x05));
  1931. else
  1932. rtl_set_rfreg(hw, (enum radio_path)path, 0x4, MASKDWORD,
  1933. ((apk_result[path][1] << 15) |
  1934. (apk_result[path][1] << 10) |
  1935. (0x02 << 5) | 0x05));
  1936. rtl_set_rfreg(hw, (enum radio_path)path, 0xe, MASKDWORD,
  1937. ((0x08 << 15) | (0x08 << 10) | (0x08 << 5) |
  1938. 0x08));
  1939. }
  1940. rtlphy->b_apk_done = true;
  1941. #endif
  1942. }
  1943. static void _rtl92c_phy_set_rfpath_switch(struct ieee80211_hw *hw,
  1944. bool bmain, bool is2t)
  1945. {
  1946. struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
  1947. if (is_hal_stop(rtlhal)) {
  1948. rtl_set_bbreg(hw, REG_LEDCFG0, BIT(23), 0x01);
  1949. rtl_set_bbreg(hw, rFPGA0_XAB_RFPARAMETER, BIT(13), 0x01);
  1950. }
  1951. if (is2t) {
  1952. if (bmain)
  1953. rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE,
  1954. BIT(5) | BIT(6), 0x1);
  1955. else
  1956. rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE,
  1957. BIT(5) | BIT(6), 0x2);
  1958. } else {
  1959. if (bmain)
  1960. rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE, 0x300, 0x2);
  1961. else
  1962. rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE, 0x300, 0x1);
  1963. }
  1964. }
  1965. #undef IQK_ADDA_REG_NUM
  1966. #undef IQK_DELAY_TIME
  1967. void rtl92c_phy_iq_calibrate(struct ieee80211_hw *hw, bool b_recovery)
  1968. {
  1969. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1970. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  1971. struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
  1972. long result[4][8];
  1973. u8 i, final_candidate;
  1974. bool b_patha_ok, b_pathb_ok;
  1975. long reg_e94, reg_e9c, reg_ea4, reg_eac, reg_eb4, reg_ebc, reg_ec4,
  1976. reg_ecc, reg_tmp = 0;
  1977. bool is12simular, is13simular, is23simular;
  1978. bool b_start_conttx = false, b_singletone = false;
  1979. u32 iqk_bb_reg[10] = {
  1980. ROFDM0_XARXIQIMBALANCE,
  1981. ROFDM0_XBRXIQIMBALANCE,
  1982. ROFDM0_ECCATHRESHOLD,
  1983. ROFDM0_AGCRSSITABLE,
  1984. ROFDM0_XATXIQIMBALANCE,
  1985. ROFDM0_XBTXIQIMBALANCE,
  1986. ROFDM0_XCTXIQIMBALANCE,
  1987. ROFDM0_XCTXAFE,
  1988. ROFDM0_XDTXAFE,
  1989. ROFDM0_RXIQEXTANTA
  1990. };
  1991. if (b_recovery) {
  1992. _rtl92c_phy_reload_adda_registers(hw,
  1993. iqk_bb_reg,
  1994. rtlphy->iqk_bb_backup, 10);
  1995. return;
  1996. }
  1997. if (b_start_conttx || b_singletone)
  1998. return;
  1999. for (i = 0; i < 8; i++) {
  2000. result[0][i] = 0;
  2001. result[1][i] = 0;
  2002. result[2][i] = 0;
  2003. result[3][i] = 0;
  2004. }
  2005. final_candidate = 0xff;
  2006. b_patha_ok = false;
  2007. b_pathb_ok = false;
  2008. is12simular = false;
  2009. is23simular = false;
  2010. is13simular = false;
  2011. for (i = 0; i < 3; i++) {
  2012. if (IS_92C_SERIAL(rtlhal->version))
  2013. _rtl92c_phy_iq_calibrate(hw, result, i, true);
  2014. else
  2015. _rtl92c_phy_iq_calibrate(hw, result, i, false);
  2016. if (i == 1) {
  2017. is12simular = _rtl92c_phy_simularity_compare(hw,
  2018. result, 0,
  2019. 1);
  2020. if (is12simular) {
  2021. final_candidate = 0;
  2022. break;
  2023. }
  2024. }
  2025. if (i == 2) {
  2026. is13simular = _rtl92c_phy_simularity_compare(hw,
  2027. result, 0,
  2028. 2);
  2029. if (is13simular) {
  2030. final_candidate = 0;
  2031. break;
  2032. }
  2033. is23simular = _rtl92c_phy_simularity_compare(hw,
  2034. result, 1,
  2035. 2);
  2036. if (is23simular)
  2037. final_candidate = 1;
  2038. else {
  2039. for (i = 0; i < 8; i++)
  2040. reg_tmp += result[3][i];
  2041. if (reg_tmp != 0)
  2042. final_candidate = 3;
  2043. else
  2044. final_candidate = 0xFF;
  2045. }
  2046. }
  2047. }
  2048. for (i = 0; i < 4; i++) {
  2049. reg_e94 = result[i][0];
  2050. reg_e9c = result[i][1];
  2051. reg_ea4 = result[i][2];
  2052. reg_eac = result[i][3];
  2053. reg_eb4 = result[i][4];
  2054. reg_ebc = result[i][5];
  2055. reg_ec4 = result[i][6];
  2056. reg_ecc = result[i][7];
  2057. }
  2058. if (final_candidate != 0xff) {
  2059. rtlphy->reg_e94 = reg_e94 = result[final_candidate][0];
  2060. rtlphy->reg_e9c = reg_e9c = result[final_candidate][1];
  2061. reg_ea4 = result[final_candidate][2];
  2062. reg_eac = result[final_candidate][3];
  2063. rtlphy->reg_eb4 = reg_eb4 = result[final_candidate][4];
  2064. rtlphy->reg_ebc = reg_ebc = result[final_candidate][5];
  2065. reg_ec4 = result[final_candidate][6];
  2066. reg_ecc = result[final_candidate][7];
  2067. b_patha_ok = b_pathb_ok = true;
  2068. } else {
  2069. rtlphy->reg_e94 = rtlphy->reg_eb4 = 0x100;
  2070. rtlphy->reg_e9c = rtlphy->reg_ebc = 0x0;
  2071. }
  2072. if (reg_e94 != 0) /*&&(reg_ea4 != 0) */
  2073. _rtl92c_phy_path_a_fill_iqk_matrix(hw, b_patha_ok, result,
  2074. final_candidate,
  2075. (reg_ea4 == 0));
  2076. if (IS_92C_SERIAL(rtlhal->version)) {
  2077. if (reg_eb4 != 0) /*&&(reg_ec4 != 0) */
  2078. _rtl92c_phy_path_b_fill_iqk_matrix(hw, b_pathb_ok,
  2079. result,
  2080. final_candidate,
  2081. (reg_ec4 == 0));
  2082. }
  2083. _rtl92c_phy_save_adda_registers(hw, iqk_bb_reg,
  2084. rtlphy->iqk_bb_backup, 10);
  2085. }
  2086. void rtl92c_phy_lc_calibrate(struct ieee80211_hw *hw)
  2087. {
  2088. struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
  2089. bool b_start_conttx = false, b_singletone = false;
  2090. if (b_start_conttx || b_singletone)
  2091. return;
  2092. if (IS_92C_SERIAL(rtlhal->version))
  2093. _rtl92c_phy_lc_calibrate(hw, true);
  2094. else
  2095. _rtl92c_phy_lc_calibrate(hw, false);
  2096. }
  2097. void rtl92c_phy_ap_calibrate(struct ieee80211_hw *hw, char delta)
  2098. {
  2099. struct rtl_priv *rtlpriv = rtl_priv(hw);
  2100. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  2101. struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
  2102. if (rtlphy->b_apk_done)
  2103. return;
  2104. if (IS_92C_SERIAL(rtlhal->version))
  2105. _rtl92c_phy_ap_calibrate(hw, delta, true);
  2106. else
  2107. _rtl92c_phy_ap_calibrate(hw, delta, false);
  2108. }
  2109. void rtl92c_phy_set_rfpath_switch(struct ieee80211_hw *hw, bool bmain)
  2110. {
  2111. struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
  2112. if (IS_92C_SERIAL(rtlhal->version))
  2113. _rtl92c_phy_set_rfpath_switch(hw, bmain, true);
  2114. else
  2115. _rtl92c_phy_set_rfpath_switch(hw, bmain, false);
  2116. }
  2117. bool rtl92c_phy_set_io_cmd(struct ieee80211_hw *hw, enum io_type iotype)
  2118. {
  2119. struct rtl_priv *rtlpriv = rtl_priv(hw);
  2120. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  2121. bool b_postprocessing = false;
  2122. RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
  2123. ("-->IO Cmd(%#x), set_io_inprogress(%d)\n",
  2124. iotype, rtlphy->set_io_inprogress));
  2125. do {
  2126. switch (iotype) {
  2127. case IO_CMD_RESUME_DM_BY_SCAN:
  2128. RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
  2129. ("[IO CMD] Resume DM after scan.\n"));
  2130. b_postprocessing = true;
  2131. break;
  2132. case IO_CMD_PAUSE_DM_BY_SCAN:
  2133. RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
  2134. ("[IO CMD] Pause DM before scan.\n"));
  2135. b_postprocessing = true;
  2136. break;
  2137. default:
  2138. RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
  2139. ("switch case not process\n"));
  2140. break;
  2141. }
  2142. } while (false);
  2143. if (b_postprocessing && !rtlphy->set_io_inprogress) {
  2144. rtlphy->set_io_inprogress = true;
  2145. rtlphy->current_io_type = iotype;
  2146. } else {
  2147. return false;
  2148. }
  2149. rtl92c_phy_set_io(hw);
  2150. RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE, ("<--IO Type(%#x)\n", iotype));
  2151. return true;
  2152. }
  2153. void rtl92c_phy_set_io(struct ieee80211_hw *hw)
  2154. {
  2155. struct rtl_priv *rtlpriv = rtl_priv(hw);
  2156. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  2157. RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
  2158. ("--->Cmd(%#x), set_io_inprogress(%d)\n",
  2159. rtlphy->current_io_type, rtlphy->set_io_inprogress));
  2160. switch (rtlphy->current_io_type) {
  2161. case IO_CMD_RESUME_DM_BY_SCAN:
  2162. dm_digtable.cur_igvalue = rtlphy->initgain_backup.xaagccore1;
  2163. rtl92c_dm_write_dig(hw);
  2164. rtl92c_phy_set_txpower_level(hw, rtlphy->current_channel);
  2165. break;
  2166. case IO_CMD_PAUSE_DM_BY_SCAN:
  2167. rtlphy->initgain_backup.xaagccore1 = dm_digtable.cur_igvalue;
  2168. dm_digtable.cur_igvalue = 0x17;
  2169. rtl92c_dm_write_dig(hw);
  2170. break;
  2171. default:
  2172. RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
  2173. ("switch case not process\n"));
  2174. break;
  2175. }
  2176. rtlphy->set_io_inprogress = false;
  2177. RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
  2178. ("<---(%#x)\n", rtlphy->current_io_type));
  2179. }
  2180. void rtl92ce_phy_set_rf_on(struct ieee80211_hw *hw)
  2181. {
  2182. struct rtl_priv *rtlpriv = rtl_priv(hw);
  2183. rtl_write_byte(rtlpriv, REG_SPS0_CTRL, 0x2b);
  2184. rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3);
  2185. rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x00);
  2186. rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE2);
  2187. rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3);
  2188. rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00);
  2189. }
  2190. static void _rtl92ce_phy_set_rf_sleep(struct ieee80211_hw *hw)
  2191. {
  2192. u32 u4b_tmp;
  2193. u8 delay = 5;
  2194. struct rtl_priv *rtlpriv = rtl_priv(hw);
  2195. rtl_write_byte(rtlpriv, REG_TXPAUSE, 0xFF);
  2196. rtl_set_rfreg(hw, RF90_PATH_A, 0x00, RFREG_OFFSET_MASK, 0x00);
  2197. rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x40);
  2198. u4b_tmp = rtl_get_rfreg(hw, RF90_PATH_A, 0, RFREG_OFFSET_MASK);
  2199. while (u4b_tmp != 0 && delay > 0) {
  2200. rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x0);
  2201. rtl_set_rfreg(hw, RF90_PATH_A, 0x00, RFREG_OFFSET_MASK, 0x00);
  2202. rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x40);
  2203. u4b_tmp = rtl_get_rfreg(hw, RF90_PATH_A, 0, RFREG_OFFSET_MASK);
  2204. delay--;
  2205. }
  2206. if (delay == 0) {
  2207. rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x00);
  2208. rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE2);
  2209. rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3);
  2210. rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00);
  2211. RT_TRACE(rtlpriv, COMP_POWER, DBG_TRACE,
  2212. ("Switch RF timeout !!!.\n"));
  2213. return;
  2214. }
  2215. rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE2);
  2216. rtl_write_byte(rtlpriv, REG_SPS0_CTRL, 0x22);
  2217. }
  2218. static bool _rtl92ce_phy_set_rf_power_state(struct ieee80211_hw *hw,
  2219. enum rf_pwrstate rfpwr_state)
  2220. {
  2221. struct rtl_priv *rtlpriv = rtl_priv(hw);
  2222. struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
  2223. struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
  2224. struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
  2225. bool bresult = true;
  2226. u8 i, queue_id;
  2227. struct rtl8192_tx_ring *ring = NULL;
  2228. ppsc->set_rfpowerstate_inprogress = true;
  2229. switch (rfpwr_state) {
  2230. case ERFON:{
  2231. if ((ppsc->rfpwr_state == ERFOFF) &&
  2232. RT_IN_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC)) {
  2233. bool rtstatus;
  2234. u32 InitializeCount = 0;
  2235. do {
  2236. InitializeCount++;
  2237. RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
  2238. ("IPS Set eRf nic enable\n"));
  2239. rtstatus = rtl_ps_enable_nic(hw);
  2240. } while ((rtstatus != true)
  2241. && (InitializeCount < 10));
  2242. RT_CLEAR_PS_LEVEL(ppsc,
  2243. RT_RF_OFF_LEVL_HALT_NIC);
  2244. } else {
  2245. RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
  2246. ("Set ERFON sleeped:%d ms\n",
  2247. jiffies_to_msecs(jiffies -
  2248. ppsc->
  2249. last_sleep_jiffies)));
  2250. ppsc->last_awake_jiffies = jiffies;
  2251. rtl92ce_phy_set_rf_on(hw);
  2252. }
  2253. if (mac->link_state == MAC80211_LINKED) {
  2254. rtlpriv->cfg->ops->led_control(hw,
  2255. LED_CTL_LINK);
  2256. } else {
  2257. rtlpriv->cfg->ops->led_control(hw,
  2258. LED_CTL_NO_LINK);
  2259. }
  2260. break;
  2261. }
  2262. case ERFOFF:{
  2263. for (queue_id = 0, i = 0;
  2264. queue_id < RTL_PCI_MAX_TX_QUEUE_COUNT;) {
  2265. ring = &pcipriv->dev.tx_ring[queue_id];
  2266. if (skb_queue_len(&ring->queue) == 0 ||
  2267. queue_id == BEACON_QUEUE) {
  2268. queue_id++;
  2269. continue;
  2270. } else {
  2271. RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
  2272. ("eRf Off/Sleep: %d times "
  2273. "TcbBusyQueue[%d] "
  2274. "=%d before doze!\n", (i + 1),
  2275. queue_id,
  2276. skb_queue_len(&ring->queue)));
  2277. udelay(10);
  2278. i++;
  2279. }
  2280. if (i >= MAX_DOZE_WAITING_TIMES_9x) {
  2281. RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
  2282. ("\nERFOFF: %d times "
  2283. "TcbBusyQueue[%d] = %d !\n",
  2284. MAX_DOZE_WAITING_TIMES_9x,
  2285. queue_id,
  2286. skb_queue_len(&ring->queue)));
  2287. break;
  2288. }
  2289. }
  2290. if (ppsc->reg_rfps_level & RT_RF_OFF_LEVL_HALT_NIC) {
  2291. RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
  2292. ("IPS Set eRf nic disable\n"));
  2293. rtl_ps_disable_nic(hw);
  2294. RT_SET_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC);
  2295. } else {
  2296. if (ppsc->rfoff_reason == RF_CHANGE_BY_IPS) {
  2297. rtlpriv->cfg->ops->led_control(hw,
  2298. LED_CTL_NO_LINK);
  2299. } else {
  2300. rtlpriv->cfg->ops->led_control(hw,
  2301. LED_CTL_POWER_OFF);
  2302. }
  2303. }
  2304. break;
  2305. }
  2306. case ERFSLEEP:{
  2307. if (ppsc->rfpwr_state == ERFOFF)
  2308. break;
  2309. for (queue_id = 0, i = 0;
  2310. queue_id < RTL_PCI_MAX_TX_QUEUE_COUNT;) {
  2311. ring = &pcipriv->dev.tx_ring[queue_id];
  2312. if (skb_queue_len(&ring->queue) == 0) {
  2313. queue_id++;
  2314. continue;
  2315. } else {
  2316. RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
  2317. ("eRf Off/Sleep: %d times "
  2318. "TcbBusyQueue[%d] =%d before "
  2319. "doze!\n", (i + 1), queue_id,
  2320. skb_queue_len(&ring->queue)));
  2321. udelay(10);
  2322. i++;
  2323. }
  2324. if (i >= MAX_DOZE_WAITING_TIMES_9x) {
  2325. RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
  2326. ("\n ERFSLEEP: %d times "
  2327. "TcbBusyQueue[%d] = %d !\n",
  2328. MAX_DOZE_WAITING_TIMES_9x,
  2329. queue_id,
  2330. skb_queue_len(&ring->queue)));
  2331. break;
  2332. }
  2333. }
  2334. RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
  2335. ("Set ERFSLEEP awaked:%d ms\n",
  2336. jiffies_to_msecs(jiffies -
  2337. ppsc->last_awake_jiffies)));
  2338. ppsc->last_sleep_jiffies = jiffies;
  2339. _rtl92ce_phy_set_rf_sleep(hw);
  2340. break;
  2341. }
  2342. default:
  2343. RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
  2344. ("switch case not process\n"));
  2345. bresult = false;
  2346. break;
  2347. }
  2348. if (bresult)
  2349. ppsc->rfpwr_state = rfpwr_state;
  2350. ppsc->set_rfpowerstate_inprogress = false;
  2351. return bresult;
  2352. }
  2353. bool rtl92c_phy_set_rf_power_state(struct ieee80211_hw *hw,
  2354. enum rf_pwrstate rfpwr_state)
  2355. {
  2356. struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
  2357. bool bresult = false;
  2358. if (rfpwr_state == ppsc->rfpwr_state)
  2359. return bresult;
  2360. bresult = _rtl92ce_phy_set_rf_power_state(hw, rfpwr_state);
  2361. return bresult;
  2362. }