phy.c 63 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202
  1. /******************************************************************************
  2. *
  3. * Copyright(c) 2009-2013 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 void set_baseband_phy_config(struct ieee80211_hw *hw);
  39. static void set_baseband_agc_config(struct ieee80211_hw *hw);
  40. static void store_pwrindex_offset(struct ieee80211_hw *hw,
  41. u32 regaddr, u32 bitmask,
  42. u32 data);
  43. static bool check_cond(struct ieee80211_hw *hw, const u32 condition);
  44. static u32 rf_serial_read(struct ieee80211_hw *hw,
  45. enum radio_path rfpath, u32 offset)
  46. {
  47. struct rtl_priv *rtlpriv = rtl_priv(hw);
  48. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  49. struct bb_reg_def *phreg = &rtlphy->phyreg_def[rfpath];
  50. u32 newoffset;
  51. u32 tmplong, tmplong2;
  52. u8 rfpi_enable = 0;
  53. u32 ret;
  54. int jj = RF90_PATH_A;
  55. int kk = RF90_PATH_B;
  56. offset &= 0xff;
  57. newoffset = offset;
  58. if (RT_CANNOT_IO(hw)) {
  59. RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "return all one\n");
  60. return 0xFFFFFFFF;
  61. }
  62. tmplong = rtl_get_bbreg(hw, RFPGA0_XA_HSSIPARAMETER2, MASKDWORD);
  63. if (rfpath == jj)
  64. tmplong2 = tmplong;
  65. else
  66. tmplong2 = rtl_get_bbreg(hw, phreg->rfhssi_para2, MASKDWORD);
  67. tmplong2 = (tmplong2 & (~BLSSIREADADDRESS)) |
  68. (newoffset << 23) | BLSSIREADEDGE;
  69. rtl_set_bbreg(hw, RFPGA0_XA_HSSIPARAMETER2, MASKDWORD,
  70. tmplong & (~BLSSIREADEDGE));
  71. mdelay(1);
  72. rtl_set_bbreg(hw, phreg->rfhssi_para2, MASKDWORD, tmplong2);
  73. mdelay(2);
  74. if (rfpath == jj)
  75. rfpi_enable = (u8) rtl_get_bbreg(hw, RFPGA0_XA_HSSIPARAMETER1,
  76. BIT(8));
  77. else if (rfpath == kk)
  78. rfpi_enable = (u8) rtl_get_bbreg(hw, RFPGA0_XB_HSSIPARAMETER1,
  79. BIT(8));
  80. if (rfpi_enable)
  81. ret = rtl_get_bbreg(hw, phreg->rf_rbpi, BLSSIREADBACKDATA);
  82. else
  83. ret = rtl_get_bbreg(hw, phreg->rf_rb, BLSSIREADBACKDATA);
  84. RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, "RFR-%d Addr[0x%x]= 0x%x\n",
  85. rfpath, phreg->rf_rb, ret);
  86. return ret;
  87. }
  88. static void rf_serial_write(struct ieee80211_hw *hw,
  89. enum radio_path rfpath, u32 offset,
  90. u32 data)
  91. {
  92. u32 data_and_addr;
  93. u32 newoffset;
  94. struct rtl_priv *rtlpriv = rtl_priv(hw);
  95. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  96. struct bb_reg_def *phreg = &rtlphy->phyreg_def[rfpath];
  97. if (RT_CANNOT_IO(hw)) {
  98. RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "stop\n");
  99. return;
  100. }
  101. offset &= 0xff;
  102. newoffset = offset;
  103. data_and_addr = ((newoffset << 20) | (data & 0x000fffff)) & 0x0fffffff;
  104. rtl_set_bbreg(hw, phreg->rf3wire_offset, MASKDWORD, data_and_addr);
  105. RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, "RFW-%d Addr[0x%x]= 0x%x\n",
  106. rfpath, phreg->rf3wire_offset, data_and_addr);
  107. }
  108. static u32 cal_bit_shift(u32 bitmask)
  109. {
  110. u32 i;
  111. for (i = 0; i <= 31; i++) {
  112. if (((bitmask >> i) & 0x1) == 1)
  113. break;
  114. }
  115. return i;
  116. }
  117. static bool config_bb_with_header(struct ieee80211_hw *hw,
  118. u8 configtype)
  119. {
  120. if (configtype == BASEBAND_CONFIG_PHY_REG)
  121. set_baseband_phy_config(hw);
  122. else if (configtype == BASEBAND_CONFIG_AGC_TAB)
  123. set_baseband_agc_config(hw);
  124. return true;
  125. }
  126. static bool config_bb_with_pgheader(struct ieee80211_hw *hw,
  127. u8 configtype)
  128. {
  129. struct rtl_priv *rtlpriv = rtl_priv(hw);
  130. int i;
  131. u32 *table_pg;
  132. u16 tbl_page_len;
  133. u32 v1 = 0, v2 = 0;
  134. tbl_page_len = RTL8188EEPHY_REG_ARRAY_PGLEN;
  135. table_pg = RTL8188EEPHY_REG_ARRAY_PG;
  136. if (configtype == BASEBAND_CONFIG_PHY_REG) {
  137. for (i = 0; i < tbl_page_len; i = i + 3) {
  138. v1 = table_pg[i];
  139. v2 = table_pg[i + 1];
  140. if (v1 < 0xcdcdcdcd) {
  141. if (table_pg[i] == 0xfe)
  142. mdelay(50);
  143. else if (table_pg[i] == 0xfd)
  144. mdelay(5);
  145. else if (table_pg[i] == 0xfc)
  146. mdelay(1);
  147. else if (table_pg[i] == 0xfb)
  148. udelay(50);
  149. else if (table_pg[i] == 0xfa)
  150. udelay(5);
  151. else if (table_pg[i] == 0xf9)
  152. udelay(1);
  153. store_pwrindex_offset(hw, table_pg[i],
  154. table_pg[i + 1],
  155. table_pg[i + 2]);
  156. continue;
  157. } else {
  158. if (!check_cond(hw, table_pg[i])) {
  159. /*don't need the hw_body*/
  160. i += 2; /* skip the pair of expression*/
  161. v1 = table_pg[i];
  162. v2 = table_pg[i + 1];
  163. while (v2 != 0xDEAD) {
  164. i += 3;
  165. v1 = table_pg[i];
  166. v2 = table_pg[i + 1];
  167. }
  168. }
  169. }
  170. }
  171. } else {
  172. RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE,
  173. "configtype != BaseBand_Config_PHY_REG\n");
  174. }
  175. return true;
  176. }
  177. static bool config_parafile(struct ieee80211_hw *hw)
  178. {
  179. struct rtl_priv *rtlpriv = rtl_priv(hw);
  180. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  181. struct rtl_efuse *fuse = rtl_efuse(rtl_priv(hw));
  182. bool rtstatus;
  183. rtstatus = config_bb_with_header(hw, BASEBAND_CONFIG_PHY_REG);
  184. if (rtstatus != true) {
  185. RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "Write BB Reg Fail!!");
  186. return false;
  187. }
  188. if (fuse->autoload_failflag == false) {
  189. rtlphy->pwrgroup_cnt = 0;
  190. rtstatus = config_bb_with_pgheader(hw, BASEBAND_CONFIG_PHY_REG);
  191. }
  192. if (rtstatus != true) {
  193. RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "BB_PG Reg Fail!!");
  194. return false;
  195. }
  196. rtstatus = config_bb_with_header(hw, BASEBAND_CONFIG_AGC_TAB);
  197. if (rtstatus != true) {
  198. RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "AGC Table Fail\n");
  199. return false;
  200. }
  201. rtlphy->cck_high_power = (bool) (rtl_get_bbreg(hw,
  202. RFPGA0_XA_HSSIPARAMETER2, 0x200));
  203. return true;
  204. }
  205. static void rtl88e_phy_init_bb_rf_register_definition(struct ieee80211_hw *hw)
  206. {
  207. struct rtl_priv *rtlpriv = rtl_priv(hw);
  208. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  209. int jj = RF90_PATH_A;
  210. int kk = RF90_PATH_B;
  211. rtlphy->phyreg_def[jj].rfintfs = RFPGA0_XAB_RFINTERFACESW;
  212. rtlphy->phyreg_def[kk].rfintfs = RFPGA0_XAB_RFINTERFACESW;
  213. rtlphy->phyreg_def[RF90_PATH_C].rfintfs = RFPGA0_XCD_RFINTERFACESW;
  214. rtlphy->phyreg_def[RF90_PATH_D].rfintfs = RFPGA0_XCD_RFINTERFACESW;
  215. rtlphy->phyreg_def[jj].rfintfi = RFPGA0_XAB_RFINTERFACERB;
  216. rtlphy->phyreg_def[kk].rfintfi = RFPGA0_XAB_RFINTERFACERB;
  217. rtlphy->phyreg_def[RF90_PATH_C].rfintfi = RFPGA0_XCD_RFINTERFACERB;
  218. rtlphy->phyreg_def[RF90_PATH_D].rfintfi = RFPGA0_XCD_RFINTERFACERB;
  219. rtlphy->phyreg_def[jj].rfintfo = RFPGA0_XA_RFINTERFACEOE;
  220. rtlphy->phyreg_def[kk].rfintfo = RFPGA0_XB_RFINTERFACEOE;
  221. rtlphy->phyreg_def[jj].rfintfe = RFPGA0_XA_RFINTERFACEOE;
  222. rtlphy->phyreg_def[kk].rfintfe = RFPGA0_XB_RFINTERFACEOE;
  223. rtlphy->phyreg_def[jj].rf3wire_offset = RFPGA0_XA_LSSIPARAMETER;
  224. rtlphy->phyreg_def[kk].rf3wire_offset = RFPGA0_XB_LSSIPARAMETER;
  225. rtlphy->phyreg_def[jj].rflssi_select = rFPGA0_XAB_RFPARAMETER;
  226. rtlphy->phyreg_def[kk].rflssi_select = rFPGA0_XAB_RFPARAMETER;
  227. rtlphy->phyreg_def[RF90_PATH_C].rflssi_select = rFPGA0_XCD_RFPARAMETER;
  228. rtlphy->phyreg_def[RF90_PATH_D].rflssi_select = rFPGA0_XCD_RFPARAMETER;
  229. rtlphy->phyreg_def[jj].rftxgain_stage = RFPGA0_TXGAINSTAGE;
  230. rtlphy->phyreg_def[kk].rftxgain_stage = RFPGA0_TXGAINSTAGE;
  231. rtlphy->phyreg_def[RF90_PATH_C].rftxgain_stage = RFPGA0_TXGAINSTAGE;
  232. rtlphy->phyreg_def[RF90_PATH_D].rftxgain_stage = RFPGA0_TXGAINSTAGE;
  233. rtlphy->phyreg_def[jj].rfhssi_para1 = RFPGA0_XA_HSSIPARAMETER1;
  234. rtlphy->phyreg_def[kk].rfhssi_para1 = RFPGA0_XB_HSSIPARAMETER1;
  235. rtlphy->phyreg_def[jj].rfhssi_para2 = RFPGA0_XA_HSSIPARAMETER2;
  236. rtlphy->phyreg_def[kk].rfhssi_para2 = RFPGA0_XB_HSSIPARAMETER2;
  237. rtlphy->phyreg_def[jj].rfsw_ctrl = RFPGA0_XAB_SWITCHCONTROL;
  238. rtlphy->phyreg_def[kk].rfsw_ctrl = RFPGA0_XAB_SWITCHCONTROL;
  239. rtlphy->phyreg_def[RF90_PATH_C].rfsw_ctrl = RFPGA0_XCD_SWITCHCONTROL;
  240. rtlphy->phyreg_def[RF90_PATH_D].rfsw_ctrl = RFPGA0_XCD_SWITCHCONTROL;
  241. rtlphy->phyreg_def[jj].rfagc_control1 = ROFDM0_XAAGCCORE1;
  242. rtlphy->phyreg_def[kk].rfagc_control1 = ROFDM0_XBAGCCORE1;
  243. rtlphy->phyreg_def[RF90_PATH_C].rfagc_control1 = ROFDM0_XCAGCCORE1;
  244. rtlphy->phyreg_def[RF90_PATH_D].rfagc_control1 = ROFDM0_XDAGCCORE1;
  245. rtlphy->phyreg_def[jj].rfagc_control2 = ROFDM0_XAAGCCORE2;
  246. rtlphy->phyreg_def[kk].rfagc_control2 = ROFDM0_XBAGCCORE2;
  247. rtlphy->phyreg_def[RF90_PATH_C].rfagc_control2 = ROFDM0_XCAGCCORE2;
  248. rtlphy->phyreg_def[RF90_PATH_D].rfagc_control2 = ROFDM0_XDAGCCORE2;
  249. rtlphy->phyreg_def[jj].rfrxiq_imbal = ROFDM0_XARXIQIMBAL;
  250. rtlphy->phyreg_def[kk].rfrxiq_imbal = ROFDM0_XBRXIQIMBAL;
  251. rtlphy->phyreg_def[RF90_PATH_C].rfrxiq_imbal = ROFDM0_XCRXIQIMBAL;
  252. rtlphy->phyreg_def[RF90_PATH_D].rfrxiq_imbal = ROFDM0_XDRXIQIMBAL;
  253. rtlphy->phyreg_def[jj].rfrx_afe = ROFDM0_XARXAFE;
  254. rtlphy->phyreg_def[kk].rfrx_afe = ROFDM0_XBRXAFE;
  255. rtlphy->phyreg_def[RF90_PATH_C].rfrx_afe = ROFDM0_XCRXAFE;
  256. rtlphy->phyreg_def[RF90_PATH_D].rfrx_afe = ROFDM0_XDRXAFE;
  257. rtlphy->phyreg_def[jj].rftxiq_imbal = ROFDM0_XATXIQIMBAL;
  258. rtlphy->phyreg_def[kk].rftxiq_imbal = ROFDM0_XBTXIQIMBAL;
  259. rtlphy->phyreg_def[RF90_PATH_C].rftxiq_imbal = ROFDM0_XCTXIQIMBAL;
  260. rtlphy->phyreg_def[RF90_PATH_D].rftxiq_imbal = ROFDM0_XDTXIQIMBAL;
  261. rtlphy->phyreg_def[jj].rftx_afe = ROFDM0_XATXAFE;
  262. rtlphy->phyreg_def[kk].rftx_afe = ROFDM0_XBTXAFE;
  263. rtlphy->phyreg_def[jj].rf_rb = RFPGA0_XA_LSSIREADBACK;
  264. rtlphy->phyreg_def[kk].rf_rb = RFPGA0_XB_LSSIREADBACK;
  265. rtlphy->phyreg_def[jj].rf_rbpi = TRANSCEIVEA_HSPI_READBACK;
  266. rtlphy->phyreg_def[kk].rf_rbpi = TRANSCEIVEB_HSPI_READBACK;
  267. }
  268. static bool rtl88e_phy_set_sw_chnl_cmdarray(struct swchnlcmd *cmdtable,
  269. u32 cmdtableidx, u32 cmdtablesz,
  270. enum swchnlcmd_id cmdid,
  271. u32 para1, u32 para2, u32 msdelay)
  272. {
  273. struct swchnlcmd *pcmd;
  274. if (cmdtable == NULL) {
  275. RT_ASSERT(false, "cmdtable cannot be NULL.\n");
  276. return false;
  277. }
  278. if (cmdtableidx >= cmdtablesz)
  279. return false;
  280. pcmd = cmdtable + cmdtableidx;
  281. pcmd->cmdid = cmdid;
  282. pcmd->para1 = para1;
  283. pcmd->para2 = para2;
  284. pcmd->msdelay = msdelay;
  285. return true;
  286. }
  287. static bool chnl_step_by_step(struct ieee80211_hw *hw,
  288. u8 channel, u8 *stage, u8 *step,
  289. u32 *delay)
  290. {
  291. struct rtl_priv *rtlpriv = rtl_priv(hw);
  292. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  293. struct swchnlcmd precommoncmd[MAX_PRECMD_CNT];
  294. u32 precommoncmdcnt;
  295. struct swchnlcmd postcommoncmd[MAX_POSTCMD_CNT];
  296. u32 postcommoncmdcnt;
  297. struct swchnlcmd rfdependcmd[MAX_RFDEPENDCMD_CNT];
  298. u32 rfdependcmdcnt;
  299. struct swchnlcmd *currentcmd = NULL;
  300. u8 rfpath;
  301. u8 num_total_rfpath = rtlphy->num_total_rfpath;
  302. precommoncmdcnt = 0;
  303. rtl88e_phy_set_sw_chnl_cmdarray(precommoncmd, precommoncmdcnt++,
  304. MAX_PRECMD_CNT,
  305. CMDID_SET_TXPOWEROWER_LEVEL, 0, 0, 0);
  306. rtl88e_phy_set_sw_chnl_cmdarray(precommoncmd, precommoncmdcnt++,
  307. MAX_PRECMD_CNT, CMDID_END, 0, 0, 0);
  308. postcommoncmdcnt = 0;
  309. rtl88e_phy_set_sw_chnl_cmdarray(postcommoncmd, postcommoncmdcnt++,
  310. MAX_POSTCMD_CNT, CMDID_END, 0, 0, 0);
  311. rfdependcmdcnt = 0;
  312. RT_ASSERT((channel >= 1 && channel <= 14),
  313. "illegal channel for Zebra: %d\n", channel);
  314. rtl88e_phy_set_sw_chnl_cmdarray(rfdependcmd, rfdependcmdcnt++,
  315. MAX_RFDEPENDCMD_CNT, CMDID_RF_WRITEREG,
  316. RF_CHNLBW, channel, 10);
  317. rtl88e_phy_set_sw_chnl_cmdarray(rfdependcmd, rfdependcmdcnt++,
  318. MAX_RFDEPENDCMD_CNT, CMDID_END, 0, 0,
  319. 0);
  320. do {
  321. switch (*stage) {
  322. case 0:
  323. currentcmd = &precommoncmd[*step];
  324. break;
  325. case 1:
  326. currentcmd = &rfdependcmd[*step];
  327. break;
  328. case 2:
  329. currentcmd = &postcommoncmd[*step];
  330. break;
  331. }
  332. if (currentcmd->cmdid == CMDID_END) {
  333. if ((*stage) == 2) {
  334. return true;
  335. } else {
  336. (*stage)++;
  337. (*step) = 0;
  338. continue;
  339. }
  340. }
  341. switch (currentcmd->cmdid) {
  342. case CMDID_SET_TXPOWEROWER_LEVEL:
  343. rtl88e_phy_set_txpower_level(hw, channel);
  344. break;
  345. case CMDID_WRITEPORT_ULONG:
  346. rtl_write_dword(rtlpriv, currentcmd->para1,
  347. currentcmd->para2);
  348. break;
  349. case CMDID_WRITEPORT_USHORT:
  350. rtl_write_word(rtlpriv, currentcmd->para1,
  351. (u16) currentcmd->para2);
  352. break;
  353. case CMDID_WRITEPORT_UCHAR:
  354. rtl_write_byte(rtlpriv, currentcmd->para1,
  355. (u8) currentcmd->para2);
  356. break;
  357. case CMDID_RF_WRITEREG:
  358. for (rfpath = 0; rfpath < num_total_rfpath; rfpath++) {
  359. rtlphy->rfreg_chnlval[rfpath] =
  360. ((rtlphy->rfreg_chnlval[rfpath] &
  361. 0xfffffc00) | currentcmd->para2);
  362. rtl_set_rfreg(hw, (enum radio_path)rfpath,
  363. currentcmd->para1,
  364. RFREG_OFFSET_MASK,
  365. rtlphy->rfreg_chnlval[rfpath]);
  366. }
  367. break;
  368. default:
  369. RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
  370. "switch case not processed\n");
  371. break;
  372. }
  373. break;
  374. } while (true);
  375. (*delay) = currentcmd->msdelay;
  376. (*step)++;
  377. return false;
  378. }
  379. static long rtl88e_pwr_idx_dbm(struct ieee80211_hw *hw,
  380. enum wireless_mode wirelessmode,
  381. u8 txpwridx)
  382. {
  383. long offset;
  384. long pwrout_dbm;
  385. switch (wirelessmode) {
  386. case WIRELESS_MODE_B:
  387. offset = -7;
  388. break;
  389. case WIRELESS_MODE_G:
  390. case WIRELESS_MODE_N_24G:
  391. offset = -8;
  392. break;
  393. default:
  394. offset = -8;
  395. break;
  396. }
  397. pwrout_dbm = txpwridx / 2 + offset;
  398. return pwrout_dbm;
  399. }
  400. static void rtl88e_phy_set_io(struct ieee80211_hw *hw)
  401. {
  402. struct rtl_priv *rtlpriv = rtl_priv(hw);
  403. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  404. struct dig_t *dm_digtable = &rtlpriv->dm_digtable;
  405. RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
  406. "--->Cmd(%#x), set_io_inprogress(%d)\n",
  407. rtlphy->current_io_type, rtlphy->set_io_inprogress);
  408. switch (rtlphy->current_io_type) {
  409. case IO_CMD_RESUME_DM_BY_SCAN:
  410. dm_digtable->cur_igvalue = rtlphy->initgain_backup.xaagccore1;
  411. /*rtl92c_dm_write_dig(hw);*/
  412. rtl88e_phy_set_txpower_level(hw, rtlphy->current_channel);
  413. rtl_set_bbreg(hw, RCCK0_CCA, 0xff0000, 0x83);
  414. break;
  415. case IO_CMD_PAUSE_DM_BY_SCAN:
  416. rtlphy->initgain_backup.xaagccore1 = dm_digtable->cur_igvalue;
  417. dm_digtable->cur_igvalue = 0x17;
  418. rtl_set_bbreg(hw, RCCK0_CCA, 0xff0000, 0x40);
  419. break;
  420. default:
  421. RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
  422. "switch case not processed\n");
  423. break;
  424. }
  425. rtlphy->set_io_inprogress = false;
  426. RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
  427. "(%#x)\n", rtlphy->current_io_type);
  428. }
  429. u32 rtl88e_phy_query_bb_reg(struct ieee80211_hw *hw, u32 regaddr, u32 bitmask)
  430. {
  431. struct rtl_priv *rtlpriv = rtl_priv(hw);
  432. u32 returnvalue, originalvalue, bitshift;
  433. RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
  434. "regaddr(%#x), bitmask(%#x)\n", regaddr, bitmask);
  435. originalvalue = rtl_read_dword(rtlpriv, regaddr);
  436. bitshift = cal_bit_shift(bitmask);
  437. returnvalue = (originalvalue & bitmask) >> bitshift;
  438. RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
  439. "BBR MASK = 0x%x Addr[0x%x]= 0x%x\n", bitmask,
  440. regaddr, originalvalue);
  441. return returnvalue;
  442. }
  443. void rtl88e_phy_set_bb_reg(struct ieee80211_hw *hw,
  444. u32 regaddr, u32 bitmask, u32 data)
  445. {
  446. struct rtl_priv *rtlpriv = rtl_priv(hw);
  447. u32 originalvalue, bitshift;
  448. RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
  449. "regaddr(%#x), bitmask(%#x),data(%#x)\n",
  450. regaddr, bitmask, data);
  451. if (bitmask != MASKDWORD) {
  452. originalvalue = rtl_read_dword(rtlpriv, regaddr);
  453. bitshift = cal_bit_shift(bitmask);
  454. data = ((originalvalue & (~bitmask)) | (data << bitshift));
  455. }
  456. rtl_write_dword(rtlpriv, regaddr, data);
  457. RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
  458. "regaddr(%#x), bitmask(%#x), data(%#x)\n",
  459. regaddr, bitmask, data);
  460. }
  461. u32 rtl88e_phy_query_rf_reg(struct ieee80211_hw *hw,
  462. enum radio_path rfpath, u32 regaddr, u32 bitmask)
  463. {
  464. struct rtl_priv *rtlpriv = rtl_priv(hw);
  465. u32 original_value, readback_value, bitshift;
  466. unsigned long flags;
  467. RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
  468. "regaddr(%#x), rfpath(%#x), bitmask(%#x)\n",
  469. regaddr, rfpath, bitmask);
  470. spin_lock_irqsave(&rtlpriv->locks.rf_lock, flags);
  471. original_value = rf_serial_read(hw, rfpath, regaddr);
  472. bitshift = cal_bit_shift(bitmask);
  473. readback_value = (original_value & bitmask) >> bitshift;
  474. spin_unlock_irqrestore(&rtlpriv->locks.rf_lock, flags);
  475. RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
  476. "regaddr(%#x), rfpath(%#x), bitmask(%#x), original_value(%#x)\n",
  477. regaddr, rfpath, bitmask, original_value);
  478. return readback_value;
  479. }
  480. void rtl88e_phy_set_rf_reg(struct ieee80211_hw *hw,
  481. enum radio_path rfpath,
  482. u32 regaddr, u32 bitmask, u32 data)
  483. {
  484. struct rtl_priv *rtlpriv = rtl_priv(hw);
  485. u32 original_value, bitshift;
  486. unsigned long flags;
  487. RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
  488. "regaddr(%#x), bitmask(%#x), data(%#x), rfpath(%#x)\n",
  489. regaddr, bitmask, data, rfpath);
  490. spin_lock_irqsave(&rtlpriv->locks.rf_lock, flags);
  491. if (bitmask != RFREG_OFFSET_MASK) {
  492. original_value = rf_serial_read(hw, rfpath, regaddr);
  493. bitshift = cal_bit_shift(bitmask);
  494. data = ((original_value & (~bitmask)) |
  495. (data << bitshift));
  496. }
  497. rf_serial_write(hw, rfpath, regaddr, data);
  498. spin_unlock_irqrestore(&rtlpriv->locks.rf_lock, flags);
  499. RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
  500. "regaddr(%#x), bitmask(%#x), data(%#x), rfpath(%#x)\n",
  501. regaddr, bitmask, data, rfpath);
  502. }
  503. static bool config_mac_with_header(struct ieee80211_hw *hw)
  504. {
  505. struct rtl_priv *rtlpriv = rtl_priv(hw);
  506. u32 i;
  507. u32 arraylength;
  508. u32 *ptrarray;
  509. RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "Read Rtl8188EMACPHY_Array\n");
  510. arraylength = RTL8188EEMAC_1T_ARRAYLEN;
  511. ptrarray = RTL8188EEMAC_1T_ARRAY;
  512. RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
  513. "Img:RTL8188EEMAC_1T_ARRAY LEN %d\n", arraylength);
  514. for (i = 0; i < arraylength; i = i + 2)
  515. rtl_write_byte(rtlpriv, ptrarray[i], (u8) ptrarray[i + 1]);
  516. return true;
  517. }
  518. bool rtl88e_phy_mac_config(struct ieee80211_hw *hw)
  519. {
  520. struct rtl_priv *rtlpriv = rtl_priv(hw);
  521. bool rtstatus = config_mac_with_header(hw);
  522. rtl_write_byte(rtlpriv, 0x04CA, 0x0B);
  523. return rtstatus;
  524. }
  525. bool rtl88e_phy_bb_config(struct ieee80211_hw *hw)
  526. {
  527. bool rtstatus = true;
  528. struct rtl_priv *rtlpriv = rtl_priv(hw);
  529. u16 regval;
  530. u8 reg_hwparafile = 1;
  531. u32 tmp;
  532. rtl88e_phy_init_bb_rf_register_definition(hw);
  533. regval = rtl_read_word(rtlpriv, REG_SYS_FUNC_EN);
  534. rtl_write_word(rtlpriv, REG_SYS_FUNC_EN,
  535. regval | BIT(13) | BIT(0) | BIT(1));
  536. rtl_write_byte(rtlpriv, REG_RF_CTRL, RF_EN | RF_RSTB | RF_SDMRSTB);
  537. rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN,
  538. FEN_PPLL | FEN_PCIEA | FEN_DIO_PCIE |
  539. FEN_BB_GLB_RSTN | FEN_BBRSTB);
  540. tmp = rtl_read_dword(rtlpriv, 0x4c);
  541. rtl_write_dword(rtlpriv, 0x4c, tmp | BIT(23));
  542. if (reg_hwparafile == 1)
  543. rtstatus = config_parafile(hw);
  544. return rtstatus;
  545. }
  546. bool rtl88e_phy_rf_config(struct ieee80211_hw *hw)
  547. {
  548. return rtl88e_phy_rf6052_config(hw);
  549. }
  550. static bool check_cond(struct ieee80211_hw *hw,
  551. const u32 condition)
  552. {
  553. struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
  554. struct rtl_efuse *fuse = rtl_efuse(rtl_priv(hw));
  555. u32 _board = fuse->board_type; /*need efuse define*/
  556. u32 _interface = rtlhal->interface;
  557. u32 _platform = 0x08;/*SupportPlatform */
  558. u32 cond = condition;
  559. if (condition == 0xCDCDCDCD)
  560. return true;
  561. cond = condition & 0xFF;
  562. if ((_board & cond) == 0 && cond != 0x1F)
  563. return false;
  564. cond = condition & 0xFF00;
  565. cond = cond >> 8;
  566. if ((_interface & cond) == 0 && cond != 0x07)
  567. return false;
  568. cond = condition & 0xFF0000;
  569. cond = cond >> 16;
  570. if ((_platform & cond) == 0 && cond != 0x0F)
  571. return false;
  572. return true;
  573. }
  574. static void _rtl8188e_config_rf_reg(struct ieee80211_hw *hw,
  575. u32 addr, u32 data, enum radio_path rfpath,
  576. u32 regaddr)
  577. {
  578. if (addr == 0xffe) {
  579. mdelay(50);
  580. } else if (addr == 0xfd) {
  581. mdelay(5);
  582. } else if (addr == 0xfc) {
  583. mdelay(1);
  584. } else if (addr == 0xfb) {
  585. udelay(50);
  586. } else if (addr == 0xfa) {
  587. udelay(5);
  588. } else if (addr == 0xf9) {
  589. udelay(1);
  590. } else {
  591. rtl_set_rfreg(hw, rfpath, regaddr,
  592. RFREG_OFFSET_MASK,
  593. data);
  594. udelay(1);
  595. }
  596. }
  597. static void rtl88_config_s(struct ieee80211_hw *hw,
  598. u32 addr, u32 data)
  599. {
  600. u32 content = 0x1000; /*RF Content: radio_a_txt*/
  601. u32 maskforphyset = (u32)(content & 0xE000);
  602. _rtl8188e_config_rf_reg(hw, addr, data, RF90_PATH_A,
  603. addr | maskforphyset);
  604. }
  605. static void _rtl8188e_config_bb_reg(struct ieee80211_hw *hw,
  606. u32 addr, u32 data)
  607. {
  608. if (addr == 0xfe) {
  609. mdelay(50);
  610. } else if (addr == 0xfd) {
  611. mdelay(5);
  612. } else if (addr == 0xfc) {
  613. mdelay(1);
  614. } else if (addr == 0xfb) {
  615. udelay(50);
  616. } else if (addr == 0xfa) {
  617. udelay(5);
  618. } else if (addr == 0xf9) {
  619. udelay(1);
  620. } else {
  621. rtl_set_bbreg(hw, addr, MASKDWORD, data);
  622. udelay(1);
  623. }
  624. }
  625. #define NEXT_PAIR(v1, v2, i) \
  626. do { \
  627. i += 2; v1 = array_table[i]; \
  628. v2 = array_table[i + 1]; \
  629. } while (0)
  630. static void set_baseband_agc_config(struct ieee80211_hw *hw)
  631. {
  632. int i;
  633. u32 *array_table;
  634. u16 arraylen;
  635. struct rtl_priv *rtlpriv = rtl_priv(hw);
  636. u32 v1 = 0, v2 = 0;
  637. arraylen = RTL8188EEAGCTAB_1TARRAYLEN;
  638. array_table = RTL8188EEAGCTAB_1TARRAY;
  639. for (i = 0; i < arraylen; i += 2) {
  640. v1 = array_table[i];
  641. v2 = array_table[i + 1];
  642. if (v1 < 0xCDCDCDCD) {
  643. rtl_set_bbreg(hw, array_table[i], MASKDWORD,
  644. array_table[i + 1]);
  645. udelay(1);
  646. continue;
  647. } else {/*This line is the start line of branch.*/
  648. if (!check_cond(hw, array_table[i])) {
  649. /*Discard the following (offset, data) pairs*/
  650. NEXT_PAIR(v1, v2, i);
  651. while (v2 != 0xDEAD && v2 != 0xCDEF &&
  652. v2 != 0xCDCD && i < arraylen - 2) {
  653. NEXT_PAIR(v1, v2, i);
  654. }
  655. i -= 2; /* compensate for loop's += 2*/
  656. } else {
  657. /* Configure matched pairs and skip to end */
  658. NEXT_PAIR(v1, v2, i);
  659. while (v2 != 0xDEAD && v2 != 0xCDEF &&
  660. v2 != 0xCDCD && i < arraylen - 2) {
  661. rtl_set_bbreg(hw, array_table[i],
  662. MASKDWORD,
  663. array_table[i + 1]);
  664. udelay(1);
  665. NEXT_PAIR(v1, v2, i);
  666. }
  667. while (v2 != 0xDEAD && i < arraylen - 2)
  668. NEXT_PAIR(v1, v2, i);
  669. }
  670. }
  671. RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
  672. "The agctab_array_table[0] is %x Rtl818EEPHY_REGArray[1] is %x\n",
  673. array_table[i],
  674. array_table[i + 1]);
  675. }
  676. }
  677. static void set_baseband_phy_config(struct ieee80211_hw *hw)
  678. {
  679. int i;
  680. u32 *array_table;
  681. u16 arraylen;
  682. u32 v1 = 0, v2 = 0;
  683. arraylen = RTL8188EEPHY_REG_1TARRAYLEN;
  684. array_table = RTL8188EEPHY_REG_1TARRAY;
  685. for (i = 0; i < arraylen; i += 2) {
  686. v1 = array_table[i];
  687. v2 = array_table[i + 1];
  688. if (v1 < 0xcdcdcdcd) {
  689. _rtl8188e_config_bb_reg(hw, v1, v2);
  690. } else {/*This line is the start line of branch.*/
  691. if (!check_cond(hw, array_table[i])) {
  692. /*Discard the following (offset, data) pairs*/
  693. NEXT_PAIR(v1, v2, i);
  694. while (v2 != 0xDEAD &&
  695. v2 != 0xCDEF &&
  696. v2 != 0xCDCD && i < arraylen - 2)
  697. NEXT_PAIR(v1, v2, i);
  698. i -= 2; /* prevent from for-loop += 2*/
  699. } else {
  700. /* Configure matched pairs and skip to end */
  701. NEXT_PAIR(v1, v2, i);
  702. while (v2 != 0xDEAD &&
  703. v2 != 0xCDEF &&
  704. v2 != 0xCDCD && i < arraylen - 2) {
  705. _rtl8188e_config_bb_reg(hw, v1, v2);
  706. NEXT_PAIR(v1, v2, i);
  707. }
  708. while (v2 != 0xDEAD && i < arraylen - 2)
  709. NEXT_PAIR(v1, v2, i);
  710. }
  711. }
  712. }
  713. }
  714. static void store_pwrindex_offset(struct ieee80211_hw *hw,
  715. u32 regaddr, u32 bitmask,
  716. u32 data)
  717. {
  718. struct rtl_priv *rtlpriv = rtl_priv(hw);
  719. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  720. if (regaddr == RTXAGC_A_RATE18_06) {
  721. rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][0] = data;
  722. RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
  723. "MCSTxPowerLevelOriginalOffset[%d][0] = 0x%x\n",
  724. rtlphy->pwrgroup_cnt,
  725. rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][0]);
  726. }
  727. if (regaddr == RTXAGC_A_RATE54_24) {
  728. rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][1] = data;
  729. RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
  730. "MCSTxPowerLevelOriginalOffset[%d][1] = 0x%x\n",
  731. rtlphy->pwrgroup_cnt,
  732. rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][1]);
  733. }
  734. if (regaddr == RTXAGC_A_CCK1_MCS32) {
  735. rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][6] = data;
  736. RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
  737. "MCSTxPowerLevelOriginalOffset[%d][6] = 0x%x\n",
  738. rtlphy->pwrgroup_cnt,
  739. rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][6]);
  740. }
  741. if (regaddr == RTXAGC_B_CCK11_A_CCK2_11 && bitmask == 0xffffff00) {
  742. rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][7] = data;
  743. RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
  744. "MCSTxPowerLevelOriginalOffset[%d][7] = 0x%x\n",
  745. rtlphy->pwrgroup_cnt,
  746. rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][7]);
  747. }
  748. if (regaddr == RTXAGC_A_MCS03_MCS00) {
  749. rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][2] = data;
  750. RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
  751. "MCSTxPowerLevelOriginalOffset[%d][2] = 0x%x\n",
  752. rtlphy->pwrgroup_cnt,
  753. rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][2]);
  754. }
  755. if (regaddr == RTXAGC_A_MCS07_MCS04) {
  756. rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][3] = data;
  757. RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
  758. "MCSTxPowerLevelOriginalOffset[%d][3] = 0x%x\n",
  759. rtlphy->pwrgroup_cnt,
  760. rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][3]);
  761. }
  762. if (regaddr == RTXAGC_A_MCS11_MCS08) {
  763. rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][4] = data;
  764. RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
  765. "MCSTxPowerLevelOriginalOffset[%d][4] = 0x%x\n",
  766. rtlphy->pwrgroup_cnt,
  767. rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][4]);
  768. }
  769. if (regaddr == RTXAGC_A_MCS15_MCS12) {
  770. rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][5] = data;
  771. if (get_rf_type(rtlphy) == RF_1T1R)
  772. rtlphy->pwrgroup_cnt++;
  773. RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
  774. "MCSTxPowerLevelOriginalOffset[%d][5] = 0x%x\n",
  775. rtlphy->pwrgroup_cnt,
  776. rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][5]);
  777. }
  778. if (regaddr == RTXAGC_B_RATE18_06) {
  779. rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][8] = data;
  780. RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
  781. "MCSTxPowerLevelOriginalOffset[%d][8] = 0x%x\n",
  782. rtlphy->pwrgroup_cnt,
  783. rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][8]);
  784. }
  785. if (regaddr == RTXAGC_B_RATE54_24) {
  786. rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][9] = data;
  787. RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
  788. "MCSTxPowerLevelOriginalOffset[%d][9] = 0x%x\n",
  789. rtlphy->pwrgroup_cnt,
  790. rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][9]);
  791. }
  792. if (regaddr == RTXAGC_B_CCK1_55_MCS32) {
  793. rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][14] = data;
  794. RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
  795. "MCSTxPowerLevelOriginalOffset[%d][14] = 0x%x\n",
  796. rtlphy->pwrgroup_cnt,
  797. rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][14]);
  798. }
  799. if (regaddr == RTXAGC_B_CCK11_A_CCK2_11 && bitmask == 0x000000ff) {
  800. rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][15] = data;
  801. RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
  802. "MCSTxPowerLevelOriginalOffset[%d][15] = 0x%x\n",
  803. rtlphy->pwrgroup_cnt,
  804. rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][15]);
  805. }
  806. if (regaddr == RTXAGC_B_MCS03_MCS00) {
  807. rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][10] = data;
  808. RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
  809. "MCSTxPowerLevelOriginalOffset[%d][10] = 0x%x\n",
  810. rtlphy->pwrgroup_cnt,
  811. rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][10]);
  812. }
  813. if (regaddr == RTXAGC_B_MCS07_MCS04) {
  814. rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][11] = data;
  815. RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
  816. "MCSTxPowerLevelOriginalOffset[%d][11] = 0x%x\n",
  817. rtlphy->pwrgroup_cnt,
  818. rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][11]);
  819. }
  820. if (regaddr == RTXAGC_B_MCS11_MCS08) {
  821. rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][12] = data;
  822. RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
  823. "MCSTxPowerLevelOriginalOffset[%d][12] = 0x%x\n",
  824. rtlphy->pwrgroup_cnt,
  825. rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][12]);
  826. }
  827. if (regaddr == RTXAGC_B_MCS15_MCS12) {
  828. rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][13] = data;
  829. RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
  830. "MCSTxPowerLevelOriginalOffset[%d][13] = 0x%x\n",
  831. rtlphy->pwrgroup_cnt,
  832. rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][13]);
  833. if (get_rf_type(rtlphy) != RF_1T1R)
  834. rtlphy->pwrgroup_cnt++;
  835. }
  836. }
  837. #define READ_NEXT_RF_PAIR(v1, v2, i) \
  838. do { \
  839. i += 2; v1 = a_table[i]; \
  840. v2 = a_table[i + 1]; \
  841. } while (0)
  842. bool rtl88e_phy_config_rf_with_headerfile(struct ieee80211_hw *hw,
  843. enum radio_path rfpath)
  844. {
  845. int i;
  846. u32 *a_table;
  847. u16 a_len;
  848. struct rtl_priv *rtlpriv = rtl_priv(hw);
  849. struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
  850. u32 v1 = 0, v2 = 0;
  851. a_len = RTL8188EE_RADIOA_1TARRAYLEN;
  852. a_table = RTL8188EE_RADIOA_1TARRAY;
  853. RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
  854. "Radio_A:RTL8188EE_RADIOA_1TARRAY %d\n", a_len);
  855. RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "Radio No %x\n", rfpath);
  856. switch (rfpath) {
  857. case RF90_PATH_A:
  858. for (i = 0; i < a_len; i = i + 2) {
  859. v1 = a_table[i];
  860. v2 = a_table[i + 1];
  861. if (v1 < 0xcdcdcdcd) {
  862. rtl88_config_s(hw, v1, v2);
  863. } else {/*This line is the start line of branch.*/
  864. if (!check_cond(hw, a_table[i])) {
  865. /* Discard the following (offset, data)
  866. * pairs
  867. */
  868. READ_NEXT_RF_PAIR(v1, v2, i);
  869. while (v2 != 0xDEAD && v2 != 0xCDEF &&
  870. v2 != 0xCDCD && i < a_len - 2)
  871. READ_NEXT_RF_PAIR(v1, v2, i);
  872. i -= 2; /* prevent from for-loop += 2*/
  873. } else {
  874. /* Configure matched pairs and skip to
  875. * end of if-else.
  876. */
  877. READ_NEXT_RF_PAIR(v1, v2, i);
  878. while (v2 != 0xDEAD && v2 != 0xCDEF &&
  879. v2 != 0xCDCD && i < a_len - 2) {
  880. rtl88_config_s(hw, v1, v2);
  881. READ_NEXT_RF_PAIR(v1, v2, i);
  882. }
  883. while (v2 != 0xDEAD && i < a_len - 2)
  884. READ_NEXT_RF_PAIR(v1, v2, i);
  885. }
  886. }
  887. }
  888. if (rtlhal->oem_id == RT_CID_819x_HP)
  889. rtl88_config_s(hw, 0x52, 0x7E4BD);
  890. break;
  891. case RF90_PATH_B:
  892. case RF90_PATH_C:
  893. case RF90_PATH_D:
  894. default:
  895. RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
  896. "switch case not processed\n");
  897. break;
  898. }
  899. return true;
  900. }
  901. void rtl88e_phy_get_hw_reg_originalvalue(struct ieee80211_hw *hw)
  902. {
  903. struct rtl_priv *rtlpriv = rtl_priv(hw);
  904. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  905. rtlphy->default_initialgain[0] = rtl_get_bbreg(hw, ROFDM0_XAAGCCORE1,
  906. MASKBYTE0);
  907. rtlphy->default_initialgain[1] = rtl_get_bbreg(hw, ROFDM0_XBAGCCORE1,
  908. MASKBYTE0);
  909. rtlphy->default_initialgain[2] = rtl_get_bbreg(hw, ROFDM0_XCAGCCORE1,
  910. MASKBYTE0);
  911. rtlphy->default_initialgain[3] = rtl_get_bbreg(hw, ROFDM0_XDAGCCORE1,
  912. MASKBYTE0);
  913. RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
  914. "Default initial gain (c50 = 0x%x, c58 = 0x%x, c60 = 0x%x, c68 = 0x%x\n",
  915. rtlphy->default_initialgain[0],
  916. rtlphy->default_initialgain[1],
  917. rtlphy->default_initialgain[2],
  918. rtlphy->default_initialgain[3]);
  919. rtlphy->framesync = rtl_get_bbreg(hw, ROFDM0_RXDETECTOR3,
  920. MASKBYTE0);
  921. rtlphy->framesync_c34 = rtl_get_bbreg(hw, ROFDM0_RXDETECTOR2,
  922. MASKDWORD);
  923. RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
  924. "Default framesync (0x%x) = 0x%x\n",
  925. ROFDM0_RXDETECTOR3, rtlphy->framesync);
  926. }
  927. void rtl88e_phy_get_txpower_level(struct ieee80211_hw *hw, long *powerlevel)
  928. {
  929. struct rtl_priv *rtlpriv = rtl_priv(hw);
  930. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  931. u8 level;
  932. long dbm;
  933. level = rtlphy->cur_cck_txpwridx;
  934. dbm = rtl88e_pwr_idx_dbm(hw, WIRELESS_MODE_B, level);
  935. level = rtlphy->cur_ofdm24g_txpwridx;
  936. if (rtl88e_pwr_idx_dbm(hw, WIRELESS_MODE_G, level) > dbm)
  937. dbm = rtl88e_pwr_idx_dbm(hw, WIRELESS_MODE_G, level);
  938. level = rtlphy->cur_ofdm24g_txpwridx;
  939. if (rtl88e_pwr_idx_dbm(hw, WIRELESS_MODE_N_24G, level) > dbm)
  940. dbm = rtl88e_pwr_idx_dbm(hw, WIRELESS_MODE_N_24G, level);
  941. *powerlevel = dbm;
  942. }
  943. static void _rtl88e_get_txpower_index(struct ieee80211_hw *hw, u8 channel,
  944. u8 *cckpower, u8 *ofdm, u8 *bw20_pwr,
  945. u8 *bw40_pwr)
  946. {
  947. struct rtl_efuse *fuse = rtl_efuse(rtl_priv(hw));
  948. u8 i = (channel - 1);
  949. u8 rf_path = 0;
  950. int jj = RF90_PATH_A;
  951. int kk = RF90_PATH_B;
  952. for (rf_path = 0; rf_path < 2; rf_path++) {
  953. if (rf_path == jj) {
  954. cckpower[jj] = fuse->txpwrlevel_cck[jj][i];
  955. if (fuse->txpwr_ht20diff[jj][i] > 0x0f) /*-8~7 */
  956. bw20_pwr[jj] = fuse->txpwrlevel_ht40_1s[jj][i] -
  957. (~(fuse->txpwr_ht20diff[jj][i]) + 1);
  958. else
  959. bw20_pwr[jj] = fuse->txpwrlevel_ht40_1s[jj][i] +
  960. fuse->txpwr_ht20diff[jj][i];
  961. if (fuse->txpwr_legacyhtdiff[jj][i] > 0xf)
  962. ofdm[jj] = fuse->txpwrlevel_ht40_1s[jj][i] -
  963. (~(fuse->txpwr_legacyhtdiff[jj][i])+1);
  964. else
  965. ofdm[jj] = fuse->txpwrlevel_ht40_1s[jj][i] +
  966. fuse->txpwr_legacyhtdiff[jj][i];
  967. bw40_pwr[jj] = fuse->txpwrlevel_ht40_1s[jj][i];
  968. } else if (rf_path == kk) {
  969. cckpower[kk] = fuse->txpwrlevel_cck[kk][i];
  970. bw20_pwr[kk] = fuse->txpwrlevel_ht40_1s[kk][i] +
  971. fuse->txpwr_ht20diff[kk][i];
  972. ofdm[kk] = fuse->txpwrlevel_ht40_1s[kk][i] +
  973. fuse->txpwr_legacyhtdiff[kk][i];
  974. bw40_pwr[kk] = fuse->txpwrlevel_ht40_1s[kk][i];
  975. }
  976. }
  977. }
  978. static void _rtl88e_ccxpower_index_check(struct ieee80211_hw *hw,
  979. u8 channel, u8 *cckpower,
  980. u8 *ofdm, u8 *bw20_pwr,
  981. u8 *bw40_pwr)
  982. {
  983. struct rtl_priv *rtlpriv = rtl_priv(hw);
  984. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  985. rtlphy->cur_cck_txpwridx = cckpower[0];
  986. rtlphy->cur_ofdm24g_txpwridx = ofdm[0];
  987. rtlphy->cur_bw20_txpwridx = bw20_pwr[0];
  988. rtlphy->cur_bw40_txpwridx = bw40_pwr[0];
  989. }
  990. void rtl88e_phy_set_txpower_level(struct ieee80211_hw *hw, u8 channel)
  991. {
  992. struct rtl_efuse *fuse = rtl_efuse(rtl_priv(hw));
  993. u8 cckpower[MAX_TX_COUNT] = {0}, ofdm[MAX_TX_COUNT] = {0};
  994. u8 bw20_pwr[MAX_TX_COUNT] = {0}, bw40_pwr[MAX_TX_COUNT] = {0};
  995. if (fuse->txpwr_fromeprom == false)
  996. return;
  997. _rtl88e_get_txpower_index(hw, channel, &cckpower[0], &ofdm[0],
  998. &bw20_pwr[0], &bw40_pwr[0]);
  999. _rtl88e_ccxpower_index_check(hw, channel, &cckpower[0], &ofdm[0],
  1000. &bw20_pwr[0], &bw40_pwr[0]);
  1001. rtl88e_phy_rf6052_set_cck_txpower(hw, &cckpower[0]);
  1002. rtl88e_phy_rf6052_set_ofdm_txpower(hw, &ofdm[0], &bw20_pwr[0],
  1003. &bw40_pwr[0], channel);
  1004. }
  1005. void rtl88e_phy_scan_operation_backup(struct ieee80211_hw *hw, u8 operation)
  1006. {
  1007. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1008. struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
  1009. enum io_type iotype;
  1010. if (!is_hal_stop(rtlhal)) {
  1011. switch (operation) {
  1012. case SCAN_OPT_BACKUP:
  1013. iotype = IO_CMD_PAUSE_DM_BY_SCAN;
  1014. rtlpriv->cfg->ops->set_hw_reg(hw,
  1015. HW_VAR_IO_CMD,
  1016. (u8 *)&iotype);
  1017. break;
  1018. case SCAN_OPT_RESTORE:
  1019. iotype = IO_CMD_RESUME_DM_BY_SCAN;
  1020. rtlpriv->cfg->ops->set_hw_reg(hw,
  1021. HW_VAR_IO_CMD,
  1022. (u8 *)&iotype);
  1023. break;
  1024. default:
  1025. RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
  1026. "Unknown Scan Backup operation.\n");
  1027. break;
  1028. }
  1029. }
  1030. }
  1031. void rtl88e_phy_set_bw_mode_callback(struct ieee80211_hw *hw)
  1032. {
  1033. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1034. struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
  1035. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  1036. struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
  1037. u8 reg_bw_opmode;
  1038. u8 reg_prsr_rsc;
  1039. RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE,
  1040. "Switch to %s bandwidth\n",
  1041. rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20 ?
  1042. "20MHz" : "40MHz");
  1043. if (is_hal_stop(rtlhal)) {
  1044. rtlphy->set_bwmode_inprogress = false;
  1045. return;
  1046. }
  1047. reg_bw_opmode = rtl_read_byte(rtlpriv, REG_BWOPMODE);
  1048. reg_prsr_rsc = rtl_read_byte(rtlpriv, REG_RRSR + 2);
  1049. switch (rtlphy->current_chan_bw) {
  1050. case HT_CHANNEL_WIDTH_20:
  1051. reg_bw_opmode |= BW_OPMODE_20MHZ;
  1052. rtl_write_byte(rtlpriv, REG_BWOPMODE, reg_bw_opmode);
  1053. break;
  1054. case HT_CHANNEL_WIDTH_20_40:
  1055. reg_bw_opmode &= ~BW_OPMODE_20MHZ;
  1056. rtl_write_byte(rtlpriv, REG_BWOPMODE, reg_bw_opmode);
  1057. reg_prsr_rsc =
  1058. (reg_prsr_rsc & 0x90) | (mac->cur_40_prime_sc << 5);
  1059. rtl_write_byte(rtlpriv, REG_RRSR + 2, reg_prsr_rsc);
  1060. break;
  1061. default:
  1062. RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
  1063. "unknown bandwidth: %#X\n", rtlphy->current_chan_bw);
  1064. break;
  1065. }
  1066. switch (rtlphy->current_chan_bw) {
  1067. case HT_CHANNEL_WIDTH_20:
  1068. rtl_set_bbreg(hw, RFPGA0_RFMOD, BRFMOD, 0x0);
  1069. rtl_set_bbreg(hw, RFPGA1_RFMOD, BRFMOD, 0x0);
  1070. /* rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER2, BIT(10), 1);*/
  1071. break;
  1072. case HT_CHANNEL_WIDTH_20_40:
  1073. rtl_set_bbreg(hw, RFPGA0_RFMOD, BRFMOD, 0x1);
  1074. rtl_set_bbreg(hw, RFPGA1_RFMOD, BRFMOD, 0x1);
  1075. rtl_set_bbreg(hw, RCCK0_SYSTEM, BCCK_SIDEBAND,
  1076. (mac->cur_40_prime_sc >> 1));
  1077. rtl_set_bbreg(hw, ROFDM1_LSTF, 0xC00, mac->cur_40_prime_sc);
  1078. /*rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER2, BIT(10), 0);*/
  1079. rtl_set_bbreg(hw, 0x818, (BIT(26) | BIT(27)),
  1080. (mac->cur_40_prime_sc ==
  1081. HAL_PRIME_CHNL_OFFSET_LOWER) ? 2 : 1);
  1082. break;
  1083. default:
  1084. RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
  1085. "unknown bandwidth: %#X\n", rtlphy->current_chan_bw);
  1086. break;
  1087. }
  1088. rtl88e_phy_rf6052_set_bandwidth(hw, rtlphy->current_chan_bw);
  1089. rtlphy->set_bwmode_inprogress = false;
  1090. RT_TRACE(rtlpriv, COMP_SCAN, DBG_LOUD, "\n");
  1091. }
  1092. void rtl88e_phy_set_bw_mode(struct ieee80211_hw *hw,
  1093. enum nl80211_channel_type ch_type)
  1094. {
  1095. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1096. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  1097. struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
  1098. u8 tmp_bw = rtlphy->current_chan_bw;
  1099. if (rtlphy->set_bwmode_inprogress)
  1100. return;
  1101. rtlphy->set_bwmode_inprogress = true;
  1102. if ((!is_hal_stop(rtlhal)) && !(RT_CANNOT_IO(hw))) {
  1103. rtl88e_phy_set_bw_mode_callback(hw);
  1104. } else {
  1105. RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
  1106. "FALSE driver sleep or unload\n");
  1107. rtlphy->set_bwmode_inprogress = false;
  1108. rtlphy->current_chan_bw = tmp_bw;
  1109. }
  1110. }
  1111. void rtl88e_phy_sw_chnl_callback(struct ieee80211_hw *hw)
  1112. {
  1113. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1114. struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
  1115. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  1116. u32 delay;
  1117. RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE,
  1118. "switch to channel%d\n", rtlphy->current_channel);
  1119. if (is_hal_stop(rtlhal))
  1120. return;
  1121. do {
  1122. if (!rtlphy->sw_chnl_inprogress)
  1123. break;
  1124. if (!chnl_step_by_step(hw, rtlphy->current_channel,
  1125. &rtlphy->sw_chnl_stage,
  1126. &rtlphy->sw_chnl_step, &delay)) {
  1127. if (delay > 0)
  1128. mdelay(delay);
  1129. else
  1130. continue;
  1131. } else {
  1132. rtlphy->sw_chnl_inprogress = false;
  1133. }
  1134. break;
  1135. } while (true);
  1136. RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, "\n");
  1137. }
  1138. u8 rtl88e_phy_sw_chnl(struct ieee80211_hw *hw)
  1139. {
  1140. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1141. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  1142. struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
  1143. if (rtlphy->sw_chnl_inprogress)
  1144. return 0;
  1145. if (rtlphy->set_bwmode_inprogress)
  1146. return 0;
  1147. RT_ASSERT((rtlphy->current_channel <= 14),
  1148. "WIRELESS_MODE_G but channel>14");
  1149. rtlphy->sw_chnl_inprogress = true;
  1150. rtlphy->sw_chnl_stage = 0;
  1151. rtlphy->sw_chnl_step = 0;
  1152. if (!(is_hal_stop(rtlhal)) && !(RT_CANNOT_IO(hw))) {
  1153. rtl88e_phy_sw_chnl_callback(hw);
  1154. RT_TRACE(rtlpriv, COMP_CHAN, DBG_LOUD,
  1155. "sw_chnl_inprogress false schdule workitem current channel %d\n",
  1156. rtlphy->current_channel);
  1157. rtlphy->sw_chnl_inprogress = false;
  1158. } else {
  1159. RT_TRACE(rtlpriv, COMP_CHAN, DBG_LOUD,
  1160. "sw_chnl_inprogress false driver sleep or unload\n");
  1161. rtlphy->sw_chnl_inprogress = false;
  1162. }
  1163. return 1;
  1164. }
  1165. static u8 _rtl88e_phy_path_a_iqk(struct ieee80211_hw *hw, bool config_pathb)
  1166. {
  1167. u32 reg_eac, reg_e94, reg_e9c;
  1168. u8 result = 0x00;
  1169. rtl_set_bbreg(hw, 0xe30, MASKDWORD, 0x10008c1c);
  1170. rtl_set_bbreg(hw, 0xe34, MASKDWORD, 0x30008c1c);
  1171. rtl_set_bbreg(hw, 0xe38, MASKDWORD, 0x8214032a);
  1172. rtl_set_bbreg(hw, 0xe3c, MASKDWORD, 0x28160000);
  1173. rtl_set_bbreg(hw, 0xe4c, MASKDWORD, 0x00462911);
  1174. rtl_set_bbreg(hw, 0xe48, MASKDWORD, 0xf9000000);
  1175. rtl_set_bbreg(hw, 0xe48, MASKDWORD, 0xf8000000);
  1176. mdelay(IQK_DELAY_TIME);
  1177. reg_eac = rtl_get_bbreg(hw, 0xeac, MASKDWORD);
  1178. reg_e94 = rtl_get_bbreg(hw, 0xe94, MASKDWORD);
  1179. reg_e9c = rtl_get_bbreg(hw, 0xe9c, MASKDWORD);
  1180. if (!(reg_eac & BIT(28)) &&
  1181. (((reg_e94 & 0x03FF0000) >> 16) != 0x142) &&
  1182. (((reg_e9c & 0x03FF0000) >> 16) != 0x42))
  1183. result |= 0x01;
  1184. return result;
  1185. }
  1186. static u8 _rtl88e_phy_path_b_iqk(struct ieee80211_hw *hw)
  1187. {
  1188. u32 reg_eac, reg_eb4, reg_ebc, reg_ec4, reg_ecc;
  1189. u8 result = 0x00;
  1190. rtl_set_bbreg(hw, 0xe60, MASKDWORD, 0x00000002);
  1191. rtl_set_bbreg(hw, 0xe60, MASKDWORD, 0x00000000);
  1192. mdelay(IQK_DELAY_TIME);
  1193. reg_eac = rtl_get_bbreg(hw, 0xeac, MASKDWORD);
  1194. reg_eb4 = rtl_get_bbreg(hw, 0xeb4, MASKDWORD);
  1195. reg_ebc = rtl_get_bbreg(hw, 0xebc, MASKDWORD);
  1196. reg_ec4 = rtl_get_bbreg(hw, 0xec4, MASKDWORD);
  1197. reg_ecc = rtl_get_bbreg(hw, 0xecc, MASKDWORD);
  1198. if (!(reg_eac & BIT(31)) &&
  1199. (((reg_eb4 & 0x03FF0000) >> 16) != 0x142) &&
  1200. (((reg_ebc & 0x03FF0000) >> 16) != 0x42))
  1201. result |= 0x01;
  1202. else
  1203. return result;
  1204. if (!(reg_eac & BIT(30)) &&
  1205. (((reg_ec4 & 0x03FF0000) >> 16) != 0x132) &&
  1206. (((reg_ecc & 0x03FF0000) >> 16) != 0x36))
  1207. result |= 0x02;
  1208. return result;
  1209. }
  1210. static u8 _rtl88e_phy_path_a_rx_iqk(struct ieee80211_hw *hw, bool config_pathb)
  1211. {
  1212. u32 reg_eac, reg_e94, reg_e9c, reg_ea4, u32temp;
  1213. u8 result = 0x00;
  1214. int jj = RF90_PATH_A;
  1215. /*Get TXIMR Setting*/
  1216. /*Modify RX IQK mode table*/
  1217. rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
  1218. rtl_set_rfreg(hw, jj, RF_WE_LUT, RFREG_OFFSET_MASK, 0x800a0);
  1219. rtl_set_rfreg(hw, jj, RF_RCK_OS, RFREG_OFFSET_MASK, 0x30000);
  1220. rtl_set_rfreg(hw, jj, RF_TXPA_G1, RFREG_OFFSET_MASK, 0x0000f);
  1221. rtl_set_rfreg(hw, jj, RF_TXPA_G2, RFREG_OFFSET_MASK, 0xf117b);
  1222. rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x80800000);
  1223. /*IQK Setting*/
  1224. rtl_set_bbreg(hw, RTX_IQK, MASKDWORD, 0x01007c00);
  1225. rtl_set_bbreg(hw, RRX_IQK, MASKDWORD, 0x81004800);
  1226. /*path a IQK setting*/
  1227. rtl_set_bbreg(hw, RTX_IQK_TONE_A, MASKDWORD, 0x10008c1c);
  1228. rtl_set_bbreg(hw, RRX_IQK_TONE_A, MASKDWORD, 0x30008c1c);
  1229. rtl_set_bbreg(hw, RTX_IQK_PI_A, MASKDWORD, 0x82160804);
  1230. rtl_set_bbreg(hw, RRX_IQK_PI_A, MASKDWORD, 0x28160000);
  1231. /*LO calibration Setting*/
  1232. rtl_set_bbreg(hw, RIQK_AGC_RSP, MASKDWORD, 0x0046a911);
  1233. /*one shot, path A LOK & iqk*/
  1234. rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf9000000);
  1235. rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf8000000);
  1236. mdelay(IQK_DELAY_TIME);
  1237. reg_eac = rtl_get_bbreg(hw, RRX_POWER_AFTER_IQK_A_2, MASKDWORD);
  1238. reg_e94 = rtl_get_bbreg(hw, RTX_POWER_BEFORE_IQK_A, MASKDWORD);
  1239. reg_e9c = rtl_get_bbreg(hw, RTX_POWER_AFTER_IQK_A, MASKDWORD);
  1240. if (!(reg_eac & BIT(28)) &&
  1241. (((reg_e94 & 0x03FF0000) >> 16) != 0x142) &&
  1242. (((reg_e9c & 0x03FF0000) >> 16) != 0x42))
  1243. result |= 0x01;
  1244. else
  1245. return result;
  1246. u32temp = 0x80007C00 | (reg_e94&0x3FF0000) |
  1247. ((reg_e9c&0x3FF0000) >> 16);
  1248. rtl_set_bbreg(hw, RTX_IQK, MASKDWORD, u32temp);
  1249. /*RX IQK*/
  1250. /*Modify RX IQK mode table*/
  1251. rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
  1252. rtl_set_rfreg(hw, jj, RF_WE_LUT, RFREG_OFFSET_MASK, 0x800a0);
  1253. rtl_set_rfreg(hw, jj, RF_RCK_OS, RFREG_OFFSET_MASK, 0x30000);
  1254. rtl_set_rfreg(hw, jj, RF_TXPA_G1, RFREG_OFFSET_MASK, 0x0000f);
  1255. rtl_set_rfreg(hw, jj, RF_TXPA_G2, RFREG_OFFSET_MASK, 0xf7ffa);
  1256. rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x80800000);
  1257. /*IQK Setting*/
  1258. rtl_set_bbreg(hw, RRX_IQK, MASKDWORD, 0x01004800);
  1259. /*path a IQK setting*/
  1260. rtl_set_bbreg(hw, RTX_IQK_TONE_A, MASKDWORD, 0x30008c1c);
  1261. rtl_set_bbreg(hw, RRX_IQK_TONE_A, MASKDWORD, 0x10008c1c);
  1262. rtl_set_bbreg(hw, RTX_IQK_PI_A, MASKDWORD, 0x82160c05);
  1263. rtl_set_bbreg(hw, RRX_IQK_PI_A, MASKDWORD, 0x28160c05);
  1264. /*LO calibration Setting*/
  1265. rtl_set_bbreg(hw, RIQK_AGC_RSP, MASKDWORD, 0x0046a911);
  1266. /*one shot, path A LOK & iqk*/
  1267. rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf9000000);
  1268. rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf8000000);
  1269. mdelay(IQK_DELAY_TIME);
  1270. reg_eac = rtl_get_bbreg(hw, RRX_POWER_AFTER_IQK_A_2, MASKDWORD);
  1271. reg_e94 = rtl_get_bbreg(hw, RTX_POWER_BEFORE_IQK_A, MASKDWORD);
  1272. reg_e9c = rtl_get_bbreg(hw, RTX_POWER_AFTER_IQK_A, MASKDWORD);
  1273. reg_ea4 = rtl_get_bbreg(hw, RRX_POWER_BEFORE_IQK_A_2, MASKDWORD);
  1274. if (!(reg_eac & BIT(27)) &&
  1275. (((reg_ea4 & 0x03FF0000) >> 16) != 0x132) &&
  1276. (((reg_eac & 0x03FF0000) >> 16) != 0x36))
  1277. result |= 0x02;
  1278. return result;
  1279. }
  1280. static void fill_iqk(struct ieee80211_hw *hw, bool iqk_ok, long result[][8],
  1281. u8 final, bool btxonly)
  1282. {
  1283. u32 oldval_0, x, tx0_a, reg;
  1284. long y, tx0_c;
  1285. if (final == 0xFF) {
  1286. return;
  1287. } else if (iqk_ok) {
  1288. oldval_0 = (rtl_get_bbreg(hw, ROFDM0_XATXIQIMBAL,
  1289. MASKDWORD) >> 22) & 0x3FF;
  1290. x = result[final][0];
  1291. if ((x & 0x00000200) != 0)
  1292. x = x | 0xFFFFFC00;
  1293. tx0_a = (x * oldval_0) >> 8;
  1294. rtl_set_bbreg(hw, ROFDM0_XATXIQIMBAL, 0x3FF, tx0_a);
  1295. rtl_set_bbreg(hw, ROFDM0_ECCATHRES, BIT(31),
  1296. ((x * oldval_0 >> 7) & 0x1));
  1297. y = result[final][1];
  1298. if ((y & 0x00000200) != 0)
  1299. y |= 0xFFFFFC00;
  1300. tx0_c = (y * oldval_0) >> 8;
  1301. rtl_set_bbreg(hw, ROFDM0_XCTXAFE, 0xF0000000,
  1302. ((tx0_c & 0x3C0) >> 6));
  1303. rtl_set_bbreg(hw, ROFDM0_XATXIQIMBAL, 0x003F0000,
  1304. (tx0_c & 0x3F));
  1305. rtl_set_bbreg(hw, ROFDM0_ECCATHRES, BIT(29),
  1306. ((y * oldval_0 >> 7) & 0x1));
  1307. if (btxonly)
  1308. return;
  1309. reg = result[final][2];
  1310. rtl_set_bbreg(hw, ROFDM0_XARXIQIMBAL, 0x3FF, reg);
  1311. reg = result[final][3] & 0x3F;
  1312. rtl_set_bbreg(hw, ROFDM0_XARXIQIMBAL, 0xFC00, reg);
  1313. reg = (result[final][3] >> 6) & 0xF;
  1314. rtl_set_bbreg(hw, 0xca0, 0xF0000000, reg);
  1315. }
  1316. }
  1317. static void save_adda_reg(struct ieee80211_hw *hw,
  1318. const u32 *addareg, u32 *backup,
  1319. u32 registernum)
  1320. {
  1321. u32 i;
  1322. for (i = 0; i < registernum; i++)
  1323. backup[i] = rtl_get_bbreg(hw, addareg[i], MASKDWORD);
  1324. }
  1325. static void save_mac_reg(struct ieee80211_hw *hw, const u32 *macreg,
  1326. u32 *macbackup)
  1327. {
  1328. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1329. u32 i;
  1330. for (i = 0; i < (IQK_MAC_REG_NUM - 1); i++)
  1331. macbackup[i] = rtl_read_byte(rtlpriv, macreg[i]);
  1332. macbackup[i] = rtl_read_dword(rtlpriv, macreg[i]);
  1333. }
  1334. static void reload_adda(struct ieee80211_hw *hw, const u32 *addareg,
  1335. u32 *backup, u32 reg_num)
  1336. {
  1337. u32 i;
  1338. for (i = 0; i < reg_num; i++)
  1339. rtl_set_bbreg(hw, addareg[i], MASKDWORD, backup[i]);
  1340. }
  1341. static void reload_mac(struct ieee80211_hw *hw, const u32 *macreg,
  1342. u32 *macbackup)
  1343. {
  1344. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1345. u32 i;
  1346. for (i = 0; i < (IQK_MAC_REG_NUM - 1); i++)
  1347. rtl_write_byte(rtlpriv, macreg[i], (u8) macbackup[i]);
  1348. rtl_write_dword(rtlpriv, macreg[i], macbackup[i]);
  1349. }
  1350. static void _rtl88e_phy_path_adda_on(struct ieee80211_hw *hw,
  1351. const u32 *addareg, bool is_patha_on,
  1352. bool is2t)
  1353. {
  1354. u32 pathon;
  1355. u32 i;
  1356. pathon = is_patha_on ? 0x04db25a4 : 0x0b1b25a4;
  1357. if (false == is2t) {
  1358. pathon = 0x0bdb25a0;
  1359. rtl_set_bbreg(hw, addareg[0], MASKDWORD, 0x0b1b25a0);
  1360. } else {
  1361. rtl_set_bbreg(hw, addareg[0], MASKDWORD, pathon);
  1362. }
  1363. for (i = 1; i < IQK_ADDA_REG_NUM; i++)
  1364. rtl_set_bbreg(hw, addareg[i], MASKDWORD, pathon);
  1365. }
  1366. static void _rtl88e_phy_mac_setting_calibration(struct ieee80211_hw *hw,
  1367. const u32 *macreg,
  1368. u32 *macbackup)
  1369. {
  1370. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1371. u32 i = 0;
  1372. rtl_write_byte(rtlpriv, macreg[i], 0x3F);
  1373. for (i = 1; i < (IQK_MAC_REG_NUM - 1); i++)
  1374. rtl_write_byte(rtlpriv, macreg[i],
  1375. (u8) (macbackup[i] & (~BIT(3))));
  1376. rtl_write_byte(rtlpriv, macreg[i], (u8) (macbackup[i] & (~BIT(5))));
  1377. }
  1378. static void _rtl88e_phy_path_a_standby(struct ieee80211_hw *hw)
  1379. {
  1380. rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x0);
  1381. rtl_set_bbreg(hw, 0x840, MASKDWORD, 0x00010000);
  1382. rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x80800000);
  1383. }
  1384. static void _rtl88e_phy_pi_mode_switch(struct ieee80211_hw *hw, bool pi_mode)
  1385. {
  1386. u32 mode;
  1387. mode = pi_mode ? 0x01000100 : 0x01000000;
  1388. rtl_set_bbreg(hw, 0x820, MASKDWORD, mode);
  1389. rtl_set_bbreg(hw, 0x828, MASKDWORD, mode);
  1390. }
  1391. static bool sim_comp(struct ieee80211_hw *hw, long result[][8], u8 c1, u8 c2)
  1392. {
  1393. u32 i, j, diff, bitmap, bound;
  1394. struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
  1395. u8 final[2] = {0xFF, 0xFF};
  1396. bool bresult = true, is2t = IS_92C_SERIAL(rtlhal->version);
  1397. if (is2t)
  1398. bound = 8;
  1399. else
  1400. bound = 4;
  1401. bitmap = 0;
  1402. for (i = 0; i < bound; i++) {
  1403. diff = (result[c1][i] > result[c2][i]) ?
  1404. (result[c1][i] - result[c2][i]) :
  1405. (result[c2][i] - result[c1][i]);
  1406. if (diff > MAX_TOLERANCE) {
  1407. if ((i == 2 || i == 6) && !bitmap) {
  1408. if (result[c1][i] + result[c1][i + 1] == 0)
  1409. final[(i / 4)] = c2;
  1410. else if (result[c2][i] + result[c2][i + 1] == 0)
  1411. final[(i / 4)] = c1;
  1412. else
  1413. bitmap = bitmap | (1 << i);
  1414. } else {
  1415. bitmap = bitmap | (1 << i);
  1416. }
  1417. }
  1418. }
  1419. if (bitmap == 0) {
  1420. for (i = 0; i < (bound / 4); i++) {
  1421. if (final[i] != 0xFF) {
  1422. for (j = i * 4; j < (i + 1) * 4 - 2; j++)
  1423. result[3][j] = result[final[i]][j];
  1424. bresult = false;
  1425. }
  1426. }
  1427. return bresult;
  1428. } else if (!(bitmap & 0x0F)) {
  1429. for (i = 0; i < 4; i++)
  1430. result[3][i] = result[c1][i];
  1431. return false;
  1432. } else if (!(bitmap & 0xF0) && is2t) {
  1433. for (i = 4; i < 8; i++)
  1434. result[3][i] = result[c1][i];
  1435. return false;
  1436. } else {
  1437. return false;
  1438. }
  1439. }
  1440. static void _rtl88e_phy_iq_calibrate(struct ieee80211_hw *hw,
  1441. long result[][8], u8 t, bool is2t)
  1442. {
  1443. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1444. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  1445. u32 i;
  1446. u8 patha_ok, pathb_ok;
  1447. const u32 adda_reg[IQK_ADDA_REG_NUM] = {
  1448. 0x85c, 0xe6c, 0xe70, 0xe74,
  1449. 0xe78, 0xe7c, 0xe80, 0xe84,
  1450. 0xe88, 0xe8c, 0xed0, 0xed4,
  1451. 0xed8, 0xedc, 0xee0, 0xeec
  1452. };
  1453. const u32 iqk_mac_reg[IQK_MAC_REG_NUM] = {
  1454. 0x522, 0x550, 0x551, 0x040
  1455. };
  1456. const u32 iqk_bb_reg[IQK_BB_REG_NUM] = {
  1457. ROFDM0_TRXPATHENABLE, ROFDM0_TRMUXPAR, RFPGA0_XCD_RFINTERFACESW,
  1458. 0xb68, 0xb6c, 0x870, 0x860, 0x864, 0x800
  1459. };
  1460. const u32 retrycount = 2;
  1461. if (t == 0) {
  1462. save_adda_reg(hw, adda_reg, rtlphy->adda_backup, 16);
  1463. save_mac_reg(hw, iqk_mac_reg, rtlphy->iqk_mac_backup);
  1464. save_adda_reg(hw, iqk_bb_reg, rtlphy->iqk_bb_backup,
  1465. IQK_BB_REG_NUM);
  1466. }
  1467. _rtl88e_phy_path_adda_on(hw, adda_reg, true, is2t);
  1468. if (t == 0) {
  1469. rtlphy->rfpi_enable = (u8) rtl_get_bbreg(hw,
  1470. RFPGA0_XA_HSSIPARAMETER1, BIT(8));
  1471. }
  1472. if (!rtlphy->rfpi_enable)
  1473. _rtl88e_phy_pi_mode_switch(hw, true);
  1474. /*BB Setting*/
  1475. rtl_set_bbreg(hw, 0x800, BIT(24), 0x00);
  1476. rtl_set_bbreg(hw, 0xc04, MASKDWORD, 0x03a05600);
  1477. rtl_set_bbreg(hw, 0xc08, MASKDWORD, 0x000800e4);
  1478. rtl_set_bbreg(hw, 0x874, MASKDWORD, 0x22204000);
  1479. rtl_set_bbreg(hw, 0x870, BIT(10), 0x01);
  1480. rtl_set_bbreg(hw, 0x870, BIT(26), 0x01);
  1481. rtl_set_bbreg(hw, 0x860, BIT(10), 0x00);
  1482. rtl_set_bbreg(hw, 0x864, BIT(10), 0x00);
  1483. if (is2t) {
  1484. rtl_set_bbreg(hw, 0x840, MASKDWORD, 0x00010000);
  1485. rtl_set_bbreg(hw, 0x844, MASKDWORD, 0x00010000);
  1486. }
  1487. _rtl88e_phy_mac_setting_calibration(hw, iqk_mac_reg,
  1488. rtlphy->iqk_mac_backup);
  1489. rtl_set_bbreg(hw, 0xb68, MASKDWORD, 0x0f600000);
  1490. if (is2t)
  1491. rtl_set_bbreg(hw, 0xb6c, MASKDWORD, 0x0f600000);
  1492. rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x80800000);
  1493. rtl_set_bbreg(hw, 0xe40, MASKDWORD, 0x01007c00);
  1494. rtl_set_bbreg(hw, 0xe44, MASKDWORD, 0x81004800);
  1495. for (i = 0; i < retrycount; i++) {
  1496. patha_ok = _rtl88e_phy_path_a_iqk(hw, is2t);
  1497. if (patha_ok == 0x01) {
  1498. RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
  1499. "Path A Tx IQK Success!!\n");
  1500. result[t][0] = (rtl_get_bbreg(hw, 0xe94, MASKDWORD) &
  1501. 0x3FF0000) >> 16;
  1502. result[t][1] = (rtl_get_bbreg(hw, 0xe9c, MASKDWORD) &
  1503. 0x3FF0000) >> 16;
  1504. break;
  1505. }
  1506. }
  1507. for (i = 0; i < retrycount; i++) {
  1508. patha_ok = _rtl88e_phy_path_a_rx_iqk(hw, is2t);
  1509. if (patha_ok == 0x03) {
  1510. RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
  1511. "Path A Rx IQK Success!!\n");
  1512. result[t][2] = (rtl_get_bbreg(hw, 0xea4, MASKDWORD) &
  1513. 0x3FF0000) >> 16;
  1514. result[t][3] = (rtl_get_bbreg(hw, 0xeac, MASKDWORD) &
  1515. 0x3FF0000) >> 16;
  1516. break;
  1517. } else {
  1518. RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
  1519. "Path a RX iqk fail!!!\n");
  1520. }
  1521. }
  1522. if (0 == patha_ok) {
  1523. RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
  1524. "Path A IQK Success!!\n");
  1525. }
  1526. if (is2t) {
  1527. _rtl88e_phy_path_a_standby(hw);
  1528. _rtl88e_phy_path_adda_on(hw, adda_reg, false, is2t);
  1529. for (i = 0; i < retrycount; i++) {
  1530. pathb_ok = _rtl88e_phy_path_b_iqk(hw);
  1531. if (pathb_ok == 0x03) {
  1532. result[t][4] = (rtl_get_bbreg(hw,
  1533. 0xeb4, MASKDWORD) &
  1534. 0x3FF0000) >> 16;
  1535. result[t][5] =
  1536. (rtl_get_bbreg(hw, 0xebc, MASKDWORD) &
  1537. 0x3FF0000) >> 16;
  1538. result[t][6] =
  1539. (rtl_get_bbreg(hw, 0xec4, MASKDWORD) &
  1540. 0x3FF0000) >> 16;
  1541. result[t][7] =
  1542. (rtl_get_bbreg(hw, 0xecc, MASKDWORD) &
  1543. 0x3FF0000) >> 16;
  1544. break;
  1545. } else if (i == (retrycount - 1) && pathb_ok == 0x01) {
  1546. result[t][4] = (rtl_get_bbreg(hw,
  1547. 0xeb4, MASKDWORD) &
  1548. 0x3FF0000) >> 16;
  1549. }
  1550. result[t][5] = (rtl_get_bbreg(hw, 0xebc, MASKDWORD) &
  1551. 0x3FF0000) >> 16;
  1552. }
  1553. }
  1554. rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0);
  1555. if (t != 0) {
  1556. if (!rtlphy->rfpi_enable)
  1557. _rtl88e_phy_pi_mode_switch(hw, false);
  1558. reload_adda(hw, adda_reg, rtlphy->adda_backup, 16);
  1559. reload_mac(hw, iqk_mac_reg, rtlphy->iqk_mac_backup);
  1560. reload_adda(hw, iqk_bb_reg, rtlphy->iqk_bb_backup,
  1561. IQK_BB_REG_NUM);
  1562. rtl_set_bbreg(hw, 0x840, MASKDWORD, 0x00032ed3);
  1563. if (is2t)
  1564. rtl_set_bbreg(hw, 0x844, MASKDWORD, 0x00032ed3);
  1565. rtl_set_bbreg(hw, 0xe30, MASKDWORD, 0x01008c00);
  1566. rtl_set_bbreg(hw, 0xe34, MASKDWORD, 0x01008c00);
  1567. }
  1568. RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "88ee IQK Finish!!\n");
  1569. }
  1570. static void _rtl88e_phy_lc_calibrate(struct ieee80211_hw *hw, bool is2t)
  1571. {
  1572. u8 tmpreg;
  1573. u32 rf_a_mode = 0, rf_b_mode = 0, lc_cal;
  1574. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1575. int jj = RF90_PATH_A;
  1576. int kk = RF90_PATH_B;
  1577. tmpreg = rtl_read_byte(rtlpriv, 0xd03);
  1578. if ((tmpreg & 0x70) != 0)
  1579. rtl_write_byte(rtlpriv, 0xd03, tmpreg & 0x8F);
  1580. else
  1581. rtl_write_byte(rtlpriv, REG_TXPAUSE, 0xFF);
  1582. if ((tmpreg & 0x70) != 0) {
  1583. rf_a_mode = rtl_get_rfreg(hw, jj, 0x00, MASK12BITS);
  1584. if (is2t)
  1585. rf_b_mode = rtl_get_rfreg(hw, kk, 0x00,
  1586. MASK12BITS);
  1587. rtl_set_rfreg(hw, jj, 0x00, MASK12BITS,
  1588. (rf_a_mode & 0x8FFFF) | 0x10000);
  1589. if (is2t)
  1590. rtl_set_rfreg(hw, kk, 0x00, MASK12BITS,
  1591. (rf_b_mode & 0x8FFFF) | 0x10000);
  1592. }
  1593. lc_cal = rtl_get_rfreg(hw, jj, 0x18, MASK12BITS);
  1594. rtl_set_rfreg(hw, jj, 0x18, MASK12BITS, lc_cal | 0x08000);
  1595. mdelay(100);
  1596. if ((tmpreg & 0x70) != 0) {
  1597. rtl_write_byte(rtlpriv, 0xd03, tmpreg);
  1598. rtl_set_rfreg(hw, jj, 0x00, MASK12BITS, rf_a_mode);
  1599. if (is2t)
  1600. rtl_set_rfreg(hw, kk, 0x00, MASK12BITS,
  1601. rf_b_mode);
  1602. } else {
  1603. rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00);
  1604. }
  1605. RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "\n");
  1606. }
  1607. static void rfpath_switch(struct ieee80211_hw *hw,
  1608. bool bmain, bool is2t)
  1609. {
  1610. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1611. struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
  1612. struct rtl_efuse *fuse = rtl_efuse(rtl_priv(hw));
  1613. RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "\n");
  1614. if (is_hal_stop(rtlhal)) {
  1615. u8 u1btmp;
  1616. u1btmp = rtl_read_byte(rtlpriv, REG_LEDCFG0);
  1617. rtl_write_byte(rtlpriv, REG_LEDCFG0, u1btmp | BIT(7));
  1618. rtl_set_bbreg(hw, rFPGA0_XAB_RFPARAMETER, BIT(13), 0x01);
  1619. }
  1620. if (is2t) {
  1621. if (bmain)
  1622. rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE,
  1623. BIT(5) | BIT(6), 0x1);
  1624. else
  1625. rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE,
  1626. BIT(5) | BIT(6), 0x2);
  1627. } else {
  1628. rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW, BIT(8) | BIT(9), 0);
  1629. rtl_set_bbreg(hw, 0x914, MASKLWORD, 0x0201);
  1630. /* We use the RF definition of MAIN and AUX, left antenna and
  1631. * right antenna repectively.
  1632. * Default output at AUX.
  1633. */
  1634. if (bmain) {
  1635. rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE, BIT(14) |
  1636. BIT(13) | BIT(12), 0);
  1637. rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE, BIT(5) |
  1638. BIT(4) | BIT(3), 0);
  1639. if (fuse->antenna_div_type == CGCS_RX_HW_ANTDIV)
  1640. rtl_set_bbreg(hw, RCONFIG_RAM64X16, BIT(31), 0);
  1641. } else {
  1642. rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE, BIT(14) |
  1643. BIT(13) | BIT(12), 1);
  1644. rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE, BIT(5) |
  1645. BIT(4) | BIT(3), 1);
  1646. if (fuse->antenna_div_type == CGCS_RX_HW_ANTDIV)
  1647. rtl_set_bbreg(hw, RCONFIG_RAM64X16, BIT(31), 1);
  1648. }
  1649. }
  1650. }
  1651. #undef IQK_ADDA_REG_NUM
  1652. #undef IQK_DELAY_TIME
  1653. void rtl88e_phy_iq_calibrate(struct ieee80211_hw *hw, bool recovery)
  1654. {
  1655. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1656. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  1657. long result[4][8];
  1658. u8 i, final;
  1659. bool patha_ok;
  1660. long reg_e94, reg_e9c, reg_ea4, reg_eb4, reg_ebc, reg_tmp = 0;
  1661. bool is12simular, is13simular, is23simular;
  1662. u32 iqk_bb_reg[9] = {
  1663. ROFDM0_XARXIQIMBAL,
  1664. ROFDM0_XBRXIQIMBAL,
  1665. ROFDM0_ECCATHRES,
  1666. ROFDM0_AGCRSSITABLE,
  1667. ROFDM0_XATXIQIMBAL,
  1668. ROFDM0_XBTXIQIMBAL,
  1669. ROFDM0_XCTXAFE,
  1670. ROFDM0_XDTXAFE,
  1671. ROFDM0_RXIQEXTANTA
  1672. };
  1673. if (recovery) {
  1674. reload_adda(hw, iqk_bb_reg, rtlphy->iqk_bb_backup, 9);
  1675. return;
  1676. }
  1677. memset(result, 0, 32 * sizeof(long));
  1678. final = 0xff;
  1679. patha_ok = false;
  1680. is12simular = false;
  1681. is23simular = false;
  1682. is13simular = false;
  1683. for (i = 0; i < 3; i++) {
  1684. if (get_rf_type(rtlphy) == RF_2T2R)
  1685. _rtl88e_phy_iq_calibrate(hw, result, i, true);
  1686. else
  1687. _rtl88e_phy_iq_calibrate(hw, result, i, false);
  1688. if (i == 1) {
  1689. is12simular = sim_comp(hw, result, 0, 1);
  1690. if (is12simular) {
  1691. final = 0;
  1692. break;
  1693. }
  1694. }
  1695. if (i == 2) {
  1696. is13simular = sim_comp(hw, result, 0, 2);
  1697. if (is13simular) {
  1698. final = 0;
  1699. break;
  1700. }
  1701. is23simular = sim_comp(hw, result, 1, 2);
  1702. if (is23simular) {
  1703. final = 1;
  1704. } else {
  1705. for (i = 0; i < 8; i++)
  1706. reg_tmp += result[3][i];
  1707. if (reg_tmp != 0)
  1708. final = 3;
  1709. else
  1710. final = 0xFF;
  1711. }
  1712. }
  1713. }
  1714. for (i = 0; i < 4; i++) {
  1715. reg_e94 = result[i][0];
  1716. reg_e9c = result[i][1];
  1717. reg_ea4 = result[i][2];
  1718. reg_eb4 = result[i][4];
  1719. reg_ebc = result[i][5];
  1720. }
  1721. if (final != 0xff) {
  1722. reg_e94 = result[final][0];
  1723. rtlphy->reg_e94 = reg_e94;
  1724. reg_e9c = result[final][1];
  1725. rtlphy->reg_e9c = reg_e9c;
  1726. reg_ea4 = result[final][2];
  1727. reg_eb4 = result[final][4];
  1728. rtlphy->reg_eb4 = reg_eb4;
  1729. reg_ebc = result[final][5];
  1730. rtlphy->reg_ebc = reg_ebc;
  1731. patha_ok = true;
  1732. } else {
  1733. rtlphy->reg_e94 = 0x100;
  1734. rtlphy->reg_eb4 = 0x100;
  1735. rtlphy->reg_ebc = 0x0;
  1736. rtlphy->reg_e9c = 0x0;
  1737. }
  1738. if (reg_e94 != 0) /*&&(reg_ea4 != 0) */
  1739. fill_iqk(hw, patha_ok, result, final, (reg_ea4 == 0));
  1740. if (final != 0xFF) {
  1741. for (i = 0; i < IQK_MATRIX_REG_NUM; i++)
  1742. rtlphy->iqk_matrix[0].value[0][i] = result[final][i];
  1743. rtlphy->iqk_matrix[0].iqk_done = true;
  1744. }
  1745. save_adda_reg(hw, iqk_bb_reg, rtlphy->iqk_bb_backup, 9);
  1746. }
  1747. void rtl88e_phy_lc_calibrate(struct ieee80211_hw *hw)
  1748. {
  1749. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1750. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  1751. struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
  1752. bool start_conttx = false, singletone = false;
  1753. u32 timeout = 2000, timecount = 0;
  1754. if (start_conttx || singletone)
  1755. return;
  1756. while (rtlpriv->mac80211.act_scanning && timecount < timeout) {
  1757. udelay(50);
  1758. timecount += 50;
  1759. }
  1760. rtlphy->lck_inprogress = true;
  1761. RTPRINT(rtlpriv, FINIT, INIT_IQK,
  1762. "LCK:Start!!! currentband %x delay %d ms\n",
  1763. rtlhal->current_bandtype, timecount);
  1764. _rtl88e_phy_lc_calibrate(hw, false);
  1765. rtlphy->lck_inprogress = false;
  1766. }
  1767. void rtl88e_phy_set_rfpath_switch(struct ieee80211_hw *hw, bool bmain)
  1768. {
  1769. rfpath_switch(hw, bmain, false);
  1770. }
  1771. bool rtl88e_phy_set_io_cmd(struct ieee80211_hw *hw, enum io_type iotype)
  1772. {
  1773. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1774. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  1775. bool postprocessing = false;
  1776. RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
  1777. "-->IO Cmd(%#x), set_io_inprogress(%d)\n",
  1778. iotype, rtlphy->set_io_inprogress);
  1779. do {
  1780. switch (iotype) {
  1781. case IO_CMD_RESUME_DM_BY_SCAN:
  1782. RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
  1783. "[IO CMD] Resume DM after scan.\n");
  1784. postprocessing = true;
  1785. break;
  1786. case IO_CMD_PAUSE_DM_BY_SCAN:
  1787. RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
  1788. "[IO CMD] Pause DM before scan.\n");
  1789. postprocessing = true;
  1790. break;
  1791. default:
  1792. RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
  1793. "switch case not processed\n");
  1794. break;
  1795. }
  1796. } while (false);
  1797. if (postprocessing && !rtlphy->set_io_inprogress) {
  1798. rtlphy->set_io_inprogress = true;
  1799. rtlphy->current_io_type = iotype;
  1800. } else {
  1801. return false;
  1802. }
  1803. rtl88e_phy_set_io(hw);
  1804. RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE, "IO Type(%#x)\n", iotype);
  1805. return true;
  1806. }
  1807. static void rtl88ee_phy_set_rf_on(struct ieee80211_hw *hw)
  1808. {
  1809. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1810. rtl_write_byte(rtlpriv, REG_SPS0_CTRL, 0x2b);
  1811. rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3);
  1812. /*rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x00);*/
  1813. rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE2);
  1814. rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3);
  1815. rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00);
  1816. }
  1817. static void _rtl88ee_phy_set_rf_sleep(struct ieee80211_hw *hw)
  1818. {
  1819. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1820. int jj = RF90_PATH_A;
  1821. rtl_write_byte(rtlpriv, REG_TXPAUSE, 0xFF);
  1822. rtl_set_rfreg(hw, jj, 0x00, RFREG_OFFSET_MASK, 0x00);
  1823. rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE2);
  1824. rtl_write_byte(rtlpriv, REG_SPS0_CTRL, 0x22);
  1825. }
  1826. static bool _rtl88ee_phy_set_rf_power_state(struct ieee80211_hw *hw,
  1827. enum rf_pwrstate rfpwr_state)
  1828. {
  1829. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1830. struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
  1831. struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
  1832. struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
  1833. struct rtl8192_tx_ring *ring = NULL;
  1834. bool bresult = true;
  1835. u8 i, queue_id;
  1836. switch (rfpwr_state) {
  1837. case ERFON:{
  1838. if ((ppsc->rfpwr_state == ERFOFF) &&
  1839. RT_IN_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC)) {
  1840. bool rtstatus;
  1841. u32 init = 0;
  1842. do {
  1843. init++;
  1844. RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
  1845. "IPS Set eRf nic enable\n");
  1846. rtstatus = rtl_ps_enable_nic(hw);
  1847. } while ((rtstatus != true) && (init < 10));
  1848. RT_CLEAR_PS_LEVEL(ppsc,
  1849. RT_RF_OFF_LEVL_HALT_NIC);
  1850. } else {
  1851. RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
  1852. "Set ERFON sleeped:%d ms\n",
  1853. jiffies_to_msecs(jiffies - ppsc->
  1854. last_sleep_jiffies));
  1855. ppsc->last_awake_jiffies = jiffies;
  1856. rtl88ee_phy_set_rf_on(hw);
  1857. }
  1858. if (mac->link_state == MAC80211_LINKED)
  1859. rtlpriv->cfg->ops->led_control(hw, LED_CTL_LINK);
  1860. else
  1861. rtlpriv->cfg->ops->led_control(hw, LED_CTL_NO_LINK);
  1862. break; }
  1863. case ERFOFF:{
  1864. for (queue_id = 0, i = 0;
  1865. queue_id < RTL_PCI_MAX_TX_QUEUE_COUNT;) {
  1866. ring = &pcipriv->dev.tx_ring[queue_id];
  1867. if (skb_queue_len(&ring->queue) == 0) {
  1868. queue_id++;
  1869. continue;
  1870. } else {
  1871. RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
  1872. "eRf Off/Sleep: %d times TcbBusyQueue[%d] =%d before doze!\n",
  1873. (i + 1), queue_id,
  1874. skb_queue_len(&ring->queue));
  1875. udelay(10);
  1876. i++;
  1877. }
  1878. if (i >= MAX_DOZE_WAITING_TIMES_9x) {
  1879. RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
  1880. "\n ERFSLEEP: %d times TcbBusyQueue[%d] = %d !\n",
  1881. MAX_DOZE_WAITING_TIMES_9x,
  1882. queue_id,
  1883. skb_queue_len(&ring->queue));
  1884. break;
  1885. }
  1886. }
  1887. if (ppsc->reg_rfps_level & RT_RF_OFF_LEVL_HALT_NIC) {
  1888. RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
  1889. "IPS Set eRf nic disable\n");
  1890. rtl_ps_disable_nic(hw);
  1891. RT_SET_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC);
  1892. } else {
  1893. if (ppsc->rfoff_reason == RF_CHANGE_BY_IPS) {
  1894. rtlpriv->cfg->ops->led_control(hw,
  1895. LED_CTL_NO_LINK);
  1896. } else {
  1897. rtlpriv->cfg->ops->led_control(hw,
  1898. LED_CTL_POWER_OFF);
  1899. }
  1900. }
  1901. break; }
  1902. case ERFSLEEP:{
  1903. if (ppsc->rfpwr_state == ERFOFF)
  1904. break;
  1905. for (queue_id = 0, i = 0;
  1906. queue_id < RTL_PCI_MAX_TX_QUEUE_COUNT;) {
  1907. ring = &pcipriv->dev.tx_ring[queue_id];
  1908. if (skb_queue_len(&ring->queue) == 0) {
  1909. queue_id++;
  1910. continue;
  1911. } else {
  1912. RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
  1913. "eRf Off/Sleep: %d times TcbBusyQueue[%d] =%d before doze!\n",
  1914. (i + 1), queue_id,
  1915. skb_queue_len(&ring->queue));
  1916. udelay(10);
  1917. i++;
  1918. }
  1919. if (i >= MAX_DOZE_WAITING_TIMES_9x) {
  1920. RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
  1921. "\n ERFSLEEP: %d times TcbBusyQueue[%d] = %d !\n",
  1922. MAX_DOZE_WAITING_TIMES_9x,
  1923. queue_id,
  1924. skb_queue_len(&ring->queue));
  1925. break;
  1926. }
  1927. }
  1928. RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
  1929. "Set ERFSLEEP awaked:%d ms\n",
  1930. jiffies_to_msecs(jiffies - ppsc->last_awake_jiffies));
  1931. ppsc->last_sleep_jiffies = jiffies;
  1932. _rtl88ee_phy_set_rf_sleep(hw);
  1933. break; }
  1934. default:
  1935. RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
  1936. "switch case not processed\n");
  1937. bresult = false;
  1938. break;
  1939. }
  1940. if (bresult)
  1941. ppsc->rfpwr_state = rfpwr_state;
  1942. return bresult;
  1943. }
  1944. bool rtl88e_phy_set_rf_power_state(struct ieee80211_hw *hw,
  1945. enum rf_pwrstate rfpwr_state)
  1946. {
  1947. struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
  1948. bool bresult;
  1949. if (rfpwr_state == ppsc->rfpwr_state)
  1950. return false;
  1951. bresult = _rtl88ee_phy_set_rf_power_state(hw, rfpwr_state);
  1952. return bresult;
  1953. }