phy.c 62 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174
  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_set_bw_mode_callback(struct ieee80211_hw *hw)
  1006. {
  1007. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1008. struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
  1009. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  1010. struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
  1011. u8 reg_bw_opmode;
  1012. u8 reg_prsr_rsc;
  1013. RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE,
  1014. "Switch to %s bandwidth\n",
  1015. rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20 ?
  1016. "20MHz" : "40MHz");
  1017. if (is_hal_stop(rtlhal)) {
  1018. rtlphy->set_bwmode_inprogress = false;
  1019. return;
  1020. }
  1021. reg_bw_opmode = rtl_read_byte(rtlpriv, REG_BWOPMODE);
  1022. reg_prsr_rsc = rtl_read_byte(rtlpriv, REG_RRSR + 2);
  1023. switch (rtlphy->current_chan_bw) {
  1024. case HT_CHANNEL_WIDTH_20:
  1025. reg_bw_opmode |= BW_OPMODE_20MHZ;
  1026. rtl_write_byte(rtlpriv, REG_BWOPMODE, reg_bw_opmode);
  1027. break;
  1028. case HT_CHANNEL_WIDTH_20_40:
  1029. reg_bw_opmode &= ~BW_OPMODE_20MHZ;
  1030. rtl_write_byte(rtlpriv, REG_BWOPMODE, reg_bw_opmode);
  1031. reg_prsr_rsc =
  1032. (reg_prsr_rsc & 0x90) | (mac->cur_40_prime_sc << 5);
  1033. rtl_write_byte(rtlpriv, REG_RRSR + 2, reg_prsr_rsc);
  1034. break;
  1035. default:
  1036. RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
  1037. "unknown bandwidth: %#X\n", rtlphy->current_chan_bw);
  1038. break;
  1039. }
  1040. switch (rtlphy->current_chan_bw) {
  1041. case HT_CHANNEL_WIDTH_20:
  1042. rtl_set_bbreg(hw, RFPGA0_RFMOD, BRFMOD, 0x0);
  1043. rtl_set_bbreg(hw, RFPGA1_RFMOD, BRFMOD, 0x0);
  1044. /* rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER2, BIT(10), 1);*/
  1045. break;
  1046. case HT_CHANNEL_WIDTH_20_40:
  1047. rtl_set_bbreg(hw, RFPGA0_RFMOD, BRFMOD, 0x1);
  1048. rtl_set_bbreg(hw, RFPGA1_RFMOD, BRFMOD, 0x1);
  1049. rtl_set_bbreg(hw, RCCK0_SYSTEM, BCCK_SIDEBAND,
  1050. (mac->cur_40_prime_sc >> 1));
  1051. rtl_set_bbreg(hw, ROFDM1_LSTF, 0xC00, mac->cur_40_prime_sc);
  1052. /*rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER2, BIT(10), 0);*/
  1053. rtl_set_bbreg(hw, 0x818, (BIT(26) | BIT(27)),
  1054. (mac->cur_40_prime_sc ==
  1055. HAL_PRIME_CHNL_OFFSET_LOWER) ? 2 : 1);
  1056. break;
  1057. default:
  1058. RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
  1059. "unknown bandwidth: %#X\n", rtlphy->current_chan_bw);
  1060. break;
  1061. }
  1062. rtl88e_phy_rf6052_set_bandwidth(hw, rtlphy->current_chan_bw);
  1063. rtlphy->set_bwmode_inprogress = false;
  1064. RT_TRACE(rtlpriv, COMP_SCAN, DBG_LOUD, "\n");
  1065. }
  1066. void rtl88e_phy_set_bw_mode(struct ieee80211_hw *hw,
  1067. enum nl80211_channel_type ch_type)
  1068. {
  1069. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1070. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  1071. struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
  1072. u8 tmp_bw = rtlphy->current_chan_bw;
  1073. if (rtlphy->set_bwmode_inprogress)
  1074. return;
  1075. rtlphy->set_bwmode_inprogress = true;
  1076. if ((!is_hal_stop(rtlhal)) && !(RT_CANNOT_IO(hw))) {
  1077. rtl88e_phy_set_bw_mode_callback(hw);
  1078. } else {
  1079. RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
  1080. "FALSE driver sleep or unload\n");
  1081. rtlphy->set_bwmode_inprogress = false;
  1082. rtlphy->current_chan_bw = tmp_bw;
  1083. }
  1084. }
  1085. void rtl88e_phy_sw_chnl_callback(struct ieee80211_hw *hw)
  1086. {
  1087. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1088. struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
  1089. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  1090. u32 delay;
  1091. RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE,
  1092. "switch to channel%d\n", rtlphy->current_channel);
  1093. if (is_hal_stop(rtlhal))
  1094. return;
  1095. do {
  1096. if (!rtlphy->sw_chnl_inprogress)
  1097. break;
  1098. if (!chnl_step_by_step(hw, rtlphy->current_channel,
  1099. &rtlphy->sw_chnl_stage,
  1100. &rtlphy->sw_chnl_step, &delay)) {
  1101. if (delay > 0)
  1102. mdelay(delay);
  1103. else
  1104. continue;
  1105. } else {
  1106. rtlphy->sw_chnl_inprogress = false;
  1107. }
  1108. break;
  1109. } while (true);
  1110. RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, "\n");
  1111. }
  1112. u8 rtl88e_phy_sw_chnl(struct ieee80211_hw *hw)
  1113. {
  1114. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1115. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  1116. struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
  1117. if (rtlphy->sw_chnl_inprogress)
  1118. return 0;
  1119. if (rtlphy->set_bwmode_inprogress)
  1120. return 0;
  1121. RT_ASSERT((rtlphy->current_channel <= 14),
  1122. "WIRELESS_MODE_G but channel>14");
  1123. rtlphy->sw_chnl_inprogress = true;
  1124. rtlphy->sw_chnl_stage = 0;
  1125. rtlphy->sw_chnl_step = 0;
  1126. if (!(is_hal_stop(rtlhal)) && !(RT_CANNOT_IO(hw))) {
  1127. rtl88e_phy_sw_chnl_callback(hw);
  1128. RT_TRACE(rtlpriv, COMP_CHAN, DBG_LOUD,
  1129. "sw_chnl_inprogress false schdule workitem current channel %d\n",
  1130. rtlphy->current_channel);
  1131. rtlphy->sw_chnl_inprogress = false;
  1132. } else {
  1133. RT_TRACE(rtlpriv, COMP_CHAN, DBG_LOUD,
  1134. "sw_chnl_inprogress false driver sleep or unload\n");
  1135. rtlphy->sw_chnl_inprogress = false;
  1136. }
  1137. return 1;
  1138. }
  1139. static u8 _rtl88e_phy_path_a_iqk(struct ieee80211_hw *hw, bool config_pathb)
  1140. {
  1141. u32 reg_eac, reg_e94, reg_e9c;
  1142. u8 result = 0x00;
  1143. rtl_set_bbreg(hw, 0xe30, MASKDWORD, 0x10008c1c);
  1144. rtl_set_bbreg(hw, 0xe34, MASKDWORD, 0x30008c1c);
  1145. rtl_set_bbreg(hw, 0xe38, MASKDWORD, 0x8214032a);
  1146. rtl_set_bbreg(hw, 0xe3c, MASKDWORD, 0x28160000);
  1147. rtl_set_bbreg(hw, 0xe4c, MASKDWORD, 0x00462911);
  1148. rtl_set_bbreg(hw, 0xe48, MASKDWORD, 0xf9000000);
  1149. rtl_set_bbreg(hw, 0xe48, MASKDWORD, 0xf8000000);
  1150. mdelay(IQK_DELAY_TIME);
  1151. reg_eac = rtl_get_bbreg(hw, 0xeac, MASKDWORD);
  1152. reg_e94 = rtl_get_bbreg(hw, 0xe94, MASKDWORD);
  1153. reg_e9c = rtl_get_bbreg(hw, 0xe9c, MASKDWORD);
  1154. if (!(reg_eac & BIT(28)) &&
  1155. (((reg_e94 & 0x03FF0000) >> 16) != 0x142) &&
  1156. (((reg_e9c & 0x03FF0000) >> 16) != 0x42))
  1157. result |= 0x01;
  1158. return result;
  1159. }
  1160. static u8 _rtl88e_phy_path_b_iqk(struct ieee80211_hw *hw)
  1161. {
  1162. u32 reg_eac, reg_eb4, reg_ebc, reg_ec4, reg_ecc;
  1163. u8 result = 0x00;
  1164. rtl_set_bbreg(hw, 0xe60, MASKDWORD, 0x00000002);
  1165. rtl_set_bbreg(hw, 0xe60, MASKDWORD, 0x00000000);
  1166. mdelay(IQK_DELAY_TIME);
  1167. reg_eac = rtl_get_bbreg(hw, 0xeac, MASKDWORD);
  1168. reg_eb4 = rtl_get_bbreg(hw, 0xeb4, MASKDWORD);
  1169. reg_ebc = rtl_get_bbreg(hw, 0xebc, MASKDWORD);
  1170. reg_ec4 = rtl_get_bbreg(hw, 0xec4, MASKDWORD);
  1171. reg_ecc = rtl_get_bbreg(hw, 0xecc, MASKDWORD);
  1172. if (!(reg_eac & BIT(31)) &&
  1173. (((reg_eb4 & 0x03FF0000) >> 16) != 0x142) &&
  1174. (((reg_ebc & 0x03FF0000) >> 16) != 0x42))
  1175. result |= 0x01;
  1176. else
  1177. return result;
  1178. if (!(reg_eac & BIT(30)) &&
  1179. (((reg_ec4 & 0x03FF0000) >> 16) != 0x132) &&
  1180. (((reg_ecc & 0x03FF0000) >> 16) != 0x36))
  1181. result |= 0x02;
  1182. return result;
  1183. }
  1184. static u8 _rtl88e_phy_path_a_rx_iqk(struct ieee80211_hw *hw, bool config_pathb)
  1185. {
  1186. u32 reg_eac, reg_e94, reg_e9c, reg_ea4, u32temp;
  1187. u8 result = 0x00;
  1188. int jj = RF90_PATH_A;
  1189. /*Get TXIMR Setting*/
  1190. /*Modify RX IQK mode table*/
  1191. rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
  1192. rtl_set_rfreg(hw, jj, RF_WE_LUT, RFREG_OFFSET_MASK, 0x800a0);
  1193. rtl_set_rfreg(hw, jj, RF_RCK_OS, RFREG_OFFSET_MASK, 0x30000);
  1194. rtl_set_rfreg(hw, jj, RF_TXPA_G1, RFREG_OFFSET_MASK, 0x0000f);
  1195. rtl_set_rfreg(hw, jj, RF_TXPA_G2, RFREG_OFFSET_MASK, 0xf117b);
  1196. rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x80800000);
  1197. /*IQK Setting*/
  1198. rtl_set_bbreg(hw, RTX_IQK, MASKDWORD, 0x01007c00);
  1199. rtl_set_bbreg(hw, RRX_IQK, MASKDWORD, 0x81004800);
  1200. /*path a IQK setting*/
  1201. rtl_set_bbreg(hw, RTX_IQK_TONE_A, MASKDWORD, 0x10008c1c);
  1202. rtl_set_bbreg(hw, RRX_IQK_TONE_A, MASKDWORD, 0x30008c1c);
  1203. rtl_set_bbreg(hw, RTX_IQK_PI_A, MASKDWORD, 0x82160804);
  1204. rtl_set_bbreg(hw, RRX_IQK_PI_A, MASKDWORD, 0x28160000);
  1205. /*LO calibration Setting*/
  1206. rtl_set_bbreg(hw, RIQK_AGC_RSP, MASKDWORD, 0x0046a911);
  1207. /*one shot, path A LOK & iqk*/
  1208. rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf9000000);
  1209. rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf8000000);
  1210. mdelay(IQK_DELAY_TIME);
  1211. reg_eac = rtl_get_bbreg(hw, RRX_POWER_AFTER_IQK_A_2, MASKDWORD);
  1212. reg_e94 = rtl_get_bbreg(hw, RTX_POWER_BEFORE_IQK_A, MASKDWORD);
  1213. reg_e9c = rtl_get_bbreg(hw, RTX_POWER_AFTER_IQK_A, MASKDWORD);
  1214. if (!(reg_eac & BIT(28)) &&
  1215. (((reg_e94 & 0x03FF0000) >> 16) != 0x142) &&
  1216. (((reg_e9c & 0x03FF0000) >> 16) != 0x42))
  1217. result |= 0x01;
  1218. else
  1219. return result;
  1220. u32temp = 0x80007C00 | (reg_e94&0x3FF0000) |
  1221. ((reg_e9c&0x3FF0000) >> 16);
  1222. rtl_set_bbreg(hw, RTX_IQK, MASKDWORD, u32temp);
  1223. /*RX IQK*/
  1224. /*Modify RX IQK mode table*/
  1225. rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
  1226. rtl_set_rfreg(hw, jj, RF_WE_LUT, RFREG_OFFSET_MASK, 0x800a0);
  1227. rtl_set_rfreg(hw, jj, RF_RCK_OS, RFREG_OFFSET_MASK, 0x30000);
  1228. rtl_set_rfreg(hw, jj, RF_TXPA_G1, RFREG_OFFSET_MASK, 0x0000f);
  1229. rtl_set_rfreg(hw, jj, RF_TXPA_G2, RFREG_OFFSET_MASK, 0xf7ffa);
  1230. rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x80800000);
  1231. /*IQK Setting*/
  1232. rtl_set_bbreg(hw, RRX_IQK, MASKDWORD, 0x01004800);
  1233. /*path a IQK setting*/
  1234. rtl_set_bbreg(hw, RTX_IQK_TONE_A, MASKDWORD, 0x30008c1c);
  1235. rtl_set_bbreg(hw, RRX_IQK_TONE_A, MASKDWORD, 0x10008c1c);
  1236. rtl_set_bbreg(hw, RTX_IQK_PI_A, MASKDWORD, 0x82160c05);
  1237. rtl_set_bbreg(hw, RRX_IQK_PI_A, MASKDWORD, 0x28160c05);
  1238. /*LO calibration Setting*/
  1239. rtl_set_bbreg(hw, RIQK_AGC_RSP, MASKDWORD, 0x0046a911);
  1240. /*one shot, path A LOK & iqk*/
  1241. rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf9000000);
  1242. rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf8000000);
  1243. mdelay(IQK_DELAY_TIME);
  1244. reg_eac = rtl_get_bbreg(hw, RRX_POWER_AFTER_IQK_A_2, MASKDWORD);
  1245. reg_e94 = rtl_get_bbreg(hw, RTX_POWER_BEFORE_IQK_A, MASKDWORD);
  1246. reg_e9c = rtl_get_bbreg(hw, RTX_POWER_AFTER_IQK_A, MASKDWORD);
  1247. reg_ea4 = rtl_get_bbreg(hw, RRX_POWER_BEFORE_IQK_A_2, MASKDWORD);
  1248. if (!(reg_eac & BIT(27)) &&
  1249. (((reg_ea4 & 0x03FF0000) >> 16) != 0x132) &&
  1250. (((reg_eac & 0x03FF0000) >> 16) != 0x36))
  1251. result |= 0x02;
  1252. return result;
  1253. }
  1254. static void fill_iqk(struct ieee80211_hw *hw, bool iqk_ok, long result[][8],
  1255. u8 final, bool btxonly)
  1256. {
  1257. u32 oldval_0, x, tx0_a, reg;
  1258. long y, tx0_c;
  1259. if (final == 0xFF) {
  1260. return;
  1261. } else if (iqk_ok) {
  1262. oldval_0 = (rtl_get_bbreg(hw, ROFDM0_XATXIQIMBAL,
  1263. MASKDWORD) >> 22) & 0x3FF;
  1264. x = result[final][0];
  1265. if ((x & 0x00000200) != 0)
  1266. x = x | 0xFFFFFC00;
  1267. tx0_a = (x * oldval_0) >> 8;
  1268. rtl_set_bbreg(hw, ROFDM0_XATXIQIMBAL, 0x3FF, tx0_a);
  1269. rtl_set_bbreg(hw, ROFDM0_ECCATHRES, BIT(31),
  1270. ((x * oldval_0 >> 7) & 0x1));
  1271. y = result[final][1];
  1272. if ((y & 0x00000200) != 0)
  1273. y |= 0xFFFFFC00;
  1274. tx0_c = (y * oldval_0) >> 8;
  1275. rtl_set_bbreg(hw, ROFDM0_XCTXAFE, 0xF0000000,
  1276. ((tx0_c & 0x3C0) >> 6));
  1277. rtl_set_bbreg(hw, ROFDM0_XATXIQIMBAL, 0x003F0000,
  1278. (tx0_c & 0x3F));
  1279. rtl_set_bbreg(hw, ROFDM0_ECCATHRES, BIT(29),
  1280. ((y * oldval_0 >> 7) & 0x1));
  1281. if (btxonly)
  1282. return;
  1283. reg = result[final][2];
  1284. rtl_set_bbreg(hw, ROFDM0_XARXIQIMBAL, 0x3FF, reg);
  1285. reg = result[final][3] & 0x3F;
  1286. rtl_set_bbreg(hw, ROFDM0_XARXIQIMBAL, 0xFC00, reg);
  1287. reg = (result[final][3] >> 6) & 0xF;
  1288. rtl_set_bbreg(hw, 0xca0, 0xF0000000, reg);
  1289. }
  1290. }
  1291. static void save_adda_reg(struct ieee80211_hw *hw,
  1292. const u32 *addareg, u32 *backup,
  1293. u32 registernum)
  1294. {
  1295. u32 i;
  1296. for (i = 0; i < registernum; i++)
  1297. backup[i] = rtl_get_bbreg(hw, addareg[i], MASKDWORD);
  1298. }
  1299. static void save_mac_reg(struct ieee80211_hw *hw, const u32 *macreg,
  1300. u32 *macbackup)
  1301. {
  1302. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1303. u32 i;
  1304. for (i = 0; i < (IQK_MAC_REG_NUM - 1); i++)
  1305. macbackup[i] = rtl_read_byte(rtlpriv, macreg[i]);
  1306. macbackup[i] = rtl_read_dword(rtlpriv, macreg[i]);
  1307. }
  1308. static void reload_adda(struct ieee80211_hw *hw, const u32 *addareg,
  1309. u32 *backup, u32 reg_num)
  1310. {
  1311. u32 i;
  1312. for (i = 0; i < reg_num; i++)
  1313. rtl_set_bbreg(hw, addareg[i], MASKDWORD, backup[i]);
  1314. }
  1315. static void reload_mac(struct ieee80211_hw *hw, const u32 *macreg,
  1316. u32 *macbackup)
  1317. {
  1318. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1319. u32 i;
  1320. for (i = 0; i < (IQK_MAC_REG_NUM - 1); i++)
  1321. rtl_write_byte(rtlpriv, macreg[i], (u8) macbackup[i]);
  1322. rtl_write_dword(rtlpriv, macreg[i], macbackup[i]);
  1323. }
  1324. static void _rtl88e_phy_path_adda_on(struct ieee80211_hw *hw,
  1325. const u32 *addareg, bool is_patha_on,
  1326. bool is2t)
  1327. {
  1328. u32 pathon;
  1329. u32 i;
  1330. pathon = is_patha_on ? 0x04db25a4 : 0x0b1b25a4;
  1331. if (false == is2t) {
  1332. pathon = 0x0bdb25a0;
  1333. rtl_set_bbreg(hw, addareg[0], MASKDWORD, 0x0b1b25a0);
  1334. } else {
  1335. rtl_set_bbreg(hw, addareg[0], MASKDWORD, pathon);
  1336. }
  1337. for (i = 1; i < IQK_ADDA_REG_NUM; i++)
  1338. rtl_set_bbreg(hw, addareg[i], MASKDWORD, pathon);
  1339. }
  1340. static void _rtl88e_phy_mac_setting_calibration(struct ieee80211_hw *hw,
  1341. const u32 *macreg,
  1342. u32 *macbackup)
  1343. {
  1344. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1345. u32 i = 0;
  1346. rtl_write_byte(rtlpriv, macreg[i], 0x3F);
  1347. for (i = 1; i < (IQK_MAC_REG_NUM - 1); i++)
  1348. rtl_write_byte(rtlpriv, macreg[i],
  1349. (u8) (macbackup[i] & (~BIT(3))));
  1350. rtl_write_byte(rtlpriv, macreg[i], (u8) (macbackup[i] & (~BIT(5))));
  1351. }
  1352. static void _rtl88e_phy_path_a_standby(struct ieee80211_hw *hw)
  1353. {
  1354. rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x0);
  1355. rtl_set_bbreg(hw, 0x840, MASKDWORD, 0x00010000);
  1356. rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x80800000);
  1357. }
  1358. static void _rtl88e_phy_pi_mode_switch(struct ieee80211_hw *hw, bool pi_mode)
  1359. {
  1360. u32 mode;
  1361. mode = pi_mode ? 0x01000100 : 0x01000000;
  1362. rtl_set_bbreg(hw, 0x820, MASKDWORD, mode);
  1363. rtl_set_bbreg(hw, 0x828, MASKDWORD, mode);
  1364. }
  1365. static bool sim_comp(struct ieee80211_hw *hw, long result[][8], u8 c1, u8 c2)
  1366. {
  1367. u32 i, j, diff, bitmap, bound;
  1368. struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
  1369. u8 final[2] = {0xFF, 0xFF};
  1370. bool bresult = true, is2t = IS_92C_SERIAL(rtlhal->version);
  1371. if (is2t)
  1372. bound = 8;
  1373. else
  1374. bound = 4;
  1375. bitmap = 0;
  1376. for (i = 0; i < bound; i++) {
  1377. diff = (result[c1][i] > result[c2][i]) ?
  1378. (result[c1][i] - result[c2][i]) :
  1379. (result[c2][i] - result[c1][i]);
  1380. if (diff > MAX_TOLERANCE) {
  1381. if ((i == 2 || i == 6) && !bitmap) {
  1382. if (result[c1][i] + result[c1][i + 1] == 0)
  1383. final[(i / 4)] = c2;
  1384. else if (result[c2][i] + result[c2][i + 1] == 0)
  1385. final[(i / 4)] = c1;
  1386. else
  1387. bitmap = bitmap | (1 << i);
  1388. } else {
  1389. bitmap = bitmap | (1 << i);
  1390. }
  1391. }
  1392. }
  1393. if (bitmap == 0) {
  1394. for (i = 0; i < (bound / 4); i++) {
  1395. if (final[i] != 0xFF) {
  1396. for (j = i * 4; j < (i + 1) * 4 - 2; j++)
  1397. result[3][j] = result[final[i]][j];
  1398. bresult = false;
  1399. }
  1400. }
  1401. return bresult;
  1402. } else if (!(bitmap & 0x0F)) {
  1403. for (i = 0; i < 4; i++)
  1404. result[3][i] = result[c1][i];
  1405. return false;
  1406. } else if (!(bitmap & 0xF0) && is2t) {
  1407. for (i = 4; i < 8; i++)
  1408. result[3][i] = result[c1][i];
  1409. return false;
  1410. } else {
  1411. return false;
  1412. }
  1413. }
  1414. static void _rtl88e_phy_iq_calibrate(struct ieee80211_hw *hw,
  1415. long result[][8], u8 t, bool is2t)
  1416. {
  1417. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1418. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  1419. u32 i;
  1420. u8 patha_ok, pathb_ok;
  1421. const u32 adda_reg[IQK_ADDA_REG_NUM] = {
  1422. 0x85c, 0xe6c, 0xe70, 0xe74,
  1423. 0xe78, 0xe7c, 0xe80, 0xe84,
  1424. 0xe88, 0xe8c, 0xed0, 0xed4,
  1425. 0xed8, 0xedc, 0xee0, 0xeec
  1426. };
  1427. const u32 iqk_mac_reg[IQK_MAC_REG_NUM] = {
  1428. 0x522, 0x550, 0x551, 0x040
  1429. };
  1430. const u32 iqk_bb_reg[IQK_BB_REG_NUM] = {
  1431. ROFDM0_TRXPATHENABLE, ROFDM0_TRMUXPAR, RFPGA0_XCD_RFINTERFACESW,
  1432. 0xb68, 0xb6c, 0x870, 0x860, 0x864, 0x800
  1433. };
  1434. const u32 retrycount = 2;
  1435. if (t == 0) {
  1436. save_adda_reg(hw, adda_reg, rtlphy->adda_backup, 16);
  1437. save_mac_reg(hw, iqk_mac_reg, rtlphy->iqk_mac_backup);
  1438. save_adda_reg(hw, iqk_bb_reg, rtlphy->iqk_bb_backup,
  1439. IQK_BB_REG_NUM);
  1440. }
  1441. _rtl88e_phy_path_adda_on(hw, adda_reg, true, is2t);
  1442. if (t == 0) {
  1443. rtlphy->rfpi_enable = (u8) rtl_get_bbreg(hw,
  1444. RFPGA0_XA_HSSIPARAMETER1, BIT(8));
  1445. }
  1446. if (!rtlphy->rfpi_enable)
  1447. _rtl88e_phy_pi_mode_switch(hw, true);
  1448. /*BB Setting*/
  1449. rtl_set_bbreg(hw, 0x800, BIT(24), 0x00);
  1450. rtl_set_bbreg(hw, 0xc04, MASKDWORD, 0x03a05600);
  1451. rtl_set_bbreg(hw, 0xc08, MASKDWORD, 0x000800e4);
  1452. rtl_set_bbreg(hw, 0x874, MASKDWORD, 0x22204000);
  1453. rtl_set_bbreg(hw, 0x870, BIT(10), 0x01);
  1454. rtl_set_bbreg(hw, 0x870, BIT(26), 0x01);
  1455. rtl_set_bbreg(hw, 0x860, BIT(10), 0x00);
  1456. rtl_set_bbreg(hw, 0x864, BIT(10), 0x00);
  1457. if (is2t) {
  1458. rtl_set_bbreg(hw, 0x840, MASKDWORD, 0x00010000);
  1459. rtl_set_bbreg(hw, 0x844, MASKDWORD, 0x00010000);
  1460. }
  1461. _rtl88e_phy_mac_setting_calibration(hw, iqk_mac_reg,
  1462. rtlphy->iqk_mac_backup);
  1463. rtl_set_bbreg(hw, 0xb68, MASKDWORD, 0x0f600000);
  1464. if (is2t)
  1465. rtl_set_bbreg(hw, 0xb6c, MASKDWORD, 0x0f600000);
  1466. rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x80800000);
  1467. rtl_set_bbreg(hw, 0xe40, MASKDWORD, 0x01007c00);
  1468. rtl_set_bbreg(hw, 0xe44, MASKDWORD, 0x81004800);
  1469. for (i = 0; i < retrycount; i++) {
  1470. patha_ok = _rtl88e_phy_path_a_iqk(hw, is2t);
  1471. if (patha_ok == 0x01) {
  1472. RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
  1473. "Path A Tx IQK Success!!\n");
  1474. result[t][0] = (rtl_get_bbreg(hw, 0xe94, MASKDWORD) &
  1475. 0x3FF0000) >> 16;
  1476. result[t][1] = (rtl_get_bbreg(hw, 0xe9c, MASKDWORD) &
  1477. 0x3FF0000) >> 16;
  1478. break;
  1479. }
  1480. }
  1481. for (i = 0; i < retrycount; i++) {
  1482. patha_ok = _rtl88e_phy_path_a_rx_iqk(hw, is2t);
  1483. if (patha_ok == 0x03) {
  1484. RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
  1485. "Path A Rx IQK Success!!\n");
  1486. result[t][2] = (rtl_get_bbreg(hw, 0xea4, MASKDWORD) &
  1487. 0x3FF0000) >> 16;
  1488. result[t][3] = (rtl_get_bbreg(hw, 0xeac, MASKDWORD) &
  1489. 0x3FF0000) >> 16;
  1490. break;
  1491. } else {
  1492. RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
  1493. "Path a RX iqk fail!!!\n");
  1494. }
  1495. }
  1496. if (0 == patha_ok) {
  1497. RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
  1498. "Path A IQK Success!!\n");
  1499. }
  1500. if (is2t) {
  1501. _rtl88e_phy_path_a_standby(hw);
  1502. _rtl88e_phy_path_adda_on(hw, adda_reg, false, is2t);
  1503. for (i = 0; i < retrycount; i++) {
  1504. pathb_ok = _rtl88e_phy_path_b_iqk(hw);
  1505. if (pathb_ok == 0x03) {
  1506. result[t][4] = (rtl_get_bbreg(hw,
  1507. 0xeb4, MASKDWORD) &
  1508. 0x3FF0000) >> 16;
  1509. result[t][5] =
  1510. (rtl_get_bbreg(hw, 0xebc, MASKDWORD) &
  1511. 0x3FF0000) >> 16;
  1512. result[t][6] =
  1513. (rtl_get_bbreg(hw, 0xec4, MASKDWORD) &
  1514. 0x3FF0000) >> 16;
  1515. result[t][7] =
  1516. (rtl_get_bbreg(hw, 0xecc, MASKDWORD) &
  1517. 0x3FF0000) >> 16;
  1518. break;
  1519. } else if (i == (retrycount - 1) && pathb_ok == 0x01) {
  1520. result[t][4] = (rtl_get_bbreg(hw,
  1521. 0xeb4, MASKDWORD) &
  1522. 0x3FF0000) >> 16;
  1523. }
  1524. result[t][5] = (rtl_get_bbreg(hw, 0xebc, MASKDWORD) &
  1525. 0x3FF0000) >> 16;
  1526. }
  1527. }
  1528. rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0);
  1529. if (t != 0) {
  1530. if (!rtlphy->rfpi_enable)
  1531. _rtl88e_phy_pi_mode_switch(hw, false);
  1532. reload_adda(hw, adda_reg, rtlphy->adda_backup, 16);
  1533. reload_mac(hw, iqk_mac_reg, rtlphy->iqk_mac_backup);
  1534. reload_adda(hw, iqk_bb_reg, rtlphy->iqk_bb_backup,
  1535. IQK_BB_REG_NUM);
  1536. rtl_set_bbreg(hw, 0x840, MASKDWORD, 0x00032ed3);
  1537. if (is2t)
  1538. rtl_set_bbreg(hw, 0x844, MASKDWORD, 0x00032ed3);
  1539. rtl_set_bbreg(hw, 0xe30, MASKDWORD, 0x01008c00);
  1540. rtl_set_bbreg(hw, 0xe34, MASKDWORD, 0x01008c00);
  1541. }
  1542. RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "88ee IQK Finish!!\n");
  1543. }
  1544. static void _rtl88e_phy_lc_calibrate(struct ieee80211_hw *hw, bool is2t)
  1545. {
  1546. u8 tmpreg;
  1547. u32 rf_a_mode = 0, rf_b_mode = 0, lc_cal;
  1548. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1549. int jj = RF90_PATH_A;
  1550. int kk = RF90_PATH_B;
  1551. tmpreg = rtl_read_byte(rtlpriv, 0xd03);
  1552. if ((tmpreg & 0x70) != 0)
  1553. rtl_write_byte(rtlpriv, 0xd03, tmpreg & 0x8F);
  1554. else
  1555. rtl_write_byte(rtlpriv, REG_TXPAUSE, 0xFF);
  1556. if ((tmpreg & 0x70) != 0) {
  1557. rf_a_mode = rtl_get_rfreg(hw, jj, 0x00, MASK12BITS);
  1558. if (is2t)
  1559. rf_b_mode = rtl_get_rfreg(hw, kk, 0x00,
  1560. MASK12BITS);
  1561. rtl_set_rfreg(hw, jj, 0x00, MASK12BITS,
  1562. (rf_a_mode & 0x8FFFF) | 0x10000);
  1563. if (is2t)
  1564. rtl_set_rfreg(hw, kk, 0x00, MASK12BITS,
  1565. (rf_b_mode & 0x8FFFF) | 0x10000);
  1566. }
  1567. lc_cal = rtl_get_rfreg(hw, jj, 0x18, MASK12BITS);
  1568. rtl_set_rfreg(hw, jj, 0x18, MASK12BITS, lc_cal | 0x08000);
  1569. mdelay(100);
  1570. if ((tmpreg & 0x70) != 0) {
  1571. rtl_write_byte(rtlpriv, 0xd03, tmpreg);
  1572. rtl_set_rfreg(hw, jj, 0x00, MASK12BITS, rf_a_mode);
  1573. if (is2t)
  1574. rtl_set_rfreg(hw, kk, 0x00, MASK12BITS,
  1575. rf_b_mode);
  1576. } else {
  1577. rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00);
  1578. }
  1579. RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "\n");
  1580. }
  1581. static void rfpath_switch(struct ieee80211_hw *hw,
  1582. bool bmain, bool is2t)
  1583. {
  1584. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1585. struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
  1586. struct rtl_efuse *fuse = rtl_efuse(rtl_priv(hw));
  1587. RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "\n");
  1588. if (is_hal_stop(rtlhal)) {
  1589. u8 u1btmp;
  1590. u1btmp = rtl_read_byte(rtlpriv, REG_LEDCFG0);
  1591. rtl_write_byte(rtlpriv, REG_LEDCFG0, u1btmp | BIT(7));
  1592. rtl_set_bbreg(hw, rFPGA0_XAB_RFPARAMETER, BIT(13), 0x01);
  1593. }
  1594. if (is2t) {
  1595. if (bmain)
  1596. rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE,
  1597. BIT(5) | BIT(6), 0x1);
  1598. else
  1599. rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE,
  1600. BIT(5) | BIT(6), 0x2);
  1601. } else {
  1602. rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW, BIT(8) | BIT(9), 0);
  1603. rtl_set_bbreg(hw, 0x914, MASKLWORD, 0x0201);
  1604. /* We use the RF definition of MAIN and AUX, left antenna and
  1605. * right antenna repectively.
  1606. * Default output at AUX.
  1607. */
  1608. if (bmain) {
  1609. rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE, BIT(14) |
  1610. BIT(13) | BIT(12), 0);
  1611. rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE, BIT(5) |
  1612. BIT(4) | BIT(3), 0);
  1613. if (fuse->antenna_div_type == CGCS_RX_HW_ANTDIV)
  1614. rtl_set_bbreg(hw, RCONFIG_RAM64X16, BIT(31), 0);
  1615. } else {
  1616. rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE, BIT(14) |
  1617. BIT(13) | BIT(12), 1);
  1618. rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE, BIT(5) |
  1619. BIT(4) | BIT(3), 1);
  1620. if (fuse->antenna_div_type == CGCS_RX_HW_ANTDIV)
  1621. rtl_set_bbreg(hw, RCONFIG_RAM64X16, BIT(31), 1);
  1622. }
  1623. }
  1624. }
  1625. #undef IQK_ADDA_REG_NUM
  1626. #undef IQK_DELAY_TIME
  1627. void rtl88e_phy_iq_calibrate(struct ieee80211_hw *hw, bool recovery)
  1628. {
  1629. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1630. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  1631. long result[4][8];
  1632. u8 i, final;
  1633. bool patha_ok;
  1634. long reg_e94, reg_e9c, reg_ea4, reg_eb4, reg_ebc, reg_tmp = 0;
  1635. bool is12simular, is13simular, is23simular;
  1636. u32 iqk_bb_reg[9] = {
  1637. ROFDM0_XARXIQIMBAL,
  1638. ROFDM0_XBRXIQIMBAL,
  1639. ROFDM0_ECCATHRES,
  1640. ROFDM0_AGCRSSITABLE,
  1641. ROFDM0_XATXIQIMBAL,
  1642. ROFDM0_XBTXIQIMBAL,
  1643. ROFDM0_XCTXAFE,
  1644. ROFDM0_XDTXAFE,
  1645. ROFDM0_RXIQEXTANTA
  1646. };
  1647. if (recovery) {
  1648. reload_adda(hw, iqk_bb_reg, rtlphy->iqk_bb_backup, 9);
  1649. return;
  1650. }
  1651. memset(result, 0, 32 * sizeof(long));
  1652. final = 0xff;
  1653. patha_ok = false;
  1654. is12simular = false;
  1655. is23simular = false;
  1656. is13simular = false;
  1657. for (i = 0; i < 3; i++) {
  1658. if (get_rf_type(rtlphy) == RF_2T2R)
  1659. _rtl88e_phy_iq_calibrate(hw, result, i, true);
  1660. else
  1661. _rtl88e_phy_iq_calibrate(hw, result, i, false);
  1662. if (i == 1) {
  1663. is12simular = sim_comp(hw, result, 0, 1);
  1664. if (is12simular) {
  1665. final = 0;
  1666. break;
  1667. }
  1668. }
  1669. if (i == 2) {
  1670. is13simular = sim_comp(hw, result, 0, 2);
  1671. if (is13simular) {
  1672. final = 0;
  1673. break;
  1674. }
  1675. is23simular = sim_comp(hw, result, 1, 2);
  1676. if (is23simular) {
  1677. final = 1;
  1678. } else {
  1679. for (i = 0; i < 8; i++)
  1680. reg_tmp += result[3][i];
  1681. if (reg_tmp != 0)
  1682. final = 3;
  1683. else
  1684. final = 0xFF;
  1685. }
  1686. }
  1687. }
  1688. for (i = 0; i < 4; i++) {
  1689. reg_e94 = result[i][0];
  1690. reg_e9c = result[i][1];
  1691. reg_ea4 = result[i][2];
  1692. reg_eb4 = result[i][4];
  1693. reg_ebc = result[i][5];
  1694. }
  1695. if (final != 0xff) {
  1696. reg_e94 = result[final][0];
  1697. rtlphy->reg_e94 = reg_e94;
  1698. reg_e9c = result[final][1];
  1699. rtlphy->reg_e9c = reg_e9c;
  1700. reg_ea4 = result[final][2];
  1701. reg_eb4 = result[final][4];
  1702. rtlphy->reg_eb4 = reg_eb4;
  1703. reg_ebc = result[final][5];
  1704. rtlphy->reg_ebc = reg_ebc;
  1705. patha_ok = true;
  1706. } else {
  1707. rtlphy->reg_e94 = 0x100;
  1708. rtlphy->reg_eb4 = 0x100;
  1709. rtlphy->reg_ebc = 0x0;
  1710. rtlphy->reg_e9c = 0x0;
  1711. }
  1712. if (reg_e94 != 0) /*&&(reg_ea4 != 0) */
  1713. fill_iqk(hw, patha_ok, result, final, (reg_ea4 == 0));
  1714. if (final != 0xFF) {
  1715. for (i = 0; i < IQK_MATRIX_REG_NUM; i++)
  1716. rtlphy->iqk_matrix[0].value[0][i] = result[final][i];
  1717. rtlphy->iqk_matrix[0].iqk_done = true;
  1718. }
  1719. save_adda_reg(hw, iqk_bb_reg, rtlphy->iqk_bb_backup, 9);
  1720. }
  1721. void rtl88e_phy_lc_calibrate(struct ieee80211_hw *hw)
  1722. {
  1723. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1724. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  1725. struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
  1726. bool start_conttx = false, singletone = false;
  1727. u32 timeout = 2000, timecount = 0;
  1728. if (start_conttx || singletone)
  1729. return;
  1730. while (rtlpriv->mac80211.act_scanning && timecount < timeout) {
  1731. udelay(50);
  1732. timecount += 50;
  1733. }
  1734. rtlphy->lck_inprogress = true;
  1735. RTPRINT(rtlpriv, FINIT, INIT_IQK,
  1736. "LCK:Start!!! currentband %x delay %d ms\n",
  1737. rtlhal->current_bandtype, timecount);
  1738. _rtl88e_phy_lc_calibrate(hw, false);
  1739. rtlphy->lck_inprogress = false;
  1740. }
  1741. void rtl88e_phy_set_rfpath_switch(struct ieee80211_hw *hw, bool bmain)
  1742. {
  1743. rfpath_switch(hw, bmain, false);
  1744. }
  1745. bool rtl88e_phy_set_io_cmd(struct ieee80211_hw *hw, enum io_type iotype)
  1746. {
  1747. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1748. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  1749. bool postprocessing = false;
  1750. RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
  1751. "-->IO Cmd(%#x), set_io_inprogress(%d)\n",
  1752. iotype, rtlphy->set_io_inprogress);
  1753. do {
  1754. switch (iotype) {
  1755. case IO_CMD_RESUME_DM_BY_SCAN:
  1756. RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
  1757. "[IO CMD] Resume DM after scan.\n");
  1758. postprocessing = true;
  1759. break;
  1760. case IO_CMD_PAUSE_DM_BY_SCAN:
  1761. RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
  1762. "[IO CMD] Pause DM before scan.\n");
  1763. postprocessing = true;
  1764. break;
  1765. default:
  1766. RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
  1767. "switch case not processed\n");
  1768. break;
  1769. }
  1770. } while (false);
  1771. if (postprocessing && !rtlphy->set_io_inprogress) {
  1772. rtlphy->set_io_inprogress = true;
  1773. rtlphy->current_io_type = iotype;
  1774. } else {
  1775. return false;
  1776. }
  1777. rtl88e_phy_set_io(hw);
  1778. RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE, "IO Type(%#x)\n", iotype);
  1779. return true;
  1780. }
  1781. static void rtl88ee_phy_set_rf_on(struct ieee80211_hw *hw)
  1782. {
  1783. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1784. rtl_write_byte(rtlpriv, REG_SPS0_CTRL, 0x2b);
  1785. rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3);
  1786. /*rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x00);*/
  1787. rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE2);
  1788. rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3);
  1789. rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00);
  1790. }
  1791. static void _rtl88ee_phy_set_rf_sleep(struct ieee80211_hw *hw)
  1792. {
  1793. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1794. int jj = RF90_PATH_A;
  1795. rtl_write_byte(rtlpriv, REG_TXPAUSE, 0xFF);
  1796. rtl_set_rfreg(hw, jj, 0x00, RFREG_OFFSET_MASK, 0x00);
  1797. rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE2);
  1798. rtl_write_byte(rtlpriv, REG_SPS0_CTRL, 0x22);
  1799. }
  1800. static bool _rtl88ee_phy_set_rf_power_state(struct ieee80211_hw *hw,
  1801. enum rf_pwrstate rfpwr_state)
  1802. {
  1803. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1804. struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
  1805. struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
  1806. struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
  1807. struct rtl8192_tx_ring *ring = NULL;
  1808. bool bresult = true;
  1809. u8 i, queue_id;
  1810. switch (rfpwr_state) {
  1811. case ERFON:{
  1812. if ((ppsc->rfpwr_state == ERFOFF) &&
  1813. RT_IN_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC)) {
  1814. bool rtstatus;
  1815. u32 init = 0;
  1816. do {
  1817. init++;
  1818. RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
  1819. "IPS Set eRf nic enable\n");
  1820. rtstatus = rtl_ps_enable_nic(hw);
  1821. } while ((rtstatus != true) && (init < 10));
  1822. RT_CLEAR_PS_LEVEL(ppsc,
  1823. RT_RF_OFF_LEVL_HALT_NIC);
  1824. } else {
  1825. RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
  1826. "Set ERFON sleeped:%d ms\n",
  1827. jiffies_to_msecs(jiffies - ppsc->
  1828. last_sleep_jiffies));
  1829. ppsc->last_awake_jiffies = jiffies;
  1830. rtl88ee_phy_set_rf_on(hw);
  1831. }
  1832. if (mac->link_state == MAC80211_LINKED)
  1833. rtlpriv->cfg->ops->led_control(hw, LED_CTL_LINK);
  1834. else
  1835. rtlpriv->cfg->ops->led_control(hw, LED_CTL_NO_LINK);
  1836. break; }
  1837. case ERFOFF:{
  1838. for (queue_id = 0, i = 0;
  1839. queue_id < RTL_PCI_MAX_TX_QUEUE_COUNT;) {
  1840. ring = &pcipriv->dev.tx_ring[queue_id];
  1841. if (skb_queue_len(&ring->queue) == 0) {
  1842. queue_id++;
  1843. continue;
  1844. } else {
  1845. RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
  1846. "eRf Off/Sleep: %d times TcbBusyQueue[%d] =%d before doze!\n",
  1847. (i + 1), queue_id,
  1848. skb_queue_len(&ring->queue));
  1849. udelay(10);
  1850. i++;
  1851. }
  1852. if (i >= MAX_DOZE_WAITING_TIMES_9x) {
  1853. RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
  1854. "\n ERFSLEEP: %d times TcbBusyQueue[%d] = %d !\n",
  1855. MAX_DOZE_WAITING_TIMES_9x,
  1856. queue_id,
  1857. skb_queue_len(&ring->queue));
  1858. break;
  1859. }
  1860. }
  1861. if (ppsc->reg_rfps_level & RT_RF_OFF_LEVL_HALT_NIC) {
  1862. RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
  1863. "IPS Set eRf nic disable\n");
  1864. rtl_ps_disable_nic(hw);
  1865. RT_SET_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC);
  1866. } else {
  1867. if (ppsc->rfoff_reason == RF_CHANGE_BY_IPS) {
  1868. rtlpriv->cfg->ops->led_control(hw,
  1869. LED_CTL_NO_LINK);
  1870. } else {
  1871. rtlpriv->cfg->ops->led_control(hw,
  1872. LED_CTL_POWER_OFF);
  1873. }
  1874. }
  1875. break; }
  1876. case ERFSLEEP:{
  1877. if (ppsc->rfpwr_state == ERFOFF)
  1878. break;
  1879. for (queue_id = 0, i = 0;
  1880. queue_id < RTL_PCI_MAX_TX_QUEUE_COUNT;) {
  1881. ring = &pcipriv->dev.tx_ring[queue_id];
  1882. if (skb_queue_len(&ring->queue) == 0) {
  1883. queue_id++;
  1884. continue;
  1885. } else {
  1886. RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
  1887. "eRf Off/Sleep: %d times TcbBusyQueue[%d] =%d before doze!\n",
  1888. (i + 1), queue_id,
  1889. skb_queue_len(&ring->queue));
  1890. udelay(10);
  1891. i++;
  1892. }
  1893. if (i >= MAX_DOZE_WAITING_TIMES_9x) {
  1894. RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
  1895. "\n ERFSLEEP: %d times TcbBusyQueue[%d] = %d !\n",
  1896. MAX_DOZE_WAITING_TIMES_9x,
  1897. queue_id,
  1898. skb_queue_len(&ring->queue));
  1899. break;
  1900. }
  1901. }
  1902. RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
  1903. "Set ERFSLEEP awaked:%d ms\n",
  1904. jiffies_to_msecs(jiffies - ppsc->last_awake_jiffies));
  1905. ppsc->last_sleep_jiffies = jiffies;
  1906. _rtl88ee_phy_set_rf_sleep(hw);
  1907. break; }
  1908. default:
  1909. RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
  1910. "switch case not processed\n");
  1911. bresult = false;
  1912. break;
  1913. }
  1914. if (bresult)
  1915. ppsc->rfpwr_state = rfpwr_state;
  1916. return bresult;
  1917. }
  1918. bool rtl88e_phy_set_rf_power_state(struct ieee80211_hw *hw,
  1919. enum rf_pwrstate rfpwr_state)
  1920. {
  1921. struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
  1922. bool bresult;
  1923. if (rfpwr_state == ppsc->rfpwr_state)
  1924. return false;
  1925. bresult = _rtl88ee_phy_set_rf_power_state(hw, rfpwr_state);
  1926. return bresult;
  1927. }