rtl8821c_ops.c 102 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678
  1. /******************************************************************************
  2. *
  3. * Copyright(c) 2016 - 2017 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. *****************************************************************************/
  15. #define _RTL8821C_OPS_C_
  16. #include <drv_types.h> /* basic_types.h, rtw_io.h and etc. */
  17. #include <rtw_xmit.h> /* struct xmit_priv */
  18. #ifdef DBG_CONFIG_ERROR_DETECT
  19. #include <rtw_sreset.h>
  20. #endif /* DBG_CONFIG_ERROR_DETECT */
  21. #include <hal_data.h> /* PHAL_DATA_TYPE, GET_HAL_DATA() */
  22. #include <hal_com.h> /* rtw_hal_config_rftype(), dump_chip_info() and etc. */
  23. #include "../hal_halmac.h" /* GET_RX_DESC_XXX_8821C() */
  24. #include "rtl8821c.h"
  25. #ifdef CONFIG_PCI_HCI
  26. #include "rtl8821ce_hal.h"
  27. #endif
  28. #include "rtl8821c_dm.h"
  29. #ifdef CONFIG_SDIO_HCI
  30. #include "sdio/rtl8821cs.h"
  31. #endif
  32. static void read_chip_version(PADAPTER adapter)
  33. {
  34. PHAL_DATA_TYPE hal;
  35. u32 value32;
  36. hal = GET_HAL_DATA(adapter);
  37. value32 = rtw_read32(adapter, REG_SYS_CFG1_8821C);
  38. hal->version_id.ICType = CHIP_8821C;
  39. hal->version_id.ChipType = ((value32 & BIT_RTL_ID_8821C) ? TEST_CHIP : NORMAL_CHIP);
  40. hal->version_id.CUTVersion = BIT_GET_CHIP_VER_8821C(value32);
  41. hal->version_id.VendorType = BIT_GET_VENDOR_ID_8821C(value32);
  42. hal->version_id.VendorType >>= 2;
  43. switch (hal->version_id.VendorType) {
  44. case 0:
  45. hal->version_id.VendorType = CHIP_VENDOR_TSMC;
  46. break;
  47. case 1:
  48. hal->version_id.VendorType = CHIP_VENDOR_SMIC;
  49. break;
  50. case 2:
  51. hal->version_id.VendorType = CHIP_VENDOR_UMC;
  52. break;
  53. }
  54. hal->version_id.RFType = ((value32 & BIT_RF_TYPE_ID_8821C) ? RF_TYPE_2T2R : RF_TYPE_1T1R);
  55. hal->RegulatorMode = ((value32 & BIT_SPSLDO_SEL_8821C) ? RT_LDO_REGULATOR : RT_SWITCHING_REGULATOR);
  56. value32 = rtw_read32(adapter, REG_SYS_STATUS1_8821C);
  57. hal->version_id.ROMVer = BIT_GET_RF_RL_ID_8821C(value32);
  58. /* For multi-function consideration. */
  59. hal->MultiFunc = RT_MULTI_FUNC_NONE;
  60. value32 = rtw_read32(adapter, REG_WL_BT_PWR_CTRL_8821C);
  61. hal->MultiFunc |= ((value32 & BIT_WL_FUNC_EN_8821C) ? RT_MULTI_FUNC_WIFI : 0);
  62. hal->MultiFunc |= ((value32 & BIT_BT_FUNC_EN_8821C) ? RT_MULTI_FUNC_BT : 0);
  63. hal->PolarityCtl = ((value32 & BIT_WL_HWPDN_SL_8821C) ? RT_POLARITY_HIGH_ACT : RT_POLARITY_LOW_ACT);
  64. rtw_hal_config_rftype(adapter);
  65. dump_chip_info(hal->version_id);
  66. }
  67. /*
  68. * Return:
  69. * _TRUE valid ID
  70. * _FALSE invalid ID
  71. */
  72. static u8 Hal_EfuseParseIDCode(PADAPTER adapter, u8 *map)
  73. {
  74. u16 EEPROMId;
  75. /* Check 0x8129 again for making sure autoload status!! */
  76. EEPROMId = le16_to_cpu(*(u16 *)map);
  77. RTW_INFO("EEPROM ID = 0x%04x\n", EEPROMId);
  78. if (EEPROMId == RTL_EEPROM_ID)
  79. return _TRUE;
  80. RTW_INFO("<WARN> EEPROM ID is invalid!!\n");
  81. return _FALSE;
  82. }
  83. static void Hal_EfuseParseEEPROMVer(PADAPTER adapter, u8 *map, u8 mapvalid)
  84. {
  85. PHAL_DATA_TYPE hal = GET_HAL_DATA(adapter);
  86. if (_TRUE == mapvalid)
  87. hal->EEPROMVersion = map[EEPROM_VERSION_8821C];
  88. else
  89. hal->EEPROMVersion = 1;
  90. RTW_INFO("EEPROM Version = %d\n", hal->EEPROMVersion);
  91. }
  92. static void Hal_EfuseParseTxPowerInfo(PADAPTER adapter, u8 *map, u8 mapvalid)
  93. {
  94. PHAL_DATA_TYPE hal = GET_HAL_DATA(adapter);
  95. TxPowerInfo24G tbl2G4;
  96. TxPowerInfo5G tbl5g;
  97. hal_load_txpwr_info(adapter, &tbl2G4, &tbl5g, map);
  98. if ((_TRUE == mapvalid) && (map[EEPROM_RF_BOARD_OPTION_8821C] != 0xFF))
  99. hal->EEPROMRegulatory = map[EEPROM_RF_BOARD_OPTION_8821C] & 0x7; /* bit0~2 */
  100. else
  101. hal->EEPROMRegulatory = EEPROM_DEFAULT_BOARD_OPTION & 0x7; /* bit0~2 */
  102. RTW_INFO("EEPROM Regulatory=0x%02x\n", hal->EEPROMRegulatory);
  103. }
  104. static void Hal_EfuseParseBoardType(PADAPTER adapter, u8 *map, u8 mapvalid)
  105. {
  106. PHAL_DATA_TYPE hal = GET_HAL_DATA(adapter);
  107. if ((_TRUE == mapvalid) && (map[EEPROM_RF_BOARD_OPTION_8821C] != 0xFF))
  108. hal->InterfaceSel = (map[EEPROM_RF_BOARD_OPTION_8821C] & 0xE0) >> 5;
  109. else
  110. hal->InterfaceSel = (EEPROM_DEFAULT_BOARD_OPTION & 0xE0) >> 5;
  111. RTW_INFO("EEPROM Board Type=0x%02x\n", hal->InterfaceSel);
  112. }
  113. static void Hal_EfuseParseBTCoexistInfo(PADAPTER adapter, u8 *map, u8 mapvalid)
  114. {
  115. PHAL_DATA_TYPE hal = GET_HAL_DATA(adapter);
  116. u8 setting;
  117. u32 tmpu4;
  118. u32 tmp_u32;
  119. if ((mapvalid == _TRUE) && (map[EEPROM_RF_BOARD_OPTION_8821C] != 0xFF)) {
  120. tmp_u32 = rtw_read32(adapter, REG_WL_BT_PWR_CTRL_8821C);
  121. /* 0xc1[7:5] = 0x01 */
  122. if ((((map[EEPROM_RF_BOARD_OPTION_8821C] & 0xe0) >> 5) == 0x01) && (tmp_u32 & BIT_BT_FUNC_EN_8821C))
  123. hal->EEPROMBluetoothCoexist = _TRUE;
  124. else
  125. hal->EEPROMBluetoothCoexist = _FALSE;
  126. } else
  127. hal->EEPROMBluetoothCoexist = _FALSE;
  128. hal->EEPROMBluetoothType = BT_RTL8821C;
  129. setting = map[EEPROM_RF_BT_SETTING_8821C];
  130. if ((_TRUE == mapvalid) && (setting != 0xFF)) {
  131. /*Bit[0]: Total antenna number
  132. 0: 2-Antenna / 1: 1-Antenna */
  133. hal->EEPROMBluetoothAntNum = setting & BIT(0);
  134. /*
  135. * Bit[6]: One-Ant structure use Ant2(aux.) path or Ant1(main) path
  136. * 0: Ant2(aux.)
  137. * 1: Ant1(main), default
  138. */
  139. hal->ant_path = (setting & BIT(6)) ? RF_PATH_B : RF_PATH_A;
  140. } else {
  141. hal->EEPROMBluetoothAntNum = Ant_x1;
  142. hal->ant_path = RF_PATH_A;
  143. }
  144. exit:
  145. RTW_INFO("EEPROM %s BT-coex, ant_num=%d\n",
  146. hal->EEPROMBluetoothCoexist == _TRUE ? "Enable" : "Disable",
  147. hal->EEPROMBluetoothAntNum == Ant_x2 ? 2 : 1);
  148. }
  149. static void Hal_EfuseParseChnlPlan(PADAPTER adapter, u8 *map, u8 autoloadfail)
  150. {
  151. hal_com_config_channel_plan(
  152. adapter,
  153. map ? &map[EEPROM_COUNTRY_CODE_8821C] : NULL,
  154. map ? map[EEPROM_CHANNEL_PLAN_8821C] : 0xFF,
  155. adapter->registrypriv.alpha2,
  156. adapter->registrypriv.channel_plan,
  157. RTW_CHPLAN_REALTEK_DEFINE,
  158. autoloadfail
  159. );
  160. }
  161. static void Hal_EfuseParseXtal(PADAPTER adapter, u8 *map, u8 mapvalid)
  162. {
  163. PHAL_DATA_TYPE hal = GET_HAL_DATA(adapter);
  164. if ((_TRUE == mapvalid) && map[EEPROM_XTAL_8821C] != 0xFF)
  165. hal->crystal_cap = map[EEPROM_XTAL_8821C];
  166. else
  167. hal->crystal_cap = EEPROM_Default_CrystalCap;
  168. RTW_INFO("EEPROM crystal_cap=0x%02x\n", hal->crystal_cap);
  169. }
  170. static void Hal_EfuseParseThermalMeter(PADAPTER adapter, u8 *map, u8 mapvalid)
  171. {
  172. PHAL_DATA_TYPE hal = GET_HAL_DATA(adapter);
  173. /* ThermalMeter from EEPROM */
  174. if ((_TRUE == mapvalid) && (map[EEPROM_THERMAL_METER_8821C] != 0xFF))
  175. hal->eeprom_thermal_meter = map[EEPROM_THERMAL_METER_8821C];
  176. else {
  177. hal->eeprom_thermal_meter = EEPROM_Default_ThermalMeter;
  178. hal->odmpriv.rf_calibrate_info.is_apk_thermal_meter_ignore = _TRUE;
  179. }
  180. RTW_INFO("EEPROM ThermalMeter=0x%02x\n", hal->eeprom_thermal_meter);
  181. }
  182. static void Hal_EfuseParseAntennaDiversity(PADAPTER adapter, u8 *map, u8 mapvalid)
  183. {
  184. #ifdef CONFIG_ANTENNA_DIVERSITY
  185. PHAL_DATA_TYPE hal = GET_HAL_DATA(adapter);
  186. struct registry_priv *registry_par = &adapter->registrypriv;
  187. if (hal->EEPROMBluetoothAntNum == Ant_x1)
  188. hal->AntDivCfg = 0;
  189. else {
  190. if (registry_par->antdiv_cfg == 2)/* 0:OFF , 1:ON, 2:By EFUSE */
  191. hal->AntDivCfg = (map[EEPROM_RF_BOARD_OPTION_8821C] & BIT3) ? _TRUE : _FALSE;
  192. else
  193. hal->AntDivCfg = registry_par->antdiv_cfg;
  194. }
  195. /*hal->TRxAntDivType = S0S1_TRX_HW_ANTDIV;*/
  196. hal->with_extenal_ant_switch = ((map[EEPROM_RF_BT_SETTING_8821C] & BIT7) >> 7);
  197. RTW_INFO("%s:EEPROM AntDivCfg=%d, AntDivType=%d, extenal_ant_switch:%d\n",
  198. __func__, hal->AntDivCfg, hal->TRxAntDivType, hal->with_extenal_ant_switch);
  199. #endif /* CONFIG_ANTENNA_DIVERSITY */
  200. }
  201. static void Hal_EfuseTxBBSwing(PADAPTER adapter, u8 *map, u8 mapvalid)
  202. {
  203. PHAL_DATA_TYPE hal_data = GET_HAL_DATA(adapter);
  204. if (_TRUE == mapvalid) {
  205. hal_data->tx_bbswing_24G = map[EEPROM_TX_BBSWING_2G_8821C];
  206. if (0xFF == hal_data->tx_bbswing_24G)
  207. hal_data->tx_bbswing_24G = 0;
  208. hal_data->tx_bbswing_5G = map[EEPROM_TX_BBSWING_5G_8821C];
  209. if (0xFF == hal_data->tx_bbswing_5G)
  210. hal_data->tx_bbswing_5G = 0;
  211. } else {
  212. hal_data->tx_bbswing_24G = 0;
  213. hal_data->tx_bbswing_5G = 0;
  214. }
  215. RTW_INFO("EEPROM tx_bbswing_24G =0x%02x\n", hal_data->tx_bbswing_24G);
  216. RTW_INFO("EEPROM tx_bbswing_5G =0x%02x\n", hal_data->tx_bbswing_5G);
  217. }
  218. static void Hal_EfuseParseCustomerID(PADAPTER adapter, u8 *map, u8 mapvalid)
  219. {
  220. PHAL_DATA_TYPE hal = GET_HAL_DATA(adapter);
  221. if (_TRUE == mapvalid)
  222. hal->EEPROMCustomerID = map[EEPROM_CUSTOMER_ID_8821C];
  223. else
  224. hal->EEPROMCustomerID = 0;
  225. RTW_INFO("EEPROM Customer ID=0x%02x\n", hal->EEPROMCustomerID);
  226. }
  227. static void Hal_DetectWoWMode(PADAPTER adapter)
  228. {
  229. #if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN)
  230. adapter_to_pwrctl(adapter)->bSupportRemoteWakeup = _TRUE;
  231. #else /* !(CONFIG_WOWLAN || CONFIG_AP_WOWLAN) */
  232. adapter_to_pwrctl(adapter)->bSupportRemoteWakeup = _FALSE;
  233. #endif /* !(CONFIG_WOWLAN || CONFIG_AP_WOWLAN) */
  234. RTW_INFO("EEPROM SupportRemoteWakeup=%d\n", adapter_to_pwrctl(adapter)->bSupportRemoteWakeup);
  235. }
  236. static void hal_ReadPAType(PADAPTER adapter, u8 *map, u8 mapvalid)
  237. {
  238. PHAL_DATA_TYPE hal_data = GET_HAL_DATA(adapter);
  239. if (mapvalid) {
  240. /* AUTO - Get INFO from eFuse*/
  241. if (GetRegAmplifierType2G(adapter) == 0) {
  242. switch (hal_data->rfe_type) {
  243. default:
  244. hal_data->PAType_2G = 0;
  245. hal_data->LNAType_2G = 0;
  246. hal_data->ExternalPA_2G = 0;
  247. hal_data->ExternalLNA_2G = 0;
  248. break;
  249. }
  250. } else {
  251. hal_data->ExternalPA_2G = (GetRegAmplifierType2G(adapter) & ODM_BOARD_EXT_PA) ? 1 : 0;
  252. hal_data->ExternalLNA_2G = (GetRegAmplifierType2G(adapter) & ODM_BOARD_EXT_LNA) ? 1 : 0;
  253. }
  254. /* AUTO */
  255. if (GetRegAmplifierType5G(adapter) == 0) {
  256. switch (hal_data->rfe_type) {
  257. default:
  258. hal_data->PAType_5G = 0;
  259. hal_data->LNAType_5G = 0;
  260. hal_data->external_pa_5g = 0;
  261. hal_data->external_lna_5g = 0;
  262. break;
  263. }
  264. } else {
  265. hal_data->external_pa_5g = (GetRegAmplifierType5G(adapter) & ODM_BOARD_EXT_PA_5G) ? 1 : 0;
  266. hal_data->external_lna_5g = (GetRegAmplifierType5G(adapter) & ODM_BOARD_EXT_LNA_5G) ? 1 : 0;
  267. }
  268. } else {
  269. /*Get INFO from registry*/
  270. hal_data->ExternalPA_2G = EEPROM_Default_PAType;
  271. hal_data->external_pa_5g = 0xFF;
  272. hal_data->ExternalLNA_2G = EEPROM_Default_LNAType;
  273. hal_data->external_lna_5g = 0xFF;
  274. if (GetRegAmplifierType2G(adapter) == 0) {
  275. hal_data->ExternalPA_2G = 0;
  276. hal_data->ExternalLNA_2G = 0;
  277. } else {
  278. hal_data->ExternalPA_2G = (GetRegAmplifierType2G(adapter) & ODM_BOARD_EXT_PA) ? 1 : 0;
  279. hal_data->ExternalLNA_2G = (GetRegAmplifierType2G(adapter) & ODM_BOARD_EXT_LNA) ? 1 : 0;
  280. }
  281. if (GetRegAmplifierType5G(adapter) == 0) {
  282. hal_data->external_pa_5g = 0;
  283. hal_data->external_lna_5g = 0;
  284. } else {
  285. hal_data->external_pa_5g = (GetRegAmplifierType5G(adapter) & ODM_BOARD_EXT_PA_5G) ? 1 : 0;
  286. hal_data->external_lna_5g = (GetRegAmplifierType5G(adapter) & ODM_BOARD_EXT_LNA_5G) ? 1 : 0;
  287. }
  288. }
  289. RTW_INFO("EEPROM PAType_2G is 0x%x, ExternalPA_2G = %d\n", hal_data->PAType_2G, hal_data->ExternalPA_2G);
  290. RTW_INFO("EEPROM PAType_5G is 0x%x, external_pa_5g = %d\n", hal_data->PAType_5G, hal_data->external_pa_5g);
  291. RTW_INFO("EEPROM LNAType_2G is 0x%x, ExternalLNA_2G = %d\n", hal_data->LNAType_2G, hal_data->ExternalLNA_2G);
  292. RTW_INFO("EEPROM LNAType_5G is 0x%x, external_lna_5g = %d\n", hal_data->LNAType_5G, hal_data->external_lna_5g);
  293. }
  294. static void Hal_ReadAmplifierType(PADAPTER adapter, u8 *map, u8 mapvalid)
  295. {
  296. PHAL_DATA_TYPE hal_data = GET_HAL_DATA(adapter);
  297. if (hal_data->rfe_type < 8) { /*According to RF-EFUSE DOC : R15]*/
  298. RTW_INFO("WIFI Module is iPA/iLNA\n");
  299. return;
  300. }
  301. hal_ReadPAType(adapter, map, mapvalid);
  302. /* [2.4G] extPA */
  303. hal_data->TypeGPA = hal_data->PAType_2G;
  304. /* [5G] extPA */
  305. hal_data->TypeAPA = hal_data->PAType_5G;
  306. /* [2.4G] extLNA */
  307. hal_data->TypeGLNA = hal_data->LNAType_2G;
  308. /* [5G] extLNA */
  309. hal_data->TypeALNA = hal_data->LNAType_5G;
  310. RTW_INFO("EEPROM TypeGPA = 0x%X\n", hal_data->TypeGPA);
  311. RTW_INFO("EEPROM TypeAPA = 0x%X\n", hal_data->TypeAPA);
  312. RTW_INFO("EEPROM TypeGLNA = 0x%X\n", hal_data->TypeGLNA);
  313. RTW_INFO("EEPROM TypeALNA = 0x%X\n", hal_data->TypeALNA);
  314. }
  315. static u8 Hal_ReadRFEType(PADAPTER adapter, u8 *map, u8 mapvalid)
  316. {
  317. /* [20160-06-22 -R15]
  318. Type 0 - (2-Ant, DPDT), (2G_WLG, iPA, iLNA, iSW), (5G, iPA, iLNA, iSW)
  319. Type 1 - (1-Ant, SPDT@Ant1), (2G_WLG, iPA, iLNA, iSW), (5G, iPA, iLNA, iSW)
  320. Type 2 -(1-Ant, SPDT@Ant1) , (2G_BTG, iPA, iLNA, iSW), (5G, iPA, iLNA, iSW)
  321. Type 3 - (1-Ant, DPDT@Ant2), (2G_WLG, iPA, iLNA, iSW), (5G, iPA, iLNA, iSW)
  322. Type 4 - (1-Ant, DPDT@Ant2), (2G_BTG, iPA, iLNA, iSW), (5G, iPA, iLNA, iSW)
  323. Type 5 - (2-Ant), (2G_WLG, iPA, iLNA, iSW), (5G, iPA, iLNA, iSW)
  324. Type 6 - (2-Ant), (2G_WLG, iPA, iLNA, iSW), (5G, iPA, iLNA, iSW)
  325. Type 7 - (1-Ant), (2G_BTG, iPA, iLNA, iSW), (5G, iPA, iLNA, iSW)
  326. */
  327. PHAL_DATA_TYPE hal = GET_HAL_DATA(adapter);
  328. /* check registry valye */
  329. if (GetRegRFEType(adapter) != CONFIG_RTW_RFE_TYPE) {
  330. hal->rfe_type = GetRegRFEType(adapter);
  331. goto exit;
  332. }
  333. if (mapvalid) {
  334. /* check efuse map */
  335. hal->rfe_type = map[EEPROM_RFE_OPTION_8821C];
  336. if (0xFF != hal->rfe_type)
  337. goto exit;
  338. }
  339. /* error handle */
  340. hal->rfe_type = 0;
  341. RTW_ERR("\n\nEmpty EFUSE with unknown REF type!!\n\n");
  342. RTW_ERR("please program efuse or specify correct RFE type.\n");
  343. RTW_ERR("cmd: insmod rtl8821cx.ko rtw_RFE_type=<rfe_type>\n\n");
  344. return _FAIL;
  345. exit:
  346. RTW_INFO("EEPROM rfe_type=0x%x\n", hal->rfe_type);
  347. return _SUCCESS;
  348. }
  349. static void Hal_EfuseParsePackageType(PADAPTER adapter, u8 *map, u8 mapvalid)
  350. {
  351. }
  352. #ifdef CONFIG_USB_HCI
  353. static void Hal_ReadUsbModeSwitch(PADAPTER adapter, u8 *map, u8 mapvalid)
  354. {
  355. PHAL_DATA_TYPE hal = GET_HAL_DATA(adapter);
  356. if (_TRUE == mapvalid)
  357. /* check efuse 0x06 bit7 */
  358. hal->EEPROMUsbSwitch = (map[EEPROM_USB_MODE_8821CU] & BIT7) >> 7;
  359. else
  360. hal->EEPROMUsbSwitch = _FALSE;
  361. RTW_INFO("EEPROM USB Switch=%d\n", hal->EEPROMUsbSwitch);
  362. }
  363. static void hal_read_usb_pid_vid(PADAPTER adapter, u8 *map, u8 mapvalid)
  364. {
  365. PHAL_DATA_TYPE hal = GET_HAL_DATA(adapter);
  366. if (mapvalid == _TRUE) {
  367. /* VID, PID */
  368. hal->EEPROMVID = ReadLE2Byte(&map[EEPROM_VID_8821CU]);
  369. hal->EEPROMPID = ReadLE2Byte(&map[EEPROM_PID_8821CU]);
  370. } else {
  371. hal->EEPROMVID = EEPROM_Default_VID;
  372. hal->EEPROMPID = EEPROM_Default_PID;
  373. }
  374. RTW_INFO("EEPROM VID = 0x%04X, PID = 0x%04X\n", hal->EEPROMVID, hal->EEPROMPID);
  375. }
  376. #endif /* CONFIG_USB_HCI */
  377. /*
  378. * Description:
  379. * Collect all information from efuse or files.
  380. * This function will do
  381. * 1. Read registers to check hardware efuse available or not
  382. * 2. Read Efuse/EEPROM
  383. * 3. Read file if necessary
  384. * 4. Parsing Efuse data
  385. */
  386. u8 rtl8821c_read_efuse(PADAPTER adapter)
  387. {
  388. PHAL_DATA_TYPE hal;
  389. u8 val8;
  390. u8 *efuse_map = NULL;
  391. u8 valid;
  392. u8 ret = _FAIL;
  393. hal = GET_HAL_DATA(adapter);
  394. efuse_map = hal->efuse_eeprom_data;
  395. /* 1. Read registers to check hardware eFuse available or not */
  396. val8 = rtw_read8(adapter, REG_SYS_EEPROM_CTRL_8821C);
  397. hal->bautoload_fail_flag = (val8 & BIT_AUTOLOAD_SUS_8821C) ? _FALSE : _TRUE;
  398. /*
  399. * In 8821C, bautoload_fail_flag is used to present eFuse map is valid
  400. * or not, no matter the map comes from hardware or files.
  401. */
  402. /* 2. Read eFuse */
  403. EFUSE_ShadowMapUpdate(adapter, EFUSE_WIFI, 0);
  404. /* 3. Read Efuse file if necessary */
  405. #ifdef CONFIG_EFUSE_CONFIG_FILE
  406. if (check_phy_efuse_tx_power_info_valid(adapter) == _FALSE)
  407. if (Hal_readPGDataFromConfigFile(adapter) != _SUCCESS)
  408. RTW_INFO("%s: <WARN> invalid phy efuse and read from file fail, will use driver default!!\n", __FUNCTION__);
  409. #endif /* CONFIG_EFUSE_CONFIG_FILE */
  410. /* 4. Parse Efuse data */
  411. valid = Hal_EfuseParseIDCode(adapter, efuse_map);
  412. if (_TRUE == valid)
  413. hal->bautoload_fail_flag = _FALSE;
  414. else
  415. hal->bautoload_fail_flag = _TRUE;
  416. Hal_EfuseParseEEPROMVer(adapter, efuse_map, valid);
  417. hal_config_macaddr(adapter, hal->bautoload_fail_flag);
  418. Hal_EfuseParseTxPowerInfo(adapter, efuse_map, valid);
  419. Hal_EfuseParseBoardType(adapter, efuse_map, valid);
  420. Hal_EfuseParseBTCoexistInfo(adapter, efuse_map, valid);
  421. Hal_EfuseParseChnlPlan(adapter, efuse_map, hal->bautoload_fail_flag);
  422. Hal_EfuseParseXtal(adapter, efuse_map, valid);
  423. Hal_EfuseParseThermalMeter(adapter, efuse_map, valid);
  424. Hal_EfuseParseAntennaDiversity(adapter, efuse_map, valid);
  425. Hal_EfuseParseCustomerID(adapter, efuse_map, valid);
  426. Hal_DetectWoWMode(adapter);
  427. if (Hal_ReadRFEType(adapter, efuse_map, valid) != _SUCCESS)
  428. goto exit;
  429. Hal_ReadAmplifierType(adapter, efuse_map, valid);
  430. Hal_EfuseTxBBSwing(adapter, efuse_map, valid);
  431. /* Data out of Efuse Map */
  432. Hal_EfuseParsePackageType(adapter, efuse_map, valid);
  433. #ifdef CONFIG_USB_HCI
  434. Hal_ReadUsbModeSwitch(adapter, efuse_map, valid);
  435. hal_read_usb_pid_vid(adapter, efuse_map, valid);
  436. #endif /* CONFIG_USB_HCI */
  437. /* set coex. ant info once efuse parsing is done */
  438. rtw_btcoex_set_ant_info(adapter);
  439. #ifdef CONFIG_RTW_MAC_HIDDEN_RPT
  440. if (hal_read_mac_hidden_rpt(adapter) != _SUCCESS)
  441. goto exit;
  442. {
  443. struct hal_spec_t *hal_spec = GET_HAL_SPEC(adapter);
  444. if (hal_spec->hci_type <= 3 && hal_spec->hci_type >= 1) {
  445. hal->EEPROMBluetoothCoexist = _FALSE;
  446. RTW_INFO("EEPROM Disable BT-coex by hal_spec\n");
  447. rtw_btcoex_wifionly_AntInfoSetting(adapter);
  448. }
  449. }
  450. #endif
  451. rtw_phydm_read_efuse(adapter);
  452. ret = _SUCCESS;
  453. exit:
  454. return ret;
  455. }
  456. void rtl8821c_run_thread(PADAPTER adapter)
  457. {
  458. }
  459. void rtl8821c_cancel_thread(PADAPTER adapter)
  460. {
  461. }
  462. /*
  463. * Description:
  464. * Using 0x100 to check the power status of FW.
  465. */
  466. static u8 check_ips_status(PADAPTER adapter)
  467. {
  468. u8 val8;
  469. RTW_INFO(FUNC_ADPT_FMT ": Read 0x100=0x%02x 0x86=0x%02x\n",
  470. FUNC_ADPT_ARG(adapter),
  471. rtw_read8(adapter, 0x100), rtw_read8(adapter, 0x86));
  472. val8 = rtw_read8(adapter, 0x100);
  473. if (val8 == 0xEA)
  474. return _TRUE;
  475. return _FALSE;
  476. }
  477. #ifdef DBG_CONFIG_ERROR_DETECT
  478. static void xmit_status_check(PADAPTER p)
  479. {
  480. PHAL_DATA_TYPE hal = GET_HAL_DATA(p);
  481. struct sreset_priv *psrtpriv = &hal->srestpriv;
  482. struct xmit_priv *pxmitpriv = &p->xmitpriv;
  483. systime current_time = 0;
  484. unsigned int diff_time = 0;
  485. u32 txdma_status = 0;
  486. txdma_status = rtw_read32(p, REG_TXDMA_STATUS_8821C);
  487. if (txdma_status != 0x00) {
  488. RTW_INFO("%s REG_TXDMA_STATUS:0x%08x\n", __FUNCTION__, txdma_status);
  489. psrtpriv->tx_dma_status_cnt++;
  490. psrtpriv->self_dect_case = 4;
  491. rtw_hal_sreset_reset(p);
  492. }
  493. #ifdef DBG_PRE_TX_HANG
  494. #if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)
  495. {
  496. u8 hisr = rtw_read8(p, REG_HISR1_8821C + 3);
  497. if (hisr & BIT_PRETXERR) {
  498. RTW_ERR("PRE_TX_HANG\n");
  499. rtw_write8(p, REG_HISR1_8821C + 3, BIT_PRETXERR);
  500. }
  501. }
  502. #endif
  503. #endif/*DBG_PRE_TX_HANG*/
  504. #ifdef CONFIG_USB_HCI
  505. current_time = rtw_get_current_time();
  506. if (0 == pxmitpriv->free_xmitbuf_cnt || 0 == pxmitpriv->free_xmit_extbuf_cnt) {
  507. diff_time = rtw_get_passing_time_ms(psrtpriv->last_tx_time);
  508. if (diff_time > 2000) {
  509. if (psrtpriv->last_tx_complete_time == 0)
  510. psrtpriv->last_tx_complete_time = current_time;
  511. else {
  512. diff_time = rtw_get_passing_time_ms(psrtpriv->last_tx_complete_time);
  513. if (diff_time > 4000) {
  514. u32 ability = 0;
  515. ability = rtw_phydm_ability_get(p);
  516. RTW_INFO("%s tx hang %s\n", __FUNCTION__,
  517. (ability & ODM_BB_ADAPTIVITY) ? "ODM_BB_ADAPTIVITY" : "");
  518. if (!(ability & ODM_BB_ADAPTIVITY)) {
  519. psrtpriv->self_dect_tx_cnt++;
  520. psrtpriv->self_dect_case = 1;
  521. rtw_hal_sreset_reset(p);
  522. }
  523. }
  524. }
  525. }
  526. }
  527. #endif /* CONFIG_USB_HCI */
  528. if (psrtpriv->dbg_trigger_point == SRESET_TGP_XMIT_STATUS) {
  529. psrtpriv->dbg_trigger_point = SRESET_TGP_NULL;
  530. rtw_hal_sreset_reset(p);
  531. return;
  532. }
  533. }
  534. static void check_rx_count(PADAPTER p)
  535. {
  536. PHAL_DATA_TYPE hal = GET_HAL_DATA(p);
  537. struct sreset_priv *psrtpriv = &hal->srestpriv;
  538. u16 cur_mac_rxff_ptr;
  539. cur_mac_rxff_ptr = rtw_read16(p, REG_RXFF_PTR_V1_8821C);
  540. #if 0
  541. RTW_INFO("%s,psrtpriv->last_mac_rxff_ptr = %d , cur_mac_rxff_ptr = %d\n", __func__, psrtpriv->last_mac_rxff_ptr, cur_mac_rxff_ptr);
  542. #endif
  543. if (psrtpriv->last_mac_rxff_ptr == cur_mac_rxff_ptr) {
  544. psrtpriv->rx_cnt++;
  545. #if 0
  546. RTW_INFO("%s,MAC case rx_cnt=%d\n", __func__, psrtpriv->rx_cnt);
  547. #endif
  548. goto exit;
  549. }
  550. psrtpriv->rx_cnt = 0;
  551. exit:
  552. psrtpriv->last_mac_rxff_ptr = cur_mac_rxff_ptr;
  553. if (psrtpriv->rx_cnt > 3) {
  554. psrtpriv->self_dect_case = 2;
  555. psrtpriv->self_dect_rx_cnt++;
  556. rtw_hal_sreset_reset(p);
  557. }
  558. }
  559. static void linked_status_check(PADAPTER p)
  560. {
  561. PHAL_DATA_TYPE hal = GET_HAL_DATA(p);
  562. struct sreset_priv *psrtpriv = &hal->srestpriv;
  563. struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(p);
  564. u32 rx_dma_status = 0;
  565. rx_dma_status = rtw_read32(p, REG_RXDMA_STATUS_8821C);
  566. if (rx_dma_status != 0x00) {
  567. RTW_INFO("%s REG_RXDMA_STATUS:0x%08x\n", __FUNCTION__, rx_dma_status);
  568. psrtpriv->rx_dma_status_cnt++;
  569. psrtpriv->self_dect_case = 5;
  570. #ifdef CONFIG_USB_HCI
  571. rtw_hal_sreset_reset(p);
  572. #endif /* CONFIG_USB_HCI */
  573. }
  574. if (psrtpriv->self_dect_fw) {
  575. psrtpriv->self_dect_case = 3;
  576. #ifdef CONFIG_USB_HCI
  577. rtw_hal_sreset_reset(p);
  578. #endif /* CONFIG_USB_HCI */
  579. }
  580. #ifdef CONFIG_USB_HCI
  581. check_rx_count(p);
  582. #endif /* CONFIG_USB_HCI */
  583. if (psrtpriv->dbg_trigger_point == SRESET_TGP_LINK_STATUS) {
  584. psrtpriv->dbg_trigger_point = SRESET_TGP_NULL;
  585. rtw_hal_sreset_reset(p);
  586. return;
  587. }
  588. }
  589. #endif /* DBG_CONFIG_ERROR_DETECT */
  590. static const struct hw_port_reg port_cfg[] = {
  591. /*port 0*/
  592. {
  593. .net_type = (REG_CR_8821C + 2),
  594. .net_type_shift = 0,
  595. .macaddr = REG_MACID,
  596. .bssid = REG_BSSID,
  597. .bcn_ctl = REG_BCN_CTRL,
  598. .tsf_rst = REG_DUAL_TSF_RST,
  599. .tsf_rst_bit = BIT_TSFTR_RST,
  600. .bcn_space = REG_MBSSID_BCN_SPACE,
  601. .bcn_space_shift = 0,
  602. .bcn_space_mask = 0xffff,
  603. .ps_aid = REG_BCN_PSR_RPT_8821C,
  604. .ta = REG_TRANSMIT_ADDRSS_0_8821C,
  605. },
  606. /*port 1*/
  607. {
  608. .net_type = (REG_CR_8821C + 2),
  609. .net_type_shift = 2,
  610. .macaddr = REG_MACID1,
  611. .bssid = REG_BSSID1,
  612. .bcn_ctl = REG_BCN_CTRL_CLINT0,
  613. .tsf_rst = REG_DUAL_TSF_RST,
  614. .tsf_rst_bit = BIT_TSFTR_CLI0_RST,
  615. .bcn_space = REG_MBSSID_BCN_SPACE,
  616. .bcn_space_shift = 16,
  617. .bcn_space_mask = 0xfff,
  618. .ps_aid = REG_BCN_PSR_RPT1_8821C,
  619. .ta = REG_TRANSMIT_ADDRSS_1_8821C,
  620. },
  621. /*port 2*/
  622. {
  623. .net_type = REG_CR_EXT_8821C,
  624. .net_type_shift = 0,
  625. .macaddr = REG_MACID2,
  626. .bssid = REG_BSSID2,
  627. .bcn_ctl = REG_BCN_CTRL_CLINT1,
  628. .tsf_rst = REG_DUAL_TSF_RST,
  629. .tsf_rst_bit = BIT_TSFTR_CLI1_RST,
  630. .bcn_space = REG_MBSSID_BCN_SPACE2,
  631. .bcn_space_shift = 0,
  632. .bcn_space_mask = 0xfff,
  633. .ps_aid = REG_BCN_PSR_RPT2_8821C,
  634. .ta = REG_TRANSMIT_ADDRSS_2_8821C,
  635. },
  636. /*port 3*/
  637. {
  638. .net_type = REG_CR_EXT_8821C,
  639. .net_type_shift = 2,
  640. .macaddr = REG_MACID3,
  641. .bssid = REG_BSSID3,
  642. .bcn_ctl = REG_BCN_CTRL_CLINT2,
  643. .tsf_rst = REG_DUAL_TSF_RST,
  644. .tsf_rst_bit = BIT_TSFTR_CLI2_RST,
  645. .bcn_space = REG_MBSSID_BCN_SPACE2,
  646. .bcn_space_shift = 16,
  647. .bcn_space_mask = 0xfff,
  648. .ps_aid = REG_BCN_PSR_RPT3_8821C,
  649. .ta = REG_TRANSMIT_ADDRSS_3_8821C,
  650. },
  651. /*port 4*/
  652. {
  653. .net_type = REG_CR_EXT_8821C,
  654. .net_type_shift = 4,
  655. .macaddr = REG_MACID4,
  656. .bssid = REG_BSSID4,
  657. .bcn_ctl = REG_BCN_CTRL_CLINT3,
  658. .tsf_rst = REG_DUAL_TSF_RST,
  659. .tsf_rst_bit = BIT_TSFTR_CLI3_RST,
  660. .bcn_space = REG_MBSSID_BCN_SPACE3,
  661. .bcn_space_shift = 0,
  662. .bcn_space_mask = 0xfff,
  663. .ps_aid = REG_BCN_PSR_RPT4_8821C,
  664. .ta = REG_TRANSMIT_ADDRSS_4_8821C,
  665. },
  666. };
  667. static u32 hw_bcn_ctrl_addr(_adapter *adapter, u8 hw_port)
  668. {
  669. struct hal_spec_t *hal_spec = GET_HAL_SPEC(adapter);
  670. u32 addr = 0;
  671. if (hw_port >= hal_spec->port_num) {
  672. RTW_ERR(FUNC_ADPT_FMT" HW Port(%d) invalid\n", FUNC_ADPT_ARG(adapter), hw_port);
  673. rtw_warn_on(1);
  674. goto exit;
  675. }
  676. addr = port_cfg[hw_port].bcn_ctl;
  677. exit:
  678. return addr;
  679. }
  680. static void hw_bcn_ctrl_set(_adapter *adapter, u8 hw_port, u8 bcn_ctl_val)
  681. {
  682. u32 bcn_ctl_addr = 0;
  683. if (hw_port >= MAX_HW_PORT) {
  684. RTW_ERR(FUNC_ADPT_FMT" HW Port(%d) invalid\n", FUNC_ADPT_ARG(adapter), hw_port);
  685. rtw_warn_on(1);
  686. return;
  687. }
  688. bcn_ctl_addr = port_cfg[hw_port].bcn_ctl;
  689. rtw_write8(adapter, bcn_ctl_addr, bcn_ctl_val);
  690. }
  691. static void hw_bcn_ctrl_add(_adapter *adapter, u8 hw_port, u8 bcn_ctl_val)
  692. {
  693. u32 bcn_ctl_addr = 0;
  694. u8 val8 = 0;
  695. if (hw_port >= MAX_HW_PORT) {
  696. RTW_ERR(FUNC_ADPT_FMT" HW Port(%d) invalid\n", FUNC_ADPT_ARG(adapter), hw_port);
  697. rtw_warn_on(1);
  698. return;
  699. }
  700. bcn_ctl_addr = port_cfg[hw_port].bcn_ctl;
  701. val8 = rtw_read8(adapter, bcn_ctl_addr) | bcn_ctl_val;
  702. rtw_write8(adapter, bcn_ctl_addr, val8);
  703. }
  704. static void hw_bcn_ctrl_clr(_adapter *adapter, u8 hw_port, u8 bcn_ctl_val)
  705. {
  706. u32 bcn_ctl_addr = 0;
  707. u8 val8 = 0;
  708. if (hw_port >= MAX_HW_PORT) {
  709. RTW_ERR(FUNC_ADPT_FMT" HW Port(%d) invalid\n", FUNC_ADPT_ARG(adapter), hw_port);
  710. rtw_warn_on(1);
  711. return;
  712. }
  713. bcn_ctl_addr = port_cfg[hw_port].bcn_ctl;
  714. val8 = rtw_read8(adapter, bcn_ctl_addr);
  715. val8 &= ~bcn_ctl_val;
  716. rtw_write8(adapter, bcn_ctl_addr, val8);
  717. }
  718. static void hw_bcn_func(_adapter *adapter, u8 enable)
  719. {
  720. if (enable)
  721. hw_bcn_ctrl_add(adapter, get_hw_port(adapter), BIT_EN_BCN_FUNCTION);
  722. else
  723. hw_bcn_ctrl_clr(adapter, get_hw_port(adapter), BIT_EN_BCN_FUNCTION);
  724. }
  725. void hw_port0_tsf_sync(_adapter *adapter)
  726. {
  727. rtw_write8(adapter, REG_SCHEDULER_RST, rtw_read8(adapter, REG_SCHEDULER_RST) | BIT_SYNC_CLI_ONCE_BY_TBTT_8821C);
  728. }
  729. void hw_tsf_reset(_adapter *adapter)
  730. {
  731. u8 hw_port = rtw_hal_get_port(adapter);
  732. u32 tsf_rst_addr = 0;
  733. u8 tsf_rst_bit = 0;
  734. if (hw_port >= MAX_HW_PORT) {
  735. RTW_ERR(FUNC_ADPT_FMT" HW Port(%d) invalid\n", FUNC_ADPT_ARG(adapter), hw_port);
  736. rtw_warn_on(1);
  737. return;
  738. }
  739. tsf_rst_addr = port_cfg[hw_port].tsf_rst;
  740. tsf_rst_bit = port_cfg[hw_port].tsf_rst_bit;
  741. rtw_write8(adapter, tsf_rst_addr, tsf_rst_bit);
  742. }
  743. static void hw_var_set_monitor(PADAPTER Adapter, u8 *val)
  744. {
  745. u32 rcr_bits;
  746. u8 mode;
  747. HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  748. struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv);
  749. mode = *((u8 *)val);
  750. if (mode != _HW_STATE_MONITOR_) {
  751. RTW_ERR(FUNC_ADPT_FMT" mode(0x%02x) invalid\n", FUNC_ADPT_ARG(Adapter), mode);
  752. return;
  753. }
  754. /* Receive all type */
  755. rcr_bits = BIT_AAP_8821C | BIT_APM_8821C | BIT_AM_8821C
  756. | BIT_AB_8821C | BIT_APWRMGT_8821C
  757. | BIT_APP_PHYSTS_8821C;
  758. #ifdef CONFIG_RX_PACKET_APPEND_FCS
  759. /* Append FCS */
  760. rcr_bits |= BIT_APP_FCS_8821C;
  761. #endif
  762. #ifdef CONFIG_RX_PACKET_APPEND_CRC
  763. /*CRC and ICV packet will drop in rx func*/
  764. rcr_bits |= (BIT_ACRC32_8821C | BIT_AICV_8821C);
  765. #endif
  766. rtw_hal_get_hwreg(Adapter, HW_VAR_RCR, (u8 *)&pHalData->rcr_backup);
  767. rtw_hal_set_hwreg(Adapter, HW_VAR_RCR, (u8 *)&rcr_bits);
  768. /* Receive all data frames */
  769. rtw_write16(Adapter, REG_RXFLTMAP2_8821C, 0xFFFF);
  770. #if 0
  771. /* tx pause */
  772. rtw_write8(padapter, REG_TXPAUSE, 0xFF);
  773. #endif
  774. }
  775. void hw_set_ta(_adapter *adapter, u8 hw_port, u8 *val)
  776. {
  777. u8 idx = 0;
  778. u32 reg = port_cfg[hw_port].ta;
  779. for (idx = 0 ; idx < ETH_ALEN; idx++)
  780. rtw_write8(adapter, (reg + idx), val[idx]);
  781. RTW_INFO("%s("ADPT_FMT") hw port -%d TA: "MAC_FMT"\n",
  782. __func__, ADPT_ARG(adapter), hw_port, MAC_ARG(val));
  783. }
  784. void hw_set_aid(_adapter *adapter, u8 hw_port, u8 aid)
  785. {
  786. rtw_write16(adapter, port_cfg[hw_port].ps_aid, (0xF800 | aid));
  787. RTW_INFO("%s("ADPT_FMT") hw port -%d AID: %d\n",
  788. __func__, ADPT_ARG(adapter), hw_port, aid);
  789. }
  790. #ifdef CONFIG_CLIENT_PORT_CFG
  791. void rtw_hw_client_port_cfg(_adapter *adapter)
  792. {
  793. struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv;
  794. struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  795. u8 clt_port = get_clt_port(adapter);
  796. if (clt_port == CLT_PORT_INVALID)
  797. return;
  798. RTW_INFO("%s ("ADPT_FMT")\n", __func__, ADPT_ARG(adapter));
  799. /*Network type*/
  800. rtw_halmac_set_network_type(adapter_to_dvobj(adapter), clt_port, _HW_STATE_STATION_);
  801. /*A1*/
  802. rtw_halmac_set_mac_address(adapter_to_dvobj(adapter), clt_port, adapter_mac_addr(adapter));
  803. /*A2*/
  804. hw_set_ta(adapter, clt_port, pmlmeinfo->network.MacAddress);
  805. /*A3*/
  806. rtw_halmac_set_bssid(adapter_to_dvobj(adapter), clt_port, pmlmeinfo->network.MacAddress);
  807. /*Beacon space*/
  808. rtw_halmac_set_bcn_interval(adapter_to_dvobj(adapter), clt_port, pmlmeinfo->bcn_interval);
  809. /*AID*/
  810. hw_set_aid(adapter, clt_port, pmlmeinfo->aid);
  811. /*Beacon control*/
  812. hw_bcn_ctrl_set(adapter, clt_port, (BIT_P0_EN_RXBCN_RPT | BIT_EN_BCN_FUNCTION));
  813. RTW_INFO("%s ("ADPT_FMT") clt_port:%d\n", __func__, ADPT_ARG(adapter), clt_port);
  814. }
  815. /*#define DBG_TSF_MONITOR*/
  816. void rtw_hw_client_port_clr(_adapter *adapter)
  817. {
  818. u8 null_addr[ETH_ALEN] = {0};
  819. u8 clt_port = get_clt_port(adapter);
  820. if (clt_port == CLT_PORT_INVALID)
  821. return;
  822. RTW_INFO("%s ("ADPT_FMT") ==> \n", __func__, ADPT_ARG(adapter));
  823. #ifdef DBG_TSF_MONITOR
  824. /*Beacon control*/
  825. hw_bcn_ctrl_clr(adapter, clt_port, BIT_EN_BCN_FUNCTION);
  826. hw_tsf_reset(adapter);
  827. #endif
  828. /*Network type*/
  829. rtw_halmac_set_network_type(adapter_to_dvobj(adapter), clt_port, _HW_STATE_NOLINK_);
  830. /*A1*/
  831. rtw_halmac_set_mac_address(adapter_to_dvobj(adapter), clt_port, null_addr);
  832. /*A2*/
  833. hw_set_ta(adapter, clt_port, null_addr);
  834. /*A3*/
  835. rtw_halmac_set_bssid(adapter_to_dvobj(adapter), clt_port, null_addr);
  836. #ifdef DBG_TSF_MONITOR
  837. if (0)
  838. #endif
  839. /*Beacon control*/
  840. hw_bcn_ctrl_set(adapter, clt_port, (BIT_DIS_TSF_UDT | BIT_EN_BCN_FUNCTION));
  841. /*AID*/
  842. hw_set_aid(adapter, clt_port, 0);
  843. RTW_INFO("%s("ADPT_FMT") clt_port:%d\n", __func__, ADPT_ARG(adapter), clt_port);
  844. }
  845. #endif
  846. static void hw_var_set_opmode(PADAPTER Adapter, u8 *val)
  847. {
  848. u8 mode = *((u8 *)val);
  849. static u8 isMonitor = _FALSE;
  850. HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  851. if (isMonitor == _TRUE) {
  852. /* reset RCR from backup */
  853. rtw_hal_set_hwreg(Adapter, HW_VAR_RCR, (u8 *)&pHalData->rcr_backup);
  854. rtw_hal_rcr_set_chk_bssid(Adapter, MLME_ACTION_NONE);
  855. isMonitor = _FALSE;
  856. }
  857. if (mode == _HW_STATE_MONITOR_) {
  858. isMonitor = _TRUE;
  859. /* set net_type */
  860. Set_MSR(Adapter, _HW_STATE_NOLINK_);
  861. hw_var_set_monitor(Adapter, val);
  862. return;
  863. }
  864. rtw_hal_set_hwreg(Adapter, HW_VAR_MAC_ADDR, adapter_mac_addr(Adapter)); /* set mac addr to mac register */
  865. RTW_INFO(ADPT_FMT ": hw_port(%d) set mode=%d\n", ADPT_ARG(Adapter), get_hw_port(Adapter), mode);
  866. #ifdef CONFIG_MI_WITH_MBSSID_CAM /*For Port0 - MBSS CAM*/
  867. if (Adapter->hw_port != HW_PORT0) {
  868. RTW_ERR(ADPT_FMT ": Configure MBSSID cam on HW_PORT%d\n", ADPT_ARG(Adapter), Adapter->hw_port);
  869. rtw_warn_on(1);
  870. } else
  871. hw_var_set_opmode_mbid(Adapter, mode);
  872. #else
  873. rtw_iface_disable_tsf_update(Adapter);
  874. /* set net_type */
  875. Set_MSR(Adapter, mode);
  876. if ((mode == _HW_STATE_STATION_) || (mode == _HW_STATE_NOLINK_)) {
  877. #ifdef CONFIG_INTERRUPT_BASED_TXBCN
  878. if (!rtw_mi_get_ap_num(Adapter) && !rtw_mi_get_mesh_num(Adapter)) {
  879. /*CONFIG_INTERRUPT_BASED_TXBCN*/
  880. #ifdef CONFIG_INTERRUPT_BASED_TXBCN_EARLY_INT
  881. rtw_write8(Adapter, REG_DRVERLYINT, 0x05);/* restore early int time to 5ms */
  882. #if defined(CONFIG_SDIO_HCI)
  883. rtl8821cs_update_interrupt_mask(Adapter, 0, SDIO_HIMR_BCNERLY_INT_MSK);
  884. #endif
  885. #endif/* CONFIG_INTERRUPT_BASED_TXBCN_EARLY_INT */
  886. #ifdef CONFIG_INTERRUPT_BASED_TXBCN_BCN_OK_ERR
  887. #if defined(CONFIG_SDIO_HCI)
  888. rtl8821cs_update_interrupt_mask(Adapter, 0, (SDIO_HIMR_TXBCNOK_MSK | SDIO_HIMR_TXBCNERR_MSK));
  889. #endif
  890. #endif /* CONFIG_INTERRUPT_BASED_TXBCN_BCN_OK_ERR */
  891. }
  892. #endif /* CONFIG_INTERRUPT_BASED_TXBCN */
  893. if (!rtw_mi_get_ap_num(Adapter) && !rtw_mi_get_mesh_num(Adapter))
  894. StopTxBeacon(Adapter);
  895. hw_bcn_ctrl_set(Adapter, get_hw_port(Adapter), BIT_EN_BCN_FUNCTION_8821C | BIT_DIS_TSF_UDT_8821C);
  896. } else if (mode == _HW_STATE_ADHOC_) {
  897. ResumeTxBeacon(Adapter);
  898. hw_bcn_ctrl_set(Adapter, get_hw_port(Adapter), BIT_EN_BCN_FUNCTION_8821C | BIT_DIS_TSF_UDT_8821C);
  899. } else if (mode == _HW_STATE_AP_) {
  900. if (Adapter->hw_port == HW_PORT0) {
  901. #ifdef CONFIG_INTERRUPT_BASED_TXBCN
  902. #ifdef CONFIG_INTERRUPT_BASED_TXBCN_EARLY_INT
  903. #if defined(CONFIG_SDIO_HCI)
  904. rtl8821cs_update_interrupt_mask(Adapter, SDIO_HIMR_BCNERLY_INT_MSK, 0);
  905. #endif
  906. #endif/* CONFIG_INTERRUPT_BASED_TXBCN_EARLY_INT */
  907. #ifdef CONFIG_INTERRUPT_BASED_TXBCN_BCN_OK_ERR
  908. #if defined(CONFIG_SDIO_HCI)
  909. rtl8821cs_update_interrupt_mask(Adapter, (SDIO_HIMR_TXBCNOK_MSK | SDIO_HIMR_TXBCNERR_MSK), 0);
  910. #endif
  911. #endif/* CONFIG_INTERRUPT_BASED_TXBCN_BCN_OK_ERR */
  912. #endif /* CONFIG_INTERRUPT_BASED_TXBCN */
  913. /* enable to rx data frame */
  914. rtw_write16(Adapter, REG_RXFLTMAP2_8821C, 0xFFFF);
  915. /* Beacon Control related register for first time */
  916. rtw_write8(Adapter, REG_BCNDMATIM_8821C, 0x02); /* 2ms */
  917. rtw_write8(Adapter, REG_ATIMWND_8821C, 0x0c); /* ATIM:12ms */
  918. /*rtw_write16(Adapter, REG_TSFTR_SYN_OFFSET_8821C, 0x7fff);*//* +32767 (~32ms) */
  919. hw_tsf_reset(Adapter);
  920. /* don't enable update TSF0 for if1 (due to TSF update when beacon/probe rsp are received) */
  921. #if defined(CONFIG_INTERRUPT_BASED_TXBCN_BCN_OK_ERR)
  922. hw_bcn_ctrl_set(Adapter, get_hw_port(Adapter), BIT_EN_BCN_FUNCTION_8821C | BIT_DIS_TSF_UDT_8821C | BIT_P0_EN_TXBCN_RPT_8821C);
  923. #else
  924. hw_bcn_ctrl_set(Adapter, get_hw_port(Adapter), BIT_EN_BCN_FUNCTION_8821C | BIT_DIS_TSF_UDT_8821C);
  925. #endif
  926. } else {
  927. RTW_ERR(ADPT_FMT ": set AP mode on HW_PORT%d\n", ADPT_ARG(Adapter), Adapter->hw_port);
  928. rtw_warn_on(1);
  929. }
  930. }
  931. #endif
  932. }
  933. #ifdef CONFIG_AP_PORT_SWAP
  934. void rtw_hal_port_reconfig(_adapter *adapter, u8 port)
  935. {
  936. struct hal_spec_t *hal_spec = GET_HAL_SPEC(adapter);
  937. u32 bssid_offset = 0;
  938. u8 bssid[6] = {0};
  939. u8 vnet_type = 0;
  940. u8 vbcn_ctrl = 0;
  941. u8 i;
  942. if (port > (hal_spec->port_num - 1)) {
  943. RTW_INFO("[WARN] "ADPT_FMT"- hw_port : %d,will switch to invalid port-%d\n",
  944. ADPT_ARG(adapter), adapter->hw_port, port);
  945. rtw_warn_on(1);
  946. }
  947. RTW_PRINT(ADPT_FMT" - hw_port : %d,will switch to port-%d\n",
  948. ADPT_ARG(adapter), adapter->hw_port, port);
  949. /*backup*/
  950. vnet_type = (rtw_read8(adapter, port_cfg[adapter->hw_port].net_type) >> port_cfg[adapter->hw_port].net_type_shift) & 0x03;
  951. vbcn_ctrl = rtw_read8(adapter, port_cfg[adapter->hw_port].bcn_ctl);
  952. if (is_client_associated_to_ap(adapter)) {
  953. RTW_INFO("port0-iface is STA mode and linked\n");
  954. bssid_offset = port_cfg[adapter->hw_port].bssid;
  955. for (i = 0; i < 6; i++)
  956. bssid[i] = rtw_read8(adapter, bssid_offset + i);
  957. }
  958. /*reconfigure*/
  959. adapter->hw_port = port;
  960. rtw_hal_set_hwreg(adapter, HW_VAR_MAC_ADDR, adapter_mac_addr(adapter));
  961. Set_MSR(adapter, vnet_type);
  962. if (is_client_associated_to_ap(adapter)) {
  963. rtw_hal_set_hwreg(adapter, HW_VAR_BSSID, bssid);
  964. hw_tsf_reset(adapter);
  965. #ifdef CONFIG_FW_MULTI_PORT_SUPPORT
  966. rtw_set_default_port_id(adapter);
  967. #endif
  968. }
  969. #if defined(CONFIG_BT_COEXIST) && defined(CONFIG_FW_MULTI_PORT_SUPPORT)
  970. if (GET_HAL_DATA(adapter)->EEPROMBluetoothCoexist == _TRUE)
  971. rtw_hal_set_wifi_btc_port_id_cmd(adapter);
  972. #endif
  973. rtw_write8(adapter, port_cfg[adapter->hw_port].bcn_ctl, vbcn_ctrl);
  974. }
  975. static void rtl8821c_ap_port_switch(_adapter *adapter, u8 mode)
  976. {
  977. u8 hw_port = get_hw_port(adapter);
  978. struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
  979. u8 ap_nums = 0;
  980. _adapter *if_port0 = NULL;
  981. int i;
  982. RTW_INFO(ADPT_FMT ": hw_port(%d) will set mode to %d\n", ADPT_ARG(adapter), hw_port, mode);
  983. #if 0
  984. #ifdef CONFIG_P2P
  985. if (!rtw_p2p_chk_state(&adapter->wdinfo, P2P_STATE_NONE)) {
  986. RTW_INFO("%s, role=%d, p2p_state=%d, pre_p2p_state=%d\n", __func__,
  987. rtw_p2p_role(&adapter->wdinfo), rtw_p2p_state(&adapter->wdinfo), rtw_p2p_pre_state(&adapter->wdinfo));
  988. }
  989. #endif
  990. #endif
  991. if (mode != _HW_STATE_AP_)
  992. return;
  993. if ((mode == _HW_STATE_AP_) && (hw_port == HW_PORT0))
  994. return;
  995. /*check and prepare switch port to port0 for AP mode's BCN function*/
  996. ap_nums = rtw_mi_get_ap_num(adapter);
  997. if (ap_nums > 0) {
  998. RTW_ERR("SortAP mode numbers:%d, must move setting to MBSSID CAM, not support yet\n", ap_nums);
  999. rtw_warn_on(1);
  1000. return;
  1001. }
  1002. /*Get iface of port-0*/
  1003. for (i = 0; i < dvobj->iface_nums; i++) {
  1004. if (get_hw_port(dvobj->padapters[i]) == HW_PORT0) {
  1005. if_port0 = dvobj->padapters[i];
  1006. break;
  1007. }
  1008. }
  1009. if (if_port0 == NULL) {
  1010. RTW_ERR("%s if_port0 == NULL\n", __func__);
  1011. rtw_warn_on(1);
  1012. return;
  1013. }
  1014. rtw_hal_port_reconfig(if_port0, hw_port);
  1015. adapter->hw_port = HW_PORT0;
  1016. RTW_INFO(ADPT_FMT ": Cfg SoftAP mode to hw_port(%d) done\n", ADPT_ARG(adapter), adapter->hw_port);
  1017. }
  1018. #endif
  1019. static void hw_var_set_basic_rate(PADAPTER adapter, u8 *ratetbl)
  1020. {
  1021. #define RATE_1M BIT(0)
  1022. #define RATE_2M BIT(1)
  1023. #define RATE_5_5M BIT(2)
  1024. #define RATE_11M BIT(3)
  1025. #define RATE_6M BIT(4)
  1026. #define RATE_9M BIT(5)
  1027. #define RATE_12M BIT(6)
  1028. #define RATE_18M BIT(7)
  1029. #define RATE_24M BIT(8)
  1030. #define RATE_36M BIT(9)
  1031. #define RATE_48M BIT(10)
  1032. #define RATE_54M BIT(11)
  1033. #define RATE_MCS0 BIT(12)
  1034. #define RATE_MCS1 BIT(13)
  1035. #define RATE_MCS2 BIT(14)
  1036. #define RATE_MCS3 BIT(15)
  1037. #define RATE_MCS4 BIT(16)
  1038. #define RATE_MCS5 BIT(17)
  1039. #define RATE_MCS6 BIT(18)
  1040. #define RATE_MCS7 BIT(19)
  1041. #define RATES_CCK (RATE_11M | RATE_5_5M | RATE_2M | RATE_1M)
  1042. #define RATES_OFDM (RATE_54M | RATE_48M | RATE_36M | RATE_24M | RATE_18M | RATE_12M | RATE_9M | RATE_6M)
  1043. struct mlme_ext_info *mlmext_info = &adapter->mlmeextpriv.mlmext_info;
  1044. PHAL_DATA_TYPE hal = GET_HAL_DATA(adapter);
  1045. u16 input_b = 0, masked = 0, ioted = 0, BrateCfg = 0;
  1046. u16 rrsr_2g_force_mask = RATES_CCK;
  1047. u16 rrsr_2g_allow_mask = RATE_24M | RATE_12M | RATE_6M | RATES_CCK;
  1048. u16 rrsr_5g_force_mask = RATE_6M;
  1049. u16 rrsr_5g_allow_mask = RATES_OFDM;
  1050. u32 val32;
  1051. HalSetBrateCfg(adapter, ratetbl, &BrateCfg);
  1052. input_b = BrateCfg;
  1053. /* apply force and allow mask */
  1054. if (hal->current_band_type == BAND_ON_2_4G) {
  1055. BrateCfg |= rrsr_2g_force_mask;
  1056. BrateCfg &= rrsr_2g_allow_mask;
  1057. } else {
  1058. BrateCfg |= rrsr_5g_force_mask;
  1059. BrateCfg &= rrsr_5g_allow_mask;
  1060. }
  1061. masked = BrateCfg;
  1062. /* IOT consideration */
  1063. if (mlmext_info->assoc_AP_vendor == HT_IOT_PEER_CISCO) {
  1064. /* if peer is cisco and didn't use ofdm rate, we enable 6M ack */
  1065. if ((BrateCfg & (RATE_24M | RATE_12M | RATE_6M)) == 0)
  1066. BrateCfg |= RATE_6M;
  1067. }
  1068. ioted = BrateCfg;
  1069. hal->BasicRateSet = BrateCfg;
  1070. RTW_INFO("[HW_VAR_BASIC_RATE] %#x->%#x->%#x\n", input_b, masked, ioted);
  1071. /* Set RRSR rate table. */
  1072. val32 = rtw_read32(adapter, REG_RRSR_8821C);
  1073. val32 &= ~(BIT_MASK_RRSC_BITMAP << BIT_SHIFT_RRSC_BITMAP);
  1074. val32 |= BIT_RRSC_BITMAP(BrateCfg);
  1075. val32 = rtw_write32(adapter, REG_RRSR_8821C, val32);
  1076. }
  1077. static void hw_var_hw_port_cfg(_adapter *adapter, u8 enable)
  1078. {
  1079. if (enable)
  1080. hw_bcn_ctrl_add(adapter, get_hw_port(adapter), (BIT_P0_EN_RXBCN_RPT | BIT_DIS_TSF_UDT | BIT_EN_BCN_FUNCTION));
  1081. else
  1082. hw_bcn_ctrl_clr(adapter, get_hw_port(adapter), BIT_EN_BCN_FUNCTION);
  1083. }
  1084. static void hw_var_set_bcn_func(PADAPTER adapter, u8 enable)
  1085. {
  1086. u8 val8;
  1087. if (enable) {
  1088. /* enable TX BCN report
  1089. * Reg REG_FWHW_TXQ_CTRL_8821C[2] = 1
  1090. * Reg REG_BCN_CTRL_8821C[3][5] = 1
  1091. */
  1092. val8 = rtw_read8(adapter, REG_FWHW_TXQ_CTRL_8821C);
  1093. val8 |= BIT_EN_BCN_TRXRPT_V1_8821C;
  1094. rtw_write8(adapter, REG_FWHW_TXQ_CTRL_8821C, val8);
  1095. if (adapter->hw_port == HW_PORT0)
  1096. hw_bcn_ctrl_add(adapter, get_hw_port(adapter), BIT_EN_BCN_FUNCTION_8821C | BIT_P0_EN_TXBCN_RPT_8821C);
  1097. else
  1098. hw_bcn_ctrl_add(adapter, get_hw_port(adapter), BIT_EN_BCN_FUNCTION_8821C);
  1099. } else {
  1100. if (adapter->hw_port == HW_PORT0) {
  1101. val8 = BIT_EN_BCN_FUNCTION_8821C | BIT_P0_EN_TXBCN_RPT_8821C;
  1102. #ifdef CONFIG_BT_COEXIST
  1103. /* Always enable port0 beacon function for PSTDMA */
  1104. if (GET_HAL_DATA(adapter)->EEPROMBluetoothCoexist)
  1105. val8 = BIT_P0_EN_TXBCN_RPT_8821C;
  1106. #endif
  1107. hw_bcn_ctrl_clr(adapter, get_hw_port(adapter), val8);
  1108. } else
  1109. hw_bcn_ctrl_clr(adapter, get_hw_port(adapter), BIT_EN_BCN_FUNCTION_8821C);
  1110. }
  1111. }
  1112. static void hw_var_set_mlme_disconnect(PADAPTER adapter)
  1113. {
  1114. u8 val8;
  1115. #ifdef DBG_IFACE_STATUS
  1116. DBG_IFACE_STATUS_DUMP(adapter);
  1117. #endif
  1118. #ifdef CONFIG_CONCURRENT_MODE
  1119. if (rtw_mi_check_status(adapter, MI_LINKED) == _FALSE)
  1120. #endif
  1121. /* reject all data frames under not link state */
  1122. rtw_write16(adapter, REG_RXFLTMAP2_8821C, 0);
  1123. /* reset TSF*/
  1124. hw_tsf_reset(adapter);
  1125. /* disable update TSF*/
  1126. rtw_iface_disable_tsf_update(adapter);
  1127. #ifdef CONFIG_CLIENT_PORT_CFG
  1128. if (MLME_IS_STA(adapter))
  1129. rtw_hw_client_port_clr(adapter);
  1130. #endif
  1131. }
  1132. static void hw_var_set_mlme_sitesurvey(PADAPTER adapter, u8 enable)
  1133. {
  1134. struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
  1135. u16 value_rxfltmap2;
  1136. u8 val8;
  1137. PHAL_DATA_TYPE hal;
  1138. struct mlme_priv *pmlmepriv;
  1139. int i;
  1140. _adapter *iface;
  1141. #ifdef DBG_IFACE_STATUS
  1142. DBG_IFACE_STATUS_DUMP(adapter);
  1143. #endif
  1144. hal = GET_HAL_DATA(adapter);
  1145. pmlmepriv = &adapter->mlmepriv;
  1146. #ifdef CONFIG_FIND_BEST_CHANNEL
  1147. /* Receive all data frames */
  1148. value_rxfltmap2 = 0xFFFF;
  1149. #else
  1150. /* not to receive data frame */
  1151. value_rxfltmap2 = 0;
  1152. #endif
  1153. if (enable) {
  1154. /*
  1155. * 1. configure REG_RXFLTMAP2
  1156. * 2. disable TSF update & buddy TSF update to avoid updating wrong TSF due to clear RCR_CBSSID_BCN
  1157. * 3. config RCR to receive different BSSID BCN or probe rsp
  1158. */
  1159. rtw_write16(adapter, REG_RXFLTMAP2_8821C, value_rxfltmap2);
  1160. rtw_hal_rcr_set_chk_bssid(adapter, MLME_SCAN_ENTER);
  1161. /* Save orignal RRSR setting. */
  1162. hal->RegRRSR = rtw_read16(adapter, REG_RRSR_8821C);
  1163. if (rtw_mi_get_ap_num(adapter) || rtw_mi_get_mesh_num(adapter))
  1164. StopTxBeacon(adapter);
  1165. } else {
  1166. /* sitesurvey done
  1167. * 1. enable rx data frame
  1168. * 2. config RCR not to receive different BSSID BCN or probe rsp
  1169. * 3. can enable TSF update & buddy TSF right now due to HW support(IC before 8821C not support ex:8812A/8814A/8192E...)
  1170. */
  1171. if (rtw_mi_check_fwstate(adapter, _FW_LINKED | WIFI_AP_STATE | WIFI_MESH_STATE))/* enable to rx data frame */
  1172. rtw_write16(adapter, REG_RXFLTMAP2_8821C, 0xFFFF);
  1173. rtw_hal_rcr_set_chk_bssid(adapter, MLME_SCAN_DONE);
  1174. /* Restore orignal RRSR setting. */
  1175. rtw_write16(adapter, REG_RRSR_8821C, hal->RegRRSR);
  1176. if (rtw_mi_get_ap_num(adapter) || rtw_mi_get_mesh_num(adapter)) {
  1177. ResumeTxBeacon(adapter);
  1178. rtw_mi_tx_beacon_hdl(adapter);
  1179. }
  1180. }
  1181. }
  1182. static void hw_var_set_mlme_join(PADAPTER adapter, u8 type)
  1183. {
  1184. u8 val8;
  1185. u16 val16;
  1186. u32 val32;
  1187. u8 RetryLimit;
  1188. PHAL_DATA_TYPE hal;
  1189. struct mlme_priv *pmlmepriv;
  1190. RetryLimit = RL_VAL_STA;
  1191. hal = GET_HAL_DATA(adapter);
  1192. pmlmepriv = &adapter->mlmepriv;
  1193. #ifdef CONFIG_CONCURRENT_MODE
  1194. if (type == 0) {
  1195. /* prepare to join */
  1196. if (rtw_mi_get_ap_num(adapter) || rtw_mi_get_mesh_num(adapter))
  1197. StopTxBeacon(adapter);
  1198. /* enable to rx data frame.Accept all data frame */
  1199. rtw_write16(adapter, REG_RXFLTMAP2_8821C, 0xFFFF);
  1200. hw_bcn_func(adapter, _TRUE);
  1201. if (check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE)
  1202. RetryLimit = (hal->CustomerID == RT_CID_CCX) ? RL_VAL_AP : RL_VAL_STA;
  1203. else /* Ad-hoc Mode */
  1204. RetryLimit = RL_VAL_AP;
  1205. #ifdef CONFIG_CLIENT_PORT_CFG
  1206. rtw_hw_client_port_cfg(adapter);
  1207. #endif
  1208. rtw_iface_enable_tsf_update(adapter);
  1209. } else if (type == 1) {
  1210. /* joinbss_event call back when join res < 0 */
  1211. if (rtw_mi_check_status(adapter, MI_LINKED) == _FALSE)
  1212. rtw_write16(adapter, REG_RXFLTMAP2_8821C, 0x00);
  1213. rtw_iface_disable_tsf_update(adapter);
  1214. if (rtw_mi_get_ap_num(adapter) || rtw_mi_get_mesh_num(adapter)) {
  1215. ResumeTxBeacon(adapter);
  1216. /* reset TSF 1/2 after resume_tx_beacon */
  1217. val8 = BIT_TSFTR_RST_8821C | BIT_TSFTR_CLI0_RST_8821C;
  1218. rtw_write8(adapter, REG_DUAL_TSF_RST_8821C, val8);
  1219. }
  1220. #ifdef CONFIG_CLIENT_PORT_CFG
  1221. if (MLME_IS_STA(adapter))
  1222. rtw_hw_client_port_clr(adapter);
  1223. #endif
  1224. } else if (type == 2) {
  1225. /* sta add event callback */
  1226. if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE | WIFI_ADHOC_MASTER_STATE)) {
  1227. rtw_write8(adapter, 0x542, 0x02);
  1228. RetryLimit = RL_VAL_AP;
  1229. }
  1230. if (rtw_mi_get_ap_num(adapter) || rtw_mi_get_mesh_num(adapter)) {
  1231. ResumeTxBeacon(adapter);
  1232. /* reset TSF 1/2 after resume_tx_beacon */
  1233. rtw_write8(adapter, REG_DUAL_TSF_RST_8821C, BIT_TSFTR_RST_8821C | BIT_TSFTR_CLI0_RST_8821C);
  1234. }
  1235. }
  1236. val16 = BIT_LRL_8821C(RetryLimit) | BIT_SRL_8821C(RetryLimit);
  1237. rtw_write16(adapter, REG_RETRY_LIMIT_8821C, val16);
  1238. #else /* !CONFIG_CONCURRENT_MODE */
  1239. if (type == 0) {
  1240. /* prepare to join */
  1241. /* enable to rx data frame.Accept all data frame */
  1242. rtw_write16(adapter, REG_RXFLTMAP2_8821C, 0xFFFF);
  1243. if (check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE)
  1244. RetryLimit = (hal->CustomerID == RT_CID_CCX) ? RL_VAL_AP : RL_VAL_STA;
  1245. else /* Ad-hoc Mode */
  1246. RetryLimit = RL_VAL_AP;
  1247. hw_bcn_func(adapter, _TRUE);
  1248. rtw_iface_enable_tsf_update(adapter);
  1249. } else if (type == 1) {
  1250. /* joinbss_event call back when join res < 0 */
  1251. rtw_write16(adapter, REG_RXFLTMAP2_8821C, 0x00);
  1252. rtw_iface_disable_tsf_update(adapter);
  1253. } else if (type == 2) {
  1254. /* sta add event callback */
  1255. if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE | WIFI_ADHOC_MASTER_STATE))
  1256. RetryLimit = RL_VAL_AP;
  1257. }
  1258. val16 = BIT_LRL_8821C(RetryLimit) | BIT_SRL_8821C(RetryLimit);
  1259. rtw_write16(adapter, REG_RETRY_LIMIT_8821C, val16);
  1260. #endif /* !CONFIG_CONCURRENT_MODE */
  1261. }
  1262. static void hw_var_set_acm_ctrl(PADAPTER adapter, u8 ctrl)
  1263. {
  1264. u8 hwctrl = 0;
  1265. if (ctrl) {
  1266. hwctrl |= BIT_ACMHWEN_8821C;
  1267. if (ctrl & BIT(1)) /* BE */
  1268. hwctrl |= BIT_BEQ_ACM_EN_8821C;
  1269. else
  1270. hwctrl &= (~BIT_BEQ_ACM_EN_8821C);
  1271. if (ctrl & BIT(2)) /* VI */
  1272. hwctrl |= BIT_VIQ_ACM_EN_8821C;
  1273. else
  1274. hwctrl &= (~BIT_VIQ_ACM_EN_8821C);
  1275. if (ctrl & BIT(3)) /* VO */
  1276. hwctrl |= BIT_VOQ_ACM_EN_8821C;
  1277. else
  1278. hwctrl &= (~BIT_VOQ_ACM_EN_8821C);
  1279. }
  1280. RTW_INFO("[HW_VAR_ACM_CTRL] Write 0x%02X\n", hwctrl);
  1281. rtw_write8(adapter, REG_ACMHWCTRL_8821C, hwctrl);
  1282. }
  1283. static void hw_var_set_sec_cfg(PADAPTER adapter, u8 cfg)
  1284. {
  1285. u16 reg_scr_ori;
  1286. u16 reg_scr;
  1287. reg_scr = reg_scr_ori = rtw_read16(adapter, REG_SECCFG_8821C);
  1288. reg_scr |= (BIT_CHK_KEYID_8821C | BIT_RXDEC_8821C | BIT_TXENC_8821C);
  1289. if (_rtw_camctl_chk_cap(adapter, SEC_CAP_CHK_BMC))
  1290. reg_scr |= BIT_CHK_BMC_8821C;
  1291. if (_rtw_camctl_chk_flags(adapter, SEC_STATUS_STA_PK_GK_CONFLICT_DIS_BMC_SEARCH))
  1292. reg_scr |= BIT_NOSKMC_8821C;
  1293. if (reg_scr != reg_scr_ori)
  1294. rtw_write16(adapter, REG_SECCFG_8821C, reg_scr);
  1295. RTW_INFO("%s: [HW_VAR_SEC_CFG] 0x%x=0x%x\n", __FUNCTION__,
  1296. REG_SECCFG_8821C, rtw_read32(adapter, REG_SECCFG_8821C));
  1297. }
  1298. static void hw_var_set_sec_dk_cfg(PADAPTER adapter, u8 enable)
  1299. {
  1300. struct security_priv *sec = &adapter->securitypriv;
  1301. u8 reg_scr = rtw_read8(adapter, REG_SECCFG_8821C);
  1302. if (enable) {
  1303. /* Enable default key related setting */
  1304. reg_scr |= BIT_TXBCUSEDK_8821C;
  1305. if (sec->dot11AuthAlgrthm != dot11AuthAlgrthm_8021X)
  1306. reg_scr |= BIT_RXUHUSEDK_8821C | BIT_TXUHUSEDK_8821C;
  1307. } else {
  1308. /* Disable default key related setting */
  1309. reg_scr &= ~(BIT_RXBCUSEDK_8821C | BIT_TXBCUSEDK_8821C | BIT_RXUHUSEDK_8821C | BIT_TXUHUSEDK_8821C);
  1310. }
  1311. rtw_write8(adapter, REG_SECCFG_8821C, reg_scr);
  1312. RTW_INFO("%s: [HW_VAR_SEC_DK_CFG] 0x%x=0x%08x\n", __FUNCTION__,
  1313. REG_SECCFG_8821C, rtw_read32(adapter, REG_SECCFG_8821C));
  1314. }
  1315. static void hw_var_set_bcn_valid(PADAPTER adapter)
  1316. {
  1317. u8 val8 = 0;
  1318. /* only port 0 can TX BCN */
  1319. val8 = rtw_read8(adapter, REG_FIFOPAGE_CTRL_2_8821C + 1);
  1320. val8 = val8 | BIT(7);
  1321. rtw_write8(adapter, REG_FIFOPAGE_CTRL_2_8821C + 1, val8);
  1322. }
  1323. static void hw_var_set_cam_empty_entry(PADAPTER adapter, u8 ucIndex)
  1324. {
  1325. u8 i;
  1326. u32 ulCommand = 0;
  1327. u32 ulContent = 0;
  1328. u32 ulEncAlgo = CAM_AES;
  1329. for (i = 0; i < CAM_CONTENT_COUNT; i++) {
  1330. /* filled id in CAM config 2 byte */
  1331. if (i == 0)
  1332. ulContent |= (ucIndex & 0x03) | ((u16)(ulEncAlgo) << 2);
  1333. else
  1334. ulContent = 0;
  1335. /* polling bit, and No Write enable, and address */
  1336. ulCommand = CAM_CONTENT_COUNT * ucIndex + i;
  1337. ulCommand |= BIT_SECCAM_POLLING_8821C | BIT_SECCAM_WE_8821C;
  1338. /* write content 0 is equall to mark invalid */
  1339. rtw_write32(adapter, REG_CAMWRITE_8821C, ulContent);
  1340. rtw_write32(adapter, REG_CAMCMD_8821C, ulCommand);
  1341. }
  1342. }
  1343. static void hw_var_set_ack_preamble(PADAPTER adapter, u8 bShortPreamble)
  1344. {
  1345. u8 val8 = 0;
  1346. val8 = rtw_read8(adapter, REG_WMAC_TRXPTCL_CTL_8821C + 2);
  1347. val8 |= BIT(4) | BIT(5);
  1348. if (bShortPreamble)
  1349. val8 |= BIT1;
  1350. else
  1351. val8 &= (~BIT1);
  1352. rtw_write8(adapter, REG_WMAC_TRXPTCL_CTL_8821C + 2, val8);
  1353. }
  1354. void rtl8821c_dl_rsvd_page(PADAPTER adapter, u8 mstatus)
  1355. {
  1356. PHAL_DATA_TYPE hal = GET_HAL_DATA(adapter);
  1357. struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv;
  1358. struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info;
  1359. struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(adapter);
  1360. BOOLEAN bcn_valid = _FALSE;
  1361. u8 DLBcnCount = 0;
  1362. u32 poll = 0;
  1363. u8 val8, org_bcn, org_cr;
  1364. u8 hw_port = rtw_hal_get_port(adapter);
  1365. RTW_INFO(FUNC_ADPT_FMT ":+ hw_port=%d mstatus(%x)\n",
  1366. FUNC_ADPT_ARG(adapter), hw_port, mstatus);
  1367. if (mstatus == RT_MEDIA_CONNECT) {
  1368. #if 0
  1369. BOOLEAN bRecover = _FALSE;
  1370. #endif
  1371. u8 v8;
  1372. /* We should set AID, correct TSF, HW seq enable before set JoinBssReport to Fw in 8821C -bit 10:0 */
  1373. rtw_write16(adapter, port_cfg[hw_port].ps_aid, (0xF800 | pmlmeinfo->aid));
  1374. /* Enable SW TX beacon - Set REG_CR bit 8. DMA beacon by SW */
  1375. v8 = rtw_read8(adapter, REG_CR_8821C + 1);
  1376. org_cr = v8;
  1377. v8 |= (BIT_ENSWBCN_8821C >> 8);
  1378. rtw_write8(adapter, REG_CR_8821C + 1, v8);
  1379. /*
  1380. * Disable Hw protection for a time which revserd for Hw sending beacon.
  1381. * Fix download reserved page packet fail that access collision with the protection time.
  1382. */
  1383. val8 = rtw_read8(adapter, REG_BCN_CTRL_8821C);
  1384. org_bcn = val8;
  1385. val8 &= ~BIT_EN_BCN_FUNCTION_8821C;
  1386. val8 |= BIT_DIS_TSF_UDT_8821C;
  1387. rtw_write8(adapter, REG_BCN_CTRL_8821C, val8);
  1388. #if 0
  1389. /* Set FWHW_TXQ_CTRL 0x422[6]=0 to tell Hw the packet is not a real beacon frame. */
  1390. RegFwHwTxQCtrl = rtw_read8(adapter, REG_FWHW_TXQ_CTRL_8821C + 2);
  1391. if (RegFwHwTxQCtrl & BIT(6))
  1392. bRecover = _TRUE;
  1393. /* To tell Hw the packet is not a real beacon frame. */
  1394. RegFwHwTxQCtrl &= ~BIT(6);
  1395. rtw_write8(adapter, REG_FWHW_TXQ_CTRL_8821C + 2, RegFwHwTxQCtrl);
  1396. #endif
  1397. /* Clear beacon valid check bit. */
  1398. rtw_hal_set_hwreg(adapter, HW_VAR_BCN_VALID, NULL);
  1399. DLBcnCount = 0;
  1400. poll = 0;
  1401. do {
  1402. /* download rsvd page. */
  1403. rtw_hal_set_fw_rsvd_page(adapter, _FALSE);
  1404. DLBcnCount++;
  1405. do {
  1406. rtw_yield_os();
  1407. /* check rsvd page download OK. */
  1408. rtw_hal_get_hwreg(adapter, HW_VAR_BCN_VALID, (u8 *)(&bcn_valid));
  1409. poll++;
  1410. } while (!bcn_valid && (poll % 10) != 0 && !RTW_CANNOT_RUN(adapter));
  1411. } while (!bcn_valid && DLBcnCount <= 100 && !RTW_CANNOT_RUN(adapter));
  1412. if (RTW_CANNOT_RUN(adapter))
  1413. ;
  1414. else if (!bcn_valid)
  1415. RTW_ERR(FUNC_ADPT_FMT ": DL RSVD page failed! DLBcnCount:%u, poll:%u\n",
  1416. FUNC_ADPT_ARG(adapter), DLBcnCount, poll);
  1417. else {
  1418. struct pwrctrl_priv *pwrctl = adapter_to_pwrctl(adapter);
  1419. pwrctl->fw_psmode_iface_id = adapter->iface_id;
  1420. rtw_hal_set_fw_rsvd_page(adapter, _TRUE);
  1421. RTW_INFO(ADPT_FMT ": DL RSVD page success! DLBcnCount:%u, poll:%u\n",
  1422. ADPT_ARG(adapter), DLBcnCount, poll);
  1423. }
  1424. rtw_write8(adapter, REG_CR_8821C + 1, org_cr);
  1425. rtw_write8(adapter, REG_BCN_CTRL_8821C, org_bcn);
  1426. #if 0
  1427. /*
  1428. * To make sure that if there exists an adapter which would like to send beacon.
  1429. * If exists, the origianl value of 0x422[6] will be 1, we should check this to
  1430. * prevent from setting 0x422[6] to 0 after download reserved page, or it will cause
  1431. * the beacon cannot be sent by HW.
  1432. */
  1433. if (bRecover) {
  1434. RegFwHwTxQCtrl |= BIT(6);
  1435. rtw_write8(adapter, REG_FWHW_TXQ_CTRL_8821C + 2, RegFwHwTxQCtrl);
  1436. }
  1437. #endif
  1438. #ifndef CONFIG_PCI_HCI
  1439. /* Clear CR[8] or beacon packet will not be send to TxBuf anymore. */
  1440. v8 = rtw_read8(adapter, REG_CR_8821C + 1);
  1441. v8 &= ~BIT(0); /* ~ENSWBCN */
  1442. rtw_write8(adapter, REG_CR_8821C + 1, v8);
  1443. #endif /* !CONFIG_PCI_HCI */
  1444. }
  1445. }
  1446. static void rtl8821c_set_h2c_fw_joinbssrpt(PADAPTER adapter, u8 mstatus)
  1447. {
  1448. if (mstatus == RT_MEDIA_CONNECT)
  1449. rtl8821c_dl_rsvd_page(adapter, RT_MEDIA_CONNECT);
  1450. }
  1451. /*
  1452. * Parameters:
  1453. * adapter
  1454. * enable _TRUE: enable; _FALSE: disable
  1455. */
  1456. static u8 rx_agg_switch(PADAPTER adapter, u8 enable)
  1457. {
  1458. /* if (rtl8821c_config_rx_agg(adapter, enable)) */
  1459. return _SUCCESS;
  1460. return _FAIL;
  1461. }
  1462. u8 rtl8821c_sethwreg(PADAPTER adapter, u8 variable, u8 *val)
  1463. {
  1464. PHAL_DATA_TYPE hal = GET_HAL_DATA(adapter);
  1465. u8 ret = _SUCCESS;
  1466. u8 val8;
  1467. u16 val16;
  1468. u32 val32;
  1469. switch (variable) {
  1470. case HW_VAR_SET_OPMODE:
  1471. hw_var_set_opmode(adapter, val);
  1472. break;
  1473. /*
  1474. case HW_VAR_INIT_RTS_RATE:
  1475. break;
  1476. */
  1477. case HW_VAR_BASIC_RATE:
  1478. hw_var_set_basic_rate(adapter, val);
  1479. break;
  1480. case HW_VAR_TXPAUSE:
  1481. rtw_write8(adapter, REG_TXPAUSE_8821C, *val);
  1482. break;
  1483. case HW_VAR_BCN_FUNC:
  1484. hw_var_set_bcn_func(adapter, *val);
  1485. break;
  1486. case HW_VAR_PORT_CFG:
  1487. hw_var_hw_port_cfg(adapter, *val);
  1488. break;
  1489. case HW_VAR_MLME_DISCONNECT:
  1490. hw_var_set_mlme_disconnect(adapter);
  1491. break;
  1492. case HW_VAR_MLME_SITESURVEY:
  1493. hw_var_set_mlme_sitesurvey(adapter, *val);
  1494. #ifdef CONFIG_BT_COEXIST
  1495. if (hal->EEPROMBluetoothCoexist)
  1496. rtw_btcoex_ScanNotify(adapter, *val ? _TRUE : _FALSE);
  1497. else
  1498. #endif /* CONFIG_BT_COEXIST */
  1499. rtw_btcoex_wifionly_scan_notify(adapter);
  1500. break;
  1501. case HW_VAR_MLME_JOIN:
  1502. hw_var_set_mlme_join(adapter, *val);
  1503. #ifdef CONFIG_BT_COEXIST
  1504. if (hal->EEPROMBluetoothCoexist)
  1505. rtw_btcoex_ConnectNotify(adapter, *val ? _FALSE : _TRUE);
  1506. else
  1507. #endif /* CONFIG_BT_COEXIST */
  1508. rtw_btcoex_wifionly_connect_notify(adapter);
  1509. break;
  1510. case HW_VAR_SLOT_TIME:
  1511. rtw_write8(adapter, REG_SLOT_8821C, *val);
  1512. break;
  1513. case HW_VAR_RESP_SIFS:
  1514. /* RESP_SIFS for CCK */
  1515. rtw_write8(adapter, REG_RESP_SIFS_CCK_8821C, val[0]);
  1516. rtw_write8(adapter, REG_RESP_SIFS_CCK_8821C + 1, val[1]);
  1517. /* RESP_SIFS for OFDM */
  1518. rtw_write8(adapter, REG_RESP_SIFS_OFDM_8821C, val[2]);
  1519. rtw_write8(adapter, REG_RESP_SIFS_OFDM_8821C + 1, val[3]);
  1520. break;
  1521. case HW_VAR_ACK_PREAMBLE:
  1522. hw_var_set_ack_preamble(adapter, *val);
  1523. break;
  1524. case HW_VAR_SEC_CFG:
  1525. hw_var_set_sec_cfg(adapter, *val);
  1526. break;
  1527. case HW_VAR_SEC_DK_CFG:
  1528. if (val)
  1529. hw_var_set_sec_dk_cfg(adapter, _TRUE);
  1530. else
  1531. hw_var_set_sec_dk_cfg(adapter, _FALSE);
  1532. break;
  1533. case HW_VAR_BCN_VALID:
  1534. hw_var_set_bcn_valid(adapter);
  1535. break;
  1536. /*
  1537. case HW_VAR_RF_TYPE:
  1538. break;
  1539. */
  1540. case HW_VAR_CAM_EMPTY_ENTRY:
  1541. hw_var_set_cam_empty_entry(adapter, *val);
  1542. break;
  1543. case HW_VAR_CAM_INVALID_ALL:
  1544. val32 = BIT_SECCAM_POLLING_8821C | BIT_SECCAM_CLR_8821C;
  1545. rtw_write32(adapter, REG_CAMCMD_8821C, val32);
  1546. break;
  1547. case HW_VAR_AC_PARAM_VO:
  1548. rtw_write32(adapter, REG_EDCA_VO_PARAM_8821C, *(u32 *)val);
  1549. break;
  1550. case HW_VAR_AC_PARAM_VI:
  1551. rtw_write32(adapter, REG_EDCA_VI_PARAM_8821C, *(u32 *)val);
  1552. break;
  1553. case HW_VAR_AC_PARAM_BE:
  1554. hal->ac_param_be = *(u32 *)val;
  1555. rtw_write32(adapter, REG_EDCA_BE_PARAM_8821C, *(u32 *)val);
  1556. break;
  1557. case HW_VAR_AC_PARAM_BK:
  1558. rtw_write32(adapter, REG_EDCA_BK_PARAM_8821C, *(u32 *)val);
  1559. break;
  1560. case HW_VAR_ACM_CTRL:
  1561. hw_var_set_acm_ctrl(adapter, *val);
  1562. break;
  1563. /*
  1564. case HW_VAR_AMPDU_MIN_SPACE:
  1565. break;
  1566. */
  1567. #ifdef CONFIG_80211N_HT
  1568. case HW_VAR_AMPDU_FACTOR: {
  1569. u32 AMPDULen = *val; /* enum AGGRE_SIZE */
  1570. AMPDULen = (0x2000 << AMPDULen) - 1;
  1571. rtw_write32(adapter, REG_AMPDU_MAX_LENGTH_8821C, AMPDULen);
  1572. }
  1573. break;
  1574. #endif /* CONFIG_80211N_HT */
  1575. case HW_VAR_RXDMA_AGG_PG_TH:
  1576. /*
  1577. * TH=1 => invalidate RX DMA aggregation
  1578. * TH=0 => validate RX DMA aggregation, use init value.
  1579. */
  1580. if (*val == 0)
  1581. /* enable RXDMA aggregation */
  1582. rx_agg_switch(adapter, _TRUE);
  1583. else
  1584. /* disable RXDMA aggregation */
  1585. rx_agg_switch(adapter, _FALSE);
  1586. break;
  1587. case HW_VAR_H2C_FW_PWRMODE:
  1588. rtl8821c_set_FwPwrMode_cmd(adapter, *val);
  1589. break;
  1590. /*
  1591. case HW_VAR_H2C_PS_TUNE_PARAM:
  1592. break;
  1593. */
  1594. case HW_VAR_H2C_FW_JOINBSSRPT:
  1595. rtl8821c_set_h2c_fw_joinbssrpt(adapter, *val);
  1596. break;
  1597. case HW_VAR_DL_RSVD_PAGE:
  1598. #ifdef CONFIG_BT_COEXIST
  1599. if (check_fwstate(&adapter->mlmepriv, WIFI_AP_STATE) == _TRUE)
  1600. rtl8821c_download_BTCoex_AP_mode_rsvd_page(adapter);
  1601. #endif
  1602. break; /*
  1603. case HW_VAR_FWLPS_RF_ON:
  1604. break;
  1605. */
  1606. #ifdef CONFIG_P2P
  1607. case HW_VAR_H2C_FW_P2P_PS_OFFLOAD:
  1608. #ifdef CONFIG_FW_MULTI_PORT_SUPPORT
  1609. if (*val == P2P_PS_ENABLE)
  1610. rtw_set_default_port_id(adapter);
  1611. #endif
  1612. rtw_set_p2p_ps_offload_cmd(adapter, *val);
  1613. break;
  1614. #endif
  1615. /*
  1616. case HW_VAR_TRIGGER_GPIO_0:
  1617. case HW_VAR_BT_SET_COEXIST:
  1618. case HW_VAR_BT_ISSUE_DELBA:
  1619. break;
  1620. */
  1621. /*
  1622. case HW_VAR_SWITCH_EPHY_WoWLAN:
  1623. case HW_VAR_EFUSE_USAGE:
  1624. case HW_VAR_EFUSE_BYTES:
  1625. case HW_VAR_EFUSE_BT_USAGE:
  1626. case HW_VAR_EFUSE_BT_BYTES:
  1627. break;
  1628. */
  1629. case HW_VAR_FIFO_CLEARN_UP: {
  1630. struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(adapter);
  1631. u8 trycnt = 100;
  1632. u32 reg_hw_ssn;
  1633. /* pause tx */
  1634. rtw_write8(adapter, REG_TXPAUSE_8821C, 0xff);
  1635. /* keep hw sn */
  1636. if (adapter->xmitpriv.hw_ssn_seq_no == 1)
  1637. reg_hw_ssn = REG_HW_SEQ1_8821C;
  1638. else if (adapter->xmitpriv.hw_ssn_seq_no == 2)
  1639. reg_hw_ssn = REG_HW_SEQ2_8821C;
  1640. else if (adapter->xmitpriv.hw_ssn_seq_no == 3)
  1641. reg_hw_ssn = REG_HW_SEQ3_8821C;
  1642. else
  1643. reg_hw_ssn = REG_HW_SEQ0_8821C;
  1644. adapter->xmitpriv.nqos_ssn = rtw_read16(adapter, reg_hw_ssn);
  1645. if (pwrpriv->bkeepfwalive != _TRUE) {
  1646. /* RX DMA stop */
  1647. val32 = rtw_read32(adapter, REG_RXPKT_NUM_8821C);
  1648. val32 |= BIT_RW_RELEASE_EN;
  1649. rtw_write32(adapter, REG_RXPKT_NUM_8821C, val32);
  1650. do {
  1651. val32 = rtw_read32(adapter, REG_RXPKT_NUM_8821C);
  1652. val32 &= BIT_RXDMA_IDLE_8821C;
  1653. if (val32)
  1654. break;
  1655. RTW_INFO("[HW_VAR_FIFO_CLEARN_UP] val=%x times:%d\n", val32, trycnt);
  1656. } while (--trycnt);
  1657. if (trycnt == 0)
  1658. RTW_INFO("[HW_VAR_FIFO_CLEARN_UP] Stop RX DMA failed!\n");
  1659. #if 0
  1660. /* RQPN Load 0 */
  1661. rtw_write16(adapter, REG_RQPN_NPQ, 0);
  1662. rtw_write32(adapter, REG_RQPN, 0x80000000);
  1663. rtw_mdelay_os(2);
  1664. #endif
  1665. }
  1666. }
  1667. break;
  1668. case HW_VAR_RESTORE_HW_SEQ: {
  1669. /* restore Sequence No. */
  1670. u32 reg_hw_ssn;
  1671. if (adapter->xmitpriv.hw_ssn_seq_no == 1)
  1672. reg_hw_ssn = REG_HW_SEQ1_8821C;
  1673. else if (adapter->xmitpriv.hw_ssn_seq_no == 2)
  1674. reg_hw_ssn = REG_HW_SEQ2_8821C;
  1675. else if (adapter->xmitpriv.hw_ssn_seq_no == 3)
  1676. reg_hw_ssn = REG_HW_SEQ3_8821C;
  1677. else
  1678. reg_hw_ssn = REG_HW_SEQ0_8821C;
  1679. rtw_write8(adapter, reg_hw_ssn, adapter->xmitpriv.nqos_ssn);
  1680. }
  1681. break;
  1682. case HW_VAR_CHECK_TXBUF: {
  1683. u16 rtylmtorg;
  1684. u8 RetryLimit = 0x01;
  1685. systime start;
  1686. u32 passtime;
  1687. u32 timelmt = 2000; /* ms */
  1688. u32 waittime = 10; /* ms */
  1689. u32 high, low, normal, extra, publc;
  1690. u16 rsvd, available;
  1691. u8 empty;
  1692. rtylmtorg = rtw_read16(adapter, REG_RETRY_LIMIT_8821C);
  1693. val16 = BIT_LRL_8821C(RetryLimit) | BIT_SRL_8821C(RetryLimit);
  1694. rtw_write16(adapter, REG_RETRY_LIMIT_8821C, val16);
  1695. /* Check TX FIFO empty or not */
  1696. empty = _FALSE;
  1697. high = 0;
  1698. low = 0;
  1699. normal = 0;
  1700. extra = 0;
  1701. publc = 0;
  1702. start = rtw_get_current_time();
  1703. while ((rtw_get_passing_time_ms(start) < timelmt)
  1704. && !RTW_CANNOT_RUN(adapter)) {
  1705. high = rtw_read32(adapter, REG_FIFOPAGE_INFO_1_8821C);
  1706. low = rtw_read32(adapter, REG_FIFOPAGE_INFO_2_8821C);
  1707. normal = rtw_read32(adapter, REG_FIFOPAGE_INFO_3_8821C);
  1708. extra = rtw_read32(adapter, REG_FIFOPAGE_INFO_4_8821C);
  1709. publc = rtw_read32(adapter, REG_FIFOPAGE_INFO_5_8821C);
  1710. rsvd = BIT_GET_HPQ_V1_8821C(high);
  1711. available = BIT_GET_HPQ_AVAL_PG_V1_8821C(high);
  1712. if (rsvd != available) {
  1713. rtw_msleep_os(waittime);
  1714. continue;
  1715. }
  1716. rsvd = BIT_GET_LPQ_V1_8821C(low);
  1717. available = BIT_GET_LPQ_AVAL_PG_V1_8821C(low);
  1718. if (rsvd != available) {
  1719. rtw_msleep_os(waittime);
  1720. continue;
  1721. }
  1722. rsvd = BIT_GET_NPQ_V1_8821C(normal);
  1723. available = BIT_GET_NPQ_AVAL_PG_V1_8821C(normal);
  1724. if (rsvd != available) {
  1725. rtw_msleep_os(waittime);
  1726. continue;
  1727. }
  1728. rsvd = BIT_GET_EXQ_V1_8821C(extra);
  1729. available = BIT_GET_EXQ_AVAL_PG_V1_8821C(extra);
  1730. if (rsvd != available) {
  1731. rtw_msleep_os(waittime);
  1732. continue;
  1733. }
  1734. rsvd = BIT_GET_PUBQ_V1_8821C(publc);
  1735. available = BIT_GET_PUBQ_AVAL_PG_V1_8821C(publc);
  1736. if (rsvd != available) {
  1737. rtw_msleep_os(waittime);
  1738. continue;
  1739. }
  1740. empty = _TRUE;
  1741. break;
  1742. }
  1743. passtime = rtw_get_passing_time_ms(start);
  1744. if (_TRUE == empty)
  1745. RTW_INFO("[HW_VAR_CHECK_TXBUF] Empty in %d ms\n", passtime);
  1746. else if (RTW_CANNOT_RUN(adapter))
  1747. RTW_INFO("[HW_VAR_CHECK_TXBUF] bDriverStopped or bSurpriseRemoved\n");
  1748. else {
  1749. RTW_INFO("[HW_VAR_CHECK_TXBUF] NOT empty in %d ms\n", passtime);
  1750. RTW_INFO("[HW_VAR_CHECK_TXBUF] 0x230=0x%08x 0x234=0x%08x 0x238=0x%08x 0x23c=0x%08x 0x240=0x%08x\n",
  1751. high, low, normal, extra, publc);
  1752. }
  1753. rtw_write16(adapter, REG_RETRY_LIMIT_8821C, rtylmtorg);
  1754. }
  1755. break;
  1756. /*
  1757. case HW_VAR_PCIE_STOP_TX_DMA:
  1758. break;
  1759. */
  1760. /*
  1761. case HW_VAR_SYS_CLKR:
  1762. break;
  1763. */
  1764. #ifdef CONFIG_GPIO_WAKEUP
  1765. case HW_SET_GPIO_WL_CTRL: {
  1766. u8 enable = *val;
  1767. u8 value = 0;
  1768. u8 addr = REG_PAD_CTRL1_8821C + 3;
  1769. if (WAKEUP_GPIO_IDX == 6) {
  1770. value = rtw_read8(adapter, addr);
  1771. if (enable == _TRUE && (value & BIT(1)))
  1772. /* set 0x64[25] = 0 to control GPIO 6 */
  1773. rtw_write8(adapter, addr, value & (~BIT(1)));
  1774. else if (enable == _FALSE)
  1775. rtw_write8(adapter, addr, value | BIT(1));
  1776. RTW_INFO("[HW_SET_GPIO_WL_CTRL] 0x%02X=0x%02X\n",
  1777. addr, rtw_read8(adapter, addr));
  1778. }
  1779. }
  1780. break;
  1781. #endif
  1782. case HW_VAR_NAV_UPPER: {
  1783. #define HAL_NAV_UPPER_UNIT 128 /* micro-second */
  1784. u32 usNavUpper = *(u32 *)val;
  1785. if (usNavUpper > HAL_NAV_UPPER_UNIT * 0xFF) {
  1786. RTW_INFO(FUNC_ADPT_FMT ": [HW_VAR_NAV_UPPER] value(0x%08X us) is larger than (%d * 0xFF)!!!\n",
  1787. FUNC_ADPT_ARG(adapter), usNavUpper, HAL_NAV_UPPER_UNIT);
  1788. break;
  1789. }
  1790. usNavUpper = (usNavUpper + HAL_NAV_UPPER_UNIT - 1) / HAL_NAV_UPPER_UNIT;
  1791. rtw_write8(adapter, REG_NAV_CTRL_8821C + 2, (u8)usNavUpper);
  1792. }
  1793. break;
  1794. /*
  1795. case HW_VAR_RPT_TIMER_SETTING:
  1796. case HW_VAR_TX_RPT_MAX_MACID:
  1797. case HW_VAR_CHK_HI_QUEUE_EMPTY:
  1798. break;
  1799. */
  1800. /*
  1801. case HW_VAR_AMPDU_MAX_TIME:
  1802. case HW_VAR_WIRELESS_MODE:
  1803. case HW_VAR_USB_MODE:
  1804. break;
  1805. */
  1806. #ifdef CONFIG_AP_PORT_SWAP
  1807. case HW_VAR_PORT_SWITCH:
  1808. {
  1809. u8 mode = *((u8 *)val);
  1810. rtl8821c_ap_port_switch(adapter, mode);
  1811. }
  1812. break;
  1813. #endif
  1814. /*
  1815. case HW_VAR_SOUNDING_RATE:
  1816. case HW_VAR_SOUNDING_STATUS:
  1817. case HW_VAR_SOUNDING_FW_NDPA:
  1818. case HW_VAR_SOUNDING_CLK:
  1819. break;
  1820. */
  1821. #ifdef CONFIG_BEAMFORMING
  1822. case HW_VAR_SOUNDING_ENTER:
  1823. rtl8821c_phy_bf_enter(adapter, (struct sta_info*)val);
  1824. break;
  1825. case HW_VAR_SOUNDING_LEAVE:
  1826. rtl8821c_phy_bf_leave(adapter, val);
  1827. break;
  1828. case HW_VAR_SOUNDING_SET_GID_TABLE:
  1829. rtl8821c_phy_bf_set_gid_table(adapter, (struct beamformer_entry*)val);
  1830. break;
  1831. #endif
  1832. default:
  1833. ret = SetHwReg(adapter, variable, val);
  1834. break;
  1835. }
  1836. return ret;
  1837. }
  1838. struct qinfo {
  1839. u32 head:11;
  1840. u32 tail:11;
  1841. u32 empty:1;
  1842. u32 ac:2;
  1843. u32 macid:7;
  1844. };
  1845. struct bcn_qinfo {
  1846. u16 head:12;
  1847. u16 rsvd:4;
  1848. };
  1849. static void dump_qinfo(void *sel, struct qinfo *info, u32 pkt_num, const char *tag)
  1850. {
  1851. RTW_PRINT_SEL(sel, "%shead:0x%02x, tail:0x%02x, pkt_num:%u, macid:%u, ac:%u\n",
  1852. tag ? tag : "", info->head, info->tail, pkt_num, info->macid, info->ac);
  1853. }
  1854. static void dump_bcn_qinfo(void *sel, struct bcn_qinfo *info, u32 pkt_num, const char *tag)
  1855. {
  1856. RTW_PRINT_SEL(sel, "%shead:0x%02x, pkt_num:%u\n",
  1857. tag ? tag : "", info->head, pkt_num);
  1858. }
  1859. static void dump_mac_qinfo(void *sel, _adapter *adapter)
  1860. {
  1861. u32 q0_info;
  1862. u32 q1_info;
  1863. u32 q2_info;
  1864. u32 q3_info;
  1865. u32 q4_info;
  1866. u32 q5_info;
  1867. u32 q6_info;
  1868. u32 q7_info;
  1869. u32 mg_q_info;
  1870. u32 hi_q_info;
  1871. u16 bcn_q_info;
  1872. u32 q0_q1_info;
  1873. u32 q2_q3_info;
  1874. u32 q4_q5_info;
  1875. u32 q6_q7_info;
  1876. u32 mg_hi_q_info;
  1877. u32 cmd_bcn_q_info;
  1878. q0_info = rtw_read32(adapter, REG_Q0_INFO_8821C);
  1879. q1_info = rtw_read32(adapter, REG_Q1_INFO_8821C);
  1880. q2_info = rtw_read32(adapter, REG_Q2_INFO_8821C);
  1881. q3_info = rtw_read32(adapter, REG_Q3_INFO_8821C);
  1882. q4_info = rtw_read32(adapter, REG_Q4_INFO_8821C);
  1883. q5_info = rtw_read32(adapter, REG_Q5_INFO_8821C);
  1884. q6_info = rtw_read32(adapter, REG_Q6_INFO_8821C);
  1885. q7_info = rtw_read32(adapter, REG_Q7_INFO_8821C);
  1886. mg_q_info = rtw_read32(adapter, REG_MGQ_INFO_8821C);
  1887. hi_q_info = rtw_read32(adapter, REG_HIQ_INFO_8821C);
  1888. bcn_q_info = rtw_read16(adapter, REG_BCNQ_INFO_8821C);
  1889. q0_q1_info = rtw_read32(adapter, REG_Q0_Q1_INFO_8821C);
  1890. q2_q3_info = rtw_read32(adapter, REG_Q2_Q3_INFO_8821C);
  1891. q4_q5_info = rtw_read32(adapter, REG_Q4_Q5_INFO_8821C);
  1892. q6_q7_info = rtw_read32(adapter, REG_Q6_Q7_INFO_8821C);
  1893. mg_hi_q_info = rtw_read32(adapter, REG_MGQ_HIQ_INFO_8821C);
  1894. cmd_bcn_q_info = rtw_read32(adapter, REG_CMDQ_BCNQ_INFO_8821C);
  1895. dump_qinfo(sel, (struct qinfo *)&q0_info, q0_q1_info&0xFFF, "Q0 ");
  1896. dump_qinfo(sel, (struct qinfo *)&q1_info, (q0_q1_info>>15)&0xFFF, "Q1 ");
  1897. dump_qinfo(sel, (struct qinfo *)&q2_info, q2_q3_info&0xFFF, "Q2 ");
  1898. dump_qinfo(sel, (struct qinfo *)&q3_info, (q2_q3_info>>15)&0xFFF, "Q3 ");
  1899. dump_qinfo(sel, (struct qinfo *)&q4_info, q4_q5_info&0xFFF, "Q4 ");
  1900. dump_qinfo(sel, (struct qinfo *)&q5_info, (q4_q5_info>>15)&0xFFF, "Q5 ");
  1901. dump_qinfo(sel, (struct qinfo *)&q6_info, q6_q7_info&0xFFF, "Q6 ");
  1902. dump_qinfo(sel, (struct qinfo *)&q7_info, (q6_q7_info>>15)&0xFFF, "Q7 ");
  1903. dump_qinfo(sel, (struct qinfo *)&mg_q_info, mg_hi_q_info&0xFFF, "MG ");
  1904. dump_qinfo(sel, (struct qinfo *)&hi_q_info, (mg_hi_q_info>>15)&0xFFF, "HI ");
  1905. dump_bcn_qinfo(sel, (struct bcn_qinfo *)&bcn_q_info, cmd_bcn_q_info&0xFFF, "BCN ");
  1906. }
  1907. static void dump_mac_txfifo(void *sel, _adapter *adapter)
  1908. {
  1909. u32 hpq, lpq, npq, epq, pubq;
  1910. hpq = rtw_read32(adapter, REG_FIFOPAGE_INFO_1_8821C);
  1911. lpq = rtw_read32(adapter, REG_FIFOPAGE_INFO_2_8821C);
  1912. npq = rtw_read32(adapter, REG_FIFOPAGE_INFO_3_8821C);
  1913. epq = rtw_read32(adapter, REG_FIFOPAGE_INFO_4_8821C);
  1914. pubq = rtw_read32(adapter, REG_FIFOPAGE_INFO_5_8821C);
  1915. hpq = (hpq & 0xFFF0000)>>16;
  1916. lpq = (lpq & 0xFFF0000)>>16;
  1917. npq = (npq & 0xFFF0000)>>16;
  1918. epq = (epq & 0xFFF0000)>>16;
  1919. pubq = (pubq & 0xFFF0000)>>16;
  1920. RTW_PRINT_SEL(sel, "Tx: available page num: ");
  1921. if ((hpq == 0xAEA) && (hpq == lpq) && (hpq == pubq))
  1922. RTW_PRINT_SEL(sel, "N/A (reg val = 0xea)\n");
  1923. else
  1924. RTW_PRINT_SEL(sel, "HPQ: %d, LPQ: %d, NPQ: %d, EPQ: %d, PUBQ: %d\n"
  1925. , hpq, lpq, npq, epq, pubq);
  1926. }
  1927. static u8 hw_var_get_bcn_valid(PADAPTER adapter)
  1928. {
  1929. u8 val8 = 0;
  1930. u8 ret = _FALSE;
  1931. /* only port 0 can TX BCN */
  1932. val8 = rtw_read8(adapter, REG_FIFOPAGE_CTRL_2_8821C + 1);
  1933. ret = (BIT(7) & val8) ? _TRUE : _FALSE;
  1934. return ret;
  1935. }
  1936. void rtl8821c_read_wmmedca_reg(PADAPTER adapter, u16 *vo_params, u16 *vi_params, u16 *be_params, u16 *bk_params)
  1937. {
  1938. u8 vo_reg_params[4];
  1939. u8 vi_reg_params[4];
  1940. u8 be_reg_params[4];
  1941. u8 bk_reg_params[4];
  1942. rtl8821c_gethwreg(adapter, HW_VAR_AC_PARAM_VO, vo_reg_params);
  1943. rtl8821c_gethwreg(adapter, HW_VAR_AC_PARAM_VI, vi_reg_params);
  1944. rtl8821c_gethwreg(adapter, HW_VAR_AC_PARAM_BE, be_reg_params);
  1945. rtl8821c_gethwreg(adapter, HW_VAR_AC_PARAM_BK, bk_reg_params);
  1946. vo_params[0] = vo_reg_params[0];
  1947. vo_params[1] = vo_reg_params[1] & 0x0F;
  1948. vo_params[2] = (vo_reg_params[1] & 0xF0) >> 4;
  1949. vo_params[3] = ((vo_reg_params[3] << 8) | (vo_reg_params[2])) * 32;
  1950. vi_params[0] = vi_reg_params[0];
  1951. vi_params[1] = vi_reg_params[1] & 0x0F;
  1952. vi_params[2] = (vi_reg_params[1] & 0xF0) >> 4;
  1953. vi_params[3] = ((vi_reg_params[3] << 8) | (vi_reg_params[2])) * 32;
  1954. be_params[0] = be_reg_params[0];
  1955. be_params[1] = be_reg_params[1] & 0x0F;
  1956. be_params[2] = (be_reg_params[1] & 0xF0) >> 4;
  1957. be_params[3] = ((be_reg_params[3] << 8) | (be_reg_params[2])) * 32;
  1958. bk_params[0] = bk_reg_params[0];
  1959. bk_params[1] = bk_reg_params[1] & 0x0F;
  1960. bk_params[2] = (bk_reg_params[1] & 0xF0) >> 4;
  1961. bk_params[3] = ((bk_reg_params[3] << 8) | (bk_reg_params[2])) * 32;
  1962. vo_params[1] = (1 << vo_params[1]) - 1;
  1963. vo_params[2] = (1 << vo_params[2]) - 1;
  1964. vi_params[1] = (1 << vi_params[1]) - 1;
  1965. vi_params[2] = (1 << vi_params[2]) - 1;
  1966. be_params[1] = (1 << be_params[1]) - 1;
  1967. be_params[2] = (1 << be_params[2]) - 1;
  1968. bk_params[1] = (1 << bk_params[1]) - 1;
  1969. bk_params[2] = (1 << bk_params[2]) - 1;
  1970. }
  1971. void rtl8821c_gethwreg(PADAPTER adapter, u8 variable, u8 *val)
  1972. {
  1973. PHAL_DATA_TYPE hal;
  1974. u8 val8;
  1975. u16 val16;
  1976. u32 val32;
  1977. hal = GET_HAL_DATA(adapter);
  1978. switch (variable) {
  1979. /*
  1980. case HW_VAR_INIT_RTS_RATE:
  1981. case HW_VAR_BASIC_RATE:
  1982. break;
  1983. */
  1984. case HW_VAR_TXPAUSE:
  1985. *val = rtw_read8(adapter, REG_TXPAUSE_8821C);
  1986. break;
  1987. /*
  1988. case HW_VAR_BCN_FUNC:
  1989. case HW_VAR_MLME_DISCONNECT:
  1990. case HW_VAR_MLME_SITESURVEY:
  1991. case HW_VAR_MLME_JOIN:
  1992. case HW_VAR_BEACON_INTERVAL:
  1993. case HW_VAR_SLOT_TIME:
  1994. case HW_VAR_RESP_SIFS:
  1995. case HW_VAR_ACK_PREAMBLE:
  1996. case HW_VAR_SEC_CFG:
  1997. case HW_VAR_SEC_DK_CFG:
  1998. break;
  1999. */
  2000. case HW_VAR_BCN_VALID:
  2001. *val = hw_var_get_bcn_valid(adapter);
  2002. break;
  2003. /*
  2004. case HW_VAR_RF_TYPE:
  2005. case HW_VAR_CAM_EMPTY_ENTRY:
  2006. case HW_VAR_CAM_INVALID_ALL:
  2007. */
  2008. case HW_VAR_AC_PARAM_VO:
  2009. val32 = rtw_read32(adapter, REG_EDCA_VO_PARAM);
  2010. val[0] = val32 & 0xFF;
  2011. val[1] = (val32 >> 8) & 0xFF;
  2012. val[2] = (val32 >> 16) & 0xFF;
  2013. val[3] = (val32 >> 24) & 0x07;
  2014. break;
  2015. case HW_VAR_AC_PARAM_VI:
  2016. val32 = rtw_read32(adapter, REG_EDCA_VI_PARAM);
  2017. val[0] = val32 & 0xFF;
  2018. val[1] = (val32 >> 8) & 0xFF;
  2019. val[2] = (val32 >> 16) & 0xFF;
  2020. val[3] = (val32 >> 24) & 0x07;
  2021. break;
  2022. case HW_VAR_AC_PARAM_BE:
  2023. val32 = rtw_read32(adapter, REG_EDCA_BE_PARAM);
  2024. val[0] = val32 & 0xFF;
  2025. val[1] = (val32 >> 8) & 0xFF;
  2026. val[2] = (val32 >> 16) & 0xFF;
  2027. val[3] = (val32 >> 24) & 0x07;
  2028. break;
  2029. case HW_VAR_AC_PARAM_BK:
  2030. val32 = rtw_read32(adapter, REG_EDCA_BK_PARAM);
  2031. val[0] = val32 & 0xFF;
  2032. val[1] = (val32 >> 8) & 0xFF;
  2033. val[2] = (val32 >> 16) & 0xFF;
  2034. val[3] = (val32 >> 24) & 0x07;
  2035. break;
  2036. /*
  2037. case HW_VAR_ACM_CTRL:
  2038. case HW_VAR_AMPDU_MIN_SPACE:
  2039. case HW_VAR_AMPDU_FACTOR:
  2040. case HW_VAR_RXDMA_AGG_PG_TH:
  2041. case HW_VAR_H2C_FW_PWRMODE:
  2042. case HW_VAR_H2C_PS_TUNE_PARAM:
  2043. case HW_VAR_H2C_FW_JOINBSSRPT:
  2044. break;
  2045. */
  2046. /*
  2047. case HW_VAR_H2C_FW_P2P_PS_OFFLOAD:
  2048. case HW_VAR_TRIGGER_GPIO_0:
  2049. case HW_VAR_BT_SET_COEXIST:
  2050. case HW_VAR_BT_ISSUE_DELBA:
  2051. break;
  2052. */
  2053. /*
  2054. case HW_VAR_ANTENNA_DIVERSITY_SELECT:
  2055. case HW_VAR_SWITCH_EPHY_WoWLAN:
  2056. case HW_VAR_EFUSE_USAGE:
  2057. case HW_VAR_EFUSE_BYTES:
  2058. case HW_VAR_EFUSE_BT_USAGE:
  2059. case HW_VAR_EFUSE_BT_BYTES:
  2060. case HW_VAR_FIFO_CLEARN_UP:
  2061. case HW_VAR_RESTORE_HW_SEQ:
  2062. case HW_VAR_CHECK_TXBUF:
  2063. case HW_VAR_PCIE_STOP_TX_DMA:
  2064. break;
  2065. */
  2066. #if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN)
  2067. case HW_VAR_SYS_CLKR:
  2068. *val = rtw_read8(adapter, REG_SYS_CLK_CTRL_8821C);
  2069. break;
  2070. #endif
  2071. /*
  2072. case HW_VAR_NAV_UPPER:
  2073. case HW_VAR_RPT_TIMER_SETTING:
  2074. case HW_VAR_TX_RPT_MAX_MACID:
  2075. break;
  2076. */
  2077. case HW_VAR_CHK_HI_QUEUE_EMPTY:
  2078. val16 = rtw_read16(adapter, REG_TXPKT_EMPTY_8821C);
  2079. *val = (val16 & BIT_HQQ_EMPTY_8821C) ? _TRUE : _FALSE;
  2080. break;
  2081. case HW_VAR_CHK_MGQ_CPU_EMPTY:
  2082. val16 = rtw_read16(adapter, REG_TXPKT_EMPTY_8821C);
  2083. *val = (val16 & BIT_MGQ_CPU_EMPTY_8821C) ? _TRUE : _FALSE;
  2084. break;
  2085. /*
  2086. case HW_VAR_AMPDU_MAX_TIME:
  2087. case HW_VAR_WIRELESS_MODE:
  2088. case HW_VAR_USB_MODE:
  2089. case HW_VAR_DO_IQK:
  2090. case HW_VAR_SOUNDING_ENTER:
  2091. case HW_VAR_SOUNDING_LEAVE:
  2092. case HW_VAR_SOUNDING_RATE:
  2093. case HW_VAR_SOUNDING_STATUS:
  2094. case HW_VAR_SOUNDING_FW_NDPA:
  2095. case HW_VAR_SOUNDING_CLK:
  2096. break;
  2097. */
  2098. case HW_VAR_FW_PS_STATE:
  2099. /* driver read REG_SYS_CFG5 - BIT_LPS_STATUS REG_1070[3] to get hw ps state */
  2100. *((u16 *)val) = rtw_read8(adapter, REG_SYS_CFG5);
  2101. break;
  2102. case HW_VAR_DUMP_MAC_QUEUE_INFO:
  2103. dump_mac_qinfo(val, adapter);
  2104. break;
  2105. case HW_VAR_DUMP_MAC_TXFIFO:
  2106. dump_mac_txfifo(val, adapter);
  2107. break;
  2108. /*
  2109. case HW_VAR_ASIX_IOT:
  2110. case HW_VAR_H2C_BT_MP_OPER:
  2111. break;
  2112. */
  2113. case HW_VAR_BCN_CTRL_ADDR:
  2114. *((u32 *)val) = hw_bcn_ctrl_addr(adapter, adapter->hw_port);
  2115. break;
  2116. default:
  2117. GetHwReg(adapter, variable, val);
  2118. break;
  2119. }
  2120. }
  2121. /*
  2122. * Description:
  2123. * Change default setting of specified variable.
  2124. */
  2125. u8 rtl8821c_sethaldefvar(PADAPTER adapter, HAL_DEF_VARIABLE variable, void *pval)
  2126. {
  2127. PHAL_DATA_TYPE hal;
  2128. u8 bResult, val8;
  2129. hal = GET_HAL_DATA(adapter);
  2130. bResult = _SUCCESS;
  2131. switch (variable) {
  2132. /*
  2133. case HAL_DEF_UNDERCORATEDSMOOTHEDPWDB:
  2134. case HAL_DEF_IS_SUPPORT_ANT_DIV:
  2135. case HAL_DEF_DRVINFO_SZ:
  2136. case HAL_DEF_MAX_RECVBUF_SZ:
  2137. case HAL_DEF_RX_PACKET_OFFSET:
  2138. case HAL_DEF_RX_DMA_SZ_WOW:
  2139. case HAL_DEF_RX_DMA_SZ:
  2140. case HAL_DEF_RX_PAGE_SIZE:
  2141. case HAL_DEF_DBG_DUMP_RXPKT:
  2142. case HAL_DEF_RA_DECISION_RATE:
  2143. case HAL_DEF_RA_SGI:
  2144. case HAL_DEF_PT_PWR_STATUS:
  2145. case HW_VAR_MAX_RX_AMPDU_FACTOR:
  2146. case HAL_DEF_DBG_DUMP_TXPKT:
  2147. case HAL_DEF_TX_PAGE_BOUNDARY:
  2148. case HAL_DEF_TX_PAGE_BOUNDARY_WOWLAN:
  2149. case HAL_DEF_ANT_DETECT:
  2150. case HAL_DEF_PCI_SUUPORT_L1_BACKDOOR:
  2151. case HAL_DEF_PCI_AMD_L1_SUPPORT:
  2152. case HAL_DEF_PCI_ASPM_OSC:
  2153. case HAL_DEF_EFUSE_USAGE:
  2154. case HAL_DEF_EFUSE_BYTES:
  2155. case HW_VAR_BEST_AMPDU_DENSITY:
  2156. break;
  2157. */
  2158. case HW_VAR_FREECNT:
  2159. val8 = *((u8*)pval);
  2160. if (val8 == 0) {
  2161. /* disable free run counter set 0x577[3]=0 */
  2162. rtw_write8(adapter, REG_MISC_CTRL,
  2163. rtw_read8(adapter, REG_MISC_CTRL)&(~BIT_EN_FREECNT));
  2164. /* reset FREE_RUN_COUNTER set 0x553[5]=1 */
  2165. val8 = rtw_read8(adapter, REG_DUAL_TSF_RST);
  2166. val8 |= BIT_FREECNT_RST;
  2167. rtw_write8(adapter, REG_DUAL_TSF_RST, val8);
  2168. } else if (val8 == 1){
  2169. /* enable free run counter */
  2170. /* disable first set 0x577[3]=0 */
  2171. rtw_write8(adapter, REG_MISC_CTRL,
  2172. rtw_read8(adapter, REG_MISC_CTRL)&(~BIT_EN_FREECNT));
  2173. /* reset FREE_RUN_COUNTER set 0x553[5]=1 */
  2174. val8 = rtw_read8(adapter, REG_DUAL_TSF_RST);
  2175. val8 |= BIT_FREECNT_RST;
  2176. rtw_write8(adapter, REG_DUAL_TSF_RST, val8);
  2177. /* enable free run counter 0x577[3]=1 */
  2178. rtw_write8(adapter, REG_MISC_CTRL,
  2179. rtw_read8(adapter, REG_MISC_CTRL)|BIT_EN_FREECNT);
  2180. }
  2181. break;
  2182. default:
  2183. bResult = SetHalDefVar(adapter, variable, pval);
  2184. break;
  2185. }
  2186. return bResult;
  2187. }
  2188. void rtl8821c_ra_info_dump(_adapter *padapter, void *sel)
  2189. {
  2190. u8 mac_id;
  2191. struct sta_info *psta;
  2192. u32 rate_mask1, rate_mask2;
  2193. struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
  2194. struct macid_ctl_t *macid_ctl = dvobj_to_macidctl(dvobj);
  2195. for (mac_id = 0; mac_id < macid_ctl->num; mac_id++) {
  2196. if (rtw_macid_is_used(macid_ctl, mac_id) && !rtw_macid_is_bmc(macid_ctl, mac_id)) {
  2197. psta = macid_ctl->sta[mac_id];
  2198. if (!psta)
  2199. continue;
  2200. dump_sta_info(sel, psta);
  2201. rate_mask1 = macid_ctl->rate_bmp0[mac_id];
  2202. rate_mask2 = macid_ctl->rate_bmp1[mac_id];
  2203. _RTW_PRINT_SEL(sel, "rate_mask2:0x%08x, rate_mask1:0x%08x\n", rate_mask2, rate_mask1);
  2204. }
  2205. }
  2206. }
  2207. /*
  2208. * Description:
  2209. * Query setting of specified variable.
  2210. */
  2211. u8 rtl8821c_gethaldefvar(PADAPTER adapter, HAL_DEF_VARIABLE variable, void *pval)
  2212. {
  2213. PHAL_DATA_TYPE hal;
  2214. u8 bResult;
  2215. u8 val8 = 0;
  2216. u32 val32 = 0;
  2217. hal = GET_HAL_DATA(adapter);
  2218. bResult = _SUCCESS;
  2219. switch (variable) {
  2220. /*
  2221. case HAL_DEF_UNDERCORATEDSMOOTHEDPWDB:
  2222. break;
  2223. */
  2224. case HAL_DEF_IS_SUPPORT_ANT_DIV:
  2225. #ifdef CONFIG_ANTENNA_DIVERSITY
  2226. *(u8 *)pval = _TRUE;
  2227. #else
  2228. *(u8 *)pval = _FALSE;
  2229. #endif
  2230. break;
  2231. case HAL_DEF_MAX_RECVBUF_SZ:
  2232. *((u32 *)pval) = MAX_RECVBUF_SZ;
  2233. break;
  2234. case HAL_DEF_RX_PACKET_OFFSET:
  2235. rtw_halmac_get_rx_desc_size(adapter_to_dvobj(adapter), &val32);
  2236. rtw_halmac_get_rx_drv_info_sz(adapter_to_dvobj(adapter), &val8);
  2237. *((u32 *)pval) = val32 + val8;
  2238. break;
  2239. /*
  2240. case HAL_DEF_DRVINFO_SZ:
  2241. rtw_halmac_get_rx_drv_info_sz(adapter_to_dvobj(adapter), &val8);
  2242. *((u32 *)pval) = val8;
  2243. break;
  2244. case HAL_DEF_RX_DMA_SZ_WOW:
  2245. case HAL_DEF_RX_DMA_SZ:
  2246. case HAL_DEF_RX_PAGE_SIZE:
  2247. case HAL_DEF_DBG_DUMP_RXPKT:
  2248. case HAL_DEF_RA_DECISION_RATE:
  2249. case HAL_DEF_RA_SGI:
  2250. break;
  2251. */
  2252. /* only for 8188E */
  2253. case HAL_DEF_PT_PWR_STATUS:
  2254. break;
  2255. case HAL_DEF_TX_LDPC:
  2256. *(u8 *)pval = ((hal->phy_spec.ldpc_cap >> 8) & 0xFF) ? _TRUE : _FALSE;
  2257. break;
  2258. case HAL_DEF_RX_LDPC:
  2259. *(u8 *)pval = (hal->phy_spec.ldpc_cap & 0xFF) ? _TRUE : _FALSE;
  2260. break;
  2261. case HAL_DEF_TX_STBC:
  2262. *(u8 *)pval = ((hal->phy_spec.stbc_cap >> 8) & 0xFF) ? _TRUE : _FALSE;
  2263. break;
  2264. /* support 1RX for STBC */
  2265. case HAL_DEF_RX_STBC:
  2266. *(u8 *)pval = hal->phy_spec.stbc_cap & 0xFF;
  2267. break;
  2268. /* support Explicit TxBF for HT/VHT */
  2269. case HAL_DEF_EXPLICIT_BEAMFORMER:
  2270. #ifdef CONFIG_BEAMFORMING
  2271. *(u8 *)pval = ((hal->phy_spec.txbf_cap >> 20)& 0xF) ? _TRUE : _FALSE;
  2272. #else
  2273. *(u8 *)pval = _FALSE;
  2274. #endif
  2275. break;
  2276. case HAL_DEF_EXPLICIT_BEAMFORMEE:
  2277. #ifdef CONFIG_BEAMFORMING
  2278. *(u8 *)pval = ((hal->phy_spec.txbf_cap >> 16) & 0xF) ? _TRUE : _FALSE;
  2279. #else
  2280. *(u8 *)pval = _FALSE;
  2281. #endif
  2282. break;
  2283. case HAL_DEF_VHT_MU_BEAMFORMER:
  2284. #ifdef CONFIG_BEAMFORMING
  2285. *(u8 *)pval = ((hal->phy_spec.txbf_cap >> 28)& 0xF) ? _TRUE : _FALSE;
  2286. #else
  2287. *(u8 *)pval = _FALSE;
  2288. #endif
  2289. break;
  2290. case HAL_DEF_VHT_MU_BEAMFORMEE:
  2291. #ifdef CONFIG_BEAMFORMING
  2292. *(u8 *)pval = ((hal->phy_spec.txbf_cap >> 24)& 0xF) ? _TRUE : _FALSE;
  2293. #else
  2294. *(u8 *)pval = _FALSE;
  2295. #endif
  2296. break;
  2297. case HAL_DEF_BEAMFORMER_CAP:
  2298. *(u8 *)pval = (hal->phy_spec.txbf_param >> 24)& 0xFF ;
  2299. break;
  2300. case HAL_DEF_BEAMFORMEE_CAP:
  2301. *(u8 *)pval = (hal->phy_spec.txbf_param >> 16) & 0xFF ;
  2302. break;
  2303. case HW_DEF_RA_INFO_DUMP:
  2304. rtl8821c_ra_info_dump(adapter, pval);
  2305. break;
  2306. /*
  2307. case HAL_DEF_DBG_DUMP_TXPKT:
  2308. case HAL_DEF_TX_PAGE_SIZE:
  2309. break;
  2310. */
  2311. case HAL_DEF_TX_PAGE_BOUNDARY:
  2312. rtw_halmac_get_rsvd_drv_pg_bndy(adapter_to_dvobj(adapter), (u16 *)pval);
  2313. break;
  2314. /* case HAL_DEF_TX_PAGE_BOUNDARY_WOWLAN:
  2315. case HAL_DEF_ANT_DETECT:
  2316. case HAL_DEF_PCI_SUUPORT_L1_BACKDOOR:
  2317. case HAL_DEF_PCI_AMD_L1_SUPPORT:
  2318. case HAL_DEF_PCI_ASPM_OSC:
  2319. case HAL_DEF_EFUSE_USAGE:
  2320. case HAL_DEF_EFUSE_BYTES:
  2321. break;
  2322. */
  2323. case HW_VAR_BEST_AMPDU_DENSITY:
  2324. *((u32 *)pval) = AMPDU_DENSITY_VALUE_4;
  2325. break;
  2326. default:
  2327. bResult = GetHalDefVar(adapter, variable, pval);
  2328. break;
  2329. }
  2330. return bResult;
  2331. }
  2332. /* xmit section */
  2333. void rtl8821c_init_xmit_priv(_adapter *adapter)
  2334. {
  2335. struct xmit_priv *pxmitpriv = &adapter->xmitpriv;
  2336. pxmitpriv->hw_ssn_seq_no = rtw_get_hwseq_no(adapter);
  2337. pxmitpriv->nqos_ssn = 0;
  2338. }
  2339. #if defined(CONFIG_CONCURRENT_MODE)
  2340. void fill_txdesc_force_bmc_camid(struct pkt_attrib *pattrib, u8 *ptxdesc)
  2341. {
  2342. if ((pattrib->encrypt > 0) && (!pattrib->bswenc)
  2343. && (pattrib->bmc_camid != INVALID_SEC_MAC_CAM_ID)) {
  2344. SET_TX_DESC_EN_DESC_ID_8821C(ptxdesc, 1);
  2345. SET_TX_DESC_MACID_8821C(ptxdesc, pattrib->bmc_camid);
  2346. }
  2347. }
  2348. #endif
  2349. void fill_txdesc_bmc_tx_rate(struct pkt_attrib *pattrib, u8 *ptxdesc)
  2350. {
  2351. SET_TX_DESC_USE_RATE_8821C(ptxdesc, 1);
  2352. SET_TX_DESC_DATARATE_8821C(ptxdesc, MRateToHwRate(pattrib->rate));
  2353. SET_TX_DESC_DISDATAFB_8821C(ptxdesc, 1);
  2354. }
  2355. void rtl8821c_fill_txdesc_sectype(struct pkt_attrib *pattrib, u8 *ptxdesc)
  2356. {
  2357. if ((pattrib->encrypt > 0) && !pattrib->bswenc) {
  2358. /* SEC_TYPE : 0:NO_ENC,1:WEP40/TKIP,2:WAPI,3:AES */
  2359. switch (pattrib->encrypt) {
  2360. case _WEP40_:
  2361. case _WEP104_:
  2362. case _TKIP_:
  2363. case _TKIP_WTMIC_:
  2364. SET_TX_DESC_SEC_TYPE_8821C(ptxdesc, 0x1);
  2365. break;
  2366. #ifdef CONFIG_WAPI_SUPPORT
  2367. case _SMS4_:
  2368. SET_TX_DESC_SEC_TYPE_8821C(ptxdesc, 0x2);
  2369. break;
  2370. #endif
  2371. case _AES_:
  2372. SET_TX_DESC_SEC_TYPE_8821C(ptxdesc, 0x3);
  2373. break;
  2374. case _NO_PRIVACY_:
  2375. default:
  2376. SET_TX_DESC_SEC_TYPE_8821C(ptxdesc, 0x0);
  2377. break;
  2378. }
  2379. }
  2380. }
  2381. void rtl8821c_fill_txdesc_vcs(PADAPTER adapter, struct pkt_attrib *pattrib, u8 *ptxdesc)
  2382. {
  2383. struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv;
  2384. struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  2385. if (pattrib->vcs_mode) {
  2386. switch (pattrib->vcs_mode) {
  2387. case RTS_CTS:
  2388. SET_TX_DESC_RTSEN_8821C(ptxdesc, 1);
  2389. break;
  2390. case CTS_TO_SELF:
  2391. SET_TX_DESC_CTS2SELF_8821C(ptxdesc, 1);
  2392. break;
  2393. case NONE_VCS:
  2394. default:
  2395. break;
  2396. }
  2397. if (pmlmeinfo->preamble_mode == PREAMBLE_SHORT)
  2398. SET_TX_DESC_RTS_SHORT_8821C(ptxdesc, 1);
  2399. SET_TX_DESC_RTSRATE_8821C(ptxdesc, 0x8);/* RTS Rate=24M */
  2400. SET_TX_DESC_RTS_RTY_LOWEST_RATE_8821C(ptxdesc, 0xf);
  2401. }
  2402. }
  2403. u8 rtl8821c_bw_mapping(PADAPTER adapter, struct pkt_attrib *pattrib)
  2404. {
  2405. u8 BWSettingOfDesc = 0;
  2406. PHAL_DATA_TYPE hal = GET_HAL_DATA(adapter);
  2407. if (hal->current_channel_bw == CHANNEL_WIDTH_80) {
  2408. if (pattrib->bwmode == CHANNEL_WIDTH_80)
  2409. BWSettingOfDesc = 2;
  2410. else if (pattrib->bwmode == CHANNEL_WIDTH_40)
  2411. BWSettingOfDesc = 1;
  2412. else
  2413. BWSettingOfDesc = 0;
  2414. } else if (hal->current_channel_bw == CHANNEL_WIDTH_40) {
  2415. if ((pattrib->bwmode == CHANNEL_WIDTH_40) || (pattrib->bwmode == CHANNEL_WIDTH_80))
  2416. BWSettingOfDesc = 1;
  2417. else
  2418. BWSettingOfDesc = 0;
  2419. } else
  2420. BWSettingOfDesc = 0;
  2421. return BWSettingOfDesc;
  2422. }
  2423. u8 rtl8821c_sc_mapping(PADAPTER adapter, struct pkt_attrib *pattrib)
  2424. {
  2425. u8 SCSettingOfDesc = 0;
  2426. PHAL_DATA_TYPE hal = GET_HAL_DATA(adapter);
  2427. if (hal->current_channel_bw == CHANNEL_WIDTH_80) {
  2428. if (pattrib->bwmode == CHANNEL_WIDTH_80)
  2429. SCSettingOfDesc = VHT_DATA_SC_DONOT_CARE;
  2430. else if (pattrib->bwmode == CHANNEL_WIDTH_40) {
  2431. if (hal->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER)
  2432. SCSettingOfDesc = VHT_DATA_SC_40_LOWER_OF_80MHZ;
  2433. else if (hal->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER)
  2434. SCSettingOfDesc = VHT_DATA_SC_40_UPPER_OF_80MHZ;
  2435. else
  2436. RTW_INFO("SCMapping: DONOT CARE Mode Setting\n");
  2437. } else {
  2438. if ((hal->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER) && (hal->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER))
  2439. SCSettingOfDesc = VHT_DATA_SC_20_LOWEST_OF_80MHZ;
  2440. else if ((hal->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER) && (hal->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER))
  2441. SCSettingOfDesc = VHT_DATA_SC_20_LOWER_OF_80MHZ;
  2442. else if ((hal->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER) && (hal->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER))
  2443. SCSettingOfDesc = VHT_DATA_SC_20_UPPER_OF_80MHZ;
  2444. else if ((hal->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER) && (hal->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER))
  2445. SCSettingOfDesc = VHT_DATA_SC_20_UPPERST_OF_80MHZ;
  2446. else
  2447. RTW_INFO("SCMapping: DONOT CARE Mode Setting\n");
  2448. }
  2449. } else if (hal->current_channel_bw == CHANNEL_WIDTH_40) {
  2450. if (pattrib->bwmode == CHANNEL_WIDTH_40)
  2451. SCSettingOfDesc = VHT_DATA_SC_DONOT_CARE;
  2452. else if (pattrib->bwmode == CHANNEL_WIDTH_20) {
  2453. if (hal->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER)
  2454. SCSettingOfDesc = VHT_DATA_SC_20_UPPER_OF_80MHZ;
  2455. else if (hal->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER)
  2456. SCSettingOfDesc = VHT_DATA_SC_20_LOWER_OF_80MHZ;
  2457. else
  2458. SCSettingOfDesc = VHT_DATA_SC_DONOT_CARE;
  2459. }
  2460. } else
  2461. SCSettingOfDesc = VHT_DATA_SC_DONOT_CARE;
  2462. return SCSettingOfDesc;
  2463. }
  2464. void rtl8821c_fill_txdesc_phy(PADAPTER adapter, struct pkt_attrib *pattrib, u8 *ptxdesc)
  2465. {
  2466. if (pattrib->ht_en) {
  2467. /* Set Bandwidth and sub-channel settings. */
  2468. SET_TX_DESC_DATA_BW_8821C(ptxdesc, rtl8821c_bw_mapping(adapter, pattrib));
  2469. SET_TX_DESC_DATA_SC_8821C(ptxdesc, rtl8821c_sc_mapping(adapter, pattrib));
  2470. }
  2471. }
  2472. void rtl8821c_cal_txdesc_chksum(PADAPTER adapter, u8 *ptxdesc)
  2473. {
  2474. struct halmac_adapter *halmac;
  2475. struct halmac_api *api;
  2476. halmac = adapter_to_halmac(adapter);
  2477. api = HALMAC_GET_API(halmac);
  2478. api->halmac_fill_txdesc_checksum(halmac, ptxdesc);
  2479. }
  2480. #ifdef CONFIG_MP_INCLUDED
  2481. void rtl8821c_prepare_mp_txdesc(PADAPTER adapter, struct mp_priv *pmp_priv)
  2482. {
  2483. u32 desc_size = 0;
  2484. u8 *desc;
  2485. struct pkt_attrib *attrib;
  2486. u32 pkt_size;
  2487. s32 bmcast;
  2488. u8 data_rate, pwr_status, offset;
  2489. rtw_halmac_get_tx_desc_size(adapter_to_dvobj(adapter), &desc_size);
  2490. desc = pmp_priv->tx.desc;
  2491. attrib = &pmp_priv->tx.attrib;
  2492. pkt_size = attrib->last_txcmdsz;
  2493. bmcast = IS_MCAST(attrib->ra);
  2494. SET_TX_DESC_LS_8821C(desc, 1);
  2495. SET_TX_DESC_TXPKTSIZE_8821C(desc, pkt_size);
  2496. offset = desc_size;
  2497. SET_TX_DESC_OFFSET_8821C(desc, offset);
  2498. #if defined(CONFIG_PCI_HCI) || defined(CONFIG_SDIO_HCI)
  2499. SET_TX_DESC_PKT_OFFSET_8821C(desc, 0); /* Don't need to set PACKET Offset bit,it's no use 512bytes of length */
  2500. #else
  2501. SET_TX_DESC_PKT_OFFSET_8821C(desc, 1);
  2502. #endif
  2503. if (bmcast)
  2504. SET_TX_DESC_BMC_8821C(desc, 1);
  2505. SET_TX_DESC_MACID_8821C(desc, attrib->mac_id);
  2506. SET_TX_DESC_RATE_ID_8821C(desc, attrib->raid);
  2507. SET_TX_DESC_QSEL_8821C(desc, attrib->qsel);
  2508. if (pmp_priv->preamble)
  2509. SET_TX_DESC_DATA_SHORT_8821C(desc, 1);
  2510. if (!attrib->qos_en)
  2511. SET_TX_DESC_EN_HWSEQ_8821C(desc, 1);
  2512. else
  2513. SET_TX_DESC_SW_SEQ_8821C(desc, attrib->seqnum);
  2514. if (pmp_priv->bandwidth <= CHANNEL_WIDTH_160)
  2515. SET_TX_DESC_DATA_BW_8821C(desc, pmp_priv->bandwidth);
  2516. else {
  2517. RTW_INFO("%s: <ERROR> unknown bandwidth %d, use 20M\n",
  2518. __FUNCTION__, pmp_priv->bandwidth);
  2519. SET_TX_DESC_DATA_BW_8821C(desc, CHANNEL_WIDTH_20);
  2520. }
  2521. SET_TX_DESC_DISDATAFB_8821C(desc, 1);
  2522. SET_TX_DESC_USE_RATE_8821C(desc, 1);
  2523. SET_TX_DESC_DATARATE_8821C(desc, pmp_priv->rateidx);
  2524. }
  2525. #endif /* CONFIG_MP_INCLUDED */
  2526. #define OFFSET_SZ 0
  2527. static void fill_default_txdesc(struct xmit_frame *pxmitframe, u8 *pbuf)
  2528. {
  2529. PADAPTER adapter = pxmitframe->padapter;
  2530. HAL_DATA_TYPE *phal_data = GET_HAL_DATA(adapter);
  2531. struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv;
  2532. struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  2533. struct pkt_attrib *pattrib = &pxmitframe->attrib;
  2534. s32 bmcst = IS_MCAST(pattrib->ra);
  2535. u32 desc_size = 0;
  2536. u8 offset, pkt_offset = 0;
  2537. #define RA_SW_DEFINE_CONT 0x01
  2538. u8 drv_fixed_reate = _FALSE;
  2539. u8 hw_port = rtw_hal_get_port(adapter);
  2540. #if 0
  2541. #ifndef CONFIG_USE_USB_BUFFER_ALLOC_TX
  2542. if (adapter->registrypriv.mp_mode == 0) {
  2543. if ((PACKET_OFFSET_SZ != 0) && (!bagg_pkt) &&
  2544. (rtw_usb_bulk_size_boundary(adapter, TXDESC_SIZE + pattrib->last_txcmdsz) == _FALSE)) {
  2545. ptxdesc = (pmem + PACKET_OFFSET_SZ);
  2546. /* RTW_INFO("==> non-agg-pkt,shift pointer...\n"); */
  2547. pull = 1;
  2548. }
  2549. }
  2550. #endif /* CONFIG_USE_USB_BUFFER_ALLOC_TX*/
  2551. #endif
  2552. rtw_halmac_get_tx_desc_size(adapter_to_dvobj(adapter), &desc_size);
  2553. _rtw_memset(pbuf, 0, desc_size);
  2554. /*SET_TX_DESC_LS_8821C(pbuf, 1);*/ /*for USB only*/
  2555. SET_TX_DESC_TXPKTSIZE_8821C(pbuf, pattrib->last_txcmdsz);
  2556. offset = desc_size + OFFSET_SZ;
  2557. #ifdef CONFIG_TX_EARLY_MODE
  2558. if (pxmitframe->frame_tag == DATA_FRAMETAG)
  2559. if (bagg_pkt)
  2560. offset += EARLY_MODE_INFO_SIZE ;/*0x28 */
  2561. pkt_offset = pxmitframe->pkt_offset = 0x01;
  2562. #endif
  2563. SET_TX_DESC_OFFSET_8821C(pbuf, offset);
  2564. if (bmcst)
  2565. SET_TX_DESC_BMC_8821C(pbuf, 1);
  2566. #if 0
  2567. #ifndef CONFIG_USE_USB_BUFFER_ALLOC_TX
  2568. if (adapter->registrypriv.mp_mode == 0) {
  2569. if ((PACKET_OFFSET_SZ != 0) && (!bagg_pkt)) {
  2570. if ((pull) && (pxmitframe->pkt_offset > 0)) {
  2571. pxmitframe->pkt_offset = pxmitframe->pkt_offset - 1;
  2572. pkt_offset = pxmitframe->pkt_offset;
  2573. }
  2574. }
  2575. }
  2576. /*RTW_INFO("%s, pkt_offset=0x%02x\n", __func__, pxmitframe->pkt_offset);*/
  2577. #endif
  2578. #endif
  2579. /* pkt_offset, unit:8 bytes padding*/
  2580. if (pkt_offset > 0)
  2581. SET_TX_DESC_PKT_OFFSET_8821C(pbuf, pkt_offset);
  2582. SET_TX_DESC_MACID_8821C(pbuf, pattrib->mac_id);
  2583. SET_TX_DESC_RATE_ID_8821C(pbuf, pattrib->raid);
  2584. SET_TX_DESC_QSEL_8821C(pbuf, pattrib->qsel);
  2585. /* 2009.11.05. tynli_test. Suggested by SD4 Filen for FW LPS.
  2586. * (1) The sequence number of each non-Qos frame / broadcast / multicast /
  2587. * mgnt frame should be controled by Hw because Fw will also send null data
  2588. * which we cannot control when Fw LPS enable.
  2589. * --> default enable non-Qos data sequense number. 2010.06.23. by tynli.
  2590. * (2) Enable HW SEQ control for beacon packet, because we use Hw beacon.
  2591. * (3) Use HW Qos SEQ to control the seq num of Ext port non-Qos packets.
  2592. */
  2593. /* HW sequence, to fix to use 0 queue. todo: 4AC packets to use auto queue select */
  2594. if (!pattrib->qos_en) {
  2595. SET_TX_DESC_DISQSELSEQ_8821C(pbuf, 1);
  2596. SET_TX_DESC_EN_HWSEQ_8821C(pbuf, 1);
  2597. SET_TX_DESC_HW_SSN_SEL_8821C(pbuf, pattrib->hw_ssn_sel);
  2598. SET_TX_DESC_EN_HWEXSEQ_8821C(pbuf, 0);
  2599. } else
  2600. SET_TX_DESC_SW_SEQ_8821C(pbuf, pattrib->seqnum);
  2601. if (pxmitframe->frame_tag == DATA_FRAMETAG) {
  2602. rtl8821c_fill_txdesc_sectype(pattrib, pbuf);
  2603. #if defined(CONFIG_CONCURRENT_MODE)
  2604. if (bmcst)
  2605. fill_txdesc_force_bmc_camid(pattrib, pbuf);
  2606. #endif
  2607. #if defined(CONFIG_USB_TX_AGGREGATION) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
  2608. if (pxmitframe->agg_num > 1) {
  2609. /*RTW_INFO("%s agg_num:%d\n",__func__,pxmitframe->agg_num );*/
  2610. SET_TX_DESC_DMA_TXAGG_NUM_8821C(pbuf, pxmitframe->agg_num);
  2611. }
  2612. #endif /*CONFIG_USB_TX_AGGREGATION*/
  2613. rtl8821c_fill_txdesc_vcs(adapter, pattrib, pbuf);
  2614. #ifdef CONFIG_SUPPORT_DYNAMIC_TXPWR
  2615. rtw_phydm_set_dyntxpwr(adapter, pbuf, pattrib->mac_id);
  2616. #endif
  2617. if ((pattrib->ether_type != 0x888e) &&
  2618. (pattrib->ether_type != 0x0806) &&
  2619. (pattrib->ether_type != 0x88B4) &&
  2620. (pattrib->dhcp_pkt != 1)
  2621. #ifdef CONFIG_AUTO_AP_MODE
  2622. && (pattrib->pctrl != _TRUE)
  2623. #endif
  2624. ) {
  2625. /* Non EAP & ARP & DHCP type data packet */
  2626. if (pattrib->ampdu_en == _TRUE) {
  2627. SET_TX_DESC_AGG_EN_8821C(pbuf, 1);
  2628. SET_TX_DESC_MAX_AGG_NUM_8821C(pbuf, 0x1F);
  2629. SET_TX_DESC_AMPDU_DENSITY_8821C(pbuf, pattrib->ampdu_spacing);
  2630. } else
  2631. SET_TX_DESC_BK_8821C(pbuf, 1);
  2632. if (adapter->fix_bw != 0xFF)
  2633. pattrib->bwmode = adapter->fix_bw;
  2634. rtl8821c_fill_txdesc_phy(adapter, pattrib, pbuf);
  2635. if (phal_data->current_band_type == BAND_ON_5G)/*Data Rate Fallback Limit rate*/
  2636. SET_TX_DESC_DATA_RTY_LOWEST_RATE_8821C(pbuf, 4);
  2637. else
  2638. SET_TX_DESC_DATA_RTY_LOWEST_RATE_8821C(pbuf, 0);
  2639. if (bmcst) {
  2640. drv_fixed_reate = _TRUE;
  2641. fill_txdesc_bmc_tx_rate(pattrib, pbuf);
  2642. }
  2643. /* modify data rate by iwpriv*/
  2644. if (adapter->fix_rate != 0xFF) {
  2645. drv_fixed_reate = _TRUE;
  2646. SET_TX_DESC_USE_RATE_8821C(pbuf, 1);
  2647. if (adapter->fix_rate & BIT(7))
  2648. SET_TX_DESC_DATA_SHORT_8821C(pbuf, 1);
  2649. SET_TX_DESC_DATARATE_8821C(pbuf, adapter->fix_rate & 0x7F);
  2650. if (!adapter->data_fb)
  2651. SET_TX_DESC_DISDATAFB_8821C(pbuf, 1);
  2652. }
  2653. if (pattrib->ldpc)
  2654. SET_TX_DESC_DATA_LDPC_8821C(pbuf, 1);
  2655. if (pattrib->stbc)
  2656. SET_TX_DESC_DATA_STBC_8821C(pbuf, 1);
  2657. #ifdef CONFIG_CMCC_TEST
  2658. SET_TX_DESC_DATA_SHORT_8821C(pbuf, 1); /* use cck short premble */
  2659. #endif
  2660. #ifdef CONFIG_WMMPS_STA
  2661. if (pattrib->trigger_frame)
  2662. SET_TX_DESC_TRI_FRAME_8821C (pbuf, 1);
  2663. #endif /* CONFIG_WMMPS_STA */
  2664. } else {
  2665. /*
  2666. * EAP data packet and ARP packet.
  2667. * Use the 1M data rate to send the EAP/ARP packet.
  2668. * This will maybe make the handshake smooth.
  2669. */
  2670. SET_TX_DESC_BK_8821C(pbuf, 1);
  2671. drv_fixed_reate = _TRUE;
  2672. SET_TX_DESC_USE_RATE_8821C(pbuf, 1);
  2673. /* HW will ignore this setting if the transmission rate is legacy OFDM.*/
  2674. if (pmlmeinfo->preamble_mode == PREAMBLE_SHORT)
  2675. SET_TX_DESC_DATA_SHORT_8821C(pbuf, 1);
  2676. SET_TX_DESC_DATARATE_8821C(pbuf, MRateToHwRate(pmlmeext->tx_rate));
  2677. RTW_INFO(FUNC_ADPT_FMT ": SP Packet(0x%04X) rate=0x%x\n",
  2678. FUNC_ADPT_ARG(adapter), pattrib->ether_type, MRateToHwRate(pmlmeext->tx_rate));
  2679. }
  2680. #ifdef CONFIG_TDLS
  2681. #ifdef CONFIG_XMIT_ACK
  2682. /* CCX-TXRPT ack for xmit mgmt frames. */
  2683. if (pxmitframe->ack_report) {
  2684. #ifdef DBG_CCX
  2685. RTW_INFO("%s set spe_rpt\n", __func__);
  2686. #endif
  2687. SET_TX_DESC_SPE_RPT_8821C(pbuf, 1);
  2688. }
  2689. #endif /* CONFIG_XMIT_ACK */
  2690. #endif
  2691. } else if (pxmitframe->frame_tag == MGNT_FRAMETAG) {
  2692. SET_TX_DESC_MBSSID_8821C(pbuf, pattrib->mbssid & 0xF);
  2693. SET_TX_DESC_USE_RATE_8821C(pbuf, 1);
  2694. drv_fixed_reate = _TRUE;
  2695. SET_TX_DESC_DATARATE_8821C(pbuf, MRateToHwRate(pattrib->rate));
  2696. /* VHT NDPA or HT NDPA Packet for Beamformer.*/
  2697. #ifdef CONFIG_BEAMFORMING
  2698. if ((pattrib->subtype == WIFI_NDPA) ||
  2699. ((pattrib->subtype == WIFI_ACTION_NOACK) && (pattrib->order == 1))) {
  2700. SET_TX_DESC_NAVUSEHDR_8821C(pbuf, 1);
  2701. SET_TX_DESC_DATA_BW_8821C(pbuf, rtl8821c_bw_mapping(adapter, pattrib));
  2702. /*SET_TX_DESC_DATA_SC_8821C(pbuf, rtl8821c_sc_mapping(adapter, pattrib));*/
  2703. SET_TX_DESC_SIGNALING_TA_PKT_SC_8821C(pbuf, rtl8821c_sc_mapping(adapter,pattrib));
  2704. SET_TX_DESC_RTY_LMT_EN_8821C(pbuf, 1);
  2705. SET_TX_DESC_RTS_DATA_RTY_LMT_8821C(pbuf, 5);
  2706. SET_TX_DESC_DISDATAFB_8821C(pbuf, 1);
  2707. /*if(pattrib->rts_cca)
  2708. SET_TX_DESC_NDPA_8821C(ptxdesc, 2);
  2709. else*/
  2710. SET_TX_DESC_NDPA_8821C(pbuf, 1);
  2711. } else
  2712. #endif
  2713. {
  2714. SET_TX_DESC_RTY_LMT_EN_8821C(pbuf, 1);
  2715. if (pattrib->retry_ctrl == _TRUE)
  2716. SET_TX_DESC_RTS_DATA_RTY_LMT_8821C(pbuf, 6);
  2717. else
  2718. SET_TX_DESC_RTS_DATA_RTY_LMT_8821C(pbuf, 12);
  2719. }
  2720. #ifdef CONFIG_XMIT_ACK
  2721. /* CCX-TXRPT ack for xmit mgmt frames. */
  2722. if (pxmitframe->ack_report) {
  2723. #ifdef DBG_CCX
  2724. RTW_INFO("%s set spe_rpt\n", __func__);
  2725. #endif
  2726. SET_TX_DESC_SPE_RPT_8821C(pbuf, 1);
  2727. }
  2728. #endif /* CONFIG_XMIT_ACK */
  2729. } else if (pxmitframe->frame_tag == TXAGG_FRAMETAG)
  2730. RTW_INFO("%s: TXAGG_FRAMETAG\n", __func__);
  2731. #ifdef CONFIG_MP_INCLUDED
  2732. else if (pxmitframe->frame_tag == MP_FRAMETAG) {
  2733. RTW_INFO("%s: MP_FRAMETAG\n", __func__);
  2734. fill_txdesc_for_mp(adapter, pbuf);
  2735. }
  2736. #endif
  2737. else {
  2738. RTW_INFO("%s: frame_tag=0x%x\n", __func__, pxmitframe->frame_tag);
  2739. SET_TX_DESC_USE_RATE_8821C(pbuf, 1);
  2740. drv_fixed_reate = _TRUE;
  2741. SET_TX_DESC_DATARATE_8821C(pbuf, MRateToHwRate(pmlmeext->tx_rate));
  2742. }
  2743. if (drv_fixed_reate == _TRUE)
  2744. SET_TX_DESC_SW_DEFINE_8821C(pbuf, RA_SW_DEFINE_CONT);
  2745. if (adapter->power_offset != 0)
  2746. SET_TX_DESC_TXPWR_OFSET_8821C(pbuf, adapter->power_offset);
  2747. #ifdef CONFIG_ANTENNA_DIVERSITY
  2748. if (!bmcst && pattrib->psta)
  2749. odm_set_tx_ant_by_tx_info(adapter_to_phydm(adapter), pbuf, pattrib->psta->cmn.mac_id);
  2750. #endif
  2751. #ifdef CONFIG_BEAMFORMING
  2752. SET_TX_DESC_G_ID_8821C(pbuf, pattrib->txbf_g_id);
  2753. SET_TX_DESC_P_AID_8821C(pbuf, pattrib->txbf_p_aid);
  2754. #endif
  2755. SET_TX_DESC_PORT_ID_8821C(pbuf, hw_port);
  2756. SET_TX_DESC_MULTIPLE_PORT_8821C(pbuf, hw_port);
  2757. }
  2758. void rtl8821c_dbg_dump_tx_desc(PADAPTER adapter, int frame_tag, u8 *ptxdesc)
  2759. {
  2760. u8 bDumpTxPkt;
  2761. u8 bDumpTxDesc = _FALSE;
  2762. rtw_hal_get_def_var(adapter, HAL_DEF_DBG_DUMP_TXPKT, &bDumpTxPkt);
  2763. /* 1 for data frame, 2 for mgnt frame */
  2764. if (bDumpTxPkt == 1) {
  2765. RTW_INFO("dump tx_desc for data frame\n");
  2766. if ((frame_tag & 0x0f) == DATA_FRAMETAG)
  2767. bDumpTxDesc = _TRUE;
  2768. } else if (bDumpTxPkt == 2) {
  2769. RTW_INFO("dump tx_desc for mgnt frame\n");
  2770. if ((frame_tag & 0x0f) == MGNT_FRAMETAG)
  2771. bDumpTxDesc = _TRUE;
  2772. }
  2773. /* 8821C TX SIZE = 48(HALMAC_TX_DESC_SIZE_8821C) */
  2774. if (_TRUE == bDumpTxDesc) {
  2775. RTW_INFO("=====================================\n");
  2776. RTW_INFO("Offset00(0x%08x)\n", *((u32 *)(ptxdesc)));
  2777. RTW_INFO("Offset04(0x%08x)\n", *((u32 *)(ptxdesc + 4)));
  2778. RTW_INFO("Offset08(0x%08x)\n", *((u32 *)(ptxdesc + 8)));
  2779. RTW_INFO("Offset12(0x%08x)\n", *((u32 *)(ptxdesc + 12)));
  2780. RTW_INFO("Offset16(0x%08x)\n", *((u32 *)(ptxdesc + 16)));
  2781. RTW_INFO("Offset20(0x%08x)\n", *((u32 *)(ptxdesc + 20)));
  2782. RTW_INFO("Offset24(0x%08x)\n", *((u32 *)(ptxdesc + 24)));
  2783. RTW_INFO("Offset28(0x%08x)\n", *((u32 *)(ptxdesc + 28)));
  2784. RTW_INFO("Offset32(0x%08x)\n", *((u32 *)(ptxdesc + 32)));
  2785. RTW_INFO("Offset36(0x%08x)\n", *((u32 *)(ptxdesc + 36)));
  2786. RTW_INFO("Offset40(0x%08x)\n", *((u32 *)(ptxdesc + 40)));
  2787. RTW_INFO("Offset44(0x%08x)\n", *((u32 *)(ptxdesc + 44)));
  2788. RTW_INFO("=====================================\n");
  2789. }
  2790. }
  2791. /*
  2792. * Description:
  2793. *
  2794. * Parameters:
  2795. * pxmitframe xmitframe
  2796. * pbuf where to fill tx desc
  2797. */
  2798. void rtl8821c_update_txdesc(struct xmit_frame *pxmitframe, u8 *pbuf)
  2799. {
  2800. fill_default_txdesc(pxmitframe, pbuf);
  2801. rtl8821c_cal_txdesc_chksum(pxmitframe->padapter, pbuf);
  2802. rtl8821c_dbg_dump_tx_desc(pxmitframe->padapter, pxmitframe->frame_tag, pbuf);
  2803. }
  2804. /*
  2805. * Description:
  2806. * In normal chip, we should send some packet to HW which will be used by FW
  2807. * in FW LPS mode.
  2808. * The function is to fill the Tx descriptor of this packets,
  2809. * then FW can tell HW to send these packet directly.
  2810. */
  2811. static void fill_fake_txdesc(PADAPTER adapter, u8 *pDesc, u32 BufferLen,
  2812. u8 IsPsPoll, u8 IsBTQosNull, u8 bDataFrame)
  2813. {
  2814. struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv;
  2815. struct xmit_priv *pxmitpriv = &adapter->xmitpriv;
  2816. u32 desc_size = 0;
  2817. u8 hw_port = rtw_hal_get_port(adapter);
  2818. rtw_halmac_get_tx_desc_size(adapter_to_dvobj(adapter), &desc_size);
  2819. /* Clear all status */
  2820. _rtw_memset(pDesc, 0, desc_size);
  2821. SET_TX_DESC_LS_8821C(pDesc, 1);
  2822. SET_TX_DESC_OFFSET_8821C(pDesc, desc_size);
  2823. SET_TX_DESC_TXPKTSIZE_8821C(pDesc, BufferLen);
  2824. SET_TX_DESC_QSEL_8821C(pDesc, QSLT_MGNT); /* Fixed queue of Mgnt queue */
  2825. if (pmlmeext->cur_wireless_mode & WIRELESS_11B)
  2826. SET_TX_DESC_RATE_ID_8821C(pDesc, RATEID_IDX_B);
  2827. else
  2828. SET_TX_DESC_RATE_ID_8821C(pDesc, RATEID_IDX_G);
  2829. /* Set NAVUSEHDR to prevent Ps-poll AId filed to be changed to error vlaue by HW */
  2830. if (_TRUE == IsPsPoll)
  2831. SET_TX_DESC_NAVUSEHDR_8821C(pDesc, 1);
  2832. else {
  2833. SET_TX_DESC_DISQSELSEQ_8821C(pDesc, 1);
  2834. SET_TX_DESC_EN_HWSEQ_8821C(pDesc, 1);
  2835. SET_TX_DESC_HW_SSN_SEL_8821C(pDesc, pxmitpriv->hw_ssn_seq_no);/*pattrib->hw_ssn_sel*/
  2836. SET_TX_DESC_EN_HWEXSEQ_8821C(pDesc, 0);
  2837. }
  2838. if (_TRUE == IsBTQosNull)
  2839. SET_TX_DESC_BT_NULL_8821C(pDesc, 1);
  2840. SET_TX_DESC_USE_RATE_8821C(pDesc, 1);
  2841. SET_TX_DESC_DATARATE_8821C(pDesc, MRateToHwRate(pmlmeext->tx_rate));
  2842. #ifdef CONFIG_MCC_MODE
  2843. /* config Null data retry number */
  2844. if (IsPsPoll == _FALSE && IsBTQosNull == _FALSE && bDataFrame == _FALSE) {
  2845. if (rtw_hal_check_mcc_status(adapter, MCC_STATUS_PROCESS_MCC_START_SETTING)) {
  2846. u8 rty_num = adapter->mcc_adapterpriv.null_rty_num;
  2847. if (rty_num != 0) {
  2848. SET_TX_DESC_RTY_LMT_EN_8821C(pDesc, 1);
  2849. SET_TX_DESC_RTS_DATA_RTY_LMT_8821C(pDesc, rty_num);
  2850. }
  2851. }
  2852. }
  2853. #endif
  2854. /*
  2855. * Encrypt the data frame if under security mode excepct null data.
  2856. */
  2857. if (_TRUE == bDataFrame) {
  2858. u32 EncAlg;
  2859. EncAlg = adapter->securitypriv.dot11PrivacyAlgrthm;
  2860. switch (EncAlg) {
  2861. case _NO_PRIVACY_:
  2862. SET_TX_DESC_SEC_TYPE_8821C(pDesc, 0x0);
  2863. break;
  2864. case _WEP40_:
  2865. case _WEP104_:
  2866. case _TKIP_:
  2867. SET_TX_DESC_SEC_TYPE_8821C(pDesc, 0x1);
  2868. break;
  2869. case _SMS4_:
  2870. SET_TX_DESC_SEC_TYPE_8821C(pDesc, 0x2);
  2871. break;
  2872. case _AES_:
  2873. SET_TX_DESC_SEC_TYPE_8821C(pDesc, 0x3);
  2874. break;
  2875. default:
  2876. SET_TX_DESC_SEC_TYPE_8821C(pDesc, 0x0);
  2877. break;
  2878. }
  2879. }
  2880. SET_TX_DESC_PORT_ID_8821C(pDesc, hw_port);
  2881. SET_TX_DESC_MULTIPLE_PORT_8821C(pDesc, hw_port);
  2882. #if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
  2883. /*
  2884. * USB interface drop packet if the checksum of descriptor isn't correct.
  2885. * Using this checksum can let hardware recovery from packet bulk out error (e.g. Cancel URC, Bulk out error.).
  2886. */
  2887. rtl8821c_cal_txdesc_chksum(adapter, pDesc);
  2888. #endif
  2889. }
  2890. void rtl8821c_rxdesc2attribute(struct rx_pkt_attrib *pattrib, u8 *desc)
  2891. {
  2892. /* initial value */
  2893. _rtw_memset(pattrib, 0, sizeof(struct rx_pkt_attrib));
  2894. pattrib->pkt_len = (u16)GET_RX_DESC_PKT_LEN_8821C(desc);
  2895. pattrib->pkt_rpt_type = (GET_RX_DESC_C2H_8821C(desc)) ? C2H_PACKET : NORMAL_RX;
  2896. if (pattrib->pkt_rpt_type == NORMAL_RX) {
  2897. /* Get from RX DESC */
  2898. pattrib->crc_err = (u8)GET_RX_DESC_CRC32_8821C(desc);
  2899. pattrib->icv_err = (u8)GET_RX_DESC_ICV_ERR_8821C(desc);
  2900. pattrib->drvinfo_sz = (u8)GET_RX_DESC_DRV_INFO_SIZE_8821C(desc) << 3;
  2901. pattrib->encrypt = (u8)GET_RX_DESC_SECURITY_8821C(desc);
  2902. pattrib->qos = (u8)GET_RX_DESC_QOS_8821C(desc);
  2903. pattrib->shift_sz = (u8)GET_RX_DESC_SHIFT_8821C(desc);
  2904. pattrib->physt = (u8)GET_RX_DESC_PHYST_8821C(desc);
  2905. pattrib->bdecrypted = (u8)GET_RX_DESC_SWDEC_8821C(desc) ? 0 : 1;
  2906. pattrib->priority = (u8)GET_RX_DESC_TID_8821C(desc);
  2907. pattrib->amsdu = (u8)GET_RX_DESC_AMSDU_8821C(desc);
  2908. pattrib->mdata = (u8)GET_RX_DESC_MD_8821C(desc);
  2909. pattrib->mfrag = (u8)GET_RX_DESC_MF_8821C(desc);
  2910. pattrib->seq_num = (u16)GET_RX_DESC_SEQ_8821C(desc);
  2911. pattrib->frag_num = (u8)GET_RX_DESC_FRAG_8821C(desc);
  2912. pattrib->ppdu_cnt = (u8)GET_RX_DESC_PPDU_CNT_8821C(desc);
  2913. pattrib->free_cnt = (u32)GET_RX_DESC_TSFL_8821C(desc);
  2914. pattrib->bw = CHANNEL_WIDTH_MAX;
  2915. pattrib->data_rate = (u8)GET_RX_DESC_RX_RATE_8821C(desc);
  2916. }
  2917. }
  2918. void rtl8821c_query_rx_desc(union recv_frame *precvframe, u8 *pdesc)
  2919. {
  2920. rtl8821c_rxdesc2attribute(&precvframe->u.hdr.attrib, pdesc);
  2921. }
  2922. static void InitBeaconParameters(PADAPTER adapter)
  2923. {
  2924. PHAL_DATA_TYPE hal = GET_HAL_DATA(adapter);
  2925. /* TBTT setup time */
  2926. rtw_write8(adapter, REG_TBTT_PROHIBIT_8821C, TBTT_PROHIBIT_SETUP_TIME);
  2927. /* TBTT hold time: 0x540[19:8] */
  2928. rtw_write8(adapter, REG_TBTT_PROHIBIT_8821C + 1, TBTT_PROHIBIT_HOLD_TIME_STOP_BCN & 0xFF);
  2929. rtw_write8(adapter, REG_TBTT_PROHIBIT_8821C + 2,
  2930. (rtw_read8(adapter, REG_TBTT_PROHIBIT_8821C + 2) & 0xF0) | (TBTT_PROHIBIT_HOLD_TIME_STOP_BCN >> 8));
  2931. rtw_write8(adapter, REG_DRVERLYINT_8821C, DRIVER_EARLY_INT_TIME_8821C); /* 5ms */
  2932. rtw_write8(adapter, REG_BCNDMATIM_8821C, BCN_DMA_ATIME_INT_TIME_8821C); /* 2ms */
  2933. /*
  2934. * Suggested by designer timchen. Change beacon AIFS to the largest number
  2935. * beacause test chip does not contension before sending beacon.
  2936. */
  2937. rtw_write16(adapter, REG_BCNTCFG_8821C, 0x4413);
  2938. }
  2939. static void beacon_function_enable(PADAPTER adapter, u8 Enable, u8 Linked)
  2940. {
  2941. hw_bcn_ctrl_add(adapter, get_hw_port(adapter), BIT_DIS_TSF_UDT_8821C | BIT_EN_BCN_FUNCTION_8821C);
  2942. }
  2943. static void set_beacon_related_registers(PADAPTER adapter)
  2944. {
  2945. struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv;
  2946. struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info;
  2947. /* reset TSF, enable update TSF, correcting TSF On Beacon */
  2948. #if 0
  2949. /* * REG_MBSSID_BCN_SPACE */
  2950. /* * REG_BCNDMATIM */
  2951. /* * REG_ATIMWND */
  2952. /* * REG_TBTT_PROHIBIT */
  2953. /* * REG_DRVERLYINT */
  2954. /* * REG_BCN_MAX_ERR */
  2955. /* * REG_BCNTCFG (0x510) */
  2956. /* * REG_DUAL_TSF_RST */
  2957. /* * REG_BCN_CTRL (0x550) */
  2958. #endif
  2959. /* ATIM window */
  2960. rtw_write16(adapter, REG_ATIMWND_8821C, 2);
  2961. /* Beacon interval (in unit of TU). */
  2962. rtw_hal_set_hwreg(adapter, HW_VAR_BEACON_INTERVAL, (u8 *)&pmlmeinfo->bcn_interval);
  2963. InitBeaconParameters(adapter);
  2964. rtw_write8(adapter, REG_SLOT_8821C, 0x09);
  2965. /* Reset TSF Timer to zero */
  2966. hw_tsf_reset(adapter);
  2967. rtw_write8(adapter, REG_RXTSF_OFFSET_CCK_8821C, 0x50);
  2968. rtw_write8(adapter, REG_RXTSF_OFFSET_OFDM_8821C, 0x50);
  2969. beacon_function_enable(adapter, _TRUE, _TRUE);
  2970. ResumeTxBeacon(adapter);
  2971. }
  2972. void rtl8821c_set_hal_ops(PADAPTER adapter)
  2973. {
  2974. struct hal_ops *ops_func = &adapter->hal_func;
  2975. /*** initialize section ***/
  2976. ops_func->read_chip_version = read_chip_version;
  2977. /*
  2978. ops->init_default_value = NULL;
  2979. */
  2980. ops_func->read_adapter_info = rtl8821c_read_efuse;
  2981. ops_func->hal_power_on = rtl8821c_power_on;
  2982. ops_func->hal_power_off = rtl8821c_power_off;
  2983. ops_func->dm_init = rtl8821c_phy_init_dm_priv;
  2984. ops_func->dm_deinit = rtl8821c_phy_deinit_dm_priv;
  2985. /*** xmit section ***/
  2986. /*
  2987. ops->init_xmit_priv = NULL;
  2988. ops->free_xmit_priv = NULL;
  2989. ops->hal_xmit = NULL;
  2990. ops->mgnt_xmit = NULL;
  2991. ops->hal_xmitframe_enqueue = NULL;
  2992. #ifdef CONFIG_XMIT_THREAD_MODE
  2993. ops->xmit_thread_handler = NULL;
  2994. #endif
  2995. */
  2996. /*
  2997. ops_func->run_thread = rtl8821c_run_thread;
  2998. ops_func->cancel_thread = rtl8821c_cancel_thread;
  2999. */
  3000. /*** recv section ***/
  3001. /*
  3002. ops->init_recv_priv = NULL;
  3003. ops->free_recv_priv = NULL;
  3004. #if defined(CONFIG_USB_HCI) || defined(CONFIG_PCI_HCI)
  3005. ops->inirp_init = NULL;
  3006. ops->inirp_deinit = NULL;
  3007. #endif
  3008. */
  3009. /*** interrupt hdl section ***/
  3010. /*
  3011. ops->enable_interrupt = NULL;
  3012. ops->disable_interrupt = NULL;
  3013. */
  3014. ops_func->check_ips_status = check_ips_status;
  3015. /*
  3016. #if defined(CONFIG_PCI_HCI)
  3017. ops->interrupt_handler = NULL;
  3018. #endif
  3019. #if defined(CONFIG_USB_HCI) && defined(CONFIG_SUPPORT_USB_INT)
  3020. ops->interrupt_handler = NULL;
  3021. #endif
  3022. #if defined(CONFIG_PCI_HCI)
  3023. ops->irp_reset = NULL;
  3024. #endif
  3025. */
  3026. /*** DM section ***/
  3027. ops_func->set_chnl_bw_handler = rtl8821c_set_channel_bw;
  3028. ops_func->set_tx_power_level_handler = rtl8821c_set_tx_power_level;
  3029. ops_func->get_tx_power_level_handler = rtl8821c_get_tx_power_level;
  3030. ops_func->set_tx_power_index_handler = rtl8821c_set_tx_power_index;
  3031. ops_func->get_tx_power_index_handler = rtl8821c_get_tx_power_index;
  3032. ops_func->hal_dm_watchdog = rtl8821c_phy_haldm_watchdog;
  3033. ops_func->GetHalODMVarHandler = GetHalODMVar;
  3034. ops_func->SetHalODMVarHandler = SetHalODMVar;
  3035. ops_func->SetBeaconRelatedRegistersHandler = set_beacon_related_registers;
  3036. #ifdef CONFIG_ANTENNA_DIVERSITY
  3037. /*
  3038. ops->AntDivBeforeLinkHandler = NULL;
  3039. ops->AntDivCompareHandler = NULL;
  3040. */
  3041. #endif
  3042. /*
  3043. ops->interface_ps_func = NULL;
  3044. */
  3045. ops_func->read_bbreg = rtl8821c_read_bb_reg;
  3046. ops_func->write_bbreg = rtl8821c_write_bb_reg;
  3047. ops_func->read_rfreg = rtl8821c_read_rf_reg;
  3048. ops_func->write_rfreg = rtl8821c_write_rf_reg;
  3049. ops_func->read_wmmedca_reg = rtl8821c_read_wmmedca_reg;
  3050. #ifdef CONFIG_HOSTAPD_MLME
  3051. /*
  3052. ops->hostap_mgnt_xmit_entry = NULL;
  3053. */
  3054. #endif
  3055. /*
  3056. ops->EfusePowerSwitch = NULL;
  3057. ops->BTEfusePowerSwitch = NULL;
  3058. ops->ReadEFuse = NULL;
  3059. ops->EFUSEGetEfuseDefinition = NULL;
  3060. ops->EfuseGetCurrentSize = NULL;
  3061. ops->Efuse_PgPacketRead = NULL;
  3062. ops->Efuse_PgPacketWrite = NULL;
  3063. ops->Efuse_WordEnableDataWrite = NULL;
  3064. ops->Efuse_PgPacketWrite_BT = NULL;
  3065. */
  3066. #ifdef DBG_CONFIG_ERROR_DETECT
  3067. ops_func->sreset_init_value = sreset_init_value;
  3068. ops_func->sreset_reset_value = sreset_reset_value;
  3069. ops_func->silentreset = sreset_reset;
  3070. ops_func->sreset_xmit_status_check = xmit_status_check;
  3071. ops_func->sreset_linked_status_check = linked_status_check;
  3072. ops_func->sreset_get_wifi_status = sreset_get_wifi_status;
  3073. ops_func->sreset_inprogress = sreset_inprogress;
  3074. #endif /* DBG_CONFIG_ERROR_DETECT */
  3075. #ifdef CONFIG_IOL
  3076. /*
  3077. ops->IOL_exec_cmds_sync = NULL;
  3078. */
  3079. #endif
  3080. ops_func->hal_notch_filter = rtl8821c_notch_filter_switch;
  3081. ops_func->hal_mac_c2h_handler = c2h_handler_rtl8821c;
  3082. ops_func->fill_h2c_cmd = rtl8821c_fillh2ccmd;
  3083. ops_func->fill_fake_txdesc = fill_fake_txdesc;
  3084. ops_func->fw_dl = rtl8821c_fw_dl;
  3085. #ifdef CONFIG_LPS_PG
  3086. ops_func->fw_mem_dl = rtl8821c_fw_mem_dl;
  3087. #endif
  3088. #if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN)
  3089. /*
  3090. ops->clear_interrupt = NULL;
  3091. */
  3092. #endif
  3093. /*
  3094. ops_func->hal_get_tx_buff_rsvd_page_num = NULL;
  3095. */
  3096. #ifdef CONFIG_GPIO_API
  3097. /*
  3098. ops->update_hisr_hsisr_ind = NULL;
  3099. */
  3100. #endif
  3101. /* HALMAC related functions */
  3102. ops_func->init_mac_register = rtl8821c_init_phy_parameter_mac;
  3103. ops_func->init_phy = rtl8821c_phy_init;
  3104. }