phy_common.c 59 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042
  1. /******************************************************************************
  2. *
  3. * Copyright(c) 2009-2010 Realtek Corporation.
  4. *
  5. * This program is free software; you can redistribute it and/or modify it
  6. * under the terms of version 2 of the GNU General Public License as
  7. * published by the Free Software Foundation.
  8. *
  9. * This program is distributed in the hope that it will be useful, but WITHOUT
  10. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11. * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  12. * more details.
  13. *
  14. * You should have received a copy of the GNU General Public License along with
  15. * this program; if not, write to the Free Software Foundation, Inc.,
  16. * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  17. *
  18. * The full GNU General Public License is included in this distribution in the
  19. * file called LICENSE.
  20. *
  21. * Contact Information:
  22. * wlanfae <wlanfae@realtek.com>
  23. * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
  24. * Hsinchu 300, Taiwan.
  25. *
  26. * Larry Finger <Larry.Finger@lwfinger.net>
  27. *
  28. *****************************************************************************/
  29. #include "../wifi.h"
  30. #include "../rtl8192ce/reg.h"
  31. #include "../rtl8192ce/def.h"
  32. #include "dm_common.h"
  33. #include "phy_common.h"
  34. /* Define macro to shorten lines */
  35. #define MCS_TXPWR mcs_txpwrlevel_origoffset
  36. u32 rtl92c_phy_query_bb_reg(struct ieee80211_hw *hw, u32 regaddr, u32 bitmask)
  37. {
  38. struct rtl_priv *rtlpriv = rtl_priv(hw);
  39. u32 returnvalue, originalvalue, bitshift;
  40. RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("regaddr(%#x), "
  41. "bitmask(%#x)\n", regaddr,
  42. bitmask));
  43. originalvalue = rtl_read_dword(rtlpriv, regaddr);
  44. bitshift = _rtl92c_phy_calculate_bit_shift(bitmask);
  45. returnvalue = (originalvalue & bitmask) >> bitshift;
  46. RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("BBR MASK=0x%x "
  47. "Addr[0x%x]=0x%x\n", bitmask,
  48. regaddr, originalvalue));
  49. return returnvalue;
  50. }
  51. EXPORT_SYMBOL(rtl92c_phy_query_bb_reg);
  52. void rtl92c_phy_set_bb_reg(struct ieee80211_hw *hw,
  53. u32 regaddr, u32 bitmask, u32 data)
  54. {
  55. struct rtl_priv *rtlpriv = rtl_priv(hw);
  56. u32 originalvalue, bitshift;
  57. RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("regaddr(%#x), bitmask(%#x),"
  58. " data(%#x)\n", regaddr, bitmask,
  59. data));
  60. if (bitmask != MASKDWORD) {
  61. originalvalue = rtl_read_dword(rtlpriv, regaddr);
  62. bitshift = _rtl92c_phy_calculate_bit_shift(bitmask);
  63. data = ((originalvalue & (~bitmask)) | (data << bitshift));
  64. }
  65. rtl_write_dword(rtlpriv, regaddr, data);
  66. RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("regaddr(%#x), bitmask(%#x),"
  67. " data(%#x)\n", regaddr, bitmask,
  68. data));
  69. }
  70. EXPORT_SYMBOL(rtl92c_phy_set_bb_reg);
  71. u32 _rtl92c_phy_fw_rf_serial_read(struct ieee80211_hw *hw,
  72. enum radio_path rfpath, u32 offset)
  73. {
  74. RT_ASSERT(false, ("deprecated!\n"));
  75. return 0;
  76. }
  77. EXPORT_SYMBOL(_rtl92c_phy_fw_rf_serial_read);
  78. void _rtl92c_phy_fw_rf_serial_write(struct ieee80211_hw *hw,
  79. enum radio_path rfpath, u32 offset,
  80. u32 data)
  81. {
  82. RT_ASSERT(false, ("deprecated!\n"));
  83. }
  84. EXPORT_SYMBOL(_rtl92c_phy_fw_rf_serial_write);
  85. u32 _rtl92c_phy_rf_serial_read(struct ieee80211_hw *hw,
  86. enum radio_path rfpath, u32 offset)
  87. {
  88. struct rtl_priv *rtlpriv = rtl_priv(hw);
  89. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  90. struct bb_reg_def *pphyreg = &rtlphy->phyreg_def[rfpath];
  91. u32 newoffset;
  92. u32 tmplong, tmplong2;
  93. u8 rfpi_enable = 0;
  94. u32 retvalue;
  95. offset &= 0x3f;
  96. newoffset = offset;
  97. if (RT_CANNOT_IO(hw)) {
  98. RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, ("return all one\n"));
  99. return 0xFFFFFFFF;
  100. }
  101. tmplong = rtl_get_bbreg(hw, RFPGA0_XA_HSSIPARAMETER2, MASKDWORD);
  102. if (rfpath == RF90_PATH_A)
  103. tmplong2 = tmplong;
  104. else
  105. tmplong2 = rtl_get_bbreg(hw, pphyreg->rfhssi_para2, MASKDWORD);
  106. tmplong2 = (tmplong2 & (~BLSSIREADADDRESS)) |
  107. (newoffset << 23) | BLSSIREADEDGE;
  108. rtl_set_bbreg(hw, RFPGA0_XA_HSSIPARAMETER2, MASKDWORD,
  109. tmplong & (~BLSSIREADEDGE));
  110. mdelay(1);
  111. rtl_set_bbreg(hw, pphyreg->rfhssi_para2, MASKDWORD, tmplong2);
  112. mdelay(1);
  113. rtl_set_bbreg(hw, RFPGA0_XA_HSSIPARAMETER2, MASKDWORD,
  114. tmplong | BLSSIREADEDGE);
  115. mdelay(1);
  116. if (rfpath == RF90_PATH_A)
  117. rfpi_enable = (u8) rtl_get_bbreg(hw, RFPGA0_XA_HSSIPARAMETER1,
  118. BIT(8));
  119. else if (rfpath == RF90_PATH_B)
  120. rfpi_enable = (u8) rtl_get_bbreg(hw, RFPGA0_XB_HSSIPARAMETER1,
  121. BIT(8));
  122. if (rfpi_enable)
  123. retvalue = rtl_get_bbreg(hw, pphyreg->rflssi_readbackpi,
  124. BLSSIREADBACKDATA);
  125. else
  126. retvalue = rtl_get_bbreg(hw, pphyreg->rflssi_readback,
  127. BLSSIREADBACKDATA);
  128. RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("RFR-%d Addr[0x%x]=0x%x\n",
  129. rfpath, pphyreg->rflssi_readback,
  130. retvalue));
  131. return retvalue;
  132. }
  133. EXPORT_SYMBOL(_rtl92c_phy_rf_serial_read);
  134. void _rtl92c_phy_rf_serial_write(struct ieee80211_hw *hw,
  135. enum radio_path rfpath, u32 offset,
  136. u32 data)
  137. {
  138. u32 data_and_addr;
  139. u32 newoffset;
  140. struct rtl_priv *rtlpriv = rtl_priv(hw);
  141. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  142. struct bb_reg_def *pphyreg = &rtlphy->phyreg_def[rfpath];
  143. if (RT_CANNOT_IO(hw)) {
  144. RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, ("stop\n"));
  145. return;
  146. }
  147. offset &= 0x3f;
  148. newoffset = offset;
  149. data_and_addr = ((newoffset << 20) | (data & 0x000fffff)) & 0x0fffffff;
  150. rtl_set_bbreg(hw, pphyreg->rf3wire_offset, MASKDWORD, data_and_addr);
  151. RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("RFW-%d Addr[0x%x]=0x%x\n",
  152. rfpath, pphyreg->rf3wire_offset,
  153. data_and_addr));
  154. }
  155. EXPORT_SYMBOL(_rtl92c_phy_rf_serial_write);
  156. u32 _rtl92c_phy_calculate_bit_shift(u32 bitmask)
  157. {
  158. u32 i;
  159. for (i = 0; i <= 31; i++) {
  160. if (((bitmask >> i) & 0x1) == 1)
  161. break;
  162. }
  163. return i;
  164. }
  165. EXPORT_SYMBOL(_rtl92c_phy_calculate_bit_shift);
  166. static void _rtl92c_phy_bb_config_1t(struct ieee80211_hw *hw)
  167. {
  168. rtl_set_bbreg(hw, RFPGA0_TXINFO, 0x3, 0x2);
  169. rtl_set_bbreg(hw, RFPGA1_TXINFO, 0x300033, 0x200022);
  170. rtl_set_bbreg(hw, RCCK0_AFESETTING, MASKBYTE3, 0x45);
  171. rtl_set_bbreg(hw, ROFDM0_TRXPATHENABLE, MASKBYTE0, 0x23);
  172. rtl_set_bbreg(hw, ROFDM0_AGCPARAMETER1, 0x30, 0x1);
  173. rtl_set_bbreg(hw, 0xe74, 0x0c000000, 0x2);
  174. rtl_set_bbreg(hw, 0xe78, 0x0c000000, 0x2);
  175. rtl_set_bbreg(hw, 0xe7c, 0x0c000000, 0x2);
  176. rtl_set_bbreg(hw, 0xe80, 0x0c000000, 0x2);
  177. rtl_set_bbreg(hw, 0xe88, 0x0c000000, 0x2);
  178. }
  179. bool rtl92c_phy_rf_config(struct ieee80211_hw *hw)
  180. {
  181. struct rtl_priv *rtlpriv = rtl_priv(hw);
  182. return rtlpriv->cfg->ops->phy_rf6052_config(hw);
  183. }
  184. EXPORT_SYMBOL(rtl92c_phy_rf_config);
  185. bool _rtl92c_phy_bb8192c_config_parafile(struct ieee80211_hw *hw)
  186. {
  187. struct rtl_priv *rtlpriv = rtl_priv(hw);
  188. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  189. struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
  190. bool rtstatus;
  191. RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, ("==>\n"));
  192. rtstatus = rtlpriv->cfg->ops->config_bb_with_headerfile(hw,
  193. BASEBAND_CONFIG_PHY_REG);
  194. if (rtstatus != true) {
  195. RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, ("Write BB Reg Fail!!"));
  196. return false;
  197. }
  198. if (rtlphy->rf_type == RF_1T2R) {
  199. _rtl92c_phy_bb_config_1t(hw);
  200. RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, ("Config to 1T!!\n"));
  201. }
  202. if (rtlefuse->autoload_failflag == false) {
  203. rtlphy->pwrgroup_cnt = 0;
  204. rtstatus = rtlpriv->cfg->ops->config_bb_with_pgheaderfile(hw,
  205. BASEBAND_CONFIG_PHY_REG);
  206. }
  207. if (rtstatus != true) {
  208. RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, ("BB_PG Reg Fail!!"));
  209. return false;
  210. }
  211. rtstatus = rtlpriv->cfg->ops->config_bb_with_headerfile(hw,
  212. BASEBAND_CONFIG_AGC_TAB);
  213. if (rtstatus != true) {
  214. RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, ("AGC Table Fail\n"));
  215. return false;
  216. }
  217. rtlphy->cck_high_power = (bool) (rtl_get_bbreg(hw,
  218. RFPGA0_XA_HSSIPARAMETER2,
  219. 0x200));
  220. return true;
  221. }
  222. EXPORT_SYMBOL(_rtl92c_phy_bb8192c_config_parafile);
  223. void _rtl92c_store_pwrIndex_diffrate_offset(struct ieee80211_hw *hw,
  224. u32 regaddr, u32 bitmask,
  225. u32 data)
  226. {
  227. struct rtl_priv *rtlpriv = rtl_priv(hw);
  228. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  229. if (regaddr == RTXAGC_A_RATE18_06) {
  230. rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][0] = data;
  231. RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
  232. ("MCSTxPowerLevelOriginalOffset[%d][0] = 0x%x\n",
  233. rtlphy->pwrgroup_cnt,
  234. rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][0]));
  235. }
  236. if (regaddr == RTXAGC_A_RATE54_24) {
  237. rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][1] = data;
  238. RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
  239. ("MCSTxPowerLevelOriginalOffset[%d][1] = 0x%x\n",
  240. rtlphy->pwrgroup_cnt,
  241. rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][1]));
  242. }
  243. if (regaddr == RTXAGC_A_CCK1_MCS32) {
  244. rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][6] = data;
  245. RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
  246. ("MCSTxPowerLevelOriginalOffset[%d][6] = 0x%x\n",
  247. rtlphy->pwrgroup_cnt,
  248. rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][6]));
  249. }
  250. if (regaddr == RTXAGC_B_CCK11_A_CCK2_11 && bitmask == 0xffffff00) {
  251. rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][7] = data;
  252. RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
  253. ("MCSTxPowerLevelOriginalOffset[%d][7] = 0x%x\n",
  254. rtlphy->pwrgroup_cnt,
  255. rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][7]));
  256. }
  257. if (regaddr == RTXAGC_A_MCS03_MCS00) {
  258. rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][2] = data;
  259. RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
  260. ("MCSTxPowerLevelOriginalOffset[%d][2] = 0x%x\n",
  261. rtlphy->pwrgroup_cnt,
  262. rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][2]));
  263. }
  264. if (regaddr == RTXAGC_A_MCS07_MCS04) {
  265. rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][3] = data;
  266. RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
  267. ("MCSTxPowerLevelOriginalOffset[%d][3] = 0x%x\n",
  268. rtlphy->pwrgroup_cnt,
  269. rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][3]));
  270. }
  271. if (regaddr == RTXAGC_A_MCS11_MCS08) {
  272. rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][4] = data;
  273. RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
  274. ("MCSTxPowerLevelOriginalOffset[%d][4] = 0x%x\n",
  275. rtlphy->pwrgroup_cnt,
  276. rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][4]));
  277. }
  278. if (regaddr == RTXAGC_A_MCS15_MCS12) {
  279. rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][5] = data;
  280. RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
  281. ("MCSTxPowerLevelOriginalOffset[%d][5] = 0x%x\n",
  282. rtlphy->pwrgroup_cnt,
  283. rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][5]));
  284. }
  285. if (regaddr == RTXAGC_B_RATE18_06) {
  286. rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][8] = data;
  287. RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
  288. ("MCSTxPowerLevelOriginalOffset[%d][8] = 0x%x\n",
  289. rtlphy->pwrgroup_cnt,
  290. rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][8]));
  291. }
  292. if (regaddr == RTXAGC_B_RATE54_24) {
  293. rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][9] = data;
  294. RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
  295. ("MCSTxPowerLevelOriginalOffset[%d][9] = 0x%x\n",
  296. rtlphy->pwrgroup_cnt,
  297. rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][9]));
  298. }
  299. if (regaddr == RTXAGC_B_CCK1_55_MCS32) {
  300. rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][14] = data;
  301. RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
  302. ("MCSTxPowerLevelOriginalOffset[%d][14] = 0x%x\n",
  303. rtlphy->pwrgroup_cnt,
  304. rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][14]));
  305. }
  306. if (regaddr == RTXAGC_B_CCK11_A_CCK2_11 && bitmask == 0x000000ff) {
  307. rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][15] = data;
  308. RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
  309. ("MCSTxPowerLevelOriginalOffset[%d][15] = 0x%x\n",
  310. rtlphy->pwrgroup_cnt,
  311. rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][15]));
  312. }
  313. if (regaddr == RTXAGC_B_MCS03_MCS00) {
  314. rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][10] = data;
  315. RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
  316. ("MCSTxPowerLevelOriginalOffset[%d][10] = 0x%x\n",
  317. rtlphy->pwrgroup_cnt,
  318. rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][10]));
  319. }
  320. if (regaddr == RTXAGC_B_MCS07_MCS04) {
  321. rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][11] = data;
  322. RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
  323. ("MCSTxPowerLevelOriginalOffset[%d][11] = 0x%x\n",
  324. rtlphy->pwrgroup_cnt,
  325. rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][11]));
  326. }
  327. if (regaddr == RTXAGC_B_MCS11_MCS08) {
  328. rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][12] = data;
  329. RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
  330. ("MCSTxPowerLevelOriginalOffset[%d][12] = 0x%x\n",
  331. rtlphy->pwrgroup_cnt,
  332. rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][12]));
  333. }
  334. if (regaddr == RTXAGC_B_MCS15_MCS12) {
  335. rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][13] = data;
  336. RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
  337. ("MCSTxPowerLevelOriginalOffset[%d][13] = 0x%x\n",
  338. rtlphy->pwrgroup_cnt,
  339. rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][13]));
  340. rtlphy->pwrgroup_cnt++;
  341. }
  342. }
  343. EXPORT_SYMBOL(_rtl92c_store_pwrIndex_diffrate_offset);
  344. void rtl92c_phy_get_hw_reg_originalvalue(struct ieee80211_hw *hw)
  345. {
  346. struct rtl_priv *rtlpriv = rtl_priv(hw);
  347. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  348. rtlphy->default_initialgain[0] =
  349. (u8) rtl_get_bbreg(hw, ROFDM0_XAAGCCORE1, MASKBYTE0);
  350. rtlphy->default_initialgain[1] =
  351. (u8) rtl_get_bbreg(hw, ROFDM0_XBAGCCORE1, MASKBYTE0);
  352. rtlphy->default_initialgain[2] =
  353. (u8) rtl_get_bbreg(hw, ROFDM0_XCAGCCORE1, MASKBYTE0);
  354. rtlphy->default_initialgain[3] =
  355. (u8) rtl_get_bbreg(hw, ROFDM0_XDAGCCORE1, MASKBYTE0);
  356. RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
  357. ("Default initial gain (c50=0x%x, "
  358. "c58=0x%x, c60=0x%x, c68=0x%x\n",
  359. rtlphy->default_initialgain[0],
  360. rtlphy->default_initialgain[1],
  361. rtlphy->default_initialgain[2],
  362. rtlphy->default_initialgain[3]));
  363. rtlphy->framesync = (u8) rtl_get_bbreg(hw,
  364. ROFDM0_RXDETECTOR3, MASKBYTE0);
  365. rtlphy->framesync_c34 = rtl_get_bbreg(hw,
  366. ROFDM0_RXDETECTOR2, MASKDWORD);
  367. RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
  368. ("Default framesync (0x%x) = 0x%x\n",
  369. ROFDM0_RXDETECTOR3, rtlphy->framesync));
  370. }
  371. void _rtl92c_phy_init_bb_rf_register_definition(struct ieee80211_hw *hw)
  372. {
  373. struct rtl_priv *rtlpriv = rtl_priv(hw);
  374. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  375. rtlphy->phyreg_def[RF90_PATH_A].rfintfs = RFPGA0_XAB_RFINTERFACESW;
  376. rtlphy->phyreg_def[RF90_PATH_B].rfintfs = RFPGA0_XAB_RFINTERFACESW;
  377. rtlphy->phyreg_def[RF90_PATH_C].rfintfs = RFPGA0_XCD_RFINTERFACESW;
  378. rtlphy->phyreg_def[RF90_PATH_D].rfintfs = RFPGA0_XCD_RFINTERFACESW;
  379. rtlphy->phyreg_def[RF90_PATH_A].rfintfi = RFPGA0_XAB_RFINTERFACERB;
  380. rtlphy->phyreg_def[RF90_PATH_B].rfintfi = RFPGA0_XAB_RFINTERFACERB;
  381. rtlphy->phyreg_def[RF90_PATH_C].rfintfi = RFPGA0_XCD_RFINTERFACERB;
  382. rtlphy->phyreg_def[RF90_PATH_D].rfintfi = RFPGA0_XCD_RFINTERFACERB;
  383. rtlphy->phyreg_def[RF90_PATH_A].rfintfo = RFPGA0_XA_RFINTERFACEOE;
  384. rtlphy->phyreg_def[RF90_PATH_B].rfintfo = RFPGA0_XB_RFINTERFACEOE;
  385. rtlphy->phyreg_def[RF90_PATH_A].rfintfe = RFPGA0_XA_RFINTERFACEOE;
  386. rtlphy->phyreg_def[RF90_PATH_B].rfintfe = RFPGA0_XB_RFINTERFACEOE;
  387. rtlphy->phyreg_def[RF90_PATH_A].rf3wire_offset =
  388. RFPGA0_XA_LSSIPARAMETER;
  389. rtlphy->phyreg_def[RF90_PATH_B].rf3wire_offset =
  390. RFPGA0_XB_LSSIPARAMETER;
  391. rtlphy->phyreg_def[RF90_PATH_A].rflssi_select = rFPGA0_XAB_RFPARAMETER;
  392. rtlphy->phyreg_def[RF90_PATH_B].rflssi_select = rFPGA0_XAB_RFPARAMETER;
  393. rtlphy->phyreg_def[RF90_PATH_C].rflssi_select = rFPGA0_XCD_RFPARAMETER;
  394. rtlphy->phyreg_def[RF90_PATH_D].rflssi_select = rFPGA0_XCD_RFPARAMETER;
  395. rtlphy->phyreg_def[RF90_PATH_A].rftxgain_stage = RFPGA0_TXGAINSTAGE;
  396. rtlphy->phyreg_def[RF90_PATH_B].rftxgain_stage = RFPGA0_TXGAINSTAGE;
  397. rtlphy->phyreg_def[RF90_PATH_C].rftxgain_stage = RFPGA0_TXGAINSTAGE;
  398. rtlphy->phyreg_def[RF90_PATH_D].rftxgain_stage = RFPGA0_TXGAINSTAGE;
  399. rtlphy->phyreg_def[RF90_PATH_A].rfhssi_para1 = RFPGA0_XA_HSSIPARAMETER1;
  400. rtlphy->phyreg_def[RF90_PATH_B].rfhssi_para1 = RFPGA0_XB_HSSIPARAMETER1;
  401. rtlphy->phyreg_def[RF90_PATH_A].rfhssi_para2 = RFPGA0_XA_HSSIPARAMETER2;
  402. rtlphy->phyreg_def[RF90_PATH_B].rfhssi_para2 = RFPGA0_XB_HSSIPARAMETER2;
  403. rtlphy->phyreg_def[RF90_PATH_A].rfswitch_control =
  404. RFPGA0_XAB_SWITCHCONTROL;
  405. rtlphy->phyreg_def[RF90_PATH_B].rfswitch_control =
  406. RFPGA0_XAB_SWITCHCONTROL;
  407. rtlphy->phyreg_def[RF90_PATH_C].rfswitch_control =
  408. RFPGA0_XCD_SWITCHCONTROL;
  409. rtlphy->phyreg_def[RF90_PATH_D].rfswitch_control =
  410. RFPGA0_XCD_SWITCHCONTROL;
  411. rtlphy->phyreg_def[RF90_PATH_A].rfagc_control1 = ROFDM0_XAAGCCORE1;
  412. rtlphy->phyreg_def[RF90_PATH_B].rfagc_control1 = ROFDM0_XBAGCCORE1;
  413. rtlphy->phyreg_def[RF90_PATH_C].rfagc_control1 = ROFDM0_XCAGCCORE1;
  414. rtlphy->phyreg_def[RF90_PATH_D].rfagc_control1 = ROFDM0_XDAGCCORE1;
  415. rtlphy->phyreg_def[RF90_PATH_A].rfagc_control2 = ROFDM0_XAAGCCORE2;
  416. rtlphy->phyreg_def[RF90_PATH_B].rfagc_control2 = ROFDM0_XBAGCCORE2;
  417. rtlphy->phyreg_def[RF90_PATH_C].rfagc_control2 = ROFDM0_XCAGCCORE2;
  418. rtlphy->phyreg_def[RF90_PATH_D].rfagc_control2 = ROFDM0_XDAGCCORE2;
  419. rtlphy->phyreg_def[RF90_PATH_A].rfrxiq_imbalance =
  420. ROFDM0_XARXIQIMBALANCE;
  421. rtlphy->phyreg_def[RF90_PATH_B].rfrxiq_imbalance =
  422. ROFDM0_XBRXIQIMBALANCE;
  423. rtlphy->phyreg_def[RF90_PATH_C].rfrxiq_imbalance =
  424. ROFDM0_XCRXIQIMBANLANCE;
  425. rtlphy->phyreg_def[RF90_PATH_D].rfrxiq_imbalance =
  426. ROFDM0_XDRXIQIMBALANCE;
  427. rtlphy->phyreg_def[RF90_PATH_A].rfrx_afe = ROFDM0_XARXAFE;
  428. rtlphy->phyreg_def[RF90_PATH_B].rfrx_afe = ROFDM0_XBRXAFE;
  429. rtlphy->phyreg_def[RF90_PATH_C].rfrx_afe = ROFDM0_XCRXAFE;
  430. rtlphy->phyreg_def[RF90_PATH_D].rfrx_afe = ROFDM0_XDRXAFE;
  431. rtlphy->phyreg_def[RF90_PATH_A].rftxiq_imbalance =
  432. ROFDM0_XATXIQIMBALANCE;
  433. rtlphy->phyreg_def[RF90_PATH_B].rftxiq_imbalance =
  434. ROFDM0_XBTXIQIMBALANCE;
  435. rtlphy->phyreg_def[RF90_PATH_C].rftxiq_imbalance =
  436. ROFDM0_XCTXIQIMBALANCE;
  437. rtlphy->phyreg_def[RF90_PATH_D].rftxiq_imbalance =
  438. ROFDM0_XDTXIQIMBALANCE;
  439. rtlphy->phyreg_def[RF90_PATH_A].rftx_afe = ROFDM0_XATXAFE;
  440. rtlphy->phyreg_def[RF90_PATH_B].rftx_afe = ROFDM0_XBTXAFE;
  441. rtlphy->phyreg_def[RF90_PATH_C].rftx_afe = ROFDM0_XCTXAFE;
  442. rtlphy->phyreg_def[RF90_PATH_D].rftx_afe = ROFDM0_XDTXAFE;
  443. rtlphy->phyreg_def[RF90_PATH_A].rflssi_readback =
  444. RFPGA0_XA_LSSIREADBACK;
  445. rtlphy->phyreg_def[RF90_PATH_B].rflssi_readback =
  446. RFPGA0_XB_LSSIREADBACK;
  447. rtlphy->phyreg_def[RF90_PATH_C].rflssi_readback =
  448. RFPGA0_XC_LSSIREADBACK;
  449. rtlphy->phyreg_def[RF90_PATH_D].rflssi_readback =
  450. RFPGA0_XD_LSSIREADBACK;
  451. rtlphy->phyreg_def[RF90_PATH_A].rflssi_readbackpi =
  452. TRANSCEIVEA_HSPI_READBACK;
  453. rtlphy->phyreg_def[RF90_PATH_B].rflssi_readbackpi =
  454. TRANSCEIVEB_HSPI_READBACK;
  455. }
  456. EXPORT_SYMBOL(_rtl92c_phy_init_bb_rf_register_definition);
  457. void rtl92c_phy_get_txpower_level(struct ieee80211_hw *hw, long *powerlevel)
  458. {
  459. struct rtl_priv *rtlpriv = rtl_priv(hw);
  460. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  461. struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
  462. u8 txpwr_level;
  463. long txpwr_dbm;
  464. txpwr_level = rtlphy->cur_cck_txpwridx;
  465. txpwr_dbm = _rtl92c_phy_txpwr_idx_to_dbm(hw,
  466. WIRELESS_MODE_B, txpwr_level);
  467. txpwr_level = rtlphy->cur_ofdm24g_txpwridx +
  468. rtlefuse->legacy_ht_txpowerdiff;
  469. if (_rtl92c_phy_txpwr_idx_to_dbm(hw,
  470. WIRELESS_MODE_G,
  471. txpwr_level) > txpwr_dbm)
  472. txpwr_dbm =
  473. _rtl92c_phy_txpwr_idx_to_dbm(hw, WIRELESS_MODE_G,
  474. txpwr_level);
  475. txpwr_level = rtlphy->cur_ofdm24g_txpwridx;
  476. if (_rtl92c_phy_txpwr_idx_to_dbm(hw,
  477. WIRELESS_MODE_N_24G,
  478. txpwr_level) > txpwr_dbm)
  479. txpwr_dbm =
  480. _rtl92c_phy_txpwr_idx_to_dbm(hw, WIRELESS_MODE_N_24G,
  481. txpwr_level);
  482. *powerlevel = txpwr_dbm;
  483. }
  484. static void _rtl92c_get_txpower_index(struct ieee80211_hw *hw, u8 channel,
  485. u8 *cckpowerlevel, u8 *ofdmpowerlevel)
  486. {
  487. struct rtl_priv *rtlpriv = rtl_priv(hw);
  488. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  489. struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
  490. u8 index = (channel - 1);
  491. cckpowerlevel[RF90_PATH_A] =
  492. rtlefuse->txpwrlevel_cck[RF90_PATH_A][index];
  493. cckpowerlevel[RF90_PATH_B] =
  494. rtlefuse->txpwrlevel_cck[RF90_PATH_B][index];
  495. if (get_rf_type(rtlphy) == RF_1T2R || get_rf_type(rtlphy) == RF_1T1R) {
  496. ofdmpowerlevel[RF90_PATH_A] =
  497. rtlefuse->txpwrlevel_ht40_1s[RF90_PATH_A][index];
  498. ofdmpowerlevel[RF90_PATH_B] =
  499. rtlefuse->txpwrlevel_ht40_1s[RF90_PATH_B][index];
  500. } else if (get_rf_type(rtlphy) == RF_2T2R) {
  501. ofdmpowerlevel[RF90_PATH_A] =
  502. rtlefuse->txpwrlevel_ht40_2s[RF90_PATH_A][index];
  503. ofdmpowerlevel[RF90_PATH_B] =
  504. rtlefuse->txpwrlevel_ht40_2s[RF90_PATH_B][index];
  505. }
  506. }
  507. static void _rtl92c_ccxpower_index_check(struct ieee80211_hw *hw,
  508. u8 channel, u8 *cckpowerlevel,
  509. u8 *ofdmpowerlevel)
  510. {
  511. struct rtl_priv *rtlpriv = rtl_priv(hw);
  512. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  513. rtlphy->cur_cck_txpwridx = cckpowerlevel[0];
  514. rtlphy->cur_ofdm24g_txpwridx = ofdmpowerlevel[0];
  515. }
  516. void rtl92c_phy_set_txpower_level(struct ieee80211_hw *hw, u8 channel)
  517. {
  518. struct rtl_priv *rtlpriv = rtl_priv(hw);
  519. struct rtl_efuse *rtlefuse = rtl_efuse(rtlpriv);
  520. u8 cckpowerlevel[2], ofdmpowerlevel[2];
  521. if (rtlefuse->txpwr_fromeprom == false)
  522. return;
  523. _rtl92c_get_txpower_index(hw, channel,
  524. &cckpowerlevel[0], &ofdmpowerlevel[0]);
  525. _rtl92c_ccxpower_index_check(hw,
  526. channel, &cckpowerlevel[0],
  527. &ofdmpowerlevel[0]);
  528. rtlpriv->cfg->ops->phy_rf6052_set_cck_txpower(hw, &cckpowerlevel[0]);
  529. rtlpriv->cfg->ops->phy_rf6052_set_ofdm_txpower(hw, &ofdmpowerlevel[0],
  530. channel);
  531. }
  532. EXPORT_SYMBOL(rtl92c_phy_set_txpower_level);
  533. bool rtl92c_phy_update_txpower_dbm(struct ieee80211_hw *hw, long power_indbm)
  534. {
  535. struct rtl_priv *rtlpriv = rtl_priv(hw);
  536. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  537. struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
  538. u8 idx;
  539. u8 rf_path;
  540. u8 ccktxpwridx = _rtl92c_phy_dbm_to_txpwr_Idx(hw,
  541. WIRELESS_MODE_B,
  542. power_indbm);
  543. u8 ofdmtxpwridx = _rtl92c_phy_dbm_to_txpwr_Idx(hw,
  544. WIRELESS_MODE_N_24G,
  545. power_indbm);
  546. if (ofdmtxpwridx - rtlefuse->legacy_ht_txpowerdiff > 0)
  547. ofdmtxpwridx -= rtlefuse->legacy_ht_txpowerdiff;
  548. else
  549. ofdmtxpwridx = 0;
  550. RT_TRACE(rtlpriv, COMP_TXAGC, DBG_TRACE,
  551. ("%lx dBm, ccktxpwridx = %d, ofdmtxpwridx = %d\n",
  552. power_indbm, ccktxpwridx, ofdmtxpwridx));
  553. for (idx = 0; idx < 14; idx++) {
  554. for (rf_path = 0; rf_path < 2; rf_path++) {
  555. rtlefuse->txpwrlevel_cck[rf_path][idx] = ccktxpwridx;
  556. rtlefuse->txpwrlevel_ht40_1s[rf_path][idx] =
  557. ofdmtxpwridx;
  558. rtlefuse->txpwrlevel_ht40_2s[rf_path][idx] =
  559. ofdmtxpwridx;
  560. }
  561. }
  562. rtl92c_phy_set_txpower_level(hw, rtlphy->current_channel);
  563. return true;
  564. }
  565. EXPORT_SYMBOL(rtl92c_phy_update_txpower_dbm);
  566. void rtl92c_phy_set_beacon_hw_reg(struct ieee80211_hw *hw, u16 beaconinterval)
  567. {
  568. }
  569. EXPORT_SYMBOL(rtl92c_phy_set_beacon_hw_reg);
  570. u8 _rtl92c_phy_dbm_to_txpwr_Idx(struct ieee80211_hw *hw,
  571. enum wireless_mode wirelessmode,
  572. long power_indbm)
  573. {
  574. u8 txpwridx;
  575. long offset;
  576. switch (wirelessmode) {
  577. case WIRELESS_MODE_B:
  578. offset = -7;
  579. break;
  580. case WIRELESS_MODE_G:
  581. case WIRELESS_MODE_N_24G:
  582. offset = -8;
  583. break;
  584. default:
  585. offset = -8;
  586. break;
  587. }
  588. if ((power_indbm - offset) > 0)
  589. txpwridx = (u8) ((power_indbm - offset) * 2);
  590. else
  591. txpwridx = 0;
  592. if (txpwridx > MAX_TXPWR_IDX_NMODE_92S)
  593. txpwridx = MAX_TXPWR_IDX_NMODE_92S;
  594. return txpwridx;
  595. }
  596. EXPORT_SYMBOL(_rtl92c_phy_dbm_to_txpwr_Idx);
  597. long _rtl92c_phy_txpwr_idx_to_dbm(struct ieee80211_hw *hw,
  598. enum wireless_mode wirelessmode,
  599. u8 txpwridx)
  600. {
  601. long offset;
  602. long pwrout_dbm;
  603. switch (wirelessmode) {
  604. case WIRELESS_MODE_B:
  605. offset = -7;
  606. break;
  607. case WIRELESS_MODE_G:
  608. case WIRELESS_MODE_N_24G:
  609. offset = -8;
  610. break;
  611. default:
  612. offset = -8;
  613. break;
  614. }
  615. pwrout_dbm = txpwridx / 2 + offset;
  616. return pwrout_dbm;
  617. }
  618. EXPORT_SYMBOL(_rtl92c_phy_txpwr_idx_to_dbm);
  619. void rtl92c_phy_scan_operation_backup(struct ieee80211_hw *hw, u8 operation)
  620. {
  621. struct rtl_priv *rtlpriv = rtl_priv(hw);
  622. struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
  623. enum io_type iotype;
  624. if (!is_hal_stop(rtlhal)) {
  625. switch (operation) {
  626. case SCAN_OPT_BACKUP:
  627. iotype = IO_CMD_PAUSE_DM_BY_SCAN;
  628. rtlpriv->cfg->ops->set_hw_reg(hw,
  629. HW_VAR_IO_CMD,
  630. (u8 *)&iotype);
  631. break;
  632. case SCAN_OPT_RESTORE:
  633. iotype = IO_CMD_RESUME_DM_BY_SCAN;
  634. rtlpriv->cfg->ops->set_hw_reg(hw,
  635. HW_VAR_IO_CMD,
  636. (u8 *)&iotype);
  637. break;
  638. default:
  639. RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
  640. ("Unknown Scan Backup operation.\n"));
  641. break;
  642. }
  643. }
  644. }
  645. EXPORT_SYMBOL(rtl92c_phy_scan_operation_backup);
  646. void rtl92c_phy_set_bw_mode(struct ieee80211_hw *hw,
  647. enum nl80211_channel_type ch_type)
  648. {
  649. struct rtl_priv *rtlpriv = rtl_priv(hw);
  650. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  651. struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
  652. u8 tmp_bw = rtlphy->current_chan_bw;
  653. if (rtlphy->set_bwmode_inprogress)
  654. return;
  655. rtlphy->set_bwmode_inprogress = true;
  656. if ((!is_hal_stop(rtlhal)) && !(RT_CANNOT_IO(hw)))
  657. rtlpriv->cfg->ops->phy_set_bw_mode_callback(hw);
  658. else {
  659. RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
  660. ("FALSE driver sleep or unload\n"));
  661. rtlphy->set_bwmode_inprogress = false;
  662. rtlphy->current_chan_bw = tmp_bw;
  663. }
  664. }
  665. EXPORT_SYMBOL(rtl92c_phy_set_bw_mode);
  666. void rtl92c_phy_sw_chnl_callback(struct ieee80211_hw *hw)
  667. {
  668. struct rtl_priv *rtlpriv = rtl_priv(hw);
  669. struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
  670. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  671. u32 delay;
  672. RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE,
  673. ("switch to channel%d\n", rtlphy->current_channel));
  674. if (is_hal_stop(rtlhal))
  675. return;
  676. do {
  677. if (!rtlphy->sw_chnl_inprogress)
  678. break;
  679. if (!_rtl92c_phy_sw_chnl_step_by_step
  680. (hw, rtlphy->current_channel, &rtlphy->sw_chnl_stage,
  681. &rtlphy->sw_chnl_step, &delay)) {
  682. if (delay > 0)
  683. mdelay(delay);
  684. else
  685. continue;
  686. } else
  687. rtlphy->sw_chnl_inprogress = false;
  688. break;
  689. } while (true);
  690. RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, ("<==\n"));
  691. }
  692. EXPORT_SYMBOL(rtl92c_phy_sw_chnl_callback);
  693. u8 rtl92c_phy_sw_chnl(struct ieee80211_hw *hw)
  694. {
  695. struct rtl_priv *rtlpriv = rtl_priv(hw);
  696. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  697. struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
  698. if (rtlphy->sw_chnl_inprogress)
  699. return 0;
  700. if (rtlphy->set_bwmode_inprogress)
  701. return 0;
  702. RT_ASSERT((rtlphy->current_channel <= 14),
  703. ("WIRELESS_MODE_G but channel>14"));
  704. rtlphy->sw_chnl_inprogress = true;
  705. rtlphy->sw_chnl_stage = 0;
  706. rtlphy->sw_chnl_step = 0;
  707. if (!(is_hal_stop(rtlhal)) && !(RT_CANNOT_IO(hw))) {
  708. rtl92c_phy_sw_chnl_callback(hw);
  709. RT_TRACE(rtlpriv, COMP_CHAN, DBG_LOUD,
  710. ("sw_chnl_inprogress false schdule workitem\n"));
  711. rtlphy->sw_chnl_inprogress = false;
  712. } else {
  713. RT_TRACE(rtlpriv, COMP_CHAN, DBG_LOUD,
  714. ("sw_chnl_inprogress false driver sleep or"
  715. " unload\n"));
  716. rtlphy->sw_chnl_inprogress = false;
  717. }
  718. return 1;
  719. }
  720. EXPORT_SYMBOL(rtl92c_phy_sw_chnl);
  721. static bool _rtl92c_phy_sw_chnl_step_by_step(struct ieee80211_hw *hw,
  722. u8 channel, u8 *stage, u8 *step,
  723. u32 *delay)
  724. {
  725. struct rtl_priv *rtlpriv = rtl_priv(hw);
  726. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  727. struct swchnlcmd precommoncmd[MAX_PRECMD_CNT];
  728. u32 precommoncmdcnt;
  729. struct swchnlcmd postcommoncmd[MAX_POSTCMD_CNT];
  730. u32 postcommoncmdcnt;
  731. struct swchnlcmd rfdependcmd[MAX_RFDEPENDCMD_CNT];
  732. u32 rfdependcmdcnt;
  733. struct swchnlcmd *currentcmd = NULL;
  734. u8 rfpath;
  735. u8 num_total_rfpath = rtlphy->num_total_rfpath;
  736. precommoncmdcnt = 0;
  737. _rtl92c_phy_set_sw_chnl_cmdarray(precommoncmd, precommoncmdcnt++,
  738. MAX_PRECMD_CNT,
  739. CMDID_SET_TXPOWEROWER_LEVEL, 0, 0, 0);
  740. _rtl92c_phy_set_sw_chnl_cmdarray(precommoncmd, precommoncmdcnt++,
  741. MAX_PRECMD_CNT, CMDID_END, 0, 0, 0);
  742. postcommoncmdcnt = 0;
  743. _rtl92c_phy_set_sw_chnl_cmdarray(postcommoncmd, postcommoncmdcnt++,
  744. MAX_POSTCMD_CNT, CMDID_END, 0, 0, 0);
  745. rfdependcmdcnt = 0;
  746. RT_ASSERT((channel >= 1 && channel <= 14),
  747. ("illegal channel for Zebra: %d\n", channel));
  748. _rtl92c_phy_set_sw_chnl_cmdarray(rfdependcmd, rfdependcmdcnt++,
  749. MAX_RFDEPENDCMD_CNT, CMDID_RF_WRITEREG,
  750. RF_CHNLBW, channel, 10);
  751. _rtl92c_phy_set_sw_chnl_cmdarray(rfdependcmd, rfdependcmdcnt++,
  752. MAX_RFDEPENDCMD_CNT, CMDID_END, 0, 0,
  753. 0);
  754. do {
  755. switch (*stage) {
  756. case 0:
  757. currentcmd = &precommoncmd[*step];
  758. break;
  759. case 1:
  760. currentcmd = &rfdependcmd[*step];
  761. break;
  762. case 2:
  763. currentcmd = &postcommoncmd[*step];
  764. break;
  765. }
  766. if (currentcmd->cmdid == CMDID_END) {
  767. if ((*stage) == 2) {
  768. return true;
  769. } else {
  770. (*stage)++;
  771. (*step) = 0;
  772. continue;
  773. }
  774. }
  775. switch (currentcmd->cmdid) {
  776. case CMDID_SET_TXPOWEROWER_LEVEL:
  777. rtl92c_phy_set_txpower_level(hw, channel);
  778. break;
  779. case CMDID_WRITEPORT_ULONG:
  780. rtl_write_dword(rtlpriv, currentcmd->para1,
  781. currentcmd->para2);
  782. break;
  783. case CMDID_WRITEPORT_USHORT:
  784. rtl_write_word(rtlpriv, currentcmd->para1,
  785. (u16) currentcmd->para2);
  786. break;
  787. case CMDID_WRITEPORT_UCHAR:
  788. rtl_write_byte(rtlpriv, currentcmd->para1,
  789. (u8) currentcmd->para2);
  790. break;
  791. case CMDID_RF_WRITEREG:
  792. for (rfpath = 0; rfpath < num_total_rfpath; rfpath++) {
  793. rtlphy->rfreg_chnlval[rfpath] =
  794. ((rtlphy->rfreg_chnlval[rfpath] &
  795. 0xfffffc00) | currentcmd->para2);
  796. rtl_set_rfreg(hw, (enum radio_path)rfpath,
  797. currentcmd->para1,
  798. RFREG_OFFSET_MASK,
  799. rtlphy->rfreg_chnlval[rfpath]);
  800. }
  801. break;
  802. default:
  803. RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
  804. ("switch case not process\n"));
  805. break;
  806. }
  807. break;
  808. } while (true);
  809. (*delay) = currentcmd->msdelay;
  810. (*step)++;
  811. return false;
  812. }
  813. static bool _rtl92c_phy_set_sw_chnl_cmdarray(struct swchnlcmd *cmdtable,
  814. u32 cmdtableidx, u32 cmdtablesz,
  815. enum swchnlcmd_id cmdid,
  816. u32 para1, u32 para2, u32 msdelay)
  817. {
  818. struct swchnlcmd *pcmd;
  819. if (cmdtable == NULL) {
  820. RT_ASSERT(false, ("cmdtable cannot be NULL.\n"));
  821. return false;
  822. }
  823. if (cmdtableidx >= cmdtablesz)
  824. return false;
  825. pcmd = cmdtable + cmdtableidx;
  826. pcmd->cmdid = cmdid;
  827. pcmd->para1 = para1;
  828. pcmd->para2 = para2;
  829. pcmd->msdelay = msdelay;
  830. return true;
  831. }
  832. bool rtl8192_phy_check_is_legal_rfpath(struct ieee80211_hw *hw, u32 rfpath)
  833. {
  834. return true;
  835. }
  836. EXPORT_SYMBOL(rtl8192_phy_check_is_legal_rfpath);
  837. static u8 _rtl92c_phy_path_a_iqk(struct ieee80211_hw *hw, bool config_pathb)
  838. {
  839. u32 reg_eac, reg_e94, reg_e9c, reg_ea4;
  840. u8 result = 0x00;
  841. rtl_set_bbreg(hw, 0xe30, MASKDWORD, 0x10008c1f);
  842. rtl_set_bbreg(hw, 0xe34, MASKDWORD, 0x10008c1f);
  843. rtl_set_bbreg(hw, 0xe38, MASKDWORD, 0x82140102);
  844. rtl_set_bbreg(hw, 0xe3c, MASKDWORD,
  845. config_pathb ? 0x28160202 : 0x28160502);
  846. if (config_pathb) {
  847. rtl_set_bbreg(hw, 0xe50, MASKDWORD, 0x10008c22);
  848. rtl_set_bbreg(hw, 0xe54, MASKDWORD, 0x10008c22);
  849. rtl_set_bbreg(hw, 0xe58, MASKDWORD, 0x82140102);
  850. rtl_set_bbreg(hw, 0xe5c, MASKDWORD, 0x28160202);
  851. }
  852. rtl_set_bbreg(hw, 0xe4c, MASKDWORD, 0x001028d1);
  853. rtl_set_bbreg(hw, 0xe48, MASKDWORD, 0xf9000000);
  854. rtl_set_bbreg(hw, 0xe48, MASKDWORD, 0xf8000000);
  855. mdelay(IQK_DELAY_TIME);
  856. reg_eac = rtl_get_bbreg(hw, 0xeac, MASKDWORD);
  857. reg_e94 = rtl_get_bbreg(hw, 0xe94, MASKDWORD);
  858. reg_e9c = rtl_get_bbreg(hw, 0xe9c, MASKDWORD);
  859. reg_ea4 = rtl_get_bbreg(hw, 0xea4, MASKDWORD);
  860. if (!(reg_eac & BIT(28)) &&
  861. (((reg_e94 & 0x03FF0000) >> 16) != 0x142) &&
  862. (((reg_e9c & 0x03FF0000) >> 16) != 0x42))
  863. result |= 0x01;
  864. else
  865. return result;
  866. if (!(reg_eac & BIT(27)) &&
  867. (((reg_ea4 & 0x03FF0000) >> 16) != 0x132) &&
  868. (((reg_eac & 0x03FF0000) >> 16) != 0x36))
  869. result |= 0x02;
  870. return result;
  871. }
  872. static u8 _rtl92c_phy_path_b_iqk(struct ieee80211_hw *hw)
  873. {
  874. u32 reg_eac, reg_eb4, reg_ebc, reg_ec4, reg_ecc;
  875. u8 result = 0x00;
  876. rtl_set_bbreg(hw, 0xe60, MASKDWORD, 0x00000002);
  877. rtl_set_bbreg(hw, 0xe60, MASKDWORD, 0x00000000);
  878. mdelay(IQK_DELAY_TIME);
  879. reg_eac = rtl_get_bbreg(hw, 0xeac, MASKDWORD);
  880. reg_eb4 = rtl_get_bbreg(hw, 0xeb4, MASKDWORD);
  881. reg_ebc = rtl_get_bbreg(hw, 0xebc, MASKDWORD);
  882. reg_ec4 = rtl_get_bbreg(hw, 0xec4, MASKDWORD);
  883. reg_ecc = rtl_get_bbreg(hw, 0xecc, MASKDWORD);
  884. if (!(reg_eac & BIT(31)) &&
  885. (((reg_eb4 & 0x03FF0000) >> 16) != 0x142) &&
  886. (((reg_ebc & 0x03FF0000) >> 16) != 0x42))
  887. result |= 0x01;
  888. else
  889. return result;
  890. if (!(reg_eac & BIT(30)) &&
  891. (((reg_ec4 & 0x03FF0000) >> 16) != 0x132) &&
  892. (((reg_ecc & 0x03FF0000) >> 16) != 0x36))
  893. result |= 0x02;
  894. return result;
  895. }
  896. static void _rtl92c_phy_path_a_fill_iqk_matrix(struct ieee80211_hw *hw,
  897. bool iqk_ok, long result[][8],
  898. u8 final_candidate, bool btxonly)
  899. {
  900. u32 oldval_0, x, tx0_a, reg;
  901. long y, tx0_c;
  902. if (final_candidate == 0xFF)
  903. return;
  904. else if (iqk_ok) {
  905. oldval_0 = (rtl_get_bbreg(hw, ROFDM0_XATXIQIMBALANCE,
  906. MASKDWORD) >> 22) & 0x3FF;
  907. x = result[final_candidate][0];
  908. if ((x & 0x00000200) != 0)
  909. x = x | 0xFFFFFC00;
  910. tx0_a = (x * oldval_0) >> 8;
  911. rtl_set_bbreg(hw, ROFDM0_XATXIQIMBALANCE, 0x3FF, tx0_a);
  912. rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(31),
  913. ((x * oldval_0 >> 7) & 0x1));
  914. y = result[final_candidate][1];
  915. if ((y & 0x00000200) != 0)
  916. y = y | 0xFFFFFC00;
  917. tx0_c = (y * oldval_0) >> 8;
  918. rtl_set_bbreg(hw, ROFDM0_XCTXAFE, 0xF0000000,
  919. ((tx0_c & 0x3C0) >> 6));
  920. rtl_set_bbreg(hw, ROFDM0_XATXIQIMBALANCE, 0x003F0000,
  921. (tx0_c & 0x3F));
  922. rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(29),
  923. ((y * oldval_0 >> 7) & 0x1));
  924. if (btxonly)
  925. return;
  926. reg = result[final_candidate][2];
  927. rtl_set_bbreg(hw, ROFDM0_XARXIQIMBALANCE, 0x3FF, reg);
  928. reg = result[final_candidate][3] & 0x3F;
  929. rtl_set_bbreg(hw, ROFDM0_XARXIQIMBALANCE, 0xFC00, reg);
  930. reg = (result[final_candidate][3] >> 6) & 0xF;
  931. rtl_set_bbreg(hw, 0xca0, 0xF0000000, reg);
  932. }
  933. }
  934. static void _rtl92c_phy_path_b_fill_iqk_matrix(struct ieee80211_hw *hw,
  935. bool iqk_ok, long result[][8],
  936. u8 final_candidate, bool btxonly)
  937. {
  938. u32 oldval_1, x, tx1_a, reg;
  939. long y, tx1_c;
  940. if (final_candidate == 0xFF)
  941. return;
  942. else if (iqk_ok) {
  943. oldval_1 = (rtl_get_bbreg(hw, ROFDM0_XBTXIQIMBALANCE,
  944. MASKDWORD) >> 22) & 0x3FF;
  945. x = result[final_candidate][4];
  946. if ((x & 0x00000200) != 0)
  947. x = x | 0xFFFFFC00;
  948. tx1_a = (x * oldval_1) >> 8;
  949. rtl_set_bbreg(hw, ROFDM0_XBTXIQIMBALANCE, 0x3FF, tx1_a);
  950. rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(27),
  951. ((x * oldval_1 >> 7) & 0x1));
  952. y = result[final_candidate][5];
  953. if ((y & 0x00000200) != 0)
  954. y = y | 0xFFFFFC00;
  955. tx1_c = (y * oldval_1) >> 8;
  956. rtl_set_bbreg(hw, ROFDM0_XDTXAFE, 0xF0000000,
  957. ((tx1_c & 0x3C0) >> 6));
  958. rtl_set_bbreg(hw, ROFDM0_XBTXIQIMBALANCE, 0x003F0000,
  959. (tx1_c & 0x3F));
  960. rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(25),
  961. ((y * oldval_1 >> 7) & 0x1));
  962. if (btxonly)
  963. return;
  964. reg = result[final_candidate][6];
  965. rtl_set_bbreg(hw, ROFDM0_XBRXIQIMBALANCE, 0x3FF, reg);
  966. reg = result[final_candidate][7] & 0x3F;
  967. rtl_set_bbreg(hw, ROFDM0_XBRXIQIMBALANCE, 0xFC00, reg);
  968. reg = (result[final_candidate][7] >> 6) & 0xF;
  969. rtl_set_bbreg(hw, ROFDM0_AGCRSSITABLE, 0x0000F000, reg);
  970. }
  971. }
  972. static void _rtl92c_phy_save_adda_registers(struct ieee80211_hw *hw,
  973. u32 *addareg, u32 *addabackup,
  974. u32 registernum)
  975. {
  976. u32 i;
  977. for (i = 0; i < registernum; i++)
  978. addabackup[i] = rtl_get_bbreg(hw, addareg[i], MASKDWORD);
  979. }
  980. static void _rtl92c_phy_save_mac_registers(struct ieee80211_hw *hw,
  981. u32 *macreg, u32 *macbackup)
  982. {
  983. struct rtl_priv *rtlpriv = rtl_priv(hw);
  984. u32 i;
  985. for (i = 0; i < (IQK_MAC_REG_NUM - 1); i++)
  986. macbackup[i] = rtl_read_byte(rtlpriv, macreg[i]);
  987. macbackup[i] = rtl_read_dword(rtlpriv, macreg[i]);
  988. }
  989. static void _rtl92c_phy_reload_adda_registers(struct ieee80211_hw *hw,
  990. u32 *addareg, u32 *addabackup,
  991. u32 regiesternum)
  992. {
  993. u32 i;
  994. for (i = 0; i < regiesternum; i++)
  995. rtl_set_bbreg(hw, addareg[i], MASKDWORD, addabackup[i]);
  996. }
  997. static void _rtl92c_phy_reload_mac_registers(struct ieee80211_hw *hw,
  998. u32 *macreg, u32 *macbackup)
  999. {
  1000. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1001. u32 i;
  1002. for (i = 0; i < (IQK_MAC_REG_NUM - 1); i++)
  1003. rtl_write_byte(rtlpriv, macreg[i], (u8) macbackup[i]);
  1004. rtl_write_dword(rtlpriv, macreg[i], macbackup[i]);
  1005. }
  1006. static void _rtl92c_phy_path_adda_on(struct ieee80211_hw *hw,
  1007. u32 *addareg, bool is_patha_on, bool is2t)
  1008. {
  1009. u32 pathOn;
  1010. u32 i;
  1011. pathOn = is_patha_on ? 0x04db25a4 : 0x0b1b25a4;
  1012. if (false == is2t) {
  1013. pathOn = 0x0bdb25a0;
  1014. rtl_set_bbreg(hw, addareg[0], MASKDWORD, 0x0b1b25a0);
  1015. } else {
  1016. rtl_set_bbreg(hw, addareg[0], MASKDWORD, pathOn);
  1017. }
  1018. for (i = 1; i < IQK_ADDA_REG_NUM; i++)
  1019. rtl_set_bbreg(hw, addareg[i], MASKDWORD, pathOn);
  1020. }
  1021. static void _rtl92c_phy_mac_setting_calibration(struct ieee80211_hw *hw,
  1022. u32 *macreg, u32 *macbackup)
  1023. {
  1024. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1025. u32 i;
  1026. rtl_write_byte(rtlpriv, macreg[0], 0x3F);
  1027. for (i = 1; i < (IQK_MAC_REG_NUM - 1); i++)
  1028. rtl_write_byte(rtlpriv, macreg[i],
  1029. (u8) (macbackup[i] & (~BIT(3))));
  1030. rtl_write_byte(rtlpriv, macreg[i], (u8) (macbackup[i] & (~BIT(5))));
  1031. }
  1032. static void _rtl92c_phy_path_a_standby(struct ieee80211_hw *hw)
  1033. {
  1034. rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x0);
  1035. rtl_set_bbreg(hw, 0x840, MASKDWORD, 0x00010000);
  1036. rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x80800000);
  1037. }
  1038. static void _rtl92c_phy_pi_mode_switch(struct ieee80211_hw *hw, bool pi_mode)
  1039. {
  1040. u32 mode;
  1041. mode = pi_mode ? 0x01000100 : 0x01000000;
  1042. rtl_set_bbreg(hw, 0x820, MASKDWORD, mode);
  1043. rtl_set_bbreg(hw, 0x828, MASKDWORD, mode);
  1044. }
  1045. static bool _rtl92c_phy_simularity_compare(struct ieee80211_hw *hw,
  1046. long result[][8], u8 c1, u8 c2)
  1047. {
  1048. u32 i, j, diff, simularity_bitmap, bound;
  1049. struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
  1050. u8 final_candidate[2] = { 0xFF, 0xFF };
  1051. bool bresult = true, is2t = IS_92C_SERIAL(rtlhal->version);
  1052. if (is2t)
  1053. bound = 8;
  1054. else
  1055. bound = 4;
  1056. simularity_bitmap = 0;
  1057. for (i = 0; i < bound; i++) {
  1058. diff = (result[c1][i] > result[c2][i]) ?
  1059. (result[c1][i] - result[c2][i]) :
  1060. (result[c2][i] - result[c1][i]);
  1061. if (diff > MAX_TOLERANCE) {
  1062. if ((i == 2 || i == 6) && !simularity_bitmap) {
  1063. if (result[c1][i] + result[c1][i + 1] == 0)
  1064. final_candidate[(i / 4)] = c2;
  1065. else if (result[c2][i] + result[c2][i + 1] == 0)
  1066. final_candidate[(i / 4)] = c1;
  1067. else
  1068. simularity_bitmap = simularity_bitmap |
  1069. (1 << i);
  1070. } else
  1071. simularity_bitmap =
  1072. simularity_bitmap | (1 << i);
  1073. }
  1074. }
  1075. if (simularity_bitmap == 0) {
  1076. for (i = 0; i < (bound / 4); i++) {
  1077. if (final_candidate[i] != 0xFF) {
  1078. for (j = i * 4; j < (i + 1) * 4 - 2; j++)
  1079. result[3][j] =
  1080. result[final_candidate[i]][j];
  1081. bresult = false;
  1082. }
  1083. }
  1084. return bresult;
  1085. } else if (!(simularity_bitmap & 0x0F)) {
  1086. for (i = 0; i < 4; i++)
  1087. result[3][i] = result[c1][i];
  1088. return false;
  1089. } else if (!(simularity_bitmap & 0xF0) && is2t) {
  1090. for (i = 4; i < 8; i++)
  1091. result[3][i] = result[c1][i];
  1092. return false;
  1093. } else {
  1094. return false;
  1095. }
  1096. }
  1097. static void _rtl92c_phy_iq_calibrate(struct ieee80211_hw *hw,
  1098. long result[][8], u8 t, bool is2t)
  1099. {
  1100. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1101. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  1102. u32 i;
  1103. u8 patha_ok, pathb_ok;
  1104. u32 adda_reg[IQK_ADDA_REG_NUM] = {
  1105. 0x85c, 0xe6c, 0xe70, 0xe74,
  1106. 0xe78, 0xe7c, 0xe80, 0xe84,
  1107. 0xe88, 0xe8c, 0xed0, 0xed4,
  1108. 0xed8, 0xedc, 0xee0, 0xeec
  1109. };
  1110. u32 iqk_mac_reg[IQK_MAC_REG_NUM] = {
  1111. 0x522, 0x550, 0x551, 0x040
  1112. };
  1113. const u32 retrycount = 2;
  1114. u32 bbvalue;
  1115. if (t == 0) {
  1116. bbvalue = rtl_get_bbreg(hw, 0x800, MASKDWORD);
  1117. _rtl92c_phy_save_adda_registers(hw, adda_reg,
  1118. rtlphy->adda_backup, 16);
  1119. _rtl92c_phy_save_mac_registers(hw, iqk_mac_reg,
  1120. rtlphy->iqk_mac_backup);
  1121. }
  1122. _rtl92c_phy_path_adda_on(hw, adda_reg, true, is2t);
  1123. if (t == 0) {
  1124. rtlphy->rfpi_enable = (u8) rtl_get_bbreg(hw,
  1125. RFPGA0_XA_HSSIPARAMETER1,
  1126. BIT(8));
  1127. }
  1128. if (!rtlphy->rfpi_enable)
  1129. _rtl92c_phy_pi_mode_switch(hw, true);
  1130. if (t == 0) {
  1131. rtlphy->reg_c04 = rtl_get_bbreg(hw, 0xc04, MASKDWORD);
  1132. rtlphy->reg_c08 = rtl_get_bbreg(hw, 0xc08, MASKDWORD);
  1133. rtlphy->reg_874 = rtl_get_bbreg(hw, 0x874, MASKDWORD);
  1134. }
  1135. rtl_set_bbreg(hw, 0xc04, MASKDWORD, 0x03a05600);
  1136. rtl_set_bbreg(hw, 0xc08, MASKDWORD, 0x000800e4);
  1137. rtl_set_bbreg(hw, 0x874, MASKDWORD, 0x22204000);
  1138. if (is2t) {
  1139. rtl_set_bbreg(hw, 0x840, MASKDWORD, 0x00010000);
  1140. rtl_set_bbreg(hw, 0x844, MASKDWORD, 0x00010000);
  1141. }
  1142. _rtl92c_phy_mac_setting_calibration(hw, iqk_mac_reg,
  1143. rtlphy->iqk_mac_backup);
  1144. rtl_set_bbreg(hw, 0xb68, MASKDWORD, 0x00080000);
  1145. if (is2t)
  1146. rtl_set_bbreg(hw, 0xb6c, MASKDWORD, 0x00080000);
  1147. rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x80800000);
  1148. rtl_set_bbreg(hw, 0xe40, MASKDWORD, 0x01007c00);
  1149. rtl_set_bbreg(hw, 0xe44, MASKDWORD, 0x01004800);
  1150. for (i = 0; i < retrycount; i++) {
  1151. patha_ok = _rtl92c_phy_path_a_iqk(hw, is2t);
  1152. if (patha_ok == 0x03) {
  1153. result[t][0] = (rtl_get_bbreg(hw, 0xe94, MASKDWORD) &
  1154. 0x3FF0000) >> 16;
  1155. result[t][1] = (rtl_get_bbreg(hw, 0xe9c, MASKDWORD) &
  1156. 0x3FF0000) >> 16;
  1157. result[t][2] = (rtl_get_bbreg(hw, 0xea4, MASKDWORD) &
  1158. 0x3FF0000) >> 16;
  1159. result[t][3] = (rtl_get_bbreg(hw, 0xeac, MASKDWORD) &
  1160. 0x3FF0000) >> 16;
  1161. break;
  1162. } else if (i == (retrycount - 1) && patha_ok == 0x01)
  1163. result[t][0] = (rtl_get_bbreg(hw, 0xe94,
  1164. MASKDWORD) & 0x3FF0000) >>
  1165. 16;
  1166. result[t][1] =
  1167. (rtl_get_bbreg(hw, 0xe9c, MASKDWORD) & 0x3FF0000) >> 16;
  1168. }
  1169. if (is2t) {
  1170. _rtl92c_phy_path_a_standby(hw);
  1171. _rtl92c_phy_path_adda_on(hw, adda_reg, false, is2t);
  1172. for (i = 0; i < retrycount; i++) {
  1173. pathb_ok = _rtl92c_phy_path_b_iqk(hw);
  1174. if (pathb_ok == 0x03) {
  1175. result[t][4] = (rtl_get_bbreg(hw,
  1176. 0xeb4,
  1177. MASKDWORD) &
  1178. 0x3FF0000) >> 16;
  1179. result[t][5] =
  1180. (rtl_get_bbreg(hw, 0xebc, MASKDWORD) &
  1181. 0x3FF0000) >> 16;
  1182. result[t][6] =
  1183. (rtl_get_bbreg(hw, 0xec4, MASKDWORD) &
  1184. 0x3FF0000) >> 16;
  1185. result[t][7] =
  1186. (rtl_get_bbreg(hw, 0xecc, MASKDWORD) &
  1187. 0x3FF0000) >> 16;
  1188. break;
  1189. } else if (i == (retrycount - 1) && pathb_ok == 0x01) {
  1190. result[t][4] = (rtl_get_bbreg(hw,
  1191. 0xeb4,
  1192. MASKDWORD) &
  1193. 0x3FF0000) >> 16;
  1194. }
  1195. result[t][5] = (rtl_get_bbreg(hw, 0xebc, MASKDWORD) &
  1196. 0x3FF0000) >> 16;
  1197. }
  1198. }
  1199. rtl_set_bbreg(hw, 0xc04, MASKDWORD, rtlphy->reg_c04);
  1200. rtl_set_bbreg(hw, 0x874, MASKDWORD, rtlphy->reg_874);
  1201. rtl_set_bbreg(hw, 0xc08, MASKDWORD, rtlphy->reg_c08);
  1202. rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0);
  1203. rtl_set_bbreg(hw, 0x840, MASKDWORD, 0x00032ed3);
  1204. if (is2t)
  1205. rtl_set_bbreg(hw, 0x844, MASKDWORD, 0x00032ed3);
  1206. if (t != 0) {
  1207. if (!rtlphy->rfpi_enable)
  1208. _rtl92c_phy_pi_mode_switch(hw, false);
  1209. _rtl92c_phy_reload_adda_registers(hw, adda_reg,
  1210. rtlphy->adda_backup, 16);
  1211. _rtl92c_phy_reload_mac_registers(hw, iqk_mac_reg,
  1212. rtlphy->iqk_mac_backup);
  1213. }
  1214. }
  1215. static void _rtl92c_phy_ap_calibrate(struct ieee80211_hw *hw,
  1216. char delta, bool is2t)
  1217. {
  1218. /* This routine is deliberately dummied out for later fixes */
  1219. #if 0
  1220. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1221. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  1222. struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
  1223. u32 reg_d[PATH_NUM];
  1224. u32 tmpreg, index, offset, path, i, pathbound = PATH_NUM, apkbound;
  1225. u32 bb_backup[APK_BB_REG_NUM];
  1226. u32 bb_reg[APK_BB_REG_NUM] = {
  1227. 0x904, 0xc04, 0x800, 0xc08, 0x874
  1228. };
  1229. u32 bb_ap_mode[APK_BB_REG_NUM] = {
  1230. 0x00000020, 0x00a05430, 0x02040000,
  1231. 0x000800e4, 0x00204000
  1232. };
  1233. u32 bb_normal_ap_mode[APK_BB_REG_NUM] = {
  1234. 0x00000020, 0x00a05430, 0x02040000,
  1235. 0x000800e4, 0x22204000
  1236. };
  1237. u32 afe_backup[APK_AFE_REG_NUM];
  1238. u32 afe_reg[APK_AFE_REG_NUM] = {
  1239. 0x85c, 0xe6c, 0xe70, 0xe74, 0xe78,
  1240. 0xe7c, 0xe80, 0xe84, 0xe88, 0xe8c,
  1241. 0xed0, 0xed4, 0xed8, 0xedc, 0xee0,
  1242. 0xeec
  1243. };
  1244. u32 mac_backup[IQK_MAC_REG_NUM];
  1245. u32 mac_reg[IQK_MAC_REG_NUM] = {
  1246. 0x522, 0x550, 0x551, 0x040
  1247. };
  1248. u32 apk_rf_init_value[PATH_NUM][APK_BB_REG_NUM] = {
  1249. {0x0852c, 0x1852c, 0x5852c, 0x1852c, 0x5852c},
  1250. {0x2852e, 0x0852e, 0x3852e, 0x0852e, 0x0852e}
  1251. };
  1252. u32 apk_normal_rf_init_value[PATH_NUM][APK_BB_REG_NUM] = {
  1253. {0x0852c, 0x0a52c, 0x3a52c, 0x5a52c, 0x5a52c},
  1254. {0x0852c, 0x0a52c, 0x5a52c, 0x5a52c, 0x5a52c}
  1255. };
  1256. u32 apk_rf_value_0[PATH_NUM][APK_BB_REG_NUM] = {
  1257. {0x52019, 0x52014, 0x52013, 0x5200f, 0x5208d},
  1258. {0x5201a, 0x52019, 0x52016, 0x52033, 0x52050}
  1259. };
  1260. u32 apk_normal_rf_value_0[PATH_NUM][APK_BB_REG_NUM] = {
  1261. {0x52019, 0x52017, 0x52010, 0x5200d, 0x5206a},
  1262. {0x52019, 0x52017, 0x52010, 0x5200d, 0x5206a}
  1263. };
  1264. u32 afe_on_off[PATH_NUM] = {
  1265. 0x04db25a4, 0x0b1b25a4
  1266. };
  1267. u32 apk_offset[PATH_NUM] = { 0xb68, 0xb6c };
  1268. u32 apk_normal_offset[PATH_NUM] = { 0xb28, 0xb98 };
  1269. u32 apk_value[PATH_NUM] = { 0x92fc0000, 0x12fc0000 };
  1270. u32 apk_normal_value[PATH_NUM] = { 0x92680000, 0x12680000 };
  1271. const char apk_delta_mapping[APK_BB_REG_NUM][13] = {
  1272. {-4, -3, -2, -2, -1, -1, 0, 1, 2, 3, 4, 5, 6},
  1273. {-4, -3, -2, -2, -1, -1, 0, 1, 2, 3, 4, 5, 6},
  1274. {-6, -4, -2, -2, -1, -1, 0, 1, 2, 3, 4, 5, 6},
  1275. {-1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6},
  1276. {-11, -9, -7, -5, -3, -1, 0, 0, 0, 0, 0, 0, 0}
  1277. };
  1278. const u32 apk_normal_setting_value_1[13] = {
  1279. 0x01017018, 0xf7ed8f84, 0x1b1a1816, 0x2522201e, 0x322e2b28,
  1280. 0x433f3a36, 0x5b544e49, 0x7b726a62, 0xa69a8f84, 0xdfcfc0b3,
  1281. 0x12680000, 0x00880000, 0x00880000
  1282. };
  1283. const u32 apk_normal_setting_value_2[16] = {
  1284. 0x01c7021d, 0x01670183, 0x01000123, 0x00bf00e2, 0x008d00a3,
  1285. 0x0068007b, 0x004d0059, 0x003a0042, 0x002b0031, 0x001f0025,
  1286. 0x0017001b, 0x00110014, 0x000c000f, 0x0009000b, 0x00070008,
  1287. 0x00050006
  1288. };
  1289. const u32 apk_result[PATH_NUM][APK_BB_REG_NUM];
  1290. long bb_offset, delta_v, delta_offset;
  1291. if (!is2t)
  1292. pathbound = 1;
  1293. for (index = 0; index < PATH_NUM; index++) {
  1294. apk_offset[index] = apk_normal_offset[index];
  1295. apk_value[index] = apk_normal_value[index];
  1296. afe_on_off[index] = 0x6fdb25a4;
  1297. }
  1298. for (index = 0; index < APK_BB_REG_NUM; index++) {
  1299. for (path = 0; path < pathbound; path++) {
  1300. apk_rf_init_value[path][index] =
  1301. apk_normal_rf_init_value[path][index];
  1302. apk_rf_value_0[path][index] =
  1303. apk_normal_rf_value_0[path][index];
  1304. }
  1305. bb_ap_mode[index] = bb_normal_ap_mode[index];
  1306. apkbound = 6;
  1307. }
  1308. for (index = 0; index < APK_BB_REG_NUM; index++) {
  1309. if (index == 0)
  1310. continue;
  1311. bb_backup[index] = rtl_get_bbreg(hw, bb_reg[index], MASKDWORD);
  1312. }
  1313. _rtl92c_phy_save_mac_registers(hw, mac_reg, mac_backup);
  1314. _rtl92c_phy_save_adda_registers(hw, afe_reg, afe_backup, 16);
  1315. for (path = 0; path < pathbound; path++) {
  1316. if (path == RF90_PATH_A) {
  1317. offset = 0xb00;
  1318. for (index = 0; index < 11; index++) {
  1319. rtl_set_bbreg(hw, offset, MASKDWORD,
  1320. apk_normal_setting_value_1
  1321. [index]);
  1322. offset += 0x04;
  1323. }
  1324. rtl_set_bbreg(hw, 0xb98, MASKDWORD, 0x12680000);
  1325. offset = 0xb68;
  1326. for (; index < 13; index++) {
  1327. rtl_set_bbreg(hw, offset, MASKDWORD,
  1328. apk_normal_setting_value_1
  1329. [index]);
  1330. offset += 0x04;
  1331. }
  1332. rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x40000000);
  1333. offset = 0xb00;
  1334. for (index = 0; index < 16; index++) {
  1335. rtl_set_bbreg(hw, offset, MASKDWORD,
  1336. apk_normal_setting_value_2
  1337. [index]);
  1338. offset += 0x04;
  1339. }
  1340. rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x00000000);
  1341. } else if (path == RF90_PATH_B) {
  1342. offset = 0xb70;
  1343. for (index = 0; index < 10; index++) {
  1344. rtl_set_bbreg(hw, offset, MASKDWORD,
  1345. apk_normal_setting_value_1
  1346. [index]);
  1347. offset += 0x04;
  1348. }
  1349. rtl_set_bbreg(hw, 0xb28, MASKDWORD, 0x12680000);
  1350. rtl_set_bbreg(hw, 0xb98, MASKDWORD, 0x12680000);
  1351. offset = 0xb68;
  1352. index = 11;
  1353. for (; index < 13; index++) {
  1354. rtl_set_bbreg(hw, offset, MASKDWORD,
  1355. apk_normal_setting_value_1
  1356. [index]);
  1357. offset += 0x04;
  1358. }
  1359. rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x40000000);
  1360. offset = 0xb60;
  1361. for (index = 0; index < 16; index++) {
  1362. rtl_set_bbreg(hw, offset, MASKDWORD,
  1363. apk_normal_setting_value_2
  1364. [index]);
  1365. offset += 0x04;
  1366. }
  1367. rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x00000000);
  1368. }
  1369. reg_d[path] = rtl_get_rfreg(hw, (enum radio_path)path,
  1370. 0xd, MASKDWORD);
  1371. for (index = 0; index < APK_AFE_REG_NUM; index++)
  1372. rtl_set_bbreg(hw, afe_reg[index], MASKDWORD,
  1373. afe_on_off[path]);
  1374. if (path == RF90_PATH_A) {
  1375. for (index = 0; index < APK_BB_REG_NUM; index++) {
  1376. if (index == 0)
  1377. continue;
  1378. rtl_set_bbreg(hw, bb_reg[index], MASKDWORD,
  1379. bb_ap_mode[index]);
  1380. }
  1381. }
  1382. _rtl92c_phy_mac_setting_calibration(hw, mac_reg, mac_backup);
  1383. if (path == 0) {
  1384. rtl_set_rfreg(hw, RF90_PATH_B, 0x0, MASKDWORD, 0x10000);
  1385. } else {
  1386. rtl_set_rfreg(hw, RF90_PATH_A, 0x00, MASKDWORD,
  1387. 0x10000);
  1388. rtl_set_rfreg(hw, RF90_PATH_A, 0x10, MASKDWORD,
  1389. 0x1000f);
  1390. rtl_set_rfreg(hw, RF90_PATH_A, 0x11, MASKDWORD,
  1391. 0x20103);
  1392. }
  1393. delta_offset = ((delta + 14) / 2);
  1394. if (delta_offset < 0)
  1395. delta_offset = 0;
  1396. else if (delta_offset > 12)
  1397. delta_offset = 12;
  1398. for (index = 0; index < APK_BB_REG_NUM; index++) {
  1399. if (index != 1)
  1400. continue;
  1401. tmpreg = apk_rf_init_value[path][index];
  1402. if (!rtlefuse->apk_thermalmeterignore) {
  1403. bb_offset = (tmpreg & 0xF0000) >> 16;
  1404. if (!(tmpreg & BIT(15)))
  1405. bb_offset = -bb_offset;
  1406. delta_v =
  1407. apk_delta_mapping[index][delta_offset];
  1408. bb_offset += delta_v;
  1409. if (bb_offset < 0) {
  1410. tmpreg = tmpreg & (~BIT(15));
  1411. bb_offset = -bb_offset;
  1412. } else {
  1413. tmpreg = tmpreg | BIT(15);
  1414. }
  1415. tmpreg =
  1416. (tmpreg & 0xFFF0FFFF) | (bb_offset << 16);
  1417. }
  1418. rtl_set_rfreg(hw, (enum radio_path)path, 0xc,
  1419. MASKDWORD, 0x8992e);
  1420. rtl_set_rfreg(hw, (enum radio_path)path, 0x0,
  1421. MASKDWORD, apk_rf_value_0[path][index]);
  1422. rtl_set_rfreg(hw, (enum radio_path)path, 0xd,
  1423. MASKDWORD, tmpreg);
  1424. i = 0;
  1425. do {
  1426. rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x80000000);
  1427. rtl_set_bbreg(hw, apk_offset[path],
  1428. MASKDWORD, apk_value[0]);
  1429. RTPRINT(rtlpriv, FINIT, INIT_IQK,
  1430. ("PHY_APCalibrate() offset 0x%x "
  1431. "value 0x%x\n",
  1432. apk_offset[path],
  1433. rtl_get_bbreg(hw, apk_offset[path],
  1434. MASKDWORD)));
  1435. mdelay(3);
  1436. rtl_set_bbreg(hw, apk_offset[path],
  1437. MASKDWORD, apk_value[1]);
  1438. RTPRINT(rtlpriv, FINIT, INIT_IQK,
  1439. ("PHY_APCalibrate() offset 0x%x "
  1440. "value 0x%x\n",
  1441. apk_offset[path],
  1442. rtl_get_bbreg(hw, apk_offset[path],
  1443. MASKDWORD)));
  1444. mdelay(20);
  1445. rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x00000000);
  1446. if (path == RF90_PATH_A)
  1447. tmpreg = rtl_get_bbreg(hw, 0xbd8,
  1448. 0x03E00000);
  1449. else
  1450. tmpreg = rtl_get_bbreg(hw, 0xbd8,
  1451. 0xF8000000);
  1452. RTPRINT(rtlpriv, FINIT, INIT_IQK,
  1453. ("PHY_APCalibrate() offset "
  1454. "0xbd8[25:21] %x\n", tmpreg));
  1455. i++;
  1456. } while (tmpreg > apkbound && i < 4);
  1457. apk_result[path][index] = tmpreg;
  1458. }
  1459. }
  1460. _rtl92c_phy_reload_mac_registers(hw, mac_reg, mac_backup);
  1461. for (index = 0; index < APK_BB_REG_NUM; index++) {
  1462. if (index == 0)
  1463. continue;
  1464. rtl_set_bbreg(hw, bb_reg[index], MASKDWORD, bb_backup[index]);
  1465. }
  1466. _rtl92c_phy_reload_adda_registers(hw, afe_reg, afe_backup, 16);
  1467. for (path = 0; path < pathbound; path++) {
  1468. rtl_set_rfreg(hw, (enum radio_path)path, 0xd,
  1469. MASKDWORD, reg_d[path]);
  1470. if (path == RF90_PATH_B) {
  1471. rtl_set_rfreg(hw, RF90_PATH_A, 0x10, MASKDWORD,
  1472. 0x1000f);
  1473. rtl_set_rfreg(hw, RF90_PATH_A, 0x11, MASKDWORD,
  1474. 0x20101);
  1475. }
  1476. if (apk_result[path][1] > 6)
  1477. apk_result[path][1] = 6;
  1478. }
  1479. for (path = 0; path < pathbound; path++) {
  1480. rtl_set_rfreg(hw, (enum radio_path)path, 0x3, MASKDWORD,
  1481. ((apk_result[path][1] << 15) |
  1482. (apk_result[path][1] << 10) |
  1483. (apk_result[path][1] << 5) |
  1484. apk_result[path][1]));
  1485. if (path == RF90_PATH_A)
  1486. rtl_set_rfreg(hw, (enum radio_path)path, 0x4, MASKDWORD,
  1487. ((apk_result[path][1] << 15) |
  1488. (apk_result[path][1] << 10) |
  1489. (0x00 << 5) | 0x05));
  1490. else
  1491. rtl_set_rfreg(hw, (enum radio_path)path, 0x4, MASKDWORD,
  1492. ((apk_result[path][1] << 15) |
  1493. (apk_result[path][1] << 10) |
  1494. (0x02 << 5) | 0x05));
  1495. rtl_set_rfreg(hw, (enum radio_path)path, 0xe, MASKDWORD,
  1496. ((0x08 << 15) | (0x08 << 10) | (0x08 << 5) |
  1497. 0x08));
  1498. }
  1499. rtlphy->apk_done = true;
  1500. #endif
  1501. }
  1502. static void _rtl92c_phy_set_rfpath_switch(struct ieee80211_hw *hw,
  1503. bool bmain, bool is2t)
  1504. {
  1505. struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
  1506. if (is_hal_stop(rtlhal)) {
  1507. rtl_set_bbreg(hw, REG_LEDCFG0, BIT(23), 0x01);
  1508. rtl_set_bbreg(hw, rFPGA0_XAB_RFPARAMETER, BIT(13), 0x01);
  1509. }
  1510. if (is2t) {
  1511. if (bmain)
  1512. rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE,
  1513. BIT(5) | BIT(6), 0x1);
  1514. else
  1515. rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE,
  1516. BIT(5) | BIT(6), 0x2);
  1517. } else {
  1518. if (bmain)
  1519. rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE, 0x300, 0x2);
  1520. else
  1521. rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE, 0x300, 0x1);
  1522. }
  1523. }
  1524. #undef IQK_ADDA_REG_NUM
  1525. #undef IQK_DELAY_TIME
  1526. void rtl92c_phy_iq_calibrate(struct ieee80211_hw *hw, bool recovery)
  1527. {
  1528. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1529. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  1530. struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
  1531. long result[4][8];
  1532. u8 i, final_candidate;
  1533. bool patha_ok, pathb_ok;
  1534. long reg_e94, reg_e9c, reg_ea4, reg_eac, reg_eb4, reg_ebc, reg_ec4,
  1535. reg_ecc, reg_tmp = 0;
  1536. bool is12simular, is13simular, is23simular;
  1537. bool start_conttx = false, singletone = false;
  1538. u32 iqk_bb_reg[10] = {
  1539. ROFDM0_XARXIQIMBALANCE,
  1540. ROFDM0_XBRXIQIMBALANCE,
  1541. ROFDM0_ECCATHRESHOLD,
  1542. ROFDM0_AGCRSSITABLE,
  1543. ROFDM0_XATXIQIMBALANCE,
  1544. ROFDM0_XBTXIQIMBALANCE,
  1545. ROFDM0_XCTXIQIMBALANCE,
  1546. ROFDM0_XCTXAFE,
  1547. ROFDM0_XDTXAFE,
  1548. ROFDM0_RXIQEXTANTA
  1549. };
  1550. if (recovery) {
  1551. _rtl92c_phy_reload_adda_registers(hw,
  1552. iqk_bb_reg,
  1553. rtlphy->iqk_bb_backup, 10);
  1554. return;
  1555. }
  1556. if (start_conttx || singletone)
  1557. return;
  1558. for (i = 0; i < 8; i++) {
  1559. result[0][i] = 0;
  1560. result[1][i] = 0;
  1561. result[2][i] = 0;
  1562. result[3][i] = 0;
  1563. }
  1564. final_candidate = 0xff;
  1565. patha_ok = false;
  1566. pathb_ok = false;
  1567. is12simular = false;
  1568. is23simular = false;
  1569. is13simular = false;
  1570. for (i = 0; i < 3; i++) {
  1571. if (IS_92C_SERIAL(rtlhal->version))
  1572. _rtl92c_phy_iq_calibrate(hw, result, i, true);
  1573. else
  1574. _rtl92c_phy_iq_calibrate(hw, result, i, false);
  1575. if (i == 1) {
  1576. is12simular = _rtl92c_phy_simularity_compare(hw,
  1577. result, 0,
  1578. 1);
  1579. if (is12simular) {
  1580. final_candidate = 0;
  1581. break;
  1582. }
  1583. }
  1584. if (i == 2) {
  1585. is13simular = _rtl92c_phy_simularity_compare(hw,
  1586. result, 0,
  1587. 2);
  1588. if (is13simular) {
  1589. final_candidate = 0;
  1590. break;
  1591. }
  1592. is23simular = _rtl92c_phy_simularity_compare(hw,
  1593. result, 1,
  1594. 2);
  1595. if (is23simular)
  1596. final_candidate = 1;
  1597. else {
  1598. for (i = 0; i < 8; i++)
  1599. reg_tmp += result[3][i];
  1600. if (reg_tmp != 0)
  1601. final_candidate = 3;
  1602. else
  1603. final_candidate = 0xFF;
  1604. }
  1605. }
  1606. }
  1607. for (i = 0; i < 4; i++) {
  1608. reg_e94 = result[i][0];
  1609. reg_e9c = result[i][1];
  1610. reg_ea4 = result[i][2];
  1611. reg_eac = result[i][3];
  1612. reg_eb4 = result[i][4];
  1613. reg_ebc = result[i][5];
  1614. reg_ec4 = result[i][6];
  1615. reg_ecc = result[i][7];
  1616. }
  1617. if (final_candidate != 0xff) {
  1618. rtlphy->reg_e94 = reg_e94 = result[final_candidate][0];
  1619. rtlphy->reg_e9c = reg_e9c = result[final_candidate][1];
  1620. reg_ea4 = result[final_candidate][2];
  1621. reg_eac = result[final_candidate][3];
  1622. rtlphy->reg_eb4 = reg_eb4 = result[final_candidate][4];
  1623. rtlphy->reg_ebc = reg_ebc = result[final_candidate][5];
  1624. reg_ec4 = result[final_candidate][6];
  1625. reg_ecc = result[final_candidate][7];
  1626. patha_ok = pathb_ok = true;
  1627. } else {
  1628. rtlphy->reg_e94 = rtlphy->reg_eb4 = 0x100;
  1629. rtlphy->reg_e9c = rtlphy->reg_ebc = 0x0;
  1630. }
  1631. if (reg_e94 != 0) /*&&(reg_ea4 != 0) */
  1632. _rtl92c_phy_path_a_fill_iqk_matrix(hw, patha_ok, result,
  1633. final_candidate,
  1634. (reg_ea4 == 0));
  1635. if (IS_92C_SERIAL(rtlhal->version)) {
  1636. if (reg_eb4 != 0) /*&&(reg_ec4 != 0) */
  1637. _rtl92c_phy_path_b_fill_iqk_matrix(hw, pathb_ok,
  1638. result,
  1639. final_candidate,
  1640. (reg_ec4 == 0));
  1641. }
  1642. _rtl92c_phy_save_adda_registers(hw, iqk_bb_reg,
  1643. rtlphy->iqk_bb_backup, 10);
  1644. }
  1645. EXPORT_SYMBOL(rtl92c_phy_iq_calibrate);
  1646. void rtl92c_phy_lc_calibrate(struct ieee80211_hw *hw)
  1647. {
  1648. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1649. struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
  1650. bool start_conttx = false, singletone = false;
  1651. if (start_conttx || singletone)
  1652. return;
  1653. if (IS_92C_SERIAL(rtlhal->version))
  1654. rtlpriv->cfg->ops->phy_lc_calibrate(hw, true);
  1655. else
  1656. rtlpriv->cfg->ops->phy_lc_calibrate(hw, false);
  1657. }
  1658. EXPORT_SYMBOL(rtl92c_phy_lc_calibrate);
  1659. void rtl92c_phy_ap_calibrate(struct ieee80211_hw *hw, char delta)
  1660. {
  1661. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1662. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  1663. struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
  1664. if (rtlphy->apk_done)
  1665. return;
  1666. if (IS_92C_SERIAL(rtlhal->version))
  1667. _rtl92c_phy_ap_calibrate(hw, delta, true);
  1668. else
  1669. _rtl92c_phy_ap_calibrate(hw, delta, false);
  1670. }
  1671. EXPORT_SYMBOL(rtl92c_phy_ap_calibrate);
  1672. void rtl92c_phy_set_rfpath_switch(struct ieee80211_hw *hw, bool bmain)
  1673. {
  1674. struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
  1675. if (IS_92C_SERIAL(rtlhal->version))
  1676. _rtl92c_phy_set_rfpath_switch(hw, bmain, true);
  1677. else
  1678. _rtl92c_phy_set_rfpath_switch(hw, bmain, false);
  1679. }
  1680. EXPORT_SYMBOL(rtl92c_phy_set_rfpath_switch);
  1681. bool rtl92c_phy_set_io_cmd(struct ieee80211_hw *hw, enum io_type iotype)
  1682. {
  1683. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1684. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  1685. bool postprocessing = false;
  1686. RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
  1687. ("-->IO Cmd(%#x), set_io_inprogress(%d)\n",
  1688. iotype, rtlphy->set_io_inprogress));
  1689. do {
  1690. switch (iotype) {
  1691. case IO_CMD_RESUME_DM_BY_SCAN:
  1692. RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
  1693. ("[IO CMD] Resume DM after scan.\n"));
  1694. postprocessing = true;
  1695. break;
  1696. case IO_CMD_PAUSE_DM_BY_SCAN:
  1697. RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
  1698. ("[IO CMD] Pause DM before scan.\n"));
  1699. postprocessing = true;
  1700. break;
  1701. default:
  1702. RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
  1703. ("switch case not process\n"));
  1704. break;
  1705. }
  1706. } while (false);
  1707. if (postprocessing && !rtlphy->set_io_inprogress) {
  1708. rtlphy->set_io_inprogress = true;
  1709. rtlphy->current_io_type = iotype;
  1710. } else {
  1711. return false;
  1712. }
  1713. rtl92c_phy_set_io(hw);
  1714. RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE, ("<--IO Type(%#x)\n", iotype));
  1715. return true;
  1716. }
  1717. EXPORT_SYMBOL(rtl92c_phy_set_io_cmd);
  1718. void rtl92c_phy_set_io(struct ieee80211_hw *hw)
  1719. {
  1720. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1721. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  1722. RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
  1723. ("--->Cmd(%#x), set_io_inprogress(%d)\n",
  1724. rtlphy->current_io_type, rtlphy->set_io_inprogress));
  1725. switch (rtlphy->current_io_type) {
  1726. case IO_CMD_RESUME_DM_BY_SCAN:
  1727. dm_digtable.cur_igvalue = rtlphy->initgain_backup.xaagccore1;
  1728. rtl92c_dm_write_dig(hw);
  1729. rtl92c_phy_set_txpower_level(hw, rtlphy->current_channel);
  1730. break;
  1731. case IO_CMD_PAUSE_DM_BY_SCAN:
  1732. rtlphy->initgain_backup.xaagccore1 = dm_digtable.cur_igvalue;
  1733. dm_digtable.cur_igvalue = 0x17;
  1734. rtl92c_dm_write_dig(hw);
  1735. break;
  1736. default:
  1737. RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
  1738. ("switch case not process\n"));
  1739. break;
  1740. }
  1741. rtlphy->set_io_inprogress = false;
  1742. RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
  1743. ("<---(%#x)\n", rtlphy->current_io_type));
  1744. }
  1745. EXPORT_SYMBOL(rtl92c_phy_set_io);
  1746. void rtl92ce_phy_set_rf_on(struct ieee80211_hw *hw)
  1747. {
  1748. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1749. rtl_write_byte(rtlpriv, REG_SPS0_CTRL, 0x2b);
  1750. rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3);
  1751. rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x00);
  1752. rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE2);
  1753. rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3);
  1754. rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00);
  1755. }
  1756. EXPORT_SYMBOL(rtl92ce_phy_set_rf_on);
  1757. void _rtl92c_phy_set_rf_sleep(struct ieee80211_hw *hw)
  1758. {
  1759. u32 u4b_tmp;
  1760. u8 delay = 5;
  1761. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1762. rtl_write_byte(rtlpriv, REG_TXPAUSE, 0xFF);
  1763. rtl_set_rfreg(hw, RF90_PATH_A, 0x00, RFREG_OFFSET_MASK, 0x00);
  1764. rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x40);
  1765. u4b_tmp = rtl_get_rfreg(hw, RF90_PATH_A, 0, RFREG_OFFSET_MASK);
  1766. while (u4b_tmp != 0 && delay > 0) {
  1767. rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x0);
  1768. rtl_set_rfreg(hw, RF90_PATH_A, 0x00, RFREG_OFFSET_MASK, 0x00);
  1769. rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x40);
  1770. u4b_tmp = rtl_get_rfreg(hw, RF90_PATH_A, 0, RFREG_OFFSET_MASK);
  1771. delay--;
  1772. }
  1773. if (delay == 0) {
  1774. rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x00);
  1775. rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE2);
  1776. rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3);
  1777. rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00);
  1778. RT_TRACE(rtlpriv, COMP_POWER, DBG_TRACE,
  1779. ("Switch RF timeout !!!.\n"));
  1780. return;
  1781. }
  1782. rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE2);
  1783. rtl_write_byte(rtlpriv, REG_SPS0_CTRL, 0x22);
  1784. }
  1785. EXPORT_SYMBOL(_rtl92c_phy_set_rf_sleep);