hw.c 70 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544
  1. /******************************************************************************
  2. *
  3. * Copyright(c) 2009-2012 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. * The full GNU General Public License is included in this distribution in the
  15. * file called LICENSE.
  16. *
  17. * Contact Information:
  18. * wlanfae <wlanfae@realtek.com>
  19. * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
  20. * Hsinchu 300, Taiwan.
  21. *
  22. * Larry Finger <Larry.Finger@lwfinger.net>
  23. *
  24. *****************************************************************************/
  25. #include "../wifi.h"
  26. #include "../efuse.h"
  27. #include "../base.h"
  28. #include "../regd.h"
  29. #include "../cam.h"
  30. #include "../ps.h"
  31. #include "../pci.h"
  32. #include "reg.h"
  33. #include "def.h"
  34. #include "phy.h"
  35. #include "dm.h"
  36. #include "fw.h"
  37. #include "led.h"
  38. #include "hw.h"
  39. void rtl92se_get_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
  40. {
  41. struct rtl_priv *rtlpriv = rtl_priv(hw);
  42. struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
  43. struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
  44. switch (variable) {
  45. case HW_VAR_RCR: {
  46. *((u32 *) (val)) = rtlpci->receive_config;
  47. break;
  48. }
  49. case HW_VAR_RF_STATE: {
  50. *((enum rf_pwrstate *)(val)) = ppsc->rfpwr_state;
  51. break;
  52. }
  53. case HW_VAR_FW_PSMODE_STATUS: {
  54. *((bool *) (val)) = ppsc->fw_current_inpsmode;
  55. break;
  56. }
  57. case HW_VAR_CORRECT_TSF: {
  58. u64 tsf;
  59. u32 *ptsf_low = (u32 *)&tsf;
  60. u32 *ptsf_high = ((u32 *)&tsf) + 1;
  61. *ptsf_high = rtl_read_dword(rtlpriv, (TSFR + 4));
  62. *ptsf_low = rtl_read_dword(rtlpriv, TSFR);
  63. *((u64 *) (val)) = tsf;
  64. break;
  65. }
  66. case HW_VAR_MRC: {
  67. *((bool *)(val)) = rtlpriv->dm.current_mrc_switch;
  68. break;
  69. }
  70. case HAL_DEF_WOWLAN:
  71. break;
  72. default:
  73. pr_err("switch case %#x not processed\n", variable);
  74. break;
  75. }
  76. }
  77. void rtl92se_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
  78. {
  79. struct rtl_priv *rtlpriv = rtl_priv(hw);
  80. struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
  81. struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
  82. struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
  83. struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
  84. struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
  85. switch (variable) {
  86. case HW_VAR_ETHER_ADDR:{
  87. rtl_write_dword(rtlpriv, IDR0, ((u32 *)(val))[0]);
  88. rtl_write_word(rtlpriv, IDR4, ((u16 *)(val + 4))[0]);
  89. break;
  90. }
  91. case HW_VAR_BASIC_RATE:{
  92. u16 rate_cfg = ((u16 *) val)[0];
  93. u8 rate_index = 0;
  94. if (rtlhal->version == VERSION_8192S_ACUT)
  95. rate_cfg = rate_cfg & 0x150;
  96. else
  97. rate_cfg = rate_cfg & 0x15f;
  98. rate_cfg |= 0x01;
  99. rtl_write_byte(rtlpriv, RRSR, rate_cfg & 0xff);
  100. rtl_write_byte(rtlpriv, RRSR + 1,
  101. (rate_cfg >> 8) & 0xff);
  102. while (rate_cfg > 0x1) {
  103. rate_cfg = (rate_cfg >> 1);
  104. rate_index++;
  105. }
  106. rtl_write_byte(rtlpriv, INIRTSMCS_SEL, rate_index);
  107. break;
  108. }
  109. case HW_VAR_BSSID:{
  110. rtl_write_dword(rtlpriv, BSSIDR, ((u32 *)(val))[0]);
  111. rtl_write_word(rtlpriv, BSSIDR + 4,
  112. ((u16 *)(val + 4))[0]);
  113. break;
  114. }
  115. case HW_VAR_SIFS:{
  116. rtl_write_byte(rtlpriv, SIFS_OFDM, val[0]);
  117. rtl_write_byte(rtlpriv, SIFS_OFDM + 1, val[1]);
  118. break;
  119. }
  120. case HW_VAR_SLOT_TIME:{
  121. u8 e_aci;
  122. RT_TRACE(rtlpriv, COMP_MLME, DBG_LOUD,
  123. "HW_VAR_SLOT_TIME %x\n", val[0]);
  124. rtl_write_byte(rtlpriv, SLOT_TIME, val[0]);
  125. for (e_aci = 0; e_aci < AC_MAX; e_aci++) {
  126. rtlpriv->cfg->ops->set_hw_reg(hw,
  127. HW_VAR_AC_PARAM,
  128. (&e_aci));
  129. }
  130. break;
  131. }
  132. case HW_VAR_ACK_PREAMBLE:{
  133. u8 reg_tmp;
  134. u8 short_preamble = (bool) (*val);
  135. reg_tmp = (mac->cur_40_prime_sc) << 5;
  136. if (short_preamble)
  137. reg_tmp |= 0x80;
  138. rtl_write_byte(rtlpriv, RRSR + 2, reg_tmp);
  139. break;
  140. }
  141. case HW_VAR_AMPDU_MIN_SPACE:{
  142. u8 min_spacing_to_set;
  143. u8 sec_min_space;
  144. min_spacing_to_set = *val;
  145. if (min_spacing_to_set <= 7) {
  146. if (rtlpriv->sec.pairwise_enc_algorithm ==
  147. NO_ENCRYPTION)
  148. sec_min_space = 0;
  149. else
  150. sec_min_space = 1;
  151. if (min_spacing_to_set < sec_min_space)
  152. min_spacing_to_set = sec_min_space;
  153. if (min_spacing_to_set > 5)
  154. min_spacing_to_set = 5;
  155. mac->min_space_cfg =
  156. ((mac->min_space_cfg & 0xf8) |
  157. min_spacing_to_set);
  158. *val = min_spacing_to_set;
  159. RT_TRACE(rtlpriv, COMP_MLME, DBG_LOUD,
  160. "Set HW_VAR_AMPDU_MIN_SPACE: %#x\n",
  161. mac->min_space_cfg);
  162. rtl_write_byte(rtlpriv, AMPDU_MIN_SPACE,
  163. mac->min_space_cfg);
  164. }
  165. break;
  166. }
  167. case HW_VAR_SHORTGI_DENSITY:{
  168. u8 density_to_set;
  169. density_to_set = *val;
  170. mac->min_space_cfg = rtlpriv->rtlhal.minspace_cfg;
  171. mac->min_space_cfg |= (density_to_set << 3);
  172. RT_TRACE(rtlpriv, COMP_MLME, DBG_LOUD,
  173. "Set HW_VAR_SHORTGI_DENSITY: %#x\n",
  174. mac->min_space_cfg);
  175. rtl_write_byte(rtlpriv, AMPDU_MIN_SPACE,
  176. mac->min_space_cfg);
  177. break;
  178. }
  179. case HW_VAR_AMPDU_FACTOR:{
  180. u8 factor_toset;
  181. u8 regtoset;
  182. u8 factorlevel[18] = {
  183. 2, 4, 4, 7, 7, 13, 13,
  184. 13, 2, 7, 7, 13, 13,
  185. 15, 15, 15, 15, 0};
  186. u8 index = 0;
  187. factor_toset = *val;
  188. if (factor_toset <= 3) {
  189. factor_toset = (1 << (factor_toset + 2));
  190. if (factor_toset > 0xf)
  191. factor_toset = 0xf;
  192. for (index = 0; index < 17; index++) {
  193. if (factorlevel[index] > factor_toset)
  194. factorlevel[index] =
  195. factor_toset;
  196. }
  197. for (index = 0; index < 8; index++) {
  198. regtoset = ((factorlevel[index * 2]) |
  199. (factorlevel[index *
  200. 2 + 1] << 4));
  201. rtl_write_byte(rtlpriv,
  202. AGGLEN_LMT_L + index,
  203. regtoset);
  204. }
  205. regtoset = ((factorlevel[16]) |
  206. (factorlevel[17] << 4));
  207. rtl_write_byte(rtlpriv, AGGLEN_LMT_H, regtoset);
  208. RT_TRACE(rtlpriv, COMP_MLME, DBG_LOUD,
  209. "Set HW_VAR_AMPDU_FACTOR: %#x\n",
  210. factor_toset);
  211. }
  212. break;
  213. }
  214. case HW_VAR_AC_PARAM:{
  215. u8 e_aci = *val;
  216. rtl92s_dm_init_edca_turbo(hw);
  217. if (rtlpci->acm_method != EACMWAY2_SW)
  218. rtlpriv->cfg->ops->set_hw_reg(hw,
  219. HW_VAR_ACM_CTRL,
  220. &e_aci);
  221. break;
  222. }
  223. case HW_VAR_ACM_CTRL:{
  224. u8 e_aci = *val;
  225. union aci_aifsn *p_aci_aifsn = (union aci_aifsn *)(&(
  226. mac->ac[0].aifs));
  227. u8 acm = p_aci_aifsn->f.acm;
  228. u8 acm_ctrl = rtl_read_byte(rtlpriv, AcmHwCtrl);
  229. acm_ctrl = acm_ctrl | ((rtlpci->acm_method == 2) ?
  230. 0x0 : 0x1);
  231. if (acm) {
  232. switch (e_aci) {
  233. case AC0_BE:
  234. acm_ctrl |= AcmHw_BeqEn;
  235. break;
  236. case AC2_VI:
  237. acm_ctrl |= AcmHw_ViqEn;
  238. break;
  239. case AC3_VO:
  240. acm_ctrl |= AcmHw_VoqEn;
  241. break;
  242. default:
  243. RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
  244. "HW_VAR_ACM_CTRL acm set failed: eACI is %d\n",
  245. acm);
  246. break;
  247. }
  248. } else {
  249. switch (e_aci) {
  250. case AC0_BE:
  251. acm_ctrl &= (~AcmHw_BeqEn);
  252. break;
  253. case AC2_VI:
  254. acm_ctrl &= (~AcmHw_ViqEn);
  255. break;
  256. case AC3_VO:
  257. acm_ctrl &= (~AcmHw_VoqEn);
  258. break;
  259. default:
  260. pr_err("switch case %#x not processed\n",
  261. e_aci);
  262. break;
  263. }
  264. }
  265. RT_TRACE(rtlpriv, COMP_QOS, DBG_TRACE,
  266. "HW_VAR_ACM_CTRL Write 0x%X\n", acm_ctrl);
  267. rtl_write_byte(rtlpriv, AcmHwCtrl, acm_ctrl);
  268. break;
  269. }
  270. case HW_VAR_RCR:{
  271. rtl_write_dword(rtlpriv, RCR, ((u32 *) (val))[0]);
  272. rtlpci->receive_config = ((u32 *) (val))[0];
  273. break;
  274. }
  275. case HW_VAR_RETRY_LIMIT:{
  276. u8 retry_limit = val[0];
  277. rtl_write_word(rtlpriv, RETRY_LIMIT,
  278. retry_limit << RETRY_LIMIT_SHORT_SHIFT |
  279. retry_limit << RETRY_LIMIT_LONG_SHIFT);
  280. break;
  281. }
  282. case HW_VAR_DUAL_TSF_RST: {
  283. break;
  284. }
  285. case HW_VAR_EFUSE_BYTES: {
  286. rtlefuse->efuse_usedbytes = *((u16 *) val);
  287. break;
  288. }
  289. case HW_VAR_EFUSE_USAGE: {
  290. rtlefuse->efuse_usedpercentage = *val;
  291. break;
  292. }
  293. case HW_VAR_IO_CMD: {
  294. break;
  295. }
  296. case HW_VAR_WPA_CONFIG: {
  297. rtl_write_byte(rtlpriv, REG_SECR, *val);
  298. break;
  299. }
  300. case HW_VAR_SET_RPWM:{
  301. break;
  302. }
  303. case HW_VAR_H2C_FW_PWRMODE:{
  304. break;
  305. }
  306. case HW_VAR_FW_PSMODE_STATUS: {
  307. ppsc->fw_current_inpsmode = *((bool *) val);
  308. break;
  309. }
  310. case HW_VAR_H2C_FW_JOINBSSRPT:{
  311. break;
  312. }
  313. case HW_VAR_AID:{
  314. break;
  315. }
  316. case HW_VAR_CORRECT_TSF:{
  317. break;
  318. }
  319. case HW_VAR_MRC: {
  320. bool bmrc_toset = *((bool *)val);
  321. u8 u1bdata = 0;
  322. if (bmrc_toset) {
  323. rtl_set_bbreg(hw, ROFDM0_TRXPATHENABLE,
  324. MASKBYTE0, 0x33);
  325. u1bdata = (u8)rtl_get_bbreg(hw,
  326. ROFDM1_TRXPATHENABLE,
  327. MASKBYTE0);
  328. rtl_set_bbreg(hw, ROFDM1_TRXPATHENABLE,
  329. MASKBYTE0,
  330. ((u1bdata & 0xf0) | 0x03));
  331. u1bdata = (u8)rtl_get_bbreg(hw,
  332. ROFDM0_TRXPATHENABLE,
  333. MASKBYTE1);
  334. rtl_set_bbreg(hw, ROFDM0_TRXPATHENABLE,
  335. MASKBYTE1,
  336. (u1bdata | 0x04));
  337. /* Update current settings. */
  338. rtlpriv->dm.current_mrc_switch = bmrc_toset;
  339. } else {
  340. rtl_set_bbreg(hw, ROFDM0_TRXPATHENABLE,
  341. MASKBYTE0, 0x13);
  342. u1bdata = (u8)rtl_get_bbreg(hw,
  343. ROFDM1_TRXPATHENABLE,
  344. MASKBYTE0);
  345. rtl_set_bbreg(hw, ROFDM1_TRXPATHENABLE,
  346. MASKBYTE0,
  347. ((u1bdata & 0xf0) | 0x01));
  348. u1bdata = (u8)rtl_get_bbreg(hw,
  349. ROFDM0_TRXPATHENABLE,
  350. MASKBYTE1);
  351. rtl_set_bbreg(hw, ROFDM0_TRXPATHENABLE,
  352. MASKBYTE1, (u1bdata & 0xfb));
  353. /* Update current settings. */
  354. rtlpriv->dm.current_mrc_switch = bmrc_toset;
  355. }
  356. break;
  357. }
  358. case HW_VAR_FW_LPS_ACTION: {
  359. bool enter_fwlps = *((bool *)val);
  360. u8 rpwm_val, fw_pwrmode;
  361. bool fw_current_inps;
  362. if (enter_fwlps) {
  363. rpwm_val = 0x02; /* RF off */
  364. fw_current_inps = true;
  365. rtlpriv->cfg->ops->set_hw_reg(hw,
  366. HW_VAR_FW_PSMODE_STATUS,
  367. (u8 *)(&fw_current_inps));
  368. rtlpriv->cfg->ops->set_hw_reg(hw,
  369. HW_VAR_H2C_FW_PWRMODE,
  370. &ppsc->fwctrl_psmode);
  371. rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SET_RPWM,
  372. &rpwm_val);
  373. } else {
  374. rpwm_val = 0x0C; /* RF on */
  375. fw_pwrmode = FW_PS_ACTIVE_MODE;
  376. fw_current_inps = false;
  377. rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SET_RPWM,
  378. &rpwm_val);
  379. rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_H2C_FW_PWRMODE,
  380. &fw_pwrmode);
  381. rtlpriv->cfg->ops->set_hw_reg(hw,
  382. HW_VAR_FW_PSMODE_STATUS,
  383. (u8 *)(&fw_current_inps));
  384. }
  385. break; }
  386. default:
  387. pr_err("switch case %#x not processed\n", variable);
  388. break;
  389. }
  390. }
  391. void rtl92se_enable_hw_security_config(struct ieee80211_hw *hw)
  392. {
  393. struct rtl_priv *rtlpriv = rtl_priv(hw);
  394. u8 sec_reg_value = 0x0;
  395. RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
  396. "PairwiseEncAlgorithm = %d GroupEncAlgorithm = %d\n",
  397. rtlpriv->sec.pairwise_enc_algorithm,
  398. rtlpriv->sec.group_enc_algorithm);
  399. if (rtlpriv->cfg->mod_params->sw_crypto || rtlpriv->sec.use_sw_sec) {
  400. RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
  401. "not open hw encryption\n");
  402. return;
  403. }
  404. sec_reg_value = SCR_TXENCENABLE | SCR_RXENCENABLE;
  405. if (rtlpriv->sec.use_defaultkey) {
  406. sec_reg_value |= SCR_TXUSEDK;
  407. sec_reg_value |= SCR_RXUSEDK;
  408. }
  409. RT_TRACE(rtlpriv, COMP_SEC, DBG_LOUD, "The SECR-value %x\n",
  410. sec_reg_value);
  411. rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_WPA_CONFIG, &sec_reg_value);
  412. }
  413. static u8 _rtl92se_halset_sysclk(struct ieee80211_hw *hw, u8 data)
  414. {
  415. struct rtl_priv *rtlpriv = rtl_priv(hw);
  416. u8 waitcount = 100;
  417. bool bresult = false;
  418. u8 tmpvalue;
  419. rtl_write_byte(rtlpriv, SYS_CLKR + 1, data);
  420. /* Wait the MAC synchronized. */
  421. udelay(400);
  422. /* Check if it is set ready. */
  423. tmpvalue = rtl_read_byte(rtlpriv, SYS_CLKR + 1);
  424. bresult = ((tmpvalue & BIT(7)) == (data & BIT(7)));
  425. if ((data & (BIT(6) | BIT(7))) == false) {
  426. waitcount = 100;
  427. tmpvalue = 0;
  428. while (1) {
  429. waitcount--;
  430. tmpvalue = rtl_read_byte(rtlpriv, SYS_CLKR + 1);
  431. if ((tmpvalue & BIT(6)))
  432. break;
  433. pr_err("wait for BIT(6) return value %x\n", tmpvalue);
  434. if (waitcount == 0)
  435. break;
  436. udelay(10);
  437. }
  438. if (waitcount == 0)
  439. bresult = false;
  440. else
  441. bresult = true;
  442. }
  443. return bresult;
  444. }
  445. void rtl8192se_gpiobit3_cfg_inputmode(struct ieee80211_hw *hw)
  446. {
  447. struct rtl_priv *rtlpriv = rtl_priv(hw);
  448. u8 u1tmp;
  449. /* The following config GPIO function */
  450. rtl_write_byte(rtlpriv, MAC_PINMUX_CFG, (GPIOMUX_EN | GPIOSEL_GPIO));
  451. u1tmp = rtl_read_byte(rtlpriv, GPIO_IO_SEL);
  452. /* config GPIO3 to input */
  453. u1tmp &= HAL_8192S_HW_GPIO_OFF_MASK;
  454. rtl_write_byte(rtlpriv, GPIO_IO_SEL, u1tmp);
  455. }
  456. static u8 _rtl92se_rf_onoff_detect(struct ieee80211_hw *hw)
  457. {
  458. struct rtl_priv *rtlpriv = rtl_priv(hw);
  459. u8 u1tmp;
  460. u8 retval = ERFON;
  461. /* The following config GPIO function */
  462. rtl_write_byte(rtlpriv, MAC_PINMUX_CFG, (GPIOMUX_EN | GPIOSEL_GPIO));
  463. u1tmp = rtl_read_byte(rtlpriv, GPIO_IO_SEL);
  464. /* config GPIO3 to input */
  465. u1tmp &= HAL_8192S_HW_GPIO_OFF_MASK;
  466. rtl_write_byte(rtlpriv, GPIO_IO_SEL, u1tmp);
  467. /* On some of the platform, driver cannot read correct
  468. * value without delay between Write_GPIO_SEL and Read_GPIO_IN */
  469. mdelay(10);
  470. /* check GPIO3 */
  471. u1tmp = rtl_read_byte(rtlpriv, GPIO_IN_SE);
  472. retval = (u1tmp & HAL_8192S_HW_GPIO_OFF_BIT) ? ERFON : ERFOFF;
  473. return retval;
  474. }
  475. static void _rtl92se_macconfig_before_fwdownload(struct ieee80211_hw *hw)
  476. {
  477. struct rtl_priv *rtlpriv = rtl_priv(hw);
  478. struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
  479. struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
  480. u8 i;
  481. u8 tmpu1b;
  482. u16 tmpu2b;
  483. u8 pollingcnt = 20;
  484. if (rtlpci->first_init) {
  485. /* Reset PCIE Digital */
  486. tmpu1b = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN + 1);
  487. tmpu1b &= 0xFE;
  488. rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN + 1, tmpu1b);
  489. udelay(1);
  490. rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN + 1, tmpu1b | BIT(0));
  491. }
  492. /* Switch to SW IO control */
  493. tmpu1b = rtl_read_byte(rtlpriv, (SYS_CLKR + 1));
  494. if (tmpu1b & BIT(7)) {
  495. tmpu1b &= ~(BIT(6) | BIT(7));
  496. /* Set failed, return to prevent hang. */
  497. if (!_rtl92se_halset_sysclk(hw, tmpu1b))
  498. return;
  499. }
  500. rtl_write_byte(rtlpriv, AFE_PLL_CTRL, 0x0);
  501. udelay(50);
  502. rtl_write_byte(rtlpriv, LDOA15_CTRL, 0x34);
  503. udelay(50);
  504. /* Clear FW RPWM for FW control LPS.*/
  505. rtl_write_byte(rtlpriv, RPWM, 0x0);
  506. /* Reset MAC-IO and CPU and Core Digital BIT(10)/11/15 */
  507. tmpu1b = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN + 1);
  508. tmpu1b &= 0x73;
  509. rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN + 1, tmpu1b);
  510. /* wait for BIT 10/11/15 to pull high automatically!! */
  511. mdelay(1);
  512. rtl_write_byte(rtlpriv, CMDR, 0);
  513. rtl_write_byte(rtlpriv, TCR, 0);
  514. /* Data sheet not define 0x562!!! Copy from WMAC!!!!! */
  515. tmpu1b = rtl_read_byte(rtlpriv, 0x562);
  516. tmpu1b |= 0x08;
  517. rtl_write_byte(rtlpriv, 0x562, tmpu1b);
  518. tmpu1b &= ~(BIT(3));
  519. rtl_write_byte(rtlpriv, 0x562, tmpu1b);
  520. /* Enable AFE clock source */
  521. tmpu1b = rtl_read_byte(rtlpriv, AFE_XTAL_CTRL);
  522. rtl_write_byte(rtlpriv, AFE_XTAL_CTRL, (tmpu1b | 0x01));
  523. /* Delay 1.5ms */
  524. mdelay(2);
  525. tmpu1b = rtl_read_byte(rtlpriv, AFE_XTAL_CTRL + 1);
  526. rtl_write_byte(rtlpriv, AFE_XTAL_CTRL + 1, (tmpu1b & 0xfb));
  527. /* Enable AFE Macro Block's Bandgap */
  528. tmpu1b = rtl_read_byte(rtlpriv, AFE_MISC);
  529. rtl_write_byte(rtlpriv, AFE_MISC, (tmpu1b | BIT(0)));
  530. mdelay(1);
  531. /* Enable AFE Mbias */
  532. tmpu1b = rtl_read_byte(rtlpriv, AFE_MISC);
  533. rtl_write_byte(rtlpriv, AFE_MISC, (tmpu1b | 0x02));
  534. mdelay(1);
  535. /* Enable LDOA15 block */
  536. tmpu1b = rtl_read_byte(rtlpriv, LDOA15_CTRL);
  537. rtl_write_byte(rtlpriv, LDOA15_CTRL, (tmpu1b | BIT(0)));
  538. /* Set Digital Vdd to Retention isolation Path. */
  539. tmpu2b = rtl_read_word(rtlpriv, REG_SYS_ISO_CTRL);
  540. rtl_write_word(rtlpriv, REG_SYS_ISO_CTRL, (tmpu2b | BIT(11)));
  541. /* For warm reboot NIC disappera bug. */
  542. tmpu2b = rtl_read_word(rtlpriv, REG_SYS_FUNC_EN);
  543. rtl_write_word(rtlpriv, REG_SYS_FUNC_EN, (tmpu2b | BIT(13)));
  544. rtl_write_byte(rtlpriv, REG_SYS_ISO_CTRL + 1, 0x68);
  545. /* Enable AFE PLL Macro Block */
  546. /* We need to delay 100u before enabling PLL. */
  547. udelay(200);
  548. tmpu1b = rtl_read_byte(rtlpriv, AFE_PLL_CTRL);
  549. rtl_write_byte(rtlpriv, AFE_PLL_CTRL, (tmpu1b | BIT(0) | BIT(4)));
  550. /* for divider reset */
  551. udelay(100);
  552. rtl_write_byte(rtlpriv, AFE_PLL_CTRL, (tmpu1b | BIT(0) |
  553. BIT(4) | BIT(6)));
  554. udelay(10);
  555. rtl_write_byte(rtlpriv, AFE_PLL_CTRL, (tmpu1b | BIT(0) | BIT(4)));
  556. udelay(10);
  557. /* Enable MAC 80MHZ clock */
  558. tmpu1b = rtl_read_byte(rtlpriv, AFE_PLL_CTRL + 1);
  559. rtl_write_byte(rtlpriv, AFE_PLL_CTRL + 1, (tmpu1b | BIT(0)));
  560. mdelay(1);
  561. /* Release isolation AFE PLL & MD */
  562. rtl_write_byte(rtlpriv, REG_SYS_ISO_CTRL, 0xA6);
  563. /* Enable MAC clock */
  564. tmpu2b = rtl_read_word(rtlpriv, SYS_CLKR);
  565. rtl_write_word(rtlpriv, SYS_CLKR, (tmpu2b | BIT(12) | BIT(11)));
  566. /* Enable Core digital and enable IOREG R/W */
  567. tmpu2b = rtl_read_word(rtlpriv, REG_SYS_FUNC_EN);
  568. rtl_write_word(rtlpriv, REG_SYS_FUNC_EN, (tmpu2b | BIT(11)));
  569. tmpu1b = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN + 1);
  570. rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN + 1, tmpu1b & ~(BIT(7)));
  571. /* enable REG_EN */
  572. rtl_write_word(rtlpriv, REG_SYS_FUNC_EN, (tmpu2b | BIT(11) | BIT(15)));
  573. /* Switch the control path. */
  574. tmpu2b = rtl_read_word(rtlpriv, SYS_CLKR);
  575. rtl_write_word(rtlpriv, SYS_CLKR, (tmpu2b & (~BIT(2))));
  576. tmpu1b = rtl_read_byte(rtlpriv, (SYS_CLKR + 1));
  577. tmpu1b = ((tmpu1b | BIT(7)) & (~BIT(6)));
  578. if (!_rtl92se_halset_sysclk(hw, tmpu1b))
  579. return; /* Set failed, return to prevent hang. */
  580. rtl_write_word(rtlpriv, CMDR, 0x07FC);
  581. /* MH We must enable the section of code to prevent load IMEM fail. */
  582. /* Load MAC register from WMAc temporarily We simulate macreg. */
  583. /* txt HW will provide MAC txt later */
  584. rtl_write_byte(rtlpriv, 0x6, 0x30);
  585. rtl_write_byte(rtlpriv, 0x49, 0xf0);
  586. rtl_write_byte(rtlpriv, 0x4b, 0x81);
  587. rtl_write_byte(rtlpriv, 0xb5, 0x21);
  588. rtl_write_byte(rtlpriv, 0xdc, 0xff);
  589. rtl_write_byte(rtlpriv, 0xdd, 0xff);
  590. rtl_write_byte(rtlpriv, 0xde, 0xff);
  591. rtl_write_byte(rtlpriv, 0xdf, 0xff);
  592. rtl_write_byte(rtlpriv, 0x11a, 0x00);
  593. rtl_write_byte(rtlpriv, 0x11b, 0x00);
  594. for (i = 0; i < 32; i++)
  595. rtl_write_byte(rtlpriv, INIMCS_SEL + i, 0x1b);
  596. rtl_write_byte(rtlpriv, 0x236, 0xff);
  597. rtl_write_byte(rtlpriv, 0x503, 0x22);
  598. if (ppsc->support_aspm && !ppsc->support_backdoor)
  599. rtl_write_byte(rtlpriv, 0x560, 0x40);
  600. else
  601. rtl_write_byte(rtlpriv, 0x560, 0x00);
  602. rtl_write_byte(rtlpriv, DBG_PORT, 0x91);
  603. /* Set RX Desc Address */
  604. rtl_write_dword(rtlpriv, RDQDA, rtlpci->rx_ring[RX_MPDU_QUEUE].dma);
  605. rtl_write_dword(rtlpriv, RCDA, rtlpci->rx_ring[RX_CMD_QUEUE].dma);
  606. /* Set TX Desc Address */
  607. rtl_write_dword(rtlpriv, TBKDA, rtlpci->tx_ring[BK_QUEUE].dma);
  608. rtl_write_dword(rtlpriv, TBEDA, rtlpci->tx_ring[BE_QUEUE].dma);
  609. rtl_write_dword(rtlpriv, TVIDA, rtlpci->tx_ring[VI_QUEUE].dma);
  610. rtl_write_dword(rtlpriv, TVODA, rtlpci->tx_ring[VO_QUEUE].dma);
  611. rtl_write_dword(rtlpriv, TBDA, rtlpci->tx_ring[BEACON_QUEUE].dma);
  612. rtl_write_dword(rtlpriv, TCDA, rtlpci->tx_ring[TXCMD_QUEUE].dma);
  613. rtl_write_dword(rtlpriv, TMDA, rtlpci->tx_ring[MGNT_QUEUE].dma);
  614. rtl_write_dword(rtlpriv, THPDA, rtlpci->tx_ring[HIGH_QUEUE].dma);
  615. rtl_write_dword(rtlpriv, HDA, rtlpci->tx_ring[HCCA_QUEUE].dma);
  616. rtl_write_word(rtlpriv, CMDR, 0x37FC);
  617. /* To make sure that TxDMA can ready to download FW. */
  618. /* We should reset TxDMA if IMEM RPT was not ready. */
  619. do {
  620. tmpu1b = rtl_read_byte(rtlpriv, TCR);
  621. if ((tmpu1b & TXDMA_INIT_VALUE) == TXDMA_INIT_VALUE)
  622. break;
  623. udelay(5);
  624. } while (pollingcnt--);
  625. if (pollingcnt <= 0) {
  626. pr_err("Polling TXDMA_INIT_VALUE timeout!! Current TCR(%#x)\n",
  627. tmpu1b);
  628. tmpu1b = rtl_read_byte(rtlpriv, CMDR);
  629. rtl_write_byte(rtlpriv, CMDR, tmpu1b & (~TXDMA_EN));
  630. udelay(2);
  631. /* Reset TxDMA */
  632. rtl_write_byte(rtlpriv, CMDR, tmpu1b | TXDMA_EN);
  633. }
  634. /* After MACIO reset,we must refresh LED state. */
  635. if ((ppsc->rfoff_reason == RF_CHANGE_BY_IPS) ||
  636. (ppsc->rfoff_reason == 0)) {
  637. struct rtl_led *pled0 = &rtlpriv->ledctl.sw_led0;
  638. enum rf_pwrstate rfpwr_state_toset;
  639. rfpwr_state_toset = _rtl92se_rf_onoff_detect(hw);
  640. if (rfpwr_state_toset == ERFON)
  641. rtl92se_sw_led_on(hw, pled0);
  642. }
  643. }
  644. static void _rtl92se_macconfig_after_fwdownload(struct ieee80211_hw *hw)
  645. {
  646. struct rtl_priv *rtlpriv = rtl_priv(hw);
  647. struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
  648. struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
  649. struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
  650. u8 i;
  651. u16 tmpu2b;
  652. /* 1. System Configure Register (Offset: 0x0000 - 0x003F) */
  653. /* 2. Command Control Register (Offset: 0x0040 - 0x004F) */
  654. /* Turn on 0x40 Command register */
  655. rtl_write_word(rtlpriv, CMDR, (BBRSTN | BB_GLB_RSTN |
  656. SCHEDULE_EN | MACRXEN | MACTXEN | DDMA_EN | FW2HW_EN |
  657. RXDMA_EN | TXDMA_EN | HCI_RXDMA_EN | HCI_TXDMA_EN));
  658. /* Set TCR TX DMA pre 2 FULL enable bit */
  659. rtl_write_dword(rtlpriv, TCR, rtl_read_dword(rtlpriv, TCR) |
  660. TXDMAPRE2FULL);
  661. /* Set RCR */
  662. rtl_write_dword(rtlpriv, RCR, rtlpci->receive_config);
  663. /* 3. MACID Setting Register (Offset: 0x0050 - 0x007F) */
  664. /* 4. Timing Control Register (Offset: 0x0080 - 0x009F) */
  665. /* Set CCK/OFDM SIFS */
  666. /* CCK SIFS shall always be 10us. */
  667. rtl_write_word(rtlpriv, SIFS_CCK, 0x0a0a);
  668. rtl_write_word(rtlpriv, SIFS_OFDM, 0x1010);
  669. /* Set AckTimeout */
  670. rtl_write_byte(rtlpriv, ACK_TIMEOUT, 0x40);
  671. /* Beacon related */
  672. rtl_write_word(rtlpriv, BCN_INTERVAL, 100);
  673. rtl_write_word(rtlpriv, ATIMWND, 2);
  674. /* 5. FIFO Control Register (Offset: 0x00A0 - 0x015F) */
  675. /* 5.1 Initialize Number of Reserved Pages in Firmware Queue */
  676. /* Firmware allocate now, associate with FW internal setting.!!! */
  677. /* 5.2 Setting TX/RX page size 0/1/2/3/4=64/128/256/512/1024 */
  678. /* 5.3 Set driver info, we only accept PHY status now. */
  679. /* 5.4 Set RXDMA arbitration to control RXDMA/MAC/FW R/W for RXFIFO */
  680. rtl_write_byte(rtlpriv, RXDMA, rtl_read_byte(rtlpriv, RXDMA) | BIT(6));
  681. /* 6. Adaptive Control Register (Offset: 0x0160 - 0x01CF) */
  682. /* Set RRSR to all legacy rate and HT rate
  683. * CCK rate is supported by default.
  684. * CCK rate will be filtered out only when associated
  685. * AP does not support it.
  686. * Only enable ACK rate to OFDM 24M
  687. * Disable RRSR for CCK rate in A-Cut */
  688. if (rtlhal->version == VERSION_8192S_ACUT)
  689. rtl_write_byte(rtlpriv, RRSR, 0xf0);
  690. else if (rtlhal->version == VERSION_8192S_BCUT)
  691. rtl_write_byte(rtlpriv, RRSR, 0xff);
  692. rtl_write_byte(rtlpriv, RRSR + 1, 0x01);
  693. rtl_write_byte(rtlpriv, RRSR + 2, 0x00);
  694. /* A-Cut IC do not support CCK rate. We forbid ARFR to */
  695. /* fallback to CCK rate */
  696. for (i = 0; i < 8; i++) {
  697. /*Disable RRSR for CCK rate in A-Cut */
  698. if (rtlhal->version == VERSION_8192S_ACUT)
  699. rtl_write_dword(rtlpriv, ARFR0 + i * 4, 0x1f0ff0f0);
  700. }
  701. /* Different rate use different AMPDU size */
  702. /* MCS32/ MCS15_SG use max AMPDU size 15*2=30K */
  703. rtl_write_byte(rtlpriv, AGGLEN_LMT_H, 0x0f);
  704. /* MCS0/1/2/3 use max AMPDU size 4*2=8K */
  705. rtl_write_word(rtlpriv, AGGLEN_LMT_L, 0x7442);
  706. /* MCS4/5 use max AMPDU size 8*2=16K 6/7 use 10*2=20K */
  707. rtl_write_word(rtlpriv, AGGLEN_LMT_L + 2, 0xddd7);
  708. /* MCS8/9 use max AMPDU size 8*2=16K 10/11 use 10*2=20K */
  709. rtl_write_word(rtlpriv, AGGLEN_LMT_L + 4, 0xd772);
  710. /* MCS12/13/14/15 use max AMPDU size 15*2=30K */
  711. rtl_write_word(rtlpriv, AGGLEN_LMT_L + 6, 0xfffd);
  712. /* Set Data / Response auto rate fallack retry count */
  713. rtl_write_dword(rtlpriv, DARFRC, 0x04010000);
  714. rtl_write_dword(rtlpriv, DARFRC + 4, 0x09070605);
  715. rtl_write_dword(rtlpriv, RARFRC, 0x04010000);
  716. rtl_write_dword(rtlpriv, RARFRC + 4, 0x09070605);
  717. /* 7. EDCA Setting Register (Offset: 0x01D0 - 0x01FF) */
  718. /* Set all rate to support SG */
  719. rtl_write_word(rtlpriv, SG_RATE, 0xFFFF);
  720. /* 8. WMAC, BA, and CCX related Register (Offset: 0x0200 - 0x023F) */
  721. /* Set NAV protection length */
  722. rtl_write_word(rtlpriv, NAV_PROT_LEN, 0x0080);
  723. /* CF-END Threshold */
  724. rtl_write_byte(rtlpriv, CFEND_TH, 0xFF);
  725. /* Set AMPDU minimum space */
  726. rtl_write_byte(rtlpriv, AMPDU_MIN_SPACE, 0x07);
  727. /* Set TXOP stall control for several queue/HI/BCN/MGT/ */
  728. rtl_write_byte(rtlpriv, TXOP_STALL_CTRL, 0x00);
  729. /* 9. Security Control Register (Offset: 0x0240 - 0x025F) */
  730. /* 10. Power Save Control Register (Offset: 0x0260 - 0x02DF) */
  731. /* 11. General Purpose Register (Offset: 0x02E0 - 0x02FF) */
  732. /* 12. Host Interrupt Status Register (Offset: 0x0300 - 0x030F) */
  733. /* 13. Test Mode and Debug Control Register (Offset: 0x0310 - 0x034F) */
  734. /* 14. Set driver info, we only accept PHY status now. */
  735. rtl_write_byte(rtlpriv, RXDRVINFO_SZ, 4);
  736. /* 15. For EEPROM R/W Workaround */
  737. /* 16. For EFUSE to share REG_SYS_FUNC_EN with EEPROM!!! */
  738. tmpu2b = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN);
  739. rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, tmpu2b | BIT(13));
  740. tmpu2b = rtl_read_byte(rtlpriv, REG_SYS_ISO_CTRL);
  741. rtl_write_byte(rtlpriv, REG_SYS_ISO_CTRL, tmpu2b & (~BIT(8)));
  742. /* 17. For EFUSE */
  743. /* We may R/W EFUSE in EEPROM mode */
  744. if (rtlefuse->epromtype == EEPROM_BOOT_EFUSE) {
  745. u8 tempval;
  746. tempval = rtl_read_byte(rtlpriv, REG_SYS_ISO_CTRL + 1);
  747. tempval &= 0xFE;
  748. rtl_write_byte(rtlpriv, REG_SYS_ISO_CTRL + 1, tempval);
  749. /* Change Program timing */
  750. rtl_write_byte(rtlpriv, REG_EFUSE_CTRL + 3, 0x72);
  751. RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "EFUSE CONFIG OK\n");
  752. }
  753. RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "OK\n");
  754. }
  755. static void _rtl92se_hw_configure(struct ieee80211_hw *hw)
  756. {
  757. struct rtl_priv *rtlpriv = rtl_priv(hw);
  758. struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
  759. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  760. struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
  761. u8 reg_bw_opmode = 0;
  762. u32 reg_rrsr = 0;
  763. u8 regtmp = 0;
  764. reg_bw_opmode = BW_OPMODE_20MHZ;
  765. reg_rrsr = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
  766. regtmp = rtl_read_byte(rtlpriv, INIRTSMCS_SEL);
  767. reg_rrsr = ((reg_rrsr & 0x000fffff) << 8) | regtmp;
  768. rtl_write_dword(rtlpriv, INIRTSMCS_SEL, reg_rrsr);
  769. rtl_write_byte(rtlpriv, BW_OPMODE, reg_bw_opmode);
  770. /* Set Retry Limit here */
  771. rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_RETRY_LIMIT,
  772. (u8 *)(&rtlpci->shortretry_limit));
  773. rtl_write_byte(rtlpriv, MLT, 0x8f);
  774. /* For Min Spacing configuration. */
  775. switch (rtlphy->rf_type) {
  776. case RF_1T2R:
  777. case RF_1T1R:
  778. rtlhal->minspace_cfg = (MAX_MSS_DENSITY_1T << 3);
  779. break;
  780. case RF_2T2R:
  781. case RF_2T2R_GREEN:
  782. rtlhal->minspace_cfg = (MAX_MSS_DENSITY_2T << 3);
  783. break;
  784. }
  785. rtl_write_byte(rtlpriv, AMPDU_MIN_SPACE, rtlhal->minspace_cfg);
  786. }
  787. int rtl92se_hw_init(struct ieee80211_hw *hw)
  788. {
  789. struct rtl_priv *rtlpriv = rtl_priv(hw);
  790. struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
  791. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  792. struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
  793. struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
  794. u8 tmp_byte = 0;
  795. unsigned long flags;
  796. bool rtstatus = true;
  797. u8 tmp_u1b;
  798. int err = false;
  799. u8 i;
  800. int wdcapra_add[] = {
  801. EDCAPARA_BE, EDCAPARA_BK,
  802. EDCAPARA_VI, EDCAPARA_VO};
  803. u8 secr_value = 0x0;
  804. rtlpci->being_init_adapter = true;
  805. /* As this function can take a very long time (up to 350 ms)
  806. * and can be called with irqs disabled, reenable the irqs
  807. * to let the other devices continue being serviced.
  808. *
  809. * It is safe doing so since our own interrupts will only be enabled
  810. * in a subsequent step.
  811. */
  812. local_save_flags(flags);
  813. local_irq_enable();
  814. rtlpriv->intf_ops->disable_aspm(hw);
  815. /* 1. MAC Initialize */
  816. /* Before FW download, we have to set some MAC register */
  817. _rtl92se_macconfig_before_fwdownload(hw);
  818. rtlhal->version = (enum version_8192s)((rtl_read_dword(rtlpriv,
  819. PMC_FSM) >> 16) & 0xF);
  820. rtl8192se_gpiobit3_cfg_inputmode(hw);
  821. /* 2. download firmware */
  822. rtstatus = rtl92s_download_fw(hw);
  823. if (!rtstatus) {
  824. RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
  825. "Failed to download FW. Init HW without FW now... "
  826. "Please copy FW into /lib/firmware/rtlwifi\n");
  827. err = 1;
  828. goto exit;
  829. }
  830. /* After FW download, we have to reset MAC register */
  831. _rtl92se_macconfig_after_fwdownload(hw);
  832. /*Retrieve default FW Cmd IO map. */
  833. rtlhal->fwcmd_iomap = rtl_read_word(rtlpriv, LBUS_MON_ADDR);
  834. rtlhal->fwcmd_ioparam = rtl_read_dword(rtlpriv, LBUS_ADDR_MASK);
  835. /* 3. Initialize MAC/PHY Config by MACPHY_reg.txt */
  836. if (!rtl92s_phy_mac_config(hw)) {
  837. pr_err("MAC Config failed\n");
  838. err = rtstatus;
  839. goto exit;
  840. }
  841. /* because last function modify RCR, so we update
  842. * rcr var here, or TP will unstable for receive_config
  843. * is wrong, RX RCR_ACRC32 will cause TP unstabel & Rx
  844. * RCR_APP_ICV will cause mac80211 unassoc for cisco 1252
  845. */
  846. rtlpci->receive_config = rtl_read_dword(rtlpriv, RCR);
  847. rtlpci->receive_config &= ~(RCR_ACRC32 | RCR_AICV);
  848. rtl_write_dword(rtlpriv, RCR, rtlpci->receive_config);
  849. /* Make sure BB/RF write OK. We should prevent enter IPS. radio off. */
  850. /* We must set flag avoid BB/RF config period later!! */
  851. rtl_write_dword(rtlpriv, CMDR, 0x37FC);
  852. /* 4. Initialize BB After MAC Config PHY_reg.txt, AGC_Tab.txt */
  853. if (!rtl92s_phy_bb_config(hw)) {
  854. pr_err("BB Config failed\n");
  855. err = rtstatus;
  856. goto exit;
  857. }
  858. /* 5. Initiailze RF RAIO_A.txt RF RAIO_B.txt */
  859. /* Before initalizing RF. We can not use FW to do RF-R/W. */
  860. rtlphy->rf_mode = RF_OP_BY_SW_3WIRE;
  861. /* Before RF-R/W we must execute the IO from Scott's suggestion. */
  862. rtl_write_byte(rtlpriv, AFE_XTAL_CTRL + 1, 0xDB);
  863. if (rtlhal->version == VERSION_8192S_ACUT)
  864. rtl_write_byte(rtlpriv, SPS1_CTRL + 3, 0x07);
  865. else
  866. rtl_write_byte(rtlpriv, RF_CTRL, 0x07);
  867. if (!rtl92s_phy_rf_config(hw)) {
  868. RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "RF Config failed\n");
  869. err = rtstatus;
  870. goto exit;
  871. }
  872. /* After read predefined TXT, we must set BB/MAC/RF
  873. * register as our requirement */
  874. rtlphy->rfreg_chnlval[0] = rtl92s_phy_query_rf_reg(hw,
  875. (enum radio_path)0,
  876. RF_CHNLBW,
  877. RFREG_OFFSET_MASK);
  878. rtlphy->rfreg_chnlval[1] = rtl92s_phy_query_rf_reg(hw,
  879. (enum radio_path)1,
  880. RF_CHNLBW,
  881. RFREG_OFFSET_MASK);
  882. /*---- Set CCK and OFDM Block "ON"----*/
  883. rtl_set_bbreg(hw, RFPGA0_RFMOD, BCCKEN, 0x1);
  884. rtl_set_bbreg(hw, RFPGA0_RFMOD, BOFDMEN, 0x1);
  885. /*3 Set Hardware(Do nothing now) */
  886. _rtl92se_hw_configure(hw);
  887. /* Read EEPROM TX power index and PHY_REG_PG.txt to capture correct */
  888. /* TX power index for different rate set. */
  889. /* Get original hw reg values */
  890. rtl92s_phy_get_hw_reg_originalvalue(hw);
  891. /* Write correct tx power index */
  892. rtl92s_phy_set_txpower(hw, rtlphy->current_channel);
  893. /* We must set MAC address after firmware download. */
  894. for (i = 0; i < 6; i++)
  895. rtl_write_byte(rtlpriv, MACIDR0 + i, rtlefuse->dev_addr[i]);
  896. /* EEPROM R/W workaround */
  897. tmp_u1b = rtl_read_byte(rtlpriv, MAC_PINMUX_CFG);
  898. rtl_write_byte(rtlpriv, MAC_PINMUX_CFG, tmp_u1b & (~BIT(3)));
  899. rtl_write_byte(rtlpriv, 0x4d, 0x0);
  900. if (hal_get_firmwareversion(rtlpriv) >= 0x49) {
  901. tmp_byte = rtl_read_byte(rtlpriv, FW_RSVD_PG_CRTL) & (~BIT(4));
  902. tmp_byte = tmp_byte | BIT(5);
  903. rtl_write_byte(rtlpriv, FW_RSVD_PG_CRTL, tmp_byte);
  904. rtl_write_dword(rtlpriv, TXDESC_MSK, 0xFFFFCFFF);
  905. }
  906. /* We enable high power and RA related mechanism after NIC
  907. * initialized. */
  908. if (hal_get_firmwareversion(rtlpriv) >= 0x35) {
  909. /* Fw v.53 and later. */
  910. rtl92s_phy_set_fw_cmd(hw, FW_CMD_RA_INIT);
  911. } else if (hal_get_firmwareversion(rtlpriv) == 0x34) {
  912. /* Fw v.52. */
  913. rtl_write_dword(rtlpriv, WFM5, FW_RA_INIT);
  914. rtl92s_phy_chk_fwcmd_iodone(hw);
  915. } else {
  916. /* Compatible earlier FW version. */
  917. rtl_write_dword(rtlpriv, WFM5, FW_RA_RESET);
  918. rtl92s_phy_chk_fwcmd_iodone(hw);
  919. rtl_write_dword(rtlpriv, WFM5, FW_RA_ACTIVE);
  920. rtl92s_phy_chk_fwcmd_iodone(hw);
  921. rtl_write_dword(rtlpriv, WFM5, FW_RA_REFRESH);
  922. rtl92s_phy_chk_fwcmd_iodone(hw);
  923. }
  924. /* Add to prevent ASPM bug. */
  925. /* Always enable hst and NIC clock request. */
  926. rtl92s_phy_switch_ephy_parameter(hw);
  927. /* Security related
  928. * 1. Clear all H/W keys.
  929. * 2. Enable H/W encryption/decryption. */
  930. rtl_cam_reset_all_entry(hw);
  931. secr_value |= SCR_TXENCENABLE;
  932. secr_value |= SCR_RXENCENABLE;
  933. secr_value |= SCR_NOSKMC;
  934. rtl_write_byte(rtlpriv, REG_SECR, secr_value);
  935. for (i = 0; i < 4; i++)
  936. rtl_write_dword(rtlpriv, wdcapra_add[i], 0x5e4322);
  937. if (rtlphy->rf_type == RF_1T2R) {
  938. bool mrc2set = true;
  939. /* Turn on B-Path */
  940. rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_MRC, (u8 *)&mrc2set);
  941. }
  942. rtlpriv->cfg->ops->led_control(hw, LED_CTL_POWER_ON);
  943. rtl92s_dm_init(hw);
  944. exit:
  945. local_irq_restore(flags);
  946. rtlpci->being_init_adapter = false;
  947. return err;
  948. }
  949. void rtl92se_set_mac_addr(struct rtl_io *io, const u8 *addr)
  950. {
  951. /* This is a stub. */
  952. }
  953. void rtl92se_set_check_bssid(struct ieee80211_hw *hw, bool check_bssid)
  954. {
  955. struct rtl_priv *rtlpriv = rtl_priv(hw);
  956. u32 reg_rcr;
  957. if (rtlpriv->psc.rfpwr_state != ERFON)
  958. return;
  959. rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_RCR, (u8 *)(&reg_rcr));
  960. if (check_bssid) {
  961. reg_rcr |= (RCR_CBSSID);
  962. rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_RCR, (u8 *)(&reg_rcr));
  963. } else if (!check_bssid) {
  964. reg_rcr &= (~RCR_CBSSID);
  965. rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_RCR, (u8 *)(&reg_rcr));
  966. }
  967. }
  968. static int _rtl92se_set_media_status(struct ieee80211_hw *hw,
  969. enum nl80211_iftype type)
  970. {
  971. struct rtl_priv *rtlpriv = rtl_priv(hw);
  972. u8 bt_msr = rtl_read_byte(rtlpriv, MSR);
  973. u32 temp;
  974. bt_msr &= ~MSR_LINK_MASK;
  975. switch (type) {
  976. case NL80211_IFTYPE_UNSPECIFIED:
  977. bt_msr |= (MSR_LINK_NONE << MSR_LINK_SHIFT);
  978. RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
  979. "Set Network type to NO LINK!\n");
  980. break;
  981. case NL80211_IFTYPE_ADHOC:
  982. bt_msr |= (MSR_LINK_ADHOC << MSR_LINK_SHIFT);
  983. RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
  984. "Set Network type to Ad Hoc!\n");
  985. break;
  986. case NL80211_IFTYPE_STATION:
  987. bt_msr |= (MSR_LINK_MANAGED << MSR_LINK_SHIFT);
  988. RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
  989. "Set Network type to STA!\n");
  990. break;
  991. case NL80211_IFTYPE_AP:
  992. bt_msr |= (MSR_LINK_MASTER << MSR_LINK_SHIFT);
  993. RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
  994. "Set Network type to AP!\n");
  995. break;
  996. default:
  997. pr_err("Network type %d not supported!\n", type);
  998. return 1;
  999. }
  1000. if (type != NL80211_IFTYPE_AP &&
  1001. rtlpriv->mac80211.link_state < MAC80211_LINKED)
  1002. bt_msr = rtl_read_byte(rtlpriv, MSR) & ~MSR_LINK_MASK;
  1003. rtl_write_byte(rtlpriv, MSR, bt_msr);
  1004. temp = rtl_read_dword(rtlpriv, TCR);
  1005. rtl_write_dword(rtlpriv, TCR, temp & (~BIT(8)));
  1006. rtl_write_dword(rtlpriv, TCR, temp | BIT(8));
  1007. return 0;
  1008. }
  1009. /* HW_VAR_MEDIA_STATUS & HW_VAR_CECHK_BSSID */
  1010. int rtl92se_set_network_type(struct ieee80211_hw *hw, enum nl80211_iftype type)
  1011. {
  1012. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1013. if (_rtl92se_set_media_status(hw, type))
  1014. return -EOPNOTSUPP;
  1015. if (rtlpriv->mac80211.link_state == MAC80211_LINKED) {
  1016. if (type != NL80211_IFTYPE_AP)
  1017. rtl92se_set_check_bssid(hw, true);
  1018. } else {
  1019. rtl92se_set_check_bssid(hw, false);
  1020. }
  1021. return 0;
  1022. }
  1023. /* don't set REG_EDCA_BE_PARAM here because mac80211 will send pkt when scan */
  1024. void rtl92se_set_qos(struct ieee80211_hw *hw, int aci)
  1025. {
  1026. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1027. rtl92s_dm_init_edca_turbo(hw);
  1028. switch (aci) {
  1029. case AC1_BK:
  1030. rtl_write_dword(rtlpriv, EDCAPARA_BK, 0xa44f);
  1031. break;
  1032. case AC0_BE:
  1033. /* rtl_write_dword(rtlpriv, EDCAPARA_BE, u4b_ac_param); */
  1034. break;
  1035. case AC2_VI:
  1036. rtl_write_dword(rtlpriv, EDCAPARA_VI, 0x5e4322);
  1037. break;
  1038. case AC3_VO:
  1039. rtl_write_dword(rtlpriv, EDCAPARA_VO, 0x2f3222);
  1040. break;
  1041. default:
  1042. WARN_ONCE(true, "rtl8192se: invalid aci: %d !\n", aci);
  1043. break;
  1044. }
  1045. }
  1046. void rtl92se_enable_interrupt(struct ieee80211_hw *hw)
  1047. {
  1048. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1049. struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
  1050. rtl_write_dword(rtlpriv, INTA_MASK, rtlpci->irq_mask[0]);
  1051. /* Support Bit 32-37(Assign as Bit 0-5) interrupt setting now */
  1052. rtl_write_dword(rtlpriv, INTA_MASK + 4, rtlpci->irq_mask[1] & 0x3F);
  1053. rtlpci->irq_enabled = true;
  1054. }
  1055. void rtl92se_disable_interrupt(struct ieee80211_hw *hw)
  1056. {
  1057. struct rtl_priv *rtlpriv;
  1058. struct rtl_pci *rtlpci;
  1059. rtlpriv = rtl_priv(hw);
  1060. /* if firmware not available, no interrupts */
  1061. if (!rtlpriv || !rtlpriv->max_fw_size)
  1062. return;
  1063. rtlpci = rtl_pcidev(rtl_pcipriv(hw));
  1064. rtl_write_dword(rtlpriv, INTA_MASK, 0);
  1065. rtl_write_dword(rtlpriv, INTA_MASK + 4, 0);
  1066. rtlpci->irq_enabled = false;
  1067. }
  1068. static u8 _rtl92s_set_sysclk(struct ieee80211_hw *hw, u8 data)
  1069. {
  1070. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1071. u8 waitcnt = 100;
  1072. bool result = false;
  1073. u8 tmp;
  1074. rtl_write_byte(rtlpriv, SYS_CLKR + 1, data);
  1075. /* Wait the MAC synchronized. */
  1076. udelay(400);
  1077. /* Check if it is set ready. */
  1078. tmp = rtl_read_byte(rtlpriv, SYS_CLKR + 1);
  1079. result = ((tmp & BIT(7)) == (data & BIT(7)));
  1080. if ((data & (BIT(6) | BIT(7))) == false) {
  1081. waitcnt = 100;
  1082. tmp = 0;
  1083. while (1) {
  1084. waitcnt--;
  1085. tmp = rtl_read_byte(rtlpriv, SYS_CLKR + 1);
  1086. if ((tmp & BIT(6)))
  1087. break;
  1088. pr_err("wait for BIT(6) return value %x\n", tmp);
  1089. if (waitcnt == 0)
  1090. break;
  1091. udelay(10);
  1092. }
  1093. if (waitcnt == 0)
  1094. result = false;
  1095. else
  1096. result = true;
  1097. }
  1098. return result;
  1099. }
  1100. static void _rtl92s_phy_set_rfhalt(struct ieee80211_hw *hw)
  1101. {
  1102. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1103. struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
  1104. struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
  1105. u8 u1btmp;
  1106. if (rtlhal->driver_going2unload)
  1107. rtl_write_byte(rtlpriv, 0x560, 0x0);
  1108. /* Power save for BB/RF */
  1109. u1btmp = rtl_read_byte(rtlpriv, LDOV12D_CTRL);
  1110. u1btmp |= BIT(0);
  1111. rtl_write_byte(rtlpriv, LDOV12D_CTRL, u1btmp);
  1112. rtl_write_byte(rtlpriv, SPS1_CTRL, 0x0);
  1113. rtl_write_byte(rtlpriv, TXPAUSE, 0xFF);
  1114. rtl_write_word(rtlpriv, CMDR, 0x57FC);
  1115. udelay(100);
  1116. rtl_write_word(rtlpriv, CMDR, 0x77FC);
  1117. rtl_write_byte(rtlpriv, PHY_CCA, 0x0);
  1118. udelay(10);
  1119. rtl_write_word(rtlpriv, CMDR, 0x37FC);
  1120. udelay(10);
  1121. rtl_write_word(rtlpriv, CMDR, 0x77FC);
  1122. udelay(10);
  1123. rtl_write_word(rtlpriv, CMDR, 0x57FC);
  1124. rtl_write_word(rtlpriv, CMDR, 0x0000);
  1125. if (rtlhal->driver_going2unload) {
  1126. u1btmp = rtl_read_byte(rtlpriv, (REG_SYS_FUNC_EN + 1));
  1127. u1btmp &= ~(BIT(0));
  1128. rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN + 1, u1btmp);
  1129. }
  1130. u1btmp = rtl_read_byte(rtlpriv, (SYS_CLKR + 1));
  1131. /* Add description. After switch control path. register
  1132. * after page1 will be invisible. We can not do any IO
  1133. * for register>0x40. After resume&MACIO reset, we need
  1134. * to remember previous reg content. */
  1135. if (u1btmp & BIT(7)) {
  1136. u1btmp &= ~(BIT(6) | BIT(7));
  1137. if (!_rtl92s_set_sysclk(hw, u1btmp)) {
  1138. pr_err("Switch ctrl path fail\n");
  1139. return;
  1140. }
  1141. }
  1142. /* Power save for MAC */
  1143. if (ppsc->rfoff_reason == RF_CHANGE_BY_IPS &&
  1144. !rtlhal->driver_going2unload) {
  1145. /* enable LED function */
  1146. rtl_write_byte(rtlpriv, 0x03, 0xF9);
  1147. /* SW/HW radio off or halt adapter!! For example S3/S4 */
  1148. } else {
  1149. /* LED function disable. Power range is about 8mA now. */
  1150. /* if write 0xF1 disconnet_pci power
  1151. * ifconfig wlan0 down power are both high 35:70 */
  1152. /* if write oxF9 disconnet_pci power
  1153. * ifconfig wlan0 down power are both low 12:45*/
  1154. rtl_write_byte(rtlpriv, 0x03, 0xF9);
  1155. }
  1156. rtl_write_byte(rtlpriv, SYS_CLKR + 1, 0x70);
  1157. rtl_write_byte(rtlpriv, AFE_PLL_CTRL + 1, 0x68);
  1158. rtl_write_byte(rtlpriv, AFE_PLL_CTRL, 0x00);
  1159. rtl_write_byte(rtlpriv, LDOA15_CTRL, 0x34);
  1160. rtl_write_byte(rtlpriv, AFE_XTAL_CTRL, 0x0E);
  1161. RT_SET_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC);
  1162. }
  1163. static void _rtl92se_gen_refreshledstate(struct ieee80211_hw *hw)
  1164. {
  1165. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1166. struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
  1167. struct rtl_led *pled0 = &rtlpriv->ledctl.sw_led0;
  1168. if (rtlpci->up_first_time == 1)
  1169. return;
  1170. if (rtlpriv->psc.rfoff_reason == RF_CHANGE_BY_IPS)
  1171. rtl92se_sw_led_on(hw, pled0);
  1172. else
  1173. rtl92se_sw_led_off(hw, pled0);
  1174. }
  1175. static void _rtl92se_power_domain_init(struct ieee80211_hw *hw)
  1176. {
  1177. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1178. u16 tmpu2b;
  1179. u8 tmpu1b;
  1180. rtlpriv->psc.pwrdomain_protect = true;
  1181. tmpu1b = rtl_read_byte(rtlpriv, (SYS_CLKR + 1));
  1182. if (tmpu1b & BIT(7)) {
  1183. tmpu1b &= ~(BIT(6) | BIT(7));
  1184. if (!_rtl92s_set_sysclk(hw, tmpu1b)) {
  1185. rtlpriv->psc.pwrdomain_protect = false;
  1186. return;
  1187. }
  1188. }
  1189. rtl_write_byte(rtlpriv, AFE_PLL_CTRL, 0x0);
  1190. rtl_write_byte(rtlpriv, LDOA15_CTRL, 0x34);
  1191. /* Reset MAC-IO and CPU and Core Digital BIT10/11/15 */
  1192. tmpu1b = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN + 1);
  1193. /* If IPS we need to turn LED on. So we not
  1194. * not disable BIT 3/7 of reg3. */
  1195. if (rtlpriv->psc.rfoff_reason & (RF_CHANGE_BY_IPS | RF_CHANGE_BY_HW))
  1196. tmpu1b &= 0xFB;
  1197. else
  1198. tmpu1b &= 0x73;
  1199. rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN + 1, tmpu1b);
  1200. /* wait for BIT 10/11/15 to pull high automatically!! */
  1201. mdelay(1);
  1202. rtl_write_byte(rtlpriv, CMDR, 0);
  1203. rtl_write_byte(rtlpriv, TCR, 0);
  1204. /* Data sheet not define 0x562!!! Copy from WMAC!!!!! */
  1205. tmpu1b = rtl_read_byte(rtlpriv, 0x562);
  1206. tmpu1b |= 0x08;
  1207. rtl_write_byte(rtlpriv, 0x562, tmpu1b);
  1208. tmpu1b &= ~(BIT(3));
  1209. rtl_write_byte(rtlpriv, 0x562, tmpu1b);
  1210. /* Enable AFE clock source */
  1211. tmpu1b = rtl_read_byte(rtlpriv, AFE_XTAL_CTRL);
  1212. rtl_write_byte(rtlpriv, AFE_XTAL_CTRL, (tmpu1b | 0x01));
  1213. /* Delay 1.5ms */
  1214. udelay(1500);
  1215. tmpu1b = rtl_read_byte(rtlpriv, AFE_XTAL_CTRL + 1);
  1216. rtl_write_byte(rtlpriv, AFE_XTAL_CTRL + 1, (tmpu1b & 0xfb));
  1217. /* Enable AFE Macro Block's Bandgap */
  1218. tmpu1b = rtl_read_byte(rtlpriv, AFE_MISC);
  1219. rtl_write_byte(rtlpriv, AFE_MISC, (tmpu1b | BIT(0)));
  1220. mdelay(1);
  1221. /* Enable AFE Mbias */
  1222. tmpu1b = rtl_read_byte(rtlpriv, AFE_MISC);
  1223. rtl_write_byte(rtlpriv, AFE_MISC, (tmpu1b | 0x02));
  1224. mdelay(1);
  1225. /* Enable LDOA15 block */
  1226. tmpu1b = rtl_read_byte(rtlpriv, LDOA15_CTRL);
  1227. rtl_write_byte(rtlpriv, LDOA15_CTRL, (tmpu1b | BIT(0)));
  1228. /* Set Digital Vdd to Retention isolation Path. */
  1229. tmpu2b = rtl_read_word(rtlpriv, REG_SYS_ISO_CTRL);
  1230. rtl_write_word(rtlpriv, REG_SYS_ISO_CTRL, (tmpu2b | BIT(11)));
  1231. /* For warm reboot NIC disappera bug. */
  1232. tmpu2b = rtl_read_word(rtlpriv, REG_SYS_FUNC_EN);
  1233. rtl_write_word(rtlpriv, REG_SYS_FUNC_EN, (tmpu2b | BIT(13)));
  1234. rtl_write_byte(rtlpriv, REG_SYS_ISO_CTRL + 1, 0x68);
  1235. /* Enable AFE PLL Macro Block */
  1236. tmpu1b = rtl_read_byte(rtlpriv, AFE_PLL_CTRL);
  1237. rtl_write_byte(rtlpriv, AFE_PLL_CTRL, (tmpu1b | BIT(0) | BIT(4)));
  1238. /* Enable MAC 80MHZ clock */
  1239. tmpu1b = rtl_read_byte(rtlpriv, AFE_PLL_CTRL + 1);
  1240. rtl_write_byte(rtlpriv, AFE_PLL_CTRL + 1, (tmpu1b | BIT(0)));
  1241. mdelay(1);
  1242. /* Release isolation AFE PLL & MD */
  1243. rtl_write_byte(rtlpriv, REG_SYS_ISO_CTRL, 0xA6);
  1244. /* Enable MAC clock */
  1245. tmpu2b = rtl_read_word(rtlpriv, SYS_CLKR);
  1246. rtl_write_word(rtlpriv, SYS_CLKR, (tmpu2b | BIT(12) | BIT(11)));
  1247. /* Enable Core digital and enable IOREG R/W */
  1248. tmpu2b = rtl_read_word(rtlpriv, REG_SYS_FUNC_EN);
  1249. rtl_write_word(rtlpriv, REG_SYS_FUNC_EN, (tmpu2b | BIT(11)));
  1250. /* enable REG_EN */
  1251. rtl_write_word(rtlpriv, REG_SYS_FUNC_EN, (tmpu2b | BIT(11) | BIT(15)));
  1252. /* Switch the control path. */
  1253. tmpu2b = rtl_read_word(rtlpriv, SYS_CLKR);
  1254. rtl_write_word(rtlpriv, SYS_CLKR, (tmpu2b & (~BIT(2))));
  1255. tmpu1b = rtl_read_byte(rtlpriv, (SYS_CLKR + 1));
  1256. tmpu1b = ((tmpu1b | BIT(7)) & (~BIT(6)));
  1257. if (!_rtl92s_set_sysclk(hw, tmpu1b)) {
  1258. rtlpriv->psc.pwrdomain_protect = false;
  1259. return;
  1260. }
  1261. rtl_write_word(rtlpriv, CMDR, 0x37FC);
  1262. /* After MACIO reset,we must refresh LED state. */
  1263. _rtl92se_gen_refreshledstate(hw);
  1264. rtlpriv->psc.pwrdomain_protect = false;
  1265. }
  1266. void rtl92se_card_disable(struct ieee80211_hw *hw)
  1267. {
  1268. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1269. struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
  1270. struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
  1271. struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
  1272. enum nl80211_iftype opmode;
  1273. u8 wait = 30;
  1274. rtlpriv->intf_ops->enable_aspm(hw);
  1275. if (rtlpci->driver_is_goingto_unload ||
  1276. ppsc->rfoff_reason > RF_CHANGE_BY_PS)
  1277. rtlpriv->cfg->ops->led_control(hw, LED_CTL_POWER_OFF);
  1278. /* we should chnge GPIO to input mode
  1279. * this will drop away current about 25mA*/
  1280. rtl8192se_gpiobit3_cfg_inputmode(hw);
  1281. /* this is very important for ips power save */
  1282. while (wait-- >= 10 && rtlpriv->psc.pwrdomain_protect) {
  1283. if (rtlpriv->psc.pwrdomain_protect)
  1284. mdelay(20);
  1285. else
  1286. break;
  1287. }
  1288. mac->link_state = MAC80211_NOLINK;
  1289. opmode = NL80211_IFTYPE_UNSPECIFIED;
  1290. _rtl92se_set_media_status(hw, opmode);
  1291. _rtl92s_phy_set_rfhalt(hw);
  1292. udelay(100);
  1293. }
  1294. void rtl92se_interrupt_recognized(struct ieee80211_hw *hw, u32 *p_inta,
  1295. u32 *p_intb)
  1296. {
  1297. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1298. struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
  1299. *p_inta = rtl_read_dword(rtlpriv, ISR) & rtlpci->irq_mask[0];
  1300. rtl_write_dword(rtlpriv, ISR, *p_inta);
  1301. *p_intb = rtl_read_dword(rtlpriv, ISR + 4) & rtlpci->irq_mask[1];
  1302. rtl_write_dword(rtlpriv, ISR + 4, *p_intb);
  1303. }
  1304. void rtl92se_set_beacon_related_registers(struct ieee80211_hw *hw)
  1305. {
  1306. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1307. struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
  1308. u16 bcntime_cfg = 0;
  1309. u16 bcn_cw = 6, bcn_ifs = 0xf;
  1310. u16 atim_window = 2;
  1311. /* ATIM Window (in unit of TU). */
  1312. rtl_write_word(rtlpriv, ATIMWND, atim_window);
  1313. /* Beacon interval (in unit of TU). */
  1314. rtl_write_word(rtlpriv, BCN_INTERVAL, mac->beacon_interval);
  1315. /* DrvErlyInt (in unit of TU). (Time to send
  1316. * interrupt to notify driver to change
  1317. * beacon content) */
  1318. rtl_write_word(rtlpriv, BCN_DRV_EARLY_INT, 10 << 4);
  1319. /* BcnDMATIM(in unit of us). Indicates the
  1320. * time before TBTT to perform beacon queue DMA */
  1321. rtl_write_word(rtlpriv, BCN_DMATIME, 256);
  1322. /* Force beacon frame transmission even
  1323. * after receiving beacon frame from
  1324. * other ad hoc STA */
  1325. rtl_write_byte(rtlpriv, BCN_ERR_THRESH, 100);
  1326. /* Beacon Time Configuration */
  1327. if (mac->opmode == NL80211_IFTYPE_ADHOC)
  1328. bcntime_cfg |= (bcn_cw << BCN_TCFG_CW_SHIFT);
  1329. /* TODO: bcn_ifs may required to be changed on ASIC */
  1330. bcntime_cfg |= bcn_ifs << BCN_TCFG_IFS;
  1331. /*for beacon changed */
  1332. rtl92s_phy_set_beacon_hwreg(hw, mac->beacon_interval);
  1333. }
  1334. void rtl92se_set_beacon_interval(struct ieee80211_hw *hw)
  1335. {
  1336. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1337. struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
  1338. u16 bcn_interval = mac->beacon_interval;
  1339. /* Beacon interval (in unit of TU). */
  1340. rtl_write_word(rtlpriv, BCN_INTERVAL, bcn_interval);
  1341. /* 2008.10.24 added by tynli for beacon changed. */
  1342. rtl92s_phy_set_beacon_hwreg(hw, bcn_interval);
  1343. }
  1344. void rtl92se_update_interrupt_mask(struct ieee80211_hw *hw,
  1345. u32 add_msr, u32 rm_msr)
  1346. {
  1347. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1348. struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
  1349. RT_TRACE(rtlpriv, COMP_INTR, DBG_LOUD, "add_msr:%x, rm_msr:%x\n",
  1350. add_msr, rm_msr);
  1351. if (add_msr)
  1352. rtlpci->irq_mask[0] |= add_msr;
  1353. if (rm_msr)
  1354. rtlpci->irq_mask[0] &= (~rm_msr);
  1355. rtl92se_disable_interrupt(hw);
  1356. rtl92se_enable_interrupt(hw);
  1357. }
  1358. static void _rtl8192se_get_IC_Inferiority(struct ieee80211_hw *hw)
  1359. {
  1360. struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
  1361. struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
  1362. u8 efuse_id;
  1363. rtlhal->ic_class = IC_INFERIORITY_A;
  1364. /* Only retrieving while using EFUSE. */
  1365. if ((rtlefuse->epromtype == EEPROM_BOOT_EFUSE) &&
  1366. !rtlefuse->autoload_failflag) {
  1367. efuse_id = efuse_read_1byte(hw, EFUSE_IC_ID_OFFSET);
  1368. if (efuse_id == 0xfe)
  1369. rtlhal->ic_class = IC_INFERIORITY_B;
  1370. }
  1371. }
  1372. static void _rtl92se_read_adapter_info(struct ieee80211_hw *hw)
  1373. {
  1374. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1375. struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
  1376. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  1377. struct device *dev = &rtl_pcipriv(hw)->dev.pdev->dev;
  1378. u16 i, usvalue;
  1379. u16 eeprom_id;
  1380. u8 tempval;
  1381. u8 hwinfo[HWSET_MAX_SIZE_92S];
  1382. u8 rf_path, index;
  1383. switch (rtlefuse->epromtype) {
  1384. case EEPROM_BOOT_EFUSE:
  1385. rtl_efuse_shadow_map_update(hw);
  1386. break;
  1387. case EEPROM_93C46:
  1388. pr_err("RTL819X Not boot from eeprom, check it !!\n");
  1389. return;
  1390. default:
  1391. dev_warn(dev, "no efuse data\n");
  1392. return;
  1393. }
  1394. memcpy(hwinfo, &rtlefuse->efuse_map[EFUSE_INIT_MAP][0],
  1395. HWSET_MAX_SIZE_92S);
  1396. RT_PRINT_DATA(rtlpriv, COMP_INIT, DBG_DMESG, "MAP",
  1397. hwinfo, HWSET_MAX_SIZE_92S);
  1398. eeprom_id = *((u16 *)&hwinfo[0]);
  1399. if (eeprom_id != RTL8190_EEPROM_ID) {
  1400. RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
  1401. "EEPROM ID(%#x) is invalid!!\n", eeprom_id);
  1402. rtlefuse->autoload_failflag = true;
  1403. } else {
  1404. RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "Autoload OK\n");
  1405. rtlefuse->autoload_failflag = false;
  1406. }
  1407. if (rtlefuse->autoload_failflag)
  1408. return;
  1409. _rtl8192se_get_IC_Inferiority(hw);
  1410. /* Read IC Version && Channel Plan */
  1411. /* VID, DID SE 0xA-D */
  1412. rtlefuse->eeprom_vid = *(u16 *)&hwinfo[EEPROM_VID];
  1413. rtlefuse->eeprom_did = *(u16 *)&hwinfo[EEPROM_DID];
  1414. rtlefuse->eeprom_svid = *(u16 *)&hwinfo[EEPROM_SVID];
  1415. rtlefuse->eeprom_smid = *(u16 *)&hwinfo[EEPROM_SMID];
  1416. rtlefuse->eeprom_version = *(u16 *)&hwinfo[EEPROM_VERSION];
  1417. RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
  1418. "EEPROMId = 0x%4x\n", eeprom_id);
  1419. RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
  1420. "EEPROM VID = 0x%4x\n", rtlefuse->eeprom_vid);
  1421. RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
  1422. "EEPROM DID = 0x%4x\n", rtlefuse->eeprom_did);
  1423. RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
  1424. "EEPROM SVID = 0x%4x\n", rtlefuse->eeprom_svid);
  1425. RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
  1426. "EEPROM SMID = 0x%4x\n", rtlefuse->eeprom_smid);
  1427. for (i = 0; i < 6; i += 2) {
  1428. usvalue = *(u16 *)&hwinfo[EEPROM_MAC_ADDR + i];
  1429. *((u16 *) (&rtlefuse->dev_addr[i])) = usvalue;
  1430. }
  1431. for (i = 0; i < 6; i++)
  1432. rtl_write_byte(rtlpriv, MACIDR0 + i, rtlefuse->dev_addr[i]);
  1433. RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "%pM\n", rtlefuse->dev_addr);
  1434. /* Get Tx Power Level by Channel */
  1435. /* Read Tx power of Channel 1 ~ 14 from EEPROM. */
  1436. /* 92S suupport RF A & B */
  1437. for (rf_path = 0; rf_path < 2; rf_path++) {
  1438. for (i = 0; i < 3; i++) {
  1439. /* Read CCK RF A & B Tx power */
  1440. rtlefuse->eeprom_chnlarea_txpwr_cck[rf_path][i] =
  1441. hwinfo[EEPROM_TXPOWERBASE + rf_path * 3 + i];
  1442. /* Read OFDM RF A & B Tx power for 1T */
  1443. rtlefuse->eeprom_chnlarea_txpwr_ht40_1s[rf_path][i] =
  1444. hwinfo[EEPROM_TXPOWERBASE + 6 + rf_path * 3 + i];
  1445. /* Read OFDM RF A & B Tx power for 2T */
  1446. rtlefuse->eprom_chnl_txpwr_ht40_2sdf[rf_path][i]
  1447. = hwinfo[EEPROM_TXPOWERBASE + 12 +
  1448. rf_path * 3 + i];
  1449. }
  1450. }
  1451. for (rf_path = 0; rf_path < 2; rf_path++)
  1452. for (i = 0; i < 3; i++)
  1453. RTPRINT(rtlpriv, FINIT, INIT_EEPROM,
  1454. "RF(%d) EEPROM CCK Area(%d) = 0x%x\n",
  1455. rf_path, i,
  1456. rtlefuse->eeprom_chnlarea_txpwr_cck
  1457. [rf_path][i]);
  1458. for (rf_path = 0; rf_path < 2; rf_path++)
  1459. for (i = 0; i < 3; i++)
  1460. RTPRINT(rtlpriv, FINIT, INIT_EEPROM,
  1461. "RF(%d) EEPROM HT40 1S Area(%d) = 0x%x\n",
  1462. rf_path, i,
  1463. rtlefuse->eeprom_chnlarea_txpwr_ht40_1s
  1464. [rf_path][i]);
  1465. for (rf_path = 0; rf_path < 2; rf_path++)
  1466. for (i = 0; i < 3; i++)
  1467. RTPRINT(rtlpriv, FINIT, INIT_EEPROM,
  1468. "RF(%d) EEPROM HT40 2S Diff Area(%d) = 0x%x\n",
  1469. rf_path, i,
  1470. rtlefuse->eprom_chnl_txpwr_ht40_2sdf
  1471. [rf_path][i]);
  1472. for (rf_path = 0; rf_path < 2; rf_path++) {
  1473. /* Assign dedicated channel tx power */
  1474. for (i = 0; i < 14; i++) {
  1475. /* channel 1~3 use the same Tx Power Level. */
  1476. if (i < 3)
  1477. index = 0;
  1478. /* Channel 4-8 */
  1479. else if (i < 8)
  1480. index = 1;
  1481. /* Channel 9-14 */
  1482. else
  1483. index = 2;
  1484. /* Record A & B CCK /OFDM - 1T/2T Channel area
  1485. * tx power */
  1486. rtlefuse->txpwrlevel_cck[rf_path][i] =
  1487. rtlefuse->eeprom_chnlarea_txpwr_cck
  1488. [rf_path][index];
  1489. rtlefuse->txpwrlevel_ht40_1s[rf_path][i] =
  1490. rtlefuse->eeprom_chnlarea_txpwr_ht40_1s
  1491. [rf_path][index];
  1492. rtlefuse->txpwrlevel_ht40_2s[rf_path][i] =
  1493. rtlefuse->eprom_chnl_txpwr_ht40_2sdf
  1494. [rf_path][index];
  1495. }
  1496. for (i = 0; i < 14; i++) {
  1497. RTPRINT(rtlpriv, FINIT, INIT_TXPOWER,
  1498. "RF(%d)-Ch(%d) [CCK / HT40_1S / HT40_2S] = [0x%x / 0x%x / 0x%x]\n",
  1499. rf_path, i,
  1500. rtlefuse->txpwrlevel_cck[rf_path][i],
  1501. rtlefuse->txpwrlevel_ht40_1s[rf_path][i],
  1502. rtlefuse->txpwrlevel_ht40_2s[rf_path][i]);
  1503. }
  1504. }
  1505. for (rf_path = 0; rf_path < 2; rf_path++) {
  1506. for (i = 0; i < 3; i++) {
  1507. /* Read Power diff limit. */
  1508. rtlefuse->eeprom_pwrgroup[rf_path][i] =
  1509. hwinfo[EEPROM_TXPWRGROUP + rf_path * 3 + i];
  1510. }
  1511. }
  1512. for (rf_path = 0; rf_path < 2; rf_path++) {
  1513. /* Fill Pwr group */
  1514. for (i = 0; i < 14; i++) {
  1515. /* Chanel 1-3 */
  1516. if (i < 3)
  1517. index = 0;
  1518. /* Channel 4-8 */
  1519. else if (i < 8)
  1520. index = 1;
  1521. /* Channel 9-13 */
  1522. else
  1523. index = 2;
  1524. rtlefuse->pwrgroup_ht20[rf_path][i] =
  1525. (rtlefuse->eeprom_pwrgroup[rf_path][index] &
  1526. 0xf);
  1527. rtlefuse->pwrgroup_ht40[rf_path][i] =
  1528. ((rtlefuse->eeprom_pwrgroup[rf_path][index] &
  1529. 0xf0) >> 4);
  1530. RTPRINT(rtlpriv, FINIT, INIT_TXPOWER,
  1531. "RF-%d pwrgroup_ht20[%d] = 0x%x\n",
  1532. rf_path, i,
  1533. rtlefuse->pwrgroup_ht20[rf_path][i]);
  1534. RTPRINT(rtlpriv, FINIT, INIT_TXPOWER,
  1535. "RF-%d pwrgroup_ht40[%d] = 0x%x\n",
  1536. rf_path, i,
  1537. rtlefuse->pwrgroup_ht40[rf_path][i]);
  1538. }
  1539. }
  1540. for (i = 0; i < 14; i++) {
  1541. /* Read tx power difference between HT OFDM 20/40 MHZ */
  1542. /* channel 1-3 */
  1543. if (i < 3)
  1544. index = 0;
  1545. /* Channel 4-8 */
  1546. else if (i < 8)
  1547. index = 1;
  1548. /* Channel 9-14 */
  1549. else
  1550. index = 2;
  1551. tempval = hwinfo[EEPROM_TX_PWR_HT20_DIFF + index] & 0xff;
  1552. rtlefuse->txpwr_ht20diff[RF90_PATH_A][i] = (tempval & 0xF);
  1553. rtlefuse->txpwr_ht20diff[RF90_PATH_B][i] =
  1554. ((tempval >> 4) & 0xF);
  1555. /* Read OFDM<->HT tx power diff */
  1556. /* Channel 1-3 */
  1557. if (i < 3)
  1558. index = 0;
  1559. /* Channel 4-8 */
  1560. else if (i < 8)
  1561. index = 0x11;
  1562. /* Channel 9-14 */
  1563. else
  1564. index = 1;
  1565. tempval = hwinfo[EEPROM_TX_PWR_OFDM_DIFF + index] & 0xff;
  1566. rtlefuse->txpwr_legacyhtdiff[RF90_PATH_A][i] =
  1567. (tempval & 0xF);
  1568. rtlefuse->txpwr_legacyhtdiff[RF90_PATH_B][i] =
  1569. ((tempval >> 4) & 0xF);
  1570. tempval = hwinfo[TX_PWR_SAFETY_CHK];
  1571. rtlefuse->txpwr_safetyflag = (tempval & 0x01);
  1572. }
  1573. rtlefuse->eeprom_regulatory = 0;
  1574. if (rtlefuse->eeprom_version >= 2) {
  1575. /* BIT(0)~2 */
  1576. if (rtlefuse->eeprom_version >= 4)
  1577. rtlefuse->eeprom_regulatory =
  1578. (hwinfo[EEPROM_REGULATORY] & 0x7);
  1579. else /* BIT(0) */
  1580. rtlefuse->eeprom_regulatory =
  1581. (hwinfo[EEPROM_REGULATORY] & 0x1);
  1582. }
  1583. RTPRINT(rtlpriv, FINIT, INIT_TXPOWER,
  1584. "eeprom_regulatory = 0x%x\n", rtlefuse->eeprom_regulatory);
  1585. for (i = 0; i < 14; i++)
  1586. RTPRINT(rtlpriv, FINIT, INIT_TXPOWER,
  1587. "RF-A Ht20 to HT40 Diff[%d] = 0x%x\n",
  1588. i, rtlefuse->txpwr_ht20diff[RF90_PATH_A][i]);
  1589. for (i = 0; i < 14; i++)
  1590. RTPRINT(rtlpriv, FINIT, INIT_TXPOWER,
  1591. "RF-A Legacy to Ht40 Diff[%d] = 0x%x\n",
  1592. i, rtlefuse->txpwr_legacyhtdiff[RF90_PATH_A][i]);
  1593. for (i = 0; i < 14; i++)
  1594. RTPRINT(rtlpriv, FINIT, INIT_TXPOWER,
  1595. "RF-B Ht20 to HT40 Diff[%d] = 0x%x\n",
  1596. i, rtlefuse->txpwr_ht20diff[RF90_PATH_B][i]);
  1597. for (i = 0; i < 14; i++)
  1598. RTPRINT(rtlpriv, FINIT, INIT_TXPOWER,
  1599. "RF-B Legacy to HT40 Diff[%d] = 0x%x\n",
  1600. i, rtlefuse->txpwr_legacyhtdiff[RF90_PATH_B][i]);
  1601. RTPRINT(rtlpriv, FINIT, INIT_TXPOWER,
  1602. "TxPwrSafetyFlag = %d\n", rtlefuse->txpwr_safetyflag);
  1603. /* Read RF-indication and Tx Power gain
  1604. * index diff of legacy to HT OFDM rate. */
  1605. tempval = hwinfo[EEPROM_RFIND_POWERDIFF] & 0xff;
  1606. rtlefuse->eeprom_txpowerdiff = tempval;
  1607. rtlefuse->legacy_httxpowerdiff =
  1608. rtlefuse->txpwr_legacyhtdiff[RF90_PATH_A][0];
  1609. RTPRINT(rtlpriv, FINIT, INIT_TXPOWER,
  1610. "TxPowerDiff = %#x\n", rtlefuse->eeprom_txpowerdiff);
  1611. /* Get TSSI value for each path. */
  1612. usvalue = *(u16 *)&hwinfo[EEPROM_TSSI_A];
  1613. rtlefuse->eeprom_tssi[RF90_PATH_A] = (u8)((usvalue & 0xff00) >> 8);
  1614. usvalue = hwinfo[EEPROM_TSSI_B];
  1615. rtlefuse->eeprom_tssi[RF90_PATH_B] = (u8)(usvalue & 0xff);
  1616. RTPRINT(rtlpriv, FINIT, INIT_TXPOWER, "TSSI_A = 0x%x, TSSI_B = 0x%x\n",
  1617. rtlefuse->eeprom_tssi[RF90_PATH_A],
  1618. rtlefuse->eeprom_tssi[RF90_PATH_B]);
  1619. /* Read antenna tx power offset of B/C/D to A from EEPROM */
  1620. /* and read ThermalMeter from EEPROM */
  1621. tempval = hwinfo[EEPROM_THERMALMETER];
  1622. rtlefuse->eeprom_thermalmeter = tempval;
  1623. RTPRINT(rtlpriv, FINIT, INIT_TXPOWER,
  1624. "thermalmeter = 0x%x\n", rtlefuse->eeprom_thermalmeter);
  1625. /* ThermalMeter, BIT(0)~3 for RFIC1, BIT(4)~7 for RFIC2 */
  1626. rtlefuse->thermalmeter[0] = (rtlefuse->eeprom_thermalmeter & 0x1f);
  1627. rtlefuse->tssi_13dbm = rtlefuse->eeprom_thermalmeter * 100;
  1628. /* Read CrystalCap from EEPROM */
  1629. tempval = hwinfo[EEPROM_CRYSTALCAP] >> 4;
  1630. rtlefuse->eeprom_crystalcap = tempval;
  1631. /* CrystalCap, BIT(12)~15 */
  1632. rtlefuse->crystalcap = rtlefuse->eeprom_crystalcap;
  1633. /* Read IC Version && Channel Plan */
  1634. /* Version ID, Channel plan */
  1635. rtlefuse->eeprom_channelplan = hwinfo[EEPROM_CHANNELPLAN];
  1636. rtlefuse->txpwr_fromeprom = true;
  1637. RTPRINT(rtlpriv, FINIT, INIT_TXPOWER,
  1638. "EEPROM ChannelPlan = 0x%4x\n", rtlefuse->eeprom_channelplan);
  1639. /* Read Customer ID or Board Type!!! */
  1640. tempval = hwinfo[EEPROM_BOARDTYPE];
  1641. /* Change RF type definition */
  1642. if (tempval == 0)
  1643. rtlphy->rf_type = RF_2T2R;
  1644. else if (tempval == 1)
  1645. rtlphy->rf_type = RF_1T2R;
  1646. else if (tempval == 2)
  1647. rtlphy->rf_type = RF_1T2R;
  1648. else if (tempval == 3)
  1649. rtlphy->rf_type = RF_1T1R;
  1650. /* 1T2R but 1SS (1x1 receive combining) */
  1651. rtlefuse->b1x1_recvcombine = false;
  1652. if (rtlphy->rf_type == RF_1T2R) {
  1653. tempval = rtl_read_byte(rtlpriv, 0x07);
  1654. if (!(tempval & BIT(0))) {
  1655. rtlefuse->b1x1_recvcombine = true;
  1656. RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
  1657. "RF_TYPE=1T2R but only 1SS\n");
  1658. }
  1659. }
  1660. rtlefuse->b1ss_support = rtlefuse->b1x1_recvcombine;
  1661. rtlefuse->eeprom_oemid = *&hwinfo[EEPROM_CUSTOMID];
  1662. RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "EEPROM Customer ID: 0x%2x\n",
  1663. rtlefuse->eeprom_oemid);
  1664. /* set channel paln to world wide 13 */
  1665. rtlefuse->channel_plan = COUNTRY_CODE_WORLD_WIDE_13;
  1666. }
  1667. void rtl92se_read_eeprom_info(struct ieee80211_hw *hw)
  1668. {
  1669. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1670. struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
  1671. u8 tmp_u1b = 0;
  1672. tmp_u1b = rtl_read_byte(rtlpriv, EPROM_CMD);
  1673. if (tmp_u1b & BIT(4)) {
  1674. RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "Boot from EEPROM\n");
  1675. rtlefuse->epromtype = EEPROM_93C46;
  1676. } else {
  1677. RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "Boot from EFUSE\n");
  1678. rtlefuse->epromtype = EEPROM_BOOT_EFUSE;
  1679. }
  1680. if (tmp_u1b & BIT(5)) {
  1681. RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "Autoload OK\n");
  1682. rtlefuse->autoload_failflag = false;
  1683. _rtl92se_read_adapter_info(hw);
  1684. } else {
  1685. pr_err("Autoload ERR!!\n");
  1686. rtlefuse->autoload_failflag = true;
  1687. }
  1688. }
  1689. static void rtl92se_update_hal_rate_table(struct ieee80211_hw *hw,
  1690. struct ieee80211_sta *sta)
  1691. {
  1692. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1693. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  1694. struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
  1695. struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
  1696. u32 ratr_value;
  1697. u8 ratr_index = 0;
  1698. u8 nmode = mac->ht_enable;
  1699. u8 mimo_ps = IEEE80211_SMPS_OFF;
  1700. u16 shortgi_rate = 0;
  1701. u32 tmp_ratr_value = 0;
  1702. u8 curtxbw_40mhz = mac->bw_40;
  1703. u8 curshortgi_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
  1704. 1 : 0;
  1705. u8 curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
  1706. 1 : 0;
  1707. enum wireless_mode wirelessmode = mac->mode;
  1708. if (rtlhal->current_bandtype == BAND_ON_5G)
  1709. ratr_value = sta->supp_rates[1] << 4;
  1710. else
  1711. ratr_value = sta->supp_rates[0];
  1712. if (mac->opmode == NL80211_IFTYPE_ADHOC)
  1713. ratr_value = 0xfff;
  1714. ratr_value |= (sta->ht_cap.mcs.rx_mask[1] << 20 |
  1715. sta->ht_cap.mcs.rx_mask[0] << 12);
  1716. switch (wirelessmode) {
  1717. case WIRELESS_MODE_B:
  1718. ratr_value &= 0x0000000D;
  1719. break;
  1720. case WIRELESS_MODE_G:
  1721. ratr_value &= 0x00000FF5;
  1722. break;
  1723. case WIRELESS_MODE_N_24G:
  1724. case WIRELESS_MODE_N_5G:
  1725. nmode = 1;
  1726. if (mimo_ps == IEEE80211_SMPS_STATIC) {
  1727. ratr_value &= 0x0007F005;
  1728. } else {
  1729. u32 ratr_mask;
  1730. if (get_rf_type(rtlphy) == RF_1T2R ||
  1731. get_rf_type(rtlphy) == RF_1T1R) {
  1732. if (curtxbw_40mhz)
  1733. ratr_mask = 0x000ff015;
  1734. else
  1735. ratr_mask = 0x000ff005;
  1736. } else {
  1737. if (curtxbw_40mhz)
  1738. ratr_mask = 0x0f0ff015;
  1739. else
  1740. ratr_mask = 0x0f0ff005;
  1741. }
  1742. ratr_value &= ratr_mask;
  1743. }
  1744. break;
  1745. default:
  1746. if (rtlphy->rf_type == RF_1T2R)
  1747. ratr_value &= 0x000ff0ff;
  1748. else
  1749. ratr_value &= 0x0f0ff0ff;
  1750. break;
  1751. }
  1752. if (rtlpriv->rtlhal.version >= VERSION_8192S_BCUT)
  1753. ratr_value &= 0x0FFFFFFF;
  1754. else if (rtlpriv->rtlhal.version == VERSION_8192S_ACUT)
  1755. ratr_value &= 0x0FFFFFF0;
  1756. if (nmode && ((curtxbw_40mhz &&
  1757. curshortgi_40mhz) || (!curtxbw_40mhz &&
  1758. curshortgi_20mhz))) {
  1759. ratr_value |= 0x10000000;
  1760. tmp_ratr_value = (ratr_value >> 12);
  1761. for (shortgi_rate = 15; shortgi_rate > 0; shortgi_rate--) {
  1762. if ((1 << shortgi_rate) & tmp_ratr_value)
  1763. break;
  1764. }
  1765. shortgi_rate = (shortgi_rate << 12) | (shortgi_rate << 8) |
  1766. (shortgi_rate << 4) | (shortgi_rate);
  1767. rtl_write_byte(rtlpriv, SG_RATE, shortgi_rate);
  1768. }
  1769. rtl_write_dword(rtlpriv, ARFR0 + ratr_index * 4, ratr_value);
  1770. if (ratr_value & 0xfffff000)
  1771. rtl92s_phy_set_fw_cmd(hw, FW_CMD_RA_REFRESH_N);
  1772. else
  1773. rtl92s_phy_set_fw_cmd(hw, FW_CMD_RA_REFRESH_BG);
  1774. RT_TRACE(rtlpriv, COMP_RATR, DBG_DMESG, "%x\n",
  1775. rtl_read_dword(rtlpriv, ARFR0));
  1776. }
  1777. static void rtl92se_update_hal_rate_mask(struct ieee80211_hw *hw,
  1778. struct ieee80211_sta *sta,
  1779. u8 rssi_level)
  1780. {
  1781. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1782. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  1783. struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
  1784. struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
  1785. struct rtl_sta_info *sta_entry = NULL;
  1786. u32 ratr_bitmap;
  1787. u8 ratr_index = 0;
  1788. u8 curtxbw_40mhz = (sta->bandwidth >= IEEE80211_STA_RX_BW_40) ? 1 : 0;
  1789. u8 curshortgi_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
  1790. 1 : 0;
  1791. u8 curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
  1792. 1 : 0;
  1793. enum wireless_mode wirelessmode = 0;
  1794. bool shortgi = false;
  1795. u32 ratr_value = 0;
  1796. u8 shortgi_rate = 0;
  1797. u32 mask = 0;
  1798. u32 band = 0;
  1799. bool bmulticast = false;
  1800. u8 macid = 0;
  1801. u8 mimo_ps = IEEE80211_SMPS_OFF;
  1802. sta_entry = (struct rtl_sta_info *) sta->drv_priv;
  1803. wirelessmode = sta_entry->wireless_mode;
  1804. if (mac->opmode == NL80211_IFTYPE_STATION)
  1805. curtxbw_40mhz = mac->bw_40;
  1806. else if (mac->opmode == NL80211_IFTYPE_AP ||
  1807. mac->opmode == NL80211_IFTYPE_ADHOC)
  1808. macid = sta->aid + 1;
  1809. if (rtlhal->current_bandtype == BAND_ON_5G)
  1810. ratr_bitmap = sta->supp_rates[1] << 4;
  1811. else
  1812. ratr_bitmap = sta->supp_rates[0];
  1813. if (mac->opmode == NL80211_IFTYPE_ADHOC)
  1814. ratr_bitmap = 0xfff;
  1815. ratr_bitmap |= (sta->ht_cap.mcs.rx_mask[1] << 20 |
  1816. sta->ht_cap.mcs.rx_mask[0] << 12);
  1817. switch (wirelessmode) {
  1818. case WIRELESS_MODE_B:
  1819. band |= WIRELESS_11B;
  1820. ratr_index = RATR_INX_WIRELESS_B;
  1821. if (ratr_bitmap & 0x0000000c)
  1822. ratr_bitmap &= 0x0000000d;
  1823. else
  1824. ratr_bitmap &= 0x0000000f;
  1825. break;
  1826. case WIRELESS_MODE_G:
  1827. band |= (WIRELESS_11G | WIRELESS_11B);
  1828. ratr_index = RATR_INX_WIRELESS_GB;
  1829. if (rssi_level == 1)
  1830. ratr_bitmap &= 0x00000f00;
  1831. else if (rssi_level == 2)
  1832. ratr_bitmap &= 0x00000ff0;
  1833. else
  1834. ratr_bitmap &= 0x00000ff5;
  1835. break;
  1836. case WIRELESS_MODE_A:
  1837. band |= WIRELESS_11A;
  1838. ratr_index = RATR_INX_WIRELESS_A;
  1839. ratr_bitmap &= 0x00000ff0;
  1840. break;
  1841. case WIRELESS_MODE_N_24G:
  1842. case WIRELESS_MODE_N_5G:
  1843. band |= (WIRELESS_11N | WIRELESS_11G | WIRELESS_11B);
  1844. ratr_index = RATR_INX_WIRELESS_NGB;
  1845. if (mimo_ps == IEEE80211_SMPS_STATIC) {
  1846. if (rssi_level == 1)
  1847. ratr_bitmap &= 0x00070000;
  1848. else if (rssi_level == 2)
  1849. ratr_bitmap &= 0x0007f000;
  1850. else
  1851. ratr_bitmap &= 0x0007f005;
  1852. } else {
  1853. if (rtlphy->rf_type == RF_1T2R ||
  1854. rtlphy->rf_type == RF_1T1R) {
  1855. if (rssi_level == 1) {
  1856. ratr_bitmap &= 0x000f0000;
  1857. } else if (rssi_level == 3) {
  1858. ratr_bitmap &= 0x000fc000;
  1859. } else if (rssi_level == 5) {
  1860. ratr_bitmap &= 0x000ff000;
  1861. } else {
  1862. if (curtxbw_40mhz)
  1863. ratr_bitmap &= 0x000ff015;
  1864. else
  1865. ratr_bitmap &= 0x000ff005;
  1866. }
  1867. } else {
  1868. if (rssi_level == 1) {
  1869. ratr_bitmap &= 0x0f8f0000;
  1870. } else if (rssi_level == 3) {
  1871. ratr_bitmap &= 0x0f8fc000;
  1872. } else if (rssi_level == 5) {
  1873. ratr_bitmap &= 0x0f8ff000;
  1874. } else {
  1875. if (curtxbw_40mhz)
  1876. ratr_bitmap &= 0x0f8ff015;
  1877. else
  1878. ratr_bitmap &= 0x0f8ff005;
  1879. }
  1880. }
  1881. }
  1882. if ((curtxbw_40mhz && curshortgi_40mhz) ||
  1883. (!curtxbw_40mhz && curshortgi_20mhz)) {
  1884. if (macid == 0)
  1885. shortgi = true;
  1886. else if (macid == 1)
  1887. shortgi = false;
  1888. }
  1889. break;
  1890. default:
  1891. band |= (WIRELESS_11N | WIRELESS_11G | WIRELESS_11B);
  1892. ratr_index = RATR_INX_WIRELESS_NGB;
  1893. if (rtlphy->rf_type == RF_1T2R)
  1894. ratr_bitmap &= 0x000ff0ff;
  1895. else
  1896. ratr_bitmap &= 0x0f8ff0ff;
  1897. break;
  1898. }
  1899. sta_entry->ratr_index = ratr_index;
  1900. if (rtlpriv->rtlhal.version >= VERSION_8192S_BCUT)
  1901. ratr_bitmap &= 0x0FFFFFFF;
  1902. else if (rtlpriv->rtlhal.version == VERSION_8192S_ACUT)
  1903. ratr_bitmap &= 0x0FFFFFF0;
  1904. if (shortgi) {
  1905. ratr_bitmap |= 0x10000000;
  1906. /* Get MAX MCS available. */
  1907. ratr_value = (ratr_bitmap >> 12);
  1908. for (shortgi_rate = 15; shortgi_rate > 0; shortgi_rate--) {
  1909. if ((1 << shortgi_rate) & ratr_value)
  1910. break;
  1911. }
  1912. shortgi_rate = (shortgi_rate << 12) | (shortgi_rate << 8) |
  1913. (shortgi_rate << 4) | (shortgi_rate);
  1914. rtl_write_byte(rtlpriv, SG_RATE, shortgi_rate);
  1915. }
  1916. mask |= (bmulticast ? 1 : 0) << 9 | (macid & 0x1f) << 4 | (band & 0xf);
  1917. RT_TRACE(rtlpriv, COMP_RATR, DBG_TRACE, "mask = %x, bitmap = %x\n",
  1918. mask, ratr_bitmap);
  1919. rtl_write_dword(rtlpriv, 0x2c4, ratr_bitmap);
  1920. rtl_write_dword(rtlpriv, WFM5, (FW_RA_UPDATE_MASK | (mask << 8)));
  1921. if (macid != 0)
  1922. sta_entry->ratr_index = ratr_index;
  1923. }
  1924. void rtl92se_update_hal_rate_tbl(struct ieee80211_hw *hw,
  1925. struct ieee80211_sta *sta, u8 rssi_level)
  1926. {
  1927. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1928. if (rtlpriv->dm.useramask)
  1929. rtl92se_update_hal_rate_mask(hw, sta, rssi_level);
  1930. else
  1931. rtl92se_update_hal_rate_table(hw, sta);
  1932. }
  1933. void rtl92se_update_channel_access_setting(struct ieee80211_hw *hw)
  1934. {
  1935. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1936. struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
  1937. u16 sifs_timer;
  1938. rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SLOT_TIME,
  1939. &mac->slot_time);
  1940. sifs_timer = 0x0e0e;
  1941. rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SIFS, (u8 *)&sifs_timer);
  1942. }
  1943. /* this ifunction is for RFKILL, it's different with windows,
  1944. * because UI will disable wireless when GPIO Radio Off.
  1945. * And here we not check or Disable/Enable ASPM like windows*/
  1946. bool rtl92se_gpio_radio_on_off_checking(struct ieee80211_hw *hw, u8 *valid)
  1947. {
  1948. struct rtl_priv *rtlpriv = rtl_priv(hw);
  1949. struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
  1950. struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
  1951. enum rf_pwrstate rfpwr_toset /*, cur_rfstate */;
  1952. unsigned long flag = 0;
  1953. bool actuallyset = false;
  1954. bool turnonbypowerdomain = false;
  1955. /* just 8191se can check gpio before firstup, 92c/92d have fixed it */
  1956. if ((rtlpci->up_first_time == 1) || (rtlpci->being_init_adapter))
  1957. return false;
  1958. if (ppsc->swrf_processing)
  1959. return false;
  1960. spin_lock_irqsave(&rtlpriv->locks.rf_ps_lock, flag);
  1961. if (ppsc->rfchange_inprogress) {
  1962. spin_unlock_irqrestore(&rtlpriv->locks.rf_ps_lock, flag);
  1963. return false;
  1964. } else {
  1965. ppsc->rfchange_inprogress = true;
  1966. spin_unlock_irqrestore(&rtlpriv->locks.rf_ps_lock, flag);
  1967. }
  1968. /* cur_rfstate = ppsc->rfpwr_state;*/
  1969. /* because after _rtl92s_phy_set_rfhalt, all power
  1970. * closed, so we must open some power for GPIO check,
  1971. * or we will always check GPIO RFOFF here,
  1972. * And we should close power after GPIO check */
  1973. if (RT_IN_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC)) {
  1974. _rtl92se_power_domain_init(hw);
  1975. turnonbypowerdomain = true;
  1976. }
  1977. rfpwr_toset = _rtl92se_rf_onoff_detect(hw);
  1978. if ((ppsc->hwradiooff) && (rfpwr_toset == ERFON)) {
  1979. RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
  1980. "RFKILL-HW Radio ON, RF ON\n");
  1981. rfpwr_toset = ERFON;
  1982. ppsc->hwradiooff = false;
  1983. actuallyset = true;
  1984. } else if ((!ppsc->hwradiooff) && (rfpwr_toset == ERFOFF)) {
  1985. RT_TRACE(rtlpriv, COMP_RF,
  1986. DBG_DMESG, "RFKILL-HW Radio OFF, RF OFF\n");
  1987. rfpwr_toset = ERFOFF;
  1988. ppsc->hwradiooff = true;
  1989. actuallyset = true;
  1990. }
  1991. if (actuallyset) {
  1992. spin_lock_irqsave(&rtlpriv->locks.rf_ps_lock, flag);
  1993. ppsc->rfchange_inprogress = false;
  1994. spin_unlock_irqrestore(&rtlpriv->locks.rf_ps_lock, flag);
  1995. /* this not include ifconfig wlan0 down case */
  1996. /* } else if (rfpwr_toset == ERFOFF || cur_rfstate == ERFOFF) { */
  1997. } else {
  1998. /* because power_domain_init may be happen when
  1999. * _rtl92s_phy_set_rfhalt, this will open some powers
  2000. * and cause current increasing about 40 mA for ips,
  2001. * rfoff and ifconfig down, so we set
  2002. * _rtl92s_phy_set_rfhalt again here */
  2003. if (ppsc->reg_rfps_level & RT_RF_OFF_LEVL_HALT_NIC &&
  2004. turnonbypowerdomain) {
  2005. _rtl92s_phy_set_rfhalt(hw);
  2006. RT_SET_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC);
  2007. }
  2008. spin_lock_irqsave(&rtlpriv->locks.rf_ps_lock, flag);
  2009. ppsc->rfchange_inprogress = false;
  2010. spin_unlock_irqrestore(&rtlpriv->locks.rf_ps_lock, flag);
  2011. }
  2012. *valid = 1;
  2013. return !ppsc->hwradiooff;
  2014. }
  2015. /* Is_wepkey just used for WEP used as group & pairwise key
  2016. * if pairwise is AES ang group is WEP Is_wepkey == false.*/
  2017. void rtl92se_set_key(struct ieee80211_hw *hw, u32 key_index, u8 *p_macaddr,
  2018. bool is_group, u8 enc_algo, bool is_wepkey, bool clear_all)
  2019. {
  2020. struct rtl_priv *rtlpriv = rtl_priv(hw);
  2021. struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
  2022. struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
  2023. u8 *macaddr = p_macaddr;
  2024. u32 entry_id = 0;
  2025. bool is_pairwise = false;
  2026. static u8 cam_const_addr[4][6] = {
  2027. {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
  2028. {0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
  2029. {0x00, 0x00, 0x00, 0x00, 0x00, 0x02},
  2030. {0x00, 0x00, 0x00, 0x00, 0x00, 0x03}
  2031. };
  2032. static u8 cam_const_broad[] = {
  2033. 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
  2034. };
  2035. if (clear_all) {
  2036. u8 idx = 0;
  2037. u8 cam_offset = 0;
  2038. u8 clear_number = 5;
  2039. RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG, "clear_all\n");
  2040. for (idx = 0; idx < clear_number; idx++) {
  2041. rtl_cam_mark_invalid(hw, cam_offset + idx);
  2042. rtl_cam_empty_entry(hw, cam_offset + idx);
  2043. if (idx < 5) {
  2044. memset(rtlpriv->sec.key_buf[idx], 0,
  2045. MAX_KEY_LEN);
  2046. rtlpriv->sec.key_len[idx] = 0;
  2047. }
  2048. }
  2049. } else {
  2050. switch (enc_algo) {
  2051. case WEP40_ENCRYPTION:
  2052. enc_algo = CAM_WEP40;
  2053. break;
  2054. case WEP104_ENCRYPTION:
  2055. enc_algo = CAM_WEP104;
  2056. break;
  2057. case TKIP_ENCRYPTION:
  2058. enc_algo = CAM_TKIP;
  2059. break;
  2060. case AESCCMP_ENCRYPTION:
  2061. enc_algo = CAM_AES;
  2062. break;
  2063. default:
  2064. pr_err("switch case %#x not processed\n",
  2065. enc_algo);
  2066. enc_algo = CAM_TKIP;
  2067. break;
  2068. }
  2069. if (is_wepkey || rtlpriv->sec.use_defaultkey) {
  2070. macaddr = cam_const_addr[key_index];
  2071. entry_id = key_index;
  2072. } else {
  2073. if (is_group) {
  2074. macaddr = cam_const_broad;
  2075. entry_id = key_index;
  2076. } else {
  2077. if (mac->opmode == NL80211_IFTYPE_AP) {
  2078. entry_id = rtl_cam_get_free_entry(hw,
  2079. p_macaddr);
  2080. if (entry_id >= TOTAL_CAM_ENTRY) {
  2081. pr_err("Can not find free hw security cam entry\n");
  2082. return;
  2083. }
  2084. } else {
  2085. entry_id = CAM_PAIRWISE_KEY_POSITION;
  2086. }
  2087. key_index = PAIRWISE_KEYIDX;
  2088. is_pairwise = true;
  2089. }
  2090. }
  2091. if (rtlpriv->sec.key_len[key_index] == 0) {
  2092. RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
  2093. "delete one entry, entry_id is %d\n",
  2094. entry_id);
  2095. if (mac->opmode == NL80211_IFTYPE_AP)
  2096. rtl_cam_del_entry(hw, p_macaddr);
  2097. rtl_cam_delete_one_entry(hw, p_macaddr, entry_id);
  2098. } else {
  2099. RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
  2100. "add one entry\n");
  2101. if (is_pairwise) {
  2102. RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
  2103. "set Pairwise key\n");
  2104. rtl_cam_add_one_entry(hw, macaddr, key_index,
  2105. entry_id, enc_algo,
  2106. CAM_CONFIG_NO_USEDK,
  2107. rtlpriv->sec.key_buf[key_index]);
  2108. } else {
  2109. RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
  2110. "set group key\n");
  2111. if (mac->opmode == NL80211_IFTYPE_ADHOC) {
  2112. rtl_cam_add_one_entry(hw,
  2113. rtlefuse->dev_addr,
  2114. PAIRWISE_KEYIDX,
  2115. CAM_PAIRWISE_KEY_POSITION,
  2116. enc_algo, CAM_CONFIG_NO_USEDK,
  2117. rtlpriv->sec.key_buf[entry_id]);
  2118. }
  2119. rtl_cam_add_one_entry(hw, macaddr, key_index,
  2120. entry_id, enc_algo,
  2121. CAM_CONFIG_NO_USEDK,
  2122. rtlpriv->sec.key_buf[entry_id]);
  2123. }
  2124. }
  2125. }
  2126. }
  2127. void rtl92se_suspend(struct ieee80211_hw *hw)
  2128. {
  2129. struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
  2130. rtlpci->up_first_time = true;
  2131. }
  2132. void rtl92se_resume(struct ieee80211_hw *hw)
  2133. {
  2134. struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
  2135. u32 val;
  2136. pci_read_config_dword(rtlpci->pdev, 0x40, &val);
  2137. if ((val & 0x0000ff00) != 0)
  2138. pci_write_config_dword(rtlpci->pdev, 0x40,
  2139. val & 0xffff00ff);
  2140. }