phy_common.c 59 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026
  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. u8 _rtl92c_phy_dbm_to_txpwr_Idx(struct ieee80211_hw *hw,
  567. enum wireless_mode wirelessmode,
  568. long power_indbm)
  569. {
  570. u8 txpwridx;
  571. long offset;
  572. switch (wirelessmode) {
  573. case WIRELESS_MODE_B:
  574. offset = -7;
  575. break;
  576. case WIRELESS_MODE_G:
  577. case WIRELESS_MODE_N_24G:
  578. offset = -8;
  579. break;
  580. default:
  581. offset = -8;
  582. break;
  583. }
  584. if ((power_indbm - offset) > 0)
  585. txpwridx = (u8) ((power_indbm - offset) * 2);
  586. else
  587. txpwridx = 0;
  588. if (txpwridx > MAX_TXPWR_IDX_NMODE_92S)
  589. txpwridx = MAX_TXPWR_IDX_NMODE_92S;
  590. return txpwridx;
  591. }
  592. EXPORT_SYMBOL(_rtl92c_phy_dbm_to_txpwr_Idx);
  593. long _rtl92c_phy_txpwr_idx_to_dbm(struct ieee80211_hw *hw,
  594. enum wireless_mode wirelessmode,
  595. u8 txpwridx)
  596. {
  597. long offset;
  598. long pwrout_dbm;
  599. switch (wirelessmode) {
  600. case WIRELESS_MODE_B:
  601. offset = -7;
  602. break;
  603. case WIRELESS_MODE_G:
  604. case WIRELESS_MODE_N_24G:
  605. offset = -8;
  606. break;
  607. default:
  608. offset = -8;
  609. break;
  610. }
  611. pwrout_dbm = txpwridx / 2 + offset;
  612. return pwrout_dbm;
  613. }
  614. EXPORT_SYMBOL(_rtl92c_phy_txpwr_idx_to_dbm);
  615. void rtl92c_phy_scan_operation_backup(struct ieee80211_hw *hw, u8 operation)
  616. {
  617. struct rtl_priv *rtlpriv = rtl_priv(hw);
  618. struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
  619. enum io_type iotype;
  620. if (!is_hal_stop(rtlhal)) {
  621. switch (operation) {
  622. case SCAN_OPT_BACKUP:
  623. iotype = IO_CMD_PAUSE_DM_BY_SCAN;
  624. rtlpriv->cfg->ops->set_hw_reg(hw,
  625. HW_VAR_IO_CMD,
  626. (u8 *)&iotype);
  627. break;
  628. case SCAN_OPT_RESTORE:
  629. iotype = IO_CMD_RESUME_DM_BY_SCAN;
  630. rtlpriv->cfg->ops->set_hw_reg(hw,
  631. HW_VAR_IO_CMD,
  632. (u8 *)&iotype);
  633. break;
  634. default:
  635. RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
  636. ("Unknown Scan Backup operation.\n"));
  637. break;
  638. }
  639. }
  640. }
  641. EXPORT_SYMBOL(rtl92c_phy_scan_operation_backup);
  642. void rtl92c_phy_set_bw_mode(struct ieee80211_hw *hw,
  643. enum nl80211_channel_type ch_type)
  644. {
  645. struct rtl_priv *rtlpriv = rtl_priv(hw);
  646. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  647. struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
  648. u8 tmp_bw = rtlphy->current_chan_bw;
  649. if (rtlphy->set_bwmode_inprogress)
  650. return;
  651. rtlphy->set_bwmode_inprogress = true;
  652. if ((!is_hal_stop(rtlhal)) && !(RT_CANNOT_IO(hw))) {
  653. rtlpriv->cfg->ops->phy_set_bw_mode_callback(hw);
  654. } else {
  655. RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
  656. ("FALSE driver sleep or unload\n"));
  657. rtlphy->set_bwmode_inprogress = false;
  658. rtlphy->current_chan_bw = tmp_bw;
  659. }
  660. }
  661. EXPORT_SYMBOL(rtl92c_phy_set_bw_mode);
  662. void rtl92c_phy_sw_chnl_callback(struct ieee80211_hw *hw)
  663. {
  664. struct rtl_priv *rtlpriv = rtl_priv(hw);
  665. struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
  666. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  667. u32 delay;
  668. RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE,
  669. ("switch to channel%d\n", rtlphy->current_channel));
  670. if (is_hal_stop(rtlhal))
  671. return;
  672. do {
  673. if (!rtlphy->sw_chnl_inprogress)
  674. break;
  675. if (!_rtl92c_phy_sw_chnl_step_by_step
  676. (hw, rtlphy->current_channel, &rtlphy->sw_chnl_stage,
  677. &rtlphy->sw_chnl_step, &delay)) {
  678. if (delay > 0)
  679. mdelay(delay);
  680. else
  681. continue;
  682. } else {
  683. rtlphy->sw_chnl_inprogress = false;
  684. }
  685. break;
  686. } while (true);
  687. RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, ("<==\n"));
  688. }
  689. EXPORT_SYMBOL(rtl92c_phy_sw_chnl_callback);
  690. u8 rtl92c_phy_sw_chnl(struct ieee80211_hw *hw)
  691. {
  692. struct rtl_priv *rtlpriv = rtl_priv(hw);
  693. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  694. struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
  695. if (rtlphy->sw_chnl_inprogress)
  696. return 0;
  697. if (rtlphy->set_bwmode_inprogress)
  698. return 0;
  699. RT_ASSERT((rtlphy->current_channel <= 14),
  700. ("WIRELESS_MODE_G but channel>14"));
  701. rtlphy->sw_chnl_inprogress = true;
  702. rtlphy->sw_chnl_stage = 0;
  703. rtlphy->sw_chnl_step = 0;
  704. if (!(is_hal_stop(rtlhal)) && !(RT_CANNOT_IO(hw))) {
  705. rtl92c_phy_sw_chnl_callback(hw);
  706. RT_TRACE(rtlpriv, COMP_CHAN, DBG_LOUD,
  707. ("sw_chnl_inprogress false schdule workitem\n"));
  708. rtlphy->sw_chnl_inprogress = false;
  709. } else {
  710. RT_TRACE(rtlpriv, COMP_CHAN, DBG_LOUD,
  711. ("sw_chnl_inprogress false driver sleep or"
  712. " unload\n"));
  713. rtlphy->sw_chnl_inprogress = false;
  714. }
  715. return 1;
  716. }
  717. EXPORT_SYMBOL(rtl92c_phy_sw_chnl);
  718. static bool _rtl92c_phy_set_sw_chnl_cmdarray(struct swchnlcmd *cmdtable,
  719. u32 cmdtableidx, u32 cmdtablesz,
  720. enum swchnlcmd_id cmdid,
  721. u32 para1, u32 para2, u32 msdelay)
  722. {
  723. struct swchnlcmd *pcmd;
  724. if (cmdtable == NULL) {
  725. RT_ASSERT(false, ("cmdtable cannot be NULL.\n"));
  726. return false;
  727. }
  728. if (cmdtableidx >= cmdtablesz)
  729. return false;
  730. pcmd = cmdtable + cmdtableidx;
  731. pcmd->cmdid = cmdid;
  732. pcmd->para1 = para1;
  733. pcmd->para2 = para2;
  734. pcmd->msdelay = msdelay;
  735. return true;
  736. }
  737. bool _rtl92c_phy_sw_chnl_step_by_step(struct ieee80211_hw *hw,
  738. u8 channel, u8 *stage, u8 *step,
  739. u32 *delay)
  740. {
  741. struct rtl_priv *rtlpriv = rtl_priv(hw);
  742. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  743. struct swchnlcmd precommoncmd[MAX_PRECMD_CNT];
  744. u32 precommoncmdcnt;
  745. struct swchnlcmd postcommoncmd[MAX_POSTCMD_CNT];
  746. u32 postcommoncmdcnt;
  747. struct swchnlcmd rfdependcmd[MAX_RFDEPENDCMD_CNT];
  748. u32 rfdependcmdcnt;
  749. struct swchnlcmd *currentcmd = NULL;
  750. u8 rfpath;
  751. u8 num_total_rfpath = rtlphy->num_total_rfpath;
  752. precommoncmdcnt = 0;
  753. _rtl92c_phy_set_sw_chnl_cmdarray(precommoncmd, precommoncmdcnt++,
  754. MAX_PRECMD_CNT,
  755. CMDID_SET_TXPOWEROWER_LEVEL, 0, 0, 0);
  756. _rtl92c_phy_set_sw_chnl_cmdarray(precommoncmd, precommoncmdcnt++,
  757. MAX_PRECMD_CNT, CMDID_END, 0, 0, 0);
  758. postcommoncmdcnt = 0;
  759. _rtl92c_phy_set_sw_chnl_cmdarray(postcommoncmd, postcommoncmdcnt++,
  760. MAX_POSTCMD_CNT, CMDID_END, 0, 0, 0);
  761. rfdependcmdcnt = 0;
  762. RT_ASSERT((channel >= 1 && channel <= 14),
  763. ("illegal channel for Zebra: %d\n", channel));
  764. _rtl92c_phy_set_sw_chnl_cmdarray(rfdependcmd, rfdependcmdcnt++,
  765. MAX_RFDEPENDCMD_CNT, CMDID_RF_WRITEREG,
  766. RF_CHNLBW, channel, 10);
  767. _rtl92c_phy_set_sw_chnl_cmdarray(rfdependcmd, rfdependcmdcnt++,
  768. MAX_RFDEPENDCMD_CNT, CMDID_END, 0, 0,
  769. 0);
  770. do {
  771. switch (*stage) {
  772. case 0:
  773. currentcmd = &precommoncmd[*step];
  774. break;
  775. case 1:
  776. currentcmd = &rfdependcmd[*step];
  777. break;
  778. case 2:
  779. currentcmd = &postcommoncmd[*step];
  780. break;
  781. }
  782. if (currentcmd->cmdid == CMDID_END) {
  783. if ((*stage) == 2) {
  784. return true;
  785. } else {
  786. (*stage)++;
  787. (*step) = 0;
  788. continue;
  789. }
  790. }
  791. switch (currentcmd->cmdid) {
  792. case CMDID_SET_TXPOWEROWER_LEVEL:
  793. rtl92c_phy_set_txpower_level(hw, channel);
  794. break;
  795. case CMDID_WRITEPORT_ULONG:
  796. rtl_write_dword(rtlpriv, currentcmd->para1,
  797. currentcmd->para2);
  798. break;
  799. case CMDID_WRITEPORT_USHORT:
  800. rtl_write_word(rtlpriv, currentcmd->para1,
  801. (u16) currentcmd->para2);
  802. break;
  803. case CMDID_WRITEPORT_UCHAR:
  804. rtl_write_byte(rtlpriv, currentcmd->para1,
  805. (u8) currentcmd->para2);
  806. break;
  807. case CMDID_RF_WRITEREG:
  808. for (rfpath = 0; rfpath < num_total_rfpath; rfpath++) {
  809. rtlphy->rfreg_chnlval[rfpath] =
  810. ((rtlphy->rfreg_chnlval[rfpath] &
  811. 0xfffffc00) | currentcmd->para2);
  812. rtl_set_rfreg(hw, (enum radio_path)rfpath,
  813. currentcmd->para1,
  814. RFREG_OFFSET_MASK,
  815. rtlphy->rfreg_chnlval[rfpath]);
  816. }
  817. break;
  818. default:
  819. RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
  820. ("switch case not process\n"));
  821. break;
  822. }
  823. break;
  824. } while (true);
  825. (*delay) = currentcmd->msdelay;
  826. (*step)++;
  827. return false;
  828. }
  829. bool rtl8192_phy_check_is_legal_rfpath(struct ieee80211_hw *hw, u32 rfpath)
  830. {
  831. return true;
  832. }
  833. EXPORT_SYMBOL(rtl8192_phy_check_is_legal_rfpath);
  834. static u8 _rtl92c_phy_path_a_iqk(struct ieee80211_hw *hw, bool config_pathb)
  835. {
  836. u32 reg_eac, reg_e94, reg_e9c, reg_ea4;
  837. u8 result = 0x00;
  838. rtl_set_bbreg(hw, 0xe30, MASKDWORD, 0x10008c1f);
  839. rtl_set_bbreg(hw, 0xe34, MASKDWORD, 0x10008c1f);
  840. rtl_set_bbreg(hw, 0xe38, MASKDWORD, 0x82140102);
  841. rtl_set_bbreg(hw, 0xe3c, MASKDWORD,
  842. config_pathb ? 0x28160202 : 0x28160502);
  843. if (config_pathb) {
  844. rtl_set_bbreg(hw, 0xe50, MASKDWORD, 0x10008c22);
  845. rtl_set_bbreg(hw, 0xe54, MASKDWORD, 0x10008c22);
  846. rtl_set_bbreg(hw, 0xe58, MASKDWORD, 0x82140102);
  847. rtl_set_bbreg(hw, 0xe5c, MASKDWORD, 0x28160202);
  848. }
  849. rtl_set_bbreg(hw, 0xe4c, MASKDWORD, 0x001028d1);
  850. rtl_set_bbreg(hw, 0xe48, MASKDWORD, 0xf9000000);
  851. rtl_set_bbreg(hw, 0xe48, MASKDWORD, 0xf8000000);
  852. mdelay(IQK_DELAY_TIME);
  853. reg_eac = rtl_get_bbreg(hw, 0xeac, MASKDWORD);
  854. reg_e94 = rtl_get_bbreg(hw, 0xe94, MASKDWORD);
  855. reg_e9c = rtl_get_bbreg(hw, 0xe9c, MASKDWORD);
  856. reg_ea4 = rtl_get_bbreg(hw, 0xea4, MASKDWORD);
  857. if (!(reg_eac & BIT(28)) &&
  858. (((reg_e94 & 0x03FF0000) >> 16) != 0x142) &&
  859. (((reg_e9c & 0x03FF0000) >> 16) != 0x42))
  860. result |= 0x01;
  861. else
  862. return result;
  863. if (!(reg_eac & BIT(27)) &&
  864. (((reg_ea4 & 0x03FF0000) >> 16) != 0x132) &&
  865. (((reg_eac & 0x03FF0000) >> 16) != 0x36))
  866. result |= 0x02;
  867. return result;
  868. }
  869. static u8 _rtl92c_phy_path_b_iqk(struct ieee80211_hw *hw)
  870. {
  871. u32 reg_eac, reg_eb4, reg_ebc, reg_ec4, reg_ecc;
  872. u8 result = 0x00;
  873. rtl_set_bbreg(hw, 0xe60, MASKDWORD, 0x00000002);
  874. rtl_set_bbreg(hw, 0xe60, MASKDWORD, 0x00000000);
  875. mdelay(IQK_DELAY_TIME);
  876. reg_eac = rtl_get_bbreg(hw, 0xeac, MASKDWORD);
  877. reg_eb4 = rtl_get_bbreg(hw, 0xeb4, MASKDWORD);
  878. reg_ebc = rtl_get_bbreg(hw, 0xebc, MASKDWORD);
  879. reg_ec4 = rtl_get_bbreg(hw, 0xec4, MASKDWORD);
  880. reg_ecc = rtl_get_bbreg(hw, 0xecc, MASKDWORD);
  881. if (!(reg_eac & BIT(31)) &&
  882. (((reg_eb4 & 0x03FF0000) >> 16) != 0x142) &&
  883. (((reg_ebc & 0x03FF0000) >> 16) != 0x42))
  884. result |= 0x01;
  885. else
  886. return result;
  887. if (!(reg_eac & BIT(30)) &&
  888. (((reg_ec4 & 0x03FF0000) >> 16) != 0x132) &&
  889. (((reg_ecc & 0x03FF0000) >> 16) != 0x36))
  890. result |= 0x02;
  891. return result;
  892. }
  893. static void _rtl92c_phy_path_a_fill_iqk_matrix(struct ieee80211_hw *hw,
  894. bool iqk_ok, long result[][8],
  895. u8 final_candidate, bool btxonly)
  896. {
  897. u32 oldval_0, x, tx0_a, reg;
  898. long y, tx0_c;
  899. if (final_candidate == 0xFF) {
  900. return;
  901. } else if (iqk_ok) {
  902. oldval_0 = (rtl_get_bbreg(hw, ROFDM0_XATXIQIMBALANCE,
  903. MASKDWORD) >> 22) & 0x3FF;
  904. x = result[final_candidate][0];
  905. if ((x & 0x00000200) != 0)
  906. x = x | 0xFFFFFC00;
  907. tx0_a = (x * oldval_0) >> 8;
  908. rtl_set_bbreg(hw, ROFDM0_XATXIQIMBALANCE, 0x3FF, tx0_a);
  909. rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(31),
  910. ((x * oldval_0 >> 7) & 0x1));
  911. y = result[final_candidate][1];
  912. if ((y & 0x00000200) != 0)
  913. y = y | 0xFFFFFC00;
  914. tx0_c = (y * oldval_0) >> 8;
  915. rtl_set_bbreg(hw, ROFDM0_XCTXAFE, 0xF0000000,
  916. ((tx0_c & 0x3C0) >> 6));
  917. rtl_set_bbreg(hw, ROFDM0_XATXIQIMBALANCE, 0x003F0000,
  918. (tx0_c & 0x3F));
  919. rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(29),
  920. ((y * oldval_0 >> 7) & 0x1));
  921. if (btxonly)
  922. return;
  923. reg = result[final_candidate][2];
  924. rtl_set_bbreg(hw, ROFDM0_XARXIQIMBALANCE, 0x3FF, reg);
  925. reg = result[final_candidate][3] & 0x3F;
  926. rtl_set_bbreg(hw, ROFDM0_XARXIQIMBALANCE, 0xFC00, reg);
  927. reg = (result[final_candidate][3] >> 6) & 0xF;
  928. rtl_set_bbreg(hw, 0xca0, 0xF0000000, reg);
  929. }
  930. }
  931. static void _rtl92c_phy_path_b_fill_iqk_matrix(struct ieee80211_hw *hw,
  932. bool iqk_ok, long result[][8],
  933. u8 final_candidate, bool btxonly)
  934. {
  935. u32 oldval_1, x, tx1_a, reg;
  936. long y, tx1_c;
  937. if (final_candidate == 0xFF) {
  938. return;
  939. } else if (iqk_ok) {
  940. oldval_1 = (rtl_get_bbreg(hw, ROFDM0_XBTXIQIMBALANCE,
  941. MASKDWORD) >> 22) & 0x3FF;
  942. x = result[final_candidate][4];
  943. if ((x & 0x00000200) != 0)
  944. x = x | 0xFFFFFC00;
  945. tx1_a = (x * oldval_1) >> 8;
  946. rtl_set_bbreg(hw, ROFDM0_XBTXIQIMBALANCE, 0x3FF, tx1_a);
  947. rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(27),
  948. ((x * oldval_1 >> 7) & 0x1));
  949. y = result[final_candidate][5];
  950. if ((y & 0x00000200) != 0)
  951. y = y | 0xFFFFFC00;
  952. tx1_c = (y * oldval_1) >> 8;
  953. rtl_set_bbreg(hw, ROFDM0_XDTXAFE, 0xF0000000,
  954. ((tx1_c & 0x3C0) >> 6));
  955. rtl_set_bbreg(hw, ROFDM0_XBTXIQIMBALANCE, 0x003F0000,
  956. (tx1_c & 0x3F));
  957. rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(25),
  958. ((y * oldval_1 >> 7) & 0x1));
  959. if (btxonly)
  960. return;
  961. reg = result[final_candidate][6];
  962. rtl_set_bbreg(hw, ROFDM0_XBRXIQIMBALANCE, 0x3FF, reg);
  963. reg = result[final_candidate][7] & 0x3F;
  964. rtl_set_bbreg(hw, ROFDM0_XBRXIQIMBALANCE, 0xFC00, reg);
  965. reg = (result[final_candidate][7] >> 6) & 0xF;
  966. rtl_set_bbreg(hw, ROFDM0_AGCRSSITABLE, 0x0000F000, reg);
  967. }
  968. }
  969. static void _rtl92c_phy_save_adda_registers(struct ieee80211_hw *hw,
  970. u32 *addareg, u32 *addabackup,
  971. u32 registernum)
  972. {
  973. u32 i;
  974. for (i = 0; i < registernum; i++)
  975. addabackup[i] = rtl_get_bbreg(hw, addareg[i], MASKDWORD);
  976. }
  977. static void _rtl92c_phy_save_mac_registers(struct ieee80211_hw *hw,
  978. u32 *macreg, u32 *macbackup)
  979. {
  980. struct rtl_priv *rtlpriv = rtl_priv(hw);
  981. u32 i;
  982. for (i = 0; i < (IQK_MAC_REG_NUM - 1); i++)
  983. macbackup[i] = rtl_read_byte(rtlpriv, macreg[i]);
  984. macbackup[i] = rtl_read_dword(rtlpriv, macreg[i]);
  985. }
  986. static void _rtl92c_phy_reload_adda_registers(struct ieee80211_hw *hw,
  987. u32 *addareg, u32 *addabackup,
  988. u32 regiesternum)
  989. {
  990. u32 i;
  991. for (i = 0; i < regiesternum; i++)
  992. rtl_set_bbreg(hw, addareg[i], MASKDWORD, addabackup[i]);
  993. }
  994. static void _rtl92c_phy_reload_mac_registers(struct ieee80211_hw *hw,
  995. u32 *macreg, u32 *macbackup)
  996. {
  997. struct rtl_priv *rtlpriv = rtl_priv(hw);
  998. u32 i;
  999. for (i = 0; i < (IQK_MAC_REG_NUM - 1); i++)
  1000. rtl_write_byte(rtlpriv, macreg[i], (u8) macbackup[i]);
  1001. rtl_write_dword(rtlpriv, macreg[i], macbackup[i]);
  1002. }
  1003. static void _rtl92c_phy_path_adda_on(struct ieee80211_hw *hw,
  1004. u32 *addareg, bool is_patha_on, bool is2t)
  1005. {
  1006. u32 pathOn;
  1007. u32 i;
  1008. pathOn = is_patha_on ? 0x04db25a4 : 0x0b1b25a4;
  1009. if (false == is2t) {
  1010. pathOn = 0x0bdb25a0;
  1011. rtl_set_bbreg(hw, addareg[0], MASKDWORD, 0x0b1b25a0);
  1012. } else {
  1013. rtl_set_bbreg(hw, addareg[0], MASKDWORD, pathOn);
  1014. }
  1015. for (i = 1; i < IQK_ADDA_REG_NUM; i++)
  1016. rtl_set_bbreg(hw, addareg[i], MASKDWORD, pathOn);
  1017. }
  1018. static void _rtl92c_phy_mac_setting_calibration(struct ieee80211_hw *hw,
  1019. u32 *macreg, u32 *macbackup)
  1020. {
  1021. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1022. u32 i;
  1023. rtl_write_byte(rtlpriv, macreg[0], 0x3F);
  1024. for (i = 1; i < (IQK_MAC_REG_NUM - 1); i++)
  1025. rtl_write_byte(rtlpriv, macreg[i],
  1026. (u8) (macbackup[i] & (~BIT(3))));
  1027. rtl_write_byte(rtlpriv, macreg[i], (u8) (macbackup[i] & (~BIT(5))));
  1028. }
  1029. static void _rtl92c_phy_path_a_standby(struct ieee80211_hw *hw)
  1030. {
  1031. rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x0);
  1032. rtl_set_bbreg(hw, 0x840, MASKDWORD, 0x00010000);
  1033. rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x80800000);
  1034. }
  1035. static void _rtl92c_phy_pi_mode_switch(struct ieee80211_hw *hw, bool pi_mode)
  1036. {
  1037. u32 mode;
  1038. mode = pi_mode ? 0x01000100 : 0x01000000;
  1039. rtl_set_bbreg(hw, 0x820, MASKDWORD, mode);
  1040. rtl_set_bbreg(hw, 0x828, MASKDWORD, mode);
  1041. }
  1042. static bool _rtl92c_phy_simularity_compare(struct ieee80211_hw *hw,
  1043. long result[][8], u8 c1, u8 c2)
  1044. {
  1045. u32 i, j, diff, simularity_bitmap, bound;
  1046. struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
  1047. u8 final_candidate[2] = { 0xFF, 0xFF };
  1048. bool bresult = true, is2t = IS_92C_SERIAL(rtlhal->version);
  1049. if (is2t)
  1050. bound = 8;
  1051. else
  1052. bound = 4;
  1053. simularity_bitmap = 0;
  1054. for (i = 0; i < bound; i++) {
  1055. diff = (result[c1][i] > result[c2][i]) ?
  1056. (result[c1][i] - result[c2][i]) :
  1057. (result[c2][i] - result[c1][i]);
  1058. if (diff > MAX_TOLERANCE) {
  1059. if ((i == 2 || i == 6) && !simularity_bitmap) {
  1060. if (result[c1][i] + result[c1][i + 1] == 0)
  1061. final_candidate[(i / 4)] = c2;
  1062. else if (result[c2][i] + result[c2][i + 1] == 0)
  1063. final_candidate[(i / 4)] = c1;
  1064. else
  1065. simularity_bitmap = simularity_bitmap |
  1066. (1 << i);
  1067. } else
  1068. simularity_bitmap =
  1069. simularity_bitmap | (1 << i);
  1070. }
  1071. }
  1072. if (simularity_bitmap == 0) {
  1073. for (i = 0; i < (bound / 4); i++) {
  1074. if (final_candidate[i] != 0xFF) {
  1075. for (j = i * 4; j < (i + 1) * 4 - 2; j++)
  1076. result[3][j] =
  1077. result[final_candidate[i]][j];
  1078. bresult = false;
  1079. }
  1080. }
  1081. return bresult;
  1082. } else if (!(simularity_bitmap & 0x0F)) {
  1083. for (i = 0; i < 4; i++)
  1084. result[3][i] = result[c1][i];
  1085. return false;
  1086. } else if (!(simularity_bitmap & 0xF0) && is2t) {
  1087. for (i = 4; i < 8; i++)
  1088. result[3][i] = result[c1][i];
  1089. return false;
  1090. } else {
  1091. return false;
  1092. }
  1093. }
  1094. static void _rtl92c_phy_iq_calibrate(struct ieee80211_hw *hw,
  1095. long result[][8], u8 t, bool is2t)
  1096. {
  1097. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1098. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  1099. u32 i;
  1100. u8 patha_ok, pathb_ok;
  1101. u32 adda_reg[IQK_ADDA_REG_NUM] = {
  1102. 0x85c, 0xe6c, 0xe70, 0xe74,
  1103. 0xe78, 0xe7c, 0xe80, 0xe84,
  1104. 0xe88, 0xe8c, 0xed0, 0xed4,
  1105. 0xed8, 0xedc, 0xee0, 0xeec
  1106. };
  1107. u32 iqk_mac_reg[IQK_MAC_REG_NUM] = {
  1108. 0x522, 0x550, 0x551, 0x040
  1109. };
  1110. const u32 retrycount = 2;
  1111. if (t == 0) {
  1112. /* dummy read */
  1113. rtl_get_bbreg(hw, 0x800, MASKDWORD);
  1114. _rtl92c_phy_save_adda_registers(hw, adda_reg,
  1115. rtlphy->adda_backup, 16);
  1116. _rtl92c_phy_save_mac_registers(hw, iqk_mac_reg,
  1117. rtlphy->iqk_mac_backup);
  1118. }
  1119. _rtl92c_phy_path_adda_on(hw, adda_reg, true, is2t);
  1120. if (t == 0) {
  1121. rtlphy->rfpi_enable = (u8) rtl_get_bbreg(hw,
  1122. RFPGA0_XA_HSSIPARAMETER1,
  1123. BIT(8));
  1124. }
  1125. if (!rtlphy->rfpi_enable)
  1126. _rtl92c_phy_pi_mode_switch(hw, true);
  1127. if (t == 0) {
  1128. rtlphy->reg_c04 = rtl_get_bbreg(hw, 0xc04, MASKDWORD);
  1129. rtlphy->reg_c08 = rtl_get_bbreg(hw, 0xc08, MASKDWORD);
  1130. rtlphy->reg_874 = rtl_get_bbreg(hw, 0x874, MASKDWORD);
  1131. }
  1132. rtl_set_bbreg(hw, 0xc04, MASKDWORD, 0x03a05600);
  1133. rtl_set_bbreg(hw, 0xc08, MASKDWORD, 0x000800e4);
  1134. rtl_set_bbreg(hw, 0x874, MASKDWORD, 0x22204000);
  1135. if (is2t) {
  1136. rtl_set_bbreg(hw, 0x840, MASKDWORD, 0x00010000);
  1137. rtl_set_bbreg(hw, 0x844, MASKDWORD, 0x00010000);
  1138. }
  1139. _rtl92c_phy_mac_setting_calibration(hw, iqk_mac_reg,
  1140. rtlphy->iqk_mac_backup);
  1141. rtl_set_bbreg(hw, 0xb68, MASKDWORD, 0x00080000);
  1142. if (is2t)
  1143. rtl_set_bbreg(hw, 0xb6c, MASKDWORD, 0x00080000);
  1144. rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x80800000);
  1145. rtl_set_bbreg(hw, 0xe40, MASKDWORD, 0x01007c00);
  1146. rtl_set_bbreg(hw, 0xe44, MASKDWORD, 0x01004800);
  1147. for (i = 0; i < retrycount; i++) {
  1148. patha_ok = _rtl92c_phy_path_a_iqk(hw, is2t);
  1149. if (patha_ok == 0x03) {
  1150. result[t][0] = (rtl_get_bbreg(hw, 0xe94, MASKDWORD) &
  1151. 0x3FF0000) >> 16;
  1152. result[t][1] = (rtl_get_bbreg(hw, 0xe9c, MASKDWORD) &
  1153. 0x3FF0000) >> 16;
  1154. result[t][2] = (rtl_get_bbreg(hw, 0xea4, MASKDWORD) &
  1155. 0x3FF0000) >> 16;
  1156. result[t][3] = (rtl_get_bbreg(hw, 0xeac, MASKDWORD) &
  1157. 0x3FF0000) >> 16;
  1158. break;
  1159. } else if (i == (retrycount - 1) && patha_ok == 0x01)
  1160. result[t][0] = (rtl_get_bbreg(hw, 0xe94,
  1161. MASKDWORD) & 0x3FF0000) >>
  1162. 16;
  1163. result[t][1] =
  1164. (rtl_get_bbreg(hw, 0xe9c, MASKDWORD) & 0x3FF0000) >> 16;
  1165. }
  1166. if (is2t) {
  1167. _rtl92c_phy_path_a_standby(hw);
  1168. _rtl92c_phy_path_adda_on(hw, adda_reg, false, is2t);
  1169. for (i = 0; i < retrycount; i++) {
  1170. pathb_ok = _rtl92c_phy_path_b_iqk(hw);
  1171. if (pathb_ok == 0x03) {
  1172. result[t][4] = (rtl_get_bbreg(hw,
  1173. 0xeb4,
  1174. MASKDWORD) &
  1175. 0x3FF0000) >> 16;
  1176. result[t][5] =
  1177. (rtl_get_bbreg(hw, 0xebc, MASKDWORD) &
  1178. 0x3FF0000) >> 16;
  1179. result[t][6] =
  1180. (rtl_get_bbreg(hw, 0xec4, MASKDWORD) &
  1181. 0x3FF0000) >> 16;
  1182. result[t][7] =
  1183. (rtl_get_bbreg(hw, 0xecc, MASKDWORD) &
  1184. 0x3FF0000) >> 16;
  1185. break;
  1186. } else if (i == (retrycount - 1) && pathb_ok == 0x01) {
  1187. result[t][4] = (rtl_get_bbreg(hw,
  1188. 0xeb4,
  1189. MASKDWORD) &
  1190. 0x3FF0000) >> 16;
  1191. }
  1192. result[t][5] = (rtl_get_bbreg(hw, 0xebc, MASKDWORD) &
  1193. 0x3FF0000) >> 16;
  1194. }
  1195. }
  1196. rtl_set_bbreg(hw, 0xc04, MASKDWORD, rtlphy->reg_c04);
  1197. rtl_set_bbreg(hw, 0x874, MASKDWORD, rtlphy->reg_874);
  1198. rtl_set_bbreg(hw, 0xc08, MASKDWORD, rtlphy->reg_c08);
  1199. rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0);
  1200. rtl_set_bbreg(hw, 0x840, MASKDWORD, 0x00032ed3);
  1201. if (is2t)
  1202. rtl_set_bbreg(hw, 0x844, MASKDWORD, 0x00032ed3);
  1203. if (t != 0) {
  1204. if (!rtlphy->rfpi_enable)
  1205. _rtl92c_phy_pi_mode_switch(hw, false);
  1206. _rtl92c_phy_reload_adda_registers(hw, adda_reg,
  1207. rtlphy->adda_backup, 16);
  1208. _rtl92c_phy_reload_mac_registers(hw, iqk_mac_reg,
  1209. rtlphy->iqk_mac_backup);
  1210. }
  1211. }
  1212. static void _rtl92c_phy_ap_calibrate(struct ieee80211_hw *hw,
  1213. char delta, bool is2t)
  1214. {
  1215. #if 0 /* This routine is deliberately dummied out for later fixes */
  1216. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1217. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  1218. struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
  1219. u32 reg_d[PATH_NUM];
  1220. u32 tmpreg, index, offset, path, i, pathbound = PATH_NUM, apkbound;
  1221. u32 bb_backup[APK_BB_REG_NUM];
  1222. u32 bb_reg[APK_BB_REG_NUM] = {
  1223. 0x904, 0xc04, 0x800, 0xc08, 0x874
  1224. };
  1225. u32 bb_ap_mode[APK_BB_REG_NUM] = {
  1226. 0x00000020, 0x00a05430, 0x02040000,
  1227. 0x000800e4, 0x00204000
  1228. };
  1229. u32 bb_normal_ap_mode[APK_BB_REG_NUM] = {
  1230. 0x00000020, 0x00a05430, 0x02040000,
  1231. 0x000800e4, 0x22204000
  1232. };
  1233. u32 afe_backup[APK_AFE_REG_NUM];
  1234. u32 afe_reg[APK_AFE_REG_NUM] = {
  1235. 0x85c, 0xe6c, 0xe70, 0xe74, 0xe78,
  1236. 0xe7c, 0xe80, 0xe84, 0xe88, 0xe8c,
  1237. 0xed0, 0xed4, 0xed8, 0xedc, 0xee0,
  1238. 0xeec
  1239. };
  1240. u32 mac_backup[IQK_MAC_REG_NUM];
  1241. u32 mac_reg[IQK_MAC_REG_NUM] = {
  1242. 0x522, 0x550, 0x551, 0x040
  1243. };
  1244. u32 apk_rf_init_value[PATH_NUM][APK_BB_REG_NUM] = {
  1245. {0x0852c, 0x1852c, 0x5852c, 0x1852c, 0x5852c},
  1246. {0x2852e, 0x0852e, 0x3852e, 0x0852e, 0x0852e}
  1247. };
  1248. u32 apk_normal_rf_init_value[PATH_NUM][APK_BB_REG_NUM] = {
  1249. {0x0852c, 0x0a52c, 0x3a52c, 0x5a52c, 0x5a52c},
  1250. {0x0852c, 0x0a52c, 0x5a52c, 0x5a52c, 0x5a52c}
  1251. };
  1252. u32 apk_rf_value_0[PATH_NUM][APK_BB_REG_NUM] = {
  1253. {0x52019, 0x52014, 0x52013, 0x5200f, 0x5208d},
  1254. {0x5201a, 0x52019, 0x52016, 0x52033, 0x52050}
  1255. };
  1256. u32 apk_normal_rf_value_0[PATH_NUM][APK_BB_REG_NUM] = {
  1257. {0x52019, 0x52017, 0x52010, 0x5200d, 0x5206a},
  1258. {0x52019, 0x52017, 0x52010, 0x5200d, 0x5206a}
  1259. };
  1260. u32 afe_on_off[PATH_NUM] = {
  1261. 0x04db25a4, 0x0b1b25a4
  1262. };
  1263. const u32 apk_offset[PATH_NUM] = { 0xb68, 0xb6c };
  1264. u32 apk_normal_offset[PATH_NUM] = { 0xb28, 0xb98 };
  1265. u32 apk_value[PATH_NUM] = { 0x92fc0000, 0x12fc0000 };
  1266. u32 apk_normal_value[PATH_NUM] = { 0x92680000, 0x12680000 };
  1267. const char apk_delta_mapping[APK_BB_REG_NUM][13] = {
  1268. {-4, -3, -2, -2, -1, -1, 0, 1, 2, 3, 4, 5, 6},
  1269. {-4, -3, -2, -2, -1, -1, 0, 1, 2, 3, 4, 5, 6},
  1270. {-6, -4, -2, -2, -1, -1, 0, 1, 2, 3, 4, 5, 6},
  1271. {-1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6},
  1272. {-11, -9, -7, -5, -3, -1, 0, 0, 0, 0, 0, 0, 0}
  1273. };
  1274. const u32 apk_normal_setting_value_1[13] = {
  1275. 0x01017018, 0xf7ed8f84, 0x1b1a1816, 0x2522201e, 0x322e2b28,
  1276. 0x433f3a36, 0x5b544e49, 0x7b726a62, 0xa69a8f84, 0xdfcfc0b3,
  1277. 0x12680000, 0x00880000, 0x00880000
  1278. };
  1279. const u32 apk_normal_setting_value_2[16] = {
  1280. 0x01c7021d, 0x01670183, 0x01000123, 0x00bf00e2, 0x008d00a3,
  1281. 0x0068007b, 0x004d0059, 0x003a0042, 0x002b0031, 0x001f0025,
  1282. 0x0017001b, 0x00110014, 0x000c000f, 0x0009000b, 0x00070008,
  1283. 0x00050006
  1284. };
  1285. u32 apk_result[PATH_NUM][APK_BB_REG_NUM];
  1286. long bb_offset, delta_v, delta_offset;
  1287. if (!is2t)
  1288. pathbound = 1;
  1289. return;
  1290. for (index = 0; index < PATH_NUM; index++) {
  1291. apk_offset[index] = apk_normal_offset[index];
  1292. apk_value[index] = apk_normal_value[index];
  1293. afe_on_off[index] = 0x6fdb25a4;
  1294. }
  1295. for (index = 0; index < APK_BB_REG_NUM; index++) {
  1296. for (path = 0; path < pathbound; path++) {
  1297. apk_rf_init_value[path][index] =
  1298. apk_normal_rf_init_value[path][index];
  1299. apk_rf_value_0[path][index] =
  1300. apk_normal_rf_value_0[path][index];
  1301. }
  1302. bb_ap_mode[index] = bb_normal_ap_mode[index];
  1303. apkbound = 6;
  1304. }
  1305. for (index = 0; index < APK_BB_REG_NUM; index++) {
  1306. if (index == 0)
  1307. continue;
  1308. bb_backup[index] = rtl_get_bbreg(hw, bb_reg[index], MASKDWORD);
  1309. }
  1310. _rtl92c_phy_save_mac_registers(hw, mac_reg, mac_backup);
  1311. _rtl92c_phy_save_adda_registers(hw, afe_reg, afe_backup, 16);
  1312. for (path = 0; path < pathbound; path++) {
  1313. if (path == RF90_PATH_A) {
  1314. offset = 0xb00;
  1315. for (index = 0; index < 11; index++) {
  1316. rtl_set_bbreg(hw, offset, MASKDWORD,
  1317. apk_normal_setting_value_1
  1318. [index]);
  1319. offset += 0x04;
  1320. }
  1321. rtl_set_bbreg(hw, 0xb98, MASKDWORD, 0x12680000);
  1322. offset = 0xb68;
  1323. for (; index < 13; index++) {
  1324. rtl_set_bbreg(hw, offset, MASKDWORD,
  1325. apk_normal_setting_value_1
  1326. [index]);
  1327. offset += 0x04;
  1328. }
  1329. rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x40000000);
  1330. offset = 0xb00;
  1331. for (index = 0; index < 16; index++) {
  1332. rtl_set_bbreg(hw, offset, MASKDWORD,
  1333. apk_normal_setting_value_2
  1334. [index]);
  1335. offset += 0x04;
  1336. }
  1337. rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x00000000);
  1338. } else if (path == RF90_PATH_B) {
  1339. offset = 0xb70;
  1340. for (index = 0; index < 10; index++) {
  1341. rtl_set_bbreg(hw, offset, MASKDWORD,
  1342. apk_normal_setting_value_1
  1343. [index]);
  1344. offset += 0x04;
  1345. }
  1346. rtl_set_bbreg(hw, 0xb28, MASKDWORD, 0x12680000);
  1347. rtl_set_bbreg(hw, 0xb98, MASKDWORD, 0x12680000);
  1348. offset = 0xb68;
  1349. index = 11;
  1350. for (; index < 13; index++) {
  1351. rtl_set_bbreg(hw, offset, MASKDWORD,
  1352. apk_normal_setting_value_1
  1353. [index]);
  1354. offset += 0x04;
  1355. }
  1356. rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x40000000);
  1357. offset = 0xb60;
  1358. for (index = 0; index < 16; index++) {
  1359. rtl_set_bbreg(hw, offset, MASKDWORD,
  1360. apk_normal_setting_value_2
  1361. [index]);
  1362. offset += 0x04;
  1363. }
  1364. rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x00000000);
  1365. }
  1366. reg_d[path] = rtl_get_rfreg(hw, (enum radio_path)path,
  1367. 0xd, MASKDWORD);
  1368. for (index = 0; index < APK_AFE_REG_NUM; index++)
  1369. rtl_set_bbreg(hw, afe_reg[index], MASKDWORD,
  1370. afe_on_off[path]);
  1371. if (path == RF90_PATH_A) {
  1372. for (index = 0; index < APK_BB_REG_NUM; index++) {
  1373. if (index == 0)
  1374. continue;
  1375. rtl_set_bbreg(hw, bb_reg[index], MASKDWORD,
  1376. bb_ap_mode[index]);
  1377. }
  1378. }
  1379. _rtl92c_phy_mac_setting_calibration(hw, mac_reg, mac_backup);
  1380. if (path == 0) {
  1381. rtl_set_rfreg(hw, RF90_PATH_B, 0x0, MASKDWORD, 0x10000);
  1382. } else {
  1383. rtl_set_rfreg(hw, RF90_PATH_A, 0x00, MASKDWORD,
  1384. 0x10000);
  1385. rtl_set_rfreg(hw, RF90_PATH_A, 0x10, MASKDWORD,
  1386. 0x1000f);
  1387. rtl_set_rfreg(hw, RF90_PATH_A, 0x11, MASKDWORD,
  1388. 0x20103);
  1389. }
  1390. delta_offset = ((delta + 14) / 2);
  1391. if (delta_offset < 0)
  1392. delta_offset = 0;
  1393. else if (delta_offset > 12)
  1394. delta_offset = 12;
  1395. for (index = 0; index < APK_BB_REG_NUM; index++) {
  1396. if (index != 1)
  1397. continue;
  1398. tmpreg = apk_rf_init_value[path][index];
  1399. if (!rtlefuse->apk_thermalmeterignore) {
  1400. bb_offset = (tmpreg & 0xF0000) >> 16;
  1401. if (!(tmpreg & BIT(15)))
  1402. bb_offset = -bb_offset;
  1403. delta_v =
  1404. apk_delta_mapping[index][delta_offset];
  1405. bb_offset += delta_v;
  1406. if (bb_offset < 0) {
  1407. tmpreg = tmpreg & (~BIT(15));
  1408. bb_offset = -bb_offset;
  1409. } else {
  1410. tmpreg = tmpreg | BIT(15);
  1411. }
  1412. tmpreg =
  1413. (tmpreg & 0xFFF0FFFF) | (bb_offset << 16);
  1414. }
  1415. rtl_set_rfreg(hw, (enum radio_path)path, 0xc,
  1416. MASKDWORD, 0x8992e);
  1417. rtl_set_rfreg(hw, (enum radio_path)path, 0x0,
  1418. MASKDWORD, apk_rf_value_0[path][index]);
  1419. rtl_set_rfreg(hw, (enum radio_path)path, 0xd,
  1420. MASKDWORD, tmpreg);
  1421. i = 0;
  1422. do {
  1423. rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x80000000);
  1424. rtl_set_bbreg(hw, apk_offset[path],
  1425. MASKDWORD, apk_value[0]);
  1426. RTPRINT(rtlpriv, FINIT, INIT_IQK,
  1427. ("PHY_APCalibrate() offset 0x%x "
  1428. "value 0x%x\n",
  1429. apk_offset[path],
  1430. rtl_get_bbreg(hw, apk_offset[path],
  1431. MASKDWORD)));
  1432. mdelay(3);
  1433. rtl_set_bbreg(hw, apk_offset[path],
  1434. MASKDWORD, apk_value[1]);
  1435. RTPRINT(rtlpriv, FINIT, INIT_IQK,
  1436. ("PHY_APCalibrate() offset 0x%x "
  1437. "value 0x%x\n",
  1438. apk_offset[path],
  1439. rtl_get_bbreg(hw, apk_offset[path],
  1440. MASKDWORD)));
  1441. mdelay(20);
  1442. rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x00000000);
  1443. if (path == RF90_PATH_A)
  1444. tmpreg = rtl_get_bbreg(hw, 0xbd8,
  1445. 0x03E00000);
  1446. else
  1447. tmpreg = rtl_get_bbreg(hw, 0xbd8,
  1448. 0xF8000000);
  1449. RTPRINT(rtlpriv, FINIT, INIT_IQK,
  1450. ("PHY_APCalibrate() offset "
  1451. "0xbd8[25:21] %x\n", tmpreg));
  1452. i++;
  1453. } while (tmpreg > apkbound && i < 4);
  1454. apk_result[path][index] = tmpreg;
  1455. }
  1456. }
  1457. _rtl92c_phy_reload_mac_registers(hw, mac_reg, mac_backup);
  1458. for (index = 0; index < APK_BB_REG_NUM; index++) {
  1459. if (index == 0)
  1460. continue;
  1461. rtl_set_bbreg(hw, bb_reg[index], MASKDWORD, bb_backup[index]);
  1462. }
  1463. _rtl92c_phy_reload_adda_registers(hw, afe_reg, afe_backup, 16);
  1464. for (path = 0; path < pathbound; path++) {
  1465. rtl_set_rfreg(hw, (enum radio_path)path, 0xd,
  1466. MASKDWORD, reg_d[path]);
  1467. if (path == RF90_PATH_B) {
  1468. rtl_set_rfreg(hw, RF90_PATH_A, 0x10, MASKDWORD,
  1469. 0x1000f);
  1470. rtl_set_rfreg(hw, RF90_PATH_A, 0x11, MASKDWORD,
  1471. 0x20101);
  1472. }
  1473. if (apk_result[path][1] > 6)
  1474. apk_result[path][1] = 6;
  1475. }
  1476. for (path = 0; path < pathbound; path++) {
  1477. rtl_set_rfreg(hw, (enum radio_path)path, 0x3, MASKDWORD,
  1478. ((apk_result[path][1] << 15) |
  1479. (apk_result[path][1] << 10) |
  1480. (apk_result[path][1] << 5) |
  1481. apk_result[path][1]));
  1482. if (path == RF90_PATH_A)
  1483. rtl_set_rfreg(hw, (enum radio_path)path, 0x4, MASKDWORD,
  1484. ((apk_result[path][1] << 15) |
  1485. (apk_result[path][1] << 10) |
  1486. (0x00 << 5) | 0x05));
  1487. else
  1488. rtl_set_rfreg(hw, (enum radio_path)path, 0x4, MASKDWORD,
  1489. ((apk_result[path][1] << 15) |
  1490. (apk_result[path][1] << 10) |
  1491. (0x02 << 5) | 0x05));
  1492. rtl_set_rfreg(hw, (enum radio_path)path, 0xe, MASKDWORD,
  1493. ((0x08 << 15) | (0x08 << 10) | (0x08 << 5) |
  1494. 0x08));
  1495. }
  1496. rtlphy->b_apk_done = true;
  1497. #endif
  1498. }
  1499. static void _rtl92c_phy_set_rfpath_switch(struct ieee80211_hw *hw,
  1500. bool bmain, bool is2t)
  1501. {
  1502. struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
  1503. if (is_hal_stop(rtlhal)) {
  1504. rtl_set_bbreg(hw, REG_LEDCFG0, BIT(23), 0x01);
  1505. rtl_set_bbreg(hw, rFPGA0_XAB_RFPARAMETER, BIT(13), 0x01);
  1506. }
  1507. if (is2t) {
  1508. if (bmain)
  1509. rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE,
  1510. BIT(5) | BIT(6), 0x1);
  1511. else
  1512. rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE,
  1513. BIT(5) | BIT(6), 0x2);
  1514. } else {
  1515. if (bmain)
  1516. rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE, 0x300, 0x2);
  1517. else
  1518. rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE, 0x300, 0x1);
  1519. }
  1520. }
  1521. #undef IQK_ADDA_REG_NUM
  1522. #undef IQK_DELAY_TIME
  1523. void rtl92c_phy_iq_calibrate(struct ieee80211_hw *hw, bool recovery)
  1524. {
  1525. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1526. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  1527. struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
  1528. long result[4][8];
  1529. u8 i, final_candidate;
  1530. bool patha_ok, pathb_ok;
  1531. long reg_e94, reg_e9c, reg_ea4, reg_eb4, reg_ebc, reg_ec4, reg_tmp = 0;
  1532. bool is12simular, is13simular, is23simular;
  1533. bool start_conttx = false, singletone = false;
  1534. u32 iqk_bb_reg[10] = {
  1535. ROFDM0_XARXIQIMBALANCE,
  1536. ROFDM0_XBRXIQIMBALANCE,
  1537. ROFDM0_ECCATHRESHOLD,
  1538. ROFDM0_AGCRSSITABLE,
  1539. ROFDM0_XATXIQIMBALANCE,
  1540. ROFDM0_XBTXIQIMBALANCE,
  1541. ROFDM0_XCTXIQIMBALANCE,
  1542. ROFDM0_XCTXAFE,
  1543. ROFDM0_XDTXAFE,
  1544. ROFDM0_RXIQEXTANTA
  1545. };
  1546. if (recovery) {
  1547. _rtl92c_phy_reload_adda_registers(hw,
  1548. iqk_bb_reg,
  1549. rtlphy->iqk_bb_backup, 10);
  1550. return;
  1551. }
  1552. if (start_conttx || singletone)
  1553. return;
  1554. for (i = 0; i < 8; i++) {
  1555. result[0][i] = 0;
  1556. result[1][i] = 0;
  1557. result[2][i] = 0;
  1558. result[3][i] = 0;
  1559. }
  1560. final_candidate = 0xff;
  1561. patha_ok = false;
  1562. pathb_ok = false;
  1563. is12simular = false;
  1564. is23simular = false;
  1565. is13simular = false;
  1566. for (i = 0; i < 3; i++) {
  1567. if (IS_92C_SERIAL(rtlhal->version))
  1568. _rtl92c_phy_iq_calibrate(hw, result, i, true);
  1569. else
  1570. _rtl92c_phy_iq_calibrate(hw, result, i, false);
  1571. if (i == 1) {
  1572. is12simular = _rtl92c_phy_simularity_compare(hw,
  1573. result, 0,
  1574. 1);
  1575. if (is12simular) {
  1576. final_candidate = 0;
  1577. break;
  1578. }
  1579. }
  1580. if (i == 2) {
  1581. is13simular = _rtl92c_phy_simularity_compare(hw,
  1582. result, 0,
  1583. 2);
  1584. if (is13simular) {
  1585. final_candidate = 0;
  1586. break;
  1587. }
  1588. is23simular = _rtl92c_phy_simularity_compare(hw,
  1589. result, 1,
  1590. 2);
  1591. if (is23simular)
  1592. final_candidate = 1;
  1593. else {
  1594. for (i = 0; i < 8; i++)
  1595. reg_tmp += result[3][i];
  1596. if (reg_tmp != 0)
  1597. final_candidate = 3;
  1598. else
  1599. final_candidate = 0xFF;
  1600. }
  1601. }
  1602. }
  1603. for (i = 0; i < 4; i++) {
  1604. reg_e94 = result[i][0];
  1605. reg_e9c = result[i][1];
  1606. reg_ea4 = result[i][2];
  1607. reg_eb4 = result[i][4];
  1608. reg_ebc = result[i][5];
  1609. reg_ec4 = result[i][6];
  1610. }
  1611. if (final_candidate != 0xff) {
  1612. rtlphy->reg_e94 = reg_e94 = result[final_candidate][0];
  1613. rtlphy->reg_e9c = reg_e9c = result[final_candidate][1];
  1614. reg_ea4 = result[final_candidate][2];
  1615. rtlphy->reg_eb4 = reg_eb4 = result[final_candidate][4];
  1616. rtlphy->reg_ebc = reg_ebc = result[final_candidate][5];
  1617. reg_ec4 = result[final_candidate][6];
  1618. patha_ok = pathb_ok = true;
  1619. } else {
  1620. rtlphy->reg_e94 = rtlphy->reg_eb4 = 0x100;
  1621. rtlphy->reg_e9c = rtlphy->reg_ebc = 0x0;
  1622. }
  1623. if (reg_e94 != 0) /*&&(reg_ea4 != 0) */
  1624. _rtl92c_phy_path_a_fill_iqk_matrix(hw, patha_ok, result,
  1625. final_candidate,
  1626. (reg_ea4 == 0));
  1627. if (IS_92C_SERIAL(rtlhal->version)) {
  1628. if (reg_eb4 != 0) /*&&(reg_ec4 != 0) */
  1629. _rtl92c_phy_path_b_fill_iqk_matrix(hw, pathb_ok,
  1630. result,
  1631. final_candidate,
  1632. (reg_ec4 == 0));
  1633. }
  1634. _rtl92c_phy_save_adda_registers(hw, iqk_bb_reg,
  1635. rtlphy->iqk_bb_backup, 10);
  1636. }
  1637. EXPORT_SYMBOL(rtl92c_phy_iq_calibrate);
  1638. void rtl92c_phy_lc_calibrate(struct ieee80211_hw *hw)
  1639. {
  1640. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1641. struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
  1642. bool start_conttx = false, singletone = false;
  1643. if (start_conttx || singletone)
  1644. return;
  1645. if (IS_92C_SERIAL(rtlhal->version))
  1646. rtlpriv->cfg->ops->phy_lc_calibrate(hw, true);
  1647. else
  1648. rtlpriv->cfg->ops->phy_lc_calibrate(hw, false);
  1649. }
  1650. EXPORT_SYMBOL(rtl92c_phy_lc_calibrate);
  1651. void rtl92c_phy_ap_calibrate(struct ieee80211_hw *hw, char delta)
  1652. {
  1653. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1654. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  1655. struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
  1656. if (rtlphy->apk_done)
  1657. return;
  1658. if (IS_92C_SERIAL(rtlhal->version))
  1659. _rtl92c_phy_ap_calibrate(hw, delta, true);
  1660. else
  1661. _rtl92c_phy_ap_calibrate(hw, delta, false);
  1662. }
  1663. EXPORT_SYMBOL(rtl92c_phy_ap_calibrate);
  1664. void rtl92c_phy_set_rfpath_switch(struct ieee80211_hw *hw, bool bmain)
  1665. {
  1666. struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
  1667. if (IS_92C_SERIAL(rtlhal->version))
  1668. _rtl92c_phy_set_rfpath_switch(hw, bmain, true);
  1669. else
  1670. _rtl92c_phy_set_rfpath_switch(hw, bmain, false);
  1671. }
  1672. EXPORT_SYMBOL(rtl92c_phy_set_rfpath_switch);
  1673. bool rtl92c_phy_set_io_cmd(struct ieee80211_hw *hw, enum io_type iotype)
  1674. {
  1675. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1676. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  1677. bool postprocessing = false;
  1678. RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
  1679. ("-->IO Cmd(%#x), set_io_inprogress(%d)\n",
  1680. iotype, rtlphy->set_io_inprogress));
  1681. do {
  1682. switch (iotype) {
  1683. case IO_CMD_RESUME_DM_BY_SCAN:
  1684. RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
  1685. ("[IO CMD] Resume DM after scan.\n"));
  1686. postprocessing = true;
  1687. break;
  1688. case IO_CMD_PAUSE_DM_BY_SCAN:
  1689. RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
  1690. ("[IO CMD] Pause DM before scan.\n"));
  1691. postprocessing = true;
  1692. break;
  1693. default:
  1694. RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
  1695. ("switch case not process\n"));
  1696. break;
  1697. }
  1698. } while (false);
  1699. if (postprocessing && !rtlphy->set_io_inprogress) {
  1700. rtlphy->set_io_inprogress = true;
  1701. rtlphy->current_io_type = iotype;
  1702. } else {
  1703. return false;
  1704. }
  1705. rtl92c_phy_set_io(hw);
  1706. RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE, ("<--IO Type(%#x)\n", iotype));
  1707. return true;
  1708. }
  1709. EXPORT_SYMBOL(rtl92c_phy_set_io_cmd);
  1710. void rtl92c_phy_set_io(struct ieee80211_hw *hw)
  1711. {
  1712. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1713. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  1714. RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
  1715. ("--->Cmd(%#x), set_io_inprogress(%d)\n",
  1716. rtlphy->current_io_type, rtlphy->set_io_inprogress));
  1717. switch (rtlphy->current_io_type) {
  1718. case IO_CMD_RESUME_DM_BY_SCAN:
  1719. dm_digtable.cur_igvalue = rtlphy->initgain_backup.xaagccore1;
  1720. rtl92c_dm_write_dig(hw);
  1721. rtl92c_phy_set_txpower_level(hw, rtlphy->current_channel);
  1722. break;
  1723. case IO_CMD_PAUSE_DM_BY_SCAN:
  1724. rtlphy->initgain_backup.xaagccore1 = dm_digtable.cur_igvalue;
  1725. dm_digtable.cur_igvalue = 0x17;
  1726. rtl92c_dm_write_dig(hw);
  1727. break;
  1728. default:
  1729. RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
  1730. ("switch case not process\n"));
  1731. break;
  1732. }
  1733. rtlphy->set_io_inprogress = false;
  1734. RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
  1735. ("<---(%#x)\n", rtlphy->current_io_type));
  1736. }
  1737. EXPORT_SYMBOL(rtl92c_phy_set_io);
  1738. void rtl92ce_phy_set_rf_on(struct ieee80211_hw *hw)
  1739. {
  1740. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1741. rtl_write_byte(rtlpriv, REG_SPS0_CTRL, 0x2b);
  1742. rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3);
  1743. rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x00);
  1744. rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE2);
  1745. rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3);
  1746. rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00);
  1747. }
  1748. EXPORT_SYMBOL(rtl92ce_phy_set_rf_on);
  1749. void _rtl92c_phy_set_rf_sleep(struct ieee80211_hw *hw)
  1750. {
  1751. u32 u4b_tmp;
  1752. u8 delay = 5;
  1753. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1754. rtl_write_byte(rtlpriv, REG_TXPAUSE, 0xFF);
  1755. rtl_set_rfreg(hw, RF90_PATH_A, 0x00, RFREG_OFFSET_MASK, 0x00);
  1756. rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x40);
  1757. u4b_tmp = rtl_get_rfreg(hw, RF90_PATH_A, 0, RFREG_OFFSET_MASK);
  1758. while (u4b_tmp != 0 && delay > 0) {
  1759. rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x0);
  1760. rtl_set_rfreg(hw, RF90_PATH_A, 0x00, RFREG_OFFSET_MASK, 0x00);
  1761. rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x40);
  1762. u4b_tmp = rtl_get_rfreg(hw, RF90_PATH_A, 0, RFREG_OFFSET_MASK);
  1763. delay--;
  1764. }
  1765. if (delay == 0) {
  1766. rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x00);
  1767. rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE2);
  1768. rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3);
  1769. rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00);
  1770. RT_TRACE(rtlpriv, COMP_POWER, DBG_TRACE,
  1771. ("Switch RF timeout !!!.\n"));
  1772. return;
  1773. }
  1774. rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE2);
  1775. rtl_write_byte(rtlpriv, REG_SPS0_CTRL, 0x22);
  1776. }
  1777. EXPORT_SYMBOL(_rtl92c_phy_set_rf_sleep);