302-rt2x00-Implement-support-for-rt2800pci.patch 149 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695
  1. From 659988a6bb83536c5d0a01b0b58378cc1856c975 Mon Sep 17 00:00:00 2001
  2. From: Ivo van Doorn <[email protected]>
  3. Date: Fri, 23 Jan 2009 17:13:03 +0100
  4. Subject: [PATCH] rt2x00: Implement support for rt2800pci
  5. Add support for the rt2800pci chipset.
  6. Includes various patches from Mattias, Mark and Felix.
  7. Signed-off-by: Mattias Nissler <[email protected]>
  8. Signed-off-by: Mark Asselstine <[email protected]>
  9. Signed-off-by: Felix Fietkau <[email protected]>
  10. Signed-off-by: Ivo van Doorn <[email protected]>
  11. ---
  12. drivers/net/wireless/rt2x00/Kconfig | 15 +
  13. drivers/net/wireless/rt2x00/Makefile | 1 +
  14. drivers/net/wireless/rt2x00/rt2800pci.c | 2763 +++++++++++++++++++++++++++++++
  15. drivers/net/wireless/rt2x00/rt2800pci.h | 1881 +++++++++++++++++++++
  16. drivers/net/wireless/rt2x00/rt2x00.h | 4 +
  17. 5 files changed, 4664 insertions(+), 0 deletions(-)
  18. create mode 100644 drivers/net/wireless/rt2x00/rt2800pci.c
  19. create mode 100644 drivers/net/wireless/rt2x00/rt2800pci.h
  20. --- a/drivers/net/wireless/rt2x00/Makefile
  21. +++ b/drivers/net/wireless/rt2x00/Makefile
  22. @@ -16,5 +16,6 @@ obj-$(CONFIG_RT2X00_LIB_USB) += rt2x00u
  23. obj-$(CONFIG_RT2400PCI) += rt2400pci.o
  24. obj-$(CONFIG_RT2500PCI) += rt2500pci.o
  25. obj-$(CONFIG_RT61PCI) += rt61pci.o
  26. +obj-$(CONFIG_RT2800PCI) += rt2800pci.o
  27. obj-$(CONFIG_RT2500USB) += rt2500usb.o
  28. obj-$(CONFIG_RT73USB) += rt73usb.o
  29. --- /dev/null
  30. +++ b/drivers/net/wireless/rt2x00/rt2800pci.c
  31. @@ -0,0 +1,2763 @@
  32. +/*
  33. + Copyright (C) 2004 - 2009 rt2x00 SourceForge Project
  34. + <http://rt2x00.serialmonkey.com>
  35. +
  36. + This program is free software; you can redistribute it and/or modify
  37. + it under the terms of the GNU General Public License as published by
  38. + the Free Software Foundation; either version 2 of the License, or
  39. + (at your option) any later version.
  40. +
  41. + This program is distributed in the hope that it will be useful,
  42. + but WITHOUT ANY WARRANTY; without even the implied warranty of
  43. + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  44. + GNU General Public License for more details.
  45. +
  46. + You should have received a copy of the GNU General Public License
  47. + along with this program; if not, write to the
  48. + Free Software Foundation, Inc.,
  49. + 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  50. + */
  51. +
  52. +/*
  53. + Module: rt2800pci
  54. + Abstract: rt2800pci device specific routines.
  55. + Supported chipsets: RT2800E & RT2800ED.
  56. + */
  57. +
  58. +#include <linux/crc-ccitt.h>
  59. +#include <linux/delay.h>
  60. +#include <linux/etherdevice.h>
  61. +#include <linux/init.h>
  62. +#include <linux/kernel.h>
  63. +#include <linux/module.h>
  64. +#include <linux/pci.h>
  65. +#include <linux/eeprom_93cx6.h>
  66. +
  67. +#include "rt2x00.h"
  68. +#include "rt2x00pci.h"
  69. +#include "rt2800pci.h"
  70. +
  71. +/*
  72. + * Allow hardware encryption to be disabled.
  73. + */
  74. +static int modparam_nohwcrypt = 0;
  75. +module_param_named(nohwcrypt, modparam_nohwcrypt, bool, S_IRUGO);
  76. +MODULE_PARM_DESC(nohwcrypt, "Disable hardware encryption.");
  77. +
  78. +/*
  79. + * Register access.
  80. + * BBP and RF register require indirect register access,
  81. + * and use the CSR registers PHY_CSR3 and PHY_CSR4 to achieve this.
  82. + * These indirect registers work with busy bits,
  83. + * and we will try maximal REGISTER_BUSY_COUNT times to access
  84. + * the register while taking a REGISTER_BUSY_DELAY us delay
  85. + * between each attampt. When the busy bit is still set at that time,
  86. + * the access attempt is considered to have failed,
  87. + * and we will print an error.
  88. + */
  89. +#define WAIT_FOR_BBP(__dev, __reg) \
  90. + rt2x00pci_regbusy_read((__dev), BBP_CSR_CFG, BBP_CSR_CFG_BUSY, (__reg))
  91. +#define WAIT_FOR_RF(__dev, __reg) \
  92. + rt2x00pci_regbusy_read((__dev), RF_CSR_CFG0, RF_CSR_CFG0_BUSY, (__reg))
  93. +#define WAIT_FOR_MCU(__dev, __reg) \
  94. + rt2x00pci_regbusy_read((__dev), H2M_MAILBOX_CSR, \
  95. + H2M_MAILBOX_CSR_OWNER, (__reg))
  96. +
  97. +static void rt2800pci_bbp_write(struct rt2x00_dev *rt2x00dev,
  98. + const unsigned int word, const u8 value)
  99. +{
  100. + u32 reg;
  101. +
  102. + mutex_lock(&rt2x00dev->csr_mutex);
  103. +
  104. + /*
  105. + * Wait until the BBP becomes available, afterwards we
  106. + * can safely write the new data into the register.
  107. + */
  108. + if (WAIT_FOR_BBP(rt2x00dev, &reg)) {
  109. + reg = 0;
  110. + rt2x00_set_field32(&reg, BBP_CSR_CFG_VALUE, value);
  111. + rt2x00_set_field32(&reg, BBP_CSR_CFG_REGNUM, word);
  112. + rt2x00_set_field32(&reg, BBP_CSR_CFG_BUSY, 1);
  113. + rt2x00_set_field32(&reg, BBP_CSR_CFG_READ_CONTROL, 0);
  114. + rt2x00_set_field32(&reg, BBP_CSR_CFG_BBP_RW_MODE, 1);
  115. +
  116. + rt2x00pci_register_write(rt2x00dev, BBP_CSR_CFG, reg);
  117. + }
  118. +
  119. + mutex_unlock(&rt2x00dev->csr_mutex);
  120. +}
  121. +
  122. +static void rt2800pci_bbp_read(struct rt2x00_dev *rt2x00dev,
  123. + const unsigned int word, u8 *value)
  124. +{
  125. + u32 reg;
  126. +
  127. + mutex_lock(&rt2x00dev->csr_mutex);
  128. +
  129. + /*
  130. + * Wait until the BBP becomes available, afterwards we
  131. + * can safely write the read request into the register.
  132. + * After the data has been written, we wait until hardware
  133. + * returns the correct value, if at any time the register
  134. + * doesn't become available in time, reg will be 0xffffffff
  135. + * which means we return 0xff to the caller.
  136. + */
  137. + if (WAIT_FOR_BBP(rt2x00dev, &reg)) {
  138. + reg = 0;
  139. + rt2x00_set_field32(&reg, BBP_CSR_CFG_REGNUM, word);
  140. + rt2x00_set_field32(&reg, BBP_CSR_CFG_BUSY, 1);
  141. + rt2x00_set_field32(&reg, BBP_CSR_CFG_READ_CONTROL, 1);
  142. + rt2x00_set_field32(&reg, BBP_CSR_CFG_BBP_RW_MODE, 1);
  143. +
  144. + rt2x00pci_register_write(rt2x00dev, BBP_CSR_CFG, reg);
  145. +
  146. + WAIT_FOR_BBP(rt2x00dev, &reg);
  147. + }
  148. +
  149. + *value = rt2x00_get_field32(reg, BBP_CSR_CFG_VALUE);
  150. +
  151. + mutex_unlock(&rt2x00dev->csr_mutex);
  152. +}
  153. +
  154. +static void rt2800pci_rf_write(struct rt2x00_dev *rt2x00dev,
  155. + const unsigned int word, const u32 value)
  156. +{
  157. + u32 reg;
  158. +
  159. + if (!word)
  160. + return;
  161. +
  162. + mutex_lock(&rt2x00dev->csr_mutex);
  163. +
  164. + /*
  165. + * Wait until the RF becomes available, afterwards we
  166. + * can safely write the new data into the register.
  167. + */
  168. + if (WAIT_FOR_RF(rt2x00dev, &reg)) {
  169. + reg = 0;
  170. + rt2x00_set_field32(&reg, RF_CSR_CFG0_REG_VALUE_BW, value);
  171. + rt2x00_set_field32(&reg, RF_CSR_CFG0_STANDBYMODE, 0);
  172. + rt2x00_set_field32(&reg, RF_CSR_CFG0_SEL, 0);
  173. + rt2x00_set_field32(&reg, RF_CSR_CFG0_BUSY, 1);
  174. +
  175. + rt2x00pci_register_write(rt2x00dev, RF_CSR_CFG0, reg);
  176. + rt2x00_rf_write(rt2x00dev, word, value);
  177. + }
  178. +
  179. + mutex_unlock(&rt2x00dev->csr_mutex);
  180. +}
  181. +
  182. +static void rt2800pci_mcu_request(struct rt2x00_dev *rt2x00dev,
  183. + const u8 command, const u8 token,
  184. + const u8 arg0, const u8 arg1)
  185. +{
  186. + u32 reg;
  187. +
  188. + mutex_lock(&rt2x00dev->csr_mutex);
  189. +
  190. + /*
  191. + * Wait until the MCU becomes available, afterwards we
  192. + * can safely write the new data into the register.
  193. + */
  194. + if (WAIT_FOR_MCU(rt2x00dev, &reg)) {
  195. + rt2x00_set_field32(&reg, H2M_MAILBOX_CSR_OWNER, 1);
  196. + rt2x00_set_field32(&reg, H2M_MAILBOX_CSR_CMD_TOKEN, token);
  197. + rt2x00_set_field32(&reg, H2M_MAILBOX_CSR_ARG0, arg0);
  198. + rt2x00_set_field32(&reg, H2M_MAILBOX_CSR_ARG1, arg1);
  199. + rt2x00pci_register_write(rt2x00dev, H2M_MAILBOX_CSR, reg);
  200. +
  201. + reg = 0;
  202. + rt2x00_set_field32(&reg, HOST_CMD_CSR_HOST_COMMAND, command);
  203. + rt2x00pci_register_write(rt2x00dev, HOST_CMD_CSR, reg);
  204. + }
  205. +
  206. + mutex_unlock(&rt2x00dev->csr_mutex);
  207. +}
  208. +
  209. +static void rt2800pci_eepromregister_read(struct eeprom_93cx6 *eeprom)
  210. +{
  211. + struct rt2x00_dev *rt2x00dev = eeprom->data;
  212. + u32 reg;
  213. +
  214. + rt2x00pci_register_read(rt2x00dev, E2PROM_CSR, &reg);
  215. +
  216. + eeprom->reg_data_in = !!rt2x00_get_field32(reg, E2PROM_CSR_DATA_IN);
  217. + eeprom->reg_data_out = !!rt2x00_get_field32(reg, E2PROM_CSR_DATA_OUT);
  218. + eeprom->reg_data_clock =
  219. + !!rt2x00_get_field32(reg, E2PROM_CSR_DATA_CLOCK);
  220. + eeprom->reg_chip_select =
  221. + !!rt2x00_get_field32(reg, E2PROM_CSR_CHIP_SELECT);
  222. +}
  223. +
  224. +static void rt2800pci_eepromregister_write(struct eeprom_93cx6 *eeprom)
  225. +{
  226. + struct rt2x00_dev *rt2x00dev = eeprom->data;
  227. + u32 reg = 0;
  228. +
  229. + rt2x00_set_field32(&reg, E2PROM_CSR_DATA_IN, !!eeprom->reg_data_in);
  230. + rt2x00_set_field32(&reg, E2PROM_CSR_DATA_OUT, !!eeprom->reg_data_out);
  231. + rt2x00_set_field32(&reg, E2PROM_CSR_DATA_CLOCK,
  232. + !!eeprom->reg_data_clock);
  233. + rt2x00_set_field32(&reg, E2PROM_CSR_CHIP_SELECT,
  234. + !!eeprom->reg_chip_select);
  235. +
  236. + rt2x00pci_register_write(rt2x00dev, E2PROM_CSR, reg);
  237. +}
  238. +
  239. +#ifdef CONFIG_RT2X00_LIB_DEBUGFS
  240. +static const struct rt2x00debug rt2800pci_rt2x00debug = {
  241. + .owner = THIS_MODULE,
  242. + .csr = {
  243. + .read = rt2x00pci_register_read,
  244. + .write = rt2x00pci_register_write,
  245. + .flags = RT2X00DEBUGFS_OFFSET,
  246. + .word_base = CSR_REG_BASE,
  247. + .word_size = sizeof(u32),
  248. + .word_count = CSR_REG_SIZE / sizeof(u32),
  249. + },
  250. + .eeprom = {
  251. + .read = rt2x00_eeprom_read,
  252. + .write = rt2x00_eeprom_write,
  253. + .word_base = EEPROM_BASE,
  254. + .word_size = sizeof(u16),
  255. + .word_count = EEPROM_SIZE / sizeof(u16),
  256. + },
  257. + .bbp = {
  258. + .read = rt2800pci_bbp_read,
  259. + .write = rt2800pci_bbp_write,
  260. + .word_base = BBP_BASE,
  261. + .word_size = sizeof(u8),
  262. + .word_count = BBP_SIZE / sizeof(u8),
  263. + },
  264. + .rf = {
  265. + .read = rt2x00_rf_read,
  266. + .write = rt2800pci_rf_write,
  267. + .word_base = RF_BASE,
  268. + .word_size = sizeof(u32),
  269. + .word_count = RF_SIZE / sizeof(u32),
  270. + },
  271. +};
  272. +#endif /* CONFIG_RT2X00_LIB_DEBUGFS */
  273. +
  274. +#ifdef CONFIG_RT2X00_LIB_RFKILL
  275. +static int rt2800pci_rfkill_poll(struct rt2x00_dev *rt2x00dev)
  276. +{
  277. + u32 reg;
  278. +
  279. + rt2x00pci_register_read(rt2x00dev, GPIO_CTRL_CFG, &reg);
  280. + return rt2x00_get_field32(reg, GPIO_CTRL_CFG_BIT2);
  281. +}
  282. +#else
  283. +#define rt2800pci_rfkill_poll NULL
  284. +#endif /* CONFIG_RT2X00_LIB_RFKILL */
  285. +
  286. +#ifdef CONFIG_RT2X00_LIB_LEDS
  287. +static void rt2800pci_brightness_set(struct led_classdev *led_cdev,
  288. + enum led_brightness brightness)
  289. +{
  290. + struct rt2x00_led *led =
  291. + container_of(led_cdev, struct rt2x00_led, led_dev);
  292. + unsigned int enabled = brightness != LED_OFF;
  293. + unsigned int bg_mode =
  294. + (enabled && led->rt2x00dev->curr_band == IEEE80211_BAND_2GHZ);
  295. + unsigned int polarity =
  296. + rt2x00_get_field16(led->rt2x00dev->led_mcu_reg,
  297. + EEPROM_FREQ_LED_POLARITY);
  298. + unsigned int ledmode =
  299. + rt2x00_get_field16(led->rt2x00dev->led_mcu_reg,
  300. + EEPROM_FREQ_LED_MODE);
  301. +
  302. + if (led->type == LED_TYPE_RADIO) {
  303. + rt2800pci_mcu_request(led->rt2x00dev, MCU_LED, 0xff, ledmode,
  304. + enabled ? 0x20 : 0);
  305. + } else if (led->type == LED_TYPE_ASSOC) {
  306. + rt2800pci_mcu_request(led->rt2x00dev, MCU_LED, 0xff, ledmode,
  307. + enabled ? (bg_mode ? 0x60 : 0xa0) : 0x20);
  308. + } else if (led->type == LED_TYPE_QUALITY) {
  309. + /*
  310. + * The brightness is divided into 6 levels (0 - 5),
  311. + * The specs tell us the following levels:
  312. + * 0, 1 ,3, 7, 15, 31
  313. + * to determine the level in a simple way we can simply
  314. + * work with bitshifting:
  315. + * (1 << level) - 1
  316. + */
  317. + rt2800pci_mcu_request(led->rt2x00dev, MCU_LED_STRENGTH, 0xff,
  318. + (1 << brightness / (LED_FULL / 6)) - 1,
  319. + polarity);
  320. + }
  321. +}
  322. +
  323. +static int rt2800pci_blink_set(struct led_classdev *led_cdev,
  324. + unsigned long *delay_on,
  325. + unsigned long *delay_off)
  326. +{
  327. + struct rt2x00_led *led =
  328. + container_of(led_cdev, struct rt2x00_led, led_dev);
  329. + u32 reg;
  330. +
  331. + rt2x00pci_register_read(led->rt2x00dev, LED_CFG, &reg);
  332. + rt2x00_set_field32(&reg, LED_CFG_ON_PERIOD, *delay_on);
  333. + rt2x00_set_field32(&reg, LED_CFG_OFF_PERIOD, *delay_off);
  334. + rt2x00_set_field32(&reg, LED_CFG_SLOW_BLINK_PERIOD, 3);
  335. + rt2x00_set_field32(&reg, LED_CFG_R_LED_MODE, 3);
  336. + rt2x00_set_field32(&reg, LED_CFG_G_LED_MODE, 12);
  337. + rt2x00_set_field32(&reg, LED_CFG_Y_LED_MODE, 3);
  338. + rt2x00_set_field32(&reg, LED_CFG_LED_POLAR, 1);
  339. + rt2x00pci_register_write(led->rt2x00dev, LED_CFG, reg);
  340. +
  341. + return 0;
  342. +}
  343. +
  344. +static void rt2800pci_init_led(struct rt2x00_dev *rt2x00dev,
  345. + struct rt2x00_led *led,
  346. + enum led_type type)
  347. +{
  348. + led->rt2x00dev = rt2x00dev;
  349. + led->type = type;
  350. + led->led_dev.brightness_set = rt2800pci_brightness_set;
  351. + led->led_dev.blink_set = rt2800pci_blink_set;
  352. + led->flags = LED_INITIALIZED;
  353. +}
  354. +#endif /* CONFIG_RT2X00_LIB_LEDS */
  355. +
  356. +/*
  357. + * Configuration handlers.
  358. + */
  359. +static void rt2800pci_config_wcid_attr(struct rt2x00_dev *rt2x00dev,
  360. + struct rt2x00lib_crypto *crypto,
  361. + struct ieee80211_key_conf *key)
  362. +{
  363. + u32 offset;
  364. + u32 reg;
  365. +
  366. + offset = MAC_WCID_ATTR_ENTRY(crypto->aid);
  367. +
  368. + reg = 0;
  369. + rt2x00_set_field32(&reg, MAC_WCID_ATTRIBUTE_KEYTAB,
  370. + !!(key->flags & IEEE80211_KEY_FLAG_PAIRWISE));
  371. + rt2x00_set_field32(&reg, MAC_WCID_ATTRIBUTE_PAIRKEY_MODE,
  372. + crypto->cipher);
  373. + rt2x00_set_field32(&reg, MAC_WCID_ATTRIBUTE_BSS_IDX,
  374. + (crypto->cmd == SET_KEY) ? crypto->bssidx : 0);
  375. + rt2x00_set_field32(&reg, MAC_WCID_ATTRIBUTE_RX_WIUDF, 0);
  376. + rt2x00pci_register_write(rt2x00dev, offset, reg);
  377. +}
  378. +
  379. +static int rt2800pci_config_shared_key(struct rt2x00_dev *rt2x00dev,
  380. + struct rt2x00lib_crypto *crypto,
  381. + struct ieee80211_key_conf *key)
  382. +{
  383. + struct hw_key_entry key_entry;
  384. + struct rt2x00_field32 field;
  385. + u32 offset;
  386. + u32 mask;
  387. + u32 reg;
  388. +
  389. + if (crypto->cmd == SET_KEY) {
  390. + memcpy(key_entry.key, crypto->key,
  391. + sizeof(key_entry.key));
  392. + memcpy(key_entry.tx_mic, crypto->tx_mic,
  393. + sizeof(key_entry.tx_mic));
  394. + memcpy(key_entry.rx_mic, crypto->rx_mic,
  395. + sizeof(key_entry.rx_mic));
  396. +
  397. + offset = SHARED_KEY_ENTRY(key->hw_key_idx);
  398. + rt2x00pci_register_multiwrite(rt2x00dev, offset,
  399. + &key_entry, sizeof(key_entry));
  400. +
  401. + /*
  402. + * The driver does not support the IV/EIV generation
  403. + * in hardware. However it doesn't support the IV/EIV
  404. + * inside the ieee80211 frame either, but requires it
  405. + * to be provided seperately for the descriptor.
  406. + * rt2x00lib will cut the IV/EIV data out of all frames
  407. + * given to us by mac80211, but we must tell mac80211
  408. + * to generate the IV/EIV data.
  409. + */
  410. + key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
  411. + }
  412. +
  413. + /*
  414. + * The cipher types are stored over multiple registers
  415. + * starting with SHARED_KEY_MODE_BASE each word will have
  416. + * 32 bits and contains the cipher types for 2 modes each.
  417. + * Using the correct defines correctly will cause overhead,
  418. + * so just calculate the correct offset.
  419. + */
  420. + mask = key->hw_key_idx % 8;
  421. + field.bit_offset = (3 * mask);
  422. + field.bit_mask = 0x7 << field.bit_offset;
  423. +
  424. + offset = SHARED_KEY_MODE_ENTRY(key->hw_key_idx / 8);
  425. + rt2x00pci_register_read(rt2x00dev, offset, &reg);
  426. + rt2x00_set_field32(&reg, field,
  427. + (crypto->cmd == SET_KEY) ? crypto->cipher : 0);
  428. + rt2x00pci_register_write(rt2x00dev, offset, reg);
  429. +
  430. + /*
  431. + * Update WCID information
  432. + */
  433. + rt2800pci_config_wcid_attr(rt2x00dev, crypto, key);
  434. +
  435. + return 0;
  436. +}
  437. +
  438. +static int rt2800pci_config_pairwise_key(struct rt2x00_dev *rt2x00dev,
  439. + struct rt2x00lib_crypto *crypto,
  440. + struct ieee80211_key_conf *key)
  441. +{
  442. + struct hw_key_entry key_entry;
  443. + u32 offset;
  444. +
  445. + /*
  446. + * 1 pairwise key is possible per AID, this means that the AID
  447. + * equals our hw_key_idx.
  448. + */
  449. + key->hw_key_idx = crypto->aid;
  450. +
  451. + if (crypto->cmd == SET_KEY) {
  452. + memcpy(key_entry.key, crypto->key,
  453. + sizeof(key_entry.key));
  454. + memcpy(key_entry.tx_mic, crypto->tx_mic,
  455. + sizeof(key_entry.tx_mic));
  456. + memcpy(key_entry.rx_mic, crypto->rx_mic,
  457. + sizeof(key_entry.rx_mic));
  458. +
  459. + offset = PAIRWISE_KEY_ENTRY(key->hw_key_idx);
  460. + rt2x00pci_register_multiwrite(rt2x00dev, offset,
  461. + &key_entry, sizeof(key_entry));
  462. +
  463. + /*
  464. + * The driver does not support the IV/EIV generation
  465. + * in hardware. However it doesn't support the IV/EIV
  466. + * inside the ieee80211 frame either, but requires it
  467. + * to be provided seperately for the descriptor.
  468. + * rt2x00lib will cut the IV/EIV data out of all frames
  469. + * given to us by mac80211, but we must tell mac80211
  470. + * to generate the IV/EIV data.
  471. + */
  472. + key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
  473. + }
  474. +
  475. + /*
  476. + * Update WCID information
  477. + */
  478. + rt2800pci_config_wcid_attr(rt2x00dev, crypto, key);
  479. +
  480. + return 0;
  481. +}
  482. +
  483. +static void rt2800pci_config_filter(struct rt2x00_dev *rt2x00dev,
  484. + const unsigned int filter_flags)
  485. +{
  486. + u32 reg;
  487. +
  488. + /*
  489. + * Start configuration steps.
  490. + * Note that the version error will always be dropped
  491. + * and broadcast frames will always be accepted since
  492. + * there is no filter for it at this time.
  493. + */
  494. + rt2x00pci_register_read(rt2x00dev, RX_FILTER_CFG, &reg);
  495. + rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_CRC_ERROR,
  496. + !(filter_flags & FIF_FCSFAIL));
  497. + rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_PHY_ERROR,
  498. + !(filter_flags & FIF_PLCPFAIL));
  499. + rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_NOT_TO_ME,
  500. + !(filter_flags & FIF_PROMISC_IN_BSS));
  501. + rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_NOT_MY_BSSD, 0);
  502. + rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_VER_ERROR, 1);
  503. + rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_MULTICAST,
  504. + !(filter_flags & FIF_ALLMULTI));
  505. + rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_BROADCAST, 0);
  506. + rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_DUPLICATE, 1);
  507. + rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_CF_END_ACK,
  508. + !(filter_flags & FIF_CONTROL));
  509. + rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_CF_END,
  510. + !(filter_flags & FIF_CONTROL));
  511. + rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_ACK,
  512. + !(filter_flags & FIF_CONTROL));
  513. + rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_CTS,
  514. + !(filter_flags & FIF_CONTROL));
  515. + rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_RTS,
  516. + !(filter_flags & FIF_CONTROL));
  517. + rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_PSPOLL,
  518. + !(filter_flags & FIF_CONTROL));
  519. + rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_BA, 1);
  520. + rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_BAR, 1);
  521. + rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_CNTL,
  522. + !(filter_flags & FIF_CONTROL));
  523. + rt2x00pci_register_write(rt2x00dev, RX_FILTER_CFG, reg);
  524. +}
  525. +
  526. +static void rt2800pci_config_intf(struct rt2x00_dev *rt2x00dev,
  527. + struct rt2x00_intf *intf,
  528. + struct rt2x00intf_conf *conf,
  529. + const unsigned int flags)
  530. +{
  531. + unsigned int beacon_base;
  532. + u32 reg;
  533. +
  534. + if (flags & CONFIG_UPDATE_TYPE) {
  535. + /*
  536. + * Clear current synchronisation setup.
  537. + * For the Beacon base registers we only need to clear
  538. + * the first byte since that byte contains the VALID and OWNER
  539. + * bits which (when set to 0) will invalidate the entire beacon.
  540. + */
  541. + beacon_base = HW_BEACON_OFFSET(intf->beacon->entry_idx);
  542. + rt2x00pci_register_write(rt2x00dev, beacon_base, 0);
  543. +
  544. + /*
  545. + * Enable synchronisation.
  546. + */
  547. + rt2x00pci_register_read(rt2x00dev, BCN_TIME_CFG, &reg);
  548. + rt2x00_set_field32(&reg, BCN_TIME_CFG_TSF_TICKING, 1);
  549. + rt2x00_set_field32(&reg, BCN_TIME_CFG_TSF_SYNC, conf->sync);
  550. + rt2x00_set_field32(&reg, BCN_TIME_CFG_TBTT_ENABLE, 1);
  551. + rt2x00pci_register_write(rt2x00dev, BCN_TIME_CFG, reg);
  552. + }
  553. +
  554. + if (flags & CONFIG_UPDATE_MAC) {
  555. + reg = le32_to_cpu(conf->mac[1]);
  556. + rt2x00_set_field32(&reg, MAC_ADDR_DW1_UNICAST_TO_ME_MASK, 0xff);
  557. + conf->mac[1] = cpu_to_le32(reg);
  558. +
  559. + rt2x00pci_register_multiwrite(rt2x00dev, MAC_ADDR_DW0,
  560. + conf->mac, sizeof(conf->mac));
  561. + }
  562. +
  563. + if (flags & CONFIG_UPDATE_BSSID) {
  564. + reg = le32_to_cpu(conf->bssid[1]);
  565. + rt2x00_set_field32(&reg, MAC_BSSID_DW1_BSS_ID_MASK, 0);
  566. + rt2x00_set_field32(&reg, MAC_BSSID_DW1_BSS_BCN_NUM, 0);
  567. + conf->bssid[1] = cpu_to_le32(reg);
  568. +
  569. + rt2x00pci_register_multiwrite(rt2x00dev, MAC_BSSID_DW0,
  570. + conf->bssid, sizeof(conf->bssid));
  571. + }
  572. +}
  573. +
  574. +static void rt2800pci_config_erp(struct rt2x00_dev *rt2x00dev,
  575. + struct rt2x00lib_erp *erp)
  576. +{
  577. + u32 reg;
  578. +
  579. + rt2x00pci_register_read(rt2x00dev, TX_TIMEOUT_CFG, &reg);
  580. + rt2x00_set_field32(&reg, TX_TIMEOUT_CFG_RX_ACK_TIMEOUT,
  581. + erp->ack_timeout);
  582. + rt2x00pci_register_write(rt2x00dev, TX_TIMEOUT_CFG, reg);
  583. +
  584. + rt2x00pci_register_read(rt2x00dev, AUTO_RSP_CFG, &reg);
  585. + rt2x00_set_field32(&reg, AUTO_RSP_CFG_BAC_ACK_POLICY,
  586. + !!erp->short_preamble);
  587. + rt2x00_set_field32(&reg, AUTO_RSP_CFG_AR_PREAMBLE,
  588. + !!erp->short_preamble);
  589. + rt2x00pci_register_write(rt2x00dev, AUTO_RSP_CFG, reg);
  590. +
  591. + rt2x00pci_register_read(rt2x00dev, OFDM_PROT_CFG, &reg);
  592. + rt2x00_set_field32(&reg, OFDM_PROT_CFG_PROTECT_CTRL,
  593. + erp->cts_protection ? 2 : 0);
  594. + rt2x00pci_register_write(rt2x00dev, OFDM_PROT_CFG, reg);
  595. +
  596. + rt2x00pci_register_write(rt2x00dev, LEGACY_BASIC_RATE,
  597. + erp->basic_rates);
  598. + rt2x00pci_register_write(rt2x00dev, HT_BASIC_RATE,
  599. + erp->basic_rates >> 32);
  600. +
  601. + rt2x00pci_register_read(rt2x00dev, BKOFF_SLOT_CFG, &reg);
  602. + rt2x00_set_field32(&reg, BKOFF_SLOT_CFG_SLOT_TIME, erp->slot_time);
  603. + rt2x00_set_field32(&reg, BKOFF_SLOT_CFG_CC_DELAY_TIME, 2);
  604. + rt2x00pci_register_write(rt2x00dev, BKOFF_SLOT_CFG, reg);
  605. +
  606. + rt2x00pci_register_read(rt2x00dev, XIFS_TIME_CFG, &reg);
  607. + rt2x00_set_field32(&reg, XIFS_TIME_CFG_CCKM_SIFS_TIME, erp->sifs);
  608. + rt2x00_set_field32(&reg, XIFS_TIME_CFG_OFDM_SIFS_TIME, erp->sifs);
  609. + rt2x00_set_field32(&reg, XIFS_TIME_CFG_OFDM_XIFS_TIME, 4);
  610. + rt2x00_set_field32(&reg, XIFS_TIME_CFG_EIFS, erp->eifs);
  611. + rt2x00_set_field32(&reg, XIFS_TIME_CFG_BB_RXEND_ENABLE, 1);
  612. + rt2x00pci_register_write(rt2x00dev, XIFS_TIME_CFG, reg);
  613. +}
  614. +
  615. +static void rt2800pci_config_ant(struct rt2x00_dev *rt2x00dev,
  616. + struct antenna_setup *ant)
  617. +{
  618. + u16 eeprom;
  619. + u8 r1;
  620. + u8 r3;
  621. +
  622. + /*
  623. + * FIXME: Use requested antenna configuration.
  624. + */
  625. +
  626. + rt2x00_eeprom_read(rt2x00dev, EEPROM_ANTENNA, &eeprom);
  627. +
  628. + rt2800pci_bbp_read(rt2x00dev, 1, &r1);
  629. + rt2800pci_bbp_read(rt2x00dev, 3, &r3);
  630. +
  631. + /*
  632. + * Configure the TX antenna.
  633. + */
  634. + switch (rt2x00_get_field16(eeprom, EEPROM_ANTENNA_TXPATH)) {
  635. + case 1:
  636. + rt2x00_set_field8(&r1, BBP1_TX_ANTENNA, 0);
  637. + rt2x00_set_field8(&r3, BBP3_RX_ANTENNA, 0);
  638. + break;
  639. + case 2:
  640. + rt2x00_set_field8(&r1, BBP1_TX_ANTENNA, 16);
  641. + break;
  642. + case 3:
  643. + /* Do nothing */
  644. + break;
  645. + }
  646. +
  647. + /*
  648. + * Configure the RX antenna.
  649. + */
  650. + switch (rt2x00_get_field16(eeprom, EEPROM_ANTENNA_RXPATH)) {
  651. + case 1:
  652. + rt2x00_set_field8(&r3, BBP3_RX_ANTENNA, 0);
  653. + break;
  654. + case 2:
  655. + rt2x00_set_field8(&r3, BBP3_RX_ANTENNA, 1);
  656. + break;
  657. + case 3:
  658. + rt2x00_set_field8(&r3, BBP3_RX_ANTENNA, 2);
  659. + break;
  660. + }
  661. +
  662. + rt2800pci_bbp_write(rt2x00dev, 3, r3);
  663. + rt2800pci_bbp_write(rt2x00dev, 1, r1);
  664. +}
  665. +
  666. +static void rt2800pci_config_lna_gain(struct rt2x00_dev *rt2x00dev,
  667. + struct rt2x00lib_conf *libconf)
  668. +{
  669. + u16 eeprom;
  670. + short lna_gain;
  671. +
  672. + if (libconf->rf.channel <= 14) {
  673. + rt2x00_eeprom_read(rt2x00dev, EEPROM_LNA, &eeprom);
  674. + lna_gain = rt2x00_get_field16(eeprom, EEPROM_LNA_BG);
  675. + } else if (libconf->rf.channel <= 64) {
  676. + rt2x00_eeprom_read(rt2x00dev, EEPROM_LNA, &eeprom);
  677. + lna_gain = rt2x00_get_field16(eeprom, EEPROM_LNA_A0);
  678. + } else if (libconf->rf.channel <= 128) {
  679. + rt2x00_eeprom_read(rt2x00dev, EEPROM_RSSI_BG2, &eeprom);
  680. + lna_gain = rt2x00_get_field16(eeprom, EEPROM_RSSI_BG2_LNA_A1);
  681. + } else {
  682. + rt2x00_eeprom_read(rt2x00dev, EEPROM_RSSI_A2, &eeprom);
  683. + lna_gain = rt2x00_get_field16(eeprom, EEPROM_RSSI_A2_LNA_A2);
  684. + }
  685. +
  686. + rt2x00dev->lna_gain = lna_gain;
  687. +}
  688. +
  689. +static void rt2800pci_config_channel(struct rt2x00_dev *rt2x00dev,
  690. + struct rf_channel *rf,
  691. + struct channel_info *info)
  692. +{
  693. + u32 reg;
  694. + unsigned int tx_pin;
  695. + u16 eeprom;
  696. +
  697. + tx_pin = 0;
  698. + rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_G1_EN, 1);
  699. + rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_A0_EN, 1);
  700. + rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_G0_EN, 1);
  701. + rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_A1_EN, 1);
  702. + rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_G1_EN, 1);
  703. + rt2x00_set_field32(&tx_pin, TX_PIN_CFG_RFTR_EN, 1);
  704. + rt2x00_set_field32(&tx_pin, TX_PIN_CFG_TRSW_EN, 1);
  705. +
  706. + rt2x00_set_field32(&rf->rf4, RF4_FREQ_OFFSET, rt2x00dev->freq_offset);
  707. +
  708. + /*
  709. + * Determine antenna settings from EEPROM
  710. + */
  711. + rt2x00_eeprom_read(rt2x00dev, EEPROM_ANTENNA, &eeprom);
  712. + if (rt2x00_get_field16(eeprom, EEPROM_ANTENNA_TXPATH) == 1) {
  713. + rt2x00_set_field32(&rf->rf2, RF2_ANTENNA_TX1, 1);
  714. + /* Turn off unused PA or LNA when only 1T or 1R */
  715. + rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_A1_EN, 0);
  716. + rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_G1_EN, 0);
  717. + }
  718. +
  719. + if (rt2x00_get_field16(eeprom, EEPROM_ANTENNA_RXPATH) == 1) {
  720. + rt2x00_set_field32(&rf->rf2, RF2_ANTENNA_RX1, 1);
  721. + rt2x00_set_field32(&rf->rf2, RF2_ANTENNA_RX2, 1);
  722. + /* Turn off unused PA or LNA when only 1T or 1R */
  723. + rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_A1_EN, 0);
  724. + rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_G1_EN, 0);
  725. + } else if (rt2x00_get_field16(eeprom, EEPROM_ANTENNA_RXPATH) == 2)
  726. + rt2x00_set_field32(&rf->rf2, RF2_ANTENNA_RX2, 1);
  727. +
  728. + if (rf->channel > 14) {
  729. + /*
  730. + * When TX power is below 0, we should increase it by 7 to
  731. + * make it a positive value (Minumum value is -7).
  732. + * However this means that values between 0 and 7 have
  733. + * double meaning, and we should set a 7DBm boost flag.
  734. + */
  735. + rt2x00_set_field32(&rf->rf3, RF3_TXPOWER_A_7DBM_BOOST,
  736. + (info->tx_power1 >= 0));
  737. +
  738. + if (info->tx_power1 < 0)
  739. + info->tx_power1 += 7;
  740. +
  741. + rt2x00_set_field32(&rf->rf3, RF3_TXPOWER_A,
  742. + TXPOWER_A_TO_DEV(info->tx_power1));
  743. +
  744. + rt2x00_set_field32(&rf->rf4, RF4_TXPOWER_A_7DBM_BOOST,
  745. + (info->tx_power2 >= 0));
  746. +
  747. + if (info->tx_power2 < 0)
  748. + info->tx_power2 += 7;
  749. +
  750. + rt2x00_set_field32(&rf->rf4, RF4_TXPOWER_A,
  751. + TXPOWER_A_TO_DEV(info->tx_power2));
  752. +
  753. + rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_A0_EN, 1);
  754. + } else {
  755. + rt2x00_set_field32(&rf->rf3, RF3_TXPOWER_G,
  756. + TXPOWER_G_TO_DEV(info->tx_power1));
  757. + rt2x00_set_field32(&rf->rf4, RF4_TXPOWER_G,
  758. + TXPOWER_G_TO_DEV(info->tx_power2));
  759. +
  760. + rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_G0_EN, 1);
  761. + }
  762. +
  763. + rt2x00_set_field32(&rf->rf4, RF4_BW40,
  764. + test_bit(CONFIG_CHANNEL_HT40, &rt2x00dev->flags));
  765. +
  766. + rt2800pci_rf_write(rt2x00dev, 1, rf->rf1);
  767. + rt2800pci_rf_write(rt2x00dev, 2, rf->rf2);
  768. + rt2800pci_rf_write(rt2x00dev, 3, rf->rf3 & ~0x00000004);
  769. + rt2800pci_rf_write(rt2x00dev, 4, rf->rf4);
  770. +
  771. + udelay(200);
  772. +
  773. + rt2800pci_rf_write(rt2x00dev, 1, rf->rf1);
  774. + rt2800pci_rf_write(rt2x00dev, 2, rf->rf2);
  775. + rt2800pci_rf_write(rt2x00dev, 3, rf->rf3 | 0x00000004);
  776. + rt2800pci_rf_write(rt2x00dev, 4, rf->rf4);
  777. +
  778. + udelay(200);
  779. +
  780. + rt2800pci_rf_write(rt2x00dev, 1, rf->rf1);
  781. + rt2800pci_rf_write(rt2x00dev, 2, rf->rf2);
  782. + rt2800pci_rf_write(rt2x00dev, 3, rf->rf3 & ~0x00000004);
  783. + rt2800pci_rf_write(rt2x00dev, 4, rf->rf4);
  784. +
  785. + /*
  786. + * Change BBP settings
  787. + */
  788. + rt2800pci_bbp_write(rt2x00dev, 62, 0x37 - rt2x00dev->lna_gain);
  789. + rt2800pci_bbp_write(rt2x00dev, 63, 0x37 - rt2x00dev->lna_gain);
  790. + rt2800pci_bbp_write(rt2x00dev, 64, 0x37 - rt2x00dev->lna_gain);
  791. + rt2800pci_bbp_write(rt2x00dev, 86, 0);
  792. +
  793. + if (rf->channel <= 14) {
  794. + if (test_bit(CONFIG_EXTERNAL_LNA_BG, &rt2x00dev->flags)) {
  795. + rt2800pci_bbp_write(rt2x00dev, 82, 0x62);
  796. + rt2800pci_bbp_write(rt2x00dev, 75, 0x46);
  797. + } else {
  798. + rt2800pci_bbp_write(rt2x00dev, 82, 0x84);
  799. + rt2800pci_bbp_write(rt2x00dev, 75, 0x50);
  800. + }
  801. +
  802. + rt2x00pci_register_read(rt2x00dev, TX_BAND_CFG, &reg);
  803. + rt2x00_set_field32(&rf->rf3, TX_BAND_CFG_A, 0);
  804. + rt2x00_set_field32(&rf->rf3, TX_BAND_CFG_BG, 1);
  805. + rt2x00pci_register_write(rt2x00dev, TX_BAND_CFG, reg);
  806. + } else {
  807. + rt2800pci_bbp_write(rt2x00dev, 82, 0xf2);
  808. +
  809. + if (test_bit(CONFIG_EXTERNAL_LNA_A, &rt2x00dev->flags))
  810. + rt2800pci_bbp_write(rt2x00dev, 75, 0x46);
  811. + else
  812. + rt2800pci_bbp_write(rt2x00dev, 75, 0x50);
  813. +
  814. + rt2x00pci_register_read(rt2x00dev, TX_BAND_CFG, &reg);
  815. + rt2x00_set_field32(&rf->rf3, TX_BAND_CFG_A, 1);
  816. + rt2x00_set_field32(&rf->rf3, TX_BAND_CFG_BG, 0);
  817. + rt2x00pci_register_write(rt2x00dev, TX_BAND_CFG, reg);
  818. + }
  819. +
  820. + rt2x00pci_register_write(rt2x00dev, TX_PIN_CFG, tx_pin);
  821. +
  822. + msleep(1);
  823. +}
  824. +
  825. +static void rt2800pci_config_txpower(struct rt2x00_dev *rt2x00dev,
  826. + const int txpower)
  827. +{
  828. + u32 reg;
  829. + u32 value = TXPOWER_G_TO_DEV(txpower);
  830. + u8 r1;
  831. +
  832. + rt2800pci_bbp_read(rt2x00dev, 1, &r1);
  833. + rt2x00_set_field8(&reg, BBP1_TX_POWER, 0);
  834. + rt2800pci_bbp_write(rt2x00dev, 1, r1);
  835. +
  836. + rt2x00pci_register_read(rt2x00dev, TX_PWR_CFG_0, &reg);
  837. + rt2x00_set_field32(&reg, TX_PWR_CFG_0_1MBS, value);
  838. + rt2x00_set_field32(&reg, TX_PWR_CFG_0_2MBS, value);
  839. + rt2x00_set_field32(&reg, TX_PWR_CFG_0_55MBS, value);
  840. + rt2x00_set_field32(&reg, TX_PWR_CFG_0_11MBS, value);
  841. + rt2x00_set_field32(&reg, TX_PWR_CFG_0_6MBS, value);
  842. + rt2x00_set_field32(&reg, TX_PWR_CFG_0_9MBS, value);
  843. + rt2x00_set_field32(&reg, TX_PWR_CFG_0_12MBS, value);
  844. + rt2x00_set_field32(&reg, TX_PWR_CFG_0_18MBS, value);
  845. + rt2x00pci_register_write(rt2x00dev, TX_PWR_CFG_0, reg);
  846. +
  847. + rt2x00pci_register_read(rt2x00dev, TX_PWR_CFG_1, &reg);
  848. + rt2x00_set_field32(&reg, TX_PWR_CFG_1_24MBS, value);
  849. + rt2x00_set_field32(&reg, TX_PWR_CFG_1_36MBS, value);
  850. + rt2x00_set_field32(&reg, TX_PWR_CFG_1_48MBS, value);
  851. + rt2x00_set_field32(&reg, TX_PWR_CFG_1_54MBS, value);
  852. + rt2x00_set_field32(&reg, TX_PWR_CFG_1_MCS0, value);
  853. + rt2x00_set_field32(&reg, TX_PWR_CFG_1_MCS1, value);
  854. + rt2x00_set_field32(&reg, TX_PWR_CFG_1_MCS2, value);
  855. + rt2x00_set_field32(&reg, TX_PWR_CFG_1_MCS3, value);
  856. + rt2x00pci_register_write(rt2x00dev, TX_PWR_CFG_1, reg);
  857. +
  858. + rt2x00pci_register_read(rt2x00dev, TX_PWR_CFG_2, &reg);
  859. + rt2x00_set_field32(&reg, TX_PWR_CFG_2_MCS4, value);
  860. + rt2x00_set_field32(&reg, TX_PWR_CFG_2_MCS5, value);
  861. + rt2x00_set_field32(&reg, TX_PWR_CFG_2_MCS6, value);
  862. + rt2x00_set_field32(&reg, TX_PWR_CFG_2_MCS7, value);
  863. + rt2x00_set_field32(&reg, TX_PWR_CFG_2_MCS8, value);
  864. + rt2x00_set_field32(&reg, TX_PWR_CFG_2_MCS9, value);
  865. + rt2x00_set_field32(&reg, TX_PWR_CFG_2_MCS10, value);
  866. + rt2x00_set_field32(&reg, TX_PWR_CFG_2_MCS11, value);
  867. + rt2x00pci_register_write(rt2x00dev, TX_PWR_CFG_2, reg);
  868. +
  869. + rt2x00pci_register_read(rt2x00dev, TX_PWR_CFG_3, &reg);
  870. + rt2x00_set_field32(&reg, TX_PWR_CFG_3_MCS12, value);
  871. + rt2x00_set_field32(&reg, TX_PWR_CFG_3_MCS13, value);
  872. + rt2x00_set_field32(&reg, TX_PWR_CFG_3_MCS14, value);
  873. + rt2x00_set_field32(&reg, TX_PWR_CFG_3_MCS15, value);
  874. + rt2x00_set_field32(&reg, TX_PWR_CFG_3_UKNOWN1, value);
  875. + rt2x00_set_field32(&reg, TX_PWR_CFG_3_UKNOWN2, value);
  876. + rt2x00_set_field32(&reg, TX_PWR_CFG_3_UKNOWN3, value);
  877. + rt2x00_set_field32(&reg, TX_PWR_CFG_3_UKNOWN4, value);
  878. + rt2x00pci_register_write(rt2x00dev, TX_PWR_CFG_3, reg);
  879. +
  880. + rt2x00pci_register_read(rt2x00dev, TX_PWR_CFG_4, &reg);
  881. + rt2x00_set_field32(&reg, TX_PWR_CFG_4_UKNOWN5, value);
  882. + rt2x00_set_field32(&reg, TX_PWR_CFG_4_UKNOWN6, value);
  883. + rt2x00_set_field32(&reg, TX_PWR_CFG_4_UKNOWN7, value);
  884. + rt2x00_set_field32(&reg, TX_PWR_CFG_4_UKNOWN8, value);
  885. + rt2x00pci_register_write(rt2x00dev, TX_PWR_CFG_4, reg);
  886. +}
  887. +
  888. +static void rt2800pci_config_retry_limit(struct rt2x00_dev *rt2x00dev,
  889. + struct rt2x00lib_conf *libconf)
  890. +{
  891. + u32 reg;
  892. +
  893. + rt2x00pci_register_read(rt2x00dev, TX_RTY_CFG, &reg);
  894. + rt2x00_set_field32(&reg, TX_RTY_CFG_SHORT_RTY_LIMIT,
  895. + libconf->conf->short_frame_max_tx_count);
  896. + rt2x00_set_field32(&reg, TX_RTY_CFG_LONG_RTY_LIMIT,
  897. + libconf->conf->long_frame_max_tx_count);
  898. + rt2x00_set_field32(&reg, TX_RTY_CFG_LONG_RTY_THRE, 2000);
  899. + rt2x00_set_field32(&reg, TX_RTY_CFG_NON_AGG_RTY_MODE, 0);
  900. + rt2x00_set_field32(&reg, TX_RTY_CFG_AGG_RTY_MODE, 0);
  901. + rt2x00_set_field32(&reg, TX_RTY_CFG_TX_AUTO_FB_ENABLE, 1);
  902. + rt2x00pci_register_write(rt2x00dev, TX_RTY_CFG, reg);
  903. +}
  904. +
  905. +static void rt2800pci_config_duration(struct rt2x00_dev *rt2x00dev,
  906. + struct rt2x00lib_conf *libconf)
  907. +{
  908. + u32 reg;
  909. +
  910. + rt2x00pci_register_read(rt2x00dev, BCN_TIME_CFG, &reg);
  911. + rt2x00_set_field32(&reg, BCN_TIME_CFG_BEACON_INTERVAL,
  912. + libconf->conf->beacon_int * 16);
  913. + rt2x00pci_register_write(rt2x00dev, BCN_TIME_CFG, reg);
  914. +}
  915. +
  916. +static void rt2800pci_config_ps(struct rt2x00_dev *rt2x00dev,
  917. + struct rt2x00lib_conf *libconf)
  918. +{
  919. + enum dev_state state =
  920. + (libconf->conf->flags & IEEE80211_CONF_PS) ?
  921. + STATE_SLEEP : STATE_AWAKE;
  922. + u32 reg;
  923. +
  924. + if (state == STATE_SLEEP) {
  925. + rt2x00pci_register_write(rt2x00dev, AUTOWAKEUP_CFG, 0);
  926. +
  927. + rt2x00pci_register_read(rt2x00dev, AUTOWAKEUP_CFG, &reg);
  928. + rt2x00_set_field32(&reg, AUTOWAKEUP_CFG_AUTO_LEAD_TIME, 5);
  929. + rt2x00_set_field32(&reg, AUTOWAKEUP_CFG_TBCN_BEFORE_WAKE,
  930. + libconf->conf->listen_interval - 1);
  931. + rt2x00_set_field32(&reg, AUTOWAKEUP_CFG_AUTOWAKE, 1);
  932. + rt2x00pci_register_write(rt2x00dev, AUTOWAKEUP_CFG, reg);
  933. +
  934. + rt2800pci_mcu_request(rt2x00dev, MCU_SLEEP, 0xff, 0, 0);
  935. + } else {
  936. + rt2800pci_mcu_request(rt2x00dev, MCU_WAKEUP, 0xff, 0, 0);
  937. +
  938. + rt2x00pci_register_read(rt2x00dev, AUTOWAKEUP_CFG, &reg);
  939. + rt2x00_set_field32(&reg, AUTOWAKEUP_CFG_AUTO_LEAD_TIME, 0);
  940. + rt2x00_set_field32(&reg, AUTOWAKEUP_CFG_TBCN_BEFORE_WAKE, 0);
  941. + rt2x00_set_field32(&reg, AUTOWAKEUP_CFG_AUTOWAKE, 0);
  942. + rt2x00pci_register_write(rt2x00dev, AUTOWAKEUP_CFG, reg);
  943. + }
  944. +}
  945. +
  946. +static void rt2800pci_config(struct rt2x00_dev *rt2x00dev,
  947. + struct rt2x00lib_conf *libconf,
  948. + const unsigned int flags)
  949. +{
  950. + /* Always recalculate LNA gain before changing configuration */
  951. + rt2800pci_config_lna_gain(rt2x00dev, libconf);
  952. +
  953. + if (flags & IEEE80211_CONF_CHANGE_CHANNEL)
  954. + rt2800pci_config_channel(rt2x00dev, &libconf->rf,
  955. + &libconf->channel);
  956. + if (flags & IEEE80211_CONF_CHANGE_POWER)
  957. + rt2800pci_config_txpower(rt2x00dev, libconf->conf->power_level);
  958. + if (flags & IEEE80211_CONF_CHANGE_RETRY_LIMITS)
  959. + rt2800pci_config_retry_limit(rt2x00dev, libconf);
  960. + if (flags & IEEE80211_CONF_CHANGE_BEACON_INTERVAL)
  961. + rt2800pci_config_duration(rt2x00dev, libconf);
  962. + if (flags & IEEE80211_CONF_CHANGE_PS)
  963. + rt2800pci_config_ps(rt2x00dev, libconf);
  964. +}
  965. +
  966. +/*
  967. + * Link tuning
  968. + */
  969. +static void rt2800pci_link_stats(struct rt2x00_dev *rt2x00dev,
  970. + struct link_qual *qual)
  971. +{
  972. + u32 reg;
  973. +
  974. + /*
  975. + * Update FCS error count from register.
  976. + */
  977. + rt2x00pci_register_read(rt2x00dev, RX_STA_CNT0, &reg);
  978. + qual->rx_failed = rt2x00_get_field32(reg, RX_STA_CNT0_CRC_ERR);
  979. +
  980. + /*
  981. + * Update False CCA count from register.
  982. + */
  983. + rt2x00pci_register_read(rt2x00dev, RX_STA_CNT1, &reg);
  984. + qual->false_cca = rt2x00_get_field32(reg, RX_STA_CNT1_FALSE_CCA);
  985. +}
  986. +
  987. +static u8 rt2800pci_get_default_vgc(struct rt2x00_dev *rt2x00dev)
  988. +{
  989. + if (rt2x00dev->curr_band == IEEE80211_BAND_2GHZ)
  990. + return 0x2e + rt2x00dev->lna_gain;
  991. +
  992. + if (!test_bit(CONFIG_CHANNEL_HT40, &rt2x00dev->flags))
  993. + return 0x32 + (rt2x00dev->lna_gain * 5) / 3;
  994. + else
  995. + return 0x3a + (rt2x00dev->lna_gain * 5) / 3;
  996. +}
  997. +
  998. +static inline void rt2800pci_set_vgc(struct rt2x00_dev *rt2x00dev,
  999. + struct link_qual *qual, u8 vgc_level)
  1000. +{
  1001. + if (qual->vgc_level != vgc_level) {
  1002. + rt2800pci_bbp_write(rt2x00dev, 66, vgc_level);
  1003. + qual->vgc_level = vgc_level;
  1004. + qual->vgc_level_reg = vgc_level;
  1005. + }
  1006. +}
  1007. +
  1008. +static void rt2800pci_reset_tuner(struct rt2x00_dev *rt2x00dev,
  1009. + struct link_qual *qual)
  1010. +{
  1011. + rt2800pci_set_vgc(rt2x00dev, qual,
  1012. + rt2800pci_get_default_vgc(rt2x00dev));
  1013. +}
  1014. +
  1015. +static void rt2800pci_link_tuner(struct rt2x00_dev *rt2x00dev,
  1016. + struct link_qual *qual, const u32 count)
  1017. +{
  1018. + if (rt2x00_rev(&rt2x00dev->chip) == RT2860C_VERSION)
  1019. + return;
  1020. +
  1021. + /*
  1022. + * When RSSI is better then -80 increase VGC level with 0x10
  1023. + */
  1024. + rt2800pci_set_vgc(rt2x00dev, qual,
  1025. + rt2800pci_get_default_vgc(rt2x00dev) +
  1026. + ((qual->rssi > -80) * 0x10));
  1027. +}
  1028. +
  1029. +/*
  1030. + * Firmware functions
  1031. + */
  1032. +static char *rt2800pci_get_firmware_name(struct rt2x00_dev *rt2x00dev)
  1033. +{
  1034. + return FIRMWARE_RT2860;
  1035. +}
  1036. +
  1037. +static u16 rt2800pci_get_firmware_crc(const void *data, const size_t len)
  1038. +{
  1039. + u16 crc;
  1040. +
  1041. + /*
  1042. + * Use the crc ccitt algorithm.
  1043. + * This will return the same value as the legacy driver which
  1044. + * used bit ordering reversion on the both the firmware bytes
  1045. + * before input input as well as on the final output.
  1046. + * Obviously using crc ccitt directly is much more efficient.
  1047. + * The last 2 bytes in the firmware array are the crc checksum itself,
  1048. + * this means that we should never pass those 2 bytes to the crc
  1049. + * algorithm.
  1050. + */
  1051. + crc = crc_ccitt(~0, data, len - 2);
  1052. +
  1053. + /*
  1054. + * There is a small difference between the crc-itu-t + bitrev and
  1055. + * the crc-ccitt crc calculation. In the latter method the 2 bytes
  1056. + * will be swapped, use swab16 to convert the crc to the correct
  1057. + * value.
  1058. + */
  1059. + return swab16(crc);
  1060. +}
  1061. +
  1062. +static int rt2800pci_load_firmware(struct rt2x00_dev *rt2x00dev,
  1063. + const void *data, const size_t len)
  1064. +{
  1065. + unsigned int i;
  1066. + u32 reg;
  1067. +
  1068. + if (len != 8192) {
  1069. + ERROR(rt2x00dev, "Invalid firmware file length (len=%zu)\n", len);
  1070. + return -ENOENT;
  1071. + }
  1072. +
  1073. + /*
  1074. + * Wait for stable hardware.
  1075. + */
  1076. + for (i = 0; i < REGISTER_BUSY_COUNT; i++) {
  1077. + rt2x00pci_register_read(rt2x00dev, MAC_CSR0, &reg);
  1078. + if (reg && reg != ~0)
  1079. + break;
  1080. + msleep(1);
  1081. + }
  1082. +
  1083. + if (i == REGISTER_BUSY_COUNT) {
  1084. + ERROR(rt2x00dev, "Unstable hardware.\n");
  1085. + return -EBUSY;
  1086. + }
  1087. +
  1088. + rt2x00pci_register_write(rt2x00dev, PWR_PIN_CFG, 0x00000002);
  1089. + rt2x00pci_register_write(rt2x00dev, AUTOWAKEUP_CFG, 0x00000000);
  1090. +
  1091. + /*
  1092. + * Disable DMA, will be reenabled later when enabling
  1093. + * the radio.
  1094. + */
  1095. + rt2x00pci_register_read(rt2x00dev, WPDMA_GLO_CFG, &reg);
  1096. + rt2x00_set_field32(&reg, WPDMA_GLO_CFG_ENABLE_TX_DMA, 0);
  1097. + rt2x00_set_field32(&reg, WPDMA_GLO_CFG_TX_DMA_BUSY, 0);
  1098. + rt2x00_set_field32(&reg, WPDMA_GLO_CFG_ENABLE_RX_DMA, 0);
  1099. + rt2x00_set_field32(&reg, WPDMA_GLO_CFG_RX_DMA_BUSY, 0);
  1100. + rt2x00_set_field32(&reg, WPDMA_GLO_CFG_TX_WRITEBACK_DONE, 1);
  1101. + rt2x00pci_register_write(rt2x00dev, WPDMA_GLO_CFG, reg);
  1102. +
  1103. + /*
  1104. + * enable Host program ram write selection
  1105. + */
  1106. + reg = 0;
  1107. + rt2x00_set_field32(&reg, PBF_SYS_CTRL_HOST_RAM_WRITE, 1);
  1108. + rt2x00pci_register_write(rt2x00dev, PBF_SYS_CTRL, reg);
  1109. +
  1110. + /*
  1111. + * Write firmware to device.
  1112. + */
  1113. + rt2x00pci_register_multiwrite(rt2x00dev, FIRMWARE_IMAGE_BASE,
  1114. + data, len);
  1115. +
  1116. + rt2x00pci_register_write(rt2x00dev, PBF_SYS_CTRL, 0x00000);
  1117. + rt2x00pci_register_write(rt2x00dev, PBF_SYS_CTRL, 0x00001);
  1118. +
  1119. + /*
  1120. + * Wait for device to stabilize.
  1121. + */
  1122. + for (i = 0; i < REGISTER_BUSY_COUNT; i++) {
  1123. + rt2x00pci_register_read(rt2x00dev, PBF_SYS_CTRL, &reg);
  1124. + if (rt2x00_get_field32(reg, PBF_SYS_CTRL_READY))
  1125. + break;
  1126. + msleep(1);
  1127. + }
  1128. +
  1129. + if (i == REGISTER_BUSY_COUNT) {
  1130. + ERROR(rt2x00dev, "PBF system register not ready.\n");
  1131. + return -EBUSY;
  1132. + }
  1133. +
  1134. + /*
  1135. + * Disable interrupts
  1136. + */
  1137. + rt2x00dev->ops->lib->set_device_state(rt2x00dev, STATE_RADIO_IRQ_OFF);
  1138. +
  1139. + /*
  1140. + * Initialize BBP R/W access agent
  1141. + */
  1142. + rt2x00pci_register_write(rt2x00dev, H2M_BBP_AGENT, 0);
  1143. + rt2x00pci_register_write(rt2x00dev, H2M_MAILBOX_CSR, 0);
  1144. +
  1145. + return 0;
  1146. +}
  1147. +
  1148. +/*
  1149. + * Initialization functions.
  1150. + */
  1151. +static bool rt2800pci_get_entry_state(struct queue_entry *entry)
  1152. +{
  1153. + struct queue_entry_priv_pci *entry_priv = entry->priv_data;
  1154. + u32 word;
  1155. +
  1156. + if (entry->queue->qid == QID_RX) {
  1157. + rt2x00_desc_read(entry_priv->desc, 1, &word);
  1158. +
  1159. + return (!rt2x00_get_field32(word, RXD_W1_DMA_DONE));
  1160. + } else {
  1161. + rt2x00_desc_read(entry_priv->desc, 1, &word);
  1162. +
  1163. + return (!rt2x00_get_field32(word, TXD_W1_DMA_DONE));
  1164. + }
  1165. +}
  1166. +
  1167. +static void rt2800pci_clear_entry(struct queue_entry *entry)
  1168. +{
  1169. + struct queue_entry_priv_pci *entry_priv = entry->priv_data;
  1170. + struct skb_frame_desc *skbdesc = get_skb_frame_desc(entry->skb);
  1171. + u32 word;
  1172. +
  1173. + if (entry->queue->qid == QID_RX) {
  1174. + rt2x00_desc_read(entry_priv->desc, 0, &word);
  1175. + rt2x00_set_field32(&word, RXD_W0_SDP0, skbdesc->skb_dma);
  1176. + rt2x00_desc_write(entry_priv->desc, 0, word);
  1177. +
  1178. + rt2x00_desc_read(entry_priv->desc, 1, &word);
  1179. + rt2x00_set_field32(&word, RXD_W1_DMA_DONE, 0);
  1180. + rt2x00_desc_write(entry_priv->desc, 1, word);
  1181. + } else {
  1182. + rt2x00_desc_read(entry_priv->desc, 1, &word);
  1183. + rt2x00_set_field32(&word, TXD_W1_DMA_DONE, 1);
  1184. + rt2x00_desc_write(entry_priv->desc, 1, word);
  1185. + }
  1186. +}
  1187. +
  1188. +static int rt2800pci_init_queues(struct rt2x00_dev *rt2x00dev)
  1189. +{
  1190. + struct queue_entry_priv_pci *entry_priv;
  1191. + u32 reg;
  1192. +
  1193. + /*
  1194. + * Initialize registers.
  1195. + */
  1196. + entry_priv = rt2x00dev->tx[0].entries[0].priv_data;
  1197. + rt2x00pci_register_write(rt2x00dev, TX_BASE_PTR0, entry_priv->desc_dma);
  1198. + rt2x00pci_register_write(rt2x00dev, TX_MAX_CNT0, rt2x00dev->tx[0].limit);
  1199. + rt2x00pci_register_write(rt2x00dev, TX_CTX_IDX0, 0);
  1200. +
  1201. + entry_priv = rt2x00dev->tx[1].entries[0].priv_data;
  1202. + rt2x00pci_register_write(rt2x00dev, TX_BASE_PTR1, entry_priv->desc_dma);
  1203. + rt2x00pci_register_write(rt2x00dev, TX_MAX_CNT1, rt2x00dev->tx[1].limit);
  1204. + rt2x00pci_register_write(rt2x00dev, TX_CTX_IDX1, 0);
  1205. +
  1206. + entry_priv = rt2x00dev->tx[2].entries[0].priv_data;
  1207. + rt2x00pci_register_write(rt2x00dev, TX_BASE_PTR2, entry_priv->desc_dma);
  1208. + rt2x00pci_register_write(rt2x00dev, TX_MAX_CNT2, rt2x00dev->tx[2].limit);
  1209. + rt2x00pci_register_write(rt2x00dev, TX_CTX_IDX2, 0);
  1210. +
  1211. + entry_priv = rt2x00dev->tx[3].entries[0].priv_data;
  1212. + rt2x00pci_register_write(rt2x00dev, TX_BASE_PTR3, entry_priv->desc_dma);
  1213. + rt2x00pci_register_write(rt2x00dev, TX_MAX_CNT3, rt2x00dev->tx[3].limit);
  1214. + rt2x00pci_register_write(rt2x00dev, TX_CTX_IDX3, 0);
  1215. +
  1216. + entry_priv = rt2x00dev->rx->entries[0].priv_data;
  1217. + rt2x00pci_register_write(rt2x00dev, RX_BASE_PTR, entry_priv->desc_dma);
  1218. + rt2x00pci_register_write(rt2x00dev, RX_MAX_CNT, rt2x00dev->rx[0].limit);
  1219. + rt2x00pci_register_write(rt2x00dev, RX_CRX_IDX, 0);
  1220. +
  1221. + /*
  1222. + * Enable global DMA configuration
  1223. + */
  1224. + rt2x00pci_register_read(rt2x00dev, WPDMA_GLO_CFG, &reg);
  1225. + rt2x00_set_field32(&reg, WPDMA_GLO_CFG_ENABLE_TX_DMA, 0);
  1226. + rt2x00_set_field32(&reg, WPDMA_GLO_CFG_ENABLE_RX_DMA, 0);
  1227. + rt2x00_set_field32(&reg, WPDMA_GLO_CFG_TX_WRITEBACK_DONE, 1);
  1228. + rt2x00pci_register_write(rt2x00dev, WPDMA_GLO_CFG, reg);
  1229. +
  1230. + rt2x00pci_register_write(rt2x00dev, DELAY_INT_CFG, 0);
  1231. +
  1232. + return 0;
  1233. +}
  1234. +
  1235. +static int rt2800pci_init_registers(struct rt2x00_dev *rt2x00dev)
  1236. +{
  1237. + u32 reg;
  1238. + unsigned int i;
  1239. +
  1240. + rt2x00pci_register_read(rt2x00dev, WPDMA_RST_IDX, &reg);
  1241. + rt2x00_set_field32(&reg, WPDMA_RST_IDX_DTX_IDX0, 1);
  1242. + rt2x00_set_field32(&reg, WPDMA_RST_IDX_DTX_IDX1, 1);
  1243. + rt2x00_set_field32(&reg, WPDMA_RST_IDX_DTX_IDX2, 1);
  1244. + rt2x00_set_field32(&reg, WPDMA_RST_IDX_DTX_IDX3, 1);
  1245. + rt2x00_set_field32(&reg, WPDMA_RST_IDX_DTX_IDX4, 1);
  1246. + rt2x00_set_field32(&reg, WPDMA_RST_IDX_DTX_IDX5, 1);
  1247. + rt2x00_set_field32(&reg, WPDMA_RST_IDX_DRX_IDX0, 1);
  1248. + rt2x00pci_register_write(rt2x00dev, WPDMA_RST_IDX, reg);
  1249. +
  1250. + rt2x00pci_register_write(rt2x00dev, PBF_SYS_CTRL, 0x00000e1f);
  1251. + rt2x00pci_register_write(rt2x00dev, PBF_SYS_CTRL, 0x00000e00);
  1252. +
  1253. + rt2x00pci_register_write(rt2x00dev, PWR_PIN_CFG, 0x00000003);
  1254. +
  1255. + rt2x00pci_register_read(rt2x00dev, MAC_SYS_CTRL, &reg);
  1256. + rt2x00_set_field32(&reg, MAC_SYS_CTRL_RESET_CSR, 1);
  1257. + rt2x00_set_field32(&reg, MAC_SYS_CTRL_RESET_BBP, 1);
  1258. + rt2x00pci_register_write(rt2x00dev, MAC_SYS_CTRL, reg);
  1259. +
  1260. + rt2x00pci_register_write(rt2x00dev, MAC_SYS_CTRL, 0x00000000);
  1261. +
  1262. + rt2x00pci_register_read(rt2x00dev, BCN_OFFSET0, &reg);
  1263. + rt2x00_set_field32(&reg, BCN_OFFSET0_BCN0, 0xe0); /* 0x3800 */
  1264. + rt2x00_set_field32(&reg, BCN_OFFSET0_BCN1, 0xe8); /* 0x3a00 */
  1265. + rt2x00_set_field32(&reg, BCN_OFFSET0_BCN2, 0xf0); /* 0x3c00 */
  1266. + rt2x00_set_field32(&reg, BCN_OFFSET0_BCN3, 0xf8); /* 0x3e00 */
  1267. + rt2x00pci_register_write(rt2x00dev, BCN_OFFSET0, reg);
  1268. +
  1269. + rt2x00pci_register_read(rt2x00dev, BCN_OFFSET1, &reg);
  1270. + rt2x00_set_field32(&reg, BCN_OFFSET1_BCN4, 0xc8); /* 0x3200 */
  1271. + rt2x00_set_field32(&reg, BCN_OFFSET1_BCN5, 0xd0); /* 0x3400 */
  1272. + rt2x00_set_field32(&reg, BCN_OFFSET1_BCN6, 0x77); /* 0x1dc0 */
  1273. + rt2x00_set_field32(&reg, BCN_OFFSET1_BCN7, 0x6f); /* 0x1bc0 */
  1274. + rt2x00pci_register_write(rt2x00dev, BCN_OFFSET1, reg);
  1275. +
  1276. + rt2x00pci_register_write(rt2x00dev, LEGACY_BASIC_RATE, 0x0000013f);
  1277. + rt2x00pci_register_write(rt2x00dev, HT_BASIC_RATE, 0x00008003);
  1278. +
  1279. + rt2x00pci_register_write(rt2x00dev, MAC_SYS_CTRL, 0x00000000);
  1280. +
  1281. + rt2x00pci_register_read(rt2x00dev, BCN_TIME_CFG, &reg);
  1282. + rt2x00_set_field32(&reg, BCN_TIME_CFG_BEACON_INTERVAL, 0);
  1283. + rt2x00_set_field32(&reg, BCN_TIME_CFG_TSF_TICKING, 0);
  1284. + rt2x00_set_field32(&reg, BCN_TIME_CFG_TSF_SYNC, 0);
  1285. + rt2x00_set_field32(&reg, BCN_TIME_CFG_TBTT_ENABLE, 0);
  1286. + rt2x00_set_field32(&reg, BCN_TIME_CFG_BEACON_GEN, 0);
  1287. + rt2x00_set_field32(&reg, BCN_TIME_CFG_TX_TIME_COMPENSATE, 0);
  1288. + rt2x00pci_register_write(rt2x00dev, BCN_TIME_CFG, reg);
  1289. +
  1290. + rt2x00pci_register_write(rt2x00dev, TX_SW_CFG0, 0x00040a06);
  1291. + rt2x00pci_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606);
  1292. +
  1293. + rt2x00pci_register_read(rt2x00dev, TX_LINK_CFG, &reg);
  1294. + rt2x00_set_field32(&reg, TX_LINK_CFG_REMOTE_MFB_LIFETIME, 32);
  1295. + rt2x00_set_field32(&reg, TX_LINK_CFG_MFB_ENABLE, 0);
  1296. + rt2x00_set_field32(&reg, TX_LINK_CFG_REMOTE_UMFS_ENABLE, 0);
  1297. + rt2x00_set_field32(&reg, TX_LINK_CFG_TX_MRQ_EN, 0);
  1298. + rt2x00_set_field32(&reg, TX_LINK_CFG_TX_RDG_EN, 0);
  1299. + rt2x00_set_field32(&reg, TX_LINK_CFG_TX_CF_ACK_EN, 1);
  1300. + rt2x00_set_field32(&reg, TX_LINK_CFG_REMOTE_MFB, 0);
  1301. + rt2x00_set_field32(&reg, TX_LINK_CFG_REMOTE_MFS, 0);
  1302. + rt2x00pci_register_write(rt2x00dev, TX_LINK_CFG, reg);
  1303. +
  1304. + rt2x00pci_register_read(rt2x00dev, TX_TIMEOUT_CFG, &reg);
  1305. + rt2x00_set_field32(&reg, TX_TIMEOUT_CFG_MPDU_LIFETIME, 9);
  1306. + rt2x00_set_field32(&reg, TX_TIMEOUT_CFG_TX_OP_TIMEOUT, 10);
  1307. + rt2x00pci_register_write(rt2x00dev, TX_TIMEOUT_CFG, reg);
  1308. +
  1309. + rt2x00pci_register_read(rt2x00dev, MAX_LEN_CFG, &reg);
  1310. + rt2x00_set_field32(&reg, MAX_LEN_CFG_MAX_MPDU, AGGREGATION_SIZE);
  1311. + if (rt2x00_rev(&rt2x00dev->chip) >= RT2880E_VERSION &&
  1312. + rt2x00_rev(&rt2x00dev->chip) < RT3070_VERSION)
  1313. + rt2x00_set_field32(&reg, MAX_LEN_CFG_MAX_PSDU, 2);
  1314. + else
  1315. + rt2x00_set_field32(&reg, MAX_LEN_CFG_MAX_PSDU, 1);
  1316. + rt2x00_set_field32(&reg, MAX_LEN_CFG_MIN_PSDU, 0);
  1317. + rt2x00_set_field32(&reg, MAX_LEN_CFG_MIN_MPDU, 0);
  1318. + rt2x00pci_register_write(rt2x00dev, MAX_LEN_CFG, reg);
  1319. +
  1320. + rt2x00pci_register_write(rt2x00dev, PBF_MAX_PCNT, 0x1f3fbf9f);
  1321. +
  1322. + rt2x00pci_register_read(rt2x00dev, AUTO_RSP_CFG, &reg);
  1323. + rt2x00_set_field32(&reg, AUTO_RSP_CFG_AUTORESPONDER, 1);
  1324. + rt2x00_set_field32(&reg, AUTO_RSP_CFG_CTS_40_MMODE, 0);
  1325. + rt2x00_set_field32(&reg, AUTO_RSP_CFG_CTS_40_MREF, 0);
  1326. + rt2x00_set_field32(&reg, AUTO_RSP_CFG_DUAL_CTS_EN, 0);
  1327. + rt2x00_set_field32(&reg, AUTO_RSP_CFG_ACK_CTS_PSM_BIT, 0);
  1328. + rt2x00pci_register_write(rt2x00dev, AUTO_RSP_CFG, reg);
  1329. +
  1330. + rt2x00pci_register_read(rt2x00dev, CCK_PROT_CFG, &reg);
  1331. + rt2x00_set_field32(&reg, CCK_PROT_CFG_PROTECT_RATE, 3);
  1332. + rt2x00_set_field32(&reg, CCK_PROT_CFG_PROTECT_CTRL, 0);
  1333. + rt2x00_set_field32(&reg, CCK_PROT_CFG_PROTECT_NAV, 1);
  1334. + rt2x00_set_field32(&reg, CCK_PROT_CFG_TX_OP_ALLOW_CCK, 1);
  1335. + rt2x00_set_field32(&reg, CCK_PROT_CFG_TX_OP_ALLOW_OFDM, 1);
  1336. + rt2x00_set_field32(&reg, CCK_PROT_CFG_TX_OP_ALLOW_MM20, 1);
  1337. + rt2x00_set_field32(&reg, CCK_PROT_CFG_TX_OP_ALLOW_MM40, 0);
  1338. + rt2x00_set_field32(&reg, CCK_PROT_CFG_TX_OP_ALLOW_GF20, 1);
  1339. + rt2x00_set_field32(&reg, CCK_PROT_CFG_TX_OP_ALLOW_GF40, 1);
  1340. + rt2x00pci_register_write(rt2x00dev, CCK_PROT_CFG, reg);
  1341. +
  1342. + rt2x00pci_register_read(rt2x00dev, OFDM_PROT_CFG, &reg);
  1343. + rt2x00_set_field32(&reg, OFDM_PROT_CFG_PROTECT_RATE, 3);
  1344. + rt2x00_set_field32(&reg, OFDM_PROT_CFG_PROTECT_CTRL, 0);
  1345. + rt2x00_set_field32(&reg, OFDM_PROT_CFG_PROTECT_NAV, 1);
  1346. + rt2x00_set_field32(&reg, OFDM_PROT_CFG_TX_OP_ALLOW_CCK, 1);
  1347. + rt2x00_set_field32(&reg, OFDM_PROT_CFG_TX_OP_ALLOW_OFDM, 1);
  1348. + rt2x00_set_field32(&reg, OFDM_PROT_CFG_TX_OP_ALLOW_MM20, 1);
  1349. + rt2x00_set_field32(&reg, OFDM_PROT_CFG_TX_OP_ALLOW_MM40, 0);
  1350. + rt2x00_set_field32(&reg, OFDM_PROT_CFG_TX_OP_ALLOW_GF20, 1);
  1351. + rt2x00_set_field32(&reg, OFDM_PROT_CFG_TX_OP_ALLOW_GF40, 1);
  1352. + rt2x00pci_register_write(rt2x00dev, OFDM_PROT_CFG, reg);
  1353. +
  1354. + rt2x00pci_register_read(rt2x00dev, MM20_PROT_CFG, &reg);
  1355. + rt2x00_set_field32(&reg, MM20_PROT_CFG_PROTECT_RATE, 0x4004);
  1356. + rt2x00_set_field32(&reg, MM20_PROT_CFG_PROTECT_CTRL, 0);
  1357. + rt2x00_set_field32(&reg, MM20_PROT_CFG_PROTECT_NAV, 1);
  1358. + rt2x00_set_field32(&reg, MM20_PROT_CFG_TX_OP_ALLOW_CCK, 1);
  1359. + rt2x00_set_field32(&reg, MM20_PROT_CFG_TX_OP_ALLOW_OFDM, 1);
  1360. + rt2x00_set_field32(&reg, MM20_PROT_CFG_TX_OP_ALLOW_MM20, 1);
  1361. + rt2x00_set_field32(&reg, MM20_PROT_CFG_TX_OP_ALLOW_MM40, 0);
  1362. + rt2x00_set_field32(&reg, MM20_PROT_CFG_TX_OP_ALLOW_GF20, 1);
  1363. + rt2x00_set_field32(&reg, MM20_PROT_CFG_TX_OP_ALLOW_GF40, 0);
  1364. + rt2x00pci_register_write(rt2x00dev, MM20_PROT_CFG, reg);
  1365. +
  1366. + rt2x00pci_register_read(rt2x00dev, MM40_PROT_CFG, &reg);
  1367. + rt2x00_set_field32(&reg, MM40_PROT_CFG_PROTECT_RATE, 0x4084);
  1368. + rt2x00_set_field32(&reg, MM40_PROT_CFG_PROTECT_CTRL, 0);
  1369. + rt2x00_set_field32(&reg, MM40_PROT_CFG_PROTECT_NAV, 1);
  1370. + rt2x00_set_field32(&reg, MM40_PROT_CFG_TX_OP_ALLOW_CCK, 1);
  1371. + rt2x00_set_field32(&reg, MM40_PROT_CFG_TX_OP_ALLOW_OFDM, 1);
  1372. + rt2x00_set_field32(&reg, MM40_PROT_CFG_TX_OP_ALLOW_MM20, 1);
  1373. + rt2x00_set_field32(&reg, MM40_PROT_CFG_TX_OP_ALLOW_MM40, 1);
  1374. + rt2x00_set_field32(&reg, MM40_PROT_CFG_TX_OP_ALLOW_GF20, 1);
  1375. + rt2x00_set_field32(&reg, MM40_PROT_CFG_TX_OP_ALLOW_GF40, 1);
  1376. + rt2x00pci_register_write(rt2x00dev, MM40_PROT_CFG, reg);
  1377. +
  1378. + rt2x00pci_register_read(rt2x00dev, GF20_PROT_CFG, &reg);
  1379. + rt2x00_set_field32(&reg, GF20_PROT_CFG_PROTECT_RATE, 0x4004);
  1380. + rt2x00_set_field32(&reg, GF20_PROT_CFG_PROTECT_CTRL, 0);
  1381. + rt2x00_set_field32(&reg, GF20_PROT_CFG_PROTECT_NAV, 1);
  1382. + rt2x00_set_field32(&reg, GF20_PROT_CFG_TX_OP_ALLOW_CCK, 1);
  1383. + rt2x00_set_field32(&reg, GF20_PROT_CFG_TX_OP_ALLOW_OFDM, 1);
  1384. + rt2x00_set_field32(&reg, GF20_PROT_CFG_TX_OP_ALLOW_MM20, 1);
  1385. + rt2x00_set_field32(&reg, GF20_PROT_CFG_TX_OP_ALLOW_MM40, 0);
  1386. + rt2x00_set_field32(&reg, GF20_PROT_CFG_TX_OP_ALLOW_GF20, 1);
  1387. + rt2x00_set_field32(&reg, GF20_PROT_CFG_TX_OP_ALLOW_GF40, 0);
  1388. + rt2x00pci_register_write(rt2x00dev, GF20_PROT_CFG, reg);
  1389. +
  1390. + rt2x00pci_register_read(rt2x00dev, GF40_PROT_CFG, &reg);
  1391. + rt2x00_set_field32(&reg, GF40_PROT_CFG_PROTECT_RATE, 0x4084);
  1392. + rt2x00_set_field32(&reg, GF40_PROT_CFG_PROTECT_CTRL, 0);
  1393. + rt2x00_set_field32(&reg, GF40_PROT_CFG_PROTECT_NAV, 1);
  1394. + rt2x00_set_field32(&reg, GF40_PROT_CFG_TX_OP_ALLOW_CCK, 1);
  1395. + rt2x00_set_field32(&reg, GF40_PROT_CFG_TX_OP_ALLOW_OFDM, 1);
  1396. + rt2x00_set_field32(&reg, GF40_PROT_CFG_TX_OP_ALLOW_MM20, 1);
  1397. + rt2x00_set_field32(&reg, GF40_PROT_CFG_TX_OP_ALLOW_MM40, 1);
  1398. + rt2x00_set_field32(&reg, GF40_PROT_CFG_TX_OP_ALLOW_GF20, 1);
  1399. + rt2x00_set_field32(&reg, GF40_PROT_CFG_TX_OP_ALLOW_GF40, 1);
  1400. + rt2x00pci_register_write(rt2x00dev, GF40_PROT_CFG, reg);
  1401. +
  1402. + rt2x00pci_register_write(rt2x00dev, TXOP_CTRL_CFG, 0x0000583f);
  1403. + rt2x00pci_register_write(rt2x00dev, TXOP_HLDR_ET, 0x00000002);
  1404. +
  1405. + rt2x00pci_register_read(rt2x00dev, TX_RTS_CFG, &reg);
  1406. + rt2x00_set_field32(&reg, TX_RTS_CFG_AUTO_RTS_RETRY_LIMIT, 32);
  1407. + rt2x00_set_field32(&reg, TX_RTS_CFG_RTS_FBK_EN, 0);
  1408. + rt2x00pci_register_write(rt2x00dev, TX_RTS_CFG, reg);
  1409. +
  1410. + rt2x00pci_register_write(rt2x00dev, EXP_ACK_TIME, 0x002400ca);
  1411. + rt2x00pci_register_write(rt2x00dev, PWR_PIN_CFG, 0x00000003);
  1412. +
  1413. + /*
  1414. + * ASIC will keep garbage value after boot, clear encryption keys.
  1415. + */
  1416. + for (i = 0; i < 254; i++) {
  1417. + u32 wcid[2] = { 0xffffffff, 0x00ffffff };
  1418. + rt2x00pci_register_multiwrite(rt2x00dev, MAC_WCID_ENTRY(i),
  1419. + wcid, sizeof(wcid));
  1420. + }
  1421. +
  1422. + for (i = 0; i < 4; i++)
  1423. + rt2x00pci_register_write(rt2x00dev,
  1424. + SHARED_KEY_MODE_ENTRY(i), 0);
  1425. +
  1426. + for (i = 0; i < 256; i++)
  1427. + rt2x00pci_register_write(rt2x00dev, MAC_WCID_ATTR_ENTRY(i), 1);
  1428. +
  1429. + /*
  1430. + * Clear all beacons
  1431. + * For the Beacon base registers we only need to clear
  1432. + * the first byte since that byte contains the VALID and OWNER
  1433. + * bits which (when set to 0) will invalidate the entire beacon.
  1434. + */
  1435. + rt2x00pci_register_write(rt2x00dev, HW_BEACON_BASE0, 0);
  1436. + rt2x00pci_register_write(rt2x00dev, HW_BEACON_BASE1, 0);
  1437. + rt2x00pci_register_write(rt2x00dev, HW_BEACON_BASE2, 0);
  1438. + rt2x00pci_register_write(rt2x00dev, HW_BEACON_BASE3, 0);
  1439. + rt2x00pci_register_write(rt2x00dev, HW_BEACON_BASE4, 0);
  1440. + rt2x00pci_register_write(rt2x00dev, HW_BEACON_BASE5, 0);
  1441. + rt2x00pci_register_write(rt2x00dev, HW_BEACON_BASE6, 0);
  1442. + rt2x00pci_register_write(rt2x00dev, HW_BEACON_BASE7, 0);
  1443. +
  1444. + rt2x00pci_register_read(rt2x00dev, HT_FBK_CFG0, &reg);
  1445. + rt2x00_set_field32(&reg, HT_FBK_CFG0_HTMCS0FBK, 0);
  1446. + rt2x00_set_field32(&reg, HT_FBK_CFG0_HTMCS1FBK, 0);
  1447. + rt2x00_set_field32(&reg, HT_FBK_CFG0_HTMCS2FBK, 1);
  1448. + rt2x00_set_field32(&reg, HT_FBK_CFG0_HTMCS3FBK, 2);
  1449. + rt2x00_set_field32(&reg, HT_FBK_CFG0_HTMCS4FBK, 3);
  1450. + rt2x00_set_field32(&reg, HT_FBK_CFG0_HTMCS5FBK, 4);
  1451. + rt2x00_set_field32(&reg, HT_FBK_CFG0_HTMCS6FBK, 5);
  1452. + rt2x00_set_field32(&reg, HT_FBK_CFG0_HTMCS7FBK, 6);
  1453. + rt2x00pci_register_write(rt2x00dev, HT_FBK_CFG0, reg);
  1454. +
  1455. + rt2x00pci_register_read(rt2x00dev, HT_FBK_CFG1, &reg);
  1456. + rt2x00_set_field32(&reg, HT_FBK_CFG1_HTMCS8FBK, 8);
  1457. + rt2x00_set_field32(&reg, HT_FBK_CFG1_HTMCS9FBK, 8);
  1458. + rt2x00_set_field32(&reg, HT_FBK_CFG1_HTMCS10FBK, 9);
  1459. + rt2x00_set_field32(&reg, HT_FBK_CFG1_HTMCS11FBK, 10);
  1460. + rt2x00_set_field32(&reg, HT_FBK_CFG1_HTMCS12FBK, 11);
  1461. + rt2x00_set_field32(&reg, HT_FBK_CFG1_HTMCS13FBK, 12);
  1462. + rt2x00_set_field32(&reg, HT_FBK_CFG1_HTMCS14FBK, 13);
  1463. + rt2x00_set_field32(&reg, HT_FBK_CFG1_HTMCS15FBK, 14);
  1464. + rt2x00pci_register_write(rt2x00dev, HT_FBK_CFG1, reg);
  1465. +
  1466. + rt2x00pci_register_read(rt2x00dev, LG_FBK_CFG0, &reg);
  1467. + rt2x00_set_field32(&reg, LG_FBK_CFG0_OFDMMCS0FBK, 8);
  1468. + rt2x00_set_field32(&reg, LG_FBK_CFG0_OFDMMCS1FBK, 8);
  1469. + rt2x00_set_field32(&reg, LG_FBK_CFG0_OFDMMCS2FBK, 10);
  1470. + rt2x00_set_field32(&reg, LG_FBK_CFG0_OFDMMCS3FBK, 11);
  1471. + rt2x00_set_field32(&reg, LG_FBK_CFG0_OFDMMCS4FBK, 12);
  1472. + rt2x00_set_field32(&reg, LG_FBK_CFG0_OFDMMCS5FBK, 13);
  1473. + rt2x00_set_field32(&reg, LG_FBK_CFG0_OFDMMCS6FBK, 14);
  1474. + rt2x00_set_field32(&reg, LG_FBK_CFG0_OFDMMCS7FBK, 15);
  1475. + rt2x00pci_register_write(rt2x00dev, LG_FBK_CFG0, reg);
  1476. +
  1477. + rt2x00pci_register_read(rt2x00dev, LG_FBK_CFG1, &reg);
  1478. + rt2x00_set_field32(&reg, LG_FBK_CFG0_CCKMCS0FBK, 0);
  1479. + rt2x00_set_field32(&reg, LG_FBK_CFG0_CCKMCS1FBK, 0);
  1480. + rt2x00_set_field32(&reg, LG_FBK_CFG0_CCKMCS2FBK, 1);
  1481. + rt2x00_set_field32(&reg, LG_FBK_CFG0_CCKMCS3FBK, 2);
  1482. + rt2x00pci_register_write(rt2x00dev, LG_FBK_CFG1, reg);
  1483. +
  1484. + /*
  1485. + * We must clear the error counters.
  1486. + * These registers are cleared on read,
  1487. + * so we may pass a useless variable to store the value.
  1488. + */
  1489. + rt2x00pci_register_read(rt2x00dev, RX_STA_CNT0, &reg);
  1490. + rt2x00pci_register_read(rt2x00dev, RX_STA_CNT1, &reg);
  1491. + rt2x00pci_register_read(rt2x00dev, RX_STA_CNT2, &reg);
  1492. + rt2x00pci_register_read(rt2x00dev, TX_STA_CNT0, &reg);
  1493. + rt2x00pci_register_read(rt2x00dev, TX_STA_CNT1, &reg);
  1494. + rt2x00pci_register_read(rt2x00dev, TX_STA_CNT2, &reg);
  1495. +
  1496. + return 0;
  1497. +}
  1498. +
  1499. +static int rt2800pci_wait_bbp_rf_ready(struct rt2x00_dev *rt2x00dev)
  1500. +{
  1501. + unsigned int i;
  1502. + u32 reg;
  1503. +
  1504. + for (i = 0; i < REGISTER_BUSY_COUNT; i++) {
  1505. + rt2x00pci_register_read(rt2x00dev, MAC_STATUS_CFG, &reg);
  1506. + if (!rt2x00_get_field32(reg, MAC_STATUS_CFG_BBP_RF_BUSY))
  1507. + return 0;
  1508. +
  1509. + udelay(REGISTER_BUSY_DELAY);
  1510. + }
  1511. +
  1512. + ERROR(rt2x00dev, "BBP/RF register access failed, aborting.\n");
  1513. + return -EACCES;
  1514. +}
  1515. +
  1516. +static int rt2800pci_wait_bbp_ready(struct rt2x00_dev *rt2x00dev)
  1517. +{
  1518. + unsigned int i;
  1519. + u8 value;
  1520. +
  1521. + /*
  1522. + * BBP was enabled after firmware was loaded,
  1523. + * but we need to reactivate it now.
  1524. + */
  1525. + rt2x00pci_register_write(rt2x00dev, H2M_BBP_AGENT, 0x00000000);
  1526. + rt2x00pci_register_write(rt2x00dev, H2M_MAILBOX_CSR, 0x00000000);
  1527. + msleep(1);
  1528. +
  1529. + for (i = 0; i < REGISTER_BUSY_COUNT; i++) {
  1530. + rt2800pci_bbp_read(rt2x00dev, 0, &value);
  1531. + if ((value != 0xff) && (value != 0x00))
  1532. + return 0;
  1533. + udelay(REGISTER_BUSY_DELAY);
  1534. + }
  1535. +
  1536. + ERROR(rt2x00dev, "BBP register access failed, aborting.\n");
  1537. + return -EACCES;
  1538. +}
  1539. +
  1540. +static int rt2800pci_init_bbp(struct rt2x00_dev *rt2x00dev)
  1541. +{
  1542. + unsigned int i;
  1543. + u16 eeprom;
  1544. + u8 reg_id;
  1545. + u8 value;
  1546. +
  1547. + if (unlikely(rt2800pci_wait_bbp_rf_ready(rt2x00dev) ||
  1548. + rt2800pci_wait_bbp_ready(rt2x00dev)))
  1549. + return -EACCES;
  1550. +
  1551. + rt2800pci_bbp_write(rt2x00dev, 65, 0x2c);
  1552. + rt2800pci_bbp_write(rt2x00dev, 66, 0x38);
  1553. + rt2800pci_bbp_write(rt2x00dev, 69, 0x12);
  1554. + rt2800pci_bbp_write(rt2x00dev, 70, 0x0a);
  1555. + rt2800pci_bbp_write(rt2x00dev, 73, 0x10);
  1556. + rt2800pci_bbp_write(rt2x00dev, 81, 0x37);
  1557. + rt2800pci_bbp_write(rt2x00dev, 82, 0x62);
  1558. + rt2800pci_bbp_write(rt2x00dev, 83, 0x6a);
  1559. + rt2800pci_bbp_write(rt2x00dev, 84, 0x99);
  1560. + rt2800pci_bbp_write(rt2x00dev, 86, 0x00);
  1561. + rt2800pci_bbp_write(rt2x00dev, 91, 0x04);
  1562. + rt2800pci_bbp_write(rt2x00dev, 92, 0x00);
  1563. + rt2800pci_bbp_write(rt2x00dev, 103, 0x00);
  1564. + rt2800pci_bbp_write(rt2x00dev, 105, 0x05);
  1565. +
  1566. + if (rt2x00_rev(&rt2x00dev->chip) == RT2860C_VERSION) {
  1567. + rt2800pci_bbp_write(rt2x00dev, 69, 0x16);
  1568. + rt2800pci_bbp_write(rt2x00dev, 73, 0x12);
  1569. + }
  1570. +
  1571. + if (rt2x00_rev(&rt2x00dev->chip) > RT2860D_VERSION)
  1572. + rt2800pci_bbp_write(rt2x00dev, 84, 0x19);
  1573. +
  1574. + for (i = 0; i < EEPROM_BBP_SIZE; i++) {
  1575. + rt2x00_eeprom_read(rt2x00dev, EEPROM_BBP_START + i, &eeprom);
  1576. +
  1577. + if (eeprom != 0xffff && eeprom != 0x0000) {
  1578. + reg_id = rt2x00_get_field16(eeprom, EEPROM_BBP_REG_ID);
  1579. + value = rt2x00_get_field16(eeprom, EEPROM_BBP_VALUE);
  1580. + rt2800pci_bbp_write(rt2x00dev, reg_id, value);
  1581. + }
  1582. + }
  1583. +
  1584. + return 0;
  1585. +}
  1586. +
  1587. +/*
  1588. + * Device state switch handlers.
  1589. + */
  1590. +static void rt2800pci_toggle_rx(struct rt2x00_dev *rt2x00dev,
  1591. + enum dev_state state)
  1592. +{
  1593. + u32 reg;
  1594. +
  1595. + rt2x00pci_register_read(rt2x00dev, MAC_SYS_CTRL, &reg);
  1596. + rt2x00_set_field32(&reg, MAC_SYS_CTRL_ENABLE_RX,
  1597. + (state == STATE_RADIO_RX_ON) ||
  1598. + (state == STATE_RADIO_RX_ON_LINK));
  1599. + rt2x00pci_register_write(rt2x00dev, MAC_SYS_CTRL, reg);
  1600. +}
  1601. +
  1602. +static void rt2800pci_toggle_irq(struct rt2x00_dev *rt2x00dev,
  1603. + enum dev_state state)
  1604. +{
  1605. + int mask = (state == STATE_RADIO_IRQ_ON);
  1606. + u32 reg;
  1607. +
  1608. + /*
  1609. + * When interrupts are being enabled, the interrupt registers
  1610. + * should clear the register to assure a clean state.
  1611. + */
  1612. + if (state == STATE_RADIO_IRQ_ON) {
  1613. + rt2x00pci_register_read(rt2x00dev, INT_SOURCE_CSR, &reg);
  1614. + rt2x00pci_register_write(rt2x00dev, INT_SOURCE_CSR, reg);
  1615. + }
  1616. +
  1617. + rt2x00pci_register_read(rt2x00dev, INT_MASK_CSR, &reg);
  1618. + rt2x00_set_field32(&reg, INT_MASK_CSR_RXDELAYINT, mask);
  1619. + rt2x00_set_field32(&reg, INT_MASK_CSR_TXDELAYINT, mask);
  1620. + rt2x00_set_field32(&reg, INT_MASK_CSR_RX_DONE, mask);
  1621. + rt2x00_set_field32(&reg, INT_MASK_CSR_AC0_DMA_DONE, mask);
  1622. + rt2x00_set_field32(&reg, INT_MASK_CSR_AC1_DMA_DONE, mask);
  1623. + rt2x00_set_field32(&reg, INT_MASK_CSR_AC2_DMA_DONE, mask);
  1624. + rt2x00_set_field32(&reg, INT_MASK_CSR_AC3_DMA_DONE, mask);
  1625. + rt2x00_set_field32(&reg, INT_MASK_CSR_HCCA_DMA_DONE, mask);
  1626. + rt2x00_set_field32(&reg, INT_MASK_CSR_MGMT_DMA_DONE, mask);
  1627. + rt2x00_set_field32(&reg, INT_MASK_CSR_MCU_COMMAND, mask);
  1628. + rt2x00_set_field32(&reg, INT_MASK_CSR_RXTX_COHERENT, mask);
  1629. + rt2x00_set_field32(&reg, INT_MASK_CSR_TBTT, mask);
  1630. + rt2x00_set_field32(&reg, INT_MASK_CSR_PRE_TBTT, mask);
  1631. + rt2x00_set_field32(&reg, INT_MASK_CSR_TX_FIFO_STATUS, mask);
  1632. + rt2x00_set_field32(&reg, INT_MASK_CSR_AUTO_WAKEUP, mask);
  1633. + rt2x00_set_field32(&reg, INT_MASK_CSR_GPTIMER, mask);
  1634. + rt2x00_set_field32(&reg, INT_MASK_CSR_RX_COHERENT, mask);
  1635. + rt2x00_set_field32(&reg, INT_MASK_CSR_TX_COHERENT, mask);
  1636. + rt2x00pci_register_write(rt2x00dev, INT_MASK_CSR, reg);
  1637. +}
  1638. +
  1639. +static int rt2800pci_wait_wpdma_ready(struct rt2x00_dev *rt2x00dev)
  1640. +{
  1641. + unsigned int i;
  1642. + u32 reg;
  1643. +
  1644. + for (i = 0; i < REGISTER_BUSY_COUNT; i++) {
  1645. + rt2x00pci_register_read(rt2x00dev, WPDMA_GLO_CFG, &reg);
  1646. + if (!rt2x00_get_field32(reg, WPDMA_GLO_CFG_TX_DMA_BUSY) &&
  1647. + !rt2x00_get_field32(reg, WPDMA_GLO_CFG_RX_DMA_BUSY))
  1648. + return 0;
  1649. +
  1650. + msleep(1);
  1651. + }
  1652. +
  1653. + ERROR(rt2x00dev, "WPDMA TX/RX busy, aborting.\n");
  1654. + return -EACCES;
  1655. +}
  1656. +
  1657. +static int rt2800pci_enable_radio(struct rt2x00_dev *rt2x00dev)
  1658. +{
  1659. + u32 reg;
  1660. + u16 word;
  1661. +
  1662. + /*
  1663. + * Initialize all registers.
  1664. + */
  1665. + if (unlikely(rt2800pci_wait_wpdma_ready(rt2x00dev) ||
  1666. + rt2800pci_init_queues(rt2x00dev) ||
  1667. + rt2800pci_init_registers(rt2x00dev) ||
  1668. + rt2800pci_wait_wpdma_ready(rt2x00dev) ||
  1669. + rt2800pci_init_bbp(rt2x00dev)))
  1670. + return -EIO;
  1671. +
  1672. + /*
  1673. + * Send signal to firmware during boot time.
  1674. + */
  1675. + rt2800pci_mcu_request(rt2x00dev, MCU_BOOT_SIGNAL, 0xff, 0, 0);
  1676. +
  1677. + /*
  1678. + * Enable RX.
  1679. + */
  1680. + rt2x00pci_register_read(rt2x00dev, MAC_SYS_CTRL, &reg);
  1681. + rt2x00_set_field32(&reg, MAC_SYS_CTRL_ENABLE_TX, 1);
  1682. + rt2x00_set_field32(&reg, MAC_SYS_CTRL_ENABLE_RX, 0);
  1683. + rt2x00pci_register_write(rt2x00dev, MAC_SYS_CTRL, reg);
  1684. +
  1685. + rt2x00pci_register_read(rt2x00dev, WPDMA_GLO_CFG, &reg);
  1686. + rt2x00_set_field32(&reg, WPDMA_GLO_CFG_ENABLE_TX_DMA, 1);
  1687. + rt2x00_set_field32(&reg, WPDMA_GLO_CFG_ENABLE_RX_DMA, 1);
  1688. + rt2x00_set_field32(&reg, WPDMA_GLO_CFG_WP_DMA_BURST_SIZE, 2);
  1689. + rt2x00_set_field32(&reg, WPDMA_GLO_CFG_TX_WRITEBACK_DONE, 1);
  1690. + rt2x00pci_register_write(rt2x00dev, WPDMA_GLO_CFG, reg);
  1691. +
  1692. + rt2x00pci_register_read(rt2x00dev, MAC_SYS_CTRL, &reg);
  1693. + rt2x00_set_field32(&reg, MAC_SYS_CTRL_ENABLE_TX, 1);
  1694. + rt2x00_set_field32(&reg, MAC_SYS_CTRL_ENABLE_RX, 1);
  1695. + rt2x00pci_register_write(rt2x00dev, MAC_SYS_CTRL, reg);
  1696. +
  1697. + /*
  1698. + * Initialize LED control
  1699. + */
  1700. + rt2x00_eeprom_read(rt2x00dev, EEPROM_LED1, &word);
  1701. + rt2800pci_mcu_request(rt2x00dev, MCU_LED_1, 0xff,
  1702. + word & 0xff, (word >> 8) & 0xff);
  1703. +
  1704. + rt2x00_eeprom_read(rt2x00dev, EEPROM_LED2, &word);
  1705. + rt2800pci_mcu_request(rt2x00dev, MCU_LED_2, 0xff,
  1706. + word & 0xff, (word >> 8) & 0xff);
  1707. +
  1708. + rt2x00_eeprom_read(rt2x00dev, EEPROM_LED3, &word);
  1709. + rt2800pci_mcu_request(rt2x00dev, MCU_LED_3, 0xff,
  1710. + word & 0xff, (word >> 8) & 0xff);
  1711. +
  1712. + return 0;
  1713. +}
  1714. +
  1715. +static void rt2800pci_disable_radio(struct rt2x00_dev *rt2x00dev)
  1716. +{
  1717. + u32 reg;
  1718. +
  1719. + rt2x00pci_register_read(rt2x00dev, WPDMA_GLO_CFG, &reg);
  1720. + rt2x00_set_field32(&reg, WPDMA_GLO_CFG_ENABLE_TX_DMA, 0);
  1721. + rt2x00_set_field32(&reg, WPDMA_GLO_CFG_TX_DMA_BUSY, 0);
  1722. + rt2x00_set_field32(&reg, WPDMA_GLO_CFG_ENABLE_RX_DMA, 0);
  1723. + rt2x00_set_field32(&reg, WPDMA_GLO_CFG_RX_DMA_BUSY, 0);
  1724. + rt2x00_set_field32(&reg, WPDMA_GLO_CFG_TX_WRITEBACK_DONE, 1);
  1725. + rt2x00pci_register_write(rt2x00dev, WPDMA_GLO_CFG, reg);
  1726. +
  1727. + rt2x00pci_register_write(rt2x00dev, MAC_SYS_CTRL, 0);
  1728. + rt2x00pci_register_write(rt2x00dev, PWR_PIN_CFG, 0);
  1729. + rt2x00pci_register_write(rt2x00dev, TX_PIN_CFG, 0);
  1730. +
  1731. + rt2x00pci_register_write(rt2x00dev, PBF_SYS_CTRL, 0x00001280);
  1732. +
  1733. + /* Wait for DMA, ignore error */
  1734. + rt2800pci_wait_wpdma_ready(rt2x00dev);
  1735. +}
  1736. +
  1737. +static int rt2800pci_set_state(struct rt2x00_dev *rt2x00dev,
  1738. + enum dev_state state)
  1739. +{
  1740. + rt2x00pci_register_write(rt2x00dev, AUTOWAKEUP_CFG, 0);
  1741. +
  1742. + if (state == STATE_AWAKE)
  1743. + rt2800pci_mcu_request(rt2x00dev, MCU_WAKEUP, 0xff, 0, 0);
  1744. + else
  1745. + rt2800pci_mcu_request(rt2x00dev, MCU_SLEEP, 0xff, 0, 2);
  1746. +
  1747. + return 0;
  1748. +}
  1749. +
  1750. +static int rt2800pci_set_device_state(struct rt2x00_dev *rt2x00dev,
  1751. + enum dev_state state)
  1752. +{
  1753. + int retval = 0;
  1754. +
  1755. + switch (state) {
  1756. + case STATE_RADIO_ON:
  1757. + /*
  1758. + * Before the radio can be enabled, the device first has
  1759. + * to be woken up. After that it needs a bit of time
  1760. + * to be fully awake and the radio can be enabled.
  1761. + */
  1762. + rt2800pci_set_state(rt2x00dev, STATE_AWAKE);
  1763. + msleep(1);
  1764. + retval = rt2800pci_enable_radio(rt2x00dev);
  1765. + break;
  1766. + case STATE_RADIO_OFF:
  1767. + /*
  1768. + * After the radio has been disablee, the device should
  1769. + * be put to sleep for powersaving.
  1770. + */
  1771. + rt2800pci_disable_radio(rt2x00dev);
  1772. + rt2800pci_set_state(rt2x00dev, STATE_SLEEP);
  1773. + break;
  1774. + case STATE_RADIO_RX_ON:
  1775. + case STATE_RADIO_RX_ON_LINK:
  1776. + case STATE_RADIO_RX_OFF:
  1777. + case STATE_RADIO_RX_OFF_LINK:
  1778. + rt2800pci_toggle_rx(rt2x00dev, state);
  1779. + break;
  1780. + case STATE_RADIO_IRQ_ON:
  1781. + case STATE_RADIO_IRQ_OFF:
  1782. + rt2800pci_toggle_irq(rt2x00dev, state);
  1783. + break;
  1784. + case STATE_DEEP_SLEEP:
  1785. + case STATE_SLEEP:
  1786. + case STATE_STANDBY:
  1787. + case STATE_AWAKE:
  1788. + retval = rt2800pci_set_state(rt2x00dev, state);
  1789. + break;
  1790. + default:
  1791. + retval = -ENOTSUPP;
  1792. + break;
  1793. + }
  1794. +
  1795. + if (unlikely(retval))
  1796. + ERROR(rt2x00dev, "Device failed to enter state %d (%d).\n",
  1797. + state, retval);
  1798. +
  1799. + return retval;
  1800. +}
  1801. +
  1802. +/*
  1803. + * TX descriptor initialization
  1804. + */
  1805. +static void rt2800pci_write_tx_desc(struct rt2x00_dev *rt2x00dev,
  1806. + struct sk_buff *skb,
  1807. + struct txentry_desc *txdesc)
  1808. +{
  1809. + struct skb_frame_desc *skbdesc = get_skb_frame_desc(skb);
  1810. + __le32 *txd = skbdesc->desc;
  1811. + __le32 *txwi = (__le32 *)(skb->data - rt2x00dev->hw->extra_tx_headroom);
  1812. + u32 word;
  1813. +
  1814. + /*
  1815. + * Initialize TX Info descriptor
  1816. + */
  1817. + rt2x00_desc_read(txwi, 0, &word);
  1818. + rt2x00_set_field32(&word, TXWI_W0_FRAG,
  1819. + test_bit(ENTRY_TXD_FIRST_FRAGMENT, &txdesc->flags) ||
  1820. + test_bit(ENTRY_TXD_MORE_FRAG, &txdesc->flags));
  1821. + rt2x00_set_field32(&word, TXWI_W0_MIMO_PS, 0);
  1822. + rt2x00_set_field32(&word, TXWI_W0_CF_ACK, 0);
  1823. + rt2x00_set_field32(&word, TXWI_W0_TS,
  1824. + test_bit(ENTRY_TXD_REQ_TIMESTAMP, &txdesc->flags));
  1825. + rt2x00_set_field32(&word, TXWI_W0_AMPDU,
  1826. + test_bit(ENTRY_TXD_HT_AMPDU, &txdesc->flags));
  1827. + rt2x00_set_field32(&word, TXWI_W0_MPDU_DENSITY, txdesc->mpdu_density);
  1828. + rt2x00_set_field32(&word, TXWI_W0_TX_OP, txdesc->ifs);
  1829. + rt2x00_set_field32(&word, TXWI_W0_MCS, txdesc->mcs);
  1830. + rt2x00_set_field32(&word, TXWI_W0_BW,
  1831. + test_bit(ENTRY_TXD_HT_BW_40, &txdesc->flags));
  1832. + rt2x00_set_field32(&word, TXWI_W0_SHORT_GI,
  1833. + test_bit(ENTRY_TXD_HT_SHORT_GI, &txdesc->flags));
  1834. + rt2x00_set_field32(&word, TXWI_W0_STBC, txdesc->stbc);
  1835. + rt2x00_set_field32(&word, TXWI_W0_PHYMODE, txdesc->rate_mode);
  1836. + rt2x00_desc_write(txwi, 0, word);
  1837. +
  1838. + rt2x00_desc_read(txwi, 1, &word);
  1839. + rt2x00_set_field32(&word, TXWI_W1_ACK,
  1840. + test_bit(ENTRY_TXD_ACK, &txdesc->flags));
  1841. + rt2x00_set_field32(&word, TXWI_W1_NSEQ,
  1842. + test_bit(ENTRY_TXD_GENERATE_SEQ, &txdesc->flags));
  1843. + rt2x00_set_field32(&word, TXWI_W1_BW_WIN_SIZE, txdesc->ba_size);
  1844. + rt2x00_set_field32(&word, TXWI_W1_WIRELESS_CLI_ID,
  1845. + skbdesc->entry->entry_idx);
  1846. + rt2x00_set_field32(&word, TXWI_W1_MPDU_TOTAL_BYTE_COUNT, skb->len);
  1847. + rt2x00_set_field32(&word, TXWI_W1_PACKETID,
  1848. + skbdesc->entry->queue->qid);
  1849. + rt2x00_desc_write(txwi, 1, word);
  1850. +
  1851. + if (test_bit(ENTRY_TXD_ENCRYPT, &txdesc->flags)) {
  1852. + _rt2x00_desc_write(txwi, 2, skbdesc->iv[0]);
  1853. + _rt2x00_desc_write(txwi, 3, skbdesc->iv[1]);
  1854. + }
  1855. +
  1856. + /*
  1857. + * Initialize TX descriptor
  1858. + */
  1859. + rt2x00_desc_read(txd, 0, &word);
  1860. + rt2x00_set_field32(&word, TXD_W0_SD_PTR0, skbdesc->skb_dma);
  1861. + rt2x00_desc_write(txd, 0, word);
  1862. +
  1863. + rt2x00_desc_read(txd, 1, &word);
  1864. + rt2x00_set_field32(&word, TXD_W1_SD_LEN1, skb->len);
  1865. + rt2x00_set_field32(&word, TXD_W1_LAST_SEC1, 1);
  1866. + rt2x00_set_field32(&word, TXD_W1_BURST,
  1867. + test_bit(ENTRY_TXD_BURST, &txdesc->flags));
  1868. + rt2x00_set_field32(&word, TXD_W1_SD_LEN0,
  1869. + rt2x00dev->hw->extra_tx_headroom);
  1870. + rt2x00_set_field32(&word, TXD_W1_LAST_SEC0,
  1871. + !test_bit(ENTRY_TXD_MORE_FRAG, &txdesc->flags));
  1872. + rt2x00_set_field32(&word, TXD_W1_DMA_DONE, 0);
  1873. + rt2x00_desc_write(txd, 1, word);
  1874. +
  1875. + rt2x00_desc_read(txd, 2, &word);
  1876. + rt2x00_set_field32(&word, TXD_W2_SD_PTR1,
  1877. + skbdesc->skb_dma + rt2x00dev->hw->extra_tx_headroom);
  1878. + rt2x00_desc_write(txd, 2, word);
  1879. +
  1880. + rt2x00_desc_read(txd, 3, &word);
  1881. + rt2x00_set_field32(&word, TXD_W3_WIV, 1);
  1882. + rt2x00_set_field32(&word, TXD_W3_QSEL, 2);
  1883. + rt2x00_desc_write(txd, 3, word);
  1884. +}
  1885. +
  1886. +/*
  1887. + * TX data initialization
  1888. + */
  1889. +static void rt2800pci_write_beacon(struct queue_entry *entry)
  1890. +{
  1891. + struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev;
  1892. + struct skb_frame_desc *skbdesc = get_skb_frame_desc(entry->skb);
  1893. + unsigned int beacon_base;
  1894. + u32 reg;
  1895. +
  1896. + /*
  1897. + * Disable beaconing while we are reloading the beacon data,
  1898. + * otherwise we might be sending out invalid data.
  1899. + */
  1900. + rt2x00pci_register_read(rt2x00dev, BCN_TIME_CFG, &reg);
  1901. + rt2x00_set_field32(&reg, BCN_TIME_CFG_TSF_TICKING, 0);
  1902. + rt2x00_set_field32(&reg, BCN_TIME_CFG_TBTT_ENABLE, 0);
  1903. + rt2x00_set_field32(&reg, BCN_TIME_CFG_BEACON_GEN, 0);
  1904. + rt2x00pci_register_write(rt2x00dev, BCN_TIME_CFG, reg);
  1905. +
  1906. + /*
  1907. + * Write entire beacon with descriptor to register.
  1908. + */
  1909. + beacon_base = HW_BEACON_OFFSET(entry->entry_idx);
  1910. + rt2x00pci_register_multiwrite(rt2x00dev,
  1911. + beacon_base,
  1912. + skbdesc->desc, skbdesc->desc_len);
  1913. + rt2x00pci_register_multiwrite(rt2x00dev,
  1914. + beacon_base + skbdesc->desc_len,
  1915. + entry->skb->data, entry->skb->len);
  1916. +
  1917. + /*
  1918. + * Clean up beacon skb.
  1919. + */
  1920. + dev_kfree_skb_any(entry->skb);
  1921. + entry->skb = NULL;
  1922. +}
  1923. +
  1924. +static void rt2800pci_kick_tx_queue(struct rt2x00_dev *rt2x00dev,
  1925. + const enum data_queue_qid queue_idx)
  1926. +{
  1927. + struct data_queue *queue;
  1928. + unsigned int idx, qidx = 0;
  1929. + u32 reg;
  1930. +
  1931. + if (queue_idx == QID_BEACON) {
  1932. + rt2x00pci_register_read(rt2x00dev, BCN_TIME_CFG, &reg);
  1933. + if (!rt2x00_get_field32(reg, BCN_TIME_CFG_BEACON_GEN)) {
  1934. + rt2x00_set_field32(&reg, BCN_TIME_CFG_TSF_TICKING, 1);
  1935. + rt2x00_set_field32(&reg, BCN_TIME_CFG_TBTT_ENABLE, 1);
  1936. + rt2x00_set_field32(&reg, BCN_TIME_CFG_BEACON_GEN, 1);
  1937. + rt2x00pci_register_write(rt2x00dev, BCN_TIME_CFG, reg);
  1938. + }
  1939. + return;
  1940. + }
  1941. +
  1942. + if (queue_idx > QID_HCCA && queue_idx != QID_MGMT)
  1943. + return;
  1944. +
  1945. + queue = rt2x00queue_get_queue(rt2x00dev, queue_idx);
  1946. + idx = queue->index[Q_INDEX];
  1947. +
  1948. + if (queue_idx == QID_MGMT)
  1949. + qidx = 5;
  1950. + else
  1951. + qidx = queue_idx;
  1952. +
  1953. + rt2x00pci_register_write(rt2x00dev, TX_CTX_IDX(qidx), idx);
  1954. +}
  1955. +
  1956. +/*
  1957. + * RX control handlers
  1958. + */
  1959. +static void rt2800pci_fill_rxdone(struct queue_entry *entry,
  1960. + struct rxdone_entry_desc *rxdesc)
  1961. +{
  1962. + struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev;
  1963. + struct queue_entry_priv_pci *entry_priv = entry->priv_data;
  1964. + __le32 *rxd = entry_priv->desc;
  1965. + __le32 *rxwi = (__le32 *)entry->skb->data;
  1966. + u32 rxd3;
  1967. + u32 rxwi0;
  1968. + u32 rxwi1;
  1969. + u32 rxwi2;
  1970. + u32 rxwi3;
  1971. +
  1972. + rt2x00_desc_read(rxd, 3, &rxd3);
  1973. + rt2x00_desc_read(rxwi, 0, &rxwi0);
  1974. + rt2x00_desc_read(rxwi, 1, &rxwi1);
  1975. + rt2x00_desc_read(rxwi, 2, &rxwi2);
  1976. + rt2x00_desc_read(rxwi, 3, &rxwi3);
  1977. +
  1978. + if (rt2x00_get_field32(rxd3, RXD_W3_CRC_ERROR))
  1979. + rxdesc->flags |= RX_FLAG_FAILED_FCS_CRC;
  1980. +
  1981. + if (test_bit(CONFIG_SUPPORT_HW_CRYPTO, &rt2x00dev->flags)) {
  1982. + /*
  1983. + * Unfortunately we don't know the cipher type used during
  1984. + * decryption. This prevents us from correct providing
  1985. + * correct statistics through debugfs.
  1986. + */
  1987. + rxdesc->cipher = CIPHER_NONE;
  1988. + rxdesc->cipher_status =
  1989. + rt2x00_get_field32(rxd3, RXD_W3_CIPHER_ERROR);
  1990. + }
  1991. +
  1992. + if (rt2x00_get_field32(rxd3, RXD_W3_DECRYPTED)) {
  1993. + /*
  1994. + * Hardware has stripped IV/EIV data from 802.11 frame during
  1995. + * decryption. Unfortunately the descriptor doesn't contain
  1996. + * any fields with the EIV/IV data either, so they can't
  1997. + * be restored by rt2x00lib.
  1998. + */
  1999. + rxdesc->flags |= RX_FLAG_IV_STRIPPED;
  2000. +
  2001. + if (rxdesc->cipher_status == RX_CRYPTO_SUCCESS)
  2002. + rxdesc->flags |= RX_FLAG_DECRYPTED;
  2003. + else if (rxdesc->cipher_status == RX_CRYPTO_FAIL_MIC)
  2004. + rxdesc->flags |= RX_FLAG_MMIC_ERROR;
  2005. + }
  2006. +
  2007. + if (rt2x00_get_field32(rxd3, RXD_W3_MY_BSS))
  2008. + rxdesc->dev_flags |= RXDONE_MY_BSS;
  2009. +
  2010. + if (rt2x00_get_field32(rxwi1, RXWI_W1_SHORT_GI))
  2011. + rxdesc->flags |= RX_FLAG_SHORT_GI;
  2012. +
  2013. + if (rt2x00_get_field32(rxwi1, RXWI_W1_BW))
  2014. + rxdesc->flags |= RX_FLAG_40MHZ;
  2015. +
  2016. + /*
  2017. + * Detect RX rate, always use MCS as signal type.
  2018. + */
  2019. + rxdesc->dev_flags |= RXDONE_SIGNAL_MCS;
  2020. + rxdesc->rate_mode = rt2x00_get_field32(rxwi1, RXWI_W1_PHYMODE);
  2021. + rxdesc->signal = rt2x00_get_field32(rxwi1, RXWI_W1_MCS);
  2022. +
  2023. + /*
  2024. + * Mask of 0x8 bit to remove the short preamble flag.
  2025. + */
  2026. + if (rxdesc->dev_flags == RATE_MODE_CCK)
  2027. + rxdesc->signal &= ~0x8;
  2028. +
  2029. + rxdesc->rssi =
  2030. + (rt2x00_get_field32(rxwi2, RXWI_W2_RSSI0) +
  2031. + rt2x00_get_field32(rxwi2, RXWI_W2_RSSI1) +
  2032. + rt2x00_get_field32(rxwi2, RXWI_W2_RSSI2)) / 3;
  2033. +
  2034. + rxdesc->noise =
  2035. + (rt2x00_get_field32(rxwi3, RXWI_W3_SNR0) +
  2036. + rt2x00_get_field32(rxwi3, RXWI_W3_SNR1)) / 2;
  2037. +
  2038. + rxdesc->size = rt2x00_get_field32(rxwi0, RXWI_W0_MPDU_TOTAL_BYTE_COUNT);
  2039. +
  2040. + /*
  2041. + * Remove TXWI descriptor from start of buffer.
  2042. + */
  2043. + skb_pull(entry->skb, TXWI_DESC_SIZE);
  2044. + skb_trim(entry->skb, rxdesc->size);
  2045. +}
  2046. +
  2047. +/*
  2048. + * Interrupt functions.
  2049. + */
  2050. +static void rt2800pci_txdone(struct rt2x00_dev *rt2x00dev)
  2051. +{
  2052. + struct data_queue *queue;
  2053. + struct queue_entry *entry;
  2054. + struct queue_entry *entry_done;
  2055. + struct queue_entry_priv_pci *entry_priv;
  2056. + struct txdone_entry_desc txdesc;
  2057. + u32 word;
  2058. + u32 reg;
  2059. + u32 old_reg;
  2060. + int type;
  2061. + int index;
  2062. +
  2063. + /*
  2064. + * During each loop we will compare the freshly read
  2065. + * TX_STA_FIFO register value with the value read from
  2066. + * the previous loop. If the 2 values are equal then
  2067. + * we should stop processing because the chance it
  2068. + * quite big that the device has been unplugged and
  2069. + * we risk going into an endless loop.
  2070. + */
  2071. + old_reg = 0;
  2072. +
  2073. + while (1) {
  2074. + rt2x00pci_register_read(rt2x00dev, TX_STA_FIFO, &reg);
  2075. + if (!rt2x00_get_field32(reg, TX_STA_FIFO_VALID))
  2076. + break;
  2077. +
  2078. + if (old_reg == reg)
  2079. + break;
  2080. + old_reg = reg;
  2081. +
  2082. + /*
  2083. + * Skip this entry when it contains an invalid
  2084. + * queue identication number.
  2085. + */
  2086. + type = rt2x00_get_field32(reg, TX_STA_FIFO_PID_TYPE);
  2087. + queue = rt2x00queue_get_queue(rt2x00dev, type);
  2088. + if (unlikely(!queue))
  2089. + continue;
  2090. +
  2091. + /*
  2092. + * Skip this entry when it contains an invalid
  2093. + * index number.
  2094. + */
  2095. + index = rt2x00_get_field32(reg, TX_STA_FIFO_WCID);
  2096. + if (unlikely(index >= queue->limit))
  2097. + continue;
  2098. +
  2099. + entry = &queue->entries[index];
  2100. + entry_priv = entry->priv_data;
  2101. + rt2x00_desc_read((__le32 *)entry->skb->data, 0, &word);
  2102. +
  2103. + entry_done = rt2x00queue_get_entry(queue, Q_INDEX_DONE);
  2104. + while (entry != entry_done) {
  2105. + /*
  2106. + * Catch up.
  2107. + * Just report any entries we missed as failed.
  2108. + */
  2109. + WARNING(rt2x00dev,
  2110. + "TX status report missed for entry %d\n",
  2111. + entry_done->entry_idx);
  2112. +
  2113. + txdesc.flags = 0;
  2114. + __set_bit(TXDONE_UNKNOWN, &txdesc.flags);
  2115. + txdesc.retry = 0;
  2116. +
  2117. + rt2x00lib_txdone(entry_done, &txdesc);
  2118. + entry_done = rt2x00queue_get_entry(queue, Q_INDEX_DONE);
  2119. + }
  2120. +
  2121. + /*
  2122. + * Obtain the status about this packet.
  2123. + */
  2124. + txdesc.flags = 0;
  2125. + if (rt2x00_get_field32(reg, TX_STA_FIFO_TX_SUCCESS))
  2126. + __set_bit(TXDONE_SUCCESS, &txdesc.flags);
  2127. + else
  2128. + __set_bit(TXDONE_FAILURE, &txdesc.flags);
  2129. + txdesc.retry = rt2x00_get_field32(word, TXWI_W0_MCS);
  2130. +
  2131. + rt2x00lib_txdone(entry, &txdesc);
  2132. + }
  2133. +}
  2134. +
  2135. +static irqreturn_t rt2800pci_interrupt(int irq, void *dev_instance)
  2136. +{
  2137. + struct rt2x00_dev *rt2x00dev = dev_instance;
  2138. + u32 reg;
  2139. +
  2140. + /* Read status and ACK all interrupts */
  2141. + rt2x00pci_register_read(rt2x00dev, INT_SOURCE_CSR, &reg);
  2142. + rt2x00pci_register_write(rt2x00dev, INT_SOURCE_CSR, reg);
  2143. +
  2144. + if (!reg)
  2145. + return IRQ_NONE;
  2146. +
  2147. + if (!test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags))
  2148. + return IRQ_HANDLED;
  2149. +
  2150. + /*
  2151. + * 1 - Rx ring done interrupt.
  2152. + */
  2153. + if (rt2x00_get_field32(reg, INT_SOURCE_CSR_RX_DONE))
  2154. + rt2x00pci_rxdone(rt2x00dev);
  2155. +
  2156. + if (rt2x00_get_field32(reg, INT_SOURCE_CSR_TX_FIFO_STATUS))
  2157. + rt2800pci_txdone(rt2x00dev);
  2158. +
  2159. + return IRQ_HANDLED;
  2160. +}
  2161. +
  2162. +/*
  2163. + * Device probe functions.
  2164. + */
  2165. +static int rt2800pci_validate_eeprom(struct rt2x00_dev *rt2x00dev)
  2166. +{
  2167. + struct eeprom_93cx6 eeprom;
  2168. + u32 reg;
  2169. + u16 word;
  2170. + u8 *mac;
  2171. + u8 default_lna_gain;
  2172. +
  2173. + rt2x00pci_register_read(rt2x00dev, E2PROM_CSR, &reg);
  2174. +
  2175. + eeprom.data = rt2x00dev;
  2176. + eeprom.register_read = rt2800pci_eepromregister_read;
  2177. + eeprom.register_write = rt2800pci_eepromregister_write;
  2178. + eeprom.width = rt2x00_get_field32(reg, E2PROM_CSR_TYPE_93C46) ?
  2179. + PCI_EEPROM_WIDTH_93C46 : PCI_EEPROM_WIDTH_93C66;
  2180. + eeprom.reg_data_in = 0;
  2181. + eeprom.reg_data_out = 0;
  2182. + eeprom.reg_data_clock = 0;
  2183. + eeprom.reg_chip_select = 0;
  2184. +
  2185. + eeprom_93cx6_multiread(&eeprom, EEPROM_BASE, rt2x00dev->eeprom,
  2186. + EEPROM_SIZE / sizeof(u16));
  2187. +
  2188. + /*
  2189. + * Start validation of the data that has been read.
  2190. + */
  2191. + mac = rt2x00_eeprom_addr(rt2x00dev, EEPROM_MAC_ADDR_0);
  2192. + if (!is_valid_ether_addr(mac)) {
  2193. + DECLARE_MAC_BUF(macbuf);
  2194. +
  2195. + random_ether_addr(mac);
  2196. + EEPROM(rt2x00dev, "MAC: %s\n", print_mac(macbuf, mac));
  2197. + }
  2198. +
  2199. + rt2x00_eeprom_read(rt2x00dev, EEPROM_ANTENNA, &word);
  2200. + if (word == 0xffff) {
  2201. + rt2x00_set_field16(&word, EEPROM_ANTENNA_RXPATH, 2);
  2202. + rt2x00_set_field16(&word, EEPROM_ANTENNA_TXPATH, 1);
  2203. + rt2x00_set_field16(&word, EEPROM_ANTENNA_RF_TYPE, RF2820);
  2204. + rt2x00_eeprom_write(rt2x00dev, EEPROM_ANTENNA, word);
  2205. + EEPROM(rt2x00dev, "Antenna: 0x%04x\n", word);
  2206. + }
  2207. +
  2208. + rt2x00_eeprom_read(rt2x00dev, EEPROM_NIC, &word);
  2209. + if (word == 0xffff) {
  2210. + rt2x00_set_field16(&word, EEPROM_NIC_HW_RADIO, 0);
  2211. + rt2x00_set_field16(&word, EEPROM_NIC_DYNAMIC_TX_AGC, 0);
  2212. + rt2x00_set_field16(&word, EEPROM_NIC_EXTERNAL_LNA_BG, 0);
  2213. + rt2x00_set_field16(&word, EEPROM_NIC_EXTERNAL_LNA_A, 0);
  2214. + rt2x00_set_field16(&word, EEPROM_NIC_CARDBUS_ACCEL, 0);
  2215. + rt2x00_set_field16(&word, EEPROM_NIC_BW40M_SB_BG, 0);
  2216. + rt2x00_set_field16(&word, EEPROM_NIC_BW40M_SB_A, 0);
  2217. + rt2x00_set_field16(&word, EEPROM_NIC_WPS_PBC, 0);
  2218. + rt2x00_set_field16(&word, EEPROM_NIC_BW40M_BG, 0);
  2219. + rt2x00_set_field16(&word, EEPROM_NIC_BW40M_A, 0);
  2220. + rt2x00_eeprom_write(rt2x00dev, EEPROM_NIC, word);
  2221. + EEPROM(rt2x00dev, "NIC: 0x%04x\n", word);
  2222. + }
  2223. +
  2224. + rt2x00_eeprom_read(rt2x00dev, EEPROM_FREQ, &word);
  2225. + if ((word & 0x00ff) == 0x00ff) {
  2226. + rt2x00_set_field16(&word, EEPROM_FREQ_OFFSET, 0);
  2227. + rt2x00_set_field16(&word, EEPROM_FREQ_LED_MODE,
  2228. + LED_MODE_TXRX_ACTIVITY);
  2229. + rt2x00_set_field16(&word, EEPROM_FREQ_LED_POLARITY, 0);
  2230. + rt2x00_eeprom_write(rt2x00dev, EEPROM_FREQ, word);
  2231. + rt2x00_eeprom_write(rt2x00dev, EEPROM_LED1, 0x5555);
  2232. + rt2x00_eeprom_write(rt2x00dev, EEPROM_LED2, 0x2221);
  2233. + rt2x00_eeprom_write(rt2x00dev, EEPROM_LED3, 0xa9f8);
  2234. + EEPROM(rt2x00dev, "Freq: 0x%04x\n", word);
  2235. + }
  2236. +
  2237. + /*
  2238. + * During the LNA validation we are going to use
  2239. + * lna0 as correct value. Note that EEPROM_LNA
  2240. + * is never validated.
  2241. + */
  2242. + rt2x00_eeprom_read(rt2x00dev, EEPROM_LNA, &word);
  2243. + default_lna_gain = rt2x00_get_field16(word, EEPROM_LNA_A0);
  2244. +
  2245. + rt2x00_eeprom_read(rt2x00dev, EEPROM_RSSI_BG, &word);
  2246. + if (abs(rt2x00_get_field16(word, EEPROM_RSSI_BG_OFFSET0)) > 10)
  2247. + rt2x00_set_field16(&word, EEPROM_RSSI_BG_OFFSET0, 0);
  2248. + if (abs(rt2x00_get_field16(word, EEPROM_RSSI_BG_OFFSET1)) > 10)
  2249. + rt2x00_set_field16(&word, EEPROM_RSSI_BG_OFFSET1, 0);
  2250. + rt2x00_eeprom_write(rt2x00dev, EEPROM_RSSI_BG, word);
  2251. +
  2252. + rt2x00_eeprom_read(rt2x00dev, EEPROM_RSSI_BG2, &word);
  2253. + if (abs(rt2x00_get_field16(word, EEPROM_RSSI_BG2_OFFSET2)) > 10)
  2254. + rt2x00_set_field16(&word, EEPROM_RSSI_BG2_OFFSET2, 0);
  2255. + if (rt2x00_get_field16(word, EEPROM_RSSI_BG2_LNA_A1) == 0x00 ||
  2256. + rt2x00_get_field16(word, EEPROM_RSSI_BG2_LNA_A1) == 0xff)
  2257. + rt2x00_set_field16(&word, EEPROM_RSSI_BG2_LNA_A1,
  2258. + default_lna_gain);
  2259. + rt2x00_eeprom_write(rt2x00dev, EEPROM_RSSI_BG2, word);
  2260. +
  2261. + rt2x00_eeprom_read(rt2x00dev, EEPROM_RSSI_A, &word);
  2262. + if (abs(rt2x00_get_field16(word, EEPROM_RSSI_A_OFFSET0)) > 10)
  2263. + rt2x00_set_field16(&word, EEPROM_RSSI_A_OFFSET0, 0);
  2264. + if (abs(rt2x00_get_field16(word, EEPROM_RSSI_A_OFFSET1)) > 10)
  2265. + rt2x00_set_field16(&word, EEPROM_RSSI_A_OFFSET1, 0);
  2266. + rt2x00_eeprom_write(rt2x00dev, EEPROM_RSSI_A, word);
  2267. +
  2268. + rt2x00_eeprom_read(rt2x00dev, EEPROM_RSSI_A2, &word);
  2269. + if (abs(rt2x00_get_field16(word, EEPROM_RSSI_A2_OFFSET2)) > 10)
  2270. + rt2x00_set_field16(&word, EEPROM_RSSI_A2_OFFSET2, 0);
  2271. + if (rt2x00_get_field16(word, EEPROM_RSSI_A2_LNA_A2) == 0x00 ||
  2272. + rt2x00_get_field16(word, EEPROM_RSSI_A2_LNA_A2) == 0xff)
  2273. + rt2x00_set_field16(&word, EEPROM_RSSI_A2_LNA_A2,
  2274. + default_lna_gain);
  2275. + rt2x00_eeprom_write(rt2x00dev, EEPROM_RSSI_A2, word);
  2276. +
  2277. + return 0;
  2278. +}
  2279. +
  2280. +static int rt2800pci_init_eeprom(struct rt2x00_dev *rt2x00dev)
  2281. +{
  2282. + u32 reg;
  2283. + u16 value;
  2284. + u16 eeprom;
  2285. + u16 device;
  2286. +
  2287. + /*
  2288. + * Read EEPROM word for configuration.
  2289. + */
  2290. + rt2x00_eeprom_read(rt2x00dev, EEPROM_ANTENNA, &eeprom);
  2291. +
  2292. + /*
  2293. + * Identify RF chipset.
  2294. + * To determine the RT chip we have to read the
  2295. + * PCI header of the device.
  2296. + */
  2297. + pci_read_config_word(to_pci_dev(rt2x00dev->dev),
  2298. + PCI_CONFIG_HEADER_DEVICE, &device);
  2299. + value = rt2x00_get_field16(eeprom, EEPROM_ANTENNA_RF_TYPE);
  2300. + rt2x00pci_register_read(rt2x00dev, MAC_CSR0, &reg);
  2301. + rt2x00_set_chip(rt2x00dev, device, value, reg);
  2302. +
  2303. + if (!rt2x00_rf(&rt2x00dev->chip, RF2820) &&
  2304. + !rt2x00_rf(&rt2x00dev->chip, RF2850) &&
  2305. + !rt2x00_rf(&rt2x00dev->chip, RF2720) &&
  2306. + !rt2x00_rf(&rt2x00dev->chip, RF2750) &&
  2307. + !rt2x00_rf(&rt2x00dev->chip, RF3020) &&
  2308. + !rt2x00_rf(&rt2x00dev->chip, RF2020)) {
  2309. + ERROR(rt2x00dev, "Invalid RF chipset detected.\n");
  2310. + return -ENODEV;
  2311. + }
  2312. +
  2313. + /*
  2314. + * Read frequency offset and RF programming sequence.
  2315. + */
  2316. + rt2x00_eeprom_read(rt2x00dev, EEPROM_FREQ, &eeprom);
  2317. + rt2x00dev->freq_offset = rt2x00_get_field16(eeprom, EEPROM_FREQ_OFFSET);
  2318. +
  2319. + /*
  2320. + * Read external LNA informations.
  2321. + */
  2322. + rt2x00_eeprom_read(rt2x00dev, EEPROM_NIC, &eeprom);
  2323. +
  2324. + if (rt2x00_get_field16(eeprom, EEPROM_NIC_EXTERNAL_LNA_A))
  2325. + __set_bit(CONFIG_EXTERNAL_LNA_A, &rt2x00dev->flags);
  2326. + if (rt2x00_get_field16(eeprom, EEPROM_NIC_EXTERNAL_LNA_BG))
  2327. + __set_bit(CONFIG_EXTERNAL_LNA_BG, &rt2x00dev->flags);
  2328. +
  2329. + /*
  2330. + * Detect if this device has an hardware controlled radio.
  2331. + */
  2332. +#ifdef CONFIG_RT2X00_LIB_RFKILL
  2333. + if (rt2x00_get_field16(eeprom, EEPROM_NIC_HW_RADIO))
  2334. + __set_bit(CONFIG_SUPPORT_HW_BUTTON, &rt2x00dev->flags);
  2335. +#endif /* CONFIG_RT2X00_LIB_RFKILL */
  2336. +
  2337. + /*
  2338. + * Store led settings, for correct led behaviour.
  2339. + */
  2340. +#ifdef CONFIG_RT2X00_LIB_LEDS
  2341. + rt2800pci_init_led(rt2x00dev, &rt2x00dev->led_radio, LED_TYPE_RADIO);
  2342. + rt2800pci_init_led(rt2x00dev, &rt2x00dev->led_assoc, LED_TYPE_ASSOC);
  2343. + rt2800pci_init_led(rt2x00dev, &rt2x00dev->led_qual, LED_TYPE_QUALITY);
  2344. +
  2345. + rt2x00_eeprom_read(rt2x00dev, EEPROM_FREQ, &rt2x00dev->led_mcu_reg);
  2346. +#endif /* CONFIG_RT2X00_LIB_LEDS */
  2347. +
  2348. + return 0;
  2349. +}
  2350. +
  2351. +/*
  2352. + * RF value list for rt2860
  2353. + * Supports: 2.4 GHz (all) & 5.2 GHz (RF2850 & RF2750)
  2354. + */
  2355. +static const struct rf_channel rf_vals[] = {
  2356. + { 1, 0x18402ecc, 0x184c0786, 0x1816b455, 0x1800510b },
  2357. + { 2, 0x18402ecc, 0x184c0786, 0x18168a55, 0x1800519f },
  2358. + { 3, 0x18402ecc, 0x184c078a, 0x18168a55, 0x1800518b },
  2359. + { 4, 0x18402ecc, 0x184c078a, 0x18168a55, 0x1800519f },
  2360. + { 5, 0x18402ecc, 0x184c078e, 0x18168a55, 0x1800518b },
  2361. + { 6, 0x18402ecc, 0x184c078e, 0x18168a55, 0x1800519f },
  2362. + { 7, 0x18402ecc, 0x184c0792, 0x18168a55, 0x1800518b },
  2363. + { 8, 0x18402ecc, 0x184c0792, 0x18168a55, 0x1800519f },
  2364. + { 9, 0x18402ecc, 0x184c0796, 0x18168a55, 0x1800518b },
  2365. + { 10, 0x18402ecc, 0x184c0796, 0x18168a55, 0x1800519f },
  2366. + { 11, 0x18402ecc, 0x184c079a, 0x18168a55, 0x1800518b },
  2367. + { 12, 0x18402ecc, 0x184c079a, 0x18168a55, 0x1800519f },
  2368. + { 13, 0x18402ecc, 0x184c079e, 0x18168a55, 0x1800518b },
  2369. + { 14, 0x18402ecc, 0x184c07a2, 0x18168a55, 0x18005193 },
  2370. +
  2371. + /* 802.11 UNI / HyperLan 2 */
  2372. + { 36, 0x18402ecc, 0x184c099a, 0x18158a55, 0x180ed1a3 },
  2373. + { 38, 0x18402ecc, 0x184c099e, 0x18158a55, 0x180ed193 },
  2374. + { 40, 0x18402ec8, 0x184c0682, 0x18158a55, 0x180ed183 },
  2375. + { 44, 0x18402ec8, 0x184c0682, 0x18158a55, 0x180ed1a3 },
  2376. + { 46, 0x18402ec8, 0x184c0686, 0x18158a55, 0x180ed18b },
  2377. + { 48, 0x18402ec8, 0x184c0686, 0x18158a55, 0x180ed19b },
  2378. + { 52, 0x18402ec8, 0x184c068a, 0x18158a55, 0x180ed193 },
  2379. + { 54, 0x18402ec8, 0x184c068a, 0x18158a55, 0x180ed1a3 },
  2380. + { 56, 0x18402ec8, 0x184c068e, 0x18158a55, 0x180ed18b },
  2381. + { 60, 0x18402ec8, 0x184c0692, 0x18158a55, 0x180ed183 },
  2382. + { 62, 0x18402ec8, 0x184c0692, 0x18158a55, 0x180ed193 },
  2383. + { 64, 0x18402ec8, 0x184c0692, 0x18158a55, 0x180ed1a3 },
  2384. +
  2385. + /* 802.11 HyperLan 2 */
  2386. + { 100, 0x18402ec8, 0x184c06b2, 0x18178a55, 0x180ed783 },
  2387. + { 102, 0x18402ec8, 0x184c06b2, 0x18578a55, 0x180ed793 },
  2388. + { 104, 0x18402ec8, 0x184c06b2, 0x18578a55, 0x180ed1a3 },
  2389. + { 108, 0x18402ecc, 0x184c0a32, 0x18578a55, 0x180ed193 },
  2390. + { 110, 0x18402ecc, 0x184c0a36, 0x18178a55, 0x180ed183 },
  2391. + { 112, 0x18402ecc, 0x184c0a36, 0x18178a55, 0x180ed19b },
  2392. + { 116, 0x18402ecc, 0x184c0a3a, 0x18178a55, 0x180ed1a3 },
  2393. + { 118, 0x18402ecc, 0x184c0a3e, 0x18178a55, 0x180ed193 },
  2394. + { 120, 0x18402ec4, 0x184c0382, 0x18178a55, 0x180ed183 },
  2395. + { 124, 0x18402ec4, 0x184c0382, 0x18178a55, 0x180ed193 },
  2396. + { 126, 0x18402ec4, 0x184c0382, 0x18178a55, 0x180ed15b },
  2397. + { 128, 0x18402ec4, 0x184c0382, 0x18178a55, 0x180ed1a3 },
  2398. + { 132, 0x18402ec4, 0x184c0386, 0x18178a55, 0x180ed18b },
  2399. + { 134, 0x18402ec4, 0x184c0386, 0x18178a55, 0x180ed193 },
  2400. + { 136, 0x18402ec4, 0x184c0386, 0x18178a55, 0x180ed19b },
  2401. + { 140, 0x18402ec4, 0x184c038a, 0x18178a55, 0x180ed183 },
  2402. +
  2403. + /* 802.11 UNII */
  2404. + { 149, 0x18402ec4, 0x184c038a, 0x18178a55, 0x180ed1a7 },
  2405. + { 151, 0x18402ec4, 0x184c038e, 0x18178a55, 0x180ed187 },
  2406. + { 153, 0x18402ec4, 0x184c038e, 0x18178a55, 0x180ed18f },
  2407. + { 157, 0x18402ec4, 0x184c038e, 0x18178a55, 0x180ed19f },
  2408. + { 159, 0x18402ec4, 0x184c038e, 0x18178a55, 0x180ed1a7 },
  2409. + { 161, 0x18402ec4, 0x184c0392, 0x18178a55, 0x180ed187 },
  2410. + { 165, 0x18402ec4, 0x184c0392, 0x18178a55, 0x180ed197 },
  2411. +
  2412. + /* 802.11 Japan */
  2413. + { 184, 0x15002ccc, 0x1500491e, 0x1509be55, 0x150c0a0b },
  2414. + { 188, 0x15002ccc, 0x15004922, 0x1509be55, 0x150c0a13 },
  2415. + { 192, 0x15002ccc, 0x15004926, 0x1509be55, 0x150c0a1b },
  2416. + { 196, 0x15002ccc, 0x1500492a, 0x1509be55, 0x150c0a23 },
  2417. + { 208, 0x15002ccc, 0x1500493a, 0x1509be55, 0x150c0a13 },
  2418. + { 212, 0x15002ccc, 0x1500493e, 0x1509be55, 0x150c0a1b },
  2419. + { 216, 0x15002ccc, 0x15004982, 0x1509be55, 0x150c0a23 },
  2420. +};
  2421. +
  2422. +static int rt2800pci_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
  2423. +{
  2424. + struct hw_mode_spec *spec = &rt2x00dev->spec;
  2425. + struct channel_info *info;
  2426. + char *tx_power1;
  2427. + char *tx_power2;
  2428. + unsigned int i;
  2429. +
  2430. + /*
  2431. + * Initialize all hw fields.
  2432. + */
  2433. + rt2x00dev->hw->flags =
  2434. + IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING |
  2435. + IEEE80211_HW_SIGNAL_DBM |
  2436. + IEEE80211_HW_SUPPORTS_PS |
  2437. + IEEE80211_HW_PS_NULLFUNC_STACK;
  2438. + rt2x00dev->hw->extra_tx_headroom = TXWI_DESC_SIZE;
  2439. +
  2440. + SET_IEEE80211_DEV(rt2x00dev->hw, rt2x00dev->dev);
  2441. + SET_IEEE80211_PERM_ADDR(rt2x00dev->hw,
  2442. + rt2x00_eeprom_addr(rt2x00dev,
  2443. + EEPROM_MAC_ADDR_0));
  2444. +
  2445. + /*
  2446. + * Initialize hw_mode information.
  2447. + */
  2448. + spec->supported_bands = SUPPORT_BAND_2GHZ;
  2449. + spec->supported_rates = SUPPORT_RATE_CCK | SUPPORT_RATE_OFDM;
  2450. +
  2451. + if (rt2x00_rf(&rt2x00dev->chip, RF2820) ||
  2452. + rt2x00_rf(&rt2x00dev->chip, RF2720)) {
  2453. + spec->num_channels = 14;
  2454. + spec->channels = rf_vals;
  2455. + } else if (rt2x00_rf(&rt2x00dev->chip, RF2850) ||
  2456. + rt2x00_rf(&rt2x00dev->chip, RF2750)) {
  2457. + spec->supported_bands |= SUPPORT_BAND_5GHZ;
  2458. + spec->num_channels = ARRAY_SIZE(rf_vals);
  2459. + spec->channels = rf_vals;
  2460. + }
  2461. +
  2462. + /*
  2463. + * Initialize HT information.
  2464. + */
  2465. + spec->ht.ht_supported = true;
  2466. + spec->ht.cap =
  2467. + IEEE80211_HT_CAP_SUP_WIDTH_20_40 |
  2468. + IEEE80211_HT_CAP_GRN_FLD |
  2469. + IEEE80211_HT_CAP_SGI_20 |
  2470. + IEEE80211_HT_CAP_SGI_40 |
  2471. + IEEE80211_HT_CAP_TX_STBC |
  2472. + IEEE80211_HT_CAP_RX_STBC |
  2473. + IEEE80211_HT_CAP_PSMP_SUPPORT;
  2474. + spec->ht.ampdu_factor = 3;
  2475. + spec->ht.ampdu_density = 4;
  2476. + spec->ht.mcs.rx_mask[0] = 0xff;
  2477. + spec->ht.mcs.rx_mask[1] = 0xff;
  2478. + spec->ht.mcs.tx_params =
  2479. + IEEE80211_HT_MCS_TX_DEFINED;
  2480. +
  2481. + /*
  2482. + * Create channel information array
  2483. + */
  2484. + info = kzalloc(spec->num_channels * sizeof(*info), GFP_KERNEL);
  2485. + if (!info)
  2486. + return -ENOMEM;
  2487. +
  2488. + spec->channels_info = info;
  2489. +
  2490. + tx_power1 = rt2x00_eeprom_addr(rt2x00dev, EEPROM_TXPOWER_BG1);
  2491. + tx_power2 = rt2x00_eeprom_addr(rt2x00dev, EEPROM_TXPOWER_BG2);
  2492. +
  2493. + for (i = 0; i < 14; i++) {
  2494. + info[i].tx_power1 = TXPOWER_G_FROM_DEV(tx_power1[i]);
  2495. + info[i].tx_power2 = TXPOWER_G_FROM_DEV(tx_power2[i]);
  2496. + }
  2497. +
  2498. + if (spec->num_channels > 14) {
  2499. + tx_power1 = rt2x00_eeprom_addr(rt2x00dev, EEPROM_TXPOWER_A1);
  2500. + tx_power2 = rt2x00_eeprom_addr(rt2x00dev, EEPROM_TXPOWER_A2);
  2501. +
  2502. + for (i = 14; i < spec->num_channels; i++) {
  2503. + info[i].tx_power1 = TXPOWER_A_FROM_DEV(tx_power1[i]);
  2504. + info[i].tx_power2 = TXPOWER_A_FROM_DEV(tx_power2[i]);
  2505. + }
  2506. + }
  2507. +
  2508. + return 0;
  2509. +}
  2510. +
  2511. +static int rt2800pci_probe_hw(struct rt2x00_dev *rt2x00dev)
  2512. +{
  2513. + int retval;
  2514. +
  2515. + /*
  2516. + * Allocate eeprom data.
  2517. + */
  2518. + retval = rt2800pci_validate_eeprom(rt2x00dev);
  2519. + if (retval)
  2520. + return retval;
  2521. +
  2522. + retval = rt2800pci_init_eeprom(rt2x00dev);
  2523. + if (retval)
  2524. + return retval;
  2525. +
  2526. + /*
  2527. + * Initialize hw specifications.
  2528. + */
  2529. + retval = rt2800pci_probe_hw_mode(rt2x00dev);
  2530. + if (retval)
  2531. + return retval;
  2532. +
  2533. + /*
  2534. + * This device requires firmware.
  2535. + */
  2536. + __set_bit(DRIVER_REQUIRE_FIRMWARE, &rt2x00dev->flags);
  2537. + if (!modparam_nohwcrypt)
  2538. + __set_bit(CONFIG_SUPPORT_HW_CRYPTO, &rt2x00dev->flags);
  2539. +
  2540. + /*
  2541. + * Set the rssi offset.
  2542. + */
  2543. + rt2x00dev->rssi_offset = DEFAULT_RSSI_OFFSET;
  2544. +
  2545. + return 0;
  2546. +}
  2547. +
  2548. +/*
  2549. + * IEEE80211 stack callback functions.
  2550. + */
  2551. +static int rt2800pci_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
  2552. +{
  2553. + struct rt2x00_dev *rt2x00dev = hw->priv;
  2554. + u32 reg;
  2555. + bool enabled = (value < IEEE80211_MAX_RTS_THRESHOLD);
  2556. +
  2557. + rt2x00pci_register_read(rt2x00dev, TX_RTS_CFG, &reg);
  2558. + rt2x00_set_field32(&reg, TX_RTS_CFG_RTS_THRES, value);
  2559. + rt2x00pci_register_write(rt2x00dev, TX_RTS_CFG, reg);
  2560. +
  2561. + rt2x00pci_register_read(rt2x00dev, CCK_PROT_CFG, &reg);
  2562. + rt2x00_set_field32(&reg, CCK_PROT_CFG_RTS_TH_EN, enabled);
  2563. + rt2x00pci_register_write(rt2x00dev, CCK_PROT_CFG, reg);
  2564. +
  2565. + rt2x00pci_register_read(rt2x00dev, OFDM_PROT_CFG, &reg);
  2566. + rt2x00_set_field32(&reg, OFDM_PROT_CFG_RTS_TH_EN, enabled);
  2567. + rt2x00pci_register_write(rt2x00dev, OFDM_PROT_CFG, reg);
  2568. +
  2569. + rt2x00pci_register_read(rt2x00dev, MM20_PROT_CFG, &reg);
  2570. + rt2x00_set_field32(&reg, MM20_PROT_CFG_RTS_TH_EN, enabled);
  2571. + rt2x00pci_register_write(rt2x00dev, MM20_PROT_CFG, reg);
  2572. +
  2573. + rt2x00pci_register_read(rt2x00dev, MM40_PROT_CFG, &reg);
  2574. + rt2x00_set_field32(&reg, MM40_PROT_CFG_RTS_TH_EN, enabled);
  2575. + rt2x00pci_register_write(rt2x00dev, MM40_PROT_CFG, reg);
  2576. +
  2577. + rt2x00pci_register_read(rt2x00dev, GF20_PROT_CFG, &reg);
  2578. + rt2x00_set_field32(&reg, GF20_PROT_CFG_RTS_TH_EN, enabled);
  2579. + rt2x00pci_register_write(rt2x00dev, GF20_PROT_CFG, reg);
  2580. +
  2581. + rt2x00pci_register_read(rt2x00dev, GF40_PROT_CFG, &reg);
  2582. + rt2x00_set_field32(&reg, GF40_PROT_CFG_RTS_TH_EN, enabled);
  2583. + rt2x00pci_register_write(rt2x00dev, GF40_PROT_CFG, reg);
  2584. +
  2585. + return 0;
  2586. +}
  2587. +
  2588. +static int rt2800pci_conf_tx(struct ieee80211_hw *hw, u16 queue_idx,
  2589. + const struct ieee80211_tx_queue_params *params)
  2590. +{
  2591. + struct rt2x00_dev *rt2x00dev = hw->priv;
  2592. + struct data_queue *queue;
  2593. + struct rt2x00_field32 field;
  2594. + int retval;
  2595. + u32 reg;
  2596. + u32 offset;
  2597. +
  2598. + /*
  2599. + * First pass the configuration through rt2x00lib, that will
  2600. + * update the queue settings and validate the input. After that
  2601. + * we are free to update the registers based on the value
  2602. + * in the queue parameter.
  2603. + */
  2604. + retval = rt2x00mac_conf_tx(hw, queue_idx, params);
  2605. + if (retval)
  2606. + return retval;
  2607. +
  2608. + /*
  2609. + * We only need to perform additional register initialization
  2610. + * for WMM queues/
  2611. + */
  2612. + if (queue_idx >= 4)
  2613. + return 0;
  2614. +
  2615. + queue = rt2x00queue_get_queue(rt2x00dev, queue_idx);
  2616. +
  2617. + /* Update WMM TXOP register */
  2618. + offset = WMM_TXOP0_CFG + (sizeof(u32) * (!!(queue_idx & 2)));
  2619. + field.bit_offset = (queue_idx & 1) * 16;
  2620. + field.bit_mask = 0xffff << field.bit_offset;
  2621. +
  2622. + rt2x00pci_register_read(rt2x00dev, offset, &reg);
  2623. + rt2x00_set_field32(&reg, field, queue->txop);
  2624. + rt2x00pci_register_write(rt2x00dev, offset, reg);
  2625. +
  2626. + /* Update WMM registers */
  2627. + field.bit_offset = queue_idx * 4;
  2628. + field.bit_mask = 0xf << field.bit_offset;
  2629. +
  2630. + rt2x00pci_register_read(rt2x00dev, WMM_AIFSN_CFG, &reg);
  2631. + rt2x00_set_field32(&reg, field, queue->aifs);
  2632. + rt2x00pci_register_write(rt2x00dev, WMM_AIFSN_CFG, reg);
  2633. +
  2634. + rt2x00pci_register_read(rt2x00dev, WMM_CWMIN_CFG, &reg);
  2635. + rt2x00_set_field32(&reg, field, queue->cw_min);
  2636. + rt2x00pci_register_write(rt2x00dev, WMM_CWMIN_CFG, reg);
  2637. +
  2638. + rt2x00pci_register_read(rt2x00dev, WMM_CWMAX_CFG, &reg);
  2639. + rt2x00_set_field32(&reg, field, queue->cw_max);
  2640. + rt2x00pci_register_write(rt2x00dev, WMM_CWMAX_CFG, reg);
  2641. +
  2642. + /* Update EDCA registers */
  2643. + offset = EDCA_AC0_CFG + (sizeof(u32) * queue_idx);
  2644. +
  2645. + rt2x00pci_register_read(rt2x00dev, offset, &reg);
  2646. + rt2x00_set_field32(&reg, EDCA_AC0_CFG_TX_OP, queue->txop);
  2647. + rt2x00_set_field32(&reg, EDCA_AC0_CFG_AIFSN, queue->aifs);
  2648. + rt2x00_set_field32(&reg, EDCA_AC0_CFG_CWMIN, queue->cw_min);
  2649. + rt2x00_set_field32(&reg, EDCA_AC0_CFG_CWMAX, queue->cw_max);
  2650. + rt2x00pci_register_write(rt2x00dev, offset, reg);
  2651. +
  2652. + return 0;
  2653. +}
  2654. +
  2655. +static u64 rt2800pci_get_tsf(struct ieee80211_hw *hw)
  2656. +{
  2657. + struct rt2x00_dev *rt2x00dev = hw->priv;
  2658. + u64 tsf;
  2659. + u32 reg;
  2660. +
  2661. + rt2x00pci_register_read(rt2x00dev, TSF_TIMER_DW1, &reg);
  2662. + tsf = (u64) rt2x00_get_field32(reg, TSF_TIMER_DW1_HIGH_WORD) << 32;
  2663. + rt2x00pci_register_read(rt2x00dev, TSF_TIMER_DW0, &reg);
  2664. + tsf |= rt2x00_get_field32(reg, TSF_TIMER_DW0_LOW_WORD);
  2665. +
  2666. + return tsf;
  2667. +}
  2668. +
  2669. +static const struct ieee80211_ops rt2800pci_mac80211_ops = {
  2670. + .tx = rt2x00mac_tx,
  2671. + .start = rt2x00mac_start,
  2672. + .stop = rt2x00mac_stop,
  2673. + .add_interface = rt2x00mac_add_interface,
  2674. + .remove_interface = rt2x00mac_remove_interface,
  2675. + .config = rt2x00mac_config,
  2676. + .config_interface = rt2x00mac_config_interface,
  2677. + .configure_filter = rt2x00mac_configure_filter,
  2678. + .set_key = rt2x00mac_set_key,
  2679. + .get_stats = rt2x00mac_get_stats,
  2680. + .set_rts_threshold = rt2800pci_set_rts_threshold,
  2681. + .bss_info_changed = rt2x00mac_bss_info_changed,
  2682. + .conf_tx = rt2800pci_conf_tx,
  2683. + .get_tx_stats = rt2x00mac_get_tx_stats,
  2684. + .get_tsf = rt2800pci_get_tsf,
  2685. +};
  2686. +
  2687. +static const struct rt2x00lib_ops rt2800pci_rt2x00_ops = {
  2688. + .irq_handler = rt2800pci_interrupt,
  2689. + .probe_hw = rt2800pci_probe_hw,
  2690. + .get_firmware_name = rt2800pci_get_firmware_name,
  2691. + .get_firmware_crc = rt2800pci_get_firmware_crc,
  2692. + .load_firmware = rt2800pci_load_firmware,
  2693. + .initialize = rt2x00pci_initialize,
  2694. + .uninitialize = rt2x00pci_uninitialize,
  2695. + .get_entry_state = rt2800pci_get_entry_state,
  2696. + .clear_entry = rt2800pci_clear_entry,
  2697. + .set_device_state = rt2800pci_set_device_state,
  2698. + .rfkill_poll = rt2800pci_rfkill_poll,
  2699. + .link_stats = rt2800pci_link_stats,
  2700. + .reset_tuner = rt2800pci_reset_tuner,
  2701. + .link_tuner = rt2800pci_link_tuner,
  2702. + .write_tx_desc = rt2800pci_write_tx_desc,
  2703. + .write_tx_data = rt2x00pci_write_tx_data,
  2704. + .write_beacon = rt2800pci_write_beacon,
  2705. + .kick_tx_queue = rt2800pci_kick_tx_queue,
  2706. + .fill_rxdone = rt2800pci_fill_rxdone,
  2707. + .config_shared_key = rt2800pci_config_shared_key,
  2708. + .config_pairwise_key = rt2800pci_config_pairwise_key,
  2709. + .config_filter = rt2800pci_config_filter,
  2710. + .config_intf = rt2800pci_config_intf,
  2711. + .config_erp = rt2800pci_config_erp,
  2712. + .config_ant = rt2800pci_config_ant,
  2713. + .config = rt2800pci_config,
  2714. +};
  2715. +
  2716. +static const struct data_queue_desc rt2800pci_queue_rx = {
  2717. + .entry_num = RX_ENTRIES,
  2718. + .data_size = DATA_FRAME_SIZE,
  2719. + .desc_size = RXD_DESC_SIZE,
  2720. + .priv_size = sizeof(struct queue_entry_priv_pci),
  2721. +};
  2722. +
  2723. +static const struct data_queue_desc rt2800pci_queue_tx = {
  2724. + .entry_num = TX_ENTRIES,
  2725. + .data_size = DATA_FRAME_SIZE,
  2726. + .desc_size = TXD_DESC_SIZE,
  2727. + .priv_size = sizeof(struct queue_entry_priv_pci),
  2728. +};
  2729. +
  2730. +static const struct data_queue_desc rt2800pci_queue_bcn = {
  2731. + .entry_num = 8 * BEACON_ENTRIES,
  2732. + .data_size = 0, /* No DMA required for beacons */
  2733. + .desc_size = TXWI_DESC_SIZE,
  2734. + .priv_size = sizeof(struct queue_entry_priv_pci),
  2735. +};
  2736. +
  2737. +static const struct rt2x00_ops rt2800pci_ops = {
  2738. + .name = KBUILD_MODNAME,
  2739. + .max_sta_intf = 1,
  2740. + .max_ap_intf = 8,
  2741. + .eeprom_size = EEPROM_SIZE,
  2742. + .rf_size = RF_SIZE,
  2743. + .tx_queues = NUM_TX_QUEUES,
  2744. + .rx = &rt2800pci_queue_rx,
  2745. + .tx = &rt2800pci_queue_tx,
  2746. + .bcn = &rt2800pci_queue_bcn,
  2747. + .lib = &rt2800pci_rt2x00_ops,
  2748. + .hw = &rt2800pci_mac80211_ops,
  2749. +#ifdef CONFIG_RT2X00_LIB_DEBUGFS
  2750. + .debugfs = &rt2800pci_rt2x00debug,
  2751. +#endif /* CONFIG_RT2X00_LIB_DEBUGFS */
  2752. +};
  2753. +
  2754. +/*
  2755. + * RT2800pci module information.
  2756. + */
  2757. +static struct pci_device_id rt2800pci_device_table[] = {
  2758. + { PCI_DEVICE(0x1814, 0x0601), PCI_DEVICE_DATA(&rt2800pci_ops) },
  2759. + { PCI_DEVICE(0x1814, 0x0681), PCI_DEVICE_DATA(&rt2800pci_ops) },
  2760. + { PCI_DEVICE(0x1814, 0x0701), PCI_DEVICE_DATA(&rt2800pci_ops) },
  2761. + { PCI_DEVICE(0x1814, 0x0781), PCI_DEVICE_DATA(&rt2800pci_ops) },
  2762. + { PCI_DEVICE(0x1a3b, 0x1059), PCI_DEVICE_DATA(&rt2800pci_ops) },
  2763. + { 0, }
  2764. +};
  2765. +
  2766. +MODULE_AUTHOR(DRV_PROJECT);
  2767. +MODULE_VERSION(DRV_VERSION);
  2768. +MODULE_DESCRIPTION("Ralink RT2800 PCI & PCMCIA Wireless LAN driver.");
  2769. +MODULE_SUPPORTED_DEVICE("Ralink RT2860 PCI & PCMCIA chipset based cards");
  2770. +MODULE_DEVICE_TABLE(pci, rt2800pci_device_table);
  2771. +MODULE_FIRMWARE(FIRMWARE_RT2860);
  2772. +MODULE_LICENSE("GPL");
  2773. +
  2774. +static struct pci_driver rt2800pci_driver = {
  2775. + .name = KBUILD_MODNAME,
  2776. + .id_table = rt2800pci_device_table,
  2777. + .probe = rt2x00pci_probe,
  2778. + .remove = __devexit_p(rt2x00pci_remove),
  2779. + .suspend = rt2x00pci_suspend,
  2780. + .resume = rt2x00pci_resume,
  2781. +};
  2782. +
  2783. +static int __init rt2800pci_init(void)
  2784. +{
  2785. + return pci_register_driver(&rt2800pci_driver);
  2786. +}
  2787. +
  2788. +static void __exit rt2800pci_exit(void)
  2789. +{
  2790. + pci_unregister_driver(&rt2800pci_driver);
  2791. +}
  2792. +
  2793. +module_init(rt2800pci_init);
  2794. +module_exit(rt2800pci_exit);
  2795. --- /dev/null
  2796. +++ b/drivers/net/wireless/rt2x00/rt2800pci.h
  2797. @@ -0,0 +1,1881 @@
  2798. +/*
  2799. + Copyright (C) 2004 - 2009 rt2x00 SourceForge Project
  2800. + <http://rt2x00.serialmonkey.com>
  2801. +
  2802. + This program is free software; you can redistribute it and/or modify
  2803. + it under the terms of the GNU General Public License as published by
  2804. + the Free Software Foundation; either version 2 of the License, or
  2805. + (at your option) any later version.
  2806. +
  2807. + This program is distributed in the hope that it will be useful,
  2808. + but WITHOUT ANY WARRANTY; without even the implied warranty of
  2809. + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  2810. + GNU General Public License for more details.
  2811. +
  2812. + You should have received a copy of the GNU General Public License
  2813. + along with this program; if not, write to the
  2814. + Free Software Foundation, Inc.,
  2815. + 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  2816. + */
  2817. +
  2818. +/*
  2819. + Module: rt2800pci
  2820. + Abstract: Data structures and registers for the rt2800pci module.
  2821. + Supported chipsets: RT2800E & RT2800ED.
  2822. + */
  2823. +
  2824. +#ifndef RT2800PCI_H
  2825. +#define RT2800PCI_H
  2826. +
  2827. +/*
  2828. + * RF chip defines.
  2829. + *
  2830. + * RF2820 2.4G 2T3R
  2831. + * RF2850 2.4G/5G 2T3R
  2832. + * RF2720 2.4G 1T2R
  2833. + * RF2750 2.4G/5G 1T2R
  2834. + * RF3020 2.4G 1T1R
  2835. + * RF2020 2.4G B/G
  2836. + */
  2837. +#define RF2820 0x0001
  2838. +#define RF2850 0x0002
  2839. +#define RF2720 0x0003
  2840. +#define RF2750 0x0004
  2841. +#define RF3020 0x0005
  2842. +#define RF2020 0x0006
  2843. +
  2844. +/*
  2845. + * RT2860 version
  2846. + */
  2847. +#define RT2860C_VERSION 0x28600100
  2848. +#define RT2860D_VERSION 0x28600101
  2849. +#define RT2880E_VERSION 0x28720200
  2850. +#define RT2883_VERSION 0x28830300
  2851. +#define RT3070_VERSION 0x30700200
  2852. +
  2853. +/*
  2854. + * Signal information.
  2855. + * Defaul offset is required for RSSI <-> dBm conversion.
  2856. + */
  2857. +#define DEFAULT_RSSI_OFFSET 120 /* FIXME */
  2858. +
  2859. +/*
  2860. + * Register layout information.
  2861. + */
  2862. +#define CSR_REG_BASE 0x1000
  2863. +#define CSR_REG_SIZE 0x0800
  2864. +#define EEPROM_BASE 0x0000
  2865. +#define EEPROM_SIZE 0x0110
  2866. +#define BBP_BASE 0x0000
  2867. +#define BBP_SIZE 0x0080
  2868. +#define RF_BASE 0x0000
  2869. +#define RF_SIZE 0x0014
  2870. +
  2871. +/*
  2872. + * Number of TX queues.
  2873. + */
  2874. +#define NUM_TX_QUEUES 4
  2875. +
  2876. +/*
  2877. + * PCI registers.
  2878. + */
  2879. +
  2880. +/*
  2881. + * PCI Configuration Header
  2882. + */
  2883. +#define PCI_CONFIG_HEADER_VENDOR 0x0000
  2884. +#define PCI_CONFIG_HEADER_DEVICE 0x0002
  2885. +
  2886. +/*
  2887. + * E2PROM_CSR: EEPROM control register.
  2888. + * RELOAD: Write 1 to reload eeprom content.
  2889. + * TYPE_93C46: 1: 93c46, 0:93c66.
  2890. + * LOAD_STATUS: 1:loading, 0:done.
  2891. + */
  2892. +#define E2PROM_CSR 0x0004
  2893. +#define E2PROM_CSR_DATA_CLOCK FIELD32(0x00000001)
  2894. +#define E2PROM_CSR_CHIP_SELECT FIELD32(0x00000002)
  2895. +#define E2PROM_CSR_DATA_IN FIELD32(0x00000004)
  2896. +#define E2PROM_CSR_DATA_OUT FIELD32(0x00000008)
  2897. +#define E2PROM_CSR_TYPE_93C46 FIELD32(0x00000020)
  2898. +#define E2PROM_CSR_LOAD_STATUS FIELD32(0x00000040)
  2899. +#define E2PROM_CSR_RELOAD FIELD32(0x00000080)
  2900. +
  2901. +/*
  2902. + * HOST-MCU shared memory
  2903. + */
  2904. +#define HOST_CMD_CSR 0x0404
  2905. +#define HOST_CMD_CSR_HOST_COMMAND FIELD32(0x000000ff)
  2906. +
  2907. +/*
  2908. + * INT_SOURCE_CSR: Interrupt source register.
  2909. + * Write one to clear corresponding bit.
  2910. + * TX_FIFO_STATUS: FIFO Statistics is full, sw should read 0x171c
  2911. + */
  2912. +#define INT_SOURCE_CSR 0x0200
  2913. +#define INT_SOURCE_CSR_RXDELAYINT FIELD32(0x00000001)
  2914. +#define INT_SOURCE_CSR_TXDELAYINT FIELD32(0x00000002)
  2915. +#define INT_SOURCE_CSR_RX_DONE FIELD32(0x00000004)
  2916. +#define INT_SOURCE_CSR_AC0_DMA_DONE FIELD32(0x00000008)
  2917. +#define INT_SOURCE_CSR_AC1_DMA_DONE FIELD32(0x00000010)
  2918. +#define INT_SOURCE_CSR_AC2_DMA_DONE FIELD32(0x00000020)
  2919. +#define INT_SOURCE_CSR_AC3_DMA_DONE FIELD32(0x00000040)
  2920. +#define INT_SOURCE_CSR_HCCA_DMA_DONE FIELD32(0x00000080)
  2921. +#define INT_SOURCE_CSR_MGMT_DMA_DONE FIELD32(0x00000100)
  2922. +#define INT_SOURCE_CSR_MCU_COMMAND FIELD32(0x00000200)
  2923. +#define INT_SOURCE_CSR_RXTX_COHERENT FIELD32(0x00000400)
  2924. +#define INT_SOURCE_CSR_TBTT FIELD32(0x00000800)
  2925. +#define INT_SOURCE_CSR_PRE_TBTT FIELD32(0x00001000)
  2926. +#define INT_SOURCE_CSR_TX_FIFO_STATUS FIELD32(0x00002000)
  2927. +#define INT_SOURCE_CSR_AUTO_WAKEUP FIELD32(0x00004000)
  2928. +#define INT_SOURCE_CSR_GPTIMER FIELD32(0x00008000)
  2929. +#define INT_SOURCE_CSR_RX_COHERENT FIELD32(0x00010000)
  2930. +#define INT_SOURCE_CSR_TX_COHERENT FIELD32(0x00020000)
  2931. +
  2932. +/*
  2933. + * INT_MASK_CSR: Interrupt MASK register. 1: the interrupt is mask OFF.
  2934. + */
  2935. +#define INT_MASK_CSR 0x0204
  2936. +#define INT_MASK_CSR_RXDELAYINT FIELD32(0x00000001)
  2937. +#define INT_MASK_CSR_TXDELAYINT FIELD32(0x00000002)
  2938. +#define INT_MASK_CSR_RX_DONE FIELD32(0x00000004)
  2939. +#define INT_MASK_CSR_AC0_DMA_DONE FIELD32(0x00000008)
  2940. +#define INT_MASK_CSR_AC1_DMA_DONE FIELD32(0x00000010)
  2941. +#define INT_MASK_CSR_AC2_DMA_DONE FIELD32(0x00000020)
  2942. +#define INT_MASK_CSR_AC3_DMA_DONE FIELD32(0x00000040)
  2943. +#define INT_MASK_CSR_HCCA_DMA_DONE FIELD32(0x00000080)
  2944. +#define INT_MASK_CSR_MGMT_DMA_DONE FIELD32(0x00000100)
  2945. +#define INT_MASK_CSR_MCU_COMMAND FIELD32(0x00000200)
  2946. +#define INT_MASK_CSR_RXTX_COHERENT FIELD32(0x00000400)
  2947. +#define INT_MASK_CSR_TBTT FIELD32(0x00000800)
  2948. +#define INT_MASK_CSR_PRE_TBTT FIELD32(0x00001000)
  2949. +#define INT_MASK_CSR_TX_FIFO_STATUS FIELD32(0x00002000)
  2950. +#define INT_MASK_CSR_AUTO_WAKEUP FIELD32(0x00004000)
  2951. +#define INT_MASK_CSR_GPTIMER FIELD32(0x00008000)
  2952. +#define INT_MASK_CSR_RX_COHERENT FIELD32(0x00010000)
  2953. +#define INT_MASK_CSR_TX_COHERENT FIELD32(0x00020000)
  2954. +
  2955. +/*
  2956. + * WPDMA_GLO_CFG
  2957. + */
  2958. +#define WPDMA_GLO_CFG 0x0208
  2959. +#define WPDMA_GLO_CFG_ENABLE_TX_DMA FIELD32(0x00000001)
  2960. +#define WPDMA_GLO_CFG_TX_DMA_BUSY FIELD32(0x00000002)
  2961. +#define WPDMA_GLO_CFG_ENABLE_RX_DMA FIELD32(0x00000004)
  2962. +#define WPDMA_GLO_CFG_RX_DMA_BUSY FIELD32(0x00000008)
  2963. +#define WPDMA_GLO_CFG_WP_DMA_BURST_SIZE FIELD32(0x00000030)
  2964. +#define WPDMA_GLO_CFG_TX_WRITEBACK_DONE FIELD32(0x00000040)
  2965. +#define WPDMA_GLO_CFG_BIG_ENDIAN FIELD32(0x00000080)
  2966. +#define WPDMA_GLO_CFG_RX_HDR_SCATTER FIELD32(0x0000ff00)
  2967. +#define WPDMA_GLO_CFG_HDR_SEG_LEN FIELD32(0xffff0000)
  2968. +
  2969. +/*
  2970. + * WPDMA_RST_IDX
  2971. + */
  2972. +#define WPDMA_RST_IDX 0x020c
  2973. +#define WPDMA_RST_IDX_DTX_IDX0 FIELD32(0x00000001)
  2974. +#define WPDMA_RST_IDX_DTX_IDX1 FIELD32(0x00000002)
  2975. +#define WPDMA_RST_IDX_DTX_IDX2 FIELD32(0x00000004)
  2976. +#define WPDMA_RST_IDX_DTX_IDX3 FIELD32(0x00000008)
  2977. +#define WPDMA_RST_IDX_DTX_IDX4 FIELD32(0x00000010)
  2978. +#define WPDMA_RST_IDX_DTX_IDX5 FIELD32(0x00000020)
  2979. +#define WPDMA_RST_IDX_DRX_IDX0 FIELD32(0x00010000)
  2980. +
  2981. +/*
  2982. + * DELAY_INT_CFG
  2983. + */
  2984. +#define DELAY_INT_CFG 0x0210
  2985. +#define DELAY_INT_CFG_RXMAX_PTIME FIELD32(0x000000ff)
  2986. +#define DELAY_INT_CFG_RXMAX_PINT FIELD32(0x00007f00)
  2987. +#define DELAY_INT_CFG_RXDLY_INT_EN FIELD32(0x00008000)
  2988. +#define DELAY_INT_CFG_TXMAX_PTIME FIELD32(0x00ff0000)
  2989. +#define DELAY_INT_CFG_TXMAX_PINT FIELD32(0x7f000000)
  2990. +#define DELAY_INT_CFG_TXDLY_INT_EN FIELD32(0x80000000)
  2991. +
  2992. +/*
  2993. + * WMM_AIFSN_CFG: Aifsn for each EDCA AC
  2994. + * AIFSN0: AC_BE
  2995. + * AIFSN1: AC_BK
  2996. + * AIFSN1: AC_VI
  2997. + * AIFSN1: AC_VO
  2998. + */
  2999. +#define WMM_AIFSN_CFG 0x0214
  3000. +#define WMM_AIFSN_CFG_AIFSN0 FIELD32(0x0000000f)
  3001. +#define WMM_AIFSN_CFG_AIFSN1 FIELD32(0x000000f0)
  3002. +#define WMM_AIFSN_CFG_AIFSN2 FIELD32(0x00000f00)
  3003. +#define WMM_AIFSN_CFG_AIFSN3 FIELD32(0x0000f000)
  3004. +
  3005. +/*
  3006. + * WMM_CWMIN_CSR: CWmin for each EDCA AC
  3007. + * CWMIN0: AC_BE
  3008. + * CWMIN1: AC_BK
  3009. + * CWMIN1: AC_VI
  3010. + * CWMIN1: AC_VO
  3011. + */
  3012. +#define WMM_CWMIN_CFG 0x0218
  3013. +#define WMM_CWMIN_CFG_CWMIN0 FIELD32(0x0000000f)
  3014. +#define WMM_CWMIN_CFG_CWMIN1 FIELD32(0x000000f0)
  3015. +#define WMM_CWMIN_CFG_CWMIN2 FIELD32(0x00000f00)
  3016. +#define WMM_CWMIN_CFG_CWMIN3 FIELD32(0x0000f000)
  3017. +
  3018. +/*
  3019. + * WMM_CWMAX_CSR: CWmax for each EDCA AC
  3020. + * CWMAX0: AC_BE
  3021. + * CWMAX1: AC_BK
  3022. + * CWMAX1: AC_VI
  3023. + * CWMAX1: AC_VO
  3024. + */
  3025. +#define WMM_CWMAX_CFG 0x021c
  3026. +#define WMM_CWMAX_CFG_CWMAX0 FIELD32(0x0000000f)
  3027. +#define WMM_CWMAX_CFG_CWMAX1 FIELD32(0x000000f0)
  3028. +#define WMM_CWMAX_CFG_CWMAX2 FIELD32(0x00000f00)
  3029. +#define WMM_CWMAX_CFG_CWMAX3 FIELD32(0x0000f000)
  3030. +
  3031. +/*
  3032. + * AC_TXOP0: AC_BK/AC_BE TXOP register
  3033. + * AC0TXOP: AC_BK in unit of 32us
  3034. + * AC1TXOP: AC_BE in unit of 32us
  3035. + */
  3036. +#define WMM_TXOP0_CFG 0x0220
  3037. +#define WMM_TXOP0_CFG_AC0TXOP FIELD32(0x0000ffff)
  3038. +#define WMM_TXOP0_CFG_AC1TXOP FIELD32(0xffff0000)
  3039. +
  3040. +/*
  3041. + * AC_TXOP1: AC_VO/AC_VI TXOP register
  3042. + * AC2TXOP: AC_VI in unit of 32us
  3043. + * AC3TXOP: AC_VO in unit of 32us
  3044. + */
  3045. +#define WMM_TXOP1_CFG 0x0224
  3046. +#define WMM_TXOP1_CFG_AC2TXOP FIELD32(0x0000ffff)
  3047. +#define WMM_TXOP1_CFG_AC3TXOP FIELD32(0xffff0000)
  3048. +
  3049. +/*
  3050. + * RINGREG_DIFF
  3051. + */
  3052. +#define RINGREG_DIFF 0x0010
  3053. +
  3054. +/*
  3055. + * GPIO_CTRL_CFG:
  3056. + */
  3057. +#define GPIO_CTRL_CFG 0x0228
  3058. +#define GPIO_CTRL_CFG_BIT0 FIELD32(0x00000001)
  3059. +#define GPIO_CTRL_CFG_BIT1 FIELD32(0x00000002)
  3060. +#define GPIO_CTRL_CFG_BIT2 FIELD32(0x00000004)
  3061. +#define GPIO_CTRL_CFG_BIT3 FIELD32(0x00000008)
  3062. +#define GPIO_CTRL_CFG_BIT4 FIELD32(0x00000010)
  3063. +#define GPIO_CTRL_CFG_BIT5 FIELD32(0x00000020)
  3064. +#define GPIO_CTRL_CFG_BIT6 FIELD32(0x00000040)
  3065. +#define GPIO_CTRL_CFG_BIT7 FIELD32(0x00000080)
  3066. +#define GPIO_CTRL_CFG_BIT8 FIELD32(0x00000100)
  3067. +
  3068. +/*
  3069. + * MCU_CMD_CFG
  3070. + */
  3071. +#define MCU_CMD_CFG 0x022c
  3072. +
  3073. +/*
  3074. + * AC_BK register offsets
  3075. + */
  3076. +#define TX_BASE_PTR0 0x0230
  3077. +#define TX_MAX_CNT0 0x0234
  3078. +#define TX_CTX_IDX0 0x0238
  3079. +#define TX_DTX_IDX0 0x023c
  3080. +
  3081. +/*
  3082. + * AC_BE register offsets
  3083. + */
  3084. +#define TX_BASE_PTR1 0x0240
  3085. +#define TX_MAX_CNT1 0x0244
  3086. +#define TX_CTX_IDX1 0x0248
  3087. +#define TX_DTX_IDX1 0x024c
  3088. +
  3089. +/*
  3090. + * AC_VI register offsets
  3091. + */
  3092. +#define TX_BASE_PTR2 0x0250
  3093. +#define TX_MAX_CNT2 0x0254
  3094. +#define TX_CTX_IDX2 0x0258
  3095. +#define TX_DTX_IDX2 0x025c
  3096. +
  3097. +/*
  3098. + * AC_VO register offsets
  3099. + */
  3100. +#define TX_BASE_PTR3 0x0260
  3101. +#define TX_MAX_CNT3 0x0264
  3102. +#define TX_CTX_IDX3 0x0268
  3103. +#define TX_DTX_IDX3 0x026c
  3104. +
  3105. +/*
  3106. + * HCCA register offsets
  3107. + */
  3108. +#define TX_BASE_PTR4 0x0270
  3109. +#define TX_MAX_CNT4 0x0274
  3110. +#define TX_CTX_IDX4 0x0278
  3111. +#define TX_DTX_IDX4 0x027c
  3112. +
  3113. +/*
  3114. + * MGMT register offsets
  3115. + */
  3116. +#define TX_BASE_PTR5 0x0280
  3117. +#define TX_MAX_CNT5 0x0284
  3118. +#define TX_CTX_IDX5 0x0288
  3119. +#define TX_DTX_IDX5 0x028c
  3120. +
  3121. +/*
  3122. + * Queue register offset macros
  3123. + */
  3124. +#define TX_QUEUE_REG_OFFSET 0x10
  3125. +#define TX_BASE_PTR(__x) TX_BASE_PTR0 + ((__x) * TX_QUEUE_REG_OFFSET)
  3126. +#define TX_MAX_CNT(__x) TX_MAX_CNT0 + ((__x) * TX_QUEUE_REG_OFFSET)
  3127. +#define TX_CTX_IDX(__x) TX_CTX_IDX0 + ((__x) * TX_QUEUE_REG_OFFSET)
  3128. +#define TX_DTX_IDX(__x) TX_DTX_IDX0 + ((__x) * TX_QUEUE_REG_OFFSET)
  3129. +
  3130. +/*
  3131. + * RX register offsets
  3132. + */
  3133. +#define RX_BASE_PTR 0x0290
  3134. +#define RX_MAX_CNT 0x0294
  3135. +#define RX_CRX_IDX 0x0298
  3136. +#define RX_DRX_IDX 0x029c
  3137. +
  3138. +/*
  3139. + * PBF_SYS_CTRL
  3140. + * HOST_RAM_WRITE: enable Host program ram write selection
  3141. + */
  3142. +#define PBF_SYS_CTRL 0x0400
  3143. +#define PBF_SYS_CTRL_READY FIELD32(0x00000080)
  3144. +#define PBF_SYS_CTRL_HOST_RAM_WRITE FIELD32(0x00010000)
  3145. +
  3146. +/*
  3147. + * PBF registers
  3148. + * Most are for debug. Driver doesn't touch PBF register.
  3149. + */
  3150. +#define PBF_CFG 0x0408
  3151. +#define PBF_MAX_PCNT 0x040c
  3152. +#define PBF_CTRL 0x0410
  3153. +#define PBF_INT_STA 0x0414
  3154. +#define PBF_INT_ENA 0x0418
  3155. +
  3156. +/*
  3157. + * BCN_OFFSET0:
  3158. + */
  3159. +#define BCN_OFFSET0 0x042c
  3160. +#define BCN_OFFSET0_BCN0 FIELD32(0x000000ff)
  3161. +#define BCN_OFFSET0_BCN1 FIELD32(0x0000ff00)
  3162. +#define BCN_OFFSET0_BCN2 FIELD32(0x00ff0000)
  3163. +#define BCN_OFFSET0_BCN3 FIELD32(0xff000000)
  3164. +
  3165. +/*
  3166. + * BCN_OFFSET1:
  3167. + */
  3168. +#define BCN_OFFSET1 0x0430
  3169. +#define BCN_OFFSET1_BCN4 FIELD32(0x000000ff)
  3170. +#define BCN_OFFSET1_BCN5 FIELD32(0x0000ff00)
  3171. +#define BCN_OFFSET1_BCN6 FIELD32(0x00ff0000)
  3172. +#define BCN_OFFSET1_BCN7 FIELD32(0xff000000)
  3173. +
  3174. +/*
  3175. + * PBF registers
  3176. + * Most are for debug. Driver doesn't touch PBF register.
  3177. + */
  3178. +#define TXRXQ_PCNT 0x0438
  3179. +#define PBF_DBG 0x043c
  3180. +
  3181. +/*
  3182. + * MAC Control/Status Registers(CSR).
  3183. + * Some values are set in TU, whereas 1 TU == 1024 us.
  3184. + */
  3185. +
  3186. +/*
  3187. + * MAC_CSR0: ASIC revision number.
  3188. + * ASIC_REV: 0
  3189. + * ASIC_VER: 2860
  3190. + */
  3191. +#define MAC_CSR0 0x1000
  3192. +#define MAC_CSR0_ASIC_REV FIELD32(0x0000ffff)
  3193. +#define MAC_CSR0_ASIC_VER FIELD32(0xffff0000)
  3194. +
  3195. +/*
  3196. + * MAC_SYS_CTRL:
  3197. + */
  3198. +#define MAC_SYS_CTRL 0x1004
  3199. +#define MAC_SYS_CTRL_RESET_CSR FIELD32(0x00000001)
  3200. +#define MAC_SYS_CTRL_RESET_BBP FIELD32(0x00000002)
  3201. +#define MAC_SYS_CTRL_ENABLE_TX FIELD32(0x00000004)
  3202. +#define MAC_SYS_CTRL_ENABLE_RX FIELD32(0x00000008)
  3203. +#define MAC_SYS_CTRL_CONTINUOUS_TX FIELD32(0x00000010)
  3204. +#define MAC_SYS_CTRL_LOOPBACK FIELD32(0x00000020)
  3205. +#define MAC_SYS_CTRL_WLAN_HALT FIELD32(0x00000040)
  3206. +#define MAC_SYS_CTRL_RX_TIMESTAMP FIELD32(0x00000080)
  3207. +
  3208. +/*
  3209. + * MAC_ADDR_DW0: STA MAC register 0
  3210. + */
  3211. +#define MAC_ADDR_DW0 0x1008
  3212. +#define MAC_ADDR_DW0_BYTE0 FIELD32(0x000000ff)
  3213. +#define MAC_ADDR_DW0_BYTE1 FIELD32(0x0000ff00)
  3214. +#define MAC_ADDR_DW0_BYTE2 FIELD32(0x00ff0000)
  3215. +#define MAC_ADDR_DW0_BYTE3 FIELD32(0xff000000)
  3216. +
  3217. +/*
  3218. + * MAC_ADDR_DW1: STA MAC register 1
  3219. + * UNICAST_TO_ME_MASK:
  3220. + * Used to mask off bits from byte 5 of the MAC address
  3221. + * to determine the UNICAST_TO_ME bit for RX frames.
  3222. + * The full mask is complemented by BSS_ID_MASK:
  3223. + * MASK = BSS_ID_MASK & UNICAST_TO_ME_MASK
  3224. + */
  3225. +#define MAC_ADDR_DW1 0x100c
  3226. +#define MAC_ADDR_DW1_BYTE4 FIELD32(0x000000ff)
  3227. +#define MAC_ADDR_DW1_BYTE5 FIELD32(0x0000ff00)
  3228. +#define MAC_ADDR_DW1_UNICAST_TO_ME_MASK FIELD32(0x00ff0000)
  3229. +
  3230. +/*
  3231. + * MAC_BSSID_DW0: BSSID register 0
  3232. + */
  3233. +#define MAC_BSSID_DW0 0x1010
  3234. +#define MAC_BSSID_DW0_BYTE0 FIELD32(0x000000ff)
  3235. +#define MAC_BSSID_DW0_BYTE1 FIELD32(0x0000ff00)
  3236. +#define MAC_BSSID_DW0_BYTE2 FIELD32(0x00ff0000)
  3237. +#define MAC_BSSID_DW0_BYTE3 FIELD32(0xff000000)
  3238. +
  3239. +/*
  3240. + * MAC_BSSID_DW1: BSSID register 1
  3241. + * BSS_ID_MASK:
  3242. + * 0: 1-BSSID mode (BSS index = 0)
  3243. + * 1: 2-BSSID mode (BSS index: Byte5, bit 0)
  3244. + * 2: 4-BSSID mode (BSS index: byte5, bit 0 - 1)
  3245. + * 3: 8-BSSID mode (BSS index: byte5, bit 0 - 2)
  3246. + * This mask is used to mask off bits 0, 1 and 2 of byte 5 of the
  3247. + * BSSID. This will make sure that those bits will be ignored
  3248. + * when determining the MY_BSS of RX frames.
  3249. + */
  3250. +#define MAC_BSSID_DW1 0x1014
  3251. +#define MAC_BSSID_DW1_BYTE4 FIELD32(0x000000ff)
  3252. +#define MAC_BSSID_DW1_BYTE5 FIELD32(0x0000ff00)
  3253. +#define MAC_BSSID_DW1_BSS_ID_MASK FIELD32(0x00030000)
  3254. +#define MAC_BSSID_DW1_BSS_BCN_NUM FIELD32(0x001c0000)
  3255. +
  3256. +/*
  3257. + * MAX_LEN_CFG: Maximum frame length register.
  3258. + * MAX_MPDU: rt2860b max 16k bytes
  3259. + * MAX_PSDU: Maximum PSDU length
  3260. + * (power factor) 0:2^13, 1:2^14, 2:2^15, 3:2^16
  3261. + */
  3262. +#define MAX_LEN_CFG 0x1018
  3263. +#define MAX_LEN_CFG_MAX_MPDU FIELD32(0x00000fff)
  3264. +#define MAX_LEN_CFG_MAX_PSDU FIELD32(0x00003000)
  3265. +#define MAX_LEN_CFG_MIN_PSDU FIELD32(0x0000c000)
  3266. +#define MAX_LEN_CFG_MIN_MPDU FIELD32(0x000f0000)
  3267. +
  3268. +/*
  3269. + * BBP_CSR_CFG: BBP serial control register
  3270. + * VALUE: Register value to program into BBP
  3271. + * REG_NUM: Selected BBP register
  3272. + * READ_CONTROL: 0 write BBP, 1 read BBP
  3273. + * BUSY: ASIC is busy executing BBP commands
  3274. + * BBP_PAR_DUR: 0 4 MAC clocks, 1 8 MAC clocks
  3275. + * BBP_RW_MODE: 0 serial, 1 paralell
  3276. + */
  3277. +#define BBP_CSR_CFG 0x101c
  3278. +#define BBP_CSR_CFG_VALUE FIELD32(0x000000ff)
  3279. +#define BBP_CSR_CFG_REGNUM FIELD32(0x0000ff00)
  3280. +#define BBP_CSR_CFG_READ_CONTROL FIELD32(0x00010000)
  3281. +#define BBP_CSR_CFG_BUSY FIELD32(0x00020000)
  3282. +#define BBP_CSR_CFG_BBP_PAR_DUR FIELD32(0x00040000)
  3283. +#define BBP_CSR_CFG_BBP_RW_MODE FIELD32(0x00080000)
  3284. +
  3285. +/*
  3286. + * RF_CSR_CFG0: RF control register
  3287. + * REGID_AND_VALUE: Register value to program into RF
  3288. + * BITWIDTH: Selected RF register
  3289. + * STANDBYMODE: 0 high when standby, 1 low when standby
  3290. + * SEL: 0 RF_LE0 activate, 1 RF_LE1 activate
  3291. + * BUSY: ASIC is busy executing RF commands
  3292. + */
  3293. +#define RF_CSR_CFG0 0x1020
  3294. +#define RF_CSR_CFG0_REGID_AND_VALUE FIELD32(0x00ffffff)
  3295. +#define RF_CSR_CFG0_BITWIDTH FIELD32(0x1f000000)
  3296. +#define RF_CSR_CFG0_REG_VALUE_BW FIELD32(0x1fffffff)
  3297. +#define RF_CSR_CFG0_STANDBYMODE FIELD32(0x20000000)
  3298. +#define RF_CSR_CFG0_SEL FIELD32(0x40000000)
  3299. +#define RF_CSR_CFG0_BUSY FIELD32(0x80000000)
  3300. +
  3301. +/*
  3302. + * RF_CSR_CFG1: RF control register
  3303. + * REGID_AND_VALUE: Register value to program into RF
  3304. + * RFGAP: Gap between BB_CONTROL_RF and RF_LE
  3305. + * 0: 3 system clock cycle (37.5usec)
  3306. + * 1: 5 system clock cycle (62.5usec)
  3307. + */
  3308. +#define RF_CSR_CFG1 0x1024
  3309. +#define RF_CSR_CFG1_REGID_AND_VALUE FIELD32(0x00ffffff)
  3310. +#define RF_CSR_CFG1_RFGAP FIELD32(0x1f000000)
  3311. +
  3312. +/*
  3313. + * RF_CSR_CFG2: RF control register
  3314. + * VALUE: Register value to program into RF
  3315. + * RFGAP: Gap between BB_CONTROL_RF and RF_LE
  3316. + * 0: 3 system clock cycle (37.5usec)
  3317. + * 1: 5 system clock cycle (62.5usec)
  3318. + */
  3319. +#define RF_CSR_CFG2 0x1028
  3320. +#define RF_CSR_CFG2_VALUE FIELD32(0x00ffffff)
  3321. +
  3322. +/*
  3323. + * LED_CFG: LED control
  3324. + * color LED's:
  3325. + * 0: off
  3326. + * 1: blinking upon TX2
  3327. + * 2: periodic slow blinking
  3328. + * 3: always on
  3329. + * LED polarity:
  3330. + * 0: active low
  3331. + * 1: active high
  3332. + */
  3333. +#define LED_CFG 0x102c
  3334. +#define LED_CFG_ON_PERIOD FIELD32(0x000000ff)
  3335. +#define LED_CFG_OFF_PERIOD FIELD32(0x0000ff00)
  3336. +#define LED_CFG_SLOW_BLINK_PERIOD FIELD32(0x003f0000)
  3337. +#define LED_CFG_R_LED_MODE FIELD32(0x03000000)
  3338. +#define LED_CFG_G_LED_MODE FIELD32(0x0c000000)
  3339. +#define LED_CFG_Y_LED_MODE FIELD32(0x30000000)
  3340. +#define LED_CFG_LED_POLAR FIELD32(0x40000000)
  3341. +
  3342. +/*
  3343. + * XIFS_TIME_CFG: MAC timing
  3344. + * CCKM_SIFS_TIME: unit 1us. Applied after CCK RX/TX
  3345. + * OFDM_SIFS_TIME: unit 1us. Applied after OFDM RX/TX
  3346. + * OFDM_XIFS_TIME: unit 1us. Applied after OFDM RX
  3347. + * when MAC doesn't reference BBP signal BBRXEND
  3348. + * EIFS: unit 1us
  3349. + * BB_RXEND_ENABLE: reference RXEND signal to begin XIFS defer
  3350. + *
  3351. + */
  3352. +#define XIFS_TIME_CFG 0x1100
  3353. +#define XIFS_TIME_CFG_CCKM_SIFS_TIME FIELD32(0x000000ff)
  3354. +#define XIFS_TIME_CFG_OFDM_SIFS_TIME FIELD32(0x0000ff00)
  3355. +#define XIFS_TIME_CFG_OFDM_XIFS_TIME FIELD32(0x000f0000)
  3356. +#define XIFS_TIME_CFG_EIFS FIELD32(0x1ff00000)
  3357. +#define XIFS_TIME_CFG_BB_RXEND_ENABLE FIELD32(0x20000000)
  3358. +
  3359. +/*
  3360. + * BKOFF_SLOT_CFG:
  3361. + */
  3362. +#define BKOFF_SLOT_CFG 0x1104
  3363. +#define BKOFF_SLOT_CFG_SLOT_TIME FIELD32(0x000000ff)
  3364. +#define BKOFF_SLOT_CFG_CC_DELAY_TIME FIELD32(0x0000ff00)
  3365. +
  3366. +/*
  3367. + * NAV_TIME_CFG:
  3368. + */
  3369. +#define NAV_TIME_CFG 0x1108
  3370. +#define NAV_TIME_CFG_SIFS FIELD32(0x000000ff)
  3371. +#define NAV_TIME_CFG_SLOT_TIME FIELD32(0x0000ff00)
  3372. +#define NAV_TIME_CFG_EIFS FIELD32(0x01ff0000)
  3373. +#define NAV_TIME_ZERO_SIFS FIELD32(0x02000000)
  3374. +
  3375. +/*
  3376. + * CH_TIME_CFG: count as channel busy
  3377. + */
  3378. +#define CH_TIME_CFG 0x110c
  3379. +
  3380. +/*
  3381. + * PBF_LIFE_TIMER: TX/RX MPDU timestamp timer (free run) Unit: 1us
  3382. + */
  3383. +#define PBF_LIFE_TIMER 0x1110
  3384. +
  3385. +/*
  3386. + * BCN_TIME_CFG:
  3387. + * BEACON_INTERVAL: in unit of 1/16 TU
  3388. + * TSF_TICKING: Enable TSF auto counting
  3389. + * TSF_SYNC: Enable TSF sync, 00: disable, 01: infra mode, 10: ad-hoc mode
  3390. + * BEACON_GEN: Enable beacon generator
  3391. + */
  3392. +#define BCN_TIME_CFG 0x1114
  3393. +#define BCN_TIME_CFG_BEACON_INTERVAL FIELD32(0x0000ffff)
  3394. +#define BCN_TIME_CFG_TSF_TICKING FIELD32(0x00010000)
  3395. +#define BCN_TIME_CFG_TSF_SYNC FIELD32(0x00060000)
  3396. +#define BCN_TIME_CFG_TBTT_ENABLE FIELD32(0x00080000)
  3397. +#define BCN_TIME_CFG_BEACON_GEN FIELD32(0x00100000)
  3398. +#define BCN_TIME_CFG_TX_TIME_COMPENSATE FIELD32(0xf0000000)
  3399. +
  3400. +/*
  3401. + * TBTT_SYNC_CFG:
  3402. + */
  3403. +#define TBTT_SYNC_CFG 0x1118
  3404. +
  3405. +/*
  3406. + * TSF_TIMER_DW0: Local lsb TSF timer, read-only
  3407. + */
  3408. +#define TSF_TIMER_DW0 0x111c
  3409. +#define TSF_TIMER_DW0_LOW_WORD FIELD32(0xffffffff)
  3410. +
  3411. +/*
  3412. + * TSF_TIMER_DW1: Local msb TSF timer, read-only
  3413. + */
  3414. +#define TSF_TIMER_DW1 0x1120
  3415. +#define TSF_TIMER_DW1_HIGH_WORD FIELD32(0xffffffff)
  3416. +
  3417. +/*
  3418. + * TBTT_TIMER: TImer remains till next TBTT, read-only
  3419. + */
  3420. +#define TBTT_TIMER 0x1124
  3421. +
  3422. +/*
  3423. + * INT_TIMER_CFG:
  3424. + */
  3425. +#define INT_TIMER_CFG 0x1128
  3426. +
  3427. +/*
  3428. + * INT_TIMER_EN: GP-timer and pre-tbtt Int enable
  3429. + */
  3430. +#define INT_TIMER_EN 0x112c
  3431. +
  3432. +/*
  3433. + * CH_IDLE_STA: channel idle time
  3434. + */
  3435. +#define CH_IDLE_STA 0x1130
  3436. +
  3437. +/*
  3438. + * CH_BUSY_STA: channel busy time
  3439. + */
  3440. +#define CH_BUSY_STA 0x1134
  3441. +
  3442. +/*
  3443. + * MAC_STATUS_CFG:
  3444. + * BBP_RF_BUSY: When set to 0, BBP and RF are stable.
  3445. + * if 1 or higher one of the 2 registers is busy.
  3446. + */
  3447. +#define MAC_STATUS_CFG 0x1200
  3448. +#define MAC_STATUS_CFG_BBP_RF_BUSY FIELD32(0x00000003)
  3449. +
  3450. +/*
  3451. + * PWR_PIN_CFG:
  3452. + */
  3453. +#define PWR_PIN_CFG 0x1204
  3454. +
  3455. +/*
  3456. + * AUTOWAKEUP_CFG: Manual power control / status register
  3457. + * TBCN_BEFORE_WAKE: ForceWake has high privilege than PutToSleep when both set
  3458. + * AUTOWAKE: 0:sleep, 1:awake
  3459. + */
  3460. +#define AUTOWAKEUP_CFG 0x1208
  3461. +#define AUTOWAKEUP_CFG_AUTO_LEAD_TIME FIELD32(0x000000ff)
  3462. +#define AUTOWAKEUP_CFG_TBCN_BEFORE_WAKE FIELD32(0x00007f00)
  3463. +#define AUTOWAKEUP_CFG_AUTOWAKE FIELD32(0x00008000)
  3464. +
  3465. +/*
  3466. + * EDCA_AC0_CFG:
  3467. + */
  3468. +#define EDCA_AC0_CFG 0x1300
  3469. +#define EDCA_AC0_CFG_TX_OP FIELD32(0x000000ff)
  3470. +#define EDCA_AC0_CFG_AIFSN FIELD32(0x00000f00)
  3471. +#define EDCA_AC0_CFG_CWMIN FIELD32(0x0000f000)
  3472. +#define EDCA_AC0_CFG_CWMAX FIELD32(0x000f0000)
  3473. +
  3474. +/*
  3475. + * EDCA_AC1_CFG:
  3476. + */
  3477. +#define EDCA_AC1_CFG 0x1304
  3478. +#define EDCA_AC1_CFG_TX_OP FIELD32(0x000000ff)
  3479. +#define EDCA_AC1_CFG_AIFSN FIELD32(0x00000f00)
  3480. +#define EDCA_AC1_CFG_CWMIN FIELD32(0x0000f000)
  3481. +#define EDCA_AC1_CFG_CWMAX FIELD32(0x000f0000)
  3482. +
  3483. +/*
  3484. + * EDCA_AC2_CFG:
  3485. + */
  3486. +#define EDCA_AC2_CFG 0x1308
  3487. +#define EDCA_AC2_CFG_TX_OP FIELD32(0x000000ff)
  3488. +#define EDCA_AC2_CFG_AIFSN FIELD32(0x00000f00)
  3489. +#define EDCA_AC2_CFG_CWMIN FIELD32(0x0000f000)
  3490. +#define EDCA_AC2_CFG_CWMAX FIELD32(0x000f0000)
  3491. +
  3492. +/*
  3493. + * EDCA_AC3_CFG:
  3494. + */
  3495. +#define EDCA_AC3_CFG 0x130c
  3496. +#define EDCA_AC3_CFG_TX_OP FIELD32(0x000000ff)
  3497. +#define EDCA_AC3_CFG_AIFSN FIELD32(0x00000f00)
  3498. +#define EDCA_AC3_CFG_CWMIN FIELD32(0x0000f000)
  3499. +#define EDCA_AC3_CFG_CWMAX FIELD32(0x000f0000)
  3500. +
  3501. +/*
  3502. + * EDCA_TID_AC_MAP:
  3503. + */
  3504. +#define EDCA_TID_AC_MAP 0x1310
  3505. +
  3506. +/*
  3507. + * TX_PWR_CFG_0:
  3508. + */
  3509. +#define TX_PWR_CFG_0 0x1314
  3510. +#define TX_PWR_CFG_0_1MBS FIELD32(0x0000000f)
  3511. +#define TX_PWR_CFG_0_2MBS FIELD32(0x000000f0)
  3512. +#define TX_PWR_CFG_0_55MBS FIELD32(0x00000f00)
  3513. +#define TX_PWR_CFG_0_11MBS FIELD32(0x0000f000)
  3514. +#define TX_PWR_CFG_0_6MBS FIELD32(0x000f0000)
  3515. +#define TX_PWR_CFG_0_9MBS FIELD32(0x00f00000)
  3516. +#define TX_PWR_CFG_0_12MBS FIELD32(0x0f000000)
  3517. +#define TX_PWR_CFG_0_18MBS FIELD32(0xf0000000)
  3518. +
  3519. +/*
  3520. + * TX_PWR_CFG_1:
  3521. + */
  3522. +#define TX_PWR_CFG_1 0x1318
  3523. +#define TX_PWR_CFG_1_24MBS FIELD32(0x0000000f)
  3524. +#define TX_PWR_CFG_1_36MBS FIELD32(0x000000f0)
  3525. +#define TX_PWR_CFG_1_48MBS FIELD32(0x00000f00)
  3526. +#define TX_PWR_CFG_1_54MBS FIELD32(0x0000f000)
  3527. +#define TX_PWR_CFG_1_MCS0 FIELD32(0x000f0000)
  3528. +#define TX_PWR_CFG_1_MCS1 FIELD32(0x00f00000)
  3529. +#define TX_PWR_CFG_1_MCS2 FIELD32(0x0f000000)
  3530. +#define TX_PWR_CFG_1_MCS3 FIELD32(0xf0000000)
  3531. +
  3532. +/*
  3533. + * TX_PWR_CFG_2:
  3534. + */
  3535. +#define TX_PWR_CFG_2 0x131c
  3536. +#define TX_PWR_CFG_2_MCS4 FIELD32(0x0000000f)
  3537. +#define TX_PWR_CFG_2_MCS5 FIELD32(0x000000f0)
  3538. +#define TX_PWR_CFG_2_MCS6 FIELD32(0x00000f00)
  3539. +#define TX_PWR_CFG_2_MCS7 FIELD32(0x0000f000)
  3540. +#define TX_PWR_CFG_2_MCS8 FIELD32(0x000f0000)
  3541. +#define TX_PWR_CFG_2_MCS9 FIELD32(0x00f00000)
  3542. +#define TX_PWR_CFG_2_MCS10 FIELD32(0x0f000000)
  3543. +#define TX_PWR_CFG_2_MCS11 FIELD32(0xf0000000)
  3544. +
  3545. +/*
  3546. + * TX_PWR_CFG_3:
  3547. + */
  3548. +#define TX_PWR_CFG_3 0x1320
  3549. +#define TX_PWR_CFG_3_MCS12 FIELD32(0x0000000f)
  3550. +#define TX_PWR_CFG_3_MCS13 FIELD32(0x000000f0)
  3551. +#define TX_PWR_CFG_3_MCS14 FIELD32(0x00000f00)
  3552. +#define TX_PWR_CFG_3_MCS15 FIELD32(0x0000f000)
  3553. +#define TX_PWR_CFG_3_UKNOWN1 FIELD32(0x000f0000)
  3554. +#define TX_PWR_CFG_3_UKNOWN2 FIELD32(0x00f00000)
  3555. +#define TX_PWR_CFG_3_UKNOWN3 FIELD32(0x0f000000)
  3556. +#define TX_PWR_CFG_3_UKNOWN4 FIELD32(0xf0000000)
  3557. +
  3558. +/*
  3559. + * TX_PWR_CFG_4:
  3560. + */
  3561. +#define TX_PWR_CFG_4 0x1324
  3562. +#define TX_PWR_CFG_4_UKNOWN5 FIELD32(0x0000000f)
  3563. +#define TX_PWR_CFG_4_UKNOWN6 FIELD32(0x000000f0)
  3564. +#define TX_PWR_CFG_4_UKNOWN7 FIELD32(0x00000f00)
  3565. +#define TX_PWR_CFG_4_UKNOWN8 FIELD32(0x0000f000)
  3566. +
  3567. +/*
  3568. + * TX_PIN_CFG:
  3569. + */
  3570. +#define TX_PIN_CFG 0x1328
  3571. +#define TX_PIN_CFG_PA_PE_A0_EN FIELD32(0x00000001)
  3572. +#define TX_PIN_CFG_PA_PE_G0_EN FIELD32(0x00000002)
  3573. +#define TX_PIN_CFG_PA_PE_A1_EN FIELD32(0x00000004)
  3574. +#define TX_PIN_CFG_PA_PE_G1_EN FIELD32(0x00000008)
  3575. +#define TX_PIN_CFG_PA_PE_A0_POL FIELD32(0x00000010)
  3576. +#define TX_PIN_CFG_PA_PE_G0_POL FIELD32(0x00000020)
  3577. +#define TX_PIN_CFG_PA_PE_A1_POL FIELD32(0x00000040)
  3578. +#define TX_PIN_CFG_PA_PE_G1_POL FIELD32(0x00000080)
  3579. +#define TX_PIN_CFG_LNA_PE_A0_EN FIELD32(0x00000100)
  3580. +#define TX_PIN_CFG_LNA_PE_G0_EN FIELD32(0x00000200)
  3581. +#define TX_PIN_CFG_LNA_PE_A1_EN FIELD32(0x00000400)
  3582. +#define TX_PIN_CFG_LNA_PE_G1_EN FIELD32(0x00000800)
  3583. +#define TX_PIN_CFG_LNA_PE_A0_POL FIELD32(0x00001000)
  3584. +#define TX_PIN_CFG_LNA_PE_G0_POL FIELD32(0x00002000)
  3585. +#define TX_PIN_CFG_LNA_PE_A1_POL FIELD32(0x00004000)
  3586. +#define TX_PIN_CFG_LNA_PE_G1_POL FIELD32(0x00008000)
  3587. +#define TX_PIN_CFG_RFTR_EN FIELD32(0x00010000)
  3588. +#define TX_PIN_CFG_RFTR_POL FIELD32(0x00020000)
  3589. +#define TX_PIN_CFG_TRSW_EN FIELD32(0x00040000)
  3590. +#define TX_PIN_CFG_TRSW_POL FIELD32(0x00080000)
  3591. +
  3592. +/*
  3593. + * TX_BAND_CFG: 0x1 use upper 20MHz, 0x0 use lower 20MHz
  3594. + */
  3595. +#define TX_BAND_CFG 0x132c
  3596. +#define TX_BAND_CFG_A FIELD32(0x00000002)
  3597. +#define TX_BAND_CFG_BG FIELD32(0x00000004)
  3598. +
  3599. +/*
  3600. + * TX_SW_CFG0:
  3601. + */
  3602. +#define TX_SW_CFG0 0x1330
  3603. +
  3604. +/*
  3605. + * TX_SW_CFG1:
  3606. + */
  3607. +#define TX_SW_CFG1 0x1334
  3608. +
  3609. +/*
  3610. + * TX_SW_CFG2:
  3611. + */
  3612. +#define TX_SW_CFG2 0x1338
  3613. +
  3614. +/*
  3615. + * TXOP_THRES_CFG:
  3616. + */
  3617. +#define TXOP_THRES_CFG 0x133c
  3618. +
  3619. +/*
  3620. + * TXOP_CTRL_CFG:
  3621. + */
  3622. +#define TXOP_CTRL_CFG 0x1340
  3623. +
  3624. +/*
  3625. + * TX_RTS_CFG:
  3626. + * RTS_THRES: unit:byte
  3627. + * RTS_FBK_EN: enable rts rate fallback
  3628. + */
  3629. +#define TX_RTS_CFG 0x1344
  3630. +#define TX_RTS_CFG_AUTO_RTS_RETRY_LIMIT FIELD32(0x000000ff)
  3631. +#define TX_RTS_CFG_RTS_THRES FIELD32(0x00ffff00)
  3632. +#define TX_RTS_CFG_RTS_FBK_EN FIELD32(0x01000000)
  3633. +
  3634. +/*
  3635. + * TX_TIMEOUT_CFG:
  3636. + * MPDU_LIFETIME: expiration time = 2^(9+MPDU LIFE TIME) us
  3637. + * RX_ACK_TIMEOUT: unit:slot. Used for TX procedure
  3638. + * TX_OP_TIMEOUT: TXOP timeout value for TXOP truncation.
  3639. + * it is recommended that:
  3640. + * (SLOT_TIME) > (TX_OP_TIMEOUT) > (RX_ACK_TIMEOUT)
  3641. + */
  3642. +#define TX_TIMEOUT_CFG 0x1348
  3643. +#define TX_TIMEOUT_CFG_MPDU_LIFETIME FIELD32(0x000000f0)
  3644. +#define TX_TIMEOUT_CFG_RX_ACK_TIMEOUT FIELD32(0x0000ff00)
  3645. +#define TX_TIMEOUT_CFG_TX_OP_TIMEOUT FIELD32(0x00ff0000)
  3646. +
  3647. +/*
  3648. + * TX_RTY_CFG:
  3649. + * SHORT_RTY_LIMIT: short retry limit
  3650. + * LONG_RTY_LIMIT: long retry limit
  3651. + * LONG_RTY_THRE: Long retry threshoold
  3652. + * NON_AGG_RTY_MODE: Non-Aggregate MPDU retry mode
  3653. + * 0:expired by retry limit, 1: expired by mpdu life timer
  3654. + * AGG_RTY_MODE: Aggregate MPDU retry mode
  3655. + * 0:expired by retry limit, 1: expired by mpdu life timer
  3656. + * TX_AUTO_FB_ENABLE: Tx retry PHY rate auto fallback enable
  3657. + */
  3658. +#define TX_RTY_CFG 0x134c
  3659. +#define TX_RTY_CFG_SHORT_RTY_LIMIT FIELD32(0x000000ff)
  3660. +#define TX_RTY_CFG_LONG_RTY_LIMIT FIELD32(0x0000ff00)
  3661. +#define TX_RTY_CFG_LONG_RTY_THRE FIELD32(0x0fff0000)
  3662. +#define TX_RTY_CFG_NON_AGG_RTY_MODE FIELD32(0x10000000)
  3663. +#define TX_RTY_CFG_AGG_RTY_MODE FIELD32(0x20000000)
  3664. +#define TX_RTY_CFG_TX_AUTO_FB_ENABLE FIELD32(0x40000000)
  3665. +
  3666. +/*
  3667. + * TX_LINK_CFG:
  3668. + * REMOTE_MFB_LIFETIME: remote MFB life time. unit: 32us
  3669. + * MFB_ENABLE: TX apply remote MFB 1:enable
  3670. + * REMOTE_UMFS_ENABLE: remote unsolicit MFB enable
  3671. + * 0: not apply remote remote unsolicit (MFS=7)
  3672. + * TX_MRQ_EN: MCS request TX enable
  3673. + * TX_RDG_EN: RDG TX enable
  3674. + * TX_CF_ACK_EN: Piggyback CF-ACK enable
  3675. + * REMOTE_MFB: remote MCS feedback
  3676. + * REMOTE_MFS: remote MCS feedback sequence number
  3677. + */
  3678. +#define TX_LINK_CFG 0x1350
  3679. +#define TX_LINK_CFG_REMOTE_MFB_LIFETIME FIELD32(0x000000ff)
  3680. +#define TX_LINK_CFG_MFB_ENABLE FIELD32(0x00000100)
  3681. +#define TX_LINK_CFG_REMOTE_UMFS_ENABLE FIELD32(0x00000200)
  3682. +#define TX_LINK_CFG_TX_MRQ_EN FIELD32(0x00000400)
  3683. +#define TX_LINK_CFG_TX_RDG_EN FIELD32(0x00000800)
  3684. +#define TX_LINK_CFG_TX_CF_ACK_EN FIELD32(0x00001000)
  3685. +#define TX_LINK_CFG_REMOTE_MFB FIELD32(0x00ff0000)
  3686. +#define TX_LINK_CFG_REMOTE_MFS FIELD32(0xff000000)
  3687. +
  3688. +/*
  3689. + * HT_FBK_CFG0:
  3690. + */
  3691. +#define HT_FBK_CFG0 0x1354
  3692. +#define HT_FBK_CFG0_HTMCS0FBK FIELD32(0x0000000f)
  3693. +#define HT_FBK_CFG0_HTMCS1FBK FIELD32(0x000000f0)
  3694. +#define HT_FBK_CFG0_HTMCS2FBK FIELD32(0x00000f00)
  3695. +#define HT_FBK_CFG0_HTMCS3FBK FIELD32(0x0000f000)
  3696. +#define HT_FBK_CFG0_HTMCS4FBK FIELD32(0x000f0000)
  3697. +#define HT_FBK_CFG0_HTMCS5FBK FIELD32(0x00f00000)
  3698. +#define HT_FBK_CFG0_HTMCS6FBK FIELD32(0x0f000000)
  3699. +#define HT_FBK_CFG0_HTMCS7FBK FIELD32(0xf0000000)
  3700. +
  3701. +/*
  3702. + * HT_FBK_CFG1:
  3703. + */
  3704. +#define HT_FBK_CFG1 0x1358
  3705. +#define HT_FBK_CFG1_HTMCS8FBK FIELD32(0x0000000f)
  3706. +#define HT_FBK_CFG1_HTMCS9FBK FIELD32(0x000000f0)
  3707. +#define HT_FBK_CFG1_HTMCS10FBK FIELD32(0x00000f00)
  3708. +#define HT_FBK_CFG1_HTMCS11FBK FIELD32(0x0000f000)
  3709. +#define HT_FBK_CFG1_HTMCS12FBK FIELD32(0x000f0000)
  3710. +#define HT_FBK_CFG1_HTMCS13FBK FIELD32(0x00f00000)
  3711. +#define HT_FBK_CFG1_HTMCS14FBK FIELD32(0x0f000000)
  3712. +#define HT_FBK_CFG1_HTMCS15FBK FIELD32(0xf0000000)
  3713. +
  3714. +/*
  3715. + * LG_FBK_CFG0:
  3716. + */
  3717. +#define LG_FBK_CFG0 0x135c
  3718. +#define LG_FBK_CFG0_OFDMMCS0FBK FIELD32(0x0000000f)
  3719. +#define LG_FBK_CFG0_OFDMMCS1FBK FIELD32(0x000000f0)
  3720. +#define LG_FBK_CFG0_OFDMMCS2FBK FIELD32(0x00000f00)
  3721. +#define LG_FBK_CFG0_OFDMMCS3FBK FIELD32(0x0000f000)
  3722. +#define LG_FBK_CFG0_OFDMMCS4FBK FIELD32(0x000f0000)
  3723. +#define LG_FBK_CFG0_OFDMMCS5FBK FIELD32(0x00f00000)
  3724. +#define LG_FBK_CFG0_OFDMMCS6FBK FIELD32(0x0f000000)
  3725. +#define LG_FBK_CFG0_OFDMMCS7FBK FIELD32(0xf0000000)
  3726. +
  3727. +/*
  3728. + * LG_FBK_CFG1:
  3729. + */
  3730. +#define LG_FBK_CFG1 0x1360
  3731. +#define LG_FBK_CFG0_CCKMCS0FBK FIELD32(0x0000000f)
  3732. +#define LG_FBK_CFG0_CCKMCS1FBK FIELD32(0x000000f0)
  3733. +#define LG_FBK_CFG0_CCKMCS2FBK FIELD32(0x00000f00)
  3734. +#define LG_FBK_CFG0_CCKMCS3FBK FIELD32(0x0000f000)
  3735. +
  3736. +/*
  3737. + * CCK_PROT_CFG: CCK Protection
  3738. + * PROTECT_RATE: Protection control frame rate for CCK TX(RTS/CTS/CFEnd)
  3739. + * PROTECT_CTRL: Protection control frame type for CCK TX
  3740. + * 0:none, 1:RTS/CTS, 2:CTS-to-self
  3741. + * PROTECT_NAV: TXOP protection type for CCK TX
  3742. + * 0:none, 1:ShortNAVprotect, 2:LongNAVProtect
  3743. + * TX_OP_ALLOW_CCK: CCK TXOP allowance, 0:disallow
  3744. + * TX_OP_ALLOW_OFDM: CCK TXOP allowance, 0:disallow
  3745. + * TX_OP_ALLOW_MM20: CCK TXOP allowance, 0:disallow
  3746. + * TX_OP_ALLOW_MM40: CCK TXOP allowance, 0:disallow
  3747. + * TX_OP_ALLOW_GF20: CCK TXOP allowance, 0:disallow
  3748. + * TX_OP_ALLOW_GF40: CCK TXOP allowance, 0:disallow
  3749. + * RTS_TH_EN: RTS threshold enable on CCK TX
  3750. + */
  3751. +#define CCK_PROT_CFG 0x1364
  3752. +#define CCK_PROT_CFG_PROTECT_RATE FIELD32(0x0000ffff)
  3753. +#define CCK_PROT_CFG_PROTECT_CTRL FIELD32(0x00030000)
  3754. +#define CCK_PROT_CFG_PROTECT_NAV FIELD32(0x000c0000)
  3755. +#define CCK_PROT_CFG_TX_OP_ALLOW_CCK FIELD32(0x00100000)
  3756. +#define CCK_PROT_CFG_TX_OP_ALLOW_OFDM FIELD32(0x00200000)
  3757. +#define CCK_PROT_CFG_TX_OP_ALLOW_MM20 FIELD32(0x00400000)
  3758. +#define CCK_PROT_CFG_TX_OP_ALLOW_MM40 FIELD32(0x00800000)
  3759. +#define CCK_PROT_CFG_TX_OP_ALLOW_GF20 FIELD32(0x01000000)
  3760. +#define CCK_PROT_CFG_TX_OP_ALLOW_GF40 FIELD32(0x02000000)
  3761. +#define CCK_PROT_CFG_RTS_TH_EN FIELD32(0x04000000)
  3762. +
  3763. +/*
  3764. + * OFDM_PROT_CFG: OFDM Protection
  3765. + */
  3766. +#define OFDM_PROT_CFG 0x1368
  3767. +#define OFDM_PROT_CFG_PROTECT_RATE FIELD32(0x0000ffff)
  3768. +#define OFDM_PROT_CFG_PROTECT_CTRL FIELD32(0x00030000)
  3769. +#define OFDM_PROT_CFG_PROTECT_NAV FIELD32(0x000c0000)
  3770. +#define OFDM_PROT_CFG_TX_OP_ALLOW_CCK FIELD32(0x00100000)
  3771. +#define OFDM_PROT_CFG_TX_OP_ALLOW_OFDM FIELD32(0x00200000)
  3772. +#define OFDM_PROT_CFG_TX_OP_ALLOW_MM20 FIELD32(0x00400000)
  3773. +#define OFDM_PROT_CFG_TX_OP_ALLOW_MM40 FIELD32(0x00800000)
  3774. +#define OFDM_PROT_CFG_TX_OP_ALLOW_GF20 FIELD32(0x01000000)
  3775. +#define OFDM_PROT_CFG_TX_OP_ALLOW_GF40 FIELD32(0x02000000)
  3776. +#define OFDM_PROT_CFG_RTS_TH_EN FIELD32(0x04000000)
  3777. +
  3778. +/*
  3779. + * MM20_PROT_CFG: MM20 Protection
  3780. + */
  3781. +#define MM20_PROT_CFG 0x136c
  3782. +#define MM20_PROT_CFG_PROTECT_RATE FIELD32(0x0000ffff)
  3783. +#define MM20_PROT_CFG_PROTECT_CTRL FIELD32(0x00030000)
  3784. +#define MM20_PROT_CFG_PROTECT_NAV FIELD32(0x000c0000)
  3785. +#define MM20_PROT_CFG_TX_OP_ALLOW_CCK FIELD32(0x00100000)
  3786. +#define MM20_PROT_CFG_TX_OP_ALLOW_OFDM FIELD32(0x00200000)
  3787. +#define MM20_PROT_CFG_TX_OP_ALLOW_MM20 FIELD32(0x00400000)
  3788. +#define MM20_PROT_CFG_TX_OP_ALLOW_MM40 FIELD32(0x00800000)
  3789. +#define MM20_PROT_CFG_TX_OP_ALLOW_GF20 FIELD32(0x01000000)
  3790. +#define MM20_PROT_CFG_TX_OP_ALLOW_GF40 FIELD32(0x02000000)
  3791. +#define MM20_PROT_CFG_RTS_TH_EN FIELD32(0x04000000)
  3792. +
  3793. +/*
  3794. + * MM40_PROT_CFG: MM40 Protection
  3795. + */
  3796. +#define MM40_PROT_CFG 0x1370
  3797. +#define MM40_PROT_CFG_PROTECT_RATE FIELD32(0x0000ffff)
  3798. +#define MM40_PROT_CFG_PROTECT_CTRL FIELD32(0x00030000)
  3799. +#define MM40_PROT_CFG_PROTECT_NAV FIELD32(0x000c0000)
  3800. +#define MM40_PROT_CFG_TX_OP_ALLOW_CCK FIELD32(0x00100000)
  3801. +#define MM40_PROT_CFG_TX_OP_ALLOW_OFDM FIELD32(0x00200000)
  3802. +#define MM40_PROT_CFG_TX_OP_ALLOW_MM20 FIELD32(0x00400000)
  3803. +#define MM40_PROT_CFG_TX_OP_ALLOW_MM40 FIELD32(0x00800000)
  3804. +#define MM40_PROT_CFG_TX_OP_ALLOW_GF20 FIELD32(0x01000000)
  3805. +#define MM40_PROT_CFG_TX_OP_ALLOW_GF40 FIELD32(0x02000000)
  3806. +#define MM40_PROT_CFG_RTS_TH_EN FIELD32(0x04000000)
  3807. +
  3808. +/*
  3809. + * GF20_PROT_CFG: GF20 Protection
  3810. + */
  3811. +#define GF20_PROT_CFG 0x1374
  3812. +#define GF20_PROT_CFG_PROTECT_RATE FIELD32(0x0000ffff)
  3813. +#define GF20_PROT_CFG_PROTECT_CTRL FIELD32(0x00030000)
  3814. +#define GF20_PROT_CFG_PROTECT_NAV FIELD32(0x000c0000)
  3815. +#define GF20_PROT_CFG_TX_OP_ALLOW_CCK FIELD32(0x00100000)
  3816. +#define GF20_PROT_CFG_TX_OP_ALLOW_OFDM FIELD32(0x00200000)
  3817. +#define GF20_PROT_CFG_TX_OP_ALLOW_MM20 FIELD32(0x00400000)
  3818. +#define GF20_PROT_CFG_TX_OP_ALLOW_MM40 FIELD32(0x00800000)
  3819. +#define GF20_PROT_CFG_TX_OP_ALLOW_GF20 FIELD32(0x01000000)
  3820. +#define GF20_PROT_CFG_TX_OP_ALLOW_GF40 FIELD32(0x02000000)
  3821. +#define GF20_PROT_CFG_RTS_TH_EN FIELD32(0x04000000)
  3822. +
  3823. +/*
  3824. + * GF40_PROT_CFG: GF40 Protection
  3825. + */
  3826. +#define GF40_PROT_CFG 0x1378
  3827. +#define GF40_PROT_CFG_PROTECT_RATE FIELD32(0x0000ffff)
  3828. +#define GF40_PROT_CFG_PROTECT_CTRL FIELD32(0x00030000)
  3829. +#define GF40_PROT_CFG_PROTECT_NAV FIELD32(0x000c0000)
  3830. +#define GF40_PROT_CFG_TX_OP_ALLOW_CCK FIELD32(0x00100000)
  3831. +#define GF40_PROT_CFG_TX_OP_ALLOW_OFDM FIELD32(0x00200000)
  3832. +#define GF40_PROT_CFG_TX_OP_ALLOW_MM20 FIELD32(0x00400000)
  3833. +#define GF40_PROT_CFG_TX_OP_ALLOW_MM40 FIELD32(0x00800000)
  3834. +#define GF40_PROT_CFG_TX_OP_ALLOW_GF20 FIELD32(0x01000000)
  3835. +#define GF40_PROT_CFG_TX_OP_ALLOW_GF40 FIELD32(0x02000000)
  3836. +#define GF40_PROT_CFG_RTS_TH_EN FIELD32(0x04000000)
  3837. +
  3838. +/*
  3839. + * EXP_CTS_TIME:
  3840. + */
  3841. +#define EXP_CTS_TIME 0x137c
  3842. +
  3843. +/*
  3844. + * EXP_ACK_TIME:
  3845. + */
  3846. +#define EXP_ACK_TIME 0x1380
  3847. +
  3848. +/*
  3849. + * RX_FILTER_CFG: RX configuration register.
  3850. + */
  3851. +#define RX_FILTER_CFG 0x1400
  3852. +#define RX_FILTER_CFG_DROP_CRC_ERROR FIELD32(0x00000001)
  3853. +#define RX_FILTER_CFG_DROP_PHY_ERROR FIELD32(0x00000002)
  3854. +#define RX_FILTER_CFG_DROP_NOT_TO_ME FIELD32(0x00000004)
  3855. +#define RX_FILTER_CFG_DROP_NOT_MY_BSSD FIELD32(0x00000008)
  3856. +#define RX_FILTER_CFG_DROP_VER_ERROR FIELD32(0x00000010)
  3857. +#define RX_FILTER_CFG_DROP_MULTICAST FIELD32(0x00000020)
  3858. +#define RX_FILTER_CFG_DROP_BROADCAST FIELD32(0x00000040)
  3859. +#define RX_FILTER_CFG_DROP_DUPLICATE FIELD32(0x00000080)
  3860. +#define RX_FILTER_CFG_DROP_CF_END_ACK FIELD32(0x00000100)
  3861. +#define RX_FILTER_CFG_DROP_CF_END FIELD32(0x00000200)
  3862. +#define RX_FILTER_CFG_DROP_ACK FIELD32(0x00000400)
  3863. +#define RX_FILTER_CFG_DROP_CTS FIELD32(0x00000800)
  3864. +#define RX_FILTER_CFG_DROP_RTS FIELD32(0x00001000)
  3865. +#define RX_FILTER_CFG_DROP_PSPOLL FIELD32(0x00002000)
  3866. +#define RX_FILTER_CFG_DROP_BA FIELD32(0x00004000)
  3867. +#define RX_FILTER_CFG_DROP_BAR FIELD32(0x00008000)
  3868. +#define RX_FILTER_CFG_DROP_CNTL FIELD32(0x00010000)
  3869. +
  3870. +/*
  3871. + * AUTO_RSP_CFG:
  3872. + * AUTORESPONDER: 0: disable, 1: enable
  3873. + * BAC_ACK_POLICY: 0:long, 1:short preamble
  3874. + * CTS_40_MMODE: Response CTS 40MHz duplicate mode
  3875. + * CTS_40_MREF: Response CTS 40MHz duplicate mode
  3876. + * AR_PREAMBLE: Auto responder preamble 0:long, 1:short preamble
  3877. + * DUAL_CTS_EN: Power bit value in control frame
  3878. + * ACK_CTS_PSM_BIT:Power bit value in control frame
  3879. + */
  3880. +#define AUTO_RSP_CFG 0x1404
  3881. +#define AUTO_RSP_CFG_AUTORESPONDER FIELD32(0x00000001)
  3882. +#define AUTO_RSP_CFG_BAC_ACK_POLICY FIELD32(0x00000002)
  3883. +#define AUTO_RSP_CFG_CTS_40_MMODE FIELD32(0x00000004)
  3884. +#define AUTO_RSP_CFG_CTS_40_MREF FIELD32(0x00000008)
  3885. +#define AUTO_RSP_CFG_AR_PREAMBLE FIELD32(0x00000010)
  3886. +#define AUTO_RSP_CFG_DUAL_CTS_EN FIELD32(0x00000040)
  3887. +#define AUTO_RSP_CFG_ACK_CTS_PSM_BIT FIELD32(0x00000080)
  3888. +
  3889. +/*
  3890. + * LEGACY_BASIC_RATE:
  3891. + */
  3892. +#define LEGACY_BASIC_RATE 0x1408
  3893. +
  3894. +/*
  3895. + * HT_BASIC_RATE:
  3896. + */
  3897. +#define HT_BASIC_RATE 0x140c
  3898. +
  3899. +/*
  3900. + * HT_CTRL_CFG:
  3901. + */
  3902. +#define HT_CTRL_CFG 0x1410
  3903. +
  3904. +/*
  3905. + * SIFS_COST_CFG:
  3906. + */
  3907. +#define SIFS_COST_CFG 0x1414
  3908. +
  3909. +/*
  3910. + * RX_PARSER_CFG:
  3911. + * Set NAV for all received frames
  3912. + */
  3913. +#define RX_PARSER_CFG 0x1418
  3914. +
  3915. +/*
  3916. + * TX_SEC_CNT0:
  3917. + */
  3918. +#define TX_SEC_CNT0 0x1500
  3919. +
  3920. +/*
  3921. + * RX_SEC_CNT0:
  3922. + */
  3923. +#define RX_SEC_CNT0 0x1504
  3924. +
  3925. +/*
  3926. + * CCMP_FC_MUTE:
  3927. + */
  3928. +#define CCMP_FC_MUTE 0x1508
  3929. +
  3930. +/*
  3931. + * TXOP_HLDR_ADDR0:
  3932. + */
  3933. +#define TXOP_HLDR_ADDR0 0x1600
  3934. +
  3935. +/*
  3936. + * TXOP_HLDR_ADDR1:
  3937. + */
  3938. +#define TXOP_HLDR_ADDR1 0x1604
  3939. +
  3940. +/*
  3941. + * TXOP_HLDR_ET:
  3942. + */
  3943. +#define TXOP_HLDR_ET 0x1608
  3944. +
  3945. +/*
  3946. + * QOS_CFPOLL_RA_DW0:
  3947. + */
  3948. +#define QOS_CFPOLL_RA_DW0 0x160c
  3949. +
  3950. +/*
  3951. + * QOS_CFPOLL_RA_DW1:
  3952. + */
  3953. +#define QOS_CFPOLL_RA_DW1 0x1610
  3954. +
  3955. +/*
  3956. + * QOS_CFPOLL_QC:
  3957. + */
  3958. +#define QOS_CFPOLL_QC 0x1614
  3959. +
  3960. +/*
  3961. + * RX_STA_CNT0: RX PLCP error count & RX CRC error count
  3962. + */
  3963. +#define RX_STA_CNT0 0x1700
  3964. +#define RX_STA_CNT0_CRC_ERR FIELD32(0x0000ffff)
  3965. +#define RX_STA_CNT0_PHY_ERR FIELD32(0xffff0000)
  3966. +
  3967. +/*
  3968. + * RX_STA_CNT1: RX False CCA count & RX LONG frame count
  3969. + */
  3970. +#define RX_STA_CNT1 0x1704
  3971. +#define RX_STA_CNT1_FALSE_CCA FIELD32(0x0000ffff)
  3972. +#define RX_STA_CNT1_PLCP_ERR FIELD32(0xffff0000)
  3973. +
  3974. +/*
  3975. + * RX_STA_CNT2:
  3976. + */
  3977. +#define RX_STA_CNT2 0x1708
  3978. +#define RX_STA_CNT2_RX_DUPLI_COUNT FIELD32(0x0000ffff)
  3979. +#define RX_STA_CNT2_RX_FIFO_OVERFLOW FIELD32(0xffff0000)
  3980. +
  3981. +/*
  3982. + * TX_STA_CNT0: TX Beacon count
  3983. + */
  3984. +#define TX_STA_CNT0 0x170c
  3985. +#define TX_STA_CNT0_TX_FAIL_COUNT FIELD32(0x0000ffff)
  3986. +#define TX_STA_CNT0_TX_BEACON_COUNT FIELD32(0xffff0000)
  3987. +
  3988. +/*
  3989. + * TX_STA_CNT1: TX tx count
  3990. + */
  3991. +#define TX_STA_CNT1 0x1710
  3992. +#define TX_STA_CNT1_TX_SUCCESS FIELD32(0x0000ffff)
  3993. +#define TX_STA_CNT1_TX_RETRANSMIT FIELD32(0xffff0000)
  3994. +
  3995. +/*
  3996. + * TX_STA_CNT2: TX tx count
  3997. + */
  3998. +#define TX_STA_CNT2 0x1714
  3999. +#define TX_STA_CNT2_TX_ZERO_LEN_COUNT FIELD32(0x0000ffff)
  4000. +#define TX_STA_CNT2_TX_UNDER_FLOW_COUNT FIELD32(0xffff0000)
  4001. +
  4002. +/*
  4003. + * TX_STA_FIFO: TX Result for specific PID status fifo register
  4004. + */
  4005. +#define TX_STA_FIFO 0x1718
  4006. +#define TX_STA_FIFO_VALID FIELD32(0x00000001)
  4007. +#define TX_STA_FIFO_PID_TYPE FIELD32(0x0000001e)
  4008. +#define TX_STA_FIFO_TX_SUCCESS FIELD32(0x00000020)
  4009. +#define TX_STA_FIFO_TX_AGGRE FIELD32(0x00000040)
  4010. +#define TX_STA_FIFO_TX_ACK_REQUIRED FIELD32(0x00000080)
  4011. +#define TX_STA_FIFO_WCID FIELD32(0x0000ff00)
  4012. +#define TX_STA_FIFO_SUCCESS_RATE FIELD32(0xffff0000)
  4013. +
  4014. +/*
  4015. + * TX_AGG_CNT: Debug counter
  4016. + */
  4017. +#define TX_AGG_CNT 0x171c
  4018. +#define TX_AGG_CNT_NON_AGG_TX_COUNT FIELD32(0x0000ffff)
  4019. +#define TX_AGG_CNT_AGG_TX_COUNT FIELD32(0xffff0000)
  4020. +
  4021. +/*
  4022. + * TX_AGG_CNT0:
  4023. + */
  4024. +#define TX_AGG_CNT0 0x1720
  4025. +#define TX_AGG_CNT0_AGG_SIZE_1_COUNT FIELD32(0x0000ffff)
  4026. +#define TX_AGG_CNT0_AGG_SIZE_2_COUNT FIELD32(0xffff0000)
  4027. +
  4028. +/*
  4029. + * TX_AGG_CNT1:
  4030. + */
  4031. +#define TX_AGG_CNT1 0x1724
  4032. +#define TX_AGG_CNT1_AGG_SIZE_3_COUNT FIELD32(0x0000ffff)
  4033. +#define TX_AGG_CNT1_AGG_SIZE_4_COUNT FIELD32(0xffff0000)
  4034. +
  4035. +/*
  4036. + * TX_AGG_CNT2:
  4037. + */
  4038. +#define TX_AGG_CNT2 0x1728
  4039. +#define TX_AGG_CNT2_AGG_SIZE_5_COUNT FIELD32(0x0000ffff)
  4040. +#define TX_AGG_CNT2_AGG_SIZE_6_COUNT FIELD32(0xffff0000)
  4041. +
  4042. +/*
  4043. + * TX_AGG_CNT3:
  4044. + */
  4045. +#define TX_AGG_CNT3 0x172c
  4046. +#define TX_AGG_CNT3_AGG_SIZE_7_COUNT FIELD32(0x0000ffff)
  4047. +#define TX_AGG_CNT3_AGG_SIZE_8_COUNT FIELD32(0xffff0000)
  4048. +
  4049. +/*
  4050. + * TX_AGG_CNT4:
  4051. + */
  4052. +#define TX_AGG_CNT4 0x1730
  4053. +#define TX_AGG_CNT4_AGG_SIZE_9_COUNT FIELD32(0x0000ffff)
  4054. +#define TX_AGG_CNT4_AGG_SIZE_10_COUNT FIELD32(0xffff0000)
  4055. +
  4056. +/*
  4057. + * TX_AGG_CNT5:
  4058. + */
  4059. +#define TX_AGG_CNT5 0x1734
  4060. +#define TX_AGG_CNT5_AGG_SIZE_11_COUNT FIELD32(0x0000ffff)
  4061. +#define TX_AGG_CNT5_AGG_SIZE_12_COUNT FIELD32(0xffff0000)
  4062. +
  4063. +/*
  4064. + * TX_AGG_CNT6:
  4065. + */
  4066. +#define TX_AGG_CNT6 0x1738
  4067. +#define TX_AGG_CNT6_AGG_SIZE_13_COUNT FIELD32(0x0000ffff)
  4068. +#define TX_AGG_CNT6_AGG_SIZE_14_COUNT FIELD32(0xffff0000)
  4069. +
  4070. +/*
  4071. + * TX_AGG_CNT7:
  4072. + */
  4073. +#define TX_AGG_CNT7 0x173c
  4074. +#define TX_AGG_CNT7_AGG_SIZE_15_COUNT FIELD32(0x0000ffff)
  4075. +#define TX_AGG_CNT7_AGG_SIZE_16_COUNT FIELD32(0xffff0000)
  4076. +
  4077. +/*
  4078. + * MPDU_DENSITY_CNT:
  4079. + * TX_ZERO_DEL: TX zero length delimiter count
  4080. + * RX_ZERO_DEL: RX zero length delimiter count
  4081. + */
  4082. +#define MPDU_DENSITY_CNT 0x1740
  4083. +#define MPDU_DENSITY_CNT_TX_ZERO_DEL FIELD32(0x0000ffff)
  4084. +#define MPDU_DENSITY_CNT_RX_ZERO_DEL FIELD32(0xffff0000)
  4085. +
  4086. +/*
  4087. + * Security key table memory, base address = 0x1800
  4088. + */
  4089. +struct hw_pairwise_ta_entry {
  4090. + u8 address[6];
  4091. + u8 reserved[2];
  4092. +} __attribute__ ((packed));
  4093. +
  4094. +struct wcid_entry {
  4095. + u8 rx_ba_bitmat7;
  4096. + u8 rx_ba_bitmat0;
  4097. + u8 mac[6];
  4098. +} __attribute__ ((packed));
  4099. +
  4100. +struct hw_key_entry {
  4101. + u8 key[16];
  4102. + u8 tx_mic[8];
  4103. + u8 rx_mic[8];
  4104. +} __attribute__ ((packed));
  4105. +
  4106. +/*
  4107. + * Security key table memory.
  4108. + * MAC_WCID_BASE: 8-bytes (use only 6 bytes) * 256 entry
  4109. + * PAIRWISE_KEY_TABLE_BASE: 32-byte * 256 entry
  4110. + * PAIRWISE_IVEIV_TABLE_BASE: 8-byte * 256-entry
  4111. + * MAC_IVEIV_TABLE_BASE: 8-byte * 256-entry
  4112. + * MAC_WCID_ATTRIBUTE_BASE: 4-byte * 256-entry
  4113. + * SHARED_KEY_TABLE_BASE: 32-byte * 16-entry
  4114. + * SHARED_KEY_MODE_BASE: 32-byte * 16-entry
  4115. + */
  4116. +#define MAC_WCID_BASE 0x1800
  4117. +#define PAIRWISE_KEY_TABLE_BASE 0x4000
  4118. +#define PAIRWISE_IVEIV_TABLE_BASE 0x6000
  4119. +#define MAC_IVEIV_TABLE_BASE 0x6000
  4120. +#define MAC_WCID_ATTRIBUTE_BASE 0x6800
  4121. +#define SHARED_KEY_TABLE_BASE 0x6c00
  4122. +#define SHARED_KEY_MODE_BASE 0x7000
  4123. +
  4124. +#define SHARED_KEY_ENTRY(__idx) \
  4125. + ( SHARED_KEY_TABLE_BASE + \
  4126. + ((__idx) * sizeof(struct hw_key_entry)) )
  4127. +#define SHARED_KEY_MODE_ENTRY(__idx) \
  4128. + ( SHARED_KEY_MODE_BASE + ((__idx) * sizeof(u32)) )
  4129. +#define PAIRWISE_KEY_ENTRY(__idx) \
  4130. + ( PAIRWISE_KEY_TABLE_BASE + \
  4131. + ((__idx) * sizeof(struct hw_key_entry)) )
  4132. +
  4133. +#define MAC_WCID_ENTRY(__idx) \
  4134. + ( MAC_WCID_BASE + (2 * sizeof(u32) * (__idx)) )
  4135. +#define MAC_WCID_ATTR_ENTRY(__idx) \
  4136. + ( MAC_WCID_ATTRIBUTE_BASE + ((__idx) * sizeof(u32)) )
  4137. +
  4138. +/*
  4139. + * MAC_WCID_ATTRIBUTE:
  4140. + * KEYTAB: 0: shared key table, 1: pairwise key table
  4141. + * BSS_IDX: multipleBSS index for the WCID
  4142. + */
  4143. +#define MAC_WCID_ATTRIBUTE_KEYTAB FIELD32(0x00000001)
  4144. +#define MAC_WCID_ATTRIBUTE_PAIRKEY_MODE FIELD32(0x0000000e)
  4145. +#define MAC_WCID_ATTRIBUTE_BSS_IDX FIELD32(0x00000070)
  4146. +#define MAC_WCID_ATTRIBUTE_RX_WIUDF FIELD32(0x00000380)
  4147. +
  4148. +/*
  4149. + * SHARED_KEY_MODE:
  4150. + */
  4151. +#define SHARED_KEY_MODE_BSS0_KEY0 FIELD32(0x00000007)
  4152. +#define SHARED_KEY_MODE_BSS0_KEY1 FIELD32(0x00000070)
  4153. +#define SHARED_KEY_MODE_BSS0_KEY2 FIELD32(0x00000700)
  4154. +#define SHARED_KEY_MODE_BSS0_KEY3 FIELD32(0x00007000)
  4155. +#define SHARED_KEY_MODE_BSS1_KEY0 FIELD32(0x00070000)
  4156. +#define SHARED_KEY_MODE_BSS1_KEY1 FIELD32(0x00700000)
  4157. +#define SHARED_KEY_MODE_BSS1_KEY2 FIELD32(0x07000000)
  4158. +#define SHARED_KEY_MODE_BSS1_KEY3 FIELD32(0x70000000)
  4159. +
  4160. +/*
  4161. + * HOST-MCU communication
  4162. + */
  4163. +
  4164. +/*
  4165. + * H2M_MAILBOX_CSR: Host-to-MCU Mailbox.
  4166. + */
  4167. +#define H2M_MAILBOX_CSR 0x7010
  4168. +#define H2M_MAILBOX_CSR_ARG0 FIELD32(0x000000ff)
  4169. +#define H2M_MAILBOX_CSR_ARG1 FIELD32(0x0000ff00)
  4170. +#define H2M_MAILBOX_CSR_CMD_TOKEN FIELD32(0x00ff0000)
  4171. +#define H2M_MAILBOX_CSR_OWNER FIELD32(0xff000000)
  4172. +
  4173. +/*
  4174. + * H2M_MAILBOX_CID:
  4175. + */
  4176. +#define H2M_MAILBOX_CID 0x7014
  4177. +
  4178. +/*
  4179. + * H2M_MAILBOX_STATUS:
  4180. + */
  4181. +#define H2M_MAILBOX_STATUS 0x701c
  4182. +
  4183. +/*
  4184. + * H2M_INT_SRC:
  4185. + */
  4186. +#define H2M_INT_SRC 0x7024
  4187. +
  4188. +/*
  4189. + * H2M_BBP_AGENT:
  4190. + */
  4191. +#define H2M_BBP_AGENT 0x7028
  4192. +
  4193. +/*
  4194. + * MCU_LEDCS: LED control for MCU Mailbox.
  4195. + */
  4196. +#define MCU_LEDCS_LED_MODE FIELD8(0x1f)
  4197. +#define MCU_LEDCS_POLARITY FIELD8(0x01)
  4198. +
  4199. +/*
  4200. + * HW_CS_CTS_BASE:
  4201. + * Carrier-sense CTS frame base address.
  4202. + * It's where mac stores carrier-sense frame for carrier-sense function.
  4203. + */
  4204. +#define HW_CS_CTS_BASE 0x7700
  4205. +
  4206. +/*
  4207. + * HW_DFS_CTS_BASE:
  4208. + * FS CTS frame base address. It's where mac stores CTS frame for DFS.
  4209. + */
  4210. +#define HW_DFS_CTS_BASE 0x7780
  4211. +
  4212. +/*
  4213. + * TXRX control registers - base address 0x3000
  4214. + */
  4215. +
  4216. +/*
  4217. + * TXRX_CSR1:
  4218. + * rt2860b UNKNOWN reg use R/O Reg Addr 0x77d0 first..
  4219. + */
  4220. +#define TXRX_CSR1 0x77d0
  4221. +
  4222. +/*
  4223. + * HW_DEBUG_SETTING_BASE:
  4224. + * since NULL frame won't be that long (256 byte)
  4225. + * We steal 16 tail bytes to save debugging settings
  4226. + */
  4227. +#define HW_DEBUG_SETTING_BASE 0x77f0
  4228. +#define HW_DEBUG_SETTING_BASE2 0x7770
  4229. +
  4230. +/*
  4231. + * HW_BEACON_BASE
  4232. + * In order to support maximum 8 MBSS and its maximum length
  4233. + * is 512 bytes for each beacon
  4234. + * Three section discontinue memory segments will be used.
  4235. + * 1. The original region for BCN 0~3
  4236. + * 2. Extract memory from FCE table for BCN 4~5
  4237. + * 3. Extract memory from Pair-wise key table for BCN 6~7
  4238. + * It occupied those memory of wcid 238~253 for BCN 6
  4239. + * and wcid 222~237 for BCN 7
  4240. + *
  4241. + * IMPORTANT NOTE: Not sure why legacy driver does this,
  4242. + * but HW_BEACON_BASE7 is 0x0200 bytes below HW_BEACON_BASE6.
  4243. + */
  4244. +#define HW_BEACON_BASE0 0x7800
  4245. +#define HW_BEACON_BASE1 0x7a00
  4246. +#define HW_BEACON_BASE2 0x7c00
  4247. +#define HW_BEACON_BASE3 0x7e00
  4248. +#define HW_BEACON_BASE4 0x7200
  4249. +#define HW_BEACON_BASE5 0x7400
  4250. +#define HW_BEACON_BASE6 0x5dc0
  4251. +#define HW_BEACON_BASE7 0x5bc0
  4252. +
  4253. +#define HW_BEACON_OFFSET(__index) \
  4254. + ( ((__index) < 4) ? ( HW_BEACON_BASE0 + (__index * 0x0200) ) : \
  4255. + (((__index) < 6) ? ( HW_BEACON_BASE4 + ((__index - 4) * 0x0200) ) : \
  4256. + (HW_BEACON_BASE6 - ((__index - 6) * 0x0200))) )
  4257. +
  4258. +/*
  4259. + * 8051 firmware image.
  4260. + */
  4261. +#define FIRMWARE_RT2860 "rt2860.bin"
  4262. +#define FIRMWARE_IMAGE_BASE 0x2000
  4263. +
  4264. +/*
  4265. + * BBP registers.
  4266. + * The wordsize of the BBP is 8 bits.
  4267. + */
  4268. +
  4269. +/*
  4270. + * BBP 1: TX Antenna
  4271. + */
  4272. +#define BBP1_TX_POWER FIELD8(0x07)
  4273. +#define BBP1_TX_ANTENNA FIELD8(0x18)
  4274. +
  4275. +/*
  4276. + * BBP 3: RX Antenna
  4277. + */
  4278. +#define BBP3_RX_ANTENNA FIELD8(0x18)
  4279. +
  4280. +/*
  4281. + * RF registers
  4282. + */
  4283. +
  4284. +/*
  4285. + * RF 2
  4286. + */
  4287. +#define RF2_ANTENNA_RX2 FIELD32(0x00000040)
  4288. +#define RF2_ANTENNA_TX1 FIELD32(0x00004000)
  4289. +#define RF2_ANTENNA_RX1 FIELD32(0x00020000)
  4290. +
  4291. +/*
  4292. + * RF 3
  4293. + */
  4294. +#define RF3_TXPOWER_G FIELD32(0x00003e00)
  4295. +#define RF3_TXPOWER_A_7DBM_BOOST FIELD32(0x00000200)
  4296. +#define RF3_TXPOWER_A FIELD32(0x00003c00)
  4297. +
  4298. +/*
  4299. + * RF 4
  4300. + */
  4301. +#define RF4_TXPOWER_G FIELD32(0x000007c0)
  4302. +#define RF4_TXPOWER_A_7DBM_BOOST FIELD32(0x00000040)
  4303. +#define RF4_TXPOWER_A FIELD32(0x00000780)
  4304. +#define RF4_FREQ_OFFSET FIELD32(0x001f8000)
  4305. +#define RF4_BW40 FIELD32(0x00200000)
  4306. +
  4307. +/*
  4308. + * EEPROM content.
  4309. + * The wordsize of the EEPROM is 16 bits.
  4310. + */
  4311. +
  4312. +/*
  4313. + * EEPROM Version
  4314. + */
  4315. +#define EEPROM_VERSION 0x0001
  4316. +#define EEPROM_VERSION_FAE FIELD16(0x00ff)
  4317. +#define EEPROM_VERSION_VERSION FIELD16(0xff00)
  4318. +
  4319. +/*
  4320. + * HW MAC address.
  4321. + */
  4322. +#define EEPROM_MAC_ADDR_0 0x0002
  4323. +#define EEPROM_MAC_ADDR_BYTE0 FIELD16(0x00ff)
  4324. +#define EEPROM_MAC_ADDR_BYTE1 FIELD16(0xff00)
  4325. +#define EEPROM_MAC_ADDR_1 0x0003
  4326. +#define EEPROM_MAC_ADDR_BYTE2 FIELD16(0x00ff)
  4327. +#define EEPROM_MAC_ADDR_BYTE3 FIELD16(0xff00)
  4328. +#define EEPROM_MAC_ADDR_2 0x0004
  4329. +#define EEPROM_MAC_ADDR_BYTE4 FIELD16(0x00ff)
  4330. +#define EEPROM_MAC_ADDR_BYTE5 FIELD16(0xff00)
  4331. +
  4332. +/*
  4333. + * EEPROM ANTENNA config
  4334. + * RXPATH: 1: 1R, 2: 2R, 3: 3R
  4335. + * TXPATH: 1: 1T, 2: 2T
  4336. + */
  4337. +#define EEPROM_ANTENNA 0x001a
  4338. +#define EEPROM_ANTENNA_RXPATH FIELD16(0x000f)
  4339. +#define EEPROM_ANTENNA_TXPATH FIELD16(0x00f0)
  4340. +#define EEPROM_ANTENNA_RF_TYPE FIELD16(0x0f00)
  4341. +
  4342. +/*
  4343. + * EEPROM NIC config
  4344. + * CARDBUS_ACCEL: 0 - enable, 1 - disable
  4345. + */
  4346. +#define EEPROM_NIC 0x001b
  4347. +#define EEPROM_NIC_HW_RADIO FIELD16(0x0001)
  4348. +#define EEPROM_NIC_DYNAMIC_TX_AGC FIELD16(0x0002)
  4349. +#define EEPROM_NIC_EXTERNAL_LNA_BG FIELD16(0x0004)
  4350. +#define EEPROM_NIC_EXTERNAL_LNA_A FIELD16(0x0008)
  4351. +#define EEPROM_NIC_CARDBUS_ACCEL FIELD16(0x0010)
  4352. +#define EEPROM_NIC_BW40M_SB_BG FIELD16(0x0020)
  4353. +#define EEPROM_NIC_BW40M_SB_A FIELD16(0x0040)
  4354. +#define EEPROM_NIC_WPS_PBC FIELD16(0x0080)
  4355. +#define EEPROM_NIC_BW40M_BG FIELD16(0x0100)
  4356. +#define EEPROM_NIC_BW40M_A FIELD16(0x0200)
  4357. +
  4358. +/*
  4359. + * EEPROM frequency
  4360. + */
  4361. +#define EEPROM_FREQ 0x001d
  4362. +#define EEPROM_FREQ_OFFSET FIELD16(0x00ff)
  4363. +#define EEPROM_FREQ_LED_MODE FIELD16(0x7f00)
  4364. +#define EEPROM_FREQ_LED_POLARITY FIELD16(0x1000)
  4365. +
  4366. +/*
  4367. + * EEPROM LED
  4368. + * POLARITY_RDY_G: Polarity RDY_G setting.
  4369. + * POLARITY_RDY_A: Polarity RDY_A setting.
  4370. + * POLARITY_ACT: Polarity ACT setting.
  4371. + * POLARITY_GPIO_0: Polarity GPIO0 setting.
  4372. + * POLARITY_GPIO_1: Polarity GPIO1 setting.
  4373. + * POLARITY_GPIO_2: Polarity GPIO2 setting.
  4374. + * POLARITY_GPIO_3: Polarity GPIO3 setting.
  4375. + * POLARITY_GPIO_4: Polarity GPIO4 setting.
  4376. + * LED_MODE: Led mode.
  4377. + */
  4378. +#define EEPROM_LED1 0x001e
  4379. +#define EEPROM_LED2 0x001f
  4380. +#define EEPROM_LED3 0x0020
  4381. +#define EEPROM_LED_POLARITY_RDY_BG FIELD16(0x0001)
  4382. +#define EEPROM_LED_POLARITY_RDY_A FIELD16(0x0002)
  4383. +#define EEPROM_LED_POLARITY_ACT FIELD16(0x0004)
  4384. +#define EEPROM_LED_POLARITY_GPIO_0 FIELD16(0x0008)
  4385. +#define EEPROM_LED_POLARITY_GPIO_1 FIELD16(0x0010)
  4386. +#define EEPROM_LED_POLARITY_GPIO_2 FIELD16(0x0020)
  4387. +#define EEPROM_LED_POLARITY_GPIO_3 FIELD16(0x0040)
  4388. +#define EEPROM_LED_POLARITY_GPIO_4 FIELD16(0x0080)
  4389. +#define EEPROM_LED_LED_MODE FIELD16(0x1f00)
  4390. +
  4391. +/*
  4392. + * EEPROM LNA
  4393. + */
  4394. +#define EEPROM_LNA 0x0022
  4395. +#define EEPROM_LNA_BG FIELD16(0x00ff)
  4396. +#define EEPROM_LNA_A0 FIELD16(0xff00)
  4397. +
  4398. +/*
  4399. + * EEPROM RSSI BG offset
  4400. + */
  4401. +#define EEPROM_RSSI_BG 0x0023
  4402. +#define EEPROM_RSSI_BG_OFFSET0 FIELD16(0x00ff)
  4403. +#define EEPROM_RSSI_BG_OFFSET1 FIELD16(0xff00)
  4404. +
  4405. +/*
  4406. + * EEPROM RSSI BG2 offset
  4407. + */
  4408. +#define EEPROM_RSSI_BG2 0x0024
  4409. +#define EEPROM_RSSI_BG2_OFFSET2 FIELD16(0x00ff)
  4410. +#define EEPROM_RSSI_BG2_LNA_A1 FIELD16(0xff00)
  4411. +
  4412. +/*
  4413. + * EEPROM RSSI A offset
  4414. + */
  4415. +#define EEPROM_RSSI_A 0x0025
  4416. +#define EEPROM_RSSI_A_OFFSET0 FIELD16(0x00ff)
  4417. +#define EEPROM_RSSI_A_OFFSET1 FIELD16(0xff00)
  4418. +
  4419. +/*
  4420. + * EEPROM RSSI A2 offset
  4421. + */
  4422. +#define EEPROM_RSSI_A2 0x0026
  4423. +#define EEPROM_RSSI_A2_OFFSET2 FIELD16(0x00ff)
  4424. +#define EEPROM_RSSI_A2_LNA_A2 FIELD16(0xff00)
  4425. +
  4426. +/*
  4427. + * EEPROM TXpower delta: 20MHZ AND 40 MHZ use different power.
  4428. + * This is delta in 40MHZ.
  4429. + * VALUE: Tx Power dalta value (MAX=4)
  4430. + * TYPE: 1: Plus the delta value, 0: minus the delta value
  4431. + * TXPOWER: Enable:
  4432. + */
  4433. +#define EEPROM_TXPOWER_DELTA 0x0028
  4434. +#define EEPROM_TXPOWER_DELTA_VALUE FIELD16(0x003f)
  4435. +#define EEPROM_TXPOWER_DELTA_TYPE FIELD16(0x0040)
  4436. +#define EEPROM_TXPOWER_DELTA_TXPOWER FIELD16(0x0080)
  4437. +
  4438. +/*
  4439. + * EEPROM TXPOWER 802.11G
  4440. + */
  4441. +#define EEPROM_TXPOWER_BG1 0x0029
  4442. +#define EEPROM_TXPOWER_BG2 0x0030
  4443. +#define EEPROM_TXPOWER_BG_SIZE 7
  4444. +#define EEPROM_TXPOWER_BG_1 FIELD16(0x00ff)
  4445. +#define EEPROM_TXPOWER_BG_2 FIELD16(0xff00)
  4446. +
  4447. +/*
  4448. + * EEPROM TXPOWER 802.11A
  4449. + */
  4450. +#define EEPROM_TXPOWER_A1 0x003c
  4451. +#define EEPROM_TXPOWER_A2 0x0053
  4452. +#define EEPROM_TXPOWER_A_SIZE 6
  4453. +#define EEPROM_TXPOWER_A_1 FIELD16(0x00ff)
  4454. +#define EEPROM_TXPOWER_A_2 FIELD16(0xff00)
  4455. +
  4456. +/*
  4457. + * EEPROM TXpower byrate: 20MHZ power
  4458. + */
  4459. +#define EEPROM_TXPOWER_BYRATE 0x006f
  4460. +
  4461. +/*
  4462. + * EEPROM BBP.
  4463. + */
  4464. +#define EEPROM_BBP_START 0x0078
  4465. +#define EEPROM_BBP_SIZE 16
  4466. +#define EEPROM_BBP_VALUE FIELD16(0x00ff)
  4467. +#define EEPROM_BBP_REG_ID FIELD16(0xff00)
  4468. +
  4469. +/*
  4470. + * MCU mailbox commands.
  4471. + */
  4472. +#define MCU_SLEEP 0x30
  4473. +#define MCU_WAKEUP 0x31
  4474. +#define MCU_LED 0x50
  4475. +#define MCU_LED_STRENGTH 0x51
  4476. +#define MCU_LED_1 0x52
  4477. +#define MCU_LED_2 0x53
  4478. +#define MCU_LED_3 0x54
  4479. +#define MCU_RADAR 0x60
  4480. +#define MCU_BOOT_SIGNAL 0x72
  4481. +
  4482. +/*
  4483. + * DMA descriptor defines.
  4484. + */
  4485. +#define TXD_DESC_SIZE ( 4 * sizeof(__le32) )
  4486. +#define TXWI_DESC_SIZE ( 4 * sizeof(__le32) )
  4487. +#define RXD_DESC_SIZE ( 4 * sizeof(__le32) )
  4488. +#define RXWI_DESC_SIZE ( 4 * sizeof(__le32) )
  4489. +
  4490. +/*
  4491. + * TX descriptor format for TX, PRIO and Beacon Ring.
  4492. + */
  4493. +
  4494. +/*
  4495. + * Word0
  4496. + */
  4497. +#define TXD_W0_SD_PTR0 FIELD32(0xffffffff)
  4498. +
  4499. +/*
  4500. + * Word1
  4501. + */
  4502. +#define TXD_W1_SD_LEN1 FIELD32(0x00003fff)
  4503. +#define TXD_W1_LAST_SEC1 FIELD32(0x00004000)
  4504. +#define TXD_W1_BURST FIELD32(0x00008000)
  4505. +#define TXD_W1_SD_LEN0 FIELD32(0x3fff0000)
  4506. +#define TXD_W1_LAST_SEC0 FIELD32(0x40000000)
  4507. +#define TXD_W1_DMA_DONE FIELD32(0x80000000)
  4508. +
  4509. +/*
  4510. + * Word2
  4511. + */
  4512. +#define TXD_W2_SD_PTR1 FIELD32(0xffffffff)
  4513. +
  4514. +/*
  4515. + * Word3
  4516. + * WIV: Wireless Info Valid. 1: Driver filled WI, 0: DMA needs to copy WI
  4517. + * QSEL: Select on-chip FIFO ID for 2nd-stage output scheduler.
  4518. + * 0:MGMT, 1:HCCA 2:EDCA
  4519. + */
  4520. +#define TXD_W3_WIV FIELD32(0x01000000)
  4521. +#define TXD_W3_QSEL FIELD32(0x06000000)
  4522. +#define TXD_W3_TCO FIELD32(0x20000000)
  4523. +#define TXD_W3_UCO FIELD32(0x40000000)
  4524. +#define TXD_W3_ICO FIELD32(0x80000000)
  4525. +
  4526. +/*
  4527. + * TX WI structure
  4528. + */
  4529. +
  4530. +/*
  4531. + * Word0
  4532. + * FRAG: 1 To inform TKIP engine this is a fragment.
  4533. + * MIMO_PS: The remote peer is in dynamic MIMO-PS mode
  4534. + * TX_OP: 0:HT TXOP rule , 1:PIFS TX ,2:Backoff, 3:sifs
  4535. + * BW: Channel bandwidth 20MHz or 40 MHz
  4536. + * STBC: 1: STBC support MCS =0-7, 2,3 : RESERVED
  4537. + */
  4538. +#define TXWI_W0_FRAG FIELD32(0x00000001)
  4539. +#define TXWI_W0_MIMO_PS FIELD32(0x00000002)
  4540. +#define TXWI_W0_CF_ACK FIELD32(0x00000004)
  4541. +#define TXWI_W0_TS FIELD32(0x00000008)
  4542. +#define TXWI_W0_AMPDU FIELD32(0x00000010)
  4543. +#define TXWI_W0_MPDU_DENSITY FIELD32(0x000000e0)
  4544. +#define TXWI_W0_TX_OP FIELD32(0x00000300)
  4545. +#define TXWI_W0_MCS FIELD32(0x007f0000)
  4546. +#define TXWI_W0_BW FIELD32(0x00800000)
  4547. +#define TXWI_W0_SHORT_GI FIELD32(0x01000000)
  4548. +#define TXWI_W0_STBC FIELD32(0x06000000)
  4549. +#define TXWI_W0_IFS FIELD32(0x08000000)
  4550. +#define TXWI_W0_PHYMODE FIELD32(0xc0000000)
  4551. +
  4552. +/*
  4553. + * Word1
  4554. + */
  4555. +#define TXWI_W1_ACK FIELD32(0x00000001)
  4556. +#define TXWI_W1_NSEQ FIELD32(0x00000002)
  4557. +#define TXWI_W1_BW_WIN_SIZE FIELD32(0x000000fc)
  4558. +#define TXWI_W1_WIRELESS_CLI_ID FIELD32(0x0000ff00)
  4559. +#define TXWI_W1_MPDU_TOTAL_BYTE_COUNT FIELD32(0x0fff0000)
  4560. +#define TXWI_W1_PACKETID FIELD32(0xf0000000)
  4561. +
  4562. +/*
  4563. + * Word2
  4564. + */
  4565. +#define TXWI_W2_IV FIELD32(0xffffffff)
  4566. +
  4567. +/*
  4568. + * Word3
  4569. + */
  4570. +#define TXWI_W3_EIV FIELD32(0xffffffff)
  4571. +
  4572. +/*
  4573. + * RX descriptor format for RX Ring.
  4574. + */
  4575. +
  4576. +/*
  4577. + * Word0
  4578. + */
  4579. +#define RXD_W0_SDP0 FIELD32(0xffffffff)
  4580. +
  4581. +/*
  4582. + * Word1
  4583. + */
  4584. +#define RXD_W1_SDL1 FIELD32(0x00003fff)
  4585. +#define RXD_W1_SDL0 FIELD32(0x3fff0000)
  4586. +#define RXD_W1_LS0 FIELD32(0x40000000)
  4587. +#define RXD_W1_DMA_DONE FIELD32(0x80000000)
  4588. +
  4589. +/*
  4590. + * Word2
  4591. + */
  4592. +#define RXD_W2_SDP1 FIELD32(0xffffffff)
  4593. +
  4594. +/*
  4595. + * Word3
  4596. + * AMSDU: RX with 802.3 header, not 802.11 header.
  4597. + * DECRYPTED: This frame is being decrypted.
  4598. + */
  4599. +#define RXD_W3_BA FIELD32(0x00000001)
  4600. +#define RXD_W3_DATA FIELD32(0x00000002)
  4601. +#define RXD_W3_NULLDATA FIELD32(0x00000004)
  4602. +#define RXD_W3_FRAG FIELD32(0x00000008)
  4603. +#define RXD_W3_UNICAST_TO_ME FIELD32(0x00000010)
  4604. +#define RXD_W3_MULTICAST FIELD32(0x00000020)
  4605. +#define RXD_W3_BROADCAST FIELD32(0x00000040)
  4606. +#define RXD_W3_MY_BSS FIELD32(0x00000080)
  4607. +#define RXD_W3_CRC_ERROR FIELD32(0x00000100)
  4608. +#define RXD_W3_CIPHER_ERROR FIELD32(0x00000600)
  4609. +#define RXD_W3_AMSDU FIELD32(0x00000800)
  4610. +#define RXD_W3_HTC FIELD32(0x00001000)
  4611. +#define RXD_W3_RSSI FIELD32(0x00002000)
  4612. +#define RXD_W3_L2PAD FIELD32(0x00004000)
  4613. +#define RXD_W3_AMPDU FIELD32(0x00008000)
  4614. +#define RXD_W3_DECRYPTED FIELD32(0x00010000)
  4615. +#define RXD_W3_PLCP_SIGNAL FIELD32(0x00020000)
  4616. +#define RXD_W3_PLCP_RSSI FIELD32(0x00040000)
  4617. +
  4618. +/*
  4619. + * RX WI structure
  4620. + */
  4621. +
  4622. +/*
  4623. + * Word0
  4624. + */
  4625. +#define RXWI_W0_WIRELESS_CLI_ID FIELD32(0x000000ff)
  4626. +#define RXWI_W0_KEY_INDEX FIELD32(0x00000300)
  4627. +#define RXWI_W0_BSSID FIELD32(0x00001c00)
  4628. +#define RXWI_W0_UDF FIELD32(0x0000e000)
  4629. +#define RXWI_W0_MPDU_TOTAL_BYTE_COUNT FIELD32(0x0fff0000)
  4630. +#define RXWI_W0_TID FIELD32(0xf0000000)
  4631. +
  4632. +/*
  4633. + * Word1
  4634. + */
  4635. +#define RXWI_W1_FRAG FIELD32(0x0000000f)
  4636. +#define RXWI_W1_SEQUENCE FIELD32(0x0000fff0)
  4637. +#define RXWI_W1_MCS FIELD32(0x007f0000)
  4638. +#define RXWI_W1_BW FIELD32(0x00800000)
  4639. +#define RXWI_W1_SHORT_GI FIELD32(0x01000000)
  4640. +#define RXWI_W1_STBC FIELD32(0x06000000)
  4641. +#define RXWI_W1_PHYMODE FIELD32(0xc0000000)
  4642. +
  4643. +/*
  4644. + * Word2
  4645. + */
  4646. +#define RXWI_W2_RSSI0 FIELD32(0x000000ff)
  4647. +#define RXWI_W2_RSSI1 FIELD32(0x0000ff00)
  4648. +#define RXWI_W2_RSSI2 FIELD32(0x00ff0000)
  4649. +
  4650. +/*
  4651. + * Word3
  4652. + */
  4653. +#define RXWI_W3_SNR0 FIELD32(0x000000ff)
  4654. +#define RXWI_W3_SNR1 FIELD32(0x0000ff00)
  4655. +
  4656. +/*
  4657. + * Macro's for converting txpower from EEPROM to mac80211 value
  4658. + * and from mac80211 value to register value.
  4659. + */
  4660. +#define MIN_G_TXPOWER 0
  4661. +#define MIN_A_TXPOWER -7
  4662. +#define MAX_G_TXPOWER 31
  4663. +#define MAX_A_TXPOWER 15
  4664. +#define DEFAULT_TXPOWER 5
  4665. +
  4666. +#define TXPOWER_G_FROM_DEV(__txpower) \
  4667. + ((__txpower) > MAX_G_TXPOWER) ? DEFAULT_TXPOWER : (__txpower)
  4668. +
  4669. +#define TXPOWER_G_TO_DEV(__txpower) \
  4670. + clamp_t(char, __txpower, MIN_G_TXPOWER, MAX_G_TXPOWER)
  4671. +
  4672. +#define TXPOWER_A_FROM_DEV(__txpower) \
  4673. + ((__txpower) > MAX_A_TXPOWER) ? DEFAULT_TXPOWER : (__txpower)
  4674. +
  4675. +#define TXPOWER_A_TO_DEV(__txpower) \
  4676. + clamp_t(char, __txpower, MIN_A_TXPOWER, MAX_A_TXPOWER)
  4677. +
  4678. +#endif /* RT2800PCI_H */
  4679. --- a/drivers/net/wireless/rt2x00/rt2x00.h
  4680. +++ b/drivers/net/wireless/rt2x00/rt2x00.h
  4681. @@ -139,6 +139,10 @@ struct rt2x00_chip {
  4682. #define RT2561 0x0302
  4683. #define RT2661 0x0401
  4684. #define RT2571 0x1300
  4685. +#define RT2860 0x0601 /* 2.4GHz PCI/CB */
  4686. +#define RT2860D 0x0681 /* 2.4GHz, 5GHz PCI/CB */
  4687. +#define RT2890 0x0701 /* 2.4GHz PCIe */
  4688. +#define RT2890D 0x0781 /* 2.4GHz, 5GHz PCIe */
  4689. u16 rf;
  4690. u32 rev;