phy.c 76 KB

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