wlan_oid.c 410 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084908590869087908890899090909190929093909490959096909790989099910091019102910391049105910691079108910991109111911291139114911591169117911891199120912191229123912491259126912791289129913091319132913391349135913691379138913991409141914291439144914591469147914891499150915191529153915491559156915791589159916091619162916391649165916691679168916991709171917291739174917591769177917891799180918191829183918491859186918791889189919091919192919391949195919691979198919992009201920292039204920592069207920892099210921192129213921492159216921792189219922092219222922392249225922692279228922992309231923292339234923592369237923892399240924192429243924492459246924792489249925092519252925392549255925692579258925992609261926292639264926592669267926892699270927192729273927492759276927792789279928092819282928392849285928692879288928992909291929292939294929592969297929892999300930193029303930493059306930793089309931093119312931393149315931693179318931993209321932293239324932593269327932893299330933193329333933493359336933793389339934093419342934393449345934693479348934993509351935293539354935593569357935893599360936193629363936493659366936793689369937093719372937393749375937693779378937993809381938293839384938593869387938893899390939193929393939493959396939793989399940094019402940394049405940694079408940994109411941294139414941594169417941894199420942194229423942494259426942794289429943094319432943394349435943694379438943994409441944294439444944594469447944894499450945194529453945494559456945794589459946094619462946394649465946694679468946994709471947294739474947594769477947894799480948194829483948494859486948794889489949094919492949394949495949694979498949995009501950295039504950595069507950895099510951195129513951495159516951795189519952095219522952395249525952695279528952995309531953295339534953595369537953895399540954195429543954495459546954795489549955095519552955395549555955695579558955995609561956295639564956595669567956895699570957195729573957495759576957795789579958095819582958395849585958695879588958995909591959295939594959595969597959895999600960196029603960496059606960796089609961096119612961396149615961696179618961996209621962296239624962596269627962896299630963196329633963496359636963796389639964096419642964396449645964696479648964996509651965296539654965596569657965896599660966196629663966496659666966796689669967096719672967396749675967696779678967996809681968296839684968596869687968896899690969196929693969496959696969796989699970097019702970397049705970697079708970997109711971297139714971597169717971897199720972197229723972497259726972797289729973097319732973397349735973697379738973997409741974297439744974597469747974897499750975197529753975497559756975797589759976097619762976397649765976697679768976997709771977297739774977597769777977897799780978197829783978497859786978797889789979097919792979397949795979697979798979998009801980298039804980598069807980898099810981198129813981498159816981798189819982098219822982398249825982698279828982998309831983298339834983598369837983898399840984198429843984498459846984798489849985098519852985398549855985698579858985998609861986298639864986598669867986898699870987198729873987498759876987798789879988098819882988398849885988698879888988998909891989298939894989598969897989898999900990199029903990499059906990799089909991099119912991399149915991699179918991999209921992299239924992599269927992899299930993199329933993499359936993799389939994099419942994399449945994699479948994999509951995299539954995599569957995899599960996199629963996499659966996799689969997099719972997399749975997699779978997999809981998299839984998599869987998899899990999199929993999499959996999799989999100001000110002100031000410005100061000710008100091001010011100121001310014100151001610017100181001910020100211002210023100241002510026100271002810029100301003110032100331003410035100361003710038100391004010041100421004310044100451004610047100481004910050100511005210053100541005510056100571005810059100601006110062100631006410065100661006710068100691007010071100721007310074100751007610077100781007910080100811008210083100841008510086100871008810089100901009110092100931009410095100961009710098100991010010101101021010310104101051010610107101081010910110101111011210113101141011510116101171011810119101201012110122101231012410125101261012710128101291013010131101321013310134101351013610137101381013910140101411014210143101441014510146101471014810149101501015110152101531015410155101561015710158101591016010161101621016310164101651016610167101681016910170101711017210173101741017510176101771017810179101801018110182101831018410185101861018710188101891019010191101921019310194101951019610197101981019910200102011020210203102041020510206102071020810209102101021110212102131021410215102161021710218102191022010221102221022310224102251022610227102281022910230102311023210233102341023510236102371023810239102401024110242102431024410245102461024710248102491025010251102521025310254102551025610257102581025910260102611026210263102641026510266102671026810269102701027110272102731027410275102761027710278102791028010281102821028310284102851028610287102881028910290102911029210293102941029510296102971029810299103001030110302103031030410305103061030710308103091031010311103121031310314103151031610317103181031910320103211032210323103241032510326103271032810329103301033110332103331033410335103361033710338103391034010341103421034310344103451034610347103481034910350103511035210353103541035510356103571035810359103601036110362103631036410365103661036710368103691037010371103721037310374103751037610377103781037910380103811038210383103841038510386103871038810389103901039110392103931039410395103961039710398103991040010401104021040310404104051040610407104081040910410104111041210413104141041510416104171041810419104201042110422104231042410425104261042710428104291043010431104321043310434104351043610437104381043910440104411044210443104441044510446104471044810449104501045110452104531045410455104561045710458104591046010461104621046310464104651046610467104681046910470104711047210473104741047510476104771047810479104801048110482104831048410485104861048710488104891049010491104921049310494104951049610497104981049910500105011050210503105041050510506105071050810509105101051110512105131051410515105161051710518105191052010521105221052310524105251052610527105281052910530105311053210533105341053510536105371053810539105401054110542105431054410545105461054710548105491055010551105521055310554105551055610557105581055910560105611056210563105641056510566105671056810569105701057110572105731057410575105761057710578105791058010581105821058310584105851058610587105881058910590105911059210593105941059510596105971059810599106001060110602106031060410605106061060710608106091061010611106121061310614106151061610617106181061910620106211062210623106241062510626106271062810629106301063110632106331063410635106361063710638106391064010641106421064310644106451064610647106481064910650106511065210653106541065510656106571065810659106601066110662106631066410665106661066710668106691067010671106721067310674106751067610677106781067910680106811068210683106841068510686106871068810689106901069110692106931069410695106961069710698106991070010701107021070310704107051070610707107081070910710107111071210713107141071510716107171071810719107201072110722107231072410725107261072710728107291073010731107321073310734107351073610737107381073910740107411074210743107441074510746107471074810749107501075110752107531075410755107561075710758107591076010761107621076310764107651076610767107681076910770107711077210773107741077510776107771077810779107801078110782107831078410785107861078710788107891079010791107921079310794107951079610797107981079910800108011080210803108041080510806108071080810809108101081110812108131081410815108161081710818108191082010821108221082310824108251082610827108281082910830108311083210833108341083510836108371083810839108401084110842108431084410845108461084710848108491085010851108521085310854108551085610857108581085910860108611086210863108641086510866108671086810869108701087110872108731087410875108761087710878108791088010881108821088310884108851088610887108881088910890108911089210893108941089510896108971089810899109001090110902109031090410905109061090710908109091091010911109121091310914109151091610917109181091910920109211092210923109241092510926109271092810929109301093110932109331093410935109361093710938109391094010941109421094310944109451094610947109481094910950109511095210953109541095510956109571095810959109601096110962109631096410965109661096710968109691097010971109721097310974109751097610977109781097910980109811098210983109841098510986109871098810989109901099110992109931099410995109961099710998109991100011001110021100311004110051100611007110081100911010110111101211013110141101511016110171101811019110201102111022110231102411025110261102711028110291103011031110321103311034110351103611037110381103911040110411104211043110441104511046110471104811049110501105111052110531105411055110561105711058110591106011061110621106311064110651106611067110681106911070110711107211073110741107511076110771107811079110801108111082110831108411085110861108711088110891109011091110921109311094110951109611097110981109911100111011110211103111041110511106111071110811109111101111111112111131111411115111161111711118111191112011121111221112311124111251112611127111281112911130111311113211133111341113511136111371113811139111401114111142111431114411145111461114711148111491115011151111521115311154111551115611157111581115911160111611116211163111641116511166111671116811169111701117111172111731117411175111761117711178111791118011181111821118311184111851118611187111881118911190111911119211193111941119511196111971119811199112001120111202112031120411205112061120711208112091121011211112121121311214112151121611217112181121911220112211122211223112241122511226112271122811229112301123111232112331123411235112361123711238112391124011241112421124311244112451124611247112481124911250112511125211253112541125511256112571125811259112601126111262112631126411265112661126711268112691127011271112721127311274112751127611277112781127911280112811128211283112841128511286112871128811289112901129111292112931129411295112961129711298112991130011301113021130311304113051130611307113081130911310113111131211313113141131511316113171131811319113201132111322113231132411325113261132711328113291133011331113321133311334113351133611337113381133911340113411134211343113441134511346113471134811349113501135111352113531135411355113561135711358113591136011361113621136311364113651136611367113681136911370113711137211373113741137511376113771137811379113801138111382113831138411385113861138711388113891139011391113921139311394113951139611397113981139911400114011140211403114041140511406114071140811409114101141111412114131141411415114161141711418114191142011421114221142311424114251142611427114281142911430114311143211433114341143511436114371143811439114401144111442114431144411445114461144711448114491145011451114521145311454114551145611457114581145911460114611146211463114641146511466114671146811469114701147111472114731147411475114761147711478114791148011481114821148311484114851148611487114881148911490114911149211493114941149511496114971149811499115001150111502115031150411505115061150711508115091151011511115121151311514115151151611517115181151911520115211152211523115241152511526115271152811529115301153111532115331153411535115361153711538115391154011541115421154311544115451154611547115481154911550115511155211553115541155511556115571155811559115601156111562115631156411565115661156711568115691157011571115721157311574115751157611577115781157911580115811158211583115841158511586115871158811589115901159111592115931159411595115961159711598115991160011601116021160311604116051160611607116081160911610116111161211613116141161511616116171161811619116201162111622116231162411625116261162711628116291163011631116321163311634116351163611637116381163911640116411164211643116441164511646116471164811649116501165111652116531165411655116561165711658116591166011661116621166311664116651166611667116681166911670116711167211673116741167511676116771167811679116801168111682116831168411685116861168711688116891169011691116921169311694116951169611697116981169911700117011170211703117041170511706117071170811709117101171111712117131171411715117161171711718117191172011721117221172311724117251172611727117281172911730117311173211733117341173511736117371173811739117401174111742117431174411745117461174711748117491175011751117521175311754117551175611757117581175911760117611176211763117641176511766117671176811769117701177111772117731177411775117761177711778117791178011781117821178311784117851178611787117881178911790117911179211793117941179511796117971179811799118001180111802118031180411805118061180711808118091181011811118121181311814118151181611817118181181911820118211182211823118241182511826118271182811829118301183111832118331183411835118361183711838118391184011841118421184311844118451184611847118481184911850118511185211853118541185511856118571185811859118601186111862118631186411865118661186711868118691187011871118721187311874118751187611877118781187911880118811188211883118841188511886118871188811889118901189111892118931189411895118961189711898118991190011901119021190311904119051190611907119081190911910119111191211913119141191511916119171191811919119201192111922119231192411925119261192711928119291193011931119321193311934119351193611937119381193911940119411194211943119441194511946119471194811949119501195111952
  1. /*
  2. ** Id: //Department/DaVinci/BRANCHES/MT6620_WIFI_DRIVER_V2_3/common/wlan_oid.c#11
  3. */
  4. /*! \file wlanoid.c
  5. \brief This file contains the WLAN OID processing routines of Windows driver for
  6. MediaTek Inc. 802.11 Wireless LAN Adapters.
  7. */
  8. /*
  9. ** Log: wlan_oid.c
  10. **
  11. ** 04 08 2014 eason.tsai
  12. ** [ALPS01070904] [Need Patch] [Volunteer Patch]
  13. ** add for BLBIST dump index
  14. **
  15. ** 01 15 2014 eason.tsai
  16. ** [ALPS01070904] [Need Patch] [Volunteer Patch][MT6630][Driver]MT6630 Wi-Fi Patch
  17. ** Merging
  18. **
  19. ** //ALPS_SW/DEV/ALPS.JB2.MT6630.DEV/alps/mediatek/kernel/drivers/combo/drv_wlan/mt6630/wlan/...
  20. **
  21. ** to //ALPS_SW/TRUNK/KK/alps/mediatek/kernel/drivers/combo/drv_wlan/mt6630/wlan/...
  22. **
  23. ** 12 27 2013 eason.tsai
  24. ** [ALPS01070904] [Need Patch] [Volunteer Patch][MT6630][Driver]MT6630 Wi-Fi Patch
  25. ** update code for ICAP & nvram
  26. **
  27. ** 09 13 2013 eason.tsai
  28. ** [BORA00002255] [MT6630 Wi-Fi][Driver] develop
  29. ** update ICAP for marking ICAP done file
  30. **
  31. ** 08 28 2013 jeffrey.chang
  32. ** [BORA00002710] [MT6630][Wi-Fi] PM driver development
  33. ** fix debug log
  34. **
  35. ** 08 28 2013 jeffrey.chang
  36. ** [BORA00002710] [MT6630][Wi-Fi] PM driver development
  37. ** 1) fix bug
  38. **
  39. ** 08 23 2013 wh.su
  40. ** [BORA00002446] [MT6630] [Wi-Fi] [Driver] Update the security function code
  41. ** Add GTK re-key driver handle function
  42. **
  43. ** 08 22 2013 cp.wu
  44. ** [BORA00002253] [MT6630 Wi-Fi][Driver][Firmware] Add NLO and timeout mechanism to SCN module
  45. ** handle schedule scan request with awareness of online scan enabled or not
  46. **
  47. ** 08 22 2013 tsaiyuan.hsu
  48. ** [BORA00002222] MT6630 unified MAC RXM
  49. ** add mDNS filter for Android.
  50. **
  51. ** 08 20 2013 eason.tsai
  52. ** [BORA00002255] [MT6630 Wi-Fi][Driver] develop
  53. ** Icap function
  54. **
  55. ** 08 16 2013 eason.tsai
  56. ** [BORA00002255] [MT6630 Wi-Fi][Driver] develop
  57. ** add icap function
  58. **
  59. ** 08 15 2013 cp.wu
  60. ** [BORA00002253] [MT6630 Wi-Fi][Driver][Firmware] Add NLO and timeout mechanism to SCN module
  61. ** enlarge match_ssid_num to 16 for PNO support
  62. **
  63. ** 08 09 2013 cp.wu
  64. ** [BORA00002253] [MT6630 Wi-Fi][Driver][Firmware] Add NLO and timeout mechanism to SCN module
  65. ** 1. integrate scheduled scan functionality
  66. ** 2. condition compilation for linux-3.4 & linux-3.8 compatibility
  67. ** 3. correct CMD queue access to reduce lock scope
  68. **
  69. ** 08 05 2013 terry.wu
  70. ** [BORA00002207] [MT6630 Wi-Fi] TXM & MQM Implementation
  71. ** 1. Add SW rate definition
  72. ** 2. Add HW default rate selection logic from FW
  73. **
  74. ** 07 30 2013 wh.su
  75. ** [BORA00002446] [MT6630] [Wi-Fi] [Driver] Update the security function code
  76. ** Add Rx TKIP mic check
  77. **
  78. ** 07 24 2013 yuche.tsai
  79. ** [BORA00002398] [MT6630][Volunteer Patch] P2P Driver Re-Design for Multiple BSS support
  80. ** Update for Hot-Spot code.
  81. **
  82. ** 07 23 2013 jeffrey.chang
  83. ** [BORA00002710] [MT6630][Wi-Fi] PM driver development
  84. ** kb
  85. **
  86. ** 07 23 2013 cp.wu
  87. ** [BORA00002227] [MT6630 Wi-Fi][Driver] Update for Makefile and HIFSYS modifications
  88. ** 1. build success for win32 port
  89. ** 2. add SDIO test read/write pattern for HQA tests (default off)
  90. **
  91. ** 07 23 2013 wh.su
  92. ** [BORA00002446] [MT6630] [Wi-Fi] [Driver] Update the security function code
  93. ** Sync the latest jb2.mp 11w code as draft version
  94. ** Not the CM bit for avoid wapi 1x drop at re-key
  95. **
  96. ** 07 17 2013 wh.su
  97. ** [BORA00002446] [MT6630] [Wi-Fi] [Driver] Update the security function code
  98. ** fix and modify some security code
  99. **
  100. ** 07 10 2013 terry.wu
  101. ** [BORA00002207] [MT6630 Wi-Fi] TXM & MQM Implementation
  102. ** Disable IP/TCP/UDP checksum temporally for 1st connection
  103. **
  104. ** 07 05 2013 wh.su
  105. ** [BORA00002446] [MT6630] [Wi-Fi] [Driver] Update the security function code
  106. ** Fix to let the wpa-psk ok
  107. **
  108. ** 07 04 2013 wh.su
  109. ** [BORA00002446] [MT6630] [Wi-Fi] [Driver] Update the security function code
  110. ** Add the function to got the STA index via the wlan index
  111. ** report at Rx status
  112. **
  113. ** 07 03 2013 wh.su
  114. ** [BORA00002446] [MT6630] [Wi-Fi] [Driver] Update the security function code
  115. ** Refine some normal security code
  116. **
  117. ** 07 02 2013 wh.su
  118. ** [BORA00002446] [MT6630] [Wi-Fi] [Driver] Update the security function code
  119. ** Refine some secutity code
  120. **
  121. ** 07 02 2013 wh.su
  122. ** [BORA00002446] [MT6630] [Wi-Fi] [Driver] Update the security function code
  123. ** Refine security BMC wlan index assign
  124. ** Fix some compiling warning
  125. **
  126. ** 07 01 2013 wh.su
  127. ** [BORA00002446] [MT6630] [Wi-Fi] [Driver] Update the security function code
  128. ** Add some debug code, fixed some compiling warning
  129. **
  130. ** 06 19 2013 cp.wu
  131. ** [BORA00002227] [MT6630 Wi-Fi][Driver] Update for Makefile and HIFSYS modifications
  132. ** update MAC address handling logic
  133. **
  134. ** 06 18 2013 cm.chang
  135. ** [BORA00002149] [MT6630 Wi-Fi] Initial software development
  136. ** Get MAC address by NIC_CAPABILITY command
  137. **
  138. ** 04 12 2013 wh.su
  139. ** [BORA00002446] [MT6630] [Wi-Fi] [Driver] Update the security function code
  140. ** update some normal security code
  141. **
  142. ** 03 29 2013 cp.wu
  143. ** [BORA00002227] [MT6630 Wi-Fi][Driver] Update for Makefile and HIFSYS modifications
  144. ** 1. remove unused HIF definitions
  145. ** 2. enable NDIS 5.1 build success
  146. **
  147. ** 03 29 2013 wh.su
  148. ** [BORA00002446] [MT6630] [Wi-Fi] [Driver] Update the security function code
  149. ** fixed some compiling error at windows build environment
  150. **
  151. ** 03 27 2013 wh.su
  152. ** [BORA00002446] [MT6630] [Wi-Fi] [Driver] Update the security function code
  153. ** fixed compiling error
  154. **
  155. ** 03 27 2013 wh.su
  156. ** [BORA00002446] [MT6630] [Wi-Fi] [Driver] Update the security function code
  157. ** add default ket handler
  158. **
  159. ** 03 20 2013 wh.su
  160. ** [BORA00002446] [MT6630] [Wi-Fi] [Driver] Update the security function code
  161. ** Add the security code for wlan table assign operation
  162. **
  163. ** 03 14 2013 wh.su
  164. ** [BORA00002446] [MT6630] [Wi-Fi] [Driver] Update the security function code
  165. ** .modify some code define and flow
  166. **
  167. ** 03 12 2013 wh.su
  168. ** [BORA00002446] [MT6630] [Wi-Fi] [Driver] Update the security function code
  169. ** .
  170. **
  171. ** 03 08 2013 wh.su
  172. ** [BORA00002446] [MT6630] [Wi-Fi] [Driver] Update the security function code
  173. ** Remove non-used compiling flag and code
  174. **
  175. ** 03 08 2013 wh.su
  176. ** [BORA00002446] [MT6630] [Wi-Fi] [Driver] Update the security function code
  177. ** Modify code for security design
  178. **
  179. ** 03 07 2013 yuche.tsai
  180. ** [BORA00002398] [MT6630][Volunteer Patch] P2P Driver Re-Design for Multiple BSS support
  181. ** Add wlan_p2p.c, but still need to FIX many place.
  182. **
  183. ** 03 06 2013 wh.su
  184. ** [BORA00002446] [MT6630] [Wi-Fi] [Driver] Update the security function code
  185. ** submit some code related with security.
  186. **
  187. ** 02 19 2013 cp.wu
  188. ** [BORA00002227] [MT6630 Wi-Fi][Driver] Update for Makefile and HIFSYS modifications
  189. ** take use of GET_BSS_INFO_BY_INDEX() and MAX_BSS_INDEX macros
  190. ** for correctly indexing of BSS-INFO pointers
  191. **
  192. ** 01 22 2013 cp.wu
  193. ** [BORA00002253] [MT6630 Wi-Fi][Driver][Firmware] Add NLO and timeout mechanism to SCN module
  194. ** modification for ucBssIndex migration
  195. **
  196. ** 01 18 2013 cp.wu
  197. ** [BORA00002253] [MT6630 Wi-Fi][Driver][Firmware] Add NLO and timeout mechanism to SCN module
  198. ** return error code when online-scan is to be ignored
  199. **
  200. ** 11 20 2012 cp.wu
  201. ** [BORA00002227] [MT6630 Wi-Fi][Driver] Update for Makefile and HIFSYS modifications
  202. ** remove unenecessary NULL checking when entering into/leaving from RF test mode.
  203. **
  204. ** 11 01 2012 cp.wu
  205. ** [BORA00002227] [MT6630 Wi-Fi][Driver] Update for Makefile and HIFSYS modifications
  206. ** update to MT6630 CMD/EVENT definitions.
  207. **
  208. ** 09 17 2012 cm.chang
  209. ** [BORA00002149] [MT6630 Wi-Fi] Initial software development
  210. ** Duplicate source from MT6620 v2.3 driver branch
  211. ** (Davinci label: MT6620_WIFI_Driver_V2_3_120913_1942_As_MT6630_Base)
  212. **
  213. ** 09 04 2012 cp.wu
  214. ** [WCXRP00001269] [MT6620 Wi-Fi][Driver] cfg80211 porting merge back to DaVinci
  215. ** sync for NVRAM warning scan result generation for CFG80211.
  216. **
  217. ** 08 24 2012 cp.wu
  218. ** [WCXRP00001269] [MT6620 Wi-Fi][Driver] cfg80211 porting merge back to DaVinci
  219. ** .
  220. **
  221. ** 08 24 2012 cp.wu
  222. ** [WCXRP00001269] [MT6620 Wi-Fi][Driver] cfg80211 porting merge back to DaVinci
  223. ** cfg80211 support merge back from ALPS.JB to DaVinci - MT6620 Driver v2.3 branch.
  224. **
  225. ** 07 24 2012 yuche.tsai
  226. ** NULL
  227. ** Bug fix for JB.
  228. **
  229. ** 07 19 2012 yuche.tsai
  230. ** NULL
  231. ** Code update for JB.
  232. *
  233. * 07 17 2012 yuche.tsai
  234. * NULL
  235. * Let netdev bring up.
  236. *
  237. * 07 17 2012 yuche.tsai
  238. * NULL
  239. * Compile no error before trial run.
  240. *
  241. * 03 02 2012 terry.wu
  242. * NULL
  243. * Sync CFG80211 modification from branch 2,2.
  244. *
  245. * 01 06 2012 wh.su
  246. * [WCXRP00001153] [MT6620 Wi-Fi][Driver] Adding the get_ch_list and set_tx_power proto type function
  247. * using the wlanSendSetQueryCmd to set the tx power control cmd.
  248. *
  249. * 01 06 2012 wh.su
  250. * [WCXRP00001153] [MT6620 Wi-Fi][Driver] Adding the get_ch_list and set_tx_power proto type function
  251. * change the set tx power cmd name.
  252. *
  253. * 01 05 2012 wh.su
  254. * [WCXRP00001153] [MT6620 Wi-Fi][Driver] Adding the get_ch_list and set_tx_power proto type function
  255. * Adding the related ioctl / wlan oid function to set the Tx power cfg.
  256. *
  257. * 12 20 2011 cp.wu
  258. * [WCXRP00001144] [MT6620 Wi-Fi][Driver][Firmware] Add RF_FUNC_ID for exposing device and related version information
  259. * add driver implementations for RF_AT_FUNCID_FW_INFO & RF_AT_FUNCID_DRV_INFO
  260. * to expose version information
  261. *
  262. * 12 05 2011 cp.wu
  263. * [WCXRP00001131] [MT6620 Wi-Fi][Driver][AIS] Implement connect-by-BSSID path
  264. * add CONNECT_BY_BSSID policy
  265. *
  266. * 11 22 2011 cp.wu
  267. * [WCXRP00001120] [MT6620 Wi-Fi][Driver] Modify roaming to AIS state transition from synchronous to
  268. * asynchronous approach to avoid incomplete state termination
  269. * 1. change RDD related compile option brace position.
  270. * 2. when roaming is triggered, ask AIS to transit immediately only when AIS is in Normal TR state
  271. * without join timeout timer ticking
  272. * 3. otherwise, insert AIS_REQUEST into pending request queue
  273. *
  274. * 11 21 2011 cp.wu
  275. * [WCXRP00001118] [MT6620 Wi-Fi][Driver] Corner case protections to pass Monkey testing
  276. * 1. wlanoidQueryBssIdList might be passed with a non-zero length but a NULL pointer of buffer
  277. * add more checking for such cases
  278. *
  279. * 2. kalSendComplete() might be invoked with a packet belongs to P2P network right after P2P is unregistered.
  280. * add some tweaking to protect such cases because that net device has become invalid.
  281. *
  282. * 11 15 2011 cm.chang
  283. * NULL
  284. * Fix compiling warning
  285. *
  286. * 11 11 2011 wh.su
  287. * [WCXRP00001078] [MT6620 Wi-Fi][Driver] Adding the mediatek log improment support : XLOG
  288. * modify the xlog related code.
  289. *
  290. * 11 11 2011 tsaiyuan.hsu
  291. * [WCXRP00001083] [MT6620 Wi-Fi][DRV]] dump debug counter or frames when debugging is triggered
  292. * add debug counters of bb and ar for xlog.
  293. *
  294. * 11 10 2011 wh.su
  295. * [WCXRP00001078] [MT6620 Wi-Fi][Driver] Adding the mediatek log improment support : XLOG
  296. * change the debug module level.
  297. *
  298. * 11 09 2011 george.huang
  299. * [WCXRP00000871] [MT6620 Wi-Fi][FW] Include additional wakeup condition, which is by
  300. * consequent DTIM unicast indication add XLOG for Set PS mode entry
  301. *
  302. * 11 08 2011 tsaiyuan.hsu
  303. * [WCXRP00001083] [MT6620 Wi-Fi][DRV]] dump debug counter or frames when debugging is triggered
  304. * check if CFG_SUPPORT_SWCR is defined to aoid compiler error.
  305. *
  306. * 11 07 2011 tsaiyuan.hsu
  307. * [WCXRP00001083] [MT6620 Wi-Fi][DRV]] dump debug counter or frames when debugging is triggered
  308. * add debug counters and periodically dump counters for debugging.
  309. *
  310. * 11 03 2011 wh.su
  311. * [WCXRP00001078] [MT6620 Wi-Fi][Driver] Adding the mediatek log improment support : XLOG
  312. * change the DBGLOG for "\n" and "\r\n". LABEL to LOUD for XLOG
  313. *
  314. * 11 02 2011 chinghwa.yu
  315. * [WCXRP00000612] [MT6620 Wi-Fi] [FW] CSD update SWRDD algorithm
  316. * Add RDD certification features.
  317. *
  318. * 10 21 2011 eddie.chen
  319. * [WCXRP00001051] [MT6620 Wi-Fi][Driver/Fw] Adjust the STA aging timeout
  320. * Add switch to ignore the STA aging timeout.
  321. *
  322. * 10 12 2011 wh.su
  323. * [WCXRP00001036] [MT6620 Wi-Fi][Driver][FW] Adding the 802.11w code for MFP
  324. * adding the 802.11w related function and define .
  325. *
  326. * 09 15 2011 tsaiyuan.hsu
  327. * [WCXRP00000938] [MT6620 Wi-Fi][FW] add system config for CTIA
  328. * correct fifo full control from query to set operation for CTIA.
  329. *
  330. * 08 31 2011 cm.chang
  331. * [WCXRP00000969] [MT6620 Wi-Fi][Driver][FW] Channel list for 5G band based on country code
  332. * .
  333. *
  334. * 08 17 2011 tsaiyuan.hsu
  335. * [WCXRP00000938] [MT6620 Wi-Fi][FW] add system config for CTIA
  336. * add system config for CTIA.
  337. *
  338. * 08 15 2011 george.huang
  339. * [MT6620 Wi-Fi][FW] handle TSF drift for connection detection
  340. * .
  341. *
  342. * 07 28 2011 chinghwa.yu
  343. * [WCXRP00000063] Update BCM CoEx design and settings
  344. * Add BWCS cmd and event.
  345. *
  346. * 07 18 2011 chinghwa.yu
  347. * [WCXRP00000063] Update BCM CoEx design and settings[WCXRP00000612] [MT6620 Wi-Fi] [FW] CSD update SWRDD algorithm
  348. * Add CMD/Event for RDD and BWCS.
  349. *
  350. * 07 11 2011 wh.su
  351. * [WCXRP00000849] [MT6620 Wi-Fi][Driver] Remove some of the WAPI define for make sure the value is initialize,
  352. * for customer not enable WAPI
  353. * For make sure wapi initial value is set.
  354. *
  355. * 06 23 2011 cp.wu
  356. * [WCXRP00000812] [MT6620 Wi-Fi][Driver] not show NVRAM when there is no valid MAC address in NVRAM content
  357. * check with firmware for valid MAC address.
  358. *
  359. * 05 02 2011 eddie.chen
  360. * [WCXRP00000373] [MT6620 Wi-Fi][FW] SW debug control
  361. * Fix compile warning.
  362. *
  363. * 04 29 2011 george.huang
  364. * [WCXRP00000684] [MT6620 Wi-Fi][Driver] Support P2P setting ARP filter
  365. * .
  366. *
  367. * 04 27 2011 george.huang
  368. * [WCXRP00000684] [MT6620 Wi-Fi][Driver] Support P2P setting ARP filter
  369. * add more debug message
  370. *
  371. * 04 26 2011 eddie.chen
  372. * [WCXRP00000373] [MT6620 Wi-Fi][FW] SW debug control
  373. * Add rx path profiling.
  374. *
  375. * 04 12 2011 eddie.chen
  376. * [WCXRP00000617] [MT6620 Wi-Fi][DRV/FW] Fix for sigma
  377. * Fix the sta index in processing security frame
  378. * Simple flow control for TC4 to avoid mgt frames for PS STA to occupy the TC4
  379. * Add debug message.
  380. *
  381. * 04 08 2011 george.huang
  382. * [WCXRP00000621] [MT6620 Wi-Fi][Driver] Support P2P supplicant to set power mode
  383. * separate settings of P2P and AIS
  384. *
  385. * 03 31 2011 puff.wen
  386. * NULL
  387. * .
  388. *
  389. * 03 29 2011 puff.wen
  390. * NULL
  391. * Add chennel switch for stress test
  392. *
  393. * 03 29 2011 cp.wu
  394. * [WCXRP00000604] [MT6620 Wi-Fi][Driver] Surpress Klockwork Warning
  395. * surpress klock warning with code path rewritten
  396. *
  397. * 03 24 2011 wh.su
  398. * [WCXRP00000595] [MT6620 Wi-Fi][Driver] at CTIA indicate disconnect to make the ps profile can apply
  399. * use disconnect event instead of ais abort for CTIA testing.
  400. *
  401. * 03 23 2011 george.huang
  402. * [WCXRP00000586] [MT6620 Wi-Fi][FW] Modify for blocking absence request right after connected
  403. * revise for CTIA power mode setting
  404. *
  405. * 03 22 2011 george.huang
  406. * [WCXRP00000504] [MT6620 Wi-Fi][FW] Support Sigma CAPI for power saving related command
  407. * link with supplicant commands
  408. *
  409. * 03 17 2011 chinglan.wang
  410. * [WCXRP00000570] [MT6620 Wi-Fi][Driver] Add Wi-Fi Protected Setup v2.0 feature
  411. * .
  412. *
  413. * 03 17 2011 yarco.yang
  414. * [WCXRP00000569] [MT6620 Wi-Fi][F/W][Driver] Set multicast address support current network usage
  415. * .
  416. *
  417. * 03 15 2011 george.huang
  418. * [WCXRP00000557] [MT6620 Wi-Fi] Support current consumption test mode commands
  419. * Support current consumption measurement mode command
  420. *
  421. * 03 15 2011 eddie.chen
  422. * [WCXRP00000554] [MT6620 Wi-Fi][DRV] Add sw control debug counter
  423. * Add sw debug counter for QM.
  424. *
  425. * 03 10 2011 cp.wu
  426. * [WCXRP00000532] [MT6620 Wi-Fi][Driver] Migrate NVRAM configuration procedures from MT6620 E2 to MT6620 E3
  427. * deprecate configuration used by MT6620 E2
  428. *
  429. * 03 07 2011 terry.wu
  430. * [WCXRP00000521] [MT6620 Wi-Fi][Driver] Remove non-standard debug message
  431. * Toggle non-standard debug messages to comments.
  432. *
  433. * 03 04 2011 cp.wu
  434. * [WCXRP00000515] [MT6620 Wi-Fi][Driver] Surpress compiler warning which is identified by GNU compiler collection
  435. * surpress compile warning occurred when compiled by GNU compiler collection.
  436. *
  437. * 03 03 2011 wh.su
  438. * [WCXRP00000510] [MT6620 Wi-Fi] [Driver] Fixed the CTIA enter test mode issue
  439. * fixed the enter ctia test mode issue.
  440. *
  441. * 03 02 2011 george.huang
  442. * [WCXRP00000504] [MT6620 Wi-Fi][FW] Support Sigma CAPI for power saving related command
  443. * Update sigma CAPI for U-APSD setting
  444. *
  445. * 03 02 2011 george.huang
  446. * [WCXRP00000504] [MT6620 Wi-Fi][FW] Support Sigma CAPI for power saving related command
  447. * Support UAPSD/OppPS/NoA parameter setting
  448. *
  449. * 03 02 2011 cp.wu
  450. * [WCXRP00000503] [MT6620 Wi-Fi][Driver] Take RCPI brought by association response as
  451. * initial RSSI right after connection is built.
  452. * use RCPI brought by ASSOC-RESP after connection is built as initial RCPI to avoid using a uninitialized MAC-RX RCPI.
  453. *
  454. * 01 27 2011 george.huang
  455. * [WCXRP00000400] [MT6620 Wi-Fi] support CTIA power mode setting
  456. * Support CTIA power mode setting.
  457. *
  458. * 01 26 2011 wh.su
  459. * [WCXRP00000396] [MT6620 Wi-Fi][Driver] Support Sw Ctrl ioctl at linux
  460. * adding the SW cmd ioctl support, use set/get structure ioctl.
  461. *
  462. * 01 25 2011 cp.wu
  463. * [WCXRP00000394] [MT6620 Wi-Fi][Driver] Count space needed for generating error message in
  464. * scanning list into buffer size checking
  465. * when doing size prechecking, check illegal MAC address as well
  466. *
  467. * 01 20 2011 eddie.chen
  468. * [WCXRP00000374] [MT6620 Wi-Fi][DRV] SW debug control
  469. * Add Oid for sw control debug command
  470. *
  471. * 01 15 2011 puff.wen
  472. * NULL
  473. * Add Stress test
  474. *
  475. * 01 12 2011 cp.wu
  476. * [WCXRP00000358] [MT6620 Wi-Fi][Driver] Provide concurrent information for each module
  477. * check if allow to switch to IBSS mode via concurrent module before setting to IBSS mode
  478. *
  479. * 01 12 2011 cm.chang
  480. * [WCXRP00000354] [MT6620 Wi-Fi][Driver][FW] Follow NVRAM bandwidth setting
  481. * User-defined bandwidth is for 2.4G and 5G individually
  482. *
  483. * 01 04 2011 cp.wu
  484. * [WCXRP00000342] [MT6620 Wi-Fi][Driver] show error code in scanning list when MAC address is not
  485. * correctly configured in NVRAM
  486. * show error code 0x10 when MAC address in NVRAM is not configured correctly.
  487. *
  488. * 01 04 2011 cp.wu
  489. * [WCXRP00000338] [MT6620 Wi-Fi][Driver] Separate kalMemAlloc into kmalloc and vmalloc implementations
  490. * to ease physically continuous memory demands
  491. * separate kalMemAlloc() into virtually-continuous and physically-continuous type to ease slab system pressure
  492. *
  493. * 12 28 2010 george.huang
  494. * [WCXRP00000232] [MT5931 Wi-Fi][FW] Modifications for updated HW power on sequence and related design
  495. * support WMM-PS U-APSD AC assignment.
  496. *
  497. * 12 28 2010 cp.wu
  498. * [WCXRP00000269] [MT6620 Wi-Fi][Driver][Firmware] Prepare for v1.1 branch release
  499. * report EEPROM used flag via NIC_CAPABILITY
  500. *
  501. * 12 28 2010 cp.wu
  502. * [WCXRP00000269] [MT6620 Wi-Fi][Driver][Firmware] Prepare for v1.1 branch release
  503. * integrate with 'EEPROM used' flag for reporting correct capability to Engineer Mode/META and other tools
  504. *
  505. * 12 16 2010 cp.wu
  506. * [WCXRP00000268] [MT6620 Wi-Fi][Driver] correction for WHQL failed items
  507. * correction for OID_802_11_NETWORK_TYPES_SUPPORTED handlers
  508. *
  509. * 12 13 2010 cp.wu
  510. * [WCXRP00000256] [MT6620 Wi-Fi][Driver] Eliminate potential issues which is identified by Klockwork
  511. * suppress warning reported by Klockwork.
  512. *
  513. * 12 07 2010 cm.chang
  514. * [WCXRP00000239] MT6620 Wi-Fi][Driver][FW] Merge concurrent branch back to maintrunk
  515. * 1. BSSINFO include RLM parameter
  516. * 2. free all sta records when network is disconnected
  517. *
  518. * 12 07 2010 cm.chang
  519. * [WCXRP00000238] MT6620 Wi-Fi][Driver][FW] Support regulation domain setting from NVRAM and supplicant
  520. * 1. Country code is from NVRAM or supplicant
  521. * 2. Change band definition in CMD/EVENT.
  522. *
  523. * 11 30 2010 cp.wu
  524. * [WCXRP00000213] [MT6620 Wi-Fi][Driver] Implement scanning with specified SSID for wpa_supplicant with ap_scan=1
  525. * .
  526. *
  527. * 11 26 2010 cp.wu
  528. * [WCXRP00000209] [MT6620 Wi-Fi][Driver] Modify NVRAM checking mechanism to warning only
  529. * with necessary data field checking
  530. * 1. NVRAM error is now treated as warning only, thus normal operation is still available
  531. * but extra scan result used to indicate user is attached
  532. * 2. DPD and TX-PWR are needed fields from now on, if these 2 fields are not available then warning message is shown
  533. *
  534. * 11 25 2010 cp.wu
  535. * [WCXRP00000208] [MT6620 Wi-Fi][Driver] Add scanning with specified SSID to AIS FSM
  536. * add scanning with specified SSID facility to AIS-FSM
  537. *
  538. * 11 21 2010 wh.su
  539. * [WCXRP00000192] [MT6620 Wi-Fi][Driver] Fixed fail trying to build connection with Security
  540. * AP while enable WAPI message check
  541. * Not set the wapi mode while the wapi assoc info set non-wapi ie.
  542. *
  543. * 11 05 2010 wh.su
  544. * [WCXRP00000165] [MT6620 Wi-Fi] [Pre-authentication] Assoc req rsn ie use wrong pmkid value
  545. * fixed the.pmkid value mismatch issue
  546. *
  547. * 11 01 2010 cp.wu
  548. * [WCXRP00000056] [MT6620 Wi-Fi][Driver] NVRAM implementation with Version
  549. * Check[WCXRP00000150] [MT6620 Wi-Fi][Driver] Add implementation for querying
  550. * current TX rate from firmware auto rate module
  551. * 1) Query link speed (TX rate) from firmware directly with buffering mechanism to reduce overhead
  552. * 2) Remove CNM CH-RECOVER event handling
  553. * 3) cfg read/write API renamed with kal prefix for unified naming rules.
  554. *
  555. * 10 26 2010 cp.wu
  556. * [WCXRP00000056] [MT6620 Wi-Fi][Driver] NVRAM implementation with Version
  557. * Check[WCXRP00000137] [MT6620 Wi-Fi] [FW] Support NIC capability query command
  558. * 1) update NVRAM content template to ver 1.02
  559. * 2) add compile option for querying NIC capability (default: off)
  560. * 3) modify AIS 5GHz support to run-time option, which could be turned on by registry or NVRAM setting
  561. * 4) correct auto-rate compiler error under linux (treat warning as error)
  562. * 5) simplify usage of NVRAM and REG_INFO_T
  563. * 6) add version checking between driver and firmware
  564. *
  565. * 10 22 2010 cp.wu
  566. * [WCXRP00000122] [MT6620 Wi-Fi][Driver] Preparation for YuSu source tree integration
  567. * dos2unix conversion.
  568. *
  569. * 10 20 2010 cp.wu
  570. * [WCXRP00000117] [MT6620 Wi-Fi][Driver] Add logic for suspending driver when MT6620 is not responding anymore
  571. * use OID_CUSTOM_TEST_MODE as indication for driver reset
  572. * by dropping pending TX packets
  573. *
  574. * 10 18 2010 cp.wu
  575. * [WCXRP00000056] [MT6620 Wi-Fi][Driver] NVRAM implementation with Version
  576. * Check[WCXRP00000086] [MT6620 Wi-Fi][Driver] The mac address is all zero at android complete
  577. * implementation of Android NVRAM access
  578. *
  579. * 10 06 2010 yuche.tsai
  580. * NULL
  581. * Update SLT 5G Test Channel Set.
  582. *
  583. * 10 06 2010 cp.wu
  584. * [WCXRP00000052] [MT6620 Wi-Fi][Driver] Eliminate Linux Compile Warning
  585. * code reorganization to improve isolation between GLUE and CORE layers.
  586. *
  587. * 10 06 2010 yuche.tsai
  588. * NULL
  589. * Update For SLT 5G Test Channel Selection Rule.
  590. *
  591. * 10 05 2010 cp.wu
  592. * [WCXRP00000075] [MT6620 Wi-Fi][Driver] Fill query buffer for OID_802_11_BSSID_LIST in 4-bytes aligned form
  593. * Query buffer size needs to be enlarged due to result is filled in 4-bytes alignment boundary
  594. *
  595. * 10 05 2010 cp.wu
  596. * [WCXRP00000056] [MT6620 Wi-Fi][Driver] NVRAM implementation with Version Check
  597. * 1) add NVRAM access API
  598. * 2) fake scanning result when NVRAM doesn't exist and/or version mismatch. (off by compiler option)
  599. * 3) add OID implementation for NVRAM read/write service
  600. *
  601. * 10 04 2010 cp.wu
  602. * [WCXRP00000077] [MT6620 Wi-Fi][Driver][FW] Eliminate use of ENUM_NETWORK_TYPE_T and
  603. * replaced by ENUM_NETWORK_TYPE_INDEX_T only remove ENUM_NETWORK_TYPE_T definitions
  604. *
  605. * 10 04 2010 cp.wu
  606. * [WCXRP00000075] [MT6620 Wi-Fi][Driver] Fill query buffer for OID_802_11_BSSID_LIST in 4-bytes aligned form
  607. * Extend result length to multiples of 4-bytes
  608. *
  609. * 09 24 2010 cp.wu
  610. * [WCXRP00000052] [MT6620 Wi-Fi][Driver] Eliminate Linux Compile Warning
  611. * eliminate unused variables which lead gcc to argue
  612. *
  613. * 09 24 2010 cp.wu
  614. * [WCXRP00000057] [MT6620 Wi-Fi][Driver] Modify online scan to a run-time switchable feature
  615. * Modify online scan as a run-time adjustable option (for Windows, in registry)
  616. *
  617. * 09 23 2010 cp.wu
  618. * [WCXRP00000051] [MT6620 Wi-Fi][Driver] WHQL test fail in MAC address changed item
  619. * use firmware reported mac address right after wlanAdapterStart() as permanent address
  620. *
  621. * 09 23 2010 cp.wu
  622. * [WCXRP00000056] [MT6620 Wi-Fi][Driver] NVRAM implementation with Version Check
  623. * add skeleton for NVRAM integration
  624. *
  625. * 09 08 2010 cp.wu
  626. * NULL
  627. * use static memory pool for storing IEs of scanning result.
  628. *
  629. * 09 07 2010 yuche.tsai
  630. * NULL
  631. * Update SLT due to API change of SCAN module.
  632. *
  633. * 09 06 2010 cp.wu
  634. * NULL
  635. * Androi/Linux: return current operating channel information
  636. *
  637. * 09 06 2010 cp.wu
  638. * NULL
  639. * 1) initialize for correct parameter even for disassociation.
  640. * 2) AIS-FSM should have a limit on trials to build connection
  641. *
  642. * 09 03 2010 yuche.tsai
  643. * NULL
  644. * Refine SLT IO control handler.
  645. *
  646. * 09 03 2010 kevin.huang
  647. * NULL
  648. * Refine #include sequence and solve recursive/nested #include issue
  649. *
  650. * 09 01 2010 wh.su
  651. * NULL
  652. * adding the wapi support for integration test.
  653. *
  654. * 08 30 2010 chinglan.wang
  655. * NULL
  656. * Modify the rescan condition.
  657. *
  658. * 08 29 2010 yuche.tsai
  659. * NULL
  660. * Finish SLT TX/RX & Rate Changing Support.
  661. *
  662. * 08 27 2010 chinglan.wang
  663. * NULL
  664. * Update configuration for MT6620_E1_PRE_ALPHA_1832_0827_2010
  665. *
  666. * 08 25 2010 george.huang
  667. * NULL
  668. * update OID/ registry control path for PM related settings
  669. *
  670. * 08 24 2010 cp.wu
  671. * NULL
  672. * 1) initialize variable for enabling short premable/short time slot.
  673. * 2) add compile option for disabling online scan
  674. *
  675. * 08 16 2010 george.huang
  676. * NULL
  677. * .
  678. *
  679. * 08 16 2010 george.huang
  680. * NULL
  681. * update params defined in CMD_SET_NETWORK_ADDRESS_LIST
  682. *
  683. * 08 04 2010 cp.wu
  684. * NULL
  685. * fix for check build WHQL testing:
  686. * 1) do not assert query buffer if indicated buffer length is zero
  687. * 2) sdio.c has bugs which cause freeing same pointer twice
  688. *
  689. * 08 04 2010 cp.wu
  690. * NULL
  691. * revert changelist #15371, efuse read/write access will be done by RF test approach
  692. *
  693. * 08 04 2010 cp.wu
  694. * NULL
  695. * add OID definitions for EFUSE read/write access.
  696. *
  697. * 08 04 2010 george.huang
  698. * NULL
  699. * handle change PS mode OID/ CMD
  700. *
  701. * 08 04 2010 cp.wu
  702. * NULL
  703. * add an extra parameter to rftestQueryATInfo 'cause it's necessary to pass u4FuncData for query request.
  704. *
  705. * 08 04 2010 cp.wu
  706. * NULL
  707. * bypass u4FuncData for RF-Test query request as well.
  708. *
  709. * 08 04 2010 yarco.yang
  710. * NULL
  711. * Add TX_AMPDU and ADDBA_REJECT command
  712. *
  713. * 08 03 2010 cp.wu
  714. * NULL
  715. * surpress compilation warning.
  716. *
  717. * 08 02 2010 george.huang
  718. * NULL
  719. * add WMM-PS test related OID/ CMD handlers
  720. *
  721. * 07 29 2010 cp.wu
  722. * NULL
  723. * eliminate u4FreqInKHz usage, combined into rConnections.ucAdHoc*
  724. *
  725. * 07 28 2010 cp.wu
  726. * NULL
  727. * 1) eliminate redundant variable eOPMode in prAdapter->rWlanInfo
  728. * 2) change nicMediaStateChange() API prototype
  729. *
  730. * 07 26 2010 cp.wu
  731. *
  732. * re-commit code logic being overwriten.
  733. *
  734. * 07 24 2010 wh.su
  735. *
  736. * .support the Wi-Fi RSN
  737. *
  738. * 07 21 2010 cp.wu
  739. *
  740. * 1) change BG_SCAN to ONLINE_SCAN for consistent term
  741. * 2) only clear scanning result when scan is permitted to do
  742. *
  743. * 07 20 2010 cp.wu
  744. *
  745. * 1) [AIS] when new scan is issued, clear currently available scanning result except the connected one
  746. * 2) refine disconnection behaviour when issued during BG-SCAN process
  747. *
  748. * 07 19 2010 wh.su
  749. *
  750. * modify the auth and encry status variable.
  751. *
  752. * 07 16 2010 cp.wu
  753. *
  754. * remove work-around in case SCN is not available.
  755. *
  756. * 07 08 2010 cp.wu
  757. *
  758. * [WPD00003833] [MT6620 and MT5931] Driver migration - move to new repository.
  759. *
  760. * 07 05 2010 cp.wu
  761. * [WPD00003833][MT6620 and MT5931] Driver migration
  762. * 1) change fake BSS_DESC from channel 6 to channel 1 due to channel switching is not done yet.
  763. * 2) after MAC address is queried from firmware, all related variables in driver domain should be updated as well
  764. *
  765. * 07 01 2010 cp.wu
  766. * [WPD00003833][MT6620 and MT5931] Driver migration
  767. * AIS-FSM integration with CNM channel request messages
  768. *
  769. * 07 01 2010 cp.wu
  770. * [WPD00003833][MT6620 and MT5931] Driver migration
  771. * implementation of DRV-SCN and related mailbox message handling.
  772. *
  773. * 06 29 2010 cp.wu
  774. * [WPD00003833][MT6620 and MT5931] Driver migration
  775. * 1) sync to. CMD/EVENT document v0.03
  776. * 2) simplify DTIM period parsing in scan.c only, bss.c no longer parses it again.
  777. * 3) send command packet to indicate FW-PM after
  778. * a) 1st beacon is received after AIS has connected to an AP
  779. * b) IBSS-ALONE has been created
  780. * c) IBSS-MERGE has occurred
  781. *
  782. * 06 25 2010 cp.wu
  783. * [WPD00003833][MT6620 and MT5931] Driver migration
  784. * add API in que_mgt to retrieve sta-rec index for security frames.
  785. *
  786. * 06 24 2010 cp.wu
  787. * [WPD00003833][MT6620 and MT5931] Driver migration
  788. * 802.1x and bluetooth-over-Wi-Fi security frames are now delievered to firmware via command path instead of data path.
  789. *
  790. * 06 23 2010 cp.wu
  791. * [WPD00003833][MT6620 and MT5931] Driver migration
  792. * 1) add SCN compilation option.
  793. * 2) when SCN is not turned on, BSSID_SCAN will generate a fake entry for 1st connection
  794. *
  795. * 06 23 2010 cp.wu
  796. * [WPD00003833][MT6620 and MT5931] Driver migration
  797. * implement SCAN-REQUEST oid as mailbox message dispatching.
  798. *
  799. * 06 23 2010 cp.wu
  800. * [WPD00003833][MT6620 and MT5931] Driver migration
  801. * integrate .
  802. *
  803. * 06 22 2010 cp.wu
  804. * [WPD00003833][MT6620 and MT5931] Driver migration
  805. * 1) add command warpper for STA-REC/BSS-INFO sync.
  806. * 2) enhance command packet sending procedure for non-oid part
  807. * 3) add command packet definitions for STA-REC/BSS-INFO sync.
  808. *
  809. * 06 21 2010 wh.su
  810. * [WPD00003840][MT6620 5931] Security migration
  811. * remove duplicate variable for migration.
  812. *
  813. * 06 21 2010 wh.su
  814. * [WPD00003840][MT6620 5931] Security migration
  815. * adding the compiling flag for oid pmkid.
  816. *
  817. * 06 21 2010 cp.wu
  818. * [WPD00003833][MT6620 and MT5931] Driver migration
  819. * enable RX management frame handling.
  820. *
  821. * 06 18 2010 wh.su
  822. * [WPD00003840][MT6620 5931] Security migration
  823. * migration the security related function from firmware.
  824. *
  825. * 06 11 2010 cp.wu
  826. * [WPD00003833][MT6620 and MT5931] Driver migration
  827. * 1) migrate assoc.c.
  828. * 2) add ucTxSeqNum for tracking frames which needs TX-DONE awareness
  829. * 3) add configuration options for CNM_MEM and RSN modules
  830. * 4) add data path for management frames
  831. * 5) eliminate rPacketInfo of MSDU_INFO_T
  832. *
  833. * 06 10 2010 cp.wu
  834. * [WPD00003833][MT6620 and MT5931] Driver migration
  835. * 1) eliminate CFG_CMD_EVENT_VERSION_0_9
  836. * 2) when disconnected, indicate nic directly (no event is needed)
  837. *
  838. * 06 07 2010 cp.wu
  839. * [WPD00003833][MT6620 and MT5931] Driver migration
  840. * merge wlan_def.h.
  841. *
  842. * 06 07 2010 cp.wu
  843. * [WPD00003833][MT6620 and MT5931] Driver migration
  844. * merge wifi_var.h, precomp.h, cnm_timer.h (data type only)
  845. *
  846. * 06 06 2010 kevin.huang
  847. * [WPD00003832][MT6620 5931] Create driver base
  848. * [MT6620 5931] Create driver base
  849. *
  850. * 06 03 2010 cp.wu
  851. * [WPD00001943]Create WiFi test driver framework on WinXP
  852. * move timer callback to glue layer.
  853. *
  854. * 05 28 2010 cp.wu
  855. * [WPD00001943]Create WiFi test driver framework on WinXP
  856. * simplify cmd packet sending for RF test and MCR access OIDs
  857. *
  858. * 05 27 2010 cp.wu
  859. * [WPD00001943]Create WiFi test driver framework on WinXP
  860. * disable radio even when STA is not associated.
  861. *
  862. * 05 27 2010 cp.wu
  863. * [WPD00001943]Create WiFi test driver framework on WinXP
  864. * correct 2 OID behaviour to meet WHQL requirement.
  865. *
  866. * 05 26 2010 jeffrey.chang
  867. * [WPD00003826]Initial import for Linux port
  868. * 1) Modify set mac address code
  869. * 2) remove power management macro
  870. *
  871. * 05 25 2010 cp.wu
  872. * [WPD00001943]Create WiFi test driver framework on WinXP
  873. * correct BSSID_LIST oid when radio if turned off.
  874. *
  875. * 05 24 2010 cp.wu
  876. * [WPD00001943]Create WiFi test driver framework on WinXP
  877. * 1) when acquiring LP-own, write for clr-own with lower frequency compared to read poll
  878. * 2) correct address list parsing
  879. *
  880. * 05 24 2010 cp.wu
  881. * [WPD00001943]Create WiFi test driver framework on WinXP
  882. * disable wlanoidSetNetworkAddress() temporally.
  883. *
  884. * 05 22 2010 cp.wu
  885. * [WPD00001943]Create WiFi test driver framework on WinXP
  886. * some OIDs should be DRIVER_CORE instead of GLUE_EXTENSION
  887. *
  888. * 05 22 2010 cp.wu
  889. * [WPD00001943]Create WiFi test driver framework on WinXP
  890. * 1) disable NETWORK_LAYER_ADDRESSES handling temporally.
  891. * 2) finish statistics OIDs
  892. *
  893. * 05 22 2010 cp.wu
  894. * [WPD00001943]Create WiFi test driver framework on WinXP
  895. * change OID behavior to meet WHQL requirement.
  896. *
  897. * 05 20 2010 cp.wu
  898. * [WPD00001943]Create WiFi test driver framework on WinXP
  899. * 1) integrate OID_GEN_NETWORK_LAYER_ADDRESSES with CMD_ID_SET_IP_ADDRESS
  900. * 2) buffer statistics data for 2 seconds
  901. * 3) use default value for adhoc parameters instead of 0
  902. *
  903. * 05 19 2010 cp.wu
  904. * [WPD00001943]Create WiFi test driver framework on WinXP
  905. * 1) do not take timeout mechanism for power mode oids
  906. * 2) retrieve network type from connection status
  907. * 3) after disassciation, set radio state to off
  908. * 4) TCP option over IPv6 is supported
  909. *
  910. * 05 18 2010 cp.wu
  911. * [WPD00001943]Create WiFi test driver framework on WinXP
  912. * implement Wakeup-on-LAN except firmware integration part
  913. *
  914. * 05 17 2010 cp.wu
  915. * [WPD00001943]Create WiFi test driver framework on WinXP
  916. * correct wlanoidSet802dot11PowerSaveProfile implementation.
  917. *
  918. * 05 17 2010 cp.wu
  919. * [WPD00001943]Create WiFi test driver framework on WinXP
  920. * 1) enable CMD/EVENT ver 0.9 definition.
  921. * 2) abandon use of ENUM_MEDIA_STATE
  922. *
  923. * 05 17 2010 cp.wu
  924. * [WPD00001943]Create WiFi test driver framework on WinXP
  925. * correct OID_802_11_DISASSOCIATE handling.
  926. *
  927. * 05 17 2010 cp.wu
  928. * [WPD00003831][MT6620 Wi-Fi] Add framework for Wi-Fi Direct support
  929. * 1) add timeout handler mechanism for pending command packets
  930. * 2) add p2p add/removal key
  931. *
  932. * 05 14 2010 jeffrey.chang
  933. * [WPD00003826]Initial import for Linux port
  934. * Add dissassocation support for wpa supplicant
  935. *
  936. * 05 14 2010 cp.wu
  937. * [WPD00001943]Create WiFi test driver framework on WinXP
  938. * correct return value.
  939. *
  940. * 05 13 2010 cp.wu
  941. * [WPD00001943]Create WiFi test driver framework on WinXP
  942. * add NULL OID implementation for WOL-related OIDs.
  943. *
  944. * 05 06 2010 cp.wu
  945. * [WPD00001943]Create WiFi test driver framework on WinXP
  946. * for disassociation, still use parameter with current setting.
  947. *
  948. * 05 06 2010 cp.wu
  949. * [WPD00001943]Create WiFi test driver framework on WinXP
  950. * for disassociation, generate a WZC-compatible invalid SSID.
  951. *
  952. * 05 06 2010 cp.wu
  953. * [WPD00001943]Create WiFi test driver framework on WinXP
  954. * associate to illegal SSID when handling OID_802_11_DISASSOCIATE
  955. *
  956. * 04 27 2010 cp.wu
  957. * [WPD00001943]Create WiFi test driver framework on WinXP
  958. * reserve field of privacy filter and RTS threshold setting.
  959. *
  960. * 04 23 2010 cp.wu
  961. * [WPD00001943]Create WiFi test driver framework on WinXP
  962. * surpress compiler warning
  963. *
  964. * 04 23 2010 cp.wu
  965. * [WPD00001943]Create WiFi test driver framework on WinXP
  966. * .
  967. *
  968. * 04 22 2010 cp.wu
  969. * [WPD00003830]add OID_802_11_PRIVACY_FILTER support
  970. * enable RX filter OID
  971. *
  972. * 04 19 2010 jeffrey.chang
  973. * [WPD00003826]Initial import for Linux port
  974. * Add ioctl of power management
  975. *
  976. * 04 14 2010 cp.wu
  977. * [WPD00001943]Create WiFi test driver framework on WinXP
  978. * information buffer for query oid/ioctl is now buffered in prCmdInfo
  979. * * instead of glue-layer variable to improve multiple oid/ioctl capability
  980. *
  981. * 04 13 2010 cp.wu
  982. * [WPD00003823][MT6620 Wi-Fi] Add Bluetooth-over-Wi-Fi support
  983. * add framework for BT-over-Wi-Fi support.
  984. * * * * 1) prPendingCmdInfo is replaced by queue for multiple handler capability
  985. * * * * 2) command sequence number is now increased atomically
  986. * * * * 3) private data could be hold and taken use for other purpose
  987. *
  988. * 04 12 2010 cp.wu
  989. * [WPD00001943]Create WiFi test driver framework on WinXP
  990. * correct OID_802_11_CONFIGURATION query for infrastructure mode.
  991. *
  992. * 04 09 2010 jeffrey.chang
  993. * [WPD00003826]Initial import for Linux port
  994. * 1) remove unused spin lock declaration
  995. *
  996. * 04 07 2010 cp.wu
  997. * [WPD00001943]Create WiFi test driver framework on WinXP
  998. * finish non-glue layer access to glue variables
  999. *
  1000. * 04 07 2010 cp.wu
  1001. * [WPD00001943]Create WiFi test driver framework on WinXP
  1002. * rWlanInfo should be placed at adapter rather than glue due to most operations
  1003. * * are done in adapter layer.
  1004. *
  1005. * 04 07 2010 jeffrey.chang
  1006. * [WPD00003826]Initial import for Linux port
  1007. * (1)improve none-glue code portability
  1008. * (2) disable set Multicast address during atomic context
  1009. *
  1010. * 04 07 2010 cp.wu
  1011. * [WPD00001943]Create WiFi test driver framework on WinXP
  1012. * eliminate direct access to prGlueInfo->eParamMediaStateIndicated from non-glue layer
  1013. *
  1014. * 04 06 2010 cp.wu
  1015. * [WPD00001943]Create WiFi test driver framework on WinXP
  1016. * ePowerCtrl is not necessary as a glue variable.
  1017. *
  1018. * 04 06 2010 cp.wu
  1019. * [WPD00001943]Create WiFi test driver framework on WinXP
  1020. * eliminate direct access to prGlueInfo->rWlanInfo.eLinkAttr.ucMediaStreamMode from non-glue layer.
  1021. *
  1022. * 04 06 2010 jeffrey.chang
  1023. * [WPD00003826]Initial import for Linux port
  1024. * improve none-glue code portability
  1025. *
  1026. * 04 06 2010 cp.wu
  1027. * [WPD00001943]Create WiFi test driver framework on WinXP
  1028. * code refine: fgTestMode should be at adapter rather than glue due to the device/fw is also involved
  1029. *
  1030. * 04 01 2010 cp.wu
  1031. * [WPD00001943]Create WiFi test driver framework on WinXP
  1032. * .
  1033. *
  1034. * 03 31 2010 wh.su
  1035. * [WPD00003816][MT6620 Wi-Fi] Adding the security support
  1036. * modify the wapi related code for new driver's design.
  1037. *
  1038. * 03 30 2010 cp.wu
  1039. * [WPD00001943]Create WiFi test driver framework on WinXP
  1040. * statistics information OIDs are now handled by querying from firmware domain
  1041. *
  1042. * 03 28 2010 jeffrey.chang
  1043. * [WPD00003826]Initial import for Linux port
  1044. * improve glue code portability
  1045. *
  1046. * 03 26 2010 cp.wu
  1047. * [WPD00001943]Create WiFi test driver framework on WinXP
  1048. * indicate media stream mode after set is done
  1049. *
  1050. * 03 26 2010 cp.wu
  1051. * [WPD00001943]Create WiFi test driver framework on WinXP
  1052. * add a temporary flag for integration with CMD/EVENT v0.9.
  1053. *
  1054. * 03 25 2010 cp.wu
  1055. * [WPD00001943]Create WiFi test driver framework on WinXP
  1056. * 1) correct OID_802_11_CONFIGURATION with frequency setting behavior.
  1057. * the frequency is used for adhoc connection only
  1058. * 2) update with SD1 v0.9 CMD/EVENT documentation
  1059. *
  1060. * 03 24 2010 jeffrey.chang
  1061. * [WPD00003826]Initial import for Linux port
  1062. * [WPD00003826] Initial import for Linux port
  1063. * initial import for Linux port
  1064. *
  1065. * 03 24 2010 jeffrey.chang
  1066. * [WPD00003826]Initial import for Linux port
  1067. * initial import for Linux port
  1068. *
  1069. * 03 24 2010 cp.wu
  1070. * [WPD00001943]Create WiFi test driver framework on WinXP
  1071. * generate information for OID_GEN_RCV_OK & OID_GEN_XMIT_OK
  1072. *
  1073. *
  1074. * 03 22 2010 cp.wu
  1075. * [WPD00003824][MT6620 Wi-Fi][New Feature] Add support of large scan list
  1076. * Implement feature needed by CR: WPD00003824: refining association command by pasting scanning result
  1077. *
  1078. * 03 19 2010 wh.su
  1079. * [WPD00003820][MT6620 Wi-Fi] Modify the code for meet the WHQL test
  1080. * adding the check for pass WHQL test item.
  1081. *
  1082. * 03 19 2010 cp.wu
  1083. * [WPD00001943]Create WiFi test driver framework on WinXP
  1084. * 1) add ACPI D0/D3 state switching support
  1085. * * 2) use more formal way to handle interrupt when the status is retrieved from enhanced RX response
  1086. *
  1087. * 03 16 2010 wh.su
  1088. * [WPD00003820][MT6620 Wi-Fi] Modify the code for meet the WHQL test
  1089. * fixed some whql pre-test fail case.
  1090. *
  1091. * 03 03 2010 cp.wu
  1092. * [WPD00001943]Create WiFi test driver framework on WinXP
  1093. * implement custom OID: EEPROM read/write access
  1094. *
  1095. * 03 03 2010 cp.wu
  1096. * [WPD00001943]Create WiFi test driver framework on WinXP
  1097. * implement OID_802_3_MULTICAST_LIST oid handling
  1098. *
  1099. * 03 02 2010 cp.wu
  1100. * [WPD00001943]Create WiFi test driver framework on WinXP
  1101. * 1) the use of prPendingOid revised, all accessing are now protected by spin lock
  1102. * * 2) ensure wlanReleasePendingOid will clear all command queues
  1103. *
  1104. * 02 25 2010 cp.wu
  1105. * [WPD00001943]Create WiFi test driver framework on WinXP
  1106. * send CMD_ID_INFRASTRUCTURE when handling OID_802_11_INFRASTRUCTURE_MODE set.
  1107. *
  1108. * 02 24 2010 wh.su
  1109. * [WPD00003820][MT6620 Wi-Fi] Modify the code for meet the WHQL test
  1110. * Don't needed to check the auth mode, WHQL testing not specific at auth wpa2.
  1111. *
  1112. * 02 23 2010 cp.wu
  1113. * [WPD00001943]Create WiFi test driver framework on WinXP
  1114. * do not check SSID validity anymore.
  1115. *
  1116. * 02 23 2010 cp.wu
  1117. * [WPD00001943]Create WiFi test driver framework on WinXP
  1118. * add checksum offloading support.
  1119. *
  1120. * 02 09 2010 cp.wu
  1121. * [WPD00001943]Create WiFi test driver framework on WinXP
  1122. * 1. Permanent and current MAC address are now retrieved by CMD/EVENT packets instead of hard-coded address
  1123. * * 2. follow MSDN defined behavior when associates to another AP
  1124. * * 3. for firmware download, packet size could be up to 2048 bytes
  1125. *
  1126. * 02 09 2010 cp.wu
  1127. * [WPD00001943]Create WiFi test driver framework on WinXP
  1128. * move ucCmdSeqNum as instance variable
  1129. *
  1130. * 02 04 2010 cp.wu
  1131. * [WPD00001943]Create WiFi test driver framework on WinXP
  1132. * when OID_CUSTOM_OID_INTERFACE_VERSION is queried, do modify connection states
  1133. *
  1134. * 01 27 2010 cp.wu
  1135. * [WPD00001943]Create WiFi test driver framework on WinXP
  1136. * 1) implement timeout mechanism when OID is pending for longer than 1 second
  1137. * * 2) allow OID_802_11_CONFIGURATION to be executed when RF test mode is turned on
  1138. *
  1139. * 01 27 2010 wh.su
  1140. * [WPD00003816][MT6620 Wi-Fi] Adding the security support
  1141. * .
  1142. *
  1143. * 01 27 2010 cp.wu
  1144. * [WPD00001943]Create WiFi test driver framework on WinXP
  1145. * 1. eliminate improper variable in rHifInfo
  1146. * * 2. block TX/ordinary OID when RF test mode is engaged
  1147. * * 3. wait until firmware finish operation when entering into and leaving from RF test mode
  1148. * * 4. correct some HAL implementation
  1149. *
  1150. * 01 22 2010 cp.wu
  1151. * [WPD00001943]Create WiFi test driver framework on WinXP
  1152. * implement following 802.11 OIDs:
  1153. * OID_802_11_RSSI,
  1154. * OID_802_11_RSSI_TRIGGER,
  1155. * OID_802_11_STATISTICS,
  1156. * OID_802_11_DISASSOCIATE,
  1157. * OID_802_11_POWER_MODE
  1158. *
  1159. * 01 21 2010 cp.wu
  1160. * [WPD00001943]Create WiFi test driver framework on WinXP
  1161. * implement OID_802_11_MEDIA_STREAM_MODE
  1162. *
  1163. * 01 21 2010 cp.wu
  1164. * [WPD00001943]Create WiFi test driver framework on WinXP
  1165. * implement OID_802_11_SUPPORTED_RATES / OID_802_11_DESIRED_RATES
  1166. *
  1167. * 01 21 2010 cp.wu
  1168. * [WPD00001943]Create WiFi test driver framework on WinXP
  1169. * do not fill ucJoinOnly currently
  1170. *
  1171. * 01 14 2010 cp.wu
  1172. * [WPD00001943]Create WiFi test driver framework on WinXP
  1173. * enable to connect to ad-hoc network
  1174. *
  1175. * 01 07 2010 cp.wu
  1176. * [WPD00001943]Create WiFi test driver framework on WinXP
  1177. * .implement Set/Query BeaconInterval/AtimWindow
  1178. *
  1179. * 01 07 2010 cp.wu
  1180. * [WPD00001943]Create WiFi test driver framework on WinXP
  1181. * .Set/Get AT Info is not blocked even when driver is not in fg test mode
  1182. *
  1183. * 12 30 2009 cp.wu
  1184. * [WPD00001943]Create WiFi test driver framework on WinXP
  1185. * 1) According to CMD/EVENT documentation v0.8,
  1186. * OID_CUSTOM_TEST_RX_STATUS & OID_CUSTOM_TEST_TX_STATUS is no longer used,
  1187. * and result is retrieved by get ATInfo instead
  1188. * 2) add 4 counter for recording aggregation statistics
  1189. *
  1190. * 12 28 2009 cp.wu
  1191. * [WPD00001943]Create WiFi test driver framework on WinXP
  1192. * eliminate redundant variables for connection_state
  1193. ** \main\maintrunk.MT6620WiFiDriver_Prj\32 2009-12-16 22:13:36 GMT mtk02752
  1194. ** change hard-coded MAC address to match with FW (temporally)
  1195. ** \main\maintrunk.MT6620WiFiDriver_Prj\31 2009-12-10 16:49:50 GMT mtk02752
  1196. ** code clean
  1197. ** \main\maintrunk.MT6620WiFiDriver_Prj\30 2009-12-08 17:38:49 GMT mtk02752
  1198. ** + add OID for RF test
  1199. ** * MCR RD/WR are modified to match with cmd/event definition
  1200. ** \main\maintrunk.MT6620WiFiDriver_Prj\29 2009-12-08 11:32:20 GMT mtk02752
  1201. ** add skeleton for RF test implementation
  1202. ** \main\maintrunk.MT6620WiFiDriver_Prj\28 2009-12-03 16:43:24 GMT mtk01461
  1203. ** Modify query SCAN list oid by adding prEventScanResult
  1204. **
  1205. ** \main\maintrunk.MT6620WiFiDriver_Prj\27 2009-12-03 16:39:27 GMT mtk01461
  1206. ** Sync CMD data structure in set ssid oid
  1207. ** \main\maintrunk.MT6620WiFiDriver_Prj\26 2009-12-03 16:28:22 GMT mtk01461
  1208. ** Add invalid check of set SSID oid and fix query scan list oid
  1209. ** \main\maintrunk.MT6620WiFiDriver_Prj\25 2009-11-30 17:33:08 GMT mtk02752
  1210. ** implement wlanoidSetInfrastructureMode/wlanoidQueryInfrastructureMode
  1211. ** \main\maintrunk.MT6620WiFiDriver_Prj\24 2009-11-30 10:53:49 GMT mtk02752
  1212. ** 1st DW of WIFI_CMD_T is shared with HIF_TX_HEADER_T
  1213. ** \main\maintrunk.MT6620WiFiDriver_Prj\23 2009-11-30 09:22:48 GMT mtk02752
  1214. ** correct wifi cmd length mismatch
  1215. ** \main\maintrunk.MT6620WiFiDriver_Prj\22 2009-11-25 21:34:33 GMT mtk02752
  1216. ** sync EVENT_SCAN_RESULT_T with firmware
  1217. ** \main\maintrunk.MT6620WiFiDriver_Prj\21 2009-11-25 21:03:27 GMT mtk02752
  1218. ** implement wlanoidQueryBssidList()
  1219. ** \main\maintrunk.MT6620WiFiDriver_Prj\20 2009-11-25 18:17:17 GMT mtk02752
  1220. ** refine GL_WLAN_INFO_T for buffering scan result
  1221. ** \main\maintrunk.MT6620WiFiDriver_Prj\19 2009-11-23 20:28:51 GMT mtk02752
  1222. ** some OID will be set to WLAN_STATUS_PENDING until it is sent via wlanSendCommand()
  1223. ** \main\maintrunk.MT6620WiFiDriver_Prj\18 2009-11-23 17:56:36 GMT mtk02752
  1224. ** implement wlanoidSetBssidListScan(), wlanoidSetBssid() and wlanoidSetSsid()
  1225. **
  1226. ** \main\maintrunk.MT6620WiFiDriver_Prj\17 2009-11-13 17:20:53 GMT mtk02752
  1227. ** add Set BSSID/SSID path but disabled temporally due to FW is not ready yet
  1228. ** \main\maintrunk.MT6620WiFiDriver_Prj\16 2009-11-13 12:28:58 GMT mtk02752
  1229. ** add wlanoidSetBssidListScan -> cmd_info path
  1230. ** \main\maintrunk.MT6620WiFiDriver_Prj\15 2009-11-09 22:48:07 GMT mtk01084
  1231. ** modify test cases entry
  1232. ** \main\maintrunk.MT6620WiFiDriver_Prj\14 2009-11-04 14:10:58 GMT mtk01084
  1233. ** add new test interfaces
  1234. ** \main\maintrunk.MT6620WiFiDriver_Prj\13 2009-10-30 18:17:10 GMT mtk01084
  1235. ** fix compiler warning
  1236. ** \main\maintrunk.MT6620WiFiDriver_Prj\12 2009-10-29 19:46:26 GMT mtk01084
  1237. ** add test functions
  1238. ** \main\maintrunk.MT6620WiFiDriver_Prj\11 2009-10-23 16:07:56 GMT mtk01084
  1239. ** include new file
  1240. ** \main\maintrunk.MT6620WiFiDriver_Prj\10 2009-10-13 21:58:29 GMT mtk01084
  1241. ** modify for new HW architecture
  1242. ** \main\maintrunk.MT6620WiFiDriver_Prj\9 2009-10-02 13:48:49 GMT mtk01725
  1243. ** \main\maintrunk.MT6620WiFiDriver_Prj\8 2009-09-09 17:26:04 GMT mtk01084
  1244. ** \main\maintrunk.MT6620WiFiDriver_Prj\7 2009-04-21 12:09:50 GMT mtk01461
  1245. ** Update for MCR Write OID
  1246. ** \main\maintrunk.MT6620WiFiDriver_Prj\6 2009-04-21 09:35:18 GMT mtk01461
  1247. ** Update wlanoidQueryMcrRead() for composing CMD_INFO_T
  1248. ** \main\maintrunk.MT6620WiFiDriver_Prj\5 2009-04-17 18:09:51 GMT mtk01426
  1249. ** Remove kalIndicateStatusAndComplete() in wlanoidQueryOidInterfaceVersion()
  1250. ** \main\maintrunk.MT6620WiFiDriver_Prj\4 2009-04-14 15:51:50 GMT mtk01426
  1251. ** Add MCR read/write support
  1252. ** \main\maintrunk.MT6620WiFiDriver_Prj\3 2009-03-19 18:32:40 GMT mtk01084
  1253. ** update for basic power management functions
  1254. ** \main\maintrunk.MT6620WiFiDriver_Prj\2 2009-03-10 20:06:31 GMT mtk01426
  1255. ** Init for develop
  1256. **
  1257. */
  1258. /******************************************************************************
  1259. * C O M P I L E R F L A G S
  1260. *******************************************************************************
  1261. */
  1262. /******************************************************************************
  1263. * E X T E R N A L R E F E R E N C E S
  1264. *******************************************************************************
  1265. */
  1266. #include "precomp.h"
  1267. #include "mgmt/rsn.h"
  1268. #include "gl_wext.h"
  1269. #include "debug.h"
  1270. #include <stddef.h>
  1271. /******************************************************************************
  1272. * C O N S T A N T S
  1273. *******************************************************************************
  1274. */
  1275. /******************************************************************************
  1276. * D A T A T Y P E S
  1277. *******************************************************************************
  1278. */
  1279. /******************************************************************************
  1280. * P U B L I C D A T A
  1281. *******************************************************************************
  1282. */
  1283. #if DBG
  1284. UINT_32 u4DebugModuleTemp;
  1285. #endif /* DBG */
  1286. /******************************************************************************
  1287. * P R I V A T E D A T A
  1288. *******************************************************************************
  1289. */
  1290. /******************************************************************************
  1291. * M A C R O S
  1292. *******************************************************************************
  1293. */
  1294. /******************************************************************************
  1295. * F U N C T I O N D E C L A R A T I O N S
  1296. *******************************************************************************
  1297. */
  1298. #if DBG && 0
  1299. static VOID SetRCID(BOOLEAN fgOneTb3, BOOL *fgRCID);
  1300. #endif
  1301. #if CFG_SLT_SUPPORT
  1302. static VOID SetTestChannel(UINT_8 *pucPrimaryChannel);
  1303. #endif
  1304. /******************************************************************************
  1305. * F U N C T I O N S
  1306. *******************************************************************************
  1307. */
  1308. #if CFG_ENABLE_STATISTICS_BUFFERING
  1309. static BOOLEAN IsBufferedStatisticsUsable(P_ADAPTER_T prAdapter)
  1310. {
  1311. ASSERT(prAdapter);
  1312. if (prAdapter->fgIsStatValid == TRUE &&
  1313. (kalGetTimeTick() - prAdapter->rStatUpdateTime) <= CFG_STATISTICS_VALID_CYCLE)
  1314. return TRUE;
  1315. else
  1316. return FALSE;
  1317. }
  1318. #endif
  1319. #if DBG && 0
  1320. static VOID SetRCID(BOOLEAN fgOneTb3, BOOL *fgRCID)
  1321. {
  1322. if (fgOneTb3)
  1323. *fgRCID = 0;
  1324. else
  1325. *fgRCID = 1;
  1326. }
  1327. #endif
  1328. #if CFG_SLT_SUPPORT
  1329. static VOID SetTestChannel(UINT_8 *pucPrimaryChannel)
  1330. {
  1331. if (*pucPrimaryChannel < 5)
  1332. *pucPrimaryChannel = 8;
  1333. else if (*pucPrimaryChannel > 10)
  1334. *pucPrimaryChannel = 3;
  1335. }
  1336. #endif
  1337. /*----------------------------------------------------------------------------*/
  1338. /*!
  1339. * \brief This routine is called to query the supported physical layer network
  1340. * type that can be used by the driver.
  1341. *
  1342. * \param[in] prAdapter Pointer to the Adapter structure.
  1343. * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
  1344. * the query.
  1345. * \param[in] u4QueryBufferLen The length of the query buffer.
  1346. * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
  1347. * bytes written into the query buffer. If the call
  1348. * failed due to invalid length of the query buffer,
  1349. * returns the amount of storage needed.
  1350. *
  1351. * \retval WLAN_STATUS_SUCCESS
  1352. * \retval WLAN_STATUS_INVALID_LENGTH
  1353. */
  1354. /*----------------------------------------------------------------------------*/
  1355. WLAN_STATUS
  1356. wlanoidQueryNetworkTypesSupported(IN P_ADAPTER_T prAdapter,
  1357. OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  1358. {
  1359. UINT_32 u4NumItem = 0;
  1360. ENUM_PARAM_NETWORK_TYPE_T eSupportedNetworks[PARAM_NETWORK_TYPE_NUM];
  1361. PPARAM_NETWORK_TYPE_LIST prSupported;
  1362. /* The array of all physical layer network subtypes that the driver supports. */
  1363. DEBUGFUNC("wlanoidQueryNetworkTypesSupported");
  1364. ASSERT(prAdapter);
  1365. ASSERT(pu4QueryInfoLen);
  1366. if (u4QueryBufferLen)
  1367. ASSERT(pvQueryBuffer);
  1368. /* Init. */
  1369. for (u4NumItem = 0; u4NumItem < PARAM_NETWORK_TYPE_NUM; u4NumItem++)
  1370. eSupportedNetworks[u4NumItem] = 0;
  1371. u4NumItem = 0;
  1372. eSupportedNetworks[u4NumItem] = PARAM_NETWORK_TYPE_DS;
  1373. u4NumItem++;
  1374. eSupportedNetworks[u4NumItem] = PARAM_NETWORK_TYPE_OFDM24;
  1375. u4NumItem++;
  1376. *pu4QueryInfoLen =
  1377. (UINT_32) OFFSET_OF(PARAM_NETWORK_TYPE_LIST, eNetworkType) +
  1378. (u4NumItem * sizeof(ENUM_PARAM_NETWORK_TYPE_T));
  1379. if (u4QueryBufferLen < *pu4QueryInfoLen)
  1380. return WLAN_STATUS_INVALID_LENGTH;
  1381. prSupported = (PPARAM_NETWORK_TYPE_LIST) pvQueryBuffer;
  1382. prSupported->NumberOfItems = u4NumItem;
  1383. kalMemCopy(prSupported->eNetworkType, eSupportedNetworks, u4NumItem * sizeof(ENUM_PARAM_NETWORK_TYPE_T));
  1384. DBGLOG(OID, TRACE, "NDIS supported network type list: %u\n", prSupported->NumberOfItems);
  1385. DBGLOG_MEM8(OID, TRACE, prSupported, *pu4QueryInfoLen);
  1386. return WLAN_STATUS_SUCCESS;
  1387. } /* wlanoidQueryNetworkTypesSupported */
  1388. /*----------------------------------------------------------------------------*/
  1389. /*!
  1390. * \brief This routine is called to query the current physical layer network
  1391. * type used by the driver.
  1392. *
  1393. * \param[in] prAdapter Pointer to the Adapter structure.
  1394. * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
  1395. * the query.
  1396. * \param[in] u4QueryBufferLen The length of the query buffer.
  1397. * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
  1398. * bytes written into the query buffer. If the
  1399. * call failed due to invalid length of the query
  1400. * buffer, returns the amount of storage needed.
  1401. *
  1402. * \retval WLAN_STATUS_SUCCESS
  1403. * \retval WLAN_STATUS_BUFFER_TOO_SHORT
  1404. */
  1405. /*----------------------------------------------------------------------------*/
  1406. WLAN_STATUS
  1407. wlanoidQueryNetworkTypeInUse(IN P_ADAPTER_T prAdapter,
  1408. OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  1409. {
  1410. /* TODO: need to check the OID handler content again!! */
  1411. ENUM_PARAM_NETWORK_TYPE_T rCurrentNetworkTypeInUse = PARAM_NETWORK_TYPE_OFDM24;
  1412. DEBUGFUNC("wlanoidQueryNetworkTypeInUse");
  1413. ASSERT(prAdapter);
  1414. ASSERT(pu4QueryInfoLen);
  1415. if (u4QueryBufferLen)
  1416. ASSERT(pvQueryBuffer);
  1417. if (u4QueryBufferLen < sizeof(ENUM_PARAM_NETWORK_TYPE_T)) {
  1418. *pu4QueryInfoLen = sizeof(ENUM_PARAM_NETWORK_TYPE_T);
  1419. return WLAN_STATUS_BUFFER_TOO_SHORT;
  1420. }
  1421. if (kalGetMediaStateIndicated(prAdapter->prGlueInfo) == PARAM_MEDIA_STATE_CONNECTED)
  1422. rCurrentNetworkTypeInUse = (ENUM_PARAM_NETWORK_TYPE_T) (prAdapter->rWlanInfo.ucNetworkType);
  1423. else
  1424. rCurrentNetworkTypeInUse = (ENUM_PARAM_NETWORK_TYPE_T) (prAdapter->rWlanInfo.ucNetworkTypeInUse);
  1425. *(P_ENUM_PARAM_NETWORK_TYPE_T) pvQueryBuffer = rCurrentNetworkTypeInUse;
  1426. *pu4QueryInfoLen = sizeof(ENUM_PARAM_NETWORK_TYPE_T);
  1427. DBGLOG(OID, TRACE, "Network type in use: %d\n", rCurrentNetworkTypeInUse);
  1428. return WLAN_STATUS_SUCCESS;
  1429. } /* wlanoidQueryNetworkTypeInUse */
  1430. /*----------------------------------------------------------------------------*/
  1431. /*!
  1432. * \brief This routine is called to set the physical layer network type used
  1433. * by the driver.
  1434. *
  1435. * \param[in] pvAdapter Pointer to the Adapter structure.
  1436. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  1437. * \param[in] u4SetBufferLen The length of the set buffer.
  1438. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  1439. * bytes read from the set buffer. If the call failed
  1440. * due to invalid length of the set buffer, returns the
  1441. * amount of storage needed.
  1442. *
  1443. * \retval WLAN_STATUS_SUCCESS The given network type is supported and accepted.
  1444. * \retval WLAN_STATUS_INVALID_DATA The given network type is not in the
  1445. * supported list.
  1446. */
  1447. /*----------------------------------------------------------------------------*/
  1448. WLAN_STATUS
  1449. wlanoidSetNetworkTypeInUse(IN P_ADAPTER_T prAdapter,
  1450. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  1451. {
  1452. /* TODO: need to check the OID handler content again!! */
  1453. ENUM_PARAM_NETWORK_TYPE_T eNewNetworkType;
  1454. WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
  1455. DEBUGFUNC("wlanoidSetNetworkTypeInUse");
  1456. ASSERT(prAdapter);
  1457. ASSERT(pvSetBuffer);
  1458. ASSERT(pu4SetInfoLen);
  1459. if (u4SetBufferLen < sizeof(ENUM_PARAM_NETWORK_TYPE_T)) {
  1460. *pu4SetInfoLen = sizeof(ENUM_PARAM_NETWORK_TYPE_T);
  1461. return WLAN_STATUS_INVALID_LENGTH;
  1462. }
  1463. eNewNetworkType = *(P_ENUM_PARAM_NETWORK_TYPE_T) pvSetBuffer;
  1464. *pu4SetInfoLen = sizeof(ENUM_PARAM_NETWORK_TYPE_T);
  1465. DBGLOG(OID, INFO, "New network type: %d mode\n", eNewNetworkType);
  1466. switch (eNewNetworkType) {
  1467. case PARAM_NETWORK_TYPE_DS:
  1468. prAdapter->rWlanInfo.ucNetworkTypeInUse = (UINT_8) PARAM_NETWORK_TYPE_DS;
  1469. break;
  1470. case PARAM_NETWORK_TYPE_OFDM5:
  1471. prAdapter->rWlanInfo.ucNetworkTypeInUse = (UINT_8) PARAM_NETWORK_TYPE_OFDM5;
  1472. break;
  1473. case PARAM_NETWORK_TYPE_OFDM24:
  1474. prAdapter->rWlanInfo.ucNetworkTypeInUse = (UINT_8) PARAM_NETWORK_TYPE_OFDM24;
  1475. break;
  1476. case PARAM_NETWORK_TYPE_AUTOMODE:
  1477. prAdapter->rWlanInfo.ucNetworkTypeInUse = (UINT_8) PARAM_NETWORK_TYPE_AUTOMODE;
  1478. break;
  1479. case PARAM_NETWORK_TYPE_FH:
  1480. DBGLOG(OID, INFO, "Not support network type: %d\n", eNewNetworkType);
  1481. rStatus = WLAN_STATUS_NOT_SUPPORTED;
  1482. break;
  1483. default:
  1484. DBGLOG(OID, INFO, "Unknown network type: %d\n", eNewNetworkType);
  1485. rStatus = WLAN_STATUS_INVALID_DATA;
  1486. break;
  1487. }
  1488. /* Verify if we support the new network type. */
  1489. if (rStatus != WLAN_STATUS_SUCCESS)
  1490. DBGLOG(OID, WARN, "Unknown network type: %d\n", eNewNetworkType);
  1491. return rStatus;
  1492. } /* wlanoidSetNetworkTypeInUse */
  1493. /*----------------------------------------------------------------------------*/
  1494. /*!
  1495. * \brief This routine is called to query the current BSSID.
  1496. *
  1497. * \param[in] prAdapter Pointer to the Adapter structure.
  1498. * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
  1499. * the query.
  1500. * \param[in] u4QueryBufferLen The length of the query buffer.
  1501. * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
  1502. * bytes written into the query buffer. If the call
  1503. * failed due to invalid length of the query buffer,
  1504. * returns the amount of storage needed.
  1505. *
  1506. * \retval WLAN_STATUS_SUCCESS
  1507. * \retval WLAN_STATUS_ADAPTER_NOT_READY
  1508. */
  1509. /*----------------------------------------------------------------------------*/
  1510. WLAN_STATUS
  1511. wlanoidQueryBssid(IN P_ADAPTER_T prAdapter,
  1512. OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  1513. {
  1514. WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
  1515. DEBUGFUNC("wlanoidQueryBssid");
  1516. ASSERT(prAdapter);
  1517. if (u4QueryBufferLen < MAC_ADDR_LEN) {
  1518. ASSERT(pu4QueryInfoLen);
  1519. *pu4QueryInfoLen = MAC_ADDR_LEN;
  1520. return WLAN_STATUS_BUFFER_TOO_SHORT;
  1521. }
  1522. ASSERT(u4QueryBufferLen >= MAC_ADDR_LEN);
  1523. if (u4QueryBufferLen)
  1524. ASSERT(pvQueryBuffer);
  1525. ASSERT(pu4QueryInfoLen);
  1526. if (kalGetMediaStateIndicated(prAdapter->prGlueInfo) == PARAM_MEDIA_STATE_CONNECTED)
  1527. kalMemCopy(pvQueryBuffer, prAdapter->rWlanInfo.rCurrBssId.arMacAddress, MAC_ADDR_LEN);
  1528. else if (prAdapter->rWifiVar.rConnSettings.eOPMode == NET_TYPE_IBSS) {
  1529. PARAM_MAC_ADDRESS aucTemp; /*!< BSSID */
  1530. COPY_MAC_ADDR(aucTemp, prAdapter->rWlanInfo.rCurrBssId.arMacAddress);
  1531. aucTemp[0] &= ~BIT(0);
  1532. aucTemp[1] |= BIT(1);
  1533. COPY_MAC_ADDR(pvQueryBuffer, aucTemp);
  1534. } else
  1535. rStatus = WLAN_STATUS_ADAPTER_NOT_READY;
  1536. *pu4QueryInfoLen = MAC_ADDR_LEN;
  1537. return rStatus;
  1538. } /* wlanoidQueryBssid */
  1539. /*----------------------------------------------------------------------------*/
  1540. /*!
  1541. * \brief This routine is called to query the list of all BSSIDs detected by
  1542. * the driver.
  1543. *
  1544. * \param[in] prAdapter Pointer to the Adapter structure.
  1545. * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
  1546. * the query.
  1547. * \param[in] u4QueryBufferLen The length of the query buffer.
  1548. * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
  1549. * bytes written into the query buffer. If the call
  1550. * failed due to invalid length of the query buffer,
  1551. * returns the amount of storage needed.
  1552. *
  1553. * \retval WLAN_STATUS_SUCCESS
  1554. * \retval WLAN_STATUS_INVALID_LENGTH
  1555. * \retval WLAN_STATUS_ADAPTER_NOT_READY
  1556. */
  1557. /*----------------------------------------------------------------------------*/
  1558. WLAN_STATUS
  1559. wlanoidQueryBssidList(IN P_ADAPTER_T prAdapter,
  1560. OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  1561. {
  1562. P_GLUE_INFO_T prGlueInfo;
  1563. UINT_32 i, u4BssidListExLen;
  1564. P_PARAM_BSSID_LIST_EX_T prList;
  1565. P_PARAM_BSSID_EX_T prBssidEx;
  1566. PUINT_8 cp;
  1567. DEBUGFUNC("wlanoidQueryBssidList");
  1568. ASSERT(prAdapter);
  1569. ASSERT(pu4QueryInfoLen);
  1570. if (u4QueryBufferLen) {
  1571. ASSERT(pvQueryBuffer);
  1572. if (!pvQueryBuffer)
  1573. return WLAN_STATUS_INVALID_DATA;
  1574. }
  1575. prGlueInfo = prAdapter->prGlueInfo;
  1576. if (prAdapter->rAcpiState == ACPI_STATE_D3) {
  1577. DBGLOG(OID, WARN,
  1578. "Fail in qeury BSSID list! (Adapter not ready). ACPI=D%d, Radio=%d\n",
  1579. prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
  1580. return WLAN_STATUS_ADAPTER_NOT_READY;
  1581. }
  1582. u4BssidListExLen = 0;
  1583. if (prAdapter->fgIsRadioOff == FALSE) {
  1584. for (i = 0; i < prAdapter->rWlanInfo.u4ScanResultNum; i++)
  1585. u4BssidListExLen += ALIGN_4(prAdapter->rWlanInfo.arScanResult[i].u4Length);
  1586. }
  1587. if (u4BssidListExLen)
  1588. u4BssidListExLen += 4; /* u4NumberOfItems. */
  1589. else
  1590. u4BssidListExLen = sizeof(PARAM_BSSID_LIST_EX_T);
  1591. *pu4QueryInfoLen = u4BssidListExLen;
  1592. if (u4QueryBufferLen < *pu4QueryInfoLen)
  1593. return WLAN_STATUS_INVALID_LENGTH;
  1594. /* Clear the buffer */
  1595. kalMemZero(pvQueryBuffer, u4BssidListExLen);
  1596. prList = (P_PARAM_BSSID_LIST_EX_T) pvQueryBuffer;
  1597. cp = (PUINT_8) &prList->arBssid[0];
  1598. if (prAdapter->fgIsRadioOff == FALSE && prAdapter->rWlanInfo.u4ScanResultNum > 0) {
  1599. /* fill up for each entry */
  1600. for (i = 0; i < prAdapter->rWlanInfo.u4ScanResultNum; i++) {
  1601. prBssidEx = (P_PARAM_BSSID_EX_T) cp;
  1602. /* copy structure */
  1603. kalMemCopy(prBssidEx,
  1604. &(prAdapter->rWlanInfo.arScanResult[i]), OFFSET_OF(PARAM_BSSID_EX_T, aucIEs));
  1605. /*For WHQL test, Rssi should be in range -10 ~ -200 dBm */
  1606. if (prBssidEx->rRssi > PARAM_WHQL_RSSI_MAX_DBM)
  1607. prBssidEx->rRssi = PARAM_WHQL_RSSI_MAX_DBM;
  1608. if (prAdapter->rWlanInfo.arScanResult[i].u4IELength > 0) {
  1609. /* copy IEs */
  1610. kalMemCopy(prBssidEx->aucIEs,
  1611. prAdapter->rWlanInfo.apucScanResultIEs[i],
  1612. prAdapter->rWlanInfo.arScanResult[i].u4IELength);
  1613. }
  1614. /* 4-bytes alignement */
  1615. prBssidEx->u4Length = ALIGN_4(prBssidEx->u4Length);
  1616. cp += prBssidEx->u4Length;
  1617. prList->u4NumberOfItems++;
  1618. }
  1619. }
  1620. return WLAN_STATUS_SUCCESS;
  1621. } /* wlanoidQueryBssidList */
  1622. /*----------------------------------------------------------------------------*/
  1623. /*!
  1624. * \brief This routine is called to request the driver to perform
  1625. * scanning.
  1626. *
  1627. * \param[in] prAdapter Pointer to the Adapter structure.
  1628. * \param[in] pvSetBuffer Pointer to the buffer that holds the data to be set.
  1629. * \param[in] u4SetBufferLen The length of the set buffer.
  1630. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  1631. * bytes read from the set buffer. If the call failed
  1632. * due to invalid length of the set buffer, returns
  1633. * the amount of storage needed.
  1634. *
  1635. * \retval WLAN_STATUS_SUCCESS
  1636. * \retval WLAN_STATUS_ADAPTER_NOT_READY
  1637. * \retval WLAN_STATUS_FAILURE
  1638. */
  1639. /*----------------------------------------------------------------------------*/
  1640. WLAN_STATUS
  1641. wlanoidSetBssidListScan(IN P_ADAPTER_T prAdapter,
  1642. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  1643. {
  1644. P_PARAM_SSID_T prSsid;
  1645. PARAM_SSID_T rSsid;
  1646. DEBUGFUNC("wlanoidSetBssidListScan()");
  1647. if (prAdapter->rAcpiState == ACPI_STATE_D3) {
  1648. DBGLOG(OID, WARN,
  1649. "Fail in set BSSID list scan! (Adapter not ready). ACPI=D%d, Radio=%d\n",
  1650. prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
  1651. return WLAN_STATUS_ADAPTER_NOT_READY;
  1652. }
  1653. ASSERT(pu4SetInfoLen);
  1654. *pu4SetInfoLen = 0;
  1655. if (prAdapter->fgIsRadioOff) {
  1656. DBGLOG(OID, WARN, "Return from BSSID list scan! (radio off). ACPI=D%d, Radio=%d\n",
  1657. prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
  1658. return WLAN_STATUS_SUCCESS;
  1659. }
  1660. if (pvSetBuffer != NULL && u4SetBufferLen != 0) {
  1661. COPY_SSID(rSsid.aucSsid, rSsid.u4SsidLen, pvSetBuffer, u4SetBufferLen);
  1662. prSsid = &rSsid;
  1663. } else {
  1664. prSsid = NULL;
  1665. }
  1666. #if CFG_SUPPORT_RDD_TEST_MODE
  1667. if (prAdapter->prGlueInfo->rRegInfo.u4RddTestMode) {
  1668. if ((prAdapter->fgEnOnlineScan == TRUE) && (prAdapter->ucRddStatus)) {
  1669. if (kalGetMediaStateIndicated(prAdapter->prGlueInfo) != PARAM_MEDIA_STATE_CONNECTED)
  1670. aisFsmScanRequest(prAdapter, prSsid, NULL, 0);
  1671. else
  1672. return WLAN_STATUS_FAILURE;
  1673. } else
  1674. return WLAN_STATUS_FAILURE;
  1675. } else
  1676. #endif
  1677. {
  1678. if (prAdapter->fgEnOnlineScan == TRUE)
  1679. aisFsmScanRequest(prAdapter, prSsid, NULL, 0);
  1680. else if (kalGetMediaStateIndicated(prAdapter->prGlueInfo) != PARAM_MEDIA_STATE_CONNECTED)
  1681. aisFsmScanRequest(prAdapter, prSsid, NULL, 0);
  1682. else
  1683. return WLAN_STATUS_FAILURE;
  1684. }
  1685. return WLAN_STATUS_SUCCESS;
  1686. } /* wlanoidSetBssidListScan */
  1687. /*----------------------------------------------------------------------------*/
  1688. /*!
  1689. * \brief This routine is called to request the driver to perform
  1690. * scanning with attaching information elements(IEs) specified from user space
  1691. *
  1692. * \param[in] prAdapter Pointer to the Adapter structure.
  1693. * \param[in] pvSetBuffer Pointer to the buffer that holds the data to be set.
  1694. * \param[in] u4SetBufferLen The length of the set buffer.
  1695. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  1696. * bytes read from the set buffer. If the call failed
  1697. * due to invalid length of the set buffer, returns
  1698. * the amount of storage needed.
  1699. *
  1700. * \retval WLAN_STATUS_SUCCESS
  1701. * \retval WLAN_STATUS_ADAPTER_NOT_READY
  1702. * \retval WLAN_STATUS_FAILURE
  1703. */
  1704. /*----------------------------------------------------------------------------*/
  1705. WLAN_STATUS
  1706. wlanoidSetBssidListScanExt(IN P_ADAPTER_T prAdapter,
  1707. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  1708. {
  1709. P_PARAM_SCAN_REQUEST_EXT_T prScanRequest;
  1710. P_PARAM_SSID_T prSsid;
  1711. PUINT_8 pucIe;
  1712. UINT_32 u4IeLength;
  1713. DEBUGFUNC("wlanoidSetBssidListScanExt()");
  1714. if (prAdapter->rAcpiState == ACPI_STATE_D3) {
  1715. DBGLOG(OID, ERROR,
  1716. "Fail in set BSSID list scan! (Adapter not ready). ACPI=D%d, Radio=%d\n",
  1717. prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
  1718. return WLAN_STATUS_ADAPTER_NOT_READY;
  1719. }
  1720. ASSERT(pu4SetInfoLen);
  1721. *pu4SetInfoLen = 0;
  1722. if (u4SetBufferLen != sizeof(PARAM_SCAN_REQUEST_EXT_T))
  1723. return WLAN_STATUS_INVALID_LENGTH;
  1724. if (prAdapter->fgIsRadioOff) {
  1725. DBGLOG(OID, INFO, "Return from BSSID list scan! (radio off). ACPI=D%d, Radio=%d\n",
  1726. prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
  1727. return WLAN_STATUS_SUCCESS;
  1728. }
  1729. DBGLOG(OID, TRACE, "ScanEX\n");
  1730. if (pvSetBuffer != NULL && u4SetBufferLen != 0) {
  1731. prScanRequest = (P_PARAM_SCAN_REQUEST_EXT_T) pvSetBuffer;
  1732. prSsid = &(prScanRequest->rSsid);
  1733. pucIe = prScanRequest->pucIE;
  1734. u4IeLength = prScanRequest->u4IELength;
  1735. } else {
  1736. prScanRequest = NULL;
  1737. prSsid = NULL;
  1738. pucIe = NULL;
  1739. u4IeLength = 0;
  1740. }
  1741. #if CFG_SUPPORT_RDD_TEST_MODE
  1742. if (prAdapter->prGlueInfo->rRegInfo.u4RddTestMode) {
  1743. if ((prAdapter->fgEnOnlineScan == TRUE) && (prAdapter->ucRddStatus)) {
  1744. if (kalGetMediaStateIndicated(prAdapter->prGlueInfo) != PARAM_MEDIA_STATE_CONNECTED)
  1745. aisFsmScanRequest(prAdapter, prSsid, pucIe, u4IeLength);
  1746. else
  1747. return WLAN_STATUS_FAILURE;
  1748. } else
  1749. return WLAN_STATUS_FAILURE;
  1750. } else
  1751. #endif
  1752. {
  1753. if (prAdapter->fgEnOnlineScan == TRUE)
  1754. aisFsmScanRequest(prAdapter, prSsid, pucIe, u4IeLength);
  1755. else if (kalGetMediaStateIndicated(prAdapter->prGlueInfo) != PARAM_MEDIA_STATE_CONNECTED)
  1756. aisFsmScanRequest(prAdapter, prSsid, pucIe, u4IeLength);
  1757. else
  1758. return WLAN_STATUS_FAILURE;
  1759. }
  1760. return WLAN_STATUS_SUCCESS;
  1761. } /* wlanoidSetBssidListScanWithIE */
  1762. /*----------------------------------------------------------------------------*/
  1763. /*!
  1764. * \brief This routine is called to request the driver to perform
  1765. * scanning with attaching information elements(IEs) specified from user space
  1766. * and multiple SSID
  1767. *
  1768. * \param[in] prAdapter Pointer to the Adapter structure.
  1769. * \param[in] pvSetBuffer Pointer to the buffer that holds the data to be set.
  1770. * \param[in] u4SetBufferLen The length of the set buffer.
  1771. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  1772. * bytes read from the set buffer. If the call failed
  1773. * due to invalid length of the set buffer, returns
  1774. * the amount of storage needed.
  1775. *
  1776. * \retval WLAN_STATUS_SUCCESS
  1777. * \retval WLAN_STATUS_ADAPTER_NOT_READY
  1778. * \retval WLAN_STATUS_FAILURE
  1779. */
  1780. /*----------------------------------------------------------------------------*/
  1781. WLAN_STATUS
  1782. wlanoidSetBssidListScanAdv(IN P_ADAPTER_T prAdapter,
  1783. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  1784. {
  1785. P_PARAM_SCAN_REQUEST_ADV_T prScanRequest;
  1786. PARAM_SSID_T rSsid[CFG_SCAN_SSID_MAX_NUM];
  1787. PUINT_8 pucIe;
  1788. UINT_8 ucSsidNum;
  1789. UINT_32 i, u4IeLength;
  1790. DEBUGFUNC("wlanoidSetBssidListScanAdv()");
  1791. if (prAdapter->rAcpiState == ACPI_STATE_D3) {
  1792. DBGLOG(OID, WARN,
  1793. "Fail in set BSSID list scan! (Adapter not ready). ACPI=D%d, Radio=%d\n",
  1794. prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
  1795. return WLAN_STATUS_ADAPTER_NOT_READY;
  1796. }
  1797. ASSERT(pu4SetInfoLen);
  1798. *pu4SetInfoLen = 0;
  1799. if (u4SetBufferLen != sizeof(PARAM_SCAN_REQUEST_ADV_T))
  1800. return WLAN_STATUS_INVALID_LENGTH;
  1801. else if (pvSetBuffer == NULL)
  1802. return WLAN_STATUS_INVALID_DATA;
  1803. if (prAdapter->fgIsRadioOff) {
  1804. DBGLOG(OID, WARN, "Return from BSSID list scan! (radio off). ACPI=D%d, Radio=%d\n",
  1805. prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
  1806. return WLAN_STATUS_SUCCESS;
  1807. }
  1808. prScanRequest = (P_PARAM_SCAN_REQUEST_ADV_T) pvSetBuffer;
  1809. ucSsidNum = (UINT_8) (prScanRequest->u4SsidNum);
  1810. for (i = 0; i < prScanRequest->u4SsidNum; i++) {
  1811. if (prScanRequest->rSsid[i].u4SsidLen > ELEM_MAX_LEN_SSID) {
  1812. DBGLOG(OID, ERROR,
  1813. "[%s] SSID(%s) Length(%ld) is over than ELEM_MAX_LEN_SSID(%d)\n",
  1814. __func__, prScanRequest->rSsid[i].aucSsid,
  1815. prScanRequest->rSsid[i].u4SsidLen, ELEM_MAX_LEN_SSID);
  1816. DBGLOG_MEM8(REQ, ERROR, prScanRequest, sizeof(PARAM_SCAN_REQUEST_ADV_T));
  1817. }
  1818. COPY_SSID(rSsid[i].aucSsid,
  1819. rSsid[i].u4SsidLen, prScanRequest->rSsid[i].aucSsid, prScanRequest->rSsid[i].u4SsidLen);
  1820. }
  1821. pucIe = prScanRequest->pucIE;
  1822. u4IeLength = prScanRequest->u4IELength;
  1823. #if CFG_SUPPORT_RDD_TEST_MODE
  1824. if (prAdapter->prGlueInfo->rRegInfo.u4RddTestMode) {
  1825. if ((prAdapter->fgEnOnlineScan == TRUE) && (prAdapter->ucRddStatus)) {
  1826. if (kalGetMediaStateIndicated(prAdapter->prGlueInfo) != PARAM_MEDIA_STATE_CONNECTED)
  1827. aisFsmScanRequestAdv(prAdapter, ucSsidNum, rSsid, pucIe, u4IeLength);
  1828. else
  1829. return WLAN_STATUS_FAILURE;
  1830. } else
  1831. return WLAN_STATUS_FAILURE;
  1832. } else
  1833. #endif
  1834. {
  1835. if (prAdapter->fgEnOnlineScan == TRUE)
  1836. aisFsmScanRequestAdv(prAdapter, ucSsidNum, rSsid, pucIe, u4IeLength);
  1837. else if (kalGetMediaStateIndicated(prAdapter->prGlueInfo) != PARAM_MEDIA_STATE_CONNECTED)
  1838. aisFsmScanRequestAdv(prAdapter, ucSsidNum, rSsid, pucIe, u4IeLength);
  1839. else
  1840. return WLAN_STATUS_FAILURE;
  1841. }
  1842. cnmTimerStartTimer(prAdapter, &prAdapter->rWifiVar.rAisFsmInfo.rScanDoneTimer,
  1843. SEC_TO_MSEC(AIS_SCN_DONE_TIMEOUT_SEC));
  1844. return WLAN_STATUS_SUCCESS;
  1845. } /* wlanoidSetBssidListScanAdv */
  1846. /*----------------------------------------------------------------------------*/
  1847. /*!
  1848. * \brief This routine will initiate the join procedure to attempt to associate
  1849. * with the specified BSSID.
  1850. *
  1851. * \param[in] pvAdapter Pointer to the Adapter structure.
  1852. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  1853. * \param[in] u4SetBufferLen The length of the set buffer.
  1854. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  1855. * bytes read from the set buffer. If the call failed
  1856. * due to invalid length of the set buffer, returns
  1857. * the amount of storage needed.
  1858. *
  1859. * \retval WLAN_STATUS_SUCCESS
  1860. * \retval WLAN_STATUS_INVALID_LENGTH
  1861. * \retval WLAN_STATUS_INVALID_DATA
  1862. * \retval WLAN_STATUS_ADAPTER_NOT_READY
  1863. */
  1864. /*----------------------------------------------------------------------------*/
  1865. WLAN_STATUS
  1866. wlanoidSetBssid(IN P_ADAPTER_T prAdapter, IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  1867. {
  1868. P_GLUE_INFO_T prGlueInfo;
  1869. P_UINT_8 pAddr;
  1870. UINT_32 i;
  1871. INT_32 i4Idx = -1;
  1872. P_MSG_AIS_ABORT_T prAisAbortMsg;
  1873. UINT_8 ucReasonOfDisconnect;
  1874. ASSERT(prAdapter);
  1875. ASSERT(pu4SetInfoLen);
  1876. *pu4SetInfoLen = MAC_ADDR_LEN;
  1877. if (u4SetBufferLen != MAC_ADDR_LEN) {
  1878. *pu4SetInfoLen = MAC_ADDR_LEN;
  1879. return WLAN_STATUS_INVALID_LENGTH;
  1880. } else if (prAdapter->rAcpiState == ACPI_STATE_D3) {
  1881. DBGLOG(OID, WARN, "Fail in set ssid! (Adapter not ready). ACPI=D%d, Radio=%d\n",
  1882. prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
  1883. return WLAN_STATUS_ADAPTER_NOT_READY;
  1884. }
  1885. prGlueInfo = prAdapter->prGlueInfo;
  1886. pAddr = (P_UINT_8) pvSetBuffer;
  1887. /* re-association check */
  1888. if (kalGetMediaStateIndicated(prGlueInfo) == PARAM_MEDIA_STATE_CONNECTED) {
  1889. if (EQUAL_MAC_ADDR(prAdapter->rWlanInfo.rCurrBssId.arMacAddress, pAddr)) {
  1890. kalSetMediaStateIndicated(prGlueInfo, PARAM_MEDIA_STATE_TO_BE_INDICATED);
  1891. ucReasonOfDisconnect = DISCONNECT_REASON_CODE_REASSOCIATION;
  1892. } else {
  1893. kalIndicateStatusAndComplete(prGlueInfo, WLAN_STATUS_MEDIA_DISCONNECT, NULL, 0);
  1894. ucReasonOfDisconnect = DISCONNECT_REASON_CODE_NEW_CONNECTION;
  1895. }
  1896. } else {
  1897. ucReasonOfDisconnect = DISCONNECT_REASON_CODE_NEW_CONNECTION;
  1898. }
  1899. /* check if any scanned result matchs with the BSSID */
  1900. for (i = 0; i < prAdapter->rWlanInfo.u4ScanResultNum; i++) {
  1901. if (EQUAL_MAC_ADDR(prAdapter->rWlanInfo.arScanResult[i].arMacAddress, pAddr)) {
  1902. i4Idx = (INT_32) i;
  1903. break;
  1904. }
  1905. }
  1906. /* prepare message to AIS */
  1907. if (prAdapter->rWifiVar.rConnSettings.eOPMode == NET_TYPE_IBSS
  1908. || prAdapter->rWifiVar.rConnSettings.eOPMode == NET_TYPE_DEDICATED_IBSS) {
  1909. /* IBSS *//* beacon period */
  1910. prAdapter->rWifiVar.rConnSettings.u2BeaconPeriod = prAdapter->rWlanInfo.u2BeaconPeriod;
  1911. prAdapter->rWifiVar.rConnSettings.u2AtimWindow = prAdapter->rWlanInfo.u2AtimWindow;
  1912. }
  1913. /* Set Connection Request Issued Flag */
  1914. prAdapter->rWifiVar.rConnSettings.fgIsConnReqIssued = TRUE;
  1915. prAdapter->rWifiVar.rConnSettings.eConnectionPolicy = CONNECT_BY_BSSID;
  1916. /* Send AIS Abort Message */
  1917. prAisAbortMsg = (P_MSG_AIS_ABORT_T) cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_AIS_ABORT_T));
  1918. if (!prAisAbortMsg) {
  1919. ASSERT(0);
  1920. return WLAN_STATUS_FAILURE;
  1921. }
  1922. prAisAbortMsg->rMsgHdr.eMsgId = MID_OID_AIS_FSM_JOIN_REQ;
  1923. prAisAbortMsg->ucReasonOfDisconnect = ucReasonOfDisconnect;
  1924. /* Update the information to CONNECTION_SETTINGS_T */
  1925. prAdapter->rWifiVar.rConnSettings.ucSSIDLen = 0;
  1926. prAdapter->rWifiVar.rConnSettings.aucSSID[0] = '\0';
  1927. COPY_MAC_ADDR(prAdapter->rWifiVar.rConnSettings.aucBSSID, pAddr);
  1928. if (EQUAL_MAC_ADDR(prAdapter->rWlanInfo.rCurrBssId.arMacAddress, pAddr))
  1929. prAisAbortMsg->fgDelayIndication = TRUE;
  1930. else
  1931. prAisAbortMsg->fgDelayIndication = FALSE;
  1932. mboxSendMsg(prAdapter, MBOX_ID_0, (P_MSG_HDR_T) prAisAbortMsg, MSG_SEND_METHOD_BUF);
  1933. return WLAN_STATUS_SUCCESS;
  1934. } /* end of wlanoidSetBssid() */
  1935. /*----------------------------------------------------------------------------*/
  1936. /*!
  1937. * \brief This routine will initiate the join procedure to attempt
  1938. * to associate with the new SSID. If the previous scanning
  1939. * result is aged, we will scan the channels at first.
  1940. *
  1941. * \param[in] prAdapter Pointer to the Adapter structure.
  1942. * \param[in] pvSetBuffer Pointer to the buffer that holds the data to be set.
  1943. * \param[in] u4SetBufferLen The length of the set buffer.
  1944. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  1945. * bytes read from the set buffer. If the call failed
  1946. * due to invalid length of the set buffer, returns
  1947. * the amount of storage needed.
  1948. *
  1949. * \retval WLAN_STATUS_SUCCESS
  1950. * \retval WLAN_STATUS_INVALID_DATA
  1951. * \retval WLAN_STATUS_ADAPTER_NOT_READY
  1952. * \retval WLAN_STATUS_INVALID_LENGTH
  1953. */
  1954. /*----------------------------------------------------------------------------*/
  1955. WLAN_STATUS
  1956. wlanoidSetSsid(IN P_ADAPTER_T prAdapter, IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  1957. {
  1958. P_GLUE_INFO_T prGlueInfo;
  1959. P_PARAM_SSID_T pParamSsid;
  1960. UINT_32 i;
  1961. INT_32 i4Idx = -1, i4MaxRSSI = INT_MIN;
  1962. P_MSG_AIS_ABORT_T prAisAbortMsg;
  1963. BOOLEAN fgIsValidSsid = TRUE;
  1964. ASSERT(prAdapter);
  1965. ASSERT(pu4SetInfoLen);
  1966. /* MSDN:
  1967. * Powering on the radio if the radio is powered off through a setting of OID_802_11_DISASSOCIATE
  1968. */
  1969. if (prAdapter->fgIsRadioOff == TRUE)
  1970. prAdapter->fgIsRadioOff = FALSE;
  1971. if (u4SetBufferLen < sizeof(PARAM_SSID_T) || u4SetBufferLen > sizeof(PARAM_SSID_T))
  1972. return WLAN_STATUS_INVALID_LENGTH;
  1973. else if (prAdapter->rAcpiState == ACPI_STATE_D3) {
  1974. DBGLOG(OID, WARN, "Fail in set ssid! (Adapter not ready). ACPI=D%d, Radio=%d\n",
  1975. prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
  1976. return WLAN_STATUS_ADAPTER_NOT_READY;
  1977. }
  1978. pParamSsid = (P_PARAM_SSID_T) pvSetBuffer;
  1979. if (pParamSsid->u4SsidLen > 32)
  1980. return WLAN_STATUS_INVALID_LENGTH;
  1981. prGlueInfo = prAdapter->prGlueInfo;
  1982. /* prepare for CMD_BUILD_CONNECTION & CMD_GET_CONNECTION_STATUS */
  1983. /* re-association check */
  1984. if (kalGetMediaStateIndicated(prGlueInfo) == PARAM_MEDIA_STATE_CONNECTED) {
  1985. if (EQUAL_SSID(prAdapter->rWlanInfo.rCurrBssId.rSsid.aucSsid,
  1986. prAdapter->rWlanInfo.rCurrBssId.rSsid.u4SsidLen,
  1987. pParamSsid->aucSsid, pParamSsid->u4SsidLen)) {
  1988. kalSetMediaStateIndicated(prGlueInfo, PARAM_MEDIA_STATE_TO_BE_INDICATED);
  1989. } else
  1990. kalIndicateStatusAndComplete(prGlueInfo, WLAN_STATUS_MEDIA_DISCONNECT, NULL, 0);
  1991. }
  1992. /* check if any scanned result matchs with the SSID */
  1993. for (i = 0; i < prAdapter->rWlanInfo.u4ScanResultNum; i++) {
  1994. PUINT_8 aucSsid = prAdapter->rWlanInfo.arScanResult[i].rSsid.aucSsid;
  1995. UINT_8 ucSsidLength = (UINT_8) prAdapter->rWlanInfo.arScanResult[i].rSsid.u4SsidLen;
  1996. INT_32 i4RSSI = prAdapter->rWlanInfo.arScanResult[i].rRssi;
  1997. if (EQUAL_SSID(aucSsid, ucSsidLength, pParamSsid->aucSsid, pParamSsid->u4SsidLen) &&
  1998. i4RSSI >= i4MaxRSSI) {
  1999. i4Idx = (INT_32) i;
  2000. i4MaxRSSI = i4RSSI;
  2001. }
  2002. }
  2003. /* prepare message to AIS */
  2004. if (prAdapter->rWifiVar.rConnSettings.eOPMode == NET_TYPE_IBSS
  2005. || prAdapter->rWifiVar.rConnSettings.eOPMode == NET_TYPE_DEDICATED_IBSS) {
  2006. /* IBSS *//* beacon period */
  2007. prAdapter->rWifiVar.rConnSettings.u2BeaconPeriod = prAdapter->rWlanInfo.u2BeaconPeriod;
  2008. prAdapter->rWifiVar.rConnSettings.u2AtimWindow = prAdapter->rWlanInfo.u2AtimWindow;
  2009. }
  2010. if (prAdapter->rWifiVar.fgSupportWZCDisassociation) {
  2011. if (pParamSsid->u4SsidLen == ELEM_MAX_LEN_SSID) {
  2012. fgIsValidSsid = FALSE;
  2013. for (i = 0; i < ELEM_MAX_LEN_SSID; i++) {
  2014. if (!((0 < pParamSsid->aucSsid[i])
  2015. && (pParamSsid->aucSsid[i] <= 0x1F))) {
  2016. fgIsValidSsid = TRUE;
  2017. break;
  2018. }
  2019. }
  2020. }
  2021. }
  2022. /* Set Connection Request Issued Flag */
  2023. if (fgIsValidSsid) {
  2024. prAdapter->rWifiVar.rConnSettings.fgIsConnReqIssued = TRUE;
  2025. if (pParamSsid->u4SsidLen)
  2026. prAdapter->rWifiVar.rConnSettings.eConnectionPolicy = CONNECT_BY_SSID_BEST_RSSI;
  2027. else
  2028. /* wildcard SSID */
  2029. prAdapter->rWifiVar.rConnSettings.eConnectionPolicy = CONNECT_BY_SSID_ANY;
  2030. } else
  2031. prAdapter->rWifiVar.rConnSettings.fgIsConnReqIssued = FALSE;
  2032. /* Send AIS Abort Message */
  2033. prAisAbortMsg = (P_MSG_AIS_ABORT_T) cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_AIS_ABORT_T));
  2034. if (!prAisAbortMsg) {
  2035. ASSERT(0);
  2036. return WLAN_STATUS_FAILURE;
  2037. }
  2038. prAisAbortMsg->rMsgHdr.eMsgId = MID_OID_AIS_FSM_JOIN_REQ;
  2039. prAisAbortMsg->ucReasonOfDisconnect = DISCONNECT_REASON_CODE_NEW_CONNECTION;
  2040. COPY_SSID(prAdapter->rWifiVar.rConnSettings.aucSSID,
  2041. prAdapter->rWifiVar.rConnSettings.ucSSIDLen, pParamSsid->aucSsid, (UINT_8) pParamSsid->u4SsidLen);
  2042. if (EQUAL_SSID(prAdapter->rWlanInfo.rCurrBssId.rSsid.aucSsid,
  2043. prAdapter->rWlanInfo.rCurrBssId.rSsid.u4SsidLen, pParamSsid->aucSsid, pParamSsid->u4SsidLen)) {
  2044. prAisAbortMsg->fgDelayIndication = TRUE;
  2045. } else {
  2046. /* Update the information to CONNECTION_SETTINGS_T */
  2047. prAisAbortMsg->fgDelayIndication = FALSE;
  2048. }
  2049. DBGLOG(OID, INFO, "SSID %s\n", prAdapter->rWifiVar.rConnSettings.aucSSID);
  2050. mboxSendMsg(prAdapter, MBOX_ID_0, (P_MSG_HDR_T) prAisAbortMsg, MSG_SEND_METHOD_BUF);
  2051. return WLAN_STATUS_SUCCESS;
  2052. } /* end of wlanoidSetSsid() */
  2053. /*----------------------------------------------------------------------------*/
  2054. /*!
  2055. * \brief This routine will initiate the join procedure to attempt
  2056. * to associate with the new BSS, base on given SSID, BSSID, and freqency.
  2057. * If the target connecting BSS is in the same ESS as current connected BSS, roaming
  2058. * will be performed.
  2059. *
  2060. * \param[in] prAdapter Pointer to the Adapter structure.
  2061. * \param[in] pvSetBuffer Pointer to the buffer that holds the data to be set.
  2062. * \param[in] u4SetBufferLen The length of the set buffer.
  2063. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  2064. * bytes read from the set buffer. If the call failed
  2065. * due to invalid length of the set buffer, returns
  2066. * the amount of storage needed.
  2067. *
  2068. * \retval WLAN_STATUS_SUCCESS
  2069. * \retval WLAN_STATUS_INVALID_DATA
  2070. * \retval WLAN_STATUS_ADAPTER_NOT_READY
  2071. * \retval WLAN_STATUS_INVALID_LENGTH
  2072. */
  2073. /*----------------------------------------------------------------------------*/
  2074. WLAN_STATUS
  2075. wlanoidSetConnect(IN P_ADAPTER_T prAdapter, IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  2076. {
  2077. P_GLUE_INFO_T prGlueInfo;
  2078. P_PARAM_CONNECT_T pParamConn;
  2079. P_CONNECTION_SETTINGS_T prConnSettings;
  2080. UINT_32 i;
  2081. P_MSG_AIS_ABORT_T prAisAbortMsg;
  2082. BOOLEAN fgIsValidSsid = TRUE;
  2083. BOOLEAN fgEqualSsid = FALSE;
  2084. BOOLEAN fgEqualBssid = FALSE;
  2085. const UINT_8 aucZeroMacAddr[] = NULL_MAC_ADDR;
  2086. ASSERT(prAdapter);
  2087. ASSERT(pu4SetInfoLen);
  2088. /* MSDN:
  2089. * Powering on the radio if the radio is powered off through a setting of OID_802_11_DISASSOCIATE
  2090. */
  2091. if (prAdapter->fgIsRadioOff == TRUE)
  2092. prAdapter->fgIsRadioOff = FALSE;
  2093. if (u4SetBufferLen != sizeof(PARAM_CONNECT_T))
  2094. return WLAN_STATUS_INVALID_LENGTH;
  2095. else if (prAdapter->rAcpiState == ACPI_STATE_D3) {
  2096. DBGLOG(OID, WARN, "Fail in set ssid! (Adapter not ready). ACPI=D%d, Radio=%d\n",
  2097. prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
  2098. return WLAN_STATUS_ADAPTER_NOT_READY;
  2099. }
  2100. prAisAbortMsg = (P_MSG_AIS_ABORT_T) cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_AIS_ABORT_T));
  2101. if (!prAisAbortMsg) {
  2102. ASSERT(0);
  2103. return WLAN_STATUS_FAILURE;
  2104. }
  2105. prAisAbortMsg->rMsgHdr.eMsgId = MID_OID_AIS_FSM_JOIN_REQ;
  2106. pParamConn = (P_PARAM_CONNECT_T) pvSetBuffer;
  2107. prConnSettings = &prAdapter->rWifiVar.rConnSettings;
  2108. if (pParamConn->u4SsidLen > 32)
  2109. return WLAN_STATUS_INVALID_LENGTH;
  2110. else if (!pParamConn->pucBssid && !pParamConn->pucSsid)
  2111. return WLAN_STATUS_INVALID_LENGTH;
  2112. prGlueInfo = prAdapter->prGlueInfo;
  2113. kalMemZero(prConnSettings->aucSSID, sizeof(prConnSettings->aucSSID));
  2114. kalMemZero(prConnSettings->aucBSSID, sizeof(prConnSettings->aucBSSID));
  2115. prConnSettings->eConnectionPolicy = CONNECT_BY_SSID_ANY;
  2116. prConnSettings->fgIsConnByBssidIssued = FALSE;
  2117. if (pParamConn->pucSsid) {
  2118. prConnSettings->eConnectionPolicy = CONNECT_BY_SSID_BEST_RSSI;
  2119. COPY_SSID(prConnSettings->aucSSID,
  2120. prConnSettings->ucSSIDLen, pParamConn->pucSsid, (UINT_8) pParamConn->u4SsidLen);
  2121. if (EQUAL_SSID
  2122. (prAdapter->rWlanInfo.rCurrBssId.rSsid.aucSsid,
  2123. prAdapter->rWlanInfo.rCurrBssId.rSsid.u4SsidLen, pParamConn->pucSsid, pParamConn->u4SsidLen))
  2124. fgEqualSsid = TRUE;
  2125. }
  2126. if (pParamConn->pucBssid) {
  2127. if (!EQUAL_MAC_ADDR(aucZeroMacAddr, pParamConn->pucBssid)
  2128. && IS_UCAST_MAC_ADDR(pParamConn->pucBssid)) {
  2129. prConnSettings->eConnectionPolicy = CONNECT_BY_BSSID;
  2130. prConnSettings->fgIsConnByBssidIssued = TRUE;
  2131. COPY_MAC_ADDR(prConnSettings->aucBSSID, pParamConn->pucBssid);
  2132. if (EQUAL_MAC_ADDR(prAdapter->rWlanInfo.rCurrBssId.arMacAddress, pParamConn->pucBssid))
  2133. fgEqualBssid = TRUE;
  2134. } else
  2135. DBGLOG(OID, INFO, "wrong bssid " MACSTR "to connect\n", MAC2STR(pParamConn->pucBssid));
  2136. } else
  2137. DBGLOG(OID, INFO, "No Bssid set\n");
  2138. prConnSettings->u4FreqInKHz = pParamConn->u4CenterFreq;
  2139. /* prepare for CMD_BUILD_CONNECTION & CMD_GET_CONNECTION_STATUS */
  2140. /* re-association check */
  2141. if (kalGetMediaStateIndicated(prGlueInfo) == PARAM_MEDIA_STATE_CONNECTED) {
  2142. if (fgEqualSsid) {
  2143. prAisAbortMsg->ucReasonOfDisconnect = DISCONNECT_REASON_CODE_REASSOCIATION;
  2144. if (fgEqualBssid)
  2145. kalSetMediaStateIndicated(prGlueInfo, PARAM_MEDIA_STATE_TO_BE_INDICATED);
  2146. } else {
  2147. DBGLOG(OID, INFO, "DisBySsid\n");
  2148. kalIndicateStatusAndComplete(prGlueInfo, WLAN_STATUS_MEDIA_DISCONNECT, NULL, 0);
  2149. prAisAbortMsg->ucReasonOfDisconnect = DISCONNECT_REASON_CODE_NEW_CONNECTION;
  2150. }
  2151. } else
  2152. prAisAbortMsg->ucReasonOfDisconnect = DISCONNECT_REASON_CODE_NEW_CONNECTION;
  2153. #if 0
  2154. /* check if any scanned result matchs with the SSID */
  2155. for (i = 0; i < prAdapter->rWlanInfo.u4ScanResultNum; i++) {
  2156. PUINT_8 aucSsid = prAdapter->rWlanInfo.arScanResult[i].rSsid.aucSsid;
  2157. UINT_8 ucSsidLength = (UINT_8) prAdapter->rWlanInfo.arScanResult[i].rSsid.u4SsidLen;
  2158. INT_32 i4RSSI = prAdapter->rWlanInfo.arScanResult[i].rRssi;
  2159. if (EQUAL_SSID(aucSsid, ucSsidLength, pParamConn->pucSsid, pParamConn->u4SsidLen) &&
  2160. i4RSSI >= i4MaxRSSI) {
  2161. i4Idx = (INT_32) i;
  2162. i4MaxRSSI = i4RSSI;
  2163. }
  2164. if (EQUAL_MAC_ADDR(prAdapter->rWlanInfo.arScanResult[i].arMacAddress, pAddr)) {
  2165. i4Idx = (INT_32) i;
  2166. break;
  2167. }
  2168. }
  2169. #endif
  2170. /* prepare message to AIS */
  2171. if (prConnSettings->eOPMode == NET_TYPE_IBSS || prConnSettings->eOPMode == NET_TYPE_DEDICATED_IBSS) {
  2172. /* IBSS *//* beacon period */
  2173. prConnSettings->u2BeaconPeriod = prAdapter->rWlanInfo.u2BeaconPeriod;
  2174. prConnSettings->u2AtimWindow = prAdapter->rWlanInfo.u2AtimWindow;
  2175. }
  2176. if (prAdapter->rWifiVar.fgSupportWZCDisassociation) {
  2177. if (pParamConn->u4SsidLen == ELEM_MAX_LEN_SSID) {
  2178. fgIsValidSsid = FALSE;
  2179. for (i = 0; i < ELEM_MAX_LEN_SSID; i++) {
  2180. if (!((0 < pParamConn->pucSsid[i])
  2181. && (pParamConn->pucSsid[i] <= 0x1F))) {
  2182. fgIsValidSsid = TRUE;
  2183. break;
  2184. }
  2185. }
  2186. }
  2187. }
  2188. /* Set Connection Request Issued Flag */
  2189. if (fgIsValidSsid)
  2190. prConnSettings->fgIsConnReqIssued = TRUE;
  2191. else
  2192. prConnSettings->fgIsConnReqIssued = FALSE;
  2193. if (fgEqualSsid || fgEqualBssid)
  2194. prAisAbortMsg->fgDelayIndication = TRUE;
  2195. else
  2196. /* Update the information to CONNECTION_SETTINGS_T */
  2197. prAisAbortMsg->fgDelayIndication = FALSE;
  2198. mboxSendMsg(prAdapter, MBOX_ID_0, (P_MSG_HDR_T) prAisAbortMsg, MSG_SEND_METHOD_BUF);
  2199. DBGLOG(OID, INFO, "ssid %s, bssid " MACSTR ", conn policy %d, disc reason %d\n",
  2200. prConnSettings->aucSSID, MAC2STR(prConnSettings->aucBSSID),
  2201. prConnSettings->eConnectionPolicy, prAisAbortMsg->ucReasonOfDisconnect);
  2202. return WLAN_STATUS_SUCCESS;
  2203. } /* end of wlanoidSetConnect */
  2204. /*----------------------------------------------------------------------------*/
  2205. /*!
  2206. * \brief This routine is called to query the currently associated SSID.
  2207. *
  2208. * \param[in] prAdapter Pointer to the Adapter structure.
  2209. * \param[in] pvQueryBuffer Pointer to the buffer that holds the result of
  2210. * the query.
  2211. * \param[in] u4QueryBufferLen The length of the query buffer.
  2212. * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
  2213. * bytes written into the query buffer. If the call
  2214. * failed due to invalid length of the query buffer,
  2215. * returns the amount of storage needed.
  2216. *
  2217. * \retval WLAN_STATUS_SUCCESS
  2218. * \retval WLAN_STATUS_INVALID_LENGTH
  2219. */
  2220. /*----------------------------------------------------------------------------*/
  2221. WLAN_STATUS
  2222. wlanoidQuerySsid(IN P_ADAPTER_T prAdapter,
  2223. OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  2224. {
  2225. P_PARAM_SSID_T prAssociatedSsid;
  2226. DEBUGFUNC("wlanoidQuerySsid");
  2227. ASSERT(prAdapter);
  2228. if (pu4QueryInfoLen == NULL)
  2229. return WLAN_STATUS_FAILURE;
  2230. if (u4QueryBufferLen)
  2231. ASSERT(pvQueryBuffer);
  2232. *pu4QueryInfoLen = sizeof(PARAM_SSID_T);
  2233. /* Check for query buffer length */
  2234. if (u4QueryBufferLen < *pu4QueryInfoLen) {
  2235. DBGLOG(OID, WARN, "Invalid length %u\n", u4QueryBufferLen);
  2236. return WLAN_STATUS_INVALID_LENGTH;
  2237. }
  2238. prAssociatedSsid = (P_PARAM_SSID_T) pvQueryBuffer;
  2239. kalMemZero(prAssociatedSsid->aucSsid, sizeof(prAssociatedSsid->aucSsid));
  2240. if (kalGetMediaStateIndicated(prAdapter->prGlueInfo) == PARAM_MEDIA_STATE_CONNECTED) {
  2241. prAssociatedSsid->u4SsidLen = prAdapter->rWlanInfo.rCurrBssId.rSsid.u4SsidLen;
  2242. if (prAssociatedSsid->u4SsidLen) {
  2243. kalMemCopy(prAssociatedSsid->aucSsid,
  2244. prAdapter->rWlanInfo.rCurrBssId.rSsid.aucSsid, prAssociatedSsid->u4SsidLen);
  2245. }
  2246. } else {
  2247. prAssociatedSsid->u4SsidLen = 0;
  2248. DBGLOG(OID, TRACE, "Null SSID\n");
  2249. }
  2250. return WLAN_STATUS_SUCCESS;
  2251. } /* wlanoidQuerySsid */
  2252. /*----------------------------------------------------------------------------*/
  2253. /*!
  2254. * \brief This routine is called to query the current 802.11 network type.
  2255. *
  2256. * \param[in] prAdapter Pointer to the Adapter structure.
  2257. * \param[in] pvQueryBuffer Pointer to the buffer that holds the result of
  2258. * the query.
  2259. * \param[in] u4QueryBufferLen The length of the query buffer.
  2260. * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
  2261. * bytes written into the query buffer. If the call
  2262. * failed due to invalid length of the query buffer,
  2263. * returns the amount of storage needed.
  2264. *
  2265. * \retval WLAN_STATUS_SUCCESS
  2266. * \retval WLAN_STATUS_BUFFER_TOO_SHORT
  2267. */
  2268. /*----------------------------------------------------------------------------*/
  2269. WLAN_STATUS
  2270. wlanoidQueryInfrastructureMode(IN P_ADAPTER_T prAdapter,
  2271. OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  2272. {
  2273. DEBUGFUNC("wlanoidQueryInfrastructureMode");
  2274. ASSERT(prAdapter);
  2275. ASSERT(pu4QueryInfoLen);
  2276. *pu4QueryInfoLen = sizeof(ENUM_PARAM_OP_MODE_T);
  2277. if (u4QueryBufferLen < sizeof(ENUM_PARAM_OP_MODE_T))
  2278. return WLAN_STATUS_BUFFER_TOO_SHORT;
  2279. if (u4QueryBufferLen)
  2280. ASSERT(pvQueryBuffer);
  2281. *(P_ENUM_PARAM_OP_MODE_T) pvQueryBuffer = prAdapter->rWifiVar.rConnSettings.eOPMode;
  2282. /*
  2283. ** According to OID_802_11_INFRASTRUCTURE_MODE
  2284. ** If there is no prior OID_802_11_INFRASTRUCTURE_MODE,
  2285. ** NDIS_STATUS_ADAPTER_NOT_READY shall be returned.
  2286. */
  2287. #if DBG
  2288. switch (*(P_ENUM_PARAM_OP_MODE_T) pvQueryBuffer) {
  2289. case NET_TYPE_IBSS:
  2290. DBGLOG(OID, INFO, "IBSS mode\n");
  2291. break;
  2292. case NET_TYPE_INFRA:
  2293. DBGLOG(OID, INFO, "Infrastructure mode\n");
  2294. break;
  2295. default:
  2296. DBGLOG(OID, INFO, "Automatic mode\n");
  2297. }
  2298. #endif
  2299. return WLAN_STATUS_SUCCESS;
  2300. } /* wlanoidQueryInfrastructureMode */
  2301. /*----------------------------------------------------------------------------*/
  2302. /*!
  2303. * \brief This routine is called to set mode to infrastructure or
  2304. * IBSS, or automatic switch between the two.
  2305. *
  2306. * \param[in] prAdapter Pointer to the Adapter structure.
  2307. * \param[in] pvSetBuffer Pointer to the buffer that holds the data to be set.
  2308. * \param[in] u4SetBufferLen The length of the set buffer.
  2309. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  2310. * bytes read from the set buffer. If the call failed due to invalid
  2311. * length of the set buffer, returns the amount of storage needed.
  2312. *
  2313. * \retval WLAN_STATUS_SUCCESS
  2314. * \retval WLAN_STATUS_INVALID_DATA
  2315. * \retval WLAN_STATUS_ADAPTER_NOT_READY
  2316. * \retval WLAN_STATUS_INVALID_LENGTH
  2317. */
  2318. /*----------------------------------------------------------------------------*/
  2319. WLAN_STATUS
  2320. wlanoidSetInfrastructureMode(IN P_ADAPTER_T prAdapter,
  2321. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  2322. {
  2323. P_GLUE_INFO_T prGlueInfo;
  2324. ENUM_PARAM_OP_MODE_T eOpMode;
  2325. /* P_WLAN_TABLE_T prWlanTable; */
  2326. #if CFG_SUPPORT_802_11W
  2327. /* P_AIS_SPECIFIC_BSS_INFO_T prAisSpecBssInfo; */
  2328. #endif
  2329. /* P_BSS_INFO_T prBssInfo; */
  2330. /* UINT_8 i; */
  2331. DEBUGFUNC("wlanoidSetInfrastructureMode");
  2332. ASSERT(prAdapter);
  2333. ASSERT(pvSetBuffer);
  2334. ASSERT(pu4SetInfoLen);
  2335. prGlueInfo = prAdapter->prGlueInfo;
  2336. if (u4SetBufferLen < sizeof(ENUM_PARAM_OP_MODE_T))
  2337. return WLAN_STATUS_BUFFER_TOO_SHORT;
  2338. *pu4SetInfoLen = sizeof(ENUM_PARAM_OP_MODE_T);
  2339. if (prAdapter->rAcpiState == ACPI_STATE_D3) {
  2340. DBGLOG(OID, WARN,
  2341. "Fail in set infrastructure mode! (Adapter not ready). ACPI=D%d, Radio=%d\n",
  2342. prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
  2343. return WLAN_STATUS_ADAPTER_NOT_READY;
  2344. }
  2345. eOpMode = *(P_ENUM_PARAM_OP_MODE_T) pvSetBuffer;
  2346. /* Verify the new infrastructure mode. */
  2347. if (eOpMode >= NET_TYPE_NUM) {
  2348. DBGLOG(OID, TRACE, "Invalid mode value %d\n", eOpMode);
  2349. return WLAN_STATUS_INVALID_DATA;
  2350. }
  2351. /* check if possible to switch to AdHoc mode */
  2352. if (eOpMode == NET_TYPE_IBSS || eOpMode == NET_TYPE_DEDICATED_IBSS) {
  2353. if (cnmAisIbssIsPermitted(prAdapter) == FALSE) {
  2354. DBGLOG(OID, TRACE, "Mode value %d unallowed\n", eOpMode);
  2355. return WLAN_STATUS_FAILURE;
  2356. }
  2357. }
  2358. /* Save the new infrastructure mode setting. */
  2359. prAdapter->rWifiVar.rConnSettings.eOPMode = eOpMode;
  2360. prAdapter->rWifiVar.rConnSettings.fgWapiMode = FALSE;
  2361. #if CFG_SUPPORT_WAPI
  2362. prAdapter->prGlueInfo->u2WapiAssocInfoIESz = 0;
  2363. kalMemZero(&prAdapter->prGlueInfo->aucWapiAssocInfoIEs, 42);
  2364. #endif
  2365. #if CFG_SUPPORT_802_11W
  2366. prAdapter->rWifiVar.rAisSpecificBssInfo.fgMgmtProtection = FALSE;
  2367. prAdapter->rWifiVar.rAisSpecificBssInfo.fgBipKeyInstalled = FALSE;
  2368. #endif
  2369. #if CFG_SUPPORT_WPS2
  2370. kalMemZero(&prAdapter->prGlueInfo->aucWSCAssocInfoIE, 200);
  2371. prAdapter->prGlueInfo->u2WSCAssocInfoIELen = 0;
  2372. #endif
  2373. #if 0 /* STA record remove at AIS_ABORT nicUpdateBss and DISCONNECT */
  2374. for (i = 0; i < BSS_INFO_NUM; i++) {
  2375. prBssInfo = prAdapter->aprBssInfo[i];
  2376. if (prBssInfo->eNetworkType == NETWORK_TYPE_AIS)
  2377. cnmStaFreeAllStaByNetwork(prAdapter, prBssInfo->ucBssIndex, 0);
  2378. }
  2379. #endif
  2380. /* Clean up the Tx key flag */
  2381. prAdapter->prAisBssInfo->fgTxBcKeyExist = FALSE;
  2382. prAdapter->prAisBssInfo->ucTxDefaultKeyID = 0;
  2383. prAdapter->prAisBssInfo->ucCurrentGtkId = 0;
  2384. /* prWlanTable = prAdapter->rWifiVar.arWtbl; */
  2385. /* prWlanTable[prAdapter->prAisBssInfo->ucBMCWlanIndex].ucKeyId = 0; */
  2386. #if DBG
  2387. DBGLOG(RSN, TRACE, "wlanoidSetInfrastructureMode\n");
  2388. #endif
  2389. return wlanSendSetQueryCmd(prAdapter,
  2390. CMD_ID_INFRASTRUCTURE,
  2391. TRUE,
  2392. FALSE,
  2393. TRUE,
  2394. nicCmdEventSetCommon, nicOidCmdTimeoutCommon, 0, NULL, pvSetBuffer, u4SetBufferLen);
  2395. } /* wlanoidSetInfrastructureMode */
  2396. /*----------------------------------------------------------------------------*/
  2397. /*!
  2398. * \brief This routine is called to query the current 802.11 authentication
  2399. * mode.
  2400. *
  2401. * \param[in] prAdapter Pointer to the Adapter structure.
  2402. * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
  2403. * the query.
  2404. * \param[in] u4QueryBufferLen The length of the query buffer.
  2405. * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
  2406. * bytes written into the query buffer. If the call
  2407. * failed due to invalid length of the query buffer,
  2408. * returns the amount of storage needed.
  2409. *
  2410. * \retval WLAN_STATUS_SUCCESS
  2411. * \retval WLAN_STATUS_BUFFER_TOO_SHORT
  2412. */
  2413. /*----------------------------------------------------------------------------*/
  2414. WLAN_STATUS
  2415. wlanoidQueryAuthMode(IN P_ADAPTER_T prAdapter,
  2416. OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  2417. {
  2418. DEBUGFUNC("wlanoidQueryAuthMode");
  2419. ASSERT(prAdapter);
  2420. if (u4QueryBufferLen)
  2421. ASSERT(pvQueryBuffer);
  2422. ASSERT(pu4QueryInfoLen);
  2423. *pu4QueryInfoLen = sizeof(ENUM_PARAM_AUTH_MODE_T);
  2424. if (u4QueryBufferLen < sizeof(ENUM_PARAM_AUTH_MODE_T))
  2425. return WLAN_STATUS_BUFFER_TOO_SHORT;
  2426. *(P_ENUM_PARAM_AUTH_MODE_T) pvQueryBuffer = prAdapter->rWifiVar.rConnSettings.eAuthMode;
  2427. #if DBG
  2428. switch (*(P_ENUM_PARAM_AUTH_MODE_T) pvQueryBuffer) {
  2429. case AUTH_MODE_OPEN:
  2430. DBGLOG(OID, INFO, "Current auth mode: Open\n");
  2431. break;
  2432. case AUTH_MODE_SHARED:
  2433. DBGLOG(OID, INFO, "Current auth mode: Shared\n");
  2434. break;
  2435. case AUTH_MODE_AUTO_SWITCH:
  2436. DBGLOG(OID, INFO, "Current auth mode: Auto-switch\n");
  2437. break;
  2438. case AUTH_MODE_WPA:
  2439. DBGLOG(OID, INFO, "Current auth mode: WPA\n");
  2440. break;
  2441. case AUTH_MODE_WPA_PSK:
  2442. DBGLOG(OID, INFO, "Current auth mode: WPA PSK\n");
  2443. break;
  2444. case AUTH_MODE_WPA_NONE:
  2445. DBGLOG(OID, INFO, "Current auth mode: WPA None\n");
  2446. break;
  2447. case AUTH_MODE_WPA2:
  2448. DBGLOG(OID, INFO, "Current auth mode: WPA2\n");
  2449. break;
  2450. case AUTH_MODE_WPA2_PSK:
  2451. DBGLOG(OID, INFO, "Current auth mode: WPA2 PSK\n");
  2452. break;
  2453. default:
  2454. DBGLOG(OID, INFO, "Current auth mode: %d\n", *(P_ENUM_PARAM_AUTH_MODE_T) pvQueryBuffer);
  2455. break;
  2456. }
  2457. #endif
  2458. return WLAN_STATUS_SUCCESS;
  2459. } /* wlanoidQueryAuthMode */
  2460. /*----------------------------------------------------------------------------*/
  2461. /*!
  2462. * \brief This routine is called to set the IEEE 802.11 authentication mode
  2463. * to the driver.
  2464. *
  2465. * \param[in] prAdapter Pointer to the Adapter structure.
  2466. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  2467. * \param[in] u4SetBufferLen The length of the set buffer.
  2468. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  2469. * bytes read from the set buffer. If the call failed
  2470. * due to invalid length of the set buffer, returns
  2471. * the amount of storage needed.
  2472. *
  2473. * \retval WLAN_STATUS_SUCCESS
  2474. * \retval WLAN_STATUS_INVALID_DATA
  2475. * \retval WLAN_STATUS_INVALID_LENGTH
  2476. * \retval WLAN_STATUS_ADAPTER_NOT_READY
  2477. * \retval WLAN_STATUS_NOT_ACCEPTED
  2478. */
  2479. /*----------------------------------------------------------------------------*/
  2480. WLAN_STATUS
  2481. wlanoidSetAuthMode(IN P_ADAPTER_T prAdapter,
  2482. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  2483. {
  2484. P_GLUE_INFO_T prGlueInfo;
  2485. /* UINT_32 i, u4AkmSuite; */
  2486. /* P_DOT11_RSNA_CONFIG_AUTHENTICATION_SUITES_ENTRY prEntry; */
  2487. DEBUGFUNC("wlanoidSetAuthMode");
  2488. ASSERT(prAdapter);
  2489. ASSERT(pu4SetInfoLen);
  2490. ASSERT(pvSetBuffer);
  2491. prGlueInfo = prAdapter->prGlueInfo;
  2492. *pu4SetInfoLen = sizeof(ENUM_PARAM_AUTH_MODE_T);
  2493. if (u4SetBufferLen < sizeof(ENUM_PARAM_AUTH_MODE_T))
  2494. return WLAN_STATUS_INVALID_LENGTH;
  2495. /* RF Test */
  2496. /* if (IS_ARB_IN_RFTEST_STATE(prAdapter)) { */
  2497. /* return WLAN_STATUS_SUCCESS; */
  2498. /* } */
  2499. if (prAdapter->rAcpiState == ACPI_STATE_D3) {
  2500. DBGLOG(OID, WARN,
  2501. "Fail in set Authentication mode! (Adapter not ready). ACPI=D%d, Radio=%d\n",
  2502. prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
  2503. return WLAN_STATUS_ADAPTER_NOT_READY;
  2504. }
  2505. /* Check if the new authentication mode is valid. */
  2506. if (*(P_ENUM_PARAM_AUTH_MODE_T) pvSetBuffer >= AUTH_MODE_NUM) {
  2507. DBGLOG(OID, TRACE, "Invalid auth mode %d\n", *(P_ENUM_PARAM_AUTH_MODE_T) pvSetBuffer);
  2508. return WLAN_STATUS_INVALID_DATA;
  2509. }
  2510. switch (*(P_ENUM_PARAM_AUTH_MODE_T) pvSetBuffer) {
  2511. case AUTH_MODE_WPA:
  2512. case AUTH_MODE_WPA_PSK:
  2513. case AUTH_MODE_WPA2:
  2514. case AUTH_MODE_WPA2_PSK:
  2515. /* infrastructure mode only */
  2516. if (prAdapter->rWifiVar.rConnSettings.eOPMode != NET_TYPE_INFRA)
  2517. return WLAN_STATUS_NOT_ACCEPTED;
  2518. break;
  2519. case AUTH_MODE_WPA_NONE:
  2520. /* ad hoc mode only */
  2521. if (prAdapter->rWifiVar.rConnSettings.eOPMode != NET_TYPE_IBSS)
  2522. return WLAN_STATUS_NOT_ACCEPTED;
  2523. break;
  2524. default:
  2525. break;
  2526. }
  2527. /* Save the new authentication mode. */
  2528. prAdapter->rWifiVar.rConnSettings.eAuthMode = *(P_ENUM_PARAM_AUTH_MODE_T) pvSetBuffer;
  2529. #if DBG
  2530. switch (prAdapter->rWifiVar.rConnSettings.eAuthMode) {
  2531. case AUTH_MODE_OPEN:
  2532. DBGLOG(RSN, TRACE, "New auth mode: open\n");
  2533. break;
  2534. case AUTH_MODE_SHARED:
  2535. DBGLOG(RSN, TRACE, "New auth mode: shared\n");
  2536. break;
  2537. case AUTH_MODE_AUTO_SWITCH:
  2538. DBGLOG(RSN, TRACE, "New auth mode: auto-switch\n");
  2539. break;
  2540. case AUTH_MODE_WPA:
  2541. DBGLOG(RSN, TRACE, "New auth mode: WPA\n");
  2542. break;
  2543. case AUTH_MODE_WPA_PSK:
  2544. DBGLOG(RSN, TRACE, "New auth mode: WPA PSK\n");
  2545. break;
  2546. case AUTH_MODE_WPA_NONE:
  2547. DBGLOG(RSN, TRACE, "New auth mode: WPA None\n");
  2548. break;
  2549. case AUTH_MODE_WPA2:
  2550. DBGLOG(RSN, TRACE, "New auth mode: WPA2\n");
  2551. break;
  2552. case AUTH_MODE_WPA2_PSK:
  2553. DBGLOG(RSN, TRACE, "New auth mode: WPA2 PSK\n");
  2554. break;
  2555. default:
  2556. DBGLOG(RSN, TRACE, "New auth mode: unknown (%d)\n", prAdapter->rWifiVar.rConnSettings.eAuthMode);
  2557. }
  2558. #endif
  2559. #if 0
  2560. if (prAdapter->rWifiVar.rConnSettings.eAuthMode >= AUTH_MODE_WPA) {
  2561. switch (prAdapter->rWifiVar.rConnSettings.eAuthMode) {
  2562. case AUTH_MODE_WPA:
  2563. u4AkmSuite = WPA_AKM_SUITE_802_1X;
  2564. break;
  2565. case AUTH_MODE_WPA_PSK:
  2566. u4AkmSuite = WPA_AKM_SUITE_PSK;
  2567. break;
  2568. case AUTH_MODE_WPA_NONE:
  2569. u4AkmSuite = WPA_AKM_SUITE_NONE;
  2570. break;
  2571. case AUTH_MODE_WPA2:
  2572. u4AkmSuite = RSN_AKM_SUITE_802_1X;
  2573. break;
  2574. case AUTH_MODE_WPA2_PSK:
  2575. u4AkmSuite = RSN_AKM_SUITE_PSK;
  2576. break;
  2577. default:
  2578. u4AkmSuite = 0;
  2579. }
  2580. } else {
  2581. u4AkmSuite = 0;
  2582. }
  2583. /* Enable the specific AKM suite only. */
  2584. for (i = 0; i < MAX_NUM_SUPPORTED_AKM_SUITES; i++) {
  2585. prEntry = &prAdapter->rMib.dot11RSNAConfigAuthenticationSuitesTable[i];
  2586. if (prEntry->dot11RSNAConfigAuthenticationSuite == u4AkmSuite)
  2587. prEntry->dot11RSNAConfigAuthenticationSuiteEnabled = TRUE;
  2588. else
  2589. prEntry->dot11RSNAConfigAuthenticationSuiteEnabled = FALSE;
  2590. #if CFG_SUPPORT_802_11W
  2591. if (kalGetMfpSetting(prAdapter->prGlueInfo) != RSN_AUTH_MFP_DISABLED) {
  2592. if ((u4AkmSuite == RSN_AKM_SUITE_PSK) &&
  2593. prEntry->dot11RSNAConfigAuthenticationSuite == RSN_AKM_SUITE_PSK_SHA256) {
  2594. DBGLOG(RSN, TRACE, "Enable RSN_AKM_SUITE_PSK_SHA256 AKM support\n");
  2595. prEntry->dot11RSNAConfigAuthenticationSuiteEnabled = TRUE;
  2596. }
  2597. if ((u4AkmSuite == RSN_AKM_SUITE_802_1X) &&
  2598. prEntry->dot11RSNAConfigAuthenticationSuite == RSN_AKM_SUITE_802_1X_SHA256) {
  2599. DBGLOG(RSN, TRACE, "Enable RSN_AKM_SUITE_802_1X_SHA256 AKM support\n");
  2600. prEntry->dot11RSNAConfigAuthenticationSuiteEnabled = TRUE;
  2601. }
  2602. }
  2603. #endif
  2604. }
  2605. #endif
  2606. return WLAN_STATUS_SUCCESS;
  2607. } /* wlanoidSetAuthMode */
  2608. #if 0
  2609. /*----------------------------------------------------------------------------*/
  2610. /*!
  2611. * \brief This routine is called to query the current 802.11 privacy filter
  2612. *
  2613. * \param[in] prAdapter Pointer to the Adapter structure.
  2614. * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
  2615. * the query.
  2616. * \param[in] u4QueryBufferLen The length of the query buffer.
  2617. * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
  2618. * bytes written into the query buffer. If the call
  2619. * failed due to invalid length of the query buffer,
  2620. * returns the amount of storage needed.
  2621. *
  2622. * \retval WLAN_STATUS_SUCCESS
  2623. * \retval WLAN_STATUS_BUFFER_TOO_SHORT
  2624. */
  2625. /*----------------------------------------------------------------------------*/
  2626. WLAN_STATUS
  2627. wlanoidQueryPrivacyFilter(IN P_ADAPTER_T prAdapter,
  2628. OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  2629. {
  2630. DEBUGFUNC("wlanoidQueryPrivacyFilter");
  2631. ASSERT(prAdapter);
  2632. ASSERT(pvQueryBuffer);
  2633. ASSERT(pu4QueryInfoLen);
  2634. *pu4QueryInfoLen = sizeof(ENUM_PARAM_PRIVACY_FILTER_T);
  2635. if (u4QueryBufferLen < sizeof(ENUM_PARAM_PRIVACY_FILTER_T))
  2636. return WLAN_STATUS_BUFFER_TOO_SHORT;
  2637. *(P_ENUM_PARAM_PRIVACY_FILTER_T) pvQueryBuffer = prAdapter->rWlanInfo.ePrivacyFilter;
  2638. #if DBG
  2639. switch (*(P_ENUM_PARAM_PRIVACY_FILTER_T) pvQueryBuffer) {
  2640. case PRIVACY_FILTER_ACCEPT_ALL:
  2641. DBGLOG(OID, INFO, "Current privacy mode: open mode\n");
  2642. break;
  2643. case PRIVACY_FILTER_8021xWEP:
  2644. DBGLOG(OID, INFO, "Current privacy mode: filtering mode\n");
  2645. break;
  2646. default:
  2647. DBGLOG(OID, INFO, "Current auth mode: %d\n", *(P_ENUM_PARAM_AUTH_MODE_T) pvQueryBuffer);
  2648. }
  2649. #endif
  2650. return WLAN_STATUS_SUCCESS;
  2651. } /* wlanoidQueryPrivacyFilter */
  2652. /*----------------------------------------------------------------------------*/
  2653. /*!
  2654. * \brief This routine is called to set the IEEE 802.11 privacy filter
  2655. * to the driver.
  2656. *
  2657. * \param[in] prAdapter Pointer to the Adapter structure.
  2658. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  2659. * \param[in] u4SetBufferLen The length of the set buffer.
  2660. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  2661. * bytes read from the set buffer. If the call failed
  2662. * due to invalid length of the set buffer, returns
  2663. * the amount of storage needed.
  2664. *
  2665. * \retval WLAN_STATUS_SUCCESS
  2666. * \retval WLAN_STATUS_INVALID_DATA
  2667. * \retval WLAN_STATUS_INVALID_LENGTH
  2668. * \retval WLAN_STATUS_ADAPTER_NOT_READY
  2669. * \retval WLAN_STATUS_NOT_ACCEPTED
  2670. */
  2671. /*----------------------------------------------------------------------------*/
  2672. WLAN_STATUS
  2673. wlanoidSetPrivacyFilter(IN P_ADAPTER_T prAdapter,
  2674. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  2675. {
  2676. P_GLUE_INFO_T prGlueInfo;
  2677. DEBUGFUNC("wlanoidSetPrivacyFilter");
  2678. ASSERT(prAdapter);
  2679. ASSERT(pu4SetInfoLen);
  2680. ASSERT(pvSetBuffer);
  2681. prGlueInfo = prAdapter->prGlueInfo;
  2682. *pu4SetInfoLen = sizeof(ENUM_PARAM_PRIVACY_FILTER_T);
  2683. if (u4SetBufferLen < sizeof(ENUM_PARAM_PRIVACY_FILTER_T))
  2684. return WLAN_STATUS_INVALID_LENGTH;
  2685. if (prAdapter->rAcpiState == ACPI_STATE_D3) {
  2686. DBGLOG(OID, WARN,
  2687. "Fail in set Authentication mode! (Adapter not ready). ACPI=D%d, Radio=%d\n",
  2688. prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
  2689. return WLAN_STATUS_ADAPTER_NOT_READY;
  2690. }
  2691. /* Check if the new authentication mode is valid. */
  2692. if (*(P_ENUM_PARAM_PRIVACY_FILTER_T) pvSetBuffer >= PRIVACY_FILTER_NUM) {
  2693. DBGLOG(OID, TRACE, "Invalid privacy filter %d\n", *(P_ENUM_PARAM_PRIVACY_FILTER_T) pvSetBuffer);
  2694. return WLAN_STATUS_INVALID_DATA;
  2695. }
  2696. switch (*(P_ENUM_PARAM_PRIVACY_FILTER_T) pvSetBuffer) {
  2697. default:
  2698. break;
  2699. }
  2700. /* Save the new authentication mode. */
  2701. prAdapter->rWlanInfo.ePrivacyFilter = *(ENUM_PARAM_PRIVACY_FILTER_T) pvSetBuffer;
  2702. return WLAN_STATUS_SUCCESS;
  2703. } /* wlanoidSetPrivacyFilter */
  2704. #endif
  2705. /*----------------------------------------------------------------------------*/
  2706. /*!
  2707. * \brief This routine is called to reload the available default settings for
  2708. * the specified type field.
  2709. *
  2710. * \param[in] prAdapter Pointer to the Adapter structure.
  2711. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  2712. * \param[in] u4SetBufferLen The length of the set buffer.
  2713. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  2714. * bytes read from the set buffer. If the call failed
  2715. * due to invalid length of the set buffer, returns
  2716. * the amount of storage needed.
  2717. *
  2718. * \retval WLAN_STATUS_SUCCESS
  2719. * \retval WLAN_STATUS_ADAPTER_NOT_READY
  2720. * \retval WLAN_STATUS_INVALID_DATA
  2721. */
  2722. /*----------------------------------------------------------------------------*/
  2723. WLAN_STATUS
  2724. wlanoidSetReloadDefaults(IN P_ADAPTER_T prAdapter,
  2725. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  2726. {
  2727. WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
  2728. ENUM_PARAM_NETWORK_TYPE_T eNetworkType;
  2729. UINT_32 u4Len;
  2730. UINT_8 ucCmdSeqNum;
  2731. DEBUGFUNC("wlanoidSetReloadDefaults");
  2732. ASSERT(prAdapter);
  2733. ASSERT(pu4SetInfoLen);
  2734. *pu4SetInfoLen = sizeof(PARAM_RELOAD_DEFAULTS);
  2735. /* if (IS_ARB_IN_RFTEST_STATE(prAdapter)) { */
  2736. /* return WLAN_STATUS_SUCCESS; */
  2737. /* } */
  2738. if (prAdapter->rAcpiState == ACPI_STATE_D3) {
  2739. DBGLOG(OID, WARN,
  2740. "Fail in set Reload default! (Adapter not ready). ACPI=D%d, Radio=%d\n",
  2741. prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
  2742. return WLAN_STATUS_ADAPTER_NOT_READY;
  2743. }
  2744. ASSERT(pvSetBuffer);
  2745. /* Verify the available reload options and reload the settings. */
  2746. switch (*(P_PARAM_RELOAD_DEFAULTS) pvSetBuffer) {
  2747. case ENUM_RELOAD_WEP_KEYS:
  2748. /* Reload available default WEP keys from the permanent
  2749. storage. */
  2750. prAdapter->rWifiVar.rConnSettings.eAuthMode = AUTH_MODE_OPEN;
  2751. /* ENUM_ENCRYPTION_DISABLED; */
  2752. prAdapter->rWifiVar.rConnSettings.eEncStatus = ENUM_ENCRYPTION1_KEY_ABSENT;
  2753. {
  2754. P_GLUE_INFO_T prGlueInfo;
  2755. P_CMD_INFO_T prCmdInfo;
  2756. P_WIFI_CMD_T prWifiCmd;
  2757. P_CMD_802_11_KEY prCmdKey;
  2758. UINT_8 aucBCAddr[] = BC_MAC_ADDR;
  2759. prGlueInfo = prAdapter->prGlueInfo;
  2760. prCmdInfo = cmdBufAllocateCmdInfo(prAdapter, (CMD_HDR_SIZE + sizeof(CMD_802_11_KEY)));
  2761. if (!prCmdInfo) {
  2762. DBGLOG(OID, ERROR, "Allocate CMD_INFO_T ==> FAILED.\n");
  2763. return WLAN_STATUS_FAILURE;
  2764. }
  2765. /* increase command sequence number */
  2766. ucCmdSeqNum = nicIncreaseCmdSeqNum(prAdapter);
  2767. /* compose CMD_802_11_KEY cmd pkt */
  2768. prCmdInfo->eCmdType = COMMAND_TYPE_NETWORK_IOCTL;
  2769. prCmdInfo->ucBssIndex = prAdapter->prAisBssInfo->ucBssIndex;
  2770. prCmdInfo->u2InfoBufLen = CMD_HDR_SIZE + sizeof(CMD_802_11_KEY);
  2771. prCmdInfo->pfCmdDoneHandler = nicCmdEventSetCommon;
  2772. prCmdInfo->pfCmdTimeoutHandler = nicOidCmdTimeoutCommon;
  2773. prCmdInfo->fgIsOid = TRUE;
  2774. prCmdInfo->ucCID = CMD_ID_ADD_REMOVE_KEY;
  2775. prCmdInfo->fgSetQuery = TRUE;
  2776. prCmdInfo->fgNeedResp = FALSE;
  2777. prCmdInfo->fgDriverDomainMCR = FALSE;
  2778. prCmdInfo->ucCmdSeqNum = ucCmdSeqNum;
  2779. prCmdInfo->u4SetInfoLen = sizeof(PARAM_REMOVE_KEY_T);
  2780. prCmdInfo->pvInformationBuffer = pvSetBuffer;
  2781. prCmdInfo->u4InformationBufferLength = u4SetBufferLen;
  2782. /* Setup WIFI_CMD_T */
  2783. prWifiCmd = (P_WIFI_CMD_T) (prCmdInfo->pucInfoBuffer);
  2784. prWifiCmd->u2TxByteCount = prCmdInfo->u2InfoBufLen;
  2785. prWifiCmd->u2PQ_ID = CMD_PQ_ID;
  2786. prWifiCmd->ucPktTypeID = CMD_PACKET_TYPE_ID;
  2787. prWifiCmd->ucCID = prCmdInfo->ucCID;
  2788. prWifiCmd->ucSetQuery = prCmdInfo->fgSetQuery;
  2789. prWifiCmd->ucSeqNum = prCmdInfo->ucCmdSeqNum;
  2790. prCmdKey = (P_CMD_802_11_KEY) (prWifiCmd->aucBuffer);
  2791. kalMemZero((PUINT_8) prCmdKey, sizeof(CMD_802_11_KEY));
  2792. prCmdKey->ucAddRemove = 0; /* Remove */
  2793. prCmdKey->ucKeyId = 0; /* (UINT_8)(prRemovedKey->u4KeyIndex & 0x000000ff); */
  2794. kalMemCopy(prCmdKey->aucPeerAddr, aucBCAddr, MAC_ADDR_LEN);
  2795. ASSERT(prCmdKey->ucKeyId < MAX_KEY_NUM);
  2796. prCmdKey->ucKeyType = 0;
  2797. /* insert into prCmdQueue */
  2798. kalEnqueueCommand(prGlueInfo, (P_QUE_ENTRY_T) prCmdInfo);
  2799. /* wakeup txServiceThread later */
  2800. GLUE_SET_EVENT(prGlueInfo);
  2801. return WLAN_STATUS_PENDING;
  2802. }
  2803. break;
  2804. default:
  2805. DBGLOG(OID, TRACE, "Invalid reload option %d\n", *(P_PARAM_RELOAD_DEFAULTS) pvSetBuffer);
  2806. rStatus = WLAN_STATUS_INVALID_DATA;
  2807. }
  2808. /* OID_802_11_RELOAD_DEFAULTS requiest to reset to auto mode */
  2809. eNetworkType = PARAM_NETWORK_TYPE_AUTOMODE;
  2810. wlanoidSetNetworkTypeInUse(prAdapter, &eNetworkType, sizeof(eNetworkType), &u4Len);
  2811. return rStatus;
  2812. } /* wlanoidSetReloadDefaults */
  2813. /*----------------------------------------------------------------------------*/
  2814. /*!
  2815. * \brief This routine is called to set a WEP key to the driver.
  2816. *
  2817. * \param[in] prAdapter Pointer to the Adapter structure.
  2818. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  2819. * \param[in] u4SetBufferLen The length of the set buffer.
  2820. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  2821. * bytes read from the set buffer. If the call failed
  2822. * due to invalid length of the set buffer, returns
  2823. * the amount of storage needed.
  2824. *
  2825. * \retval WLAN_STATUS_SUCCESS
  2826. * \retval WLAN_STATUS_INVALID_LENGTH
  2827. * \retval WLAN_STATUS_INVALID_DATA
  2828. * \retval WLAN_STATUS_ADAPTER_NOT_READY
  2829. * \retval WLAN_STATUS_BUFFER_TOO_SHORT
  2830. */
  2831. /*----------------------------------------------------------------------------*/
  2832. #ifdef LINUX
  2833. UINT_8 keyBuffer[sizeof(PARAM_KEY_T) + 16 /* LEGACY_KEY_MAX_LEN */];
  2834. UINT_8 aucBCAddr[] = BC_MAC_ADDR;
  2835. #endif
  2836. WLAN_STATUS
  2837. wlanoidSetAddWep(IN P_ADAPTER_T prAdapter, IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  2838. {
  2839. #ifndef LINUX
  2840. UINT_8 keyBuffer[sizeof(PARAM_KEY_T) + 16 /* LEGACY_KEY_MAX_LEN */];
  2841. UINT_8 aucBCAddr[] = BC_MAC_ADDR;
  2842. #endif
  2843. P_PARAM_WEP_T prNewWepKey;
  2844. P_PARAM_KEY_T prParamKey = (P_PARAM_KEY_T) keyBuffer;
  2845. UINT_32 u4KeyId, u4SetLen;
  2846. DEBUGFUNC("wlanoidSetAddWep");
  2847. ASSERT(prAdapter);
  2848. *pu4SetInfoLen = OFFSET_OF(PARAM_WEP_T, aucKeyMaterial);
  2849. if (u4SetBufferLen < OFFSET_OF(PARAM_WEP_T, aucKeyMaterial)) {
  2850. ASSERT(pu4SetInfoLen);
  2851. return WLAN_STATUS_BUFFER_TOO_SHORT;
  2852. }
  2853. ASSERT(pvSetBuffer);
  2854. ASSERT(pu4SetInfoLen);
  2855. if (prAdapter->rAcpiState == ACPI_STATE_D3) {
  2856. DBGLOG(OID, WARN, "Fail in set add WEP! (Adapter not ready). ACPI=D%d, Radio=%d\n",
  2857. prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
  2858. return WLAN_STATUS_ADAPTER_NOT_READY;
  2859. }
  2860. prNewWepKey = (P_PARAM_WEP_T) pvSetBuffer;
  2861. /* Verify the total buffer for minimum length. */
  2862. if (u4SetBufferLen < OFFSET_OF(PARAM_WEP_T, aucKeyMaterial) + prNewWepKey->u4KeyLength) {
  2863. DBGLOG(OID, WARN, "Invalid total buffer length (%d) than minimum length (%d)\n",
  2864. (UINT_8) u4SetBufferLen, (UINT_8) OFFSET_OF(PARAM_WEP_T, aucKeyMaterial));
  2865. *pu4SetInfoLen = OFFSET_OF(PARAM_WEP_T, aucKeyMaterial);
  2866. return WLAN_STATUS_INVALID_DATA;
  2867. }
  2868. /* Verify the key structure length. */
  2869. if (prNewWepKey->u4Length > u4SetBufferLen) {
  2870. DBGLOG(OID, WARN,
  2871. "Invalid key structure length (%d) greater than total buffer length (%d)\n",
  2872. (UINT_8) prNewWepKey->u4Length, (UINT_8) u4SetBufferLen);
  2873. *pu4SetInfoLen = u4SetBufferLen;
  2874. return WLAN_STATUS_INVALID_DATA;
  2875. }
  2876. /* Verify the key material length for maximum key material length:16 */
  2877. if (prNewWepKey->u4KeyLength > 16 /* LEGACY_KEY_MAX_LEN */) {
  2878. DBGLOG(OID, WARN,
  2879. "Invalid key material length (%d) greater than maximum key material length (16)\n",
  2880. (UINT_8) prNewWepKey->u4KeyLength);
  2881. *pu4SetInfoLen = u4SetBufferLen;
  2882. return WLAN_STATUS_INVALID_DATA;
  2883. }
  2884. *pu4SetInfoLen = u4SetBufferLen;
  2885. u4KeyId = prNewWepKey->u4KeyIndex & BITS(0, 29) /* WEP_KEY_ID_FIELD */;
  2886. /* Verify whether key index is valid or not, current version
  2887. driver support only 4 global WEP keys setting by this OID */
  2888. if (u4KeyId > MAX_KEY_NUM - 1) {
  2889. DBGLOG(OID, ERROR, "Error, invalid WEP key ID: %d\n", (UINT_8) u4KeyId);
  2890. return WLAN_STATUS_INVALID_DATA;
  2891. }
  2892. prParamKey->u4KeyIndex = u4KeyId;
  2893. /* Transmit key */
  2894. if (prNewWepKey->u4KeyIndex & IS_TRANSMIT_KEY)
  2895. prParamKey->u4KeyIndex |= IS_TRANSMIT_KEY;
  2896. /* Per client key */
  2897. if (prNewWepKey->u4KeyIndex & IS_UNICAST_KEY)
  2898. prParamKey->u4KeyIndex |= IS_UNICAST_KEY;
  2899. prParamKey->u4KeyLength = prNewWepKey->u4KeyLength;
  2900. kalMemCopy(prParamKey->arBSSID, aucBCAddr, MAC_ADDR_LEN);
  2901. kalMemCopy(prParamKey->aucKeyMaterial, prNewWepKey->aucKeyMaterial, prNewWepKey->u4KeyLength);
  2902. prParamKey->u4Length = OFFSET_OF(PARAM_KEY_T, aucKeyMaterial) + prNewWepKey->u4KeyLength;
  2903. wlanoidSetAddKey(prAdapter, (PVOID) prParamKey, prParamKey->u4Length, &u4SetLen);
  2904. return WLAN_STATUS_PENDING;
  2905. } /* wlanoidSetAddWep */
  2906. /*----------------------------------------------------------------------------*/
  2907. /*!
  2908. * \brief This routine is called to request the driver to remove the WEP key
  2909. * at the specified key index.
  2910. *
  2911. * \param[in] prAdapter Pointer to the Adapter structure.
  2912. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  2913. * \param[in] u4SetBufferLen The length of the set buffer.
  2914. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  2915. * bytes read from the set buffer. If the call failed
  2916. * due to invalid length of the set buffer, returns
  2917. * the amount of storage needed.
  2918. *
  2919. * \retval WLAN_STATUS_SUCCESS
  2920. * \retval WLAN_STATUS_INVALID_DATA
  2921. * \retval WLAN_STATUS_INVALID_LENGTH
  2922. * \retval WLAN_STATUS_ADAPTER_NOT_READY
  2923. */
  2924. /*----------------------------------------------------------------------------*/
  2925. WLAN_STATUS
  2926. wlanoidSetRemoveWep(IN P_ADAPTER_T prAdapter,
  2927. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  2928. {
  2929. UINT_32 u4KeyId, u4SetLen;
  2930. PARAM_REMOVE_KEY_T rRemoveKey;
  2931. UINT_8 aucBCAddr[] = BC_MAC_ADDR;
  2932. DEBUGFUNC("wlanoidSetRemoveWep");
  2933. ASSERT(prAdapter);
  2934. ASSERT(pu4SetInfoLen);
  2935. *pu4SetInfoLen = sizeof(PARAM_KEY_INDEX);
  2936. if (u4SetBufferLen < sizeof(PARAM_KEY_INDEX))
  2937. return WLAN_STATUS_INVALID_LENGTH;
  2938. ASSERT(pvSetBuffer);
  2939. u4KeyId = *(PUINT_32) pvSetBuffer;
  2940. /* Dump PARAM_WEP content. */
  2941. DBGLOG(OID, INFO, "Set: Dump PARAM_KEY_INDEX content\n");
  2942. DBGLOG(OID, INFO, "Index : 0x%08lx\n", u4KeyId);
  2943. if (prAdapter->rAcpiState == ACPI_STATE_D3) {
  2944. DBGLOG(OID, WARN,
  2945. "Fail in set remove WEP! (Adapter not ready). ACPI=D%d, Radio=%d\n",
  2946. prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
  2947. return WLAN_STATUS_ADAPTER_NOT_READY;
  2948. }
  2949. if (u4KeyId & IS_TRANSMIT_KEY) {
  2950. /* Bit 31 should not be set */
  2951. DBGLOG(OID, ERROR, "Invalid WEP key index: 0x%08lx\n", u4KeyId);
  2952. return WLAN_STATUS_INVALID_DATA;
  2953. }
  2954. u4KeyId &= BITS(0, 7);
  2955. /* Verify whether key index is valid or not. Current version
  2956. driver support only 4 global WEP keys. */
  2957. if (u4KeyId > MAX_KEY_NUM - 1) {
  2958. DBGLOG(OID, ERROR, "invalid WEP key ID %lu\n", u4KeyId);
  2959. return WLAN_STATUS_INVALID_DATA;
  2960. }
  2961. rRemoveKey.u4Length = sizeof(PARAM_REMOVE_KEY_T);
  2962. rRemoveKey.u4KeyIndex = *(PUINT_32) pvSetBuffer;
  2963. kalMemCopy(rRemoveKey.arBSSID, aucBCAddr, MAC_ADDR_LEN);
  2964. wlanoidSetRemoveKey(prAdapter, (PVOID)&rRemoveKey, sizeof(PARAM_REMOVE_KEY_T), &u4SetLen);
  2965. return WLAN_STATUS_PENDING;
  2966. } /* wlanoidSetRemoveWep */
  2967. /*----------------------------------------------------------------------------*/
  2968. /*!
  2969. * \brief This routine is called to set a key to the driver.
  2970. *
  2971. * \param[in] prAdapter Pointer to the Adapter structure.
  2972. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  2973. * \param[in] u4SetBufferLen The length of the set buffer.
  2974. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  2975. * bytes read from the set buffer. If the call failed
  2976. * due to invalid length of the set buffer, returns
  2977. * the amount of storage needed.
  2978. *
  2979. * \retval WLAN_STATUS_SUCCESS
  2980. * \retval WLAN_STATUS_ADAPTER_NOT_READY
  2981. * \retval WLAN_STATUS_INVALID_LENGTH
  2982. * \retval WLAN_STATUS_INVALID_DATA
  2983. *
  2984. * \note The setting buffer PARAM_KEY_T, which is set by NDIS, is unpacked.
  2985. */
  2986. /*----------------------------------------------------------------------------*/
  2987. WLAN_STATUS
  2988. wlanoidSetAddKey(IN P_ADAPTER_T prAdapter, IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  2989. {
  2990. P_GLUE_INFO_T prGlueInfo;
  2991. P_CMD_INFO_T prCmdInfo;
  2992. P_WIFI_CMD_T prWifiCmd;
  2993. P_PARAM_KEY_T prNewKey;
  2994. P_CMD_802_11_KEY prCmdKey;
  2995. UINT_8 ucCmdSeqNum;
  2996. P_BSS_INFO_T prBssInfo;
  2997. P_AIS_SPECIFIC_BSS_INFO_T prAisSpecBssInfo;
  2998. P_WLAN_TABLE_T prWlanTable;
  2999. P_STA_RECORD_T prStaRec = NULL;
  3000. BOOL fgAddTxBcKey = FALSE;
  3001. #if CFG_SUPPORT_TDLS
  3002. P_STA_RECORD_T prTmpStaRec;
  3003. #endif
  3004. DEBUGFUNC("wlanoidSetAddKey");
  3005. DBGLOG(OID, LOUD, "\n");
  3006. ASSERT(prAdapter);
  3007. ASSERT(pvSetBuffer);
  3008. ASSERT(pu4SetInfoLen);
  3009. DBGLOG(RSN, TRACE, "wlanoidSetAddKey\n");
  3010. if (prAdapter->rAcpiState == ACPI_STATE_D3) {
  3011. DBGLOG(OID, WARN, "Fail in set add key! (Adapter not ready). ACPI=D%d, Radio=%d\n",
  3012. prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
  3013. return WLAN_STATUS_ADAPTER_NOT_READY;
  3014. }
  3015. prNewKey = (P_PARAM_KEY_T) pvSetBuffer;
  3016. /* Verify the key structure length. */
  3017. if (prNewKey->u4Length > u4SetBufferLen) {
  3018. DBGLOG(OID, WARN,
  3019. "Invalid key structure length (%d) greater than total buffer length (%d)\n",
  3020. (UINT_8) prNewKey->u4Length, (UINT_8) u4SetBufferLen);
  3021. *pu4SetInfoLen = u4SetBufferLen;
  3022. return WLAN_STATUS_INVALID_LENGTH;
  3023. }
  3024. /* Verify the key material length for key material buffer */
  3025. if (prNewKey->u4KeyLength > prNewKey->u4Length - OFFSET_OF(PARAM_KEY_T, aucKeyMaterial)) {
  3026. DBGLOG(OID, WARN, "Invalid key material length (%d)\n", (UINT_8) prNewKey->u4KeyLength);
  3027. *pu4SetInfoLen = u4SetBufferLen;
  3028. return WLAN_STATUS_INVALID_DATA;
  3029. }
  3030. /* Exception check */
  3031. if (prNewKey->u4KeyIndex & 0x0fffff00)
  3032. return WLAN_STATUS_INVALID_DATA;
  3033. /* Exception check, pairwise key must with transmit bit enabled */
  3034. if ((prNewKey->u4KeyIndex & BITS(30, 31)) == IS_UNICAST_KEY)
  3035. return WLAN_STATUS_INVALID_DATA;
  3036. if (!(prNewKey->u4KeyLength == WEP_40_LEN || prNewKey->u4KeyLength == WEP_104_LEN ||
  3037. prNewKey->u4KeyLength == CCMP_KEY_LEN || prNewKey->u4KeyLength == TKIP_KEY_LEN)) {
  3038. return WLAN_STATUS_INVALID_DATA;
  3039. }
  3040. /* Exception check, pairwise key must with transmit bit enabled */
  3041. if ((prNewKey->u4KeyIndex & BITS(30, 31)) == BITS(30, 31)) {
  3042. if (((prNewKey->u4KeyIndex & 0xff) != 0) ||
  3043. ((prNewKey->arBSSID[0] == 0xff) && (prNewKey->arBSSID[1] == 0xff)
  3044. && (prNewKey->arBSSID[2] == 0xff) && (prNewKey->arBSSID[3] == 0xff)
  3045. && (prNewKey->arBSSID[4] == 0xff) && (prNewKey->arBSSID[5] == 0xff))) {
  3046. return WLAN_STATUS_INVALID_DATA;
  3047. }
  3048. }
  3049. *pu4SetInfoLen = u4SetBufferLen;
  3050. /* Dump PARAM_KEY content. */
  3051. DBGLOG(OID, TRACE, "Set: PARAM_KEY Length: 0x%08x, Key Index : 0x%08x, Key Length: 0x%08x\n",
  3052. prNewKey->u4Length, prNewKey->u4KeyIndex, prNewKey->u4KeyLength);
  3053. DBGLOG(OID, TRACE, "BSSID:\n");
  3054. DBGLOG(OID, TRACE, MACSTR "\n", MAC2STR(prNewKey->arBSSID));
  3055. DBGLOG(OID, TRACE, "Key RSC:\n");
  3056. DBGLOG_MEM8(OID, TRACE, &prNewKey->rKeyRSC, sizeof(PARAM_KEY_RSC));
  3057. DBGLOG(OID, TRACE, "Key Material:\n");
  3058. DBGLOG_MEM8(OID, TRACE, prNewKey->aucKeyMaterial, prNewKey->u4KeyLength);
  3059. prAisSpecBssInfo = &prAdapter->rWifiVar.rAisSpecificBssInfo;
  3060. prBssInfo = prAdapter->prAisBssInfo;
  3061. if (prAdapter->rWifiVar.rConnSettings.eAuthMode >= AUTH_MODE_WPA &&
  3062. prAdapter->rWifiVar.rConnSettings.eAuthMode != AUTH_MODE_WPA_NONE) {
  3063. if ((prNewKey->arBSSID[0] & prNewKey->arBSSID[1] & prNewKey->arBSSID[2] &
  3064. prNewKey->arBSSID[3] & prNewKey->arBSSID[4] & prNewKey->arBSSID[5]) == 0xFF) {
  3065. prStaRec = cnmGetStaRecByAddress(prAdapter, prBssInfo->ucBssIndex, prBssInfo->aucBSSID);
  3066. } else {
  3067. prStaRec = cnmGetStaRecByAddress(prAdapter, prBssInfo->ucBssIndex, prNewKey->arBSSID);
  3068. }
  3069. if (!prStaRec) { /* Already disconnected ? */
  3070. DBGLOG(OID, INFO, "[wlan] Not set the WPA key while disconnect\n");
  3071. return WLAN_STATUS_SUCCESS;
  3072. }
  3073. }
  3074. prWlanTable = prAdapter->rWifiVar.arWtbl;
  3075. prGlueInfo = prAdapter->prGlueInfo;
  3076. prCmdInfo = cmdBufAllocateCmdInfo(prAdapter, (CMD_HDR_SIZE + sizeof(CMD_802_11_KEY)));
  3077. if (!prCmdInfo) {
  3078. DBGLOG(OID, ERROR, "Allocate CMD_INFO_T ==> FAILED.\n");
  3079. return WLAN_STATUS_FAILURE;
  3080. }
  3081. /* increase command sequence number */
  3082. ucCmdSeqNum = nicIncreaseCmdSeqNum(prAdapter);
  3083. DBGLOG(OID, TRACE, "ucCmdSeqNum = %d\n", ucCmdSeqNum);
  3084. /* compose CMD_802_11_KEY cmd pkt */
  3085. prCmdInfo->eCmdType = COMMAND_TYPE_NETWORK_IOCTL;
  3086. prCmdInfo->ucBssIndex = prBssInfo->ucBssIndex;
  3087. prCmdInfo->u2InfoBufLen = CMD_HDR_SIZE + sizeof(CMD_802_11_KEY);
  3088. prCmdInfo->pfCmdDoneHandler = nicCmdEventSetCommon;
  3089. prCmdInfo->pfCmdTimeoutHandler = nicOidCmdTimeoutCommon;
  3090. prCmdInfo->fgIsOid = TRUE;
  3091. prCmdInfo->ucCID = CMD_ID_ADD_REMOVE_KEY;
  3092. prCmdInfo->fgSetQuery = TRUE;
  3093. prCmdInfo->fgNeedResp = FALSE;
  3094. prCmdInfo->fgDriverDomainMCR = FALSE;
  3095. prCmdInfo->ucCmdSeqNum = ucCmdSeqNum;
  3096. prCmdInfo->u4SetInfoLen = u4SetBufferLen;
  3097. prCmdInfo->pvInformationBuffer = pvSetBuffer;
  3098. prCmdInfo->u4InformationBufferLength = u4SetBufferLen;
  3099. /* Setup WIFI_CMD_T */
  3100. prWifiCmd = (P_WIFI_CMD_T) (prCmdInfo->pucInfoBuffer);
  3101. prWifiCmd->u2TxByteCount = prCmdInfo->u2InfoBufLen;
  3102. prWifiCmd->u2PQ_ID = CMD_PQ_ID;
  3103. prWifiCmd->ucPktTypeID = CMD_PACKET_TYPE_ID;
  3104. prWifiCmd->ucCID = prCmdInfo->ucCID;
  3105. prWifiCmd->ucSetQuery = prCmdInfo->fgSetQuery;
  3106. prWifiCmd->ucSeqNum = prCmdInfo->ucCmdSeqNum;
  3107. prCmdKey = (P_CMD_802_11_KEY) (prWifiCmd->aucBuffer);
  3108. kalMemZero(prCmdKey, sizeof(CMD_802_11_KEY));
  3109. prCmdKey->ucAddRemove = 1; /* Add */
  3110. prCmdKey->ucTxKey = ((prNewKey->u4KeyIndex & IS_TRANSMIT_KEY) == IS_TRANSMIT_KEY) ? 1 : 0;
  3111. prCmdKey->ucKeyType = ((prNewKey->u4KeyIndex & IS_UNICAST_KEY) == IS_UNICAST_KEY) ? 1 : 0;
  3112. prCmdKey->ucIsAuthenticator = ((prNewKey->u4KeyIndex & IS_AUTHENTICATOR) == IS_AUTHENTICATOR) ? 1 : 0;
  3113. kalMemCopy(prCmdKey->aucPeerAddr, (PUINT_8) prNewKey->arBSSID, MAC_ADDR_LEN);
  3114. prCmdKey->ucBssIdx = prBssInfo->ucBssIndex; /* AIS BSS */
  3115. prCmdKey->ucKeyId = (UINT_8) (prNewKey->u4KeyIndex & 0xff);
  3116. /* Note: adjust the key length for WPA-None */
  3117. prCmdKey->ucKeyLen = (UINT_8) prNewKey->u4KeyLength;
  3118. kalMemCopy(prCmdKey->aucKeyMaterial, (PUINT_8) prNewKey->aucKeyMaterial, prCmdKey->ucKeyLen);
  3119. if (prNewKey->u4KeyLength == 5) {
  3120. prCmdKey->ucAlgorithmId = CIPHER_SUITE_WEP40;
  3121. } else if (prNewKey->u4KeyLength == 13) {
  3122. prCmdKey->ucAlgorithmId = CIPHER_SUITE_WEP104;
  3123. } else if (prNewKey->u4KeyLength == 16) {
  3124. if (prAdapter->rWifiVar.rConnSettings.eAuthMode < AUTH_MODE_WPA)
  3125. prCmdKey->ucAlgorithmId = CIPHER_SUITE_WEP128;
  3126. else {
  3127. #if CFG_SUPPORT_802_11W
  3128. if (prCmdKey->ucKeyId >= 4) {
  3129. P_AIS_SPECIFIC_BSS_INFO_T prAisSpecBssInfo;
  3130. prCmdKey->ucAlgorithmId = CIPHER_SUITE_BIP;
  3131. prAisSpecBssInfo = &prAdapter->rWifiVar.rAisSpecificBssInfo;
  3132. prAisSpecBssInfo->fgBipKeyInstalled = TRUE;
  3133. } else
  3134. #endif
  3135. {
  3136. prCmdKey->ucAlgorithmId = CIPHER_SUITE_CCMP;
  3137. if (rsnCheckPmkidCandicate(prAdapter)) {
  3138. DBGLOG(RSN, TRACE,
  3139. "Add key: Prepare a timer to indicate candidate PMKID Candidate\n");
  3140. cnmTimerStopTimer(prAdapter, &prAisSpecBssInfo->rPreauthenticationTimer);
  3141. cnmTimerStartTimer(prAdapter,
  3142. &prAisSpecBssInfo->rPreauthenticationTimer,
  3143. SEC_TO_MSEC(WAIT_TIME_IND_PMKID_CANDICATE_SEC));
  3144. }
  3145. }
  3146. }
  3147. } else if (prNewKey->u4KeyLength == 32) {
  3148. if (prAdapter->rWifiVar.rConnSettings.eAuthMode == AUTH_MODE_WPA_NONE) {
  3149. if (prAdapter->rWifiVar.rConnSettings.eEncStatus == ENUM_ENCRYPTION2_ENABLED)
  3150. prCmdKey->ucAlgorithmId = CIPHER_SUITE_TKIP;
  3151. else if (prAdapter->rWifiVar.rConnSettings.eEncStatus == ENUM_ENCRYPTION3_ENABLED) {
  3152. prCmdKey->ucAlgorithmId = CIPHER_SUITE_CCMP;
  3153. prCmdKey->ucKeyLen = CCMP_KEY_LEN;
  3154. }
  3155. } else {
  3156. prCmdKey->ucAlgorithmId = CIPHER_SUITE_TKIP;
  3157. kalMemCopy(prAdapter->rWifiVar.rAisSpecificBssInfo.aucRxMicKey,
  3158. &prCmdKey->aucKeyMaterial[16], MIC_KEY_LEN);
  3159. kalMemCopy(prAdapter->rWifiVar.rAisSpecificBssInfo.aucTxMicKey,
  3160. &prCmdKey->aucKeyMaterial[24], MIC_KEY_LEN);
  3161. if (0 /* Todo::GCMP & GCMP-BIP ? */) {
  3162. if (rsnCheckPmkidCandicate(prAdapter)) {
  3163. DBGLOG(RSN, TRACE,
  3164. "Add key: Prepare a timer to indicate candidate PMKID Candidate\n");
  3165. cnmTimerStopTimer(prAdapter, &prAisSpecBssInfo->rPreauthenticationTimer);
  3166. cnmTimerStartTimer(prAdapter,
  3167. &prAisSpecBssInfo->rPreauthenticationTimer,
  3168. SEC_TO_MSEC(WAIT_TIME_IND_PMKID_CANDICATE_SEC));
  3169. }
  3170. } else {
  3171. prCmdKey->ucAlgorithmId = CIPHER_SUITE_TKIP;
  3172. }
  3173. }
  3174. }
  3175. {
  3176. if ((prCmdKey->aucPeerAddr[0] & prCmdKey->aucPeerAddr[1] & prCmdKey->aucPeerAddr[2] & prCmdKey->
  3177. aucPeerAddr[3] & prCmdKey->aucPeerAddr[4] & prCmdKey->aucPeerAddr[5]) == 0xFF) {
  3178. if (prAdapter->rWifiVar.rConnSettings.eAuthMode >= AUTH_MODE_WPA
  3179. && prAdapter->rWifiVar.rConnSettings.eAuthMode != AUTH_MODE_WPA_NONE
  3180. && 1 /* Connected */) {
  3181. prStaRec = cnmGetStaRecByAddress(prAdapter, prBssInfo->ucBssIndex, prBssInfo->aucBSSID);
  3182. ASSERT(prStaRec); /* AIS RSN Group key, addr is BC addr */
  3183. kalMemCopy(prCmdKey->aucPeerAddr, prStaRec->aucMacAddr, MAC_ADDR_LEN);
  3184. } else {
  3185. prStaRec = NULL;
  3186. }
  3187. } else {
  3188. prStaRec = cnmGetStaRecByAddress(prAdapter, prBssInfo->ucBssIndex, prCmdKey->aucPeerAddr);
  3189. }
  3190. #if CFG_SUPPORT_TDLS
  3191. prTmpStaRec = cnmGetStaRecByAddress(prAdapter, prBssInfo->ucBssIndex, prNewKey->arBSSID);
  3192. if (prTmpStaRec) {
  3193. if (IS_DLS_STA(prTmpStaRec)) {
  3194. prStaRec = prTmpStaRec;
  3195. prCmdKey->ucAlgorithmId = CIPHER_SUITE_CCMP; /*128 ,TODO GCMP 256 */
  3196. kalMemCopy(prCmdKey->aucPeerAddr, prStaRec->aucMacAddr, MAC_ADDR_LEN);
  3197. }
  3198. }
  3199. #endif
  3200. #if CFG_SUPPORT_802_11W
  3201. if (prCmdKey->ucAlgorithmId == CIPHER_SUITE_BIP) {
  3202. ASSERT(prStaRec);
  3203. prCmdKey->ucWlanIndex = prStaRec->ucBMCWlanIndex;
  3204. /* prCmdKey->ucKeyId; */
  3205. } else
  3206. #endif
  3207. if (prCmdKey->ucTxKey) {
  3208. if (prStaRec) {
  3209. if (prCmdKey->ucKeyType) { /* AIS RSN STA */
  3210. prCmdKey->ucWlanIndex = prStaRec->ucWlanIndex;
  3211. prStaRec->fgTransmitKeyExist = TRUE; /* wait for CMD Done ? */
  3212. } else {
  3213. ASSERT(FALSE);
  3214. /* prCmdKey->ucWlanIndex = */
  3215. /* secPrivacySeekForBcEntry(prAdapter, */
  3216. /* prBssInfo->ucBssIndex, */
  3217. /* NETWORK_TYPE_AIS, */
  3218. /* prCmdKey->aucPeerAddr, */
  3219. /* prCmdKey->ucAlgorithmId, */
  3220. /* prCmdKey->ucKeyId, */
  3221. /* prStaRec->ucCurrentGtkId, */
  3222. /* BIT(1)); */
  3223. /* Todo:: Check the prCmdKey->ucKeyType */
  3224. /* for some case, like wep, add bc wep key before sta create, */
  3225. /* so use the rAisSpecificBssInfo to save key setting */
  3226. fgAddTxBcKey = TRUE;
  3227. }
  3228. }
  3229. if (fgAddTxBcKey || !prStaRec) {
  3230. if ((prCmdKey->aucPeerAddr[0] & prCmdKey->aucPeerAddr[1] & prCmdKey->
  3231. aucPeerAddr[2] & prCmdKey->aucPeerAddr[3] & prCmdKey->aucPeerAddr[4] & prCmdKey->
  3232. aucPeerAddr[5]) == 0xFF) {
  3233. prCmdKey->ucWlanIndex = 255; /* AIS WEP Tx key */
  3234. } else { /* Exist this case ? */
  3235. ASSERT(FALSE);
  3236. /* prCmdKey->ucWlanIndex = */
  3237. /* secPrivacySeekForBcEntry(prAdapter, */
  3238. /* prBssInfo->ucBssIndex, */
  3239. /* NETWORK_TYPE_AIS, */
  3240. /* prCmdKey->aucPeerAddr, */
  3241. /* prCmdKey->ucAlgorithmId, */
  3242. /* prCmdKey->ucKeyId, */
  3243. /* prBssInfo->ucCurrentGtkId, */
  3244. /* BIT(1)); */
  3245. }
  3246. prBssInfo->fgTxBcKeyExist = TRUE;
  3247. prBssInfo->ucBMCWlanIndex = prCmdKey->ucWlanIndex; /* Saved for AIS WEP */
  3248. prBssInfo->ucTxDefaultKeyID = prCmdKey->ucKeyId;
  3249. }
  3250. } else {
  3251. /* Including IBSS RSN Rx BC key ? */
  3252. if ((prCmdKey->aucPeerAddr[0] & prCmdKey->aucPeerAddr[1] & prCmdKey->aucPeerAddr[2] & prCmdKey->
  3253. aucPeerAddr[3] & prCmdKey->aucPeerAddr[4] & prCmdKey->aucPeerAddr[5]) == 0xFF) {
  3254. prCmdKey->ucWlanIndex = 255; /* AIS WEP */
  3255. } else {
  3256. if (prStaRec) { /* AIS RSN Group key but addr is BSSID */
  3257. ASSERT(prStaRec->ucBMCWlanIndex < WTBL_SIZE)
  3258. prCmdKey->ucWlanIndex =
  3259. secPrivacySeekForBcEntry(prAdapter,
  3260. prStaRec->ucBssIndex,
  3261. prStaRec->aucMacAddr,
  3262. prStaRec->ucIndex,
  3263. prCmdKey->ucAlgorithmId,
  3264. prCmdKey->ucKeyId,
  3265. prStaRec->ucCurrentGtkId, BIT(0));
  3266. prStaRec->ucBMCWlanIndex = prCmdKey->ucWlanIndex;
  3267. } else { /* Exist this case ? */
  3268. ASSERT(FALSE);
  3269. /* prCmdKey->ucWlanIndex = */
  3270. /* secPrivacySeekForBcEntry(prAdapter, */
  3271. /* prBssInfo->ucBssIndex, */
  3272. /* NETWORK_TYPE_AIS, */
  3273. /* prCmdKey->aucPeerAddr, */
  3274. /* prCmdKey->ucAlgorithmId, */
  3275. /* prCmdKey->ucKeyId, */
  3276. /* prBssInfo->ucCurrentGtkId, */
  3277. /* BIT(0)); */
  3278. }
  3279. }
  3280. }
  3281. /* Update Group Key Id after Seek Bc entry */
  3282. #if CFG_SUPPORT_802_11W
  3283. if (prCmdKey->ucAlgorithmId == CIPHER_SUITE_BIP)
  3284. ;
  3285. else
  3286. #endif
  3287. if (!prCmdKey->ucKeyType) {
  3288. if (prStaRec) {
  3289. prStaRec->ucCurrentGtkId = prCmdKey->ucKeyId;
  3290. } else {
  3291. /* AIS WEP */
  3292. prBssInfo->ucCurrentGtkId = prCmdKey->ucKeyId;
  3293. }
  3294. }
  3295. #if DBG && 0
  3296. if (prCmdKey->ucWlanIndex < WTBL_SIZE) {
  3297. UINT_8 entry = prCmdKey->ucWlanIndex;
  3298. P_HAL_WTBL_SEC_CONFIG_T prWtblCfg;
  3299. BOOLEAN fgOneTb3 = FALSE;
  3300. /* ASSERT(prWlanTable[prCmdKey->ucWlanIndex].ucUsed == TRUE); */
  3301. /* prWlanTable[prCmdKey->ucWlanIndex].ucBssIndex = prCmdKey->ucBssIdx; */
  3302. /* prWlanTable[prCmdKey->ucWlanIndex].ucKeyId = prCmdKey->ucKeyId; */
  3303. /* kalMemCopy(prWlanTable[prCmdKey->ucWlanIndex].aucMacAddr, */
  3304. /* prCmdKey->aucPeerAddr, */
  3305. /* MAC_ADDR_LEN); */
  3306. prWtblCfg = prAdapter->rWifiVar.arWtblCfg;
  3307. if (prCmdKey->ucAlgorithmId == CIPHER_SUITE_WEP40
  3308. || prCmdKey->ucAlgorithmId == CIPHER_SUITE_WEP104
  3309. || prCmdKey->ucAlgorithmId == CIPHER_SUITE_WEP128
  3310. || prCmdKey->ucAlgorithmId == CIPHER_SUITE_WPI)
  3311. fgOneTb3 = TRUE;
  3312. if (prCmdKey->ucTxKey) {
  3313. if (prStaRec) {
  3314. prWtblCfg[entry].fgRCA2 = 1;
  3315. prWtblCfg[entry].fgRV = 1;
  3316. prWtblCfg[entry].fgIKV = 0;
  3317. prWtblCfg[entry].fgRKV = 1;
  3318. if (fgOneTb3)
  3319. prWtblCfg[entry].fgRCID = 0;
  3320. else
  3321. prWtblCfg[entry].fgRCID = 1;
  3322. prWtblCfg[entry].ucKeyID = prCmdKey->ucKeyId;
  3323. prWtblCfg[entry].fgRCA1 = 1;
  3324. #if 0
  3325. if (prCmdKey->ucIsAuthenticator)
  3326. prWtblCfg[entry].fgEvenPN = 0;
  3327. else
  3328. #endif
  3329. prWtblCfg[entry].fgEvenPN = 1;
  3330. prWtblCfg[entry].ucMUARIdx = 0x00; /* Omac */
  3331. } else {
  3332. #if 0
  3333. if (prCmdKey->ucIsAuthenticator) {
  3334. prWtblCfg[entry].fgRCA2 = 0;
  3335. prWtblCfg[entry].fgRV = 0;
  3336. prWtblCfg[entry].fgIKV = 0;
  3337. prWtblCfg[entry].fgRKV = 0;
  3338. prWtblCfg[entry].fgRCID = 0;
  3339. prWtblCfg[entry].ucKeyID = prCmdKey->ucKeyId;
  3340. prWtblCfg[entry].fgRCA1 = 0;
  3341. prWtblCfg[entry].fgEvenPN = 0;
  3342. } else
  3343. #endif
  3344. {
  3345. prWtblCfg[entry].fgRCA2 = 1;
  3346. prWtblCfg[entry].fgRV = 1;
  3347. prWtblCfg[entry].fgIKV = 0;
  3348. prWtblCfg[entry].fgRKV = 1;
  3349. prCmdKey->ucTxKey =
  3350. ((prNewKey->u4KeyIndex & IS_TRANSMIT_KEY) ==
  3351. IS_TRANSMIT_KEY) ? 1 : 0;
  3352. prCmdKey->ucKeyType =
  3353. ((prNewKey->u4KeyIndex & IS_UNICAST_KEY) == IS_UNICAST_KEY) ? 1 : 0;
  3354. SetRCID(fgOneTb3, &prWtblCfg[entry].fgRCID);
  3355. /*AOSP*/ prWtblCfg[entry].ucKeyID = prCmdKey->ucKeyId;
  3356. prWtblCfg[entry].fgRCA1 = 0;
  3357. prWtblCfg[entry].fgEvenPN = 1;
  3358. }
  3359. }
  3360. } else {
  3361. prWtblCfg[entry].fgRCA2 = 1;
  3362. prWtblCfg[entry].fgRV = 1;
  3363. prWtblCfg[entry].fgIKV = 0;
  3364. prWtblCfg[entry].fgRKV = 1;
  3365. if (fgOneTb3)
  3366. prWtblCfg[entry].fgRCID = 0;
  3367. else
  3368. prWtblCfg[entry].fgRCID = 1;
  3369. prWtblCfg[entry].ucKeyID = prCmdKey->ucKeyId;
  3370. prWtblCfg[entry].fgRCA1 = 1;
  3371. prWtblCfg[entry].ucMUARIdx = 0x30;
  3372. #if 0
  3373. if (prCmdKey->ucIsAuthenticator)
  3374. prWtblCfg[entry].fgEvenPN = 0;
  3375. else
  3376. #endif
  3377. prWtblCfg[entry].fgEvenPN = 1;
  3378. }
  3379. secPrivacyDumpWTBL3(prAdapter, entry);
  3380. }
  3381. #endif
  3382. }
  3383. /* insert into prCmdQueue */
  3384. kalEnqueueCommand(prGlueInfo, (P_QUE_ENTRY_T) prCmdInfo);
  3385. /* wakeup txServiceThread later */
  3386. GLUE_SET_EVENT(prGlueInfo);
  3387. return WLAN_STATUS_PENDING;
  3388. } /* wlanoidSetAddKey */
  3389. /*----------------------------------------------------------------------------*/
  3390. /*!
  3391. * \brief This routine is called to request the driver to remove the key at
  3392. * the specified key index.
  3393. *
  3394. * \param[in] prAdapter Pointer to the Adapter structure.
  3395. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  3396. * \param[in] u4SetBufferLen The length of the set buffer.
  3397. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  3398. * bytes read from the set buffer. If the call failed
  3399. * due to invalid length of the set buffer, returns
  3400. * the amount of storage needed.
  3401. *
  3402. * \retval WLAN_STATUS_SUCCESS
  3403. * \retval WLAN_STATUS_INVALID_DATA
  3404. * \retval WLAN_STATUS_INVALID_LENGTH
  3405. * \retval WLAN_STATUS_ADAPTER_NOT_READY
  3406. */
  3407. /*----------------------------------------------------------------------------*/
  3408. WLAN_STATUS
  3409. wlanoidSetRemoveKey(IN P_ADAPTER_T prAdapter,
  3410. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  3411. {
  3412. P_GLUE_INFO_T prGlueInfo;
  3413. P_CMD_INFO_T prCmdInfo;
  3414. P_WIFI_CMD_T prWifiCmd;
  3415. P_PARAM_REMOVE_KEY_T prRemovedKey;
  3416. P_CMD_802_11_KEY prCmdKey;
  3417. UINT_8 ucCmdSeqNum;
  3418. P_AIS_SPECIFIC_BSS_INFO_T prAisSpecBssInfo;
  3419. P_WLAN_TABLE_T prWlanTable;
  3420. P_STA_RECORD_T prStaRec;
  3421. DEBUGFUNC("wlanoidSetRemoveKey");
  3422. ASSERT(prAdapter);
  3423. ASSERT(pu4SetInfoLen);
  3424. *pu4SetInfoLen = sizeof(PARAM_REMOVE_KEY_T);
  3425. if (u4SetBufferLen < sizeof(PARAM_REMOVE_KEY_T))
  3426. return WLAN_STATUS_INVALID_LENGTH;
  3427. if (prAdapter->rAcpiState == ACPI_STATE_D3) {
  3428. DBGLOG(OID, WARN,
  3429. "Fail in set remove key! (Adapter not ready). ACPI=D%d, Radio=%d\n",
  3430. prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
  3431. return WLAN_STATUS_ADAPTER_NOT_READY;
  3432. }
  3433. ASSERT(pvSetBuffer);
  3434. prRemovedKey = (P_PARAM_REMOVE_KEY_T) pvSetBuffer;
  3435. /* Dump PARAM_REMOVE_KEY content. */
  3436. DBGLOG(OID, TRACE, "Set: Dump PARAM_REMOVE_KEY content\n");
  3437. DBGLOG(OID, TRACE, "Length : 0x%08x\n", prRemovedKey->u4Length);
  3438. DBGLOG(OID, TRACE, "Key Index : 0x%08x\n", prRemovedKey->u4KeyIndex);
  3439. DBGLOG(OID, TRACE, "BSSID:\n");
  3440. DBGLOG_MEM8(OID, TRACE, prRemovedKey->arBSSID, MAC_ADDR_LEN);
  3441. /* Check bit 31: this bit should always 0 */
  3442. if (prRemovedKey->u4KeyIndex & IS_TRANSMIT_KEY) {
  3443. /* Bit 31 should not be set */
  3444. DBGLOG(OID, ERROR, "invalid key index: 0x%08x\n", prRemovedKey->u4KeyIndex);
  3445. return WLAN_STATUS_INVALID_DATA;
  3446. }
  3447. /* Check bits 8 ~ 29 should always be 0 */
  3448. if (prRemovedKey->u4KeyIndex & BITS(8, 29)) {
  3449. /* Bit 31 should not be set */
  3450. DBGLOG(OID, ERROR, "invalid key index: 0x%08lx\n", prRemovedKey->u4KeyIndex);
  3451. return WLAN_STATUS_INVALID_DATA;
  3452. }
  3453. prGlueInfo = prAdapter->prGlueInfo;
  3454. prCmdInfo = cmdBufAllocateCmdInfo(prAdapter, (CMD_HDR_SIZE + sizeof(CMD_802_11_KEY)));
  3455. if (!prCmdInfo) {
  3456. DBGLOG(OID, ERROR, "Allocate CMD_INFO_T ==> FAILED.\n");
  3457. return WLAN_STATUS_FAILURE;
  3458. }
  3459. prAisSpecBssInfo = &prAdapter->rWifiVar.rAisSpecificBssInfo;
  3460. prWlanTable = prAdapter->rWifiVar.arWtbl;
  3461. /* increase command sequence number */
  3462. ucCmdSeqNum = nicIncreaseCmdSeqNum(prAdapter);
  3463. /* compose CMD_802_11_KEY cmd pkt */
  3464. prCmdInfo->eCmdType = COMMAND_TYPE_NETWORK_IOCTL;
  3465. prCmdInfo->ucBssIndex = prAdapter->prAisBssInfo->ucBssIndex;
  3466. prCmdInfo->u2InfoBufLen = CMD_HDR_SIZE + sizeof(CMD_802_11_KEY);
  3467. prCmdInfo->pfCmdDoneHandler = nicCmdEventSetCommon;
  3468. prCmdInfo->pfCmdTimeoutHandler = nicOidCmdTimeoutCommon;
  3469. prCmdInfo->fgIsOid = TRUE;
  3470. prCmdInfo->ucCID = CMD_ID_ADD_REMOVE_KEY;
  3471. prCmdInfo->fgSetQuery = TRUE;
  3472. prCmdInfo->fgNeedResp = FALSE;
  3473. prCmdInfo->fgDriverDomainMCR = FALSE;
  3474. prCmdInfo->ucCmdSeqNum = ucCmdSeqNum;
  3475. prCmdInfo->u4SetInfoLen = sizeof(PARAM_REMOVE_KEY_T);
  3476. prCmdInfo->pvInformationBuffer = pvSetBuffer;
  3477. prCmdInfo->u4InformationBufferLength = u4SetBufferLen;
  3478. /* Setup WIFI_CMD_T */
  3479. prWifiCmd = (P_WIFI_CMD_T) (prCmdInfo->pucInfoBuffer);
  3480. prWifiCmd->u2TxByteCount = prCmdInfo->u2InfoBufLen;
  3481. prWifiCmd->u2PQ_ID = CMD_PQ_ID;
  3482. prWifiCmd->ucPktTypeID = CMD_PACKET_TYPE_ID;
  3483. prWifiCmd->ucCID = prCmdInfo->ucCID;
  3484. prWifiCmd->ucSetQuery = prCmdInfo->fgSetQuery;
  3485. prWifiCmd->ucSeqNum = prCmdInfo->ucCmdSeqNum;
  3486. prCmdKey = (P_CMD_802_11_KEY) (prWifiCmd->aucBuffer);
  3487. kalMemZero((PUINT_8) prCmdKey, sizeof(CMD_802_11_KEY));
  3488. prCmdKey->ucAddRemove = 0; /* Remove */
  3489. prCmdKey->ucKeyId = (UINT_8) (prRemovedKey->u4KeyIndex & 0x000000ff);
  3490. kalMemCopy(prCmdKey->aucPeerAddr, (PUINT_8) prRemovedKey->arBSSID, MAC_ADDR_LEN);
  3491. prCmdKey->ucBssIdx = prAdapter->prAisBssInfo->ucBssIndex;
  3492. #if CFG_SUPPORT_802_11W
  3493. ASSERT(prCmdKey->ucKeyId < MAX_KEY_NUM + 2);
  3494. #else
  3495. /* ASSERT(prCmdKey->ucKeyId < MAX_KEY_NUM); */
  3496. #endif
  3497. /* Clean up the Tx key flag */
  3498. prStaRec = cnmGetStaRecByAddress(prAdapter, prAdapter->prAisBssInfo->ucBssIndex, prRemovedKey->arBSSID);
  3499. if (prRemovedKey->u4KeyIndex & IS_UNICAST_KEY) {
  3500. if (prStaRec) {
  3501. prCmdKey->ucKeyType = 1;
  3502. prCmdKey->ucWlanIndex = prStaRec->ucWlanIndex;
  3503. prStaRec->fgTransmitKeyExist = FALSE;
  3504. } else if (prCmdKey->ucKeyId == prAdapter->prAisBssInfo->ucTxDefaultKeyID)
  3505. prAdapter->prAisBssInfo->fgTxBcKeyExist = FALSE;
  3506. } else {
  3507. if (prCmdKey->ucKeyId == prAdapter->prAisBssInfo->ucTxDefaultKeyID)
  3508. prAdapter->prAisBssInfo->fgTxBcKeyExist = FALSE;
  3509. }
  3510. if (!prStaRec) {
  3511. if (prAdapter->rWifiVar.rConnSettings.eAuthMode < AUTH_MODE_WPA)
  3512. prCmdKey->ucWlanIndex = prAdapter->prAisBssInfo->ucBMCWlanIndex;
  3513. else {
  3514. prCmdKey->ucWlanIndex = WTBL_RESERVED_ENTRY;
  3515. /* ASSERT(FALSE); */
  3516. }
  3517. }
  3518. if (prCmdKey->ucAlgorithmId == CIPHER_SUITE_WEP40
  3519. || prCmdKey->ucAlgorithmId == CIPHER_SUITE_WEP104 || prCmdKey->ucAlgorithmId == CIPHER_SUITE_WEP104) {
  3520. /* if (prAdapter->prAisBssInfo->ucTxDefaultKeyID == prCmdKey->ucKeyId) */
  3521. /* secPrivacyFreeForEntry(prAdapter, prCmdKey->ucWlanIndex); */
  3522. /* else */
  3523. /* ; Clear key material only */
  3524. } else {
  3525. DBGLOG(RSN, TRACE, "wlanoidSetRemoveKey\n");
  3526. secPrivacyFreeForEntry(prAdapter, prCmdKey->ucWlanIndex);
  3527. }
  3528. if (prCmdKey->ucKeyId < 4) { /* BIP */
  3529. /* kalMemZero(prAisSpecBssInfo->aucKeyMaterial[prCmdKey->ucKeyId], 16); */
  3530. }
  3531. /* insert into prCmdQueue */
  3532. kalEnqueueCommand(prGlueInfo, (P_QUE_ENTRY_T) prCmdInfo);
  3533. /* wakeup txServiceThread later */
  3534. GLUE_SET_EVENT(prGlueInfo);
  3535. return WLAN_STATUS_PENDING;
  3536. } /* wlanoidSetRemoveKey */
  3537. /*----------------------------------------------------------------------------*/
  3538. /*!
  3539. * \brief This routine is called to query the current encryption status.
  3540. *
  3541. * \param[in] prAdapter Pointer to the Adapter structure.
  3542. * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
  3543. * the query.
  3544. * \param[in] u4QueryBufferLen The length of the query buffer.
  3545. * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
  3546. * bytes written into the query buffer. If the call
  3547. * failed due to invalid length of the query buffer,
  3548. * returns the amount of storage needed.
  3549. *
  3550. * \retval WLAN_STATUS_SUCCESS
  3551. */
  3552. /*----------------------------------------------------------------------------*/
  3553. WLAN_STATUS
  3554. wlanoidQueryEncryptionStatus(IN P_ADAPTER_T prAdapter,
  3555. IN PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  3556. {
  3557. BOOLEAN fgTransmitKeyAvailable = TRUE;
  3558. ENUM_PARAM_ENCRYPTION_STATUS_T eEncStatus = 0;
  3559. DEBUGFUNC("wlanoidQueryEncryptionStatus");
  3560. ASSERT(prAdapter);
  3561. ASSERT(pu4QueryInfoLen);
  3562. if (u4QueryBufferLen)
  3563. ASSERT(pvQueryBuffer);
  3564. *pu4QueryInfoLen = sizeof(ENUM_PARAM_ENCRYPTION_STATUS_T);
  3565. fgTransmitKeyAvailable = prAdapter->prAisBssInfo->fgTxBcKeyExist;
  3566. switch (prAdapter->rWifiVar.rConnSettings.eEncStatus) {
  3567. case ENUM_ENCRYPTION3_ENABLED:
  3568. if (fgTransmitKeyAvailable)
  3569. eEncStatus = ENUM_ENCRYPTION3_ENABLED;
  3570. else
  3571. eEncStatus = ENUM_ENCRYPTION3_KEY_ABSENT;
  3572. break;
  3573. case ENUM_ENCRYPTION2_ENABLED:
  3574. if (fgTransmitKeyAvailable)
  3575. eEncStatus = ENUM_ENCRYPTION2_ENABLED;
  3576. else
  3577. eEncStatus = ENUM_ENCRYPTION2_KEY_ABSENT;
  3578. break;
  3579. case ENUM_ENCRYPTION1_ENABLED:
  3580. if (fgTransmitKeyAvailable)
  3581. eEncStatus = ENUM_ENCRYPTION1_ENABLED;
  3582. else
  3583. eEncStatus = ENUM_ENCRYPTION1_KEY_ABSENT;
  3584. break;
  3585. case ENUM_ENCRYPTION_DISABLED:
  3586. eEncStatus = ENUM_ENCRYPTION_DISABLED;
  3587. break;
  3588. default:
  3589. DBGLOG(OID, ERROR, "Unknown Encryption Status Setting:%d\n",
  3590. prAdapter->rWifiVar.rConnSettings.eEncStatus);
  3591. }
  3592. #if DBG
  3593. DBGLOG(OID, INFO,
  3594. "Encryption status: %d Return:%d\n", prAdapter->rWifiVar.rConnSettings.eEncStatus, eEncStatus);
  3595. #endif
  3596. *(P_ENUM_PARAM_ENCRYPTION_STATUS_T) pvQueryBuffer = eEncStatus;
  3597. return WLAN_STATUS_SUCCESS;
  3598. } /* wlanoidQueryEncryptionStatus */
  3599. /*----------------------------------------------------------------------------*/
  3600. /*!
  3601. * \brief This routine is called to set the encryption status to the driver.
  3602. *
  3603. * \param[in] prAdapter Pointer to the Adapter structure.
  3604. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  3605. * \param[in] u4SetBufferLen The length of the set buffer.
  3606. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  3607. * bytes read from the set buffer. If the call failed
  3608. * due to invalid length of the set buffer, returns
  3609. * the amount of storage needed.
  3610. *
  3611. * \retval WLAN_STATUS_SUCCESS
  3612. * \retval WLAN_STATUS_ADAPTER_NOT_READY
  3613. * \retval WLAN_STATUS_NOT_SUPPORTED
  3614. */
  3615. /*----------------------------------------------------------------------------*/
  3616. WLAN_STATUS
  3617. wlanoidSetEncryptionStatus(IN P_ADAPTER_T prAdapter,
  3618. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  3619. {
  3620. P_GLUE_INFO_T prGlueInfo;
  3621. WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
  3622. ENUM_PARAM_ENCRYPTION_STATUS_T eEewEncrypt;
  3623. DEBUGFUNC("wlanoidSetEncryptionStatus");
  3624. ASSERT(prAdapter);
  3625. ASSERT(pvSetBuffer);
  3626. ASSERT(pu4SetInfoLen);
  3627. prGlueInfo = prAdapter->prGlueInfo;
  3628. *pu4SetInfoLen = sizeof(ENUM_PARAM_ENCRYPTION_STATUS_T);
  3629. /* if (IS_ARB_IN_RFTEST_STATE(prAdapter)) { */
  3630. /* return WLAN_STATUS_SUCCESS; */
  3631. /* } */
  3632. if (prAdapter->rAcpiState == ACPI_STATE_D3) {
  3633. DBGLOG(OID, WARN,
  3634. "Fail in set encryption status! (Adapter not ready). ACPI=D%d, Radio=%d\n",
  3635. prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
  3636. return WLAN_STATUS_ADAPTER_NOT_READY;
  3637. }
  3638. eEewEncrypt = *(P_ENUM_PARAM_ENCRYPTION_STATUS_T) pvSetBuffer;
  3639. DBGLOG(OID, TRACE, "ENCRYPTION_STATUS %d\n", eEewEncrypt);
  3640. switch (eEewEncrypt) {
  3641. case ENUM_ENCRYPTION_DISABLED: /* Disable WEP, TKIP, AES */
  3642. DBGLOG(RSN, TRACE, "Disable Encryption\n");
  3643. secSetCipherSuite(prAdapter, CIPHER_FLAG_WEP40 | CIPHER_FLAG_WEP104 | CIPHER_FLAG_WEP128);
  3644. break;
  3645. case ENUM_ENCRYPTION1_ENABLED: /* Enable WEP. Disable TKIP, AES */
  3646. DBGLOG(RSN, TRACE, "Enable Encryption1\n");
  3647. secSetCipherSuite(prAdapter, CIPHER_FLAG_WEP40 | CIPHER_FLAG_WEP104 | CIPHER_FLAG_WEP128);
  3648. break;
  3649. case ENUM_ENCRYPTION2_ENABLED: /* Enable WEP, TKIP. Disable AES */
  3650. secSetCipherSuite(prAdapter,
  3651. CIPHER_FLAG_WEP40 | CIPHER_FLAG_WEP104 | CIPHER_FLAG_WEP128 | CIPHER_FLAG_TKIP);
  3652. DBGLOG(RSN, TRACE, "Enable Encryption2\n");
  3653. break;
  3654. case ENUM_ENCRYPTION3_ENABLED: /* Enable WEP, TKIP, AES */
  3655. secSetCipherSuite(prAdapter,
  3656. CIPHER_FLAG_WEP40 |
  3657. CIPHER_FLAG_WEP104 | CIPHER_FLAG_WEP128 | CIPHER_FLAG_TKIP | CIPHER_FLAG_CCMP);
  3658. DBGLOG(RSN, TRACE, "Enable Encryption3\n");
  3659. break;
  3660. default:
  3661. DBGLOG(RSN, WARN, "Unacceptible encryption status: %d\n",
  3662. *(P_ENUM_PARAM_ENCRYPTION_STATUS_T) pvSetBuffer);
  3663. rStatus = WLAN_STATUS_NOT_SUPPORTED;
  3664. }
  3665. if (rStatus == WLAN_STATUS_SUCCESS) {
  3666. /* Save the new encryption status. */
  3667. prAdapter->rWifiVar.rConnSettings.eEncStatus = *(P_ENUM_PARAM_ENCRYPTION_STATUS_T) pvSetBuffer;
  3668. }
  3669. return rStatus;
  3670. } /* wlanoidSetEncryptionStatus */
  3671. /*----------------------------------------------------------------------------*/
  3672. /*!
  3673. * \brief This routine is called to test the driver.
  3674. *
  3675. * \param[in] prAdapter Pointer to the Adapter structure.
  3676. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  3677. * \param[in] u4SetBufferLen The length of the set buffer.
  3678. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  3679. * bytes read from the set buffer. If the call failed
  3680. * due to invalid length of the set buffer, returns
  3681. * the amount of storage needed.
  3682. *
  3683. * \retval WLAN_STATUS_SUCCESS
  3684. * \retval WLAN_STATUS_INVALID_LENGTH
  3685. * \retval WLAN_STATUS_INVALID_DATA
  3686. */
  3687. /*----------------------------------------------------------------------------*/
  3688. WLAN_STATUS
  3689. wlanoidSetTest(IN P_ADAPTER_T prAdapter, IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  3690. {
  3691. P_PARAM_802_11_TEST_T prTest;
  3692. PVOID pvTestData;
  3693. PVOID pvStatusBuffer;
  3694. UINT_32 u4StatusBufferSize;
  3695. DEBUGFUNC("wlanoidSetTest");
  3696. ASSERT(prAdapter);
  3697. ASSERT(pu4SetInfoLen);
  3698. ASSERT(pvSetBuffer);
  3699. *pu4SetInfoLen = u4SetBufferLen;
  3700. prTest = (P_PARAM_802_11_TEST_T) pvSetBuffer;
  3701. DBGLOG(OID, TRACE, "Test - Type %u\n", prTest->u4Type);
  3702. switch (prTest->u4Type) {
  3703. case 1: /* Type 1: generate an authentication event */
  3704. pvTestData = (PVOID) &prTest->u.AuthenticationEvent;
  3705. pvStatusBuffer = (PVOID) prAdapter->aucIndicationEventBuffer;
  3706. u4StatusBufferSize = prTest->u4Length - 8;
  3707. break;
  3708. case 2: /* Type 2: generate an RSSI status indication */
  3709. pvTestData = (PVOID) &prTest->u.RssiTrigger;
  3710. pvStatusBuffer = (PVOID) &prAdapter->rWlanInfo.rCurrBssId.rRssi;
  3711. u4StatusBufferSize = sizeof(PARAM_RSSI);
  3712. break;
  3713. default:
  3714. return WLAN_STATUS_INVALID_DATA;
  3715. }
  3716. ASSERT(u4StatusBufferSize <= 180);
  3717. if (u4StatusBufferSize > 180)
  3718. return WLAN_STATUS_INVALID_LENGTH;
  3719. /* Get the contents of the StatusBuffer from the test structure. */
  3720. kalMemCopy(pvStatusBuffer, pvTestData, u4StatusBufferSize);
  3721. kalIndicateStatusAndComplete(prAdapter->prGlueInfo,
  3722. WLAN_STATUS_MEDIA_SPECIFIC_INDICATION, pvStatusBuffer, u4StatusBufferSize);
  3723. return WLAN_STATUS_SUCCESS;
  3724. } /* wlanoidSetTest */
  3725. /*----------------------------------------------------------------------------*/
  3726. /*!
  3727. * \brief This routine is called to query the driver's WPA2 status.
  3728. *
  3729. * \param[in] prAdapter Pointer to the Adapter structure.
  3730. * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
  3731. * the query.
  3732. * \param[in] u4QueryBufferLen The length of the query buffer.
  3733. * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
  3734. * bytes written into the query buffer. If the call
  3735. * failed due to invalid length of the query buffer,
  3736. * returns the amount of storage needed.
  3737. *
  3738. * \retval WLAN_STATUS_SUCCESS
  3739. * \retval WLAN_STATUS_INVALID_LENGTH
  3740. */
  3741. /*----------------------------------------------------------------------------*/
  3742. WLAN_STATUS
  3743. wlanoidQueryCapability(IN P_ADAPTER_T prAdapter,
  3744. OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  3745. {
  3746. P_PARAM_CAPABILITY_T prCap;
  3747. P_PARAM_AUTH_ENCRYPTION_T prAuthenticationEncryptionSupported;
  3748. DEBUGFUNC("wlanoidQueryCapability");
  3749. ASSERT(prAdapter);
  3750. ASSERT(pu4QueryInfoLen);
  3751. if (u4QueryBufferLen)
  3752. ASSERT(pvQueryBuffer);
  3753. *pu4QueryInfoLen = 4 * sizeof(UINT_32) + 14 * sizeof(PARAM_AUTH_ENCRYPTION_T);
  3754. if (u4QueryBufferLen < *pu4QueryInfoLen)
  3755. return WLAN_STATUS_INVALID_LENGTH;
  3756. prCap = (P_PARAM_CAPABILITY_T) pvQueryBuffer;
  3757. prCap->u4Length = *pu4QueryInfoLen;
  3758. prCap->u4Version = 2; /* WPA2 */
  3759. prCap->u4NoOfPMKIDs = CFG_MAX_PMKID_CACHE;
  3760. prCap->u4NoOfAuthEncryptPairsSupported = 14;
  3761. prAuthenticationEncryptionSupported = &prCap->arAuthenticationEncryptionSupported[0];
  3762. /* fill 14 entries of supported settings */
  3763. prAuthenticationEncryptionSupported[0].eAuthModeSupported = AUTH_MODE_OPEN;
  3764. prAuthenticationEncryptionSupported[0].eEncryptStatusSupported = ENUM_ENCRYPTION_DISABLED;
  3765. prAuthenticationEncryptionSupported[1].eAuthModeSupported = AUTH_MODE_OPEN;
  3766. prAuthenticationEncryptionSupported[1].eEncryptStatusSupported = ENUM_ENCRYPTION1_ENABLED;
  3767. prAuthenticationEncryptionSupported[2].eAuthModeSupported = AUTH_MODE_SHARED;
  3768. prAuthenticationEncryptionSupported[2].eEncryptStatusSupported = ENUM_ENCRYPTION_DISABLED;
  3769. prAuthenticationEncryptionSupported[3].eAuthModeSupported = AUTH_MODE_SHARED;
  3770. prAuthenticationEncryptionSupported[3].eEncryptStatusSupported = ENUM_ENCRYPTION1_ENABLED;
  3771. prAuthenticationEncryptionSupported[4].eAuthModeSupported = AUTH_MODE_WPA;
  3772. prAuthenticationEncryptionSupported[4].eEncryptStatusSupported = ENUM_ENCRYPTION2_ENABLED;
  3773. prAuthenticationEncryptionSupported[5].eAuthModeSupported = AUTH_MODE_WPA;
  3774. prAuthenticationEncryptionSupported[5].eEncryptStatusSupported = ENUM_ENCRYPTION3_ENABLED;
  3775. prAuthenticationEncryptionSupported[6].eAuthModeSupported = AUTH_MODE_WPA_PSK;
  3776. prAuthenticationEncryptionSupported[6].eEncryptStatusSupported = ENUM_ENCRYPTION2_ENABLED;
  3777. prAuthenticationEncryptionSupported[7].eAuthModeSupported = AUTH_MODE_WPA_PSK;
  3778. prAuthenticationEncryptionSupported[7].eEncryptStatusSupported = ENUM_ENCRYPTION3_ENABLED;
  3779. prAuthenticationEncryptionSupported[8].eAuthModeSupported = AUTH_MODE_WPA_NONE;
  3780. prAuthenticationEncryptionSupported[8].eEncryptStatusSupported = ENUM_ENCRYPTION2_ENABLED;
  3781. prAuthenticationEncryptionSupported[9].eAuthModeSupported = AUTH_MODE_WPA_NONE;
  3782. prAuthenticationEncryptionSupported[9].eEncryptStatusSupported = ENUM_ENCRYPTION3_ENABLED;
  3783. prAuthenticationEncryptionSupported[10].eAuthModeSupported = AUTH_MODE_WPA2;
  3784. prAuthenticationEncryptionSupported[10].eEncryptStatusSupported = ENUM_ENCRYPTION2_ENABLED;
  3785. prAuthenticationEncryptionSupported[11].eAuthModeSupported = AUTH_MODE_WPA2;
  3786. prAuthenticationEncryptionSupported[11].eEncryptStatusSupported = ENUM_ENCRYPTION3_ENABLED;
  3787. prAuthenticationEncryptionSupported[12].eAuthModeSupported = AUTH_MODE_WPA2_PSK;
  3788. prAuthenticationEncryptionSupported[12].eEncryptStatusSupported = ENUM_ENCRYPTION2_ENABLED;
  3789. prAuthenticationEncryptionSupported[13].eAuthModeSupported = AUTH_MODE_WPA2_PSK;
  3790. prAuthenticationEncryptionSupported[13].eEncryptStatusSupported = ENUM_ENCRYPTION3_ENABLED;
  3791. return WLAN_STATUS_SUCCESS;
  3792. } /* wlanoidQueryCapability */
  3793. /*----------------------------------------------------------------------------*/
  3794. /*!
  3795. * \brief This routine is called to query the PMKID in the PMK cache.
  3796. *
  3797. * \param[in] prAdapter Pointer to the Adapter structure.
  3798. * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
  3799. * the query.
  3800. * \param[in] u4QueryBufferLen The length of the query buffer.
  3801. * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
  3802. * bytes written into the query buffer. If the call
  3803. * failed due to invalid length of the query buffer,
  3804. * returns the amount of storage needed.
  3805. *
  3806. * \retval WLAN_STATUS_SUCCESS
  3807. * \retval WLAN_STATUS_INVALID_LENGTH
  3808. */
  3809. /*----------------------------------------------------------------------------*/
  3810. WLAN_STATUS
  3811. wlanoidQueryPmkid(IN P_ADAPTER_T prAdapter,
  3812. OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  3813. {
  3814. UINT_32 i;
  3815. P_PARAM_PMKID_T prPmkid;
  3816. P_AIS_SPECIFIC_BSS_INFO_T prAisSpecBssInfo;
  3817. DEBUGFUNC("wlanoidQueryPmkid");
  3818. ASSERT(prAdapter);
  3819. ASSERT(pu4QueryInfoLen);
  3820. if (u4QueryBufferLen)
  3821. ASSERT(pvQueryBuffer);
  3822. prAisSpecBssInfo = &prAdapter->rWifiVar.rAisSpecificBssInfo;
  3823. *pu4QueryInfoLen = OFFSET_OF(PARAM_PMKID_T, arBSSIDInfo) +
  3824. prAisSpecBssInfo->u4PmkidCacheCount * sizeof(PARAM_BSSID_INFO_T);
  3825. if (u4QueryBufferLen < *pu4QueryInfoLen)
  3826. return WLAN_STATUS_INVALID_LENGTH;
  3827. prPmkid = (P_PARAM_PMKID_T) pvQueryBuffer;
  3828. prPmkid->u4Length = *pu4QueryInfoLen;
  3829. prPmkid->u4BSSIDInfoCount = prAisSpecBssInfo->u4PmkidCacheCount;
  3830. for (i = 0; i < prAisSpecBssInfo->u4PmkidCacheCount; i++) {
  3831. kalMemCopy(prPmkid->arBSSIDInfo[i].arBSSID,
  3832. prAisSpecBssInfo->arPmkidCache[i].rBssidInfo.arBSSID, sizeof(PARAM_MAC_ADDRESS));
  3833. kalMemCopy(prPmkid->arBSSIDInfo[i].arPMKID,
  3834. prAisSpecBssInfo->arPmkidCache[i].rBssidInfo.arPMKID, sizeof(PARAM_PMKID_VALUE));
  3835. }
  3836. return WLAN_STATUS_SUCCESS;
  3837. } /* wlanoidQueryPmkid */
  3838. /*----------------------------------------------------------------------------*/
  3839. /*!
  3840. * \brief This routine is called to set the PMKID to the PMK cache in the driver.
  3841. *
  3842. * \param[in] prAdapter Pointer to the Adapter structure.
  3843. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  3844. * \param[in] u4SetBufferLen The length of the set buffer.
  3845. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  3846. * bytes read from the set buffer. If the call failed
  3847. * due to invalid length of the set buffer, returns
  3848. * the amount of storage needed.
  3849. *
  3850. * \retval WLAN_STATUS_SUCCESS
  3851. * \retval WLAN_STATUS_BUFFER_TOO_SHORT
  3852. * \retval WLAN_STATUS_INVALID_DATA
  3853. */
  3854. /*----------------------------------------------------------------------------*/
  3855. WLAN_STATUS
  3856. wlanoidSetPmkid(IN P_ADAPTER_T prAdapter, IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  3857. {
  3858. UINT_32 i, j;
  3859. P_PARAM_PMKID_T prPmkid;
  3860. P_AIS_SPECIFIC_BSS_INFO_T prAisSpecBssInfo;
  3861. DEBUGFUNC("wlanoidSetPmkid");
  3862. DBGLOG(OID, TRACE, "wlanoidSetPmkid\n");
  3863. ASSERT(prAdapter);
  3864. ASSERT(pu4SetInfoLen);
  3865. *pu4SetInfoLen = u4SetBufferLen;
  3866. /* It's possibble BSSIDInfoCount is zero, because OS wishes to clean PMKID */
  3867. if (u4SetBufferLen < OFFSET_OF(PARAM_PMKID_T, arBSSIDInfo))
  3868. return WLAN_STATUS_BUFFER_TOO_SHORT;
  3869. ASSERT(pvSetBuffer);
  3870. prPmkid = (P_PARAM_PMKID_T) pvSetBuffer;
  3871. if (u4SetBufferLen <
  3872. ((prPmkid->u4BSSIDInfoCount * sizeof(PARAM_BSSID_INFO_T)) + OFFSET_OF(PARAM_PMKID_T, arBSSIDInfo)))
  3873. return WLAN_STATUS_INVALID_DATA;
  3874. if (prPmkid->u4BSSIDInfoCount > CFG_MAX_PMKID_CACHE)
  3875. return WLAN_STATUS_INVALID_DATA;
  3876. DBGLOG(OID, TRACE, "Count %u\n", prPmkid->u4BSSIDInfoCount);
  3877. prAisSpecBssInfo = &prAdapter->rWifiVar.rAisSpecificBssInfo;
  3878. /* This OID replace everything in the PMKID cache. */
  3879. if (prPmkid->u4BSSIDInfoCount == 0) {
  3880. prAisSpecBssInfo->u4PmkidCacheCount = 0;
  3881. kalMemZero(prAisSpecBssInfo->arPmkidCache, sizeof(PMKID_ENTRY_T) * CFG_MAX_PMKID_CACHE);
  3882. }
  3883. if ((prAisSpecBssInfo->u4PmkidCacheCount + prPmkid->u4BSSIDInfoCount > CFG_MAX_PMKID_CACHE)) {
  3884. prAisSpecBssInfo->u4PmkidCacheCount = 0;
  3885. kalMemZero(prAisSpecBssInfo->arPmkidCache, sizeof(PMKID_ENTRY_T) * CFG_MAX_PMKID_CACHE);
  3886. }
  3887. /*
  3888. The driver can only clear its PMKID cache whenever it make a media disconnect
  3889. indication. Otherwise, it must change the PMKID cache only when set through this OID.
  3890. */
  3891. for (i = 0; i < prPmkid->u4BSSIDInfoCount; i++) {
  3892. /* Search for desired BSSID. If desired BSSID is found,
  3893. then set the PMKID */
  3894. if (!rsnSearchPmkidEntry(prAdapter, (PUINT_8) prPmkid->arBSSIDInfo[i].arBSSID, &j)) {
  3895. /* No entry found for the specified BSSID, so add one entry */
  3896. if (prAisSpecBssInfo->u4PmkidCacheCount < CFG_MAX_PMKID_CACHE - 1) {
  3897. j = prAisSpecBssInfo->u4PmkidCacheCount;
  3898. kalMemCopy(prAisSpecBssInfo->arPmkidCache[j].rBssidInfo.arBSSID,
  3899. prPmkid->arBSSIDInfo[i].arBSSID, sizeof(PARAM_MAC_ADDRESS));
  3900. prAisSpecBssInfo->u4PmkidCacheCount++;
  3901. } else {
  3902. j = CFG_MAX_PMKID_CACHE;
  3903. }
  3904. }
  3905. if (j < CFG_MAX_PMKID_CACHE) {
  3906. kalMemCopy(prAisSpecBssInfo->arPmkidCache[j].rBssidInfo.arPMKID,
  3907. prPmkid->arBSSIDInfo[i].arPMKID, sizeof(PARAM_PMKID_VALUE));
  3908. DBGLOG(RSN, TRACE, "Add BSSID " MACSTR " idx=%lu PMKID value " MACSTR "\n",
  3909. MAC2STR(prAisSpecBssInfo->arPmkidCache[j].rBssidInfo.arBSSID), j,
  3910. MAC2STR(prAisSpecBssInfo->arPmkidCache[j].rBssidInfo.arPMKID));
  3911. prAisSpecBssInfo->arPmkidCache[j].fgPmkidExist = TRUE;
  3912. }
  3913. }
  3914. return WLAN_STATUS_SUCCESS;
  3915. } /* wlanoidSetPmkid */
  3916. /*----------------------------------------------------------------------------*/
  3917. /*!
  3918. * \brief This routine is called to query the set of supported data rates that
  3919. * the radio is capable of running
  3920. *
  3921. * \param[in] prAdapter Pointer to the Adapter structure
  3922. * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
  3923. * the query
  3924. * \param[in] u4QueryBufferLen The length of the query buffer
  3925. * \param[out] pu4QueryInfoLen If the call is successful, returns the number
  3926. * of bytes written into the query buffer. If the
  3927. * call failed due to invalid length of the query
  3928. * buffer, returns the amount of storage needed.
  3929. *
  3930. * \retval WLAN_STATUS_SUCCESS
  3931. * \retval WLAN_STATUS_INVALID_LENGTH
  3932. */
  3933. /*----------------------------------------------------------------------------*/
  3934. WLAN_STATUS
  3935. wlanoidQuerySupportedRates(IN P_ADAPTER_T prAdapter,
  3936. OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  3937. {
  3938. PARAM_RATES eRate = {
  3939. /* BSSBasicRateSet for 802.11n Non-HT rates */
  3940. 0x8C, /* 6M */
  3941. 0x92, /* 9M */
  3942. 0x98, /* 12M */
  3943. 0xA4, /* 18M */
  3944. 0xB0, /* 24M */
  3945. 0xC8, /* 36M */
  3946. 0xE0, /* 48M */
  3947. 0xEC /* 54M */
  3948. };
  3949. DEBUGFUNC("wlanoidQuerySupportedRates");
  3950. ASSERT(prAdapter);
  3951. ASSERT(pu4QueryInfoLen);
  3952. if (u4QueryBufferLen)
  3953. ASSERT(pvQueryBuffer);
  3954. *pu4QueryInfoLen = sizeof(PARAM_RATES_EX);
  3955. if (u4QueryBufferLen < *pu4QueryInfoLen) {
  3956. DBGLOG(OID, WARN, "Invalid length %u\n", u4QueryBufferLen);
  3957. return WLAN_STATUS_INVALID_LENGTH;
  3958. }
  3959. kalMemCopy(pvQueryBuffer, (PVOID) &eRate, sizeof(PARAM_RATES));
  3960. return WLAN_STATUS_SUCCESS;
  3961. } /* end of wlanoidQuerySupportedRates() */
  3962. /*----------------------------------------------------------------------------*/
  3963. /*!
  3964. * \brief This routine is called to query current desired rates.
  3965. *
  3966. * \param[in] prAdapter Pointer to the Adapter structure.
  3967. * \param[in] pvQueryBuffer Pointer to the buffer that holds the result of
  3968. * the query.
  3969. * \param[in] u4QueryBufferLen The length of the query buffer.
  3970. * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
  3971. * bytes written into the query buffer. If the call
  3972. * failed due to invalid length of the query buffer,
  3973. * returns the amount of storage needed.
  3974. *
  3975. * \retval WLAN_STATUS_SUCCESS
  3976. * \retval WLAN_STATUS_INVALID_LENGTH
  3977. */
  3978. /*----------------------------------------------------------------------------*/
  3979. WLAN_STATUS
  3980. wlanoidQueryDesiredRates(IN P_ADAPTER_T prAdapter,
  3981. OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  3982. {
  3983. DEBUGFUNC("wlanoidQueryDesiredRates");
  3984. ASSERT(prAdapter);
  3985. ASSERT(pu4QueryInfoLen);
  3986. if (u4QueryBufferLen)
  3987. ASSERT(pvQueryBuffer);
  3988. *pu4QueryInfoLen = sizeof(PARAM_RATES_EX);
  3989. if (u4QueryBufferLen < *pu4QueryInfoLen) {
  3990. DBGLOG(OID, WARN, "Invalid length %u\n", u4QueryBufferLen);
  3991. return WLAN_STATUS_INVALID_LENGTH;
  3992. }
  3993. kalMemCopy(pvQueryBuffer, (PVOID) &(prAdapter->rWlanInfo.eDesiredRates), sizeof(PARAM_RATES));
  3994. return WLAN_STATUS_SUCCESS;
  3995. } /* end of wlanoidQueryDesiredRates() */
  3996. /*----------------------------------------------------------------------------*/
  3997. /*!
  3998. * \brief This routine is called to Set the desired rates.
  3999. *
  4000. * \param[in] prAdapter Pointer to the Adapter structure.
  4001. * \param[in] pvSetBuffer Pointer to the buffer that holds the data to be set.
  4002. * \param[in] u4SetBufferLen The length of the set buffer.
  4003. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  4004. * bytes read from the set buffer. If the call failed
  4005. * due to invalid length of the set buffer, returns
  4006. * the amount of storage needed.
  4007. *
  4008. *
  4009. * \retval WLAN_STATUS_SUCCESS
  4010. * \retval WLAN_STATUS_INVALID_LENGTH
  4011. * \retval WLAN_STATUS_INVALID_DATA
  4012. * \retval WLAN_STATUS_ADAPTER_NOT_READY
  4013. */
  4014. /*----------------------------------------------------------------------------*/
  4015. WLAN_STATUS
  4016. wlanoidSetDesiredRates(IN P_ADAPTER_T prAdapter,
  4017. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  4018. {
  4019. UINT_32 i;
  4020. DEBUGFUNC("wlanoidSetDesiredRates");
  4021. ASSERT(prAdapter);
  4022. ASSERT(pvSetBuffer);
  4023. ASSERT(pu4SetInfoLen);
  4024. if (u4SetBufferLen < sizeof(PARAM_RATES)) {
  4025. DBGLOG(OID, WARN, "Invalid length %u\n", u4SetBufferLen);
  4026. return WLAN_STATUS_INVALID_LENGTH;
  4027. }
  4028. *pu4SetInfoLen = sizeof(PARAM_RATES);
  4029. if (u4SetBufferLen < sizeof(PARAM_RATES))
  4030. return WLAN_STATUS_INVALID_LENGTH;
  4031. kalMemCopy((PVOID) &(prAdapter->rWlanInfo.eDesiredRates), pvSetBuffer, sizeof(PARAM_RATES));
  4032. prAdapter->rWlanInfo.eLinkAttr.ucDesiredRateLen = PARAM_MAX_LEN_RATES;
  4033. for (i = 0; i < PARAM_MAX_LEN_RATES; i++)
  4034. prAdapter->rWlanInfo.eLinkAttr.u2DesiredRate[i] = (UINT_16) (prAdapter->rWlanInfo.eDesiredRates[i]);
  4035. return wlanSendSetQueryCmd(prAdapter,
  4036. CMD_ID_LINK_ATTRIB,
  4037. TRUE,
  4038. FALSE,
  4039. TRUE,
  4040. nicCmdEventSetCommon,
  4041. nicOidCmdTimeoutCommon,
  4042. sizeof(CMD_LINK_ATTRIB),
  4043. (PUINT_8) &(prAdapter->rWlanInfo.eLinkAttr), pvSetBuffer, u4SetBufferLen);
  4044. } /* end of wlanoidSetDesiredRates() */
  4045. /*----------------------------------------------------------------------------*/
  4046. /*!
  4047. * \brief This routine is called to query the maximum frame size in bytes,
  4048. * not including the header.
  4049. *
  4050. * \param[in] prAdapter Pointer to the Adapter structure.
  4051. * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
  4052. * the query.
  4053. * \param[in] u4QueryBufferLen The length of the query buffer.
  4054. * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
  4055. * bytes written into the query buffer. If the
  4056. * call failed due to invalid length of the query
  4057. * buffer, returns the amount of storage needed.
  4058. *
  4059. * \retval WLAN_STATUS_SUCCESS
  4060. * \retval WLAN_STATUS_INVALID_LENGTH
  4061. */
  4062. /*----------------------------------------------------------------------------*/
  4063. WLAN_STATUS
  4064. wlanoidQueryMaxFrameSize(IN P_ADAPTER_T prAdapter,
  4065. OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  4066. {
  4067. DEBUGFUNC("wlanoidQueryMaxFrameSize");
  4068. ASSERT(prAdapter);
  4069. ASSERT(pu4QueryInfoLen);
  4070. if (u4QueryBufferLen)
  4071. ASSERT(pvQueryBuffer);
  4072. if (u4QueryBufferLen < sizeof(UINT_32)) {
  4073. *pu4QueryInfoLen = sizeof(UINT_32);
  4074. return WLAN_STATUS_INVALID_LENGTH;
  4075. }
  4076. *(PUINT_32) pvQueryBuffer = ETHERNET_MAX_PKT_SZ - ETHERNET_HEADER_SZ;
  4077. *pu4QueryInfoLen = sizeof(UINT_32);
  4078. return WLAN_STATUS_SUCCESS;
  4079. } /* wlanoidQueryMaxFrameSize */
  4080. /*----------------------------------------------------------------------------*/
  4081. /*!
  4082. * \brief This routine is called to query the maximum total packet length
  4083. * in bytes.
  4084. *
  4085. * \param[in] prAdapter Pointer to the Adapter structure.
  4086. * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
  4087. * the query.
  4088. * \param[in] u4QueryBufferLen The length of the query buffer.
  4089. * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
  4090. * bytes written into the query buffer. If the call
  4091. * failed due to invalid length of the query buffer,
  4092. * returns the amount of storage needed.
  4093. *
  4094. * \retval WLAN_STATUS_SUCCESS
  4095. * \retval WLAN_STATUS_INVALID_LENGTH
  4096. */
  4097. /*----------------------------------------------------------------------------*/
  4098. WLAN_STATUS
  4099. wlanoidQueryMaxTotalSize(IN P_ADAPTER_T prAdapter,
  4100. OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  4101. {
  4102. DEBUGFUNC("wlanoidQueryMaxTotalSize");
  4103. ASSERT(prAdapter);
  4104. ASSERT(pu4QueryInfoLen);
  4105. if (u4QueryBufferLen)
  4106. ASSERT(pvQueryBuffer);
  4107. if (u4QueryBufferLen < sizeof(UINT_32)) {
  4108. *pu4QueryInfoLen = sizeof(UINT_32);
  4109. return WLAN_STATUS_INVALID_LENGTH;
  4110. }
  4111. *(PUINT_32) pvQueryBuffer = ETHERNET_MAX_PKT_SZ;
  4112. *pu4QueryInfoLen = sizeof(UINT_32);
  4113. return WLAN_STATUS_SUCCESS;
  4114. } /* wlanoidQueryMaxTotalSize */
  4115. /*----------------------------------------------------------------------------*/
  4116. /*!
  4117. * \brief This routine is called to query the vendor ID of the NIC.
  4118. *
  4119. * \param[in] prAdapter Pointer to the Adapter structure.
  4120. * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
  4121. * the query.
  4122. * \param[in] u4QueryBufferLen The length of the query buffer.
  4123. * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
  4124. * bytes written into the query buffer. If the call
  4125. * failed due to invalid length of the query buffer,
  4126. * returns the amount of storage needed.
  4127. *
  4128. * \retval WLAN_STATUS_SUCCESS
  4129. * \retval WLAN_STATUS_INVALID_LENGTH
  4130. */
  4131. /*----------------------------------------------------------------------------*/
  4132. WLAN_STATUS
  4133. wlanoidQueryVendorId(IN P_ADAPTER_T prAdapter,
  4134. OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  4135. {
  4136. #if DBG
  4137. PUINT_8 cp;
  4138. #endif
  4139. DEBUGFUNC("wlanoidQueryVendorId");
  4140. ASSERT(prAdapter);
  4141. ASSERT(pu4QueryInfoLen);
  4142. if (u4QueryBufferLen)
  4143. ASSERT(pvQueryBuffer);
  4144. if (u4QueryBufferLen < sizeof(UINT_32)) {
  4145. *pu4QueryInfoLen = sizeof(UINT_32);
  4146. return WLAN_STATUS_INVALID_LENGTH;
  4147. }
  4148. kalMemCopy(pvQueryBuffer, prAdapter->aucMacAddress, 3);
  4149. *((PUINT_8) pvQueryBuffer + 3) = 1;
  4150. *pu4QueryInfoLen = sizeof(UINT_32);
  4151. #if DBG
  4152. cp = (PUINT_8) pvQueryBuffer;
  4153. DBGLOG(OID, LOUD, "Vendor ID=%02x-%02x-%02x-%02x\n", cp[0], cp[1], cp[2], cp[3]);
  4154. #endif
  4155. return WLAN_STATUS_SUCCESS;
  4156. } /* wlanoidQueryVendorId */
  4157. /*----------------------------------------------------------------------------*/
  4158. /*!
  4159. * \brief This routine is called to query the current RSSI value.
  4160. *
  4161. * \param[in] prAdapter Pointer to the Adapter structure.
  4162. * \param[in] pvQueryBuffer Pointer to the buffer that holds the result of the query.
  4163. * \param[in] u4QueryBufferLen The length of the query buffer.
  4164. * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
  4165. * bytes written into the query buffer. If the call failed due to invalid length of
  4166. * the query buffer, returns the amount of storage needed.
  4167. *
  4168. * \retval WLAN_STATUS_SUCCESS
  4169. * \retval WLAN_STATUS_BUFFER_TOO_SHORT
  4170. * \retval WLAN_STATUS_ADAPTER_NOT_READY
  4171. */
  4172. /*----------------------------------------------------------------------------*/
  4173. WLAN_STATUS
  4174. wlanoidQueryRssi(IN P_ADAPTER_T prAdapter,
  4175. OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  4176. {
  4177. DEBUGFUNC("wlanoidQueryRssi");
  4178. ASSERT(prAdapter);
  4179. ASSERT(pu4QueryInfoLen);
  4180. if (u4QueryBufferLen)
  4181. ASSERT(pvQueryBuffer);
  4182. *pu4QueryInfoLen = sizeof(PARAM_RSSI);
  4183. /* Check for query buffer length */
  4184. if (u4QueryBufferLen < *pu4QueryInfoLen) {
  4185. DBGLOG(OID, WARN, "Too short length %u\n", u4QueryBufferLen);
  4186. return WLAN_STATUS_BUFFER_TOO_SHORT;
  4187. }
  4188. if (kalGetMediaStateIndicated(prAdapter->prGlueInfo) == PARAM_MEDIA_STATE_DISCONNECTED) {
  4189. return WLAN_STATUS_ADAPTER_NOT_READY;
  4190. } else if (prAdapter->fgIsLinkQualityValid == TRUE &&
  4191. (kalGetTimeTick() - prAdapter->rLinkQualityUpdateTime) <= CFG_LINK_QUALITY_VALID_PERIOD) {
  4192. PARAM_RSSI rRssi;
  4193. rRssi = (PARAM_RSSI) prAdapter->rLinkQuality.cRssi; /* ranged from (-128 ~ 30) in unit of dBm */
  4194. if (rRssi > PARAM_WHQL_RSSI_MAX_DBM)
  4195. rRssi = PARAM_WHQL_RSSI_MAX_DBM;
  4196. else if (rRssi < PARAM_WHQL_RSSI_MIN_DBM)
  4197. rRssi = PARAM_WHQL_RSSI_MIN_DBM;
  4198. kalMemCopy(pvQueryBuffer, &rRssi, sizeof(PARAM_RSSI));
  4199. return WLAN_STATUS_SUCCESS;
  4200. }
  4201. #ifdef LINUX
  4202. return wlanSendSetQueryCmd(prAdapter,
  4203. CMD_ID_GET_LINK_QUALITY,
  4204. FALSE,
  4205. TRUE,
  4206. TRUE,
  4207. nicCmdEventQueryLinkQuality,
  4208. nicOidCmdTimeoutCommon,
  4209. *pu4QueryInfoLen, pvQueryBuffer, pvQueryBuffer, u4QueryBufferLen);
  4210. #else
  4211. return wlanSendSetQueryCmd(prAdapter,
  4212. CMD_ID_GET_LINK_QUALITY,
  4213. FALSE,
  4214. TRUE,
  4215. TRUE,
  4216. nicCmdEventQueryLinkQuality,
  4217. nicOidCmdTimeoutCommon, 0, NULL, pvQueryBuffer, u4QueryBufferLen);
  4218. #endif
  4219. } /* end of wlanoidQueryRssi() */
  4220. /*----------------------------------------------------------------------------*/
  4221. /*!
  4222. * \brief This routine is called to query the current RSSI trigger value.
  4223. *
  4224. * \param[in] prAdapter Pointer to the Adapter structure.
  4225. * \param[in] pvQueryBuffer Pointer to the buffer that holds the result of the query.
  4226. * \param[in] u4QueryBufferLen The length of the query buffer.
  4227. * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
  4228. * bytes written into the query buffer. If the call failed due to invalid length of
  4229. * the query buffer, returns the amount of storage needed.
  4230. *
  4231. * \retval WLAN_STATUS_SUCCESS
  4232. * \retval WLAN_STATUS_BUFFER_TOO_SHORT
  4233. */
  4234. /*----------------------------------------------------------------------------*/
  4235. WLAN_STATUS
  4236. wlanoidQueryRssiTrigger(IN P_ADAPTER_T prAdapter,
  4237. OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  4238. {
  4239. DEBUGFUNC("wlanoidQueryRssiTrigger");
  4240. ASSERT(prAdapter);
  4241. ASSERT(pu4QueryInfoLen);
  4242. if (u4QueryBufferLen)
  4243. ASSERT(pvQueryBuffer);
  4244. if (prAdapter->rWlanInfo.eRssiTriggerType == ENUM_RSSI_TRIGGER_NONE)
  4245. return WLAN_STATUS_ADAPTER_NOT_READY;
  4246. *pu4QueryInfoLen = sizeof(PARAM_RSSI);
  4247. /* Check for query buffer length */
  4248. if (u4QueryBufferLen < *pu4QueryInfoLen) {
  4249. DBGLOG(OID, WARN, "Too short length %u\n", u4QueryBufferLen);
  4250. return WLAN_STATUS_BUFFER_TOO_SHORT;
  4251. }
  4252. *(PARAM_RSSI *) pvQueryBuffer = prAdapter->rWlanInfo.rRssiTriggerValue;
  4253. DBGLOG(OID, INFO, "RSSI trigger: %d dBm\n", *(PARAM_RSSI *) pvQueryBuffer);
  4254. return WLAN_STATUS_SUCCESS;
  4255. } /* wlanoidQueryRssiTrigger */
  4256. /*----------------------------------------------------------------------------*/
  4257. /*!
  4258. * \brief This routine is called to set a trigger value of the RSSI event.
  4259. *
  4260. * \param[in] prAdapter Pointer to the Adapter structure
  4261. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  4262. * \param[in] u4SetBufferLen The length of the set buffer.
  4263. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  4264. * bytes read from the set buffer. If the call failed
  4265. * due to invalid length of the set buffer, returns the
  4266. * amount of storage needed.
  4267. *
  4268. * \retval WLAN_STATUS_SUCCESS
  4269. *
  4270. */
  4271. /*----------------------------------------------------------------------------*/
  4272. WLAN_STATUS
  4273. wlanoidSetRssiTrigger(IN P_ADAPTER_T prAdapter,
  4274. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  4275. {
  4276. PARAM_RSSI rRssiTriggerValue;
  4277. DEBUGFUNC("wlanoidSetRssiTrigger");
  4278. ASSERT(prAdapter);
  4279. ASSERT(pvSetBuffer);
  4280. ASSERT(pu4SetInfoLen);
  4281. *pu4SetInfoLen = sizeof(PARAM_RSSI);
  4282. rRssiTriggerValue = *(PARAM_RSSI *) pvSetBuffer;
  4283. if (rRssiTriggerValue > PARAM_WHQL_RSSI_MAX_DBM || rRssiTriggerValue < PARAM_WHQL_RSSI_MIN_DBM)
  4284. return
  4285. /* Save the RSSI trigger value to the Adapter structure */
  4286. prAdapter->rWlanInfo.rRssiTriggerValue = rRssiTriggerValue;
  4287. /* If the RSSI trigger value is equal to the current RSSI value, the
  4288. * indication triggers immediately. We need to indicate the protocol
  4289. * that an RSSI status indication event triggers. */
  4290. if (rRssiTriggerValue == (PARAM_RSSI) (prAdapter->rLinkQuality.cRssi)) {
  4291. prAdapter->rWlanInfo.eRssiTriggerType = ENUM_RSSI_TRIGGER_TRIGGERED;
  4292. kalIndicateStatusAndComplete(prAdapter->prGlueInfo,
  4293. WLAN_STATUS_MEDIA_SPECIFIC_INDICATION,
  4294. (PVOID) &prAdapter->rWlanInfo.rRssiTriggerValue, sizeof(PARAM_RSSI));
  4295. } else if (rRssiTriggerValue < (PARAM_RSSI) (prAdapter->rLinkQuality.cRssi))
  4296. prAdapter->rWlanInfo.eRssiTriggerType = ENUM_RSSI_TRIGGER_GREATER;
  4297. else if (rRssiTriggerValue > (PARAM_RSSI) (prAdapter->rLinkQuality.cRssi))
  4298. prAdapter->rWlanInfo.eRssiTriggerType = ENUM_RSSI_TRIGGER_LESS;
  4299. return WLAN_STATUS_SUCCESS;
  4300. } /* wlanoidSetRssiTrigger */
  4301. /*----------------------------------------------------------------------------*/
  4302. /*!
  4303. * \brief This routine is called to set a suggested value for the number of
  4304. * bytes of received packet data that will be indicated to the protocol
  4305. * driver. We just accept the set and ignore this value.
  4306. *
  4307. * \param[in] prAdapter Pointer to the Adapter structure.
  4308. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  4309. * \param[in] u4SetBufferLen The length of the set buffer.
  4310. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  4311. * bytes read from the set buffer. If the call failed
  4312. * due to invalid length of the set buffer, returns
  4313. * the amount of storage needed.
  4314. *
  4315. * \retval WLAN_STATUS_SUCCESS
  4316. * \retval WLAN_STATUS_INVALID_LENGTH
  4317. */
  4318. /*----------------------------------------------------------------------------*/
  4319. WLAN_STATUS
  4320. wlanoidSetCurrentLookahead(IN P_ADAPTER_T prAdapter,
  4321. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  4322. {
  4323. DEBUGFUNC("wlanoidSetCurrentLookahead");
  4324. ASSERT(prAdapter);
  4325. ASSERT(pvSetBuffer);
  4326. ASSERT(pu4SetInfoLen);
  4327. if (u4SetBufferLen < sizeof(UINT_32)) {
  4328. *pu4SetInfoLen = sizeof(UINT_32);
  4329. return WLAN_STATUS_INVALID_LENGTH;
  4330. }
  4331. *pu4SetInfoLen = sizeof(UINT_32);
  4332. return WLAN_STATUS_SUCCESS;
  4333. } /* wlanoidSetCurrentLookahead */
  4334. /*----------------------------------------------------------------------------*/
  4335. /*!
  4336. * \brief This routine is called to query the number of frames that the driver
  4337. * receives but does not indicate to the protocols due to errors.
  4338. *
  4339. * \param[in] pvAdapter Pointer to the Adapter structure.
  4340. * \param[out] pvQueryBuf A pointer to the buffer that holds the result of
  4341. * the query.
  4342. * \param[in] u4QueryBufLen The length of the query buffer.
  4343. * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
  4344. * bytes written into the query buffer. If the call
  4345. * failed due to invalid length of the query buffer,
  4346. * returns the amount of storage needed.
  4347. *
  4348. * \retval WLAN_STATUS_SUCCESS
  4349. * \retval WLAN_STATUS_INVALID_LENGTH
  4350. * \retval WLAN_STATUS_ADAPTER_NOT_READY
  4351. */
  4352. /*----------------------------------------------------------------------------*/
  4353. WLAN_STATUS
  4354. wlanoidQueryRcvError(IN P_ADAPTER_T prAdapter,
  4355. IN PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  4356. {
  4357. DEBUGFUNC("wlanoidQueryRcvError");
  4358. DBGLOG(OID, LOUD, "\n");
  4359. ASSERT(prAdapter);
  4360. if (u4QueryBufferLen)
  4361. ASSERT(pvQueryBuffer);
  4362. ASSERT(pu4QueryInfoLen);
  4363. if (prAdapter->rAcpiState == ACPI_STATE_D3) {
  4364. DBGLOG(OID, WARN,
  4365. "Fail in query receive error! (Adapter not ready). ACPI=D%d, Radio=%d\n",
  4366. prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
  4367. *pu4QueryInfoLen = sizeof(UINT_32);
  4368. return WLAN_STATUS_ADAPTER_NOT_READY;
  4369. } else if (u4QueryBufferLen < sizeof(UINT_32)
  4370. || (u4QueryBufferLen > sizeof(UINT_32) && u4QueryBufferLen < sizeof(UINT_64))) {
  4371. *pu4QueryInfoLen = sizeof(UINT_64);
  4372. return WLAN_STATUS_INVALID_LENGTH;
  4373. }
  4374. #if CFG_ENABLE_STATISTICS_BUFFERING
  4375. if (IsBufferedStatisticsUsable(prAdapter) == TRUE) {
  4376. /* @FIXME, RX_ERROR_DROP_COUNT/RX_FIFO_FULL_DROP_COUNT is not calculated */
  4377. if (u4QueryBufferLen == sizeof(UINT_32)) {
  4378. *pu4QueryInfoLen = sizeof(UINT_32);
  4379. *(PUINT_32) pvQueryBuffer = (UINT_32) prAdapter->rStatStruct.rFCSErrorCount.QuadPart;
  4380. } else {
  4381. *pu4QueryInfoLen = sizeof(UINT_64);
  4382. *(PUINT_64) pvQueryBuffer = (UINT_64) prAdapter->rStatStruct.rFCSErrorCount.QuadPart;
  4383. }
  4384. } else
  4385. #endif
  4386. {
  4387. return wlanSendSetQueryCmd(prAdapter,
  4388. CMD_ID_GET_STATISTICS,
  4389. FALSE,
  4390. TRUE,
  4391. TRUE,
  4392. nicCmdEventQueryRecvError,
  4393. nicOidCmdTimeoutCommon, 0, NULL, pvQueryBuffer, u4QueryBufferLen);
  4394. }
  4395. return WLAN_STATUS_SUCCESS;
  4396. } /* wlanoidQueryRcvError */
  4397. /*----------------------------------------------------------------------------*/
  4398. /*! \brief This routine is called to query the number of frames that the NIC
  4399. * cannot receive due to lack of NIC receive buffer space.
  4400. *
  4401. * \param[in] pvAdapter Pointer to the Adapter structure
  4402. * \param[in] pvQueryBuf A pointer to the buffer that holds the result of the
  4403. * query buffer
  4404. * \param[in] u4QueryBufLen The length of the query buffer
  4405. * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
  4406. * bytes written into the query buffer. If the call
  4407. * failed due to invalid length of the query buffer,
  4408. * returns the amount of storage needed.
  4409. *
  4410. * \retval WLAN_STATUS_SUCCESS If success;
  4411. * \retval WLAN_STATUS_INVALID_LENGTH
  4412. * \retval WLAN_STATUS_ADAPTER_NOT_READY
  4413. */
  4414. /*----------------------------------------------------------------------------*/
  4415. WLAN_STATUS
  4416. wlanoidQueryRcvNoBuffer(IN P_ADAPTER_T prAdapter,
  4417. IN PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  4418. {
  4419. DEBUGFUNC("wlanoidQueryRcvNoBuffer");
  4420. DBGLOG(OID, LOUD, "\n");
  4421. ASSERT(prAdapter);
  4422. if (u4QueryBufferLen)
  4423. ASSERT(pvQueryBuffer);
  4424. ASSERT(pu4QueryInfoLen);
  4425. if (prAdapter->rAcpiState == ACPI_STATE_D3) {
  4426. DBGLOG(OID, WARN,
  4427. "Fail in query receive error! (Adapter not ready). ACPI=D%d, Radio=%d\n",
  4428. prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
  4429. *pu4QueryInfoLen = sizeof(UINT_32);
  4430. return WLAN_STATUS_ADAPTER_NOT_READY;
  4431. } else if (u4QueryBufferLen < sizeof(UINT_32)
  4432. || (u4QueryBufferLen > sizeof(UINT_32) && u4QueryBufferLen < sizeof(UINT_64))) {
  4433. *pu4QueryInfoLen = sizeof(UINT_64);
  4434. return WLAN_STATUS_INVALID_LENGTH;
  4435. }
  4436. #if CFG_ENABLE_STATISTICS_BUFFERING
  4437. if (IsBufferedStatisticsUsable(prAdapter) == TRUE) {
  4438. if (u4QueryBufferLen == sizeof(UINT_32)) {
  4439. *pu4QueryInfoLen = sizeof(UINT_32);
  4440. *(PUINT_32) pvQueryBuffer = (UINT_32) 0; /* @FIXME */
  4441. } else {
  4442. *pu4QueryInfoLen = sizeof(UINT_64);
  4443. *(PUINT_64) pvQueryBuffer = (UINT_64) 0; /* @FIXME */
  4444. }
  4445. } else
  4446. #endif
  4447. {
  4448. return wlanSendSetQueryCmd(prAdapter,
  4449. CMD_ID_GET_STATISTICS,
  4450. FALSE,
  4451. TRUE,
  4452. TRUE,
  4453. nicCmdEventQueryRecvNoBuffer,
  4454. nicOidCmdTimeoutCommon, 0, NULL, pvQueryBuffer, u4QueryBufferLen);
  4455. }
  4456. return WLAN_STATUS_SUCCESS;
  4457. } /* wlanoidQueryRcvNoBuffer */
  4458. /*----------------------------------------------------------------------------*/
  4459. /*! \brief This routine is called to query the number of frames that the NIC
  4460. * received and it is CRC error.
  4461. *
  4462. * \param[in] pvAdapter Pointer to the Adapter structure
  4463. * \param[in] pvQueryBuf A pointer to the buffer that holds the result of the
  4464. * query buffer
  4465. * \param[in] u4QueryBufLen The length of the query buffer
  4466. * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
  4467. * bytes written into the query buffer. If the call
  4468. * failed due to invalid length of the query buffer,
  4469. * returns the amount of storage needed.
  4470. *
  4471. * \retval WLAN_STATUS_SUCCESS If success;
  4472. * \retval WLAN_STATUS_INVALID_LENGTH
  4473. * \retval WLAN_STATUS_ADAPTER_NOT_READY
  4474. */
  4475. /*----------------------------------------------------------------------------*/
  4476. WLAN_STATUS
  4477. wlanoidQueryRcvCrcError(IN P_ADAPTER_T prAdapter,
  4478. IN PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  4479. {
  4480. DEBUGFUNC("wlanoidQueryRcvCrcError");
  4481. DBGLOG(OID, LOUD, "\n");
  4482. ASSERT(prAdapter);
  4483. if (u4QueryBufferLen)
  4484. ASSERT(pvQueryBuffer);
  4485. ASSERT(pu4QueryInfoLen);
  4486. if (prAdapter->rAcpiState == ACPI_STATE_D3) {
  4487. DBGLOG(OID, WARN,
  4488. "Fail in query receive error! (Adapter not ready). ACPI=D%d, Radio=%d\n",
  4489. prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
  4490. *pu4QueryInfoLen = sizeof(UINT_32);
  4491. return WLAN_STATUS_ADAPTER_NOT_READY;
  4492. } else if (u4QueryBufferLen < sizeof(UINT_32)
  4493. || (u4QueryBufferLen > sizeof(UINT_32) && u4QueryBufferLen < sizeof(UINT_64))) {
  4494. *pu4QueryInfoLen = sizeof(UINT_64);
  4495. return WLAN_STATUS_INVALID_LENGTH;
  4496. }
  4497. #if CFG_ENABLE_STATISTICS_BUFFERING
  4498. if (IsBufferedStatisticsUsable(prAdapter) == TRUE) {
  4499. if (u4QueryBufferLen == sizeof(UINT_32)) {
  4500. *pu4QueryInfoLen = sizeof(UINT_32);
  4501. *(PUINT_32) pvQueryBuffer = (UINT_32) prAdapter->rStatStruct.rFCSErrorCount.QuadPart;
  4502. } else {
  4503. *pu4QueryInfoLen = sizeof(UINT_64);
  4504. *(PUINT_64) pvQueryBuffer = (UINT_64) prAdapter->rStatStruct.rFCSErrorCount.QuadPart;
  4505. }
  4506. } else
  4507. #endif
  4508. {
  4509. return wlanSendSetQueryCmd(prAdapter,
  4510. CMD_ID_GET_STATISTICS,
  4511. FALSE,
  4512. TRUE,
  4513. TRUE,
  4514. nicCmdEventQueryRecvCrcError,
  4515. nicOidCmdTimeoutCommon, 0, NULL, pvQueryBuffer, u4QueryBufferLen);
  4516. }
  4517. return WLAN_STATUS_SUCCESS;
  4518. } /* wlanoidQueryRcvCrcError */
  4519. /*----------------------------------------------------------------------------*/
  4520. /*! \brief This routine is called to query the current 802.11 statistics.
  4521. *
  4522. * \param[in] pvAdapter Pointer to the Adapter structure
  4523. * \param[in] pvQueryBuf A pointer to the buffer that holds the result of the
  4524. * query buffer
  4525. * \param[in] u4QueryBufLen The length of the query buffer
  4526. * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
  4527. * bytes written into the query buffer. If the call
  4528. * failed due to invalid length of the query buffer,
  4529. * returns the amount of storage needed.
  4530. *
  4531. * \retval WLAN_STATUS_SUCCESS
  4532. * \retval WLAN_STATUS_INVALID_LENGTH
  4533. */
  4534. /*----------------------------------------------------------------------------*/
  4535. WLAN_STATUS
  4536. wlanoidQueryStatistics(IN P_ADAPTER_T prAdapter,
  4537. IN PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  4538. {
  4539. DEBUGFUNC("wlanoidQueryStatistics");
  4540. DBGLOG(OID, LOUD, "\n");
  4541. ASSERT(prAdapter);
  4542. if (u4QueryBufferLen)
  4543. ASSERT(pvQueryBuffer);
  4544. ASSERT(pu4QueryInfoLen);
  4545. *pu4QueryInfoLen = sizeof(PARAM_802_11_STATISTICS_STRUCT_T);
  4546. if (prAdapter->rAcpiState == ACPI_STATE_D3) {
  4547. DBGLOG(OID, WARN,
  4548. "Fail in query receive error! (Adapter not ready). ACPI=D%d, Radio=%d\n",
  4549. prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
  4550. *pu4QueryInfoLen = sizeof(UINT_32);
  4551. return WLAN_STATUS_ADAPTER_NOT_READY;
  4552. } else if (u4QueryBufferLen < sizeof(PARAM_802_11_STATISTICS_STRUCT_T)) {
  4553. DBGLOG(OID, WARN, "Too short length %u\n", u4QueryBufferLen);
  4554. return WLAN_STATUS_INVALID_LENGTH;
  4555. }
  4556. #if CFG_ENABLE_STATISTICS_BUFFERING
  4557. if (IsBufferedStatisticsUsable(prAdapter) == TRUE) {
  4558. P_PARAM_802_11_STATISTICS_STRUCT_T prStatistics;
  4559. *pu4QueryInfoLen = sizeof(PARAM_802_11_STATISTICS_STRUCT_T);
  4560. prStatistics = (P_PARAM_802_11_STATISTICS_STRUCT_T) pvQueryBuffer;
  4561. prStatistics->u4Length = sizeof(PARAM_802_11_STATISTICS_STRUCT_T);
  4562. prStatistics->rTransmittedFragmentCount = prAdapter->rStatStruct.rTransmittedFragmentCount;
  4563. prStatistics->rMulticastTransmittedFrameCount = prAdapter->rStatStruct.rMulticastTransmittedFrameCount;
  4564. prStatistics->rFailedCount = prAdapter->rStatStruct.rFailedCount;
  4565. prStatistics->rRetryCount = prAdapter->rStatStruct.rRetryCount;
  4566. prStatistics->rMultipleRetryCount = prAdapter->rStatStruct.rMultipleRetryCount;
  4567. prStatistics->rRTSSuccessCount = prAdapter->rStatStruct.rRTSSuccessCount;
  4568. prStatistics->rRTSFailureCount = prAdapter->rStatStruct.rRTSFailureCount;
  4569. prStatistics->rACKFailureCount = prAdapter->rStatStruct.rACKFailureCount;
  4570. prStatistics->rFrameDuplicateCount = prAdapter->rStatStruct.rFrameDuplicateCount;
  4571. prStatistics->rReceivedFragmentCount = prAdapter->rStatStruct.rReceivedFragmentCount;
  4572. prStatistics->rMulticastReceivedFrameCount = prAdapter->rStatStruct.rMulticastReceivedFrameCount;
  4573. prStatistics->rFCSErrorCount = prAdapter->rStatStruct.rFCSErrorCount;
  4574. prStatistics->rTKIPLocalMICFailures.QuadPart = 0;
  4575. prStatistics->rTKIPICVErrors.QuadPart = 0;
  4576. prStatistics->rTKIPCounterMeasuresInvoked.QuadPart = 0;
  4577. prStatistics->rTKIPReplays.QuadPart = 0;
  4578. prStatistics->rCCMPFormatErrors.QuadPart = 0;
  4579. prStatistics->rCCMPReplays.QuadPart = 0;
  4580. prStatistics->rCCMPDecryptErrors.QuadPart = 0;
  4581. prStatistics->rFourWayHandshakeFailures.QuadPart = 0;
  4582. prStatistics->rWEPUndecryptableCount.QuadPart = 0;
  4583. prStatistics->rWEPICVErrorCount.QuadPart = 0;
  4584. prStatistics->rDecryptSuccessCount.QuadPart = 0;
  4585. prStatistics->rDecryptFailureCount.QuadPart = 0;
  4586. } else
  4587. #endif
  4588. {
  4589. return wlanSendSetQueryCmd(prAdapter,
  4590. CMD_ID_GET_STATISTICS,
  4591. FALSE,
  4592. TRUE,
  4593. TRUE,
  4594. nicCmdEventQueryStatistics,
  4595. nicOidCmdTimeoutCommon, 0, NULL, pvQueryBuffer, u4QueryBufferLen);
  4596. }
  4597. return WLAN_STATUS_SUCCESS;
  4598. } /* wlanoidQueryStatistics */
  4599. /*----------------------------------------------------------------------------*/
  4600. /*! \brief This routine is called to query current media streaming status.
  4601. *
  4602. * \param[in] pvAdapter Pointer to the Adapter structure
  4603. * \param[in] pvQueryBuf A pointer to the buffer that holds the result of the
  4604. * query buffer
  4605. * \param[in] u4QueryBufLen The length of the query buffer
  4606. * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
  4607. * bytes written into the query buffer. If the call
  4608. * failed due to invalid length of the query buffer,
  4609. * returns the amount of storage needed.
  4610. *
  4611. * \retval WLAN_STATUS_SUCCESS
  4612. */
  4613. /*----------------------------------------------------------------------------*/
  4614. WLAN_STATUS
  4615. wlanoidQueryMediaStreamMode(IN P_ADAPTER_T prAdapter,
  4616. IN PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  4617. {
  4618. DEBUGFUNC("wlanoidQueryMediaStreamMode");
  4619. ASSERT(prAdapter);
  4620. ASSERT(pu4QueryInfoLen);
  4621. if (u4QueryBufferLen)
  4622. ASSERT(pvQueryBuffer);
  4623. *pu4QueryInfoLen = sizeof(ENUM_MEDIA_STREAM_MODE);
  4624. if (u4QueryBufferLen < *pu4QueryInfoLen) {
  4625. DBGLOG(OID, WARN, "Invalid length %u\n", u4QueryBufferLen);
  4626. return WLAN_STATUS_INVALID_LENGTH;
  4627. }
  4628. *(P_ENUM_MEDIA_STREAM_MODE) pvQueryBuffer =
  4629. prAdapter->rWlanInfo.eLinkAttr.ucMediaStreamMode == 0 ? ENUM_MEDIA_STREAM_OFF : ENUM_MEDIA_STREAM_ON;
  4630. return WLAN_STATUS_SUCCESS;
  4631. } /* wlanoidQueryMediaStreamMode */
  4632. /*----------------------------------------------------------------------------*/
  4633. /*! \brief This routine is called to enter media streaming mode or exit media streaming mode
  4634. *
  4635. * \param[in] pvAdapter Pointer to the Adapter structure
  4636. * \param[in] pvQueryBuf A pointer to the buffer that holds the result of the
  4637. * query buffer
  4638. * \param[in] u4QueryBufLen The length of the query buffer
  4639. * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
  4640. * bytes written into the query buffer. If the call
  4641. * failed due to invalid length of the query buffer,
  4642. * returns the amount of storage needed.
  4643. *
  4644. * \retval WLAN_STATUS_SUCCESS
  4645. */
  4646. /*----------------------------------------------------------------------------*/
  4647. WLAN_STATUS
  4648. wlanoidSetMediaStreamMode(IN P_ADAPTER_T prAdapter,
  4649. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  4650. {
  4651. ENUM_MEDIA_STREAM_MODE eStreamMode;
  4652. DEBUGFUNC("wlanoidSetMediaStreamMode");
  4653. ASSERT(prAdapter);
  4654. ASSERT(pvSetBuffer);
  4655. ASSERT(pu4SetInfoLen);
  4656. if (u4SetBufferLen < sizeof(ENUM_MEDIA_STREAM_MODE)) {
  4657. DBGLOG(OID, WARN, "Invalid length %u\n", u4SetBufferLen);
  4658. return WLAN_STATUS_INVALID_LENGTH;
  4659. }
  4660. *pu4SetInfoLen = sizeof(ENUM_MEDIA_STREAM_MODE);
  4661. eStreamMode = *(P_ENUM_MEDIA_STREAM_MODE) pvSetBuffer;
  4662. if (eStreamMode == ENUM_MEDIA_STREAM_OFF)
  4663. prAdapter->rWlanInfo.eLinkAttr.ucMediaStreamMode = 0;
  4664. else
  4665. prAdapter->rWlanInfo.eLinkAttr.ucMediaStreamMode = 1;
  4666. return wlanSendSetQueryCmd(prAdapter,
  4667. CMD_ID_LINK_ATTRIB,
  4668. TRUE,
  4669. FALSE,
  4670. TRUE,
  4671. nicCmdEventSetMediaStreamMode,
  4672. nicOidCmdTimeoutCommon,
  4673. sizeof(CMD_LINK_ATTRIB),
  4674. (PUINT_8) &(prAdapter->rWlanInfo.eLinkAttr), pvSetBuffer, u4SetBufferLen);
  4675. } /* wlanoidSetMediaStreamMode */
  4676. /*----------------------------------------------------------------------------*/
  4677. /*! \brief This routine is called to query the permanent MAC address of the NIC.
  4678. *
  4679. * \param[in] pvAdapter Pointer to the Adapter structure
  4680. * \param[in] pvQueryBuf A pointer to the buffer that holds the result of the
  4681. * query buffer
  4682. * \param[in] u4QueryBufLen The length of the query buffer
  4683. * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
  4684. * bytes written into the query buffer. If the call
  4685. * failed due to invalid length of the query buffer,
  4686. * returns the amount of storage needed.
  4687. *
  4688. * \retval WLAN_STATUS_SUCCESS
  4689. */
  4690. /*----------------------------------------------------------------------------*/
  4691. WLAN_STATUS
  4692. wlanoidQueryPermanentAddr(IN P_ADAPTER_T prAdapter,
  4693. IN PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  4694. {
  4695. DEBUGFUNC("wlanoidQueryPermanentAddr");
  4696. DBGLOG(OID, LOUD, "\n");
  4697. ASSERT(prAdapter);
  4698. ASSERT(pu4QueryInfoLen);
  4699. if (u4QueryBufferLen)
  4700. ASSERT(pvQueryBuffer);
  4701. if (u4QueryBufferLen < MAC_ADDR_LEN)
  4702. return WLAN_STATUS_BUFFER_TOO_SHORT;
  4703. COPY_MAC_ADDR(pvQueryBuffer, prAdapter->rWifiVar.aucPermanentAddress);
  4704. *pu4QueryInfoLen = MAC_ADDR_LEN;
  4705. return WLAN_STATUS_SUCCESS;
  4706. } /* wlanoidQueryPermanentAddr */
  4707. /*----------------------------------------------------------------------------*/
  4708. /*! \brief This routine is called to query the MAC address the NIC is currently using.
  4709. *
  4710. * \param[in] pvAdapter Pointer to the Adapter structure
  4711. * \param[in] pvQueryBuf A pointer to the buffer that holds the result of the
  4712. * query buffer
  4713. * \param[in] u4QueryBufLen The length of the query buffer
  4714. * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
  4715. * bytes written into the query buffer. If the call
  4716. * failed due to invalid length of the query buffer,
  4717. * returns the amount of storage needed.
  4718. *
  4719. * \retval WLAN_STATUS_SUCCESS
  4720. * \retval WLAN_STATUS_BUFFER_TOO_SHORT
  4721. */
  4722. /*----------------------------------------------------------------------------*/
  4723. WLAN_STATUS
  4724. wlanoidQueryCurrentAddr(IN P_ADAPTER_T prAdapter,
  4725. IN PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  4726. {
  4727. DEBUGFUNC("wlanoidQueryCurrentAddr");
  4728. DBGLOG(OID, LOUD, "\n");
  4729. ASSERT(prAdapter);
  4730. ASSERT(pu4QueryInfoLen);
  4731. if (u4QueryBufferLen)
  4732. ASSERT(pvQueryBuffer);
  4733. if (u4QueryBufferLen < MAC_ADDR_LEN)
  4734. return WLAN_STATUS_BUFFER_TOO_SHORT;
  4735. COPY_MAC_ADDR(pvQueryBuffer, prAdapter->rWifiVar.aucMacAddress);
  4736. *pu4QueryInfoLen = MAC_ADDR_LEN;
  4737. return WLAN_STATUS_SUCCESS;
  4738. } /* wlanoidQueryCurrentAddr */
  4739. /*----------------------------------------------------------------------------*/
  4740. /*! \brief This routine is called to query NIC link speed.
  4741. *
  4742. * \param[in] pvAdapter Pointer to the Adapter structure
  4743. * \param[in] pvQueryBuf A pointer to the buffer that holds the result of the
  4744. * query buffer
  4745. * \param[in] u4QueryBufLen The length of the query buffer
  4746. * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
  4747. * bytes written into the query buffer. If the call
  4748. * failed due to invalid length of the query buffer,
  4749. * returns the amount of storage needed.
  4750. *
  4751. * \retval WLAN_STATUS_SUCCESS
  4752. * \retval WLAN_STATUS_BUFFER_TOO_SHORT
  4753. *
  4754. */
  4755. /*----------------------------------------------------------------------------*/
  4756. WLAN_STATUS
  4757. wlanoidQueryLinkSpeed(IN P_ADAPTER_T prAdapter,
  4758. IN PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  4759. {
  4760. DEBUGFUNC("wlanoidQueryLinkSpeed");
  4761. ASSERT(prAdapter);
  4762. ASSERT(pu4QueryInfoLen);
  4763. if (u4QueryBufferLen)
  4764. ASSERT(pvQueryBuffer);
  4765. *pu4QueryInfoLen = sizeof(UINT_32);
  4766. if (u4QueryBufferLen < sizeof(UINT_32))
  4767. return WLAN_STATUS_BUFFER_TOO_SHORT;
  4768. if (kalGetMediaStateIndicated(prAdapter->prGlueInfo) != PARAM_MEDIA_STATE_CONNECTED) {
  4769. return WLAN_STATUS_ADAPTER_NOT_READY;
  4770. } else if (prAdapter->fgIsLinkRateValid == TRUE &&
  4771. (kalGetTimeTick() - prAdapter->rLinkRateUpdateTime) <= CFG_LINK_QUALITY_VALID_PERIOD) {
  4772. *(PUINT_32) pvQueryBuffer = prAdapter->rLinkQuality.u2LinkSpeed * 5000; /* change to unit of 100bps */
  4773. return WLAN_STATUS_SUCCESS;
  4774. } else {
  4775. return wlanSendSetQueryCmd(prAdapter,
  4776. CMD_ID_GET_LINK_QUALITY,
  4777. FALSE,
  4778. TRUE,
  4779. TRUE,
  4780. nicCmdEventQueryLinkSpeed,
  4781. nicOidCmdTimeoutCommon, 0, NULL, pvQueryBuffer, u4QueryBufferLen);
  4782. }
  4783. } /* end of wlanoidQueryLinkSpeed() */
  4784. /*----------------------------------------------------------------------------*/
  4785. /*!
  4786. * \brief This routine is called to query MCR value.
  4787. *
  4788. * \param[in] pvAdapter Pointer to the Adapter structure.
  4789. * \param[out] pvQueryBuf A pointer to the buffer that holds the result of
  4790. * the query.
  4791. * \param[in] u4QueryBufLen The length of the query buffer.
  4792. * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
  4793. * bytes written into the query buffer. If the call
  4794. * failed due to invalid length of the query buffer,
  4795. * returns the amount of storage needed.
  4796. *
  4797. * \retval WLAN_STATUS_SUCCESS
  4798. * \retval WLAN_STATUS_INVALID_LENGTH
  4799. */
  4800. /*----------------------------------------------------------------------------*/
  4801. WLAN_STATUS
  4802. wlanoidQueryMcrRead(IN P_ADAPTER_T prAdapter,
  4803. IN PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  4804. {
  4805. P_PARAM_CUSTOM_MCR_RW_STRUCT_T prMcrRdInfo;
  4806. CMD_ACCESS_REG rCmdAccessReg;
  4807. DEBUGFUNC("wlanoidQueryMcrRead");
  4808. DBGLOG(OID, LOUD, "\n");
  4809. ASSERT(prAdapter);
  4810. ASSERT(pu4QueryInfoLen);
  4811. if (u4QueryBufferLen)
  4812. ASSERT(pvQueryBuffer);
  4813. *pu4QueryInfoLen = sizeof(PARAM_CUSTOM_MCR_RW_STRUCT_T);
  4814. if (u4QueryBufferLen < sizeof(PARAM_CUSTOM_MCR_RW_STRUCT_T))
  4815. return WLAN_STATUS_INVALID_LENGTH;
  4816. prMcrRdInfo = (P_PARAM_CUSTOM_MCR_RW_STRUCT_T) pvQueryBuffer;
  4817. /* 0x9000 - 0x9EFF reserved for FW */
  4818. #if CFG_SUPPORT_SWCR
  4819. if ((prMcrRdInfo->u4McrOffset >> 16) == 0x9F00) {
  4820. swCrReadWriteCmd(prAdapter,
  4821. SWCR_READ,
  4822. (UINT_16) (prMcrRdInfo->u4McrOffset & BITS(0, 15)), &prMcrRdInfo->u4McrData);
  4823. return WLAN_STATUS_SUCCESS;
  4824. }
  4825. #endif /* CFG_SUPPORT_SWCR */
  4826. /* Check if access F/W Domain MCR (due to WiFiSYS is placed from 0x6000-0000 */
  4827. if (prMcrRdInfo->u4McrOffset & 0xFFFF0000) {
  4828. /* fill command */
  4829. rCmdAccessReg.u4Address = prMcrRdInfo->u4McrOffset;
  4830. rCmdAccessReg.u4Data = 0;
  4831. return wlanSendSetQueryCmd(prAdapter,
  4832. CMD_ID_ACCESS_REG,
  4833. FALSE,
  4834. TRUE,
  4835. TRUE,
  4836. nicCmdEventQueryMcrRead,
  4837. nicOidCmdTimeoutCommon,
  4838. sizeof(CMD_ACCESS_REG),
  4839. (PUINT_8) &rCmdAccessReg, pvQueryBuffer, u4QueryBufferLen);
  4840. } else {
  4841. HAL_MCR_RD(prAdapter, prMcrRdInfo->u4McrOffset & BITS(2, 31), /* address is in DWORD unit */
  4842. &prMcrRdInfo->u4McrData);
  4843. DBGLOG(OID, TRACE, "MCR Read: Offset = %#08x, Data = %#08x\n",
  4844. prMcrRdInfo->u4McrOffset, prMcrRdInfo->u4McrData);
  4845. return WLAN_STATUS_SUCCESS;
  4846. }
  4847. } /* end of wlanoidQueryMcrRead() */
  4848. /*----------------------------------------------------------------------------*/
  4849. /*!
  4850. * \brief This routine is called to write MCR and enable specific function.
  4851. *
  4852. * \param[in] prAdapter Pointer to the Adapter structure.
  4853. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  4854. * \param[in] u4SetBufferLen The length of the set buffer.
  4855. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  4856. * bytes read from the set buffer. If the call failed
  4857. * due to invalid length of the set buffer, returns
  4858. * the amount of storage needed.
  4859. *
  4860. * \retval WLAN_STATUS_SUCCESS
  4861. * \retval WLAN_STATUS_INVALID_LENGTH
  4862. */
  4863. /*----------------------------------------------------------------------------*/
  4864. WLAN_STATUS
  4865. wlanoidSetMcrWrite(IN P_ADAPTER_T prAdapter,
  4866. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  4867. {
  4868. P_PARAM_CUSTOM_MCR_RW_STRUCT_T prMcrWrInfo;
  4869. CMD_ACCESS_REG rCmdAccessReg;
  4870. #if CFG_STRESS_TEST_SUPPORT
  4871. P_AIS_FSM_INFO_T prAisFsmInfo;
  4872. P_BSS_INFO_T prBssInfo = prAdapter->prAisBssInfo;
  4873. P_STA_RECORD_T prStaRec = prBssInfo->prStaRecOfAP;
  4874. UINT_32 u4McrOffset, u4McrData;
  4875. #endif
  4876. DEBUGFUNC("wlanoidSetMcrWrite");
  4877. DBGLOG(OID, LOUD, "\n");
  4878. ASSERT(prAdapter);
  4879. ASSERT(pu4SetInfoLen);
  4880. *pu4SetInfoLen = sizeof(PARAM_CUSTOM_MCR_RW_STRUCT_T);
  4881. if (u4SetBufferLen < sizeof(PARAM_CUSTOM_MCR_RW_STRUCT_T))
  4882. return WLAN_STATUS_INVALID_LENGTH;
  4883. ASSERT(pvSetBuffer);
  4884. prMcrWrInfo = (P_PARAM_CUSTOM_MCR_RW_STRUCT_T) pvSetBuffer;
  4885. /* 0x9000 - 0x9EFF reserved for FW */
  4886. /* 0xFFFE reserved for FW */
  4887. /* -- Puff Stress Test Begin */
  4888. #if CFG_STRESS_TEST_SUPPORT
  4889. /* 0xFFFFFFFE for Control Rate */
  4890. if (prMcrWrInfo->u4McrOffset == 0xFFFFFFFE) {
  4891. if (prMcrWrInfo->u4McrData < FIXED_RATE_NUM && prMcrWrInfo->u4McrData > 0)
  4892. prAdapter->rWifiVar.eRateSetting = (ENUM_REGISTRY_FIXED_RATE_T) (prMcrWrInfo->u4McrData);
  4893. cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_1);
  4894. cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
  4895. DEBUGFUNC("[Stress Test]Complete Rate is Changed...\n");
  4896. DBGLOG(OID, TRACE, "[Stress Test] Rate is Changed to index %d...\n", prAdapter->rWifiVar.eRateSetting);
  4897. }
  4898. /* 0xFFFFFFFD for Switch Channel */
  4899. else if (prMcrWrInfo->u4McrOffset == 0xFFFFFFFD) {
  4900. if (prMcrWrInfo->u4McrData <= 11 && prMcrWrInfo->u4McrData >= 1)
  4901. prBssInfo->ucPrimaryChannel = prMcrWrInfo->u4McrData;
  4902. nicUpdateBss(prAdapter, prBssInfo->ucNetTypeIndex);
  4903. DBGLOG(OID, TRACE, "[Stress Test] Channel is switched to %d ...\n", prBssInfo->ucPrimaryChannel);
  4904. return WLAN_STATUS_SUCCESS;
  4905. }
  4906. /* 0xFFFFFFFFC for Control RF Band and SCO */
  4907. else if (prMcrWrInfo->u4McrOffset == 0xFFFFFFFC) {
  4908. /* Band */
  4909. if (prMcrWrInfo->u4McrData & 0x80000000) {
  4910. /* prBssInfo->eBand = BAND_5G; */
  4911. /* prBssInfo->ucPrimaryChannel = 52; // Bond to Channel 52 */
  4912. } else {
  4913. prBssInfo->eBand = BAND_2G4;
  4914. prBssInfo->ucPrimaryChannel = 8; /* Bond to Channel 6 */
  4915. }
  4916. /* Bandwidth */
  4917. if (prMcrWrInfo->u4McrData & 0x00010000) {
  4918. prStaRec->u2HtCapInfo |= HT_CAP_INFO_SUP_CHNL_WIDTH;
  4919. prStaRec->ucDesiredPhyTypeSet = PHY_TYPE_BIT_HT;
  4920. if (prMcrWrInfo->u4McrData == 0x00010002) {
  4921. prBssInfo->eBssSCO = CHNL_EXT_SCB; /* U20 */
  4922. prBssInfo->ucPrimaryChannel += 2;
  4923. } else if (prMcrWrInfo->u4McrData == 0x00010001) {
  4924. prBssInfo->eBssSCO = CHNL_EXT_SCA; /* L20 */
  4925. prBssInfo->ucPrimaryChannel -= 2;
  4926. } else {
  4927. prBssInfo->eBssSCO = CHNL_EXT_SCA; /* 40 */
  4928. }
  4929. }
  4930. if (prMcrWrInfo->u4McrData & 0x00000000) {
  4931. prStaRec->u2HtCapInfo &= ~HT_CAP_INFO_SUP_CHNL_WIDTH;
  4932. prBssInfo->eBssSCO = CHNL_EXT_SCN;
  4933. }
  4934. rlmBssInitForAPandIbss(prAdapter, prBssInfo);
  4935. }
  4936. /* 0xFFFFFFFB for HT Capability */
  4937. else if (prMcrWrInfo->u4McrOffset == 0xFFFFFFFB) {
  4938. /* Enable HT Capability */
  4939. if (prMcrWrInfo->u4McrData & 0x00000001) {
  4940. prStaRec->u2HtCapInfo |= HT_CAP_INFO_HT_GF;
  4941. DEBUGFUNC("[Stress Test]Enable HT capability...\n");
  4942. } else {
  4943. prStaRec->u2HtCapInfo &= (~HT_CAP_INFO_HT_GF);
  4944. DEBUGFUNC("[Stress Test]Disable HT capability...\n");
  4945. }
  4946. cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_1);
  4947. cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
  4948. }
  4949. /* 0xFFFFFFFA for Enable Random Rx Reset */
  4950. else if (prMcrWrInfo->u4McrOffset == 0xFFFFFFFA) {
  4951. rCmdAccessReg.u4Address = prMcrWrInfo->u4McrOffset;
  4952. rCmdAccessReg.u4Data = prMcrWrInfo->u4McrData;
  4953. return wlanSendSetQueryCmd(prAdapter,
  4954. CMD_ID_RANDOM_RX_RESET_EN,
  4955. TRUE,
  4956. FALSE,
  4957. TRUE,
  4958. nicCmdEventSetCommon,
  4959. nicOidCmdTimeoutCommon,
  4960. sizeof(CMD_ACCESS_REG),
  4961. (PUINT_8) &rCmdAccessReg, pvSetBuffer, u4SetBufferLen);
  4962. }
  4963. /* 0xFFFFFFF9 for Disable Random Rx Reset */
  4964. else if (prMcrWrInfo->u4McrOffset == 0xFFFFFFF9) {
  4965. rCmdAccessReg.u4Address = prMcrWrInfo->u4McrOffset;
  4966. rCmdAccessReg.u4Data = prMcrWrInfo->u4McrData;
  4967. return wlanSendSetQueryCmd(prAdapter,
  4968. CMD_ID_RANDOM_RX_RESET_DE,
  4969. TRUE,
  4970. FALSE,
  4971. TRUE,
  4972. nicCmdEventSetCommon,
  4973. nicOidCmdTimeoutCommon,
  4974. sizeof(CMD_ACCESS_REG),
  4975. (PUINT_8) &rCmdAccessReg, pvSetBuffer, u4SetBufferLen);
  4976. }
  4977. /* 0xFFFFFFF8 for Enable SAPP */
  4978. else if (prMcrWrInfo->u4McrOffset == 0xFFFFFFF8) {
  4979. rCmdAccessReg.u4Address = prMcrWrInfo->u4McrOffset;
  4980. rCmdAccessReg.u4Data = prMcrWrInfo->u4McrData;
  4981. return wlanSendSetQueryCmd(prAdapter,
  4982. CMD_ID_SAPP_EN,
  4983. TRUE,
  4984. FALSE,
  4985. TRUE,
  4986. nicCmdEventSetCommon,
  4987. nicOidCmdTimeoutCommon,
  4988. sizeof(CMD_ACCESS_REG),
  4989. (PUINT_8) &rCmdAccessReg, pvSetBuffer, u4SetBufferLen);
  4990. }
  4991. /* 0xFFFFFFF7 for Disable SAPP */
  4992. else if (prMcrWrInfo->u4McrOffset == 0xFFFFFFF7) {
  4993. rCmdAccessReg.u4Address = prMcrWrInfo->u4McrOffset;
  4994. rCmdAccessReg.u4Data = prMcrWrInfo->u4McrData;
  4995. return wlanSendSetQueryCmd(prAdapter,
  4996. CMD_ID_SAPP_DE,
  4997. TRUE,
  4998. FALSE,
  4999. TRUE,
  5000. nicCmdEventSetCommon,
  5001. nicOidCmdTimeoutCommon,
  5002. sizeof(CMD_ACCESS_REG),
  5003. (PUINT_8) &rCmdAccessReg, pvSetBuffer, u4SetBufferLen);
  5004. }
  5005. else
  5006. #endif
  5007. /* -- Puff Stress Test End */
  5008. /* Check if access F/W Domain MCR */
  5009. if (prMcrWrInfo->u4McrOffset & 0xFFFF0000) {
  5010. /* 0x9000 - 0x9EFF reserved for FW */
  5011. #if CFG_SUPPORT_SWCR
  5012. if ((prMcrWrInfo->u4McrOffset >> 16) == 0x9F00) {
  5013. swCrReadWriteCmd(prAdapter,
  5014. SWCR_WRITE,
  5015. (UINT_16) (prMcrWrInfo->u4McrOffset & BITS(0, 15)), &prMcrWrInfo->u4McrData);
  5016. return WLAN_STATUS_SUCCESS;
  5017. }
  5018. #endif /* CFG_SUPPORT_SWCR */
  5019. #if 1
  5020. /* low power test special command */
  5021. if (prMcrWrInfo->u4McrOffset == 0x11111110) {
  5022. WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
  5023. /* DbgPrint("Enter test mode\n"); */
  5024. prAdapter->fgTestMode = TRUE;
  5025. return rStatus;
  5026. }
  5027. if (prMcrWrInfo->u4McrOffset == 0x11111111) {
  5028. /* DbgPrint("nicpmSetAcpiPowerD3\n"); */
  5029. nicpmSetAcpiPowerD3(prAdapter);
  5030. kalDevSetPowerState(prAdapter->prGlueInfo, (UINT_32) ParamDeviceStateD3);
  5031. return WLAN_STATUS_SUCCESS;
  5032. }
  5033. if (prMcrWrInfo->u4McrOffset == 0x11111112) {
  5034. /* DbgPrint("LP enter sleep\n"); */
  5035. /* fill command */
  5036. rCmdAccessReg.u4Address = prMcrWrInfo->u4McrOffset;
  5037. rCmdAccessReg.u4Data = prMcrWrInfo->u4McrData;
  5038. return wlanSendSetQueryCmd(prAdapter,
  5039. CMD_ID_ACCESS_REG,
  5040. TRUE,
  5041. FALSE,
  5042. TRUE,
  5043. nicCmdEventSetCommon,
  5044. nicOidCmdTimeoutCommon,
  5045. sizeof(CMD_ACCESS_REG),
  5046. (PUINT_8) &rCmdAccessReg, pvSetBuffer, u4SetBufferLen);
  5047. }
  5048. #endif
  5049. #if 1
  5050. /* low power test special command */
  5051. if (prMcrWrInfo->u4McrOffset == 0x11111110) {
  5052. WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
  5053. /* DbgPrint("Enter test mode\n"); */
  5054. prAdapter->fgTestMode = TRUE;
  5055. return rStatus;
  5056. }
  5057. if (prMcrWrInfo->u4McrOffset == 0x11111111) {
  5058. /* DbgPrint("nicpmSetAcpiPowerD3\n"); */
  5059. nicpmSetAcpiPowerD3(prAdapter);
  5060. kalDevSetPowerState(prAdapter->prGlueInfo, (UINT_32) ParamDeviceStateD3);
  5061. return WLAN_STATUS_SUCCESS;
  5062. }
  5063. if (prMcrWrInfo->u4McrOffset == 0x11111112) {
  5064. /* DbgPrint("LP enter sleep\n"); */
  5065. /* fill command */
  5066. rCmdAccessReg.u4Address = prMcrWrInfo->u4McrOffset;
  5067. rCmdAccessReg.u4Data = prMcrWrInfo->u4McrData;
  5068. return wlanSendSetQueryCmd(prAdapter,
  5069. CMD_ID_ACCESS_REG,
  5070. TRUE,
  5071. FALSE,
  5072. TRUE,
  5073. nicCmdEventSetCommon,
  5074. nicOidCmdTimeoutCommon,
  5075. sizeof(CMD_ACCESS_REG),
  5076. (PUINT_8) &rCmdAccessReg, pvSetBuffer, u4SetBufferLen);
  5077. }
  5078. #endif
  5079. #if CFG_SUPPORT_SDIO_READ_WRITE_PATTERN
  5080. if (prMcrWrInfo->u4McrOffset == 0x22220000) {
  5081. /* read test mode */
  5082. kalSetSdioTestPattern(prAdapter->prGlueInfo, TRUE, TRUE);
  5083. return WLAN_STATUS_SUCCESS;
  5084. }
  5085. if (prMcrWrInfo->u4McrOffset == 0x22220001) {
  5086. /* write test mode */
  5087. kalSetSdioTestPattern(prAdapter->prGlueInfo, TRUE, FALSE);
  5088. return WLAN_STATUS_SUCCESS;
  5089. }
  5090. if (prMcrWrInfo->u4McrOffset == 0x22220002) {
  5091. /* leave from test mode */
  5092. kalSetSdioTestPattern(prAdapter->prGlueInfo, FALSE, FALSE);
  5093. return WLAN_STATUS_SUCCESS;
  5094. }
  5095. #endif
  5096. /* fill command */
  5097. rCmdAccessReg.u4Address = prMcrWrInfo->u4McrOffset;
  5098. rCmdAccessReg.u4Data = prMcrWrInfo->u4McrData;
  5099. return wlanSendSetQueryCmd(prAdapter,
  5100. CMD_ID_ACCESS_REG,
  5101. TRUE,
  5102. FALSE,
  5103. TRUE,
  5104. nicCmdEventSetCommon,
  5105. nicOidCmdTimeoutCommon,
  5106. sizeof(CMD_ACCESS_REG),
  5107. (PUINT_8) &rCmdAccessReg, pvSetBuffer, u4SetBufferLen);
  5108. } else {
  5109. HAL_MCR_WR(prAdapter, (prMcrWrInfo->u4McrOffset & BITS(2, 31)), /* address is in DWORD unit */
  5110. prMcrWrInfo->u4McrData);
  5111. DBGLOG(OID, TRACE, "MCR Write: Offset = %#08lx, Data = %#08lx\n",
  5112. prMcrWrInfo->u4McrOffset, prMcrWrInfo->u4McrData);
  5113. return WLAN_STATUS_SUCCESS;
  5114. }
  5115. } /* wlanoidSetMcrWrite */
  5116. /*----------------------------------------------------------------------------*/
  5117. /*!
  5118. * \brief This routine is called to query SW CTRL
  5119. *
  5120. * \param[in] pvAdapter Pointer to the Adapter structure.
  5121. * \param[out] pvQueryBuf A pointer to the buffer that holds the result of
  5122. * the query.
  5123. * \param[in] u4QueryBufLen The length of the query buffer.
  5124. * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
  5125. * bytes written into the query buffer. If the call
  5126. * failed due to invalid length of the query buffer,
  5127. * returns the amount of storage needed.
  5128. *
  5129. * \retval WLAN_STATUS_SUCCESS
  5130. * \retval WLAN_STATUS_INVALID_LENGTH
  5131. */
  5132. /*----------------------------------------------------------------------------*/
  5133. WLAN_STATUS
  5134. wlanoidQuerySwCtrlRead(IN P_ADAPTER_T prAdapter,
  5135. IN PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  5136. {
  5137. P_PARAM_CUSTOM_SW_CTRL_STRUCT_T prSwCtrlInfo;
  5138. WLAN_STATUS rWlanStatus;
  5139. UINT_16 u2Id, u2SubId;
  5140. UINT_32 u4Data;
  5141. CMD_SW_DBG_CTRL_T rCmdSwCtrl;
  5142. DEBUGFUNC("wlanoidQuerySwCtrlRead");
  5143. DBGLOG(OID, LOUD, "\n");
  5144. ASSERT(prAdapter);
  5145. ASSERT(pu4QueryInfoLen);
  5146. if (u4QueryBufferLen)
  5147. ASSERT(pvQueryBuffer);
  5148. *pu4QueryInfoLen = sizeof(PARAM_CUSTOM_SW_CTRL_STRUCT_T);
  5149. if (u4QueryBufferLen < sizeof(PARAM_CUSTOM_SW_CTRL_STRUCT_T))
  5150. return WLAN_STATUS_INVALID_LENGTH;
  5151. prSwCtrlInfo = (P_PARAM_CUSTOM_SW_CTRL_STRUCT_T) pvQueryBuffer;
  5152. u2Id = (UINT_16) (prSwCtrlInfo->u4Id >> 16);
  5153. u2SubId = (UINT_16) (prSwCtrlInfo->u4Id & BITS(0, 15));
  5154. u4Data = 0;
  5155. rWlanStatus = WLAN_STATUS_SUCCESS;
  5156. switch (u2Id) {
  5157. /* 0x9000 - 0x9EFF reserved for FW */
  5158. /* 0xFFFE reserved for FW */
  5159. #if CFG_SUPPORT_SWCR
  5160. case 0x9F00:
  5161. swCrReadWriteCmd(prAdapter, SWCR_READ /* Read */ ,
  5162. (UINT_16) u2SubId, &u4Data);
  5163. break;
  5164. #endif /* CFG_SUPPORT_SWCR */
  5165. case 0xFFFF:
  5166. {
  5167. u4Data = 0x5AA56620;
  5168. }
  5169. break;
  5170. case 0xBABA:
  5171. switch ((u2SubId >> 8) & BITS(0, 7)) {
  5172. case 0x00:
  5173. /* Dump Tx resource and queue status */
  5174. qmDumpQueueStatus(prAdapter);
  5175. cnmDumpMemoryStatus(prAdapter);
  5176. break;
  5177. case 0x01:
  5178. /* Dump StaRec info by index */
  5179. cnmDumpStaRec(prAdapter, (UINT_8) (u2SubId & BITS(0, 7)));
  5180. break;
  5181. case 0x02:
  5182. /* Dump BSS info by index */
  5183. bssDumpBssInfo(prAdapter, (UINT_8) (u2SubId & BITS(0, 7)));
  5184. break;
  5185. case 0x03:
  5186. /*Dump BSS statistics by index */
  5187. wlanDumpBssStatistics(prAdapter, (UINT_8) (u2SubId & BITS(0, 7)));
  5188. break;
  5189. default:
  5190. break;
  5191. }
  5192. u4Data = 0xBABABABA;
  5193. break;
  5194. case 0x9000:
  5195. default:
  5196. {
  5197. rCmdSwCtrl.u4Id = prSwCtrlInfo->u4Id;
  5198. rCmdSwCtrl.u4Data = 0;
  5199. rWlanStatus = wlanSendSetQueryCmd(prAdapter,
  5200. CMD_ID_SW_DBG_CTRL,
  5201. FALSE,
  5202. TRUE,
  5203. TRUE,
  5204. nicCmdEventQuerySwCtrlRead,
  5205. nicOidCmdTimeoutCommon,
  5206. sizeof(CMD_SW_DBG_CTRL_T),
  5207. (PUINT_8) &rCmdSwCtrl, pvQueryBuffer, u4QueryBufferLen);
  5208. }
  5209. } /* switch(u2Id) */
  5210. prSwCtrlInfo->u4Data = u4Data;
  5211. return rWlanStatus;
  5212. }
  5213. /* end of wlanoidQuerySwCtrlRead() */
  5214. /*----------------------------------------------------------------------------*/
  5215. /*!
  5216. * \brief This routine is called to write SW CTRL
  5217. *
  5218. * \param[in] prAdapter Pointer to the Adapter structure.
  5219. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  5220. * \param[in] u4SetBufferLen The length of the set buffer.
  5221. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  5222. * bytes read from the set buffer. If the call failed
  5223. * due to invalid length of the set buffer, returns
  5224. * the amount of storage needed.
  5225. *
  5226. * \retval WLAN_STATUS_SUCCESS
  5227. * \retval WLAN_STATUS_INVALID_LENGTH
  5228. */
  5229. /*----------------------------------------------------------------------------*/
  5230. WLAN_STATUS
  5231. wlanoidSetSwCtrlWrite(IN P_ADAPTER_T prAdapter,
  5232. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  5233. {
  5234. P_PARAM_CUSTOM_SW_CTRL_STRUCT_T prSwCtrlInfo;
  5235. CMD_SW_DBG_CTRL_T rCmdSwCtrl;
  5236. WLAN_STATUS rWlanStatus = WLAN_STATUS_SUCCESS;
  5237. UINT_16 u2Id, u2SubId;
  5238. UINT_32 u4Data;
  5239. DEBUGFUNC("wlanoidSetSwCtrlWrite");
  5240. DBGLOG(OID, LOUD, "\n");
  5241. ASSERT(prAdapter);
  5242. ASSERT(pu4SetInfoLen);
  5243. *pu4SetInfoLen = sizeof(PARAM_CUSTOM_SW_CTRL_STRUCT_T);
  5244. if (u4SetBufferLen < sizeof(PARAM_CUSTOM_SW_CTRL_STRUCT_T))
  5245. return WLAN_STATUS_INVALID_LENGTH;
  5246. ASSERT(pvSetBuffer);
  5247. prSwCtrlInfo = (P_PARAM_CUSTOM_SW_CTRL_STRUCT_T) pvSetBuffer;
  5248. u2Id = (UINT_16) (prSwCtrlInfo->u4Id >> 16);
  5249. u2SubId = (UINT_16) (prSwCtrlInfo->u4Id & BITS(0, 15));
  5250. u4Data = prSwCtrlInfo->u4Data;
  5251. switch (u2Id) {
  5252. /* 0x9000 - 0x9EFF reserved for FW */
  5253. /* 0xFFFE reserved for FW */
  5254. #if CFG_SUPPORT_SWCR
  5255. case 0x9F00:
  5256. swCrReadWriteCmd(prAdapter, SWCR_WRITE, (UINT_16) u2SubId, &u4Data);
  5257. break;
  5258. #endif /* CFG_SUPPORT_SWCR */
  5259. case 0x1000:
  5260. if (u2SubId == 0x8000) {
  5261. /* CTIA power save mode setting (code: 0x10008000) */
  5262. prAdapter->u4CtiaPowerMode = u4Data;
  5263. prAdapter->fgEnCtiaPowerMode = TRUE;
  5264. /* */
  5265. {
  5266. PARAM_POWER_MODE ePowerMode;
  5267. if (prAdapter->u4CtiaPowerMode == 0)
  5268. /* force to keep in CAM mode */
  5269. ePowerMode = Param_PowerModeCAM;
  5270. else if (prAdapter->u4CtiaPowerMode == 1)
  5271. ePowerMode = Param_PowerModeMAX_PSP;
  5272. else
  5273. ePowerMode = Param_PowerModeFast_PSP;
  5274. nicConfigPowerSaveProfile(prAdapter,
  5275. prAdapter->prAisBssInfo->ucBssIndex, ePowerMode, TRUE);
  5276. }
  5277. }
  5278. break;
  5279. case 0x1001:
  5280. if (u2SubId == 0x0)
  5281. prAdapter->fgEnOnlineScan = (BOOLEAN) u4Data;
  5282. else if (u2SubId == 0x1)
  5283. prAdapter->fgDisBcnLostDetection = (BOOLEAN) u4Data;
  5284. else if (u2SubId == 0x2)
  5285. prAdapter->rWifiVar.ucUapsd = (BOOLEAN) u4Data;
  5286. else if (u2SubId == 0x3) {
  5287. prAdapter->u4UapsdAcBmp = u4Data & BITS(0, 15);
  5288. GET_BSS_INFO_BY_INDEX(prAdapter,
  5289. u4Data >> 16)->rPmProfSetupInfo.ucBmpDeliveryAC =
  5290. (UINT_8) prAdapter->u4UapsdAcBmp;
  5291. GET_BSS_INFO_BY_INDEX(prAdapter,
  5292. u4Data >> 16)->rPmProfSetupInfo.ucBmpTriggerAC =
  5293. (UINT_8) prAdapter->u4UapsdAcBmp;
  5294. } else if (u2SubId == 0x4)
  5295. prAdapter->fgDisStaAgingTimeoutDetection = (BOOLEAN) u4Data;
  5296. else if (u2SubId == 0x5)
  5297. prAdapter->rWifiVar.rConnSettings.uc2G4BandwidthMode = (UINT_8) u4Data;
  5298. else if (u2SubId == 0x0100) {
  5299. if (u4Data == 2)
  5300. prAdapter->rWifiVar.ucRxGf = FEATURE_DISABLED;
  5301. else
  5302. prAdapter->rWifiVar.ucRxGf = FEATURE_ENABLED;
  5303. } else if (u2SubId == 0x0101)
  5304. prAdapter->rWifiVar.ucRxShortGI = (UINT_8) u4Data;
  5305. break;
  5306. #if CFG_SUPPORT_SWCR
  5307. case 0x1002:
  5308. #if CFG_RX_PKTS_DUMP
  5309. if (u2SubId == 0x0) {
  5310. if (u4Data)
  5311. u4Data = BIT(HIF_RX_PKT_TYPE_MANAGEMENT);
  5312. swCrFrameCheckEnable(prAdapter, u4Data);
  5313. }
  5314. #endif
  5315. if (u2SubId == 0x1) {
  5316. BOOLEAN fgIsEnable;
  5317. UINT_8 ucType;
  5318. UINT_32 u4Timeout;
  5319. fgIsEnable = (BOOLEAN) (u4Data & 0xff);
  5320. ucType = 0; /* ((u4Data>>4) & 0xf); */
  5321. u4Timeout = ((u4Data >> 8) & 0xff);
  5322. swCrDebugCheckEnable(prAdapter, fgIsEnable, ucType, u4Timeout);
  5323. }
  5324. break;
  5325. #endif
  5326. #if CFG_SUPPORT_802_11W
  5327. case 0x2000:
  5328. DBGLOG(RSN, TRACE, "802.11w test 0x%x\n", u2SubId);
  5329. if (u2SubId == 0x0)
  5330. rsnStartSaQuery(prAdapter);
  5331. if (u2SubId == 0x1)
  5332. rsnStopSaQuery(prAdapter);
  5333. if (u2SubId == 0x2)
  5334. rsnSaQueryRequest(prAdapter, NULL);
  5335. if (u2SubId == 0x3) {
  5336. P_BSS_INFO_T prBssInfo = prAdapter->prAisBssInfo;
  5337. authSendDeauthFrame(prAdapter, prBssInfo, prBssInfo->prStaRecOfAP, NULL, 7, NULL);
  5338. }
  5339. /* wext_set_mode */
  5340. /*
  5341. if (u2SubId == 0x3) {
  5342. prAdapter->prGlueInfo->rWpaInfo.u4Mfp = RSN_AUTH_MFP_DISABLED;
  5343. }
  5344. if (u2SubId == 0x4) {
  5345. //prAdapter->rWifiVar.rAisSpecificBssInfo.fgMgmtProtection = TRUE;
  5346. prAdapter->prGlueInfo->rWpaInfo.u4Mfp = RSN_AUTH_MFP_OPTIONAL;
  5347. }
  5348. if (u2SubId == 0x5) {
  5349. //prAdapter->rWifiVar.rAisSpecificBssInfo.fgMgmtProtection = TRUE;
  5350. prAdapter->prGlueInfo->rWpaInfo.u4Mfp = RSN_AUTH_MFP_REQUIRED;
  5351. }
  5352. */
  5353. break;
  5354. #endif
  5355. case 0xFFFF:
  5356. {
  5357. /* CMD_ACCESS_REG rCmdAccessReg; */
  5358. #if 1 /* CFG_MT6573_SMT_TEST */
  5359. if (u2SubId == 0x0123) {
  5360. DBGLOG(HAL, TRACE, "set smt fixed rate: %u\n", u4Data);
  5361. if ((ENUM_REGISTRY_FIXED_RATE_T) (u4Data) < FIXED_RATE_NUM)
  5362. prAdapter->rWifiVar.eRateSetting = (ENUM_REGISTRY_FIXED_RATE_T) (u4Data);
  5363. else
  5364. prAdapter->rWifiVar.eRateSetting = FIXED_RATE_NONE;
  5365. if (prAdapter->rWifiVar.eRateSetting == FIXED_RATE_NONE)
  5366. /* Enable Auto (Long/Short) Preamble */
  5367. prAdapter->rWifiVar.ePreambleType = PREAMBLE_TYPE_AUTO;
  5368. else if ((prAdapter->rWifiVar.eRateSetting >=
  5369. FIXED_RATE_MCS0_20M_400NS
  5370. && prAdapter->rWifiVar.eRateSetting <= FIXED_RATE_MCS7_20M_400NS)
  5371. || (prAdapter->rWifiVar.eRateSetting >=
  5372. FIXED_RATE_MCS0_40M_400NS
  5373. && prAdapter->rWifiVar.eRateSetting <= FIXED_RATE_MCS32_400NS))
  5374. /* Force Short Preamble */
  5375. prAdapter->rWifiVar.ePreambleType = PREAMBLE_TYPE_SHORT;
  5376. else
  5377. /* Force Long Preamble */
  5378. prAdapter->rWifiVar.ePreambleType = PREAMBLE_TYPE_LONG;
  5379. /* abort to re-connect */
  5380. #if 1
  5381. kalIndicateStatusAndComplete(prAdapter->prGlueInfo,
  5382. WLAN_STATUS_MEDIA_DISCONNECT, NULL, 0);
  5383. #else
  5384. aisBssBeaconTimeout(prAdapter);
  5385. #endif
  5386. return WLAN_STATUS_SUCCESS;
  5387. } else if (u2SubId == 0x1234) {
  5388. /* 1. Disable On-Lin Scan */
  5389. /* 3. Disable FIFO FULL no ack */
  5390. /* 4. Disable Roaming */
  5391. /* Disalbe auto tx power */
  5392. /* 2. Keep at CAM mode */
  5393. /* 5. Disable Beacon Timeout Detection */
  5394. rWlanStatus = nicEnterCtiaMode(prAdapter, TRUE, TRUE);
  5395. } else if (u2SubId == 0x1235) {
  5396. /* 1. Enaable On-Lin Scan */
  5397. /* 3. Enable FIFO FULL no ack */
  5398. /* 4. Enable Roaming */
  5399. /* Enable auto tx power */
  5400. /* 2. Keep at Fast PS */
  5401. /* 5. Enable Beacon Timeout Detection */
  5402. rWlanStatus = nicEnterCtiaMode(prAdapter, FALSE, TRUE);
  5403. }
  5404. #endif
  5405. #if CFG_MTK_STAGE_SCAN
  5406. else if (u2SubId == 0x1250)
  5407. prAdapter->aePreferBand[KAL_NETWORK_TYPE_AIS_INDEX] = BAND_NULL;
  5408. else if (u2SubId == 0x1251)
  5409. prAdapter->aePreferBand[KAL_NETWORK_TYPE_AIS_INDEX] = BAND_2G4;
  5410. else if (u2SubId == 0x1252) {
  5411. if (prAdapter->fgEnable5GBand)
  5412. prAdapter->aePreferBand[KAL_NETWORK_TYPE_AIS_INDEX] = BAND_5G;
  5413. else
  5414. /* Skip this setting if 5G band is disabled */
  5415. DBGLOG(SCN, INFO, "Skip 5G stage scan request due to " "5G is disabled\n");
  5416. }
  5417. #endif
  5418. }
  5419. break;
  5420. case 0x9000:
  5421. default:
  5422. {
  5423. rCmdSwCtrl.u4Id = prSwCtrlInfo->u4Id;
  5424. rCmdSwCtrl.u4Data = prSwCtrlInfo->u4Data;
  5425. rWlanStatus = wlanSendSetQueryCmd(prAdapter,
  5426. CMD_ID_SW_DBG_CTRL,
  5427. TRUE,
  5428. FALSE,
  5429. TRUE,
  5430. nicCmdEventSetCommon,
  5431. nicOidCmdTimeoutCommon,
  5432. sizeof(CMD_SW_DBG_CTRL_T),
  5433. (PUINT_8) &rCmdSwCtrl, pvSetBuffer, u4SetBufferLen);
  5434. }
  5435. } /* switch(u2Id) */
  5436. return rWlanStatus;
  5437. } /* wlanoidSetSwCtrlWrite */
  5438. WLAN_STATUS
  5439. wlanoidQueryChipConfig(IN P_ADAPTER_T prAdapter,
  5440. IN PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  5441. {
  5442. P_PARAM_CUSTOM_CHIP_CONFIG_STRUCT_T prChipConfigInfo;
  5443. CMD_CHIP_CONFIG_T rCmdChipConfig;
  5444. WLAN_STATUS rWlanStatus = WLAN_STATUS_SUCCESS;
  5445. DEBUGFUNC("wlanoidQuerySwCtrlRead");
  5446. DBGLOG(OID, LOUD, "\n");
  5447. ASSERT(prAdapter);
  5448. ASSERT(pu4QueryInfoLen);
  5449. if (u4QueryBufferLen)
  5450. ASSERT(pvQueryBuffer);
  5451. *pu4QueryInfoLen = sizeof(PARAM_CUSTOM_CHIP_CONFIG_STRUCT_T);
  5452. if (u4QueryBufferLen < sizeof(PARAM_CUSTOM_CHIP_CONFIG_STRUCT_T))
  5453. return WLAN_STATUS_INVALID_LENGTH;
  5454. prChipConfigInfo = (P_PARAM_CUSTOM_CHIP_CONFIG_STRUCT_T) pvQueryBuffer;
  5455. kalMemZero(&rCmdChipConfig, sizeof(rCmdChipConfig));
  5456. rCmdChipConfig.u2Id = prChipConfigInfo->u2Id;
  5457. rCmdChipConfig.ucType = prChipConfigInfo->ucType;
  5458. rCmdChipConfig.ucRespType = prChipConfigInfo->ucRespType;
  5459. rCmdChipConfig.u2MsgSize = prChipConfigInfo->u2MsgSize;
  5460. if (rCmdChipConfig.u2MsgSize > CHIP_CONFIG_RESP_SIZE) {
  5461. DBGLOG(OID, INFO, "Chip config Msg Size %u is not valid (query)\n", rCmdChipConfig.u2MsgSize);
  5462. rCmdChipConfig.u2MsgSize = CHIP_CONFIG_RESP_SIZE;
  5463. }
  5464. kalMemCopy(rCmdChipConfig.aucCmd, prChipConfigInfo->aucCmd, rCmdChipConfig.u2MsgSize);
  5465. rWlanStatus = wlanSendSetQueryCmd(prAdapter, CMD_ID_CHIP_CONFIG, FALSE, TRUE, TRUE,
  5466. /*nicCmdEventQuerySwCtrlRead, */
  5467. nicCmdEventQueryChipConfig,
  5468. nicOidCmdTimeoutCommon,
  5469. sizeof(CMD_CHIP_CONFIG_T),
  5470. (PUINT_8) &rCmdChipConfig, pvQueryBuffer, u4QueryBufferLen);
  5471. return rWlanStatus;
  5472. }
  5473. /* end of wlanoidQueryChipConfig() */
  5474. /*----------------------------------------------------------------------------*/
  5475. /*!
  5476. * \brief This routine is called to set chip
  5477. *
  5478. * \param[in] prAdapter Pointer to the Adapter structure.
  5479. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  5480. * \param[in] u4SetBufferLen The length of the set buffer.
  5481. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  5482. * bytes read from the set buffer. If the call failed
  5483. * due to invalid length of the set buffer, returns
  5484. * the amount of storage needed.
  5485. *
  5486. * \retval WLAN_STATUS_SUCCESS
  5487. * \retval WLAN_STATUS_INVALID_LENGTH
  5488. */
  5489. /*----------------------------------------------------------------------------*/
  5490. WLAN_STATUS
  5491. wlanoidSetChipConfig(IN P_ADAPTER_T prAdapter,
  5492. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  5493. {
  5494. P_PARAM_CUSTOM_CHIP_CONFIG_STRUCT_T prChipConfigInfo;
  5495. CMD_CHIP_CONFIG_T rCmdChipConfig;
  5496. WLAN_STATUS rWlanStatus = WLAN_STATUS_SUCCESS;
  5497. DATA_STRUCT_INSPECTING_ASSERT(sizeof(prChipConfigInfo->aucCmd) == CHIP_CONFIG_RESP_SIZE);
  5498. DEBUGFUNC("wlanoidSetChipConfig");
  5499. DBGLOG(INIT, LOUD, "\n");
  5500. ASSERT(prAdapter);
  5501. ASSERT(pu4SetInfoLen);
  5502. *pu4SetInfoLen = sizeof(PARAM_CUSTOM_CHIP_CONFIG_STRUCT_T);
  5503. if (u4SetBufferLen < sizeof(PARAM_CUSTOM_CHIP_CONFIG_STRUCT_T))
  5504. return WLAN_STATUS_INVALID_LENGTH;
  5505. ASSERT(pvSetBuffer);
  5506. prChipConfigInfo = (P_PARAM_CUSTOM_CHIP_CONFIG_STRUCT_T) pvSetBuffer;
  5507. kalMemZero(&rCmdChipConfig, sizeof(rCmdChipConfig));
  5508. rCmdChipConfig.u2Id = prChipConfigInfo->u2Id;
  5509. rCmdChipConfig.ucType = prChipConfigInfo->ucType;
  5510. rCmdChipConfig.ucRespType = prChipConfigInfo->ucRespType;
  5511. rCmdChipConfig.u2MsgSize = prChipConfigInfo->u2MsgSize;
  5512. if (rCmdChipConfig.u2MsgSize > CHIP_CONFIG_RESP_SIZE) {
  5513. DBGLOG(OID, INFO, "Chip config Msg Size %u is not valid (set)\n", rCmdChipConfig.u2MsgSize);
  5514. rCmdChipConfig.u2MsgSize = CHIP_CONFIG_RESP_SIZE;
  5515. }
  5516. kalMemCopy(rCmdChipConfig.aucCmd, prChipConfigInfo->aucCmd, rCmdChipConfig.u2MsgSize);
  5517. rWlanStatus = wlanSendSetQueryCmd(prAdapter,
  5518. CMD_ID_CHIP_CONFIG,
  5519. TRUE,
  5520. FALSE,
  5521. TRUE,
  5522. nicCmdEventSetCommon,
  5523. nicOidCmdTimeoutCommon,
  5524. sizeof(CMD_CHIP_CONFIG_T),
  5525. (PUINT_8) &rCmdChipConfig, pvSetBuffer, u4SetBufferLen);
  5526. return rWlanStatus;
  5527. } /* wlanoidSetChipConfig */
  5528. /*----------------------------------------------------------------------------*/
  5529. /*!
  5530. * \brief This routine is called to set cfg and callback
  5531. *
  5532. * \param[in] prAdapter Pointer to the Adapter structure.
  5533. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  5534. * \param[in] u4SetBufferLen The length of the set buffer.
  5535. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  5536. * bytes read from the set buffer. If the call failed
  5537. * due to invalid length of the set buffer, returns
  5538. * the amount of storage needed.
  5539. *
  5540. * \retval WLAN_STATUS_SUCCESS
  5541. * \retval WLAN_STATUS_INVALID_LENGTH
  5542. */
  5543. /*----------------------------------------------------------------------------*/
  5544. WLAN_STATUS
  5545. wlanoidSetKeyCfg(IN P_ADAPTER_T prAdapter, IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  5546. {
  5547. WLAN_STATUS rWlanStatus = WLAN_STATUS_SUCCESS;
  5548. P_PARAM_CUSTOM_KEY_CFG_STRUCT_T prKeyCfgInfo;
  5549. DEBUGFUNC("wlanoidSetKeyCfg");
  5550. DBGLOG(INIT, LOUD, "\n");
  5551. ASSERT(prAdapter);
  5552. ASSERT(pu4SetInfoLen);
  5553. *pu4SetInfoLen = sizeof(PARAM_CUSTOM_KEY_CFG_STRUCT_T);
  5554. if (u4SetBufferLen < sizeof(PARAM_CUSTOM_KEY_CFG_STRUCT_T))
  5555. return WLAN_STATUS_INVALID_LENGTH;
  5556. ASSERT(pvSetBuffer);
  5557. prKeyCfgInfo = (P_PARAM_CUSTOM_KEY_CFG_STRUCT_T) pvSetBuffer;
  5558. wlanCfgSet(prAdapter, prKeyCfgInfo->aucKey, prKeyCfgInfo->aucValue, 0);
  5559. wlanInitFeatureOption(prAdapter);
  5560. return rWlanStatus;
  5561. }
  5562. /* wlanoidSetSwCtrlWrite */
  5563. /*----------------------------------------------------------------------------*/
  5564. /*!
  5565. * \brief This routine is called to query EEPROM value.
  5566. *
  5567. * \param[in] pvAdapter Pointer to the Adapter structure.
  5568. * \param[out] pvQueryBuf A pointer to the buffer that holds the result of
  5569. * the query.
  5570. * \param[in] u4QueryBufLen The length of the query buffer.
  5571. * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
  5572. * bytes written into the query buffer. If the call
  5573. * failed due to invalid length of the query buffer,
  5574. * returns the amount of storage needed.
  5575. *
  5576. * \retval WLAN_STATUS_SUCCESS
  5577. * \retval WLAN_STATUS_FAILURE
  5578. */
  5579. /*----------------------------------------------------------------------------*/
  5580. WLAN_STATUS
  5581. wlanoidQueryEepromRead(IN P_ADAPTER_T prAdapter,
  5582. IN PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  5583. {
  5584. P_PARAM_CUSTOM_EEPROM_RW_STRUCT_T prEepromRwInfo;
  5585. CMD_ACCESS_EEPROM rCmdAccessEeprom;
  5586. DEBUGFUNC("wlanoidQueryEepromRead");
  5587. ASSERT(prAdapter);
  5588. ASSERT(pu4QueryInfoLen);
  5589. if (u4QueryBufferLen)
  5590. ASSERT(pvQueryBuffer);
  5591. *pu4QueryInfoLen = sizeof(PARAM_CUSTOM_EEPROM_RW_STRUCT_T);
  5592. if (u4QueryBufferLen < sizeof(PARAM_CUSTOM_EEPROM_RW_STRUCT_T))
  5593. return WLAN_STATUS_INVALID_LENGTH;
  5594. prEepromRwInfo = (P_PARAM_CUSTOM_EEPROM_RW_STRUCT_T) pvQueryBuffer;
  5595. kalMemZero(&rCmdAccessEeprom, sizeof(CMD_ACCESS_EEPROM));
  5596. rCmdAccessEeprom.u2Offset = prEepromRwInfo->ucEepromIndex;
  5597. return wlanSendSetQueryCmd(prAdapter,
  5598. CMD_ID_ACCESS_EEPROM,
  5599. FALSE,
  5600. TRUE,
  5601. TRUE,
  5602. nicCmdEventQueryEepromRead,
  5603. nicOidCmdTimeoutCommon,
  5604. sizeof(CMD_ACCESS_EEPROM),
  5605. (PUINT_8) &rCmdAccessEeprom, pvQueryBuffer, u4QueryBufferLen);
  5606. } /* wlanoidQueryEepromRead */
  5607. /*----------------------------------------------------------------------------*/
  5608. /*!
  5609. * \brief This routine is called to write EEPROM value.
  5610. *
  5611. * \param[in] prAdapter Pointer to the Adapter structure.
  5612. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  5613. * \param[in] u4SetBufferLen The length of the set buffer.
  5614. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  5615. * bytes read from the set buffer. If the call failed
  5616. * due to invalid length of the set buffer, returns
  5617. * the amount of storage needed.
  5618. *
  5619. * \retval WLAN_STATUS_SUCCESS
  5620. * \retval WLAN_STATUS_FAILURE
  5621. */
  5622. /*----------------------------------------------------------------------------*/
  5623. WLAN_STATUS
  5624. wlanoidSetEepromWrite(IN P_ADAPTER_T prAdapter,
  5625. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  5626. {
  5627. P_PARAM_CUSTOM_EEPROM_RW_STRUCT_T prEepromRwInfo;
  5628. CMD_ACCESS_EEPROM rCmdAccessEeprom;
  5629. DEBUGFUNC("wlanoidSetEepromWrite");
  5630. DBGLOG(OID, LOUD, "\n");
  5631. ASSERT(prAdapter);
  5632. ASSERT(pu4SetInfoLen);
  5633. *pu4SetInfoLen = sizeof(PARAM_CUSTOM_EEPROM_RW_STRUCT_T);
  5634. if (u4SetBufferLen < sizeof(PARAM_CUSTOM_EEPROM_RW_STRUCT_T))
  5635. return WLAN_STATUS_INVALID_LENGTH;
  5636. ASSERT(pvSetBuffer);
  5637. prEepromRwInfo = (P_PARAM_CUSTOM_EEPROM_RW_STRUCT_T) pvSetBuffer;
  5638. kalMemZero(&rCmdAccessEeprom, sizeof(CMD_ACCESS_EEPROM));
  5639. rCmdAccessEeprom.u2Offset = prEepromRwInfo->ucEepromIndex;
  5640. rCmdAccessEeprom.u2Data = prEepromRwInfo->u2EepromData;
  5641. return wlanSendSetQueryCmd(prAdapter,
  5642. CMD_ID_ACCESS_EEPROM,
  5643. TRUE,
  5644. FALSE,
  5645. TRUE,
  5646. nicCmdEventSetCommon,
  5647. nicOidCmdTimeoutCommon,
  5648. sizeof(CMD_ACCESS_EEPROM),
  5649. (PUINT_8) &rCmdAccessEeprom, pvSetBuffer, u4SetBufferLen);
  5650. } /* wlanoidSetEepromWrite */
  5651. /*----------------------------------------------------------------------------*/
  5652. /*!
  5653. * \brief This routine is called to query the number of the successfully transmitted
  5654. * packets.
  5655. *
  5656. * \param[in] pvAdapter Pointer to the Adapter structure.
  5657. * \param[out] pvQueryBuf A pointer to the buffer that holds the result of
  5658. * the query.
  5659. * \param[in] u4QueryBufLen The length of the query buffer.
  5660. * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
  5661. * bytes written into the query buffer. If the call
  5662. * failed due to invalid length of the query buffer,
  5663. * returns the amount of storage needed.
  5664. *
  5665. * \retval WLAN_STATUS_SUCCESS
  5666. * \retval WLAN_STATUS_INVALID_LENGTH
  5667. */
  5668. /*----------------------------------------------------------------------------*/
  5669. WLAN_STATUS
  5670. wlanoidQueryXmitOk(IN P_ADAPTER_T prAdapter,
  5671. IN PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  5672. {
  5673. DEBUGFUNC("wlanoidQueryXmitOk");
  5674. DBGLOG(OID, LOUD, "\n");
  5675. ASSERT(prAdapter);
  5676. if (u4QueryBufferLen)
  5677. ASSERT(pvQueryBuffer);
  5678. ASSERT(pu4QueryInfoLen);
  5679. if (prAdapter->rAcpiState == ACPI_STATE_D3) {
  5680. DBGLOG(OID, WARN,
  5681. "Fail in query receive error! (Adapter not ready). ACPI=D%d, Radio=%d\n",
  5682. prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
  5683. *pu4QueryInfoLen = sizeof(UINT_32);
  5684. return WLAN_STATUS_ADAPTER_NOT_READY;
  5685. } else if (u4QueryBufferLen < sizeof(UINT_32)
  5686. || (u4QueryBufferLen > sizeof(UINT_32) && u4QueryBufferLen < sizeof(UINT_64))) {
  5687. *pu4QueryInfoLen = sizeof(UINT_64);
  5688. return WLAN_STATUS_INVALID_LENGTH;
  5689. }
  5690. #if CFG_ENABLE_STATISTICS_BUFFERING
  5691. if (IsBufferedStatisticsUsable(prAdapter) == TRUE) {
  5692. if (u4QueryBufferLen == sizeof(UINT_32)) {
  5693. *pu4QueryInfoLen = sizeof(UINT_32);
  5694. *(PUINT_32) pvQueryBuffer = (UINT_32) prAdapter->rStatStruct.rTransmittedFragmentCount.QuadPart;
  5695. } else {
  5696. *pu4QueryInfoLen = sizeof(UINT_64);
  5697. *(PUINT_64) pvQueryBuffer = (UINT_64) prAdapter->rStatStruct.rTransmittedFragmentCount.QuadPart;
  5698. }
  5699. } else
  5700. #endif
  5701. {
  5702. return wlanSendSetQueryCmd(prAdapter,
  5703. CMD_ID_GET_STATISTICS,
  5704. FALSE,
  5705. TRUE,
  5706. TRUE,
  5707. nicCmdEventQueryXmitOk,
  5708. nicOidCmdTimeoutCommon, 0, NULL, pvQueryBuffer, u4QueryBufferLen);
  5709. }
  5710. return WLAN_STATUS_SUCCESS;
  5711. } /* wlanoidQueryXmitOk */
  5712. /*----------------------------------------------------------------------------*/
  5713. /*!
  5714. * \brief This routine is called to query the number of the successfully received
  5715. * packets.
  5716. *
  5717. * \param[in] pvAdapter Pointer to the Adapter structure.
  5718. * \param[out] pvQueryBuf A pointer to the buffer that holds the result of
  5719. * the query.
  5720. * \param[in] u4QueryBufLen The length of the query buffer.
  5721. * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
  5722. * bytes written into the query buffer. If the call
  5723. * failed due to invalid length of the query buffer,
  5724. * returns the amount of storage needed.
  5725. *
  5726. * \retval WLAN_STATUS_SUCCESS
  5727. * \retval WLAN_STATUS_INVALID_LENGTH
  5728. */
  5729. /*----------------------------------------------------------------------------*/
  5730. WLAN_STATUS
  5731. wlanoidQueryRcvOk(IN P_ADAPTER_T prAdapter,
  5732. IN PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  5733. {
  5734. DEBUGFUNC("wlanoidQueryRcvOk");
  5735. DBGLOG(OID, LOUD, "\n");
  5736. ASSERT(prAdapter);
  5737. if (u4QueryBufferLen)
  5738. ASSERT(pvQueryBuffer);
  5739. ASSERT(pu4QueryInfoLen);
  5740. if (prAdapter->rAcpiState == ACPI_STATE_D3) {
  5741. DBGLOG(OID, WARN,
  5742. "Fail in query receive error! (Adapter not ready). ACPI=D%d, Radio=%d\n",
  5743. prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
  5744. *pu4QueryInfoLen = sizeof(UINT_32);
  5745. return WLAN_STATUS_ADAPTER_NOT_READY;
  5746. } else if (u4QueryBufferLen < sizeof(UINT_32)
  5747. || (u4QueryBufferLen > sizeof(UINT_32) && u4QueryBufferLen < sizeof(UINT_64))) {
  5748. *pu4QueryInfoLen = sizeof(UINT_64);
  5749. return WLAN_STATUS_INVALID_LENGTH;
  5750. }
  5751. #if CFG_ENABLE_STATISTICS_BUFFERING
  5752. if (IsBufferedStatisticsUsable(prAdapter) == TRUE) {
  5753. if (u4QueryBufferLen == sizeof(UINT_32)) {
  5754. *pu4QueryInfoLen = sizeof(UINT_32);
  5755. *(PUINT_32) pvQueryBuffer = (UINT_32) prAdapter->rStatStruct.rReceivedFragmentCount.QuadPart;
  5756. } else {
  5757. *pu4QueryInfoLen = sizeof(UINT_64);
  5758. *(PUINT_64) pvQueryBuffer = (UINT_64) prAdapter->rStatStruct.rReceivedFragmentCount.QuadPart;
  5759. }
  5760. } else
  5761. #endif
  5762. {
  5763. return wlanSendSetQueryCmd(prAdapter,
  5764. CMD_ID_GET_STATISTICS,
  5765. FALSE,
  5766. TRUE,
  5767. TRUE,
  5768. nicCmdEventQueryRecvOk,
  5769. nicOidCmdTimeoutCommon, 0, NULL, pvQueryBuffer, u4QueryBufferLen);
  5770. }
  5771. return WLAN_STATUS_SUCCESS;
  5772. } /* wlanoidQueryRcvOk */
  5773. /*----------------------------------------------------------------------------*/
  5774. /*!
  5775. * \brief This routine is called to query the number of frames that the driver
  5776. * fails to transmit.
  5777. *
  5778. * \param[in] pvAdapter Pointer to the Adapter structure.
  5779. * \param[out] pvQueryBuf A pointer to the buffer that holds the result of
  5780. * the query.
  5781. * \param[in] u4QueryBufLen The length of the query buffer.
  5782. * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
  5783. * bytes written into the query buffer. If the call
  5784. * failed due to invalid length of the query buffer,
  5785. * returns the amount of storage needed.
  5786. *
  5787. * \retval WLAN_STATUS_SUCCESS
  5788. * \retval WLAN_STATUS_INVALID_LENGTH
  5789. */
  5790. /*----------------------------------------------------------------------------*/
  5791. WLAN_STATUS
  5792. wlanoidQueryXmitError(IN P_ADAPTER_T prAdapter,
  5793. IN PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  5794. {
  5795. DEBUGFUNC("wlanoidQueryXmitError");
  5796. DBGLOG(OID, LOUD, "\n");
  5797. ASSERT(prAdapter);
  5798. if (u4QueryBufferLen)
  5799. ASSERT(pvQueryBuffer);
  5800. ASSERT(pu4QueryInfoLen);
  5801. if (prAdapter->rAcpiState == ACPI_STATE_D3) {
  5802. DBGLOG(OID, WARN,
  5803. "Fail in query receive error! (Adapter not ready). ACPI=D%d, Radio=%d\n",
  5804. prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
  5805. *pu4QueryInfoLen = sizeof(UINT_32);
  5806. return WLAN_STATUS_ADAPTER_NOT_READY;
  5807. } else if (u4QueryBufferLen < sizeof(UINT_32)
  5808. || (u4QueryBufferLen > sizeof(UINT_32) && u4QueryBufferLen < sizeof(UINT_64))) {
  5809. *pu4QueryInfoLen = sizeof(UINT_64);
  5810. return WLAN_STATUS_INVALID_LENGTH;
  5811. }
  5812. #if CFG_ENABLE_STATISTICS_BUFFERING
  5813. if (IsBufferedStatisticsUsable(prAdapter) == TRUE) {
  5814. if (u4QueryBufferLen == sizeof(UINT_32)) {
  5815. *pu4QueryInfoLen = sizeof(UINT_32);
  5816. *(PUINT_32) pvQueryBuffer = (UINT_32) prAdapter->rStatStruct.rFailedCount.QuadPart;
  5817. } else {
  5818. *pu4QueryInfoLen = sizeof(UINT_64);
  5819. *(PUINT_64) pvQueryBuffer = (UINT_64) prAdapter->rStatStruct.rFailedCount.QuadPart;
  5820. }
  5821. } else
  5822. #endif
  5823. {
  5824. return wlanSendSetQueryCmd(prAdapter,
  5825. CMD_ID_GET_STATISTICS,
  5826. FALSE,
  5827. TRUE,
  5828. TRUE,
  5829. nicCmdEventQueryXmitError,
  5830. nicOidCmdTimeoutCommon, 0, NULL, pvQueryBuffer, u4QueryBufferLen);
  5831. }
  5832. return WLAN_STATUS_SUCCESS;
  5833. } /* wlanoidQueryXmitError */
  5834. /*----------------------------------------------------------------------------*/
  5835. /*!
  5836. * \brief This routine is called to query the number of frames successfully
  5837. * transmitted after exactly one collision.
  5838. *
  5839. * \param[in] prAdapter Pointer to the Adapter structure.
  5840. * \param[out] pvQueryBuf A pointer to the buffer that holds the result of
  5841. * the query.
  5842. * \param[in] u4QueryBufLen The length of the query buffer.
  5843. * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
  5844. * bytes written into the query buffer. If the call
  5845. * failed due to invalid length of the query buffer,
  5846. * returns the amount of storage needed.
  5847. *
  5848. * \retval WLAN_STATUS_SUCCESS
  5849. * \retval WLAN_STATUS_INVALID_LENGTH
  5850. */
  5851. /*----------------------------------------------------------------------------*/
  5852. WLAN_STATUS
  5853. wlanoidQueryXmitOneCollision(IN P_ADAPTER_T prAdapter,
  5854. IN PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  5855. {
  5856. DEBUGFUNC("wlanoidQueryXmitOneCollision");
  5857. DBGLOG(OID, LOUD, "\n");
  5858. ASSERT(prAdapter);
  5859. if (u4QueryBufferLen)
  5860. ASSERT(pvQueryBuffer);
  5861. ASSERT(pu4QueryInfoLen);
  5862. if (prAdapter->rAcpiState == ACPI_STATE_D3) {
  5863. DBGLOG(OID, WARN,
  5864. "Fail in query receive error! (Adapter not ready). ACPI=D%d, Radio=%d\n",
  5865. prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
  5866. *pu4QueryInfoLen = sizeof(UINT_32);
  5867. return WLAN_STATUS_ADAPTER_NOT_READY;
  5868. } else if (u4QueryBufferLen < sizeof(UINT_32)
  5869. || (u4QueryBufferLen > sizeof(UINT_32) && u4QueryBufferLen < sizeof(UINT_64))) {
  5870. *pu4QueryInfoLen = sizeof(UINT_64);
  5871. return WLAN_STATUS_INVALID_LENGTH;
  5872. }
  5873. #if CFG_ENABLE_STATISTICS_BUFFERING
  5874. if (IsBufferedStatisticsUsable(prAdapter) == TRUE) {
  5875. if (u4QueryBufferLen == sizeof(UINT_32)) {
  5876. *pu4QueryInfoLen = sizeof(UINT_32);
  5877. *(PUINT_32) pvQueryBuffer = (UINT_32)
  5878. (prAdapter->rStatStruct.rMultipleRetryCount.QuadPart -
  5879. prAdapter->rStatStruct.rRetryCount.QuadPart);
  5880. } else {
  5881. *pu4QueryInfoLen = sizeof(UINT_64);
  5882. *(PUINT_64) pvQueryBuffer = (UINT_64)
  5883. (prAdapter->rStatStruct.rMultipleRetryCount.QuadPart -
  5884. prAdapter->rStatStruct.rRetryCount.QuadPart);
  5885. }
  5886. } else
  5887. #endif
  5888. {
  5889. return wlanSendSetQueryCmd(prAdapter,
  5890. CMD_ID_GET_STATISTICS,
  5891. FALSE,
  5892. TRUE,
  5893. TRUE,
  5894. nicCmdEventQueryXmitOneCollision,
  5895. nicOidCmdTimeoutCommon, 0, NULL, pvQueryBuffer, u4QueryBufferLen);
  5896. }
  5897. return WLAN_STATUS_SUCCESS;
  5898. } /* wlanoidQueryXmitOneCollision */
  5899. /*----------------------------------------------------------------------------*/
  5900. /*!
  5901. * \brief This routine is called to query the number of frames successfully
  5902. * transmitted after more than one collision.
  5903. *
  5904. * \param[in] prAdapter Pointer to the Adapter structure.
  5905. * \param[out] pvQueryBuf A pointer to the buffer that holds the result of
  5906. * the query.
  5907. * \param[in] u4QueryBufLen The length of the query buffer.
  5908. * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
  5909. * bytes written into the query buffer. If the call
  5910. * failed due to invalid length of the query buffer,
  5911. * returns the amount of storage needed.
  5912. *
  5913. * \retval WLAN_STATUS_SUCCESS
  5914. * \retval WLAN_STATUS_INVALID_LENGTH
  5915. */
  5916. /*----------------------------------------------------------------------------*/
  5917. WLAN_STATUS
  5918. wlanoidQueryXmitMoreCollisions(IN P_ADAPTER_T prAdapter,
  5919. IN PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  5920. {
  5921. DEBUGFUNC("wlanoidQueryXmitMoreCollisions");
  5922. DBGLOG(OID, LOUD, "\n");
  5923. ASSERT(prAdapter);
  5924. if (u4QueryBufferLen)
  5925. ASSERT(pvQueryBuffer);
  5926. ASSERT(pu4QueryInfoLen);
  5927. if (prAdapter->rAcpiState == ACPI_STATE_D3) {
  5928. DBGLOG(OID, WARN,
  5929. "Fail in query receive error! (Adapter not ready). ACPI=D%d, Radio=%d\n",
  5930. prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
  5931. *pu4QueryInfoLen = sizeof(UINT_32);
  5932. return WLAN_STATUS_ADAPTER_NOT_READY;
  5933. } else if (u4QueryBufferLen < sizeof(UINT_32)
  5934. || (u4QueryBufferLen > sizeof(UINT_32) && u4QueryBufferLen < sizeof(UINT_64))) {
  5935. *pu4QueryInfoLen = sizeof(UINT_64);
  5936. return WLAN_STATUS_INVALID_LENGTH;
  5937. }
  5938. #if CFG_ENABLE_STATISTICS_BUFFERING
  5939. if (IsBufferedStatisticsUsable(prAdapter) == TRUE) {
  5940. if (u4QueryBufferLen == sizeof(UINT_32)) {
  5941. *pu4QueryInfoLen = sizeof(UINT_32);
  5942. *(PUINT_32) pvQueryBuffer = (UINT_32) (prAdapter->rStatStruct.rMultipleRetryCount.QuadPart);
  5943. } else {
  5944. *pu4QueryInfoLen = sizeof(UINT_64);
  5945. *(PUINT_64) pvQueryBuffer = (UINT_64) (prAdapter->rStatStruct.rMultipleRetryCount.QuadPart);
  5946. }
  5947. } else
  5948. #endif
  5949. {
  5950. return wlanSendSetQueryCmd(prAdapter,
  5951. CMD_ID_GET_STATISTICS,
  5952. FALSE,
  5953. TRUE,
  5954. TRUE,
  5955. nicCmdEventQueryXmitMoreCollisions,
  5956. nicOidCmdTimeoutCommon, 0, NULL, pvQueryBuffer, u4QueryBufferLen);
  5957. }
  5958. return WLAN_STATUS_SUCCESS;
  5959. } /* wlanoidQueryXmitMoreCollisions */
  5960. /*----------------------------------------------------------------------------*/
  5961. /*!
  5962. * \brief This routine is called to query the number of frames
  5963. * not transmitted due to excessive collisions.
  5964. *
  5965. * \param[in] prAdapter Pointer to the Adapter structure.
  5966. * \param[in] pvQueryBuffer Pointer to the buffer that holds the result of
  5967. * the query.
  5968. * \param[in] u4QueryBufferLen The length of the query buffer.
  5969. * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
  5970. * bytes written into the query buffer. If the call
  5971. * failed due to invalid length of the query buffer,
  5972. * returns the amount of storage needed.
  5973. *
  5974. * \retval WLAN_STATUS_SUCCESS
  5975. * \retval WLAN_STATUS_INVALID_LENGTH
  5976. */
  5977. /*----------------------------------------------------------------------------*/
  5978. WLAN_STATUS
  5979. wlanoidQueryXmitMaxCollisions(IN P_ADAPTER_T prAdapter,
  5980. IN PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  5981. {
  5982. DEBUGFUNC("wlanoidQueryXmitMaxCollisions");
  5983. DBGLOG(OID, LOUD, "\n");
  5984. ASSERT(prAdapter);
  5985. if (u4QueryBufferLen)
  5986. ASSERT(pvQueryBuffer);
  5987. ASSERT(pu4QueryInfoLen);
  5988. if (prAdapter->rAcpiState == ACPI_STATE_D3) {
  5989. DBGLOG(OID, WARN,
  5990. "Fail in query receive error! (Adapter not ready). ACPI=D%d, Radio=%d\n",
  5991. prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
  5992. *pu4QueryInfoLen = sizeof(UINT_32);
  5993. return WLAN_STATUS_ADAPTER_NOT_READY;
  5994. } else if (u4QueryBufferLen < sizeof(UINT_32)
  5995. || (u4QueryBufferLen > sizeof(UINT_32) && u4QueryBufferLen < sizeof(UINT_64))) {
  5996. *pu4QueryInfoLen = sizeof(UINT_64);
  5997. return WLAN_STATUS_INVALID_LENGTH;
  5998. }
  5999. #if CFG_ENABLE_STATISTICS_BUFFERING
  6000. if (IsBufferedStatisticsUsable(prAdapter) == TRUE) {
  6001. if (u4QueryBufferLen == sizeof(UINT_32)) {
  6002. *pu4QueryInfoLen = sizeof(UINT_32);
  6003. *(PUINT_32) pvQueryBuffer = (UINT_32) prAdapter->rStatStruct.rFailedCount.QuadPart;
  6004. } else {
  6005. *pu4QueryInfoLen = sizeof(UINT_64);
  6006. *(PUINT_64) pvQueryBuffer = (UINT_64) prAdapter->rStatStruct.rFailedCount.QuadPart;
  6007. }
  6008. } else
  6009. #endif
  6010. {
  6011. return wlanSendSetQueryCmd(prAdapter,
  6012. CMD_ID_GET_STATISTICS,
  6013. FALSE,
  6014. TRUE,
  6015. TRUE,
  6016. nicCmdEventQueryXmitMaxCollisions,
  6017. nicOidCmdTimeoutCommon, 0, NULL, pvQueryBuffer, u4QueryBufferLen);
  6018. }
  6019. return WLAN_STATUS_SUCCESS;
  6020. } /* wlanoidQueryXmitMaxCollisions */
  6021. #define MTK_CUSTOM_OID_INTERFACE_VERSION 0x00006620 /* for WPDWifi DLL */
  6022. /*----------------------------------------------------------------------------*/
  6023. /*!
  6024. * \brief This routine is called to query current the OID interface version,
  6025. * which is the interface between the application and driver.
  6026. *
  6027. * \param[in] prAdapter Pointer to the Adapter structure.
  6028. * \param[in] pvQueryBuffer Pointer to the buffer that holds the result of
  6029. * the query.
  6030. * \param[in] u4QueryBufferLen The length of the query buffer.
  6031. * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
  6032. * bytes written into the query buffer. If the call
  6033. * failed due to invalid length of the query buffer,
  6034. * returns the amount of storage needed.
  6035. *
  6036. * \retval WLAN_STATUS_SUCCESS
  6037. */
  6038. /*----------------------------------------------------------------------------*/
  6039. WLAN_STATUS
  6040. wlanoidQueryOidInterfaceVersion(IN P_ADAPTER_T prAdapter,
  6041. IN PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  6042. {
  6043. DEBUGFUNC("wlanoidQueryOidInterfaceVersion");
  6044. ASSERT(prAdapter);
  6045. if (u4QueryBufferLen)
  6046. ASSERT(pvQueryBuffer);
  6047. ASSERT(pu4QueryInfoLen);
  6048. *(PUINT_32) pvQueryBuffer = MTK_CUSTOM_OID_INTERFACE_VERSION;
  6049. *pu4QueryInfoLen = sizeof(UINT_32);
  6050. DBGLOG(OID, WARN, "Custom OID interface version: %#08lX\n", *(PUINT_32) pvQueryBuffer);
  6051. return WLAN_STATUS_SUCCESS;
  6052. } /* wlanoidQueryOidInterfaceVersion */
  6053. /*----------------------------------------------------------------------------*/
  6054. /*!
  6055. * \brief This routine is called to query current Multicast Address List.
  6056. *
  6057. * \param[in] prAdapter Pointer to the Adapter structure.
  6058. * \param[in] pvQueryBuffer Pointer to the buffer that holds the result of
  6059. * the query.
  6060. * \param[in] u4QueryBufferLen The length of the query buffer.
  6061. * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
  6062. * bytes written into the query buffer. If the call
  6063. * failed due to invalid length of the query buffer,
  6064. * returns the amount of storage needed.
  6065. *
  6066. * \retval WLAN_STATUS_SUCCESS
  6067. * \retval WLAN_STATUS_BUFFER_TOO_SHORT
  6068. */
  6069. /*----------------------------------------------------------------------------*/
  6070. WLAN_STATUS
  6071. wlanoidQueryMulticastList(IN P_ADAPTER_T prAdapter,
  6072. OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  6073. {
  6074. #ifndef LINUX
  6075. ASSERT(prAdapter);
  6076. ASSERT(pu4QueryInfoLen);
  6077. if (u4QueryBufferLen)
  6078. ASSERT(pvQueryBuffer);
  6079. return wlanSendSetQueryCmd(prAdapter,
  6080. CMD_ID_MAC_MCAST_ADDR,
  6081. FALSE,
  6082. TRUE,
  6083. TRUE,
  6084. nicCmdEventQueryMcastAddr,
  6085. nicOidCmdTimeoutCommon, 0, NULL, pvQueryBuffer, u4QueryBufferLen);
  6086. #else
  6087. return WLAN_STATUS_SUCCESS;
  6088. #endif
  6089. } /* end of wlanoidQueryMulticastList() */
  6090. /*----------------------------------------------------------------------------*/
  6091. /*!
  6092. * \brief This routine is called to set Multicast Address List.
  6093. *
  6094. * \param[in] prAdapter Pointer to the Adapter structure.
  6095. * \param[in] pvSetBuffer Pointer to the buffer that holds the data to be set.
  6096. * \param[in] u4SetBufferLen The length of the set buffer.
  6097. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  6098. * bytes read from the set buffer. If the call failed
  6099. * due to invalid length of the set buffer, returns
  6100. * the amount of storage needed.
  6101. *
  6102. * \retval WLAN_STATUS_SUCCESS
  6103. * \retval WLAN_STATUS_INVALID_LENGTH
  6104. * \retval WLAN_STATUS_ADAPTER_NOT_READY
  6105. * \retval WLAN_STATUS_MULTICAST_FULL
  6106. */
  6107. /*----------------------------------------------------------------------------*/
  6108. WLAN_STATUS
  6109. wlanoidSetMulticastList(IN P_ADAPTER_T prAdapter,
  6110. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  6111. {
  6112. CMD_MAC_MCAST_ADDR rCmdMacMcastAddr;
  6113. ASSERT(prAdapter);
  6114. ASSERT(pu4SetInfoLen);
  6115. /* The data must be a multiple of the Ethernet address size. */
  6116. if ((u4SetBufferLen % MAC_ADDR_LEN)) {
  6117. DBGLOG(OID, WARN, "Invalid MC list length %u\n", u4SetBufferLen);
  6118. *pu4SetInfoLen = (((u4SetBufferLen + MAC_ADDR_LEN) - 1) / MAC_ADDR_LEN) * MAC_ADDR_LEN;
  6119. return WLAN_STATUS_INVALID_LENGTH;
  6120. }
  6121. *pu4SetInfoLen = u4SetBufferLen;
  6122. /* Verify if we can support so many multicast addresses. */
  6123. if ((u4SetBufferLen / MAC_ADDR_LEN) > MAX_NUM_GROUP_ADDR) {
  6124. DBGLOG(OID, WARN, "Too many MC addresses\n");
  6125. return WLAN_STATUS_MULTICAST_FULL;
  6126. }
  6127. /* NOTE(Kevin): Windows may set u4SetBufferLen == 0 &&
  6128. * pvSetBuffer == NULL to clear exist Multicast List.
  6129. */
  6130. if (u4SetBufferLen)
  6131. ASSERT(pvSetBuffer);
  6132. if (prAdapter->rAcpiState == ACPI_STATE_D3) {
  6133. DBGLOG(OID, WARN,
  6134. "Fail in set multicast list! (Adapter not ready). ACPI=D%d, Radio=%d\n",
  6135. prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
  6136. return WLAN_STATUS_ADAPTER_NOT_READY;
  6137. }
  6138. rCmdMacMcastAddr.u4NumOfGroupAddr = u4SetBufferLen / MAC_ADDR_LEN;
  6139. rCmdMacMcastAddr.ucBssIndex = prAdapter->prAisBssInfo->ucBssIndex;
  6140. kalMemCopy(rCmdMacMcastAddr.arAddress, pvSetBuffer, u4SetBufferLen);
  6141. return wlanSendSetQueryCmd(prAdapter,
  6142. CMD_ID_MAC_MCAST_ADDR,
  6143. TRUE,
  6144. FALSE,
  6145. TRUE,
  6146. nicCmdEventSetCommon,
  6147. nicOidCmdTimeoutCommon,
  6148. sizeof(CMD_MAC_MCAST_ADDR),
  6149. (PUINT_8) &rCmdMacMcastAddr, pvSetBuffer, u4SetBufferLen);
  6150. } /* end of wlanoidSetMulticastList() */
  6151. /*----------------------------------------------------------------------------*/
  6152. /*!
  6153. * \brief This routine is called to set Packet Filter.
  6154. *
  6155. * \param[in] prAdapter Pointer to the Adapter structure.
  6156. * \param[in] pvSetBuffer Pointer to the buffer that holds the data to be set.
  6157. * \param[in] u4SetBufferLen The length of the set buffer.
  6158. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  6159. * bytes read from the set buffer. If the call failed
  6160. * due to invalid length of the set buffer, returns
  6161. * the amount of storage needed.
  6162. *
  6163. * \retval WLAN_STATUS_SUCCESS
  6164. * \retval WLAN_STATUS_INVALID_LENGTH
  6165. * \retval WLAN_STATUS_NOT_SUPPORTED
  6166. * \retval WLAN_STATUS_ADAPTER_NOT_READY
  6167. */
  6168. /*----------------------------------------------------------------------------*/
  6169. WLAN_STATUS
  6170. wlanoidSetCurrentPacketFilter(IN P_ADAPTER_T prAdapter,
  6171. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  6172. {
  6173. UINT_32 u4NewPacketFilter;
  6174. WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
  6175. DEBUGFUNC("wlanoidSetCurrentPacketFilter");
  6176. ASSERT(prAdapter);
  6177. ASSERT(pu4SetInfoLen);
  6178. if (u4SetBufferLen < sizeof(UINT_32)) {
  6179. *pu4SetInfoLen = sizeof(UINT_32);
  6180. return WLAN_STATUS_INVALID_LENGTH;
  6181. }
  6182. ASSERT(pvSetBuffer);
  6183. /* Set the new packet filter. */
  6184. u4NewPacketFilter = *(PUINT_32) pvSetBuffer;
  6185. DBGLOG(OID, TRACE, "New packet filter: %#08x\n", u4NewPacketFilter);
  6186. if (prAdapter->rAcpiState == ACPI_STATE_D3) {
  6187. DBGLOG(OID, WARN,
  6188. "Fail in set current packet filter! (Adapter not ready). ACPI=D%d, Radio=%d\n",
  6189. prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
  6190. return WLAN_STATUS_ADAPTER_NOT_READY;
  6191. }
  6192. do {
  6193. /* Verify the bits of the new packet filter. If any bits are set that
  6194. we don't support, leave. */
  6195. if (u4NewPacketFilter & ~(PARAM_PACKET_FILTER_SUPPORTED)) {
  6196. rStatus = WLAN_STATUS_NOT_SUPPORTED;
  6197. break;
  6198. }
  6199. #if DBG
  6200. /* Need to enable or disable promiscuous support depending on the new
  6201. filter. */
  6202. if (u4NewPacketFilter & PARAM_PACKET_FILTER_PROMISCUOUS)
  6203. DBGLOG(OID, TRACE, "Enable promiscuous mode\n");
  6204. else
  6205. DBGLOG(OID, TRACE, "Disable promiscuous mode\n");
  6206. if (u4NewPacketFilter & PARAM_PACKET_FILTER_ALL_MULTICAST)
  6207. DBGLOG(OID, TRACE, "Enable all-multicast mode\n");
  6208. else if (u4NewPacketFilter & PARAM_PACKET_FILTER_MULTICAST)
  6209. DBGLOG(OID, TRACE, "Enable multicast\n");
  6210. else
  6211. DBGLOG(OID, TRACE, "Disable multicast\n");
  6212. if (u4NewPacketFilter & PARAM_PACKET_FILTER_BROADCAST)
  6213. DBGLOG(OID, TRACE, "Enable Broadcast\n");
  6214. else
  6215. DBGLOG(OID, TRACE, "Disable Broadcast\n");
  6216. #endif
  6217. prAdapter->fgAllMulicastFilter = FALSE;
  6218. if (u4NewPacketFilter & PARAM_PACKET_FILTER_ALL_MULTICAST)
  6219. prAdapter->fgAllMulicastFilter = TRUE;
  6220. } while (FALSE);
  6221. if (rStatus == WLAN_STATUS_SUCCESS) {
  6222. /* Store the packet filter */
  6223. prAdapter->u4OsPacketFilter &= PARAM_PACKET_FILTER_P2P_MASK;
  6224. prAdapter->u4OsPacketFilter |= u4NewPacketFilter;
  6225. rStatus = wlanoidSetPacketFilter(prAdapter, prAdapter->u4OsPacketFilter,
  6226. TRUE, pvSetBuffer, u4SetBufferLen);
  6227. }
  6228. DBGLOG(OID, TRACE, "[MC debug] u4OsPacketFilter=%x\n", prAdapter->u4OsPacketFilter);
  6229. return rStatus;
  6230. } /* wlanoidSetCurrentPacketFilter */
  6231. WLAN_STATUS wlanoidSetPacketFilter(P_ADAPTER_T prAdapter, UINT_32 u4PacketFilter,
  6232. BOOLEAN fgIsOid, PVOID pvSetBuffer, UINT_32 u4SetBufferLen)
  6233. {
  6234. if (prAdapter->prGlueInfo->fgIsInSuspendMode)
  6235. u4PacketFilter &= ~(PARAM_PACKET_FILTER_MULTICAST | PARAM_PACKET_FILTER_ALL_MULTICAST);
  6236. DBGLOG(OID, TRACE, "[MC debug] u4PacketFilter=%x, IsSuspend=%d\n", u4PacketFilter,
  6237. prAdapter->prGlueInfo->fgIsInSuspendMode);
  6238. return wlanSendSetQueryCmd(prAdapter,
  6239. CMD_ID_SET_RX_FILTER,
  6240. TRUE,
  6241. FALSE,
  6242. fgIsOid,
  6243. nicCmdEventSetCommon,
  6244. nicOidCmdTimeoutCommon,
  6245. sizeof(UINT_32),
  6246. (PUINT_8)&u4PacketFilter,
  6247. pvSetBuffer, u4SetBufferLen);
  6248. }
  6249. /*----------------------------------------------------------------------------*/
  6250. /*!
  6251. * \brief This routine is called to query current packet filter.
  6252. *
  6253. * \param[in] prAdapter Pointer to the Adapter structure.
  6254. * \param[in] pvQueryBuffer Pointer to the buffer that holds the result of
  6255. * the query.
  6256. * \param[in] u4QueryBufferLen The length of the query buffer.
  6257. * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
  6258. * bytes written into the query buffer. If the call
  6259. * failed due to invalid length of the query buffer,
  6260. * returns the amount of storage needed.
  6261. *
  6262. * \retval WLAN_STATUS_SUCCESS
  6263. */
  6264. /*----------------------------------------------------------------------------*/
  6265. WLAN_STATUS
  6266. wlanoidQueryCurrentPacketFilter(IN P_ADAPTER_T prAdapter,
  6267. OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  6268. {
  6269. DEBUGFUNC("wlanoidQueryCurrentPacketFilter");
  6270. ASSERT(prAdapter);
  6271. ASSERT(pu4QueryInfoLen);
  6272. *pu4QueryInfoLen = sizeof(UINT_32);
  6273. if (u4QueryBufferLen >= sizeof(UINT_32)) {
  6274. ASSERT(pvQueryBuffer);
  6275. *(PUINT_32) pvQueryBuffer = prAdapter->u4OsPacketFilter;
  6276. }
  6277. return WLAN_STATUS_SUCCESS;
  6278. } /* wlanoidQueryCurrentPacketFilter */
  6279. /*----------------------------------------------------------------------------*/
  6280. /*!
  6281. * \brief This routine is called to query ACPI device power state.
  6282. *
  6283. * \param[in] prAdapter Pointer to the Adapter structure.
  6284. * \param[in] pvQueryBuffer Pointer to the buffer that holds the result of
  6285. * the query.
  6286. * \param[in] u4QueryBufferLen The length of the query buffer.
  6287. * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
  6288. * bytes written into the query buffer. If the call
  6289. * failed due to invalid length of the query buffer,
  6290. * returns the amount of storage needed.
  6291. *
  6292. * \retval WLAN_STATUS_SUCCESS
  6293. */
  6294. /*----------------------------------------------------------------------------*/
  6295. WLAN_STATUS
  6296. wlanoidQueryAcpiDevicePowerState(IN P_ADAPTER_T prAdapter,
  6297. IN PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  6298. {
  6299. #if DBG
  6300. PPARAM_DEVICE_POWER_STATE prPowerState;
  6301. #endif
  6302. DEBUGFUNC("wlanoidQueryAcpiDevicePowerState");
  6303. ASSERT(prAdapter);
  6304. ASSERT(pu4QueryInfoLen);
  6305. if (u4QueryBufferLen)
  6306. ASSERT(pvQueryBuffer);
  6307. *pu4QueryInfoLen = sizeof(PARAM_DEVICE_POWER_STATE);
  6308. #if DBG
  6309. prPowerState = (PPARAM_DEVICE_POWER_STATE) pvQueryBuffer;
  6310. switch (*prPowerState) {
  6311. case ParamDeviceStateD0:
  6312. DBGLOG(OID, INFO, "Query Power State: D0\n");
  6313. break;
  6314. case ParamDeviceStateD1:
  6315. DBGLOG(OID, INFO, "Query Power State: D1\n");
  6316. break;
  6317. case ParamDeviceStateD2:
  6318. DBGLOG(OID, INFO, "Query Power State: D2\n");
  6319. break;
  6320. case ParamDeviceStateD3:
  6321. DBGLOG(OID, INFO, "Query Power State: D3\n");
  6322. break;
  6323. default:
  6324. break;
  6325. }
  6326. #endif
  6327. /* Since we will disconnect the newwork, therefore we do not
  6328. need to check queue empty */
  6329. *(PPARAM_DEVICE_POWER_STATE) pvQueryBuffer = ParamDeviceStateD3;
  6330. /* WARNLOG(("Ready to transition to D3\n")); */
  6331. return WLAN_STATUS_SUCCESS;
  6332. } /* pwrmgtQueryPower */
  6333. /*----------------------------------------------------------------------------*/
  6334. /*!
  6335. * \brief This routine is called to set ACPI device power state.
  6336. *
  6337. * \param[in] pvAdapter Pointer to the Adapter structure.
  6338. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  6339. * \param[in] u4SetBufferLen The length of the set buffer.
  6340. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  6341. * bytes read from the set buffer. If the call failed
  6342. * due to invalid length of the set buffer, returns
  6343. * the amount of storage needed.
  6344. *
  6345. * \retval WLAN_STATUS_SUCCESS
  6346. */
  6347. /*----------------------------------------------------------------------------*/
  6348. WLAN_STATUS
  6349. wlanoidSetAcpiDevicePowerState(IN P_ADAPTER_T prAdapter,
  6350. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  6351. {
  6352. PPARAM_DEVICE_POWER_STATE prPowerState;
  6353. BOOLEAN fgRetValue = TRUE;
  6354. DEBUGFUNC("wlanoidSetAcpiDevicePowerState");
  6355. ASSERT(prAdapter);
  6356. ASSERT(pu4SetInfoLen);
  6357. *pu4SetInfoLen = sizeof(PARAM_DEVICE_POWER_STATE);
  6358. ASSERT(pvSetBuffer);
  6359. prPowerState = (PPARAM_DEVICE_POWER_STATE) pvSetBuffer;
  6360. switch (*prPowerState) {
  6361. case ParamDeviceStateD0:
  6362. DBGLOG(OID, INFO, "Set Power State: D0\n");
  6363. kalDevSetPowerState(prAdapter->prGlueInfo, (UINT_32) ParamDeviceStateD0);
  6364. fgRetValue = nicpmSetAcpiPowerD0(prAdapter);
  6365. break;
  6366. case ParamDeviceStateD1:
  6367. DBGLOG(OID, INFO, "Set Power State: D1\n");
  6368. /* no break here */
  6369. case ParamDeviceStateD2:
  6370. DBGLOG(OID, INFO, "Set Power State: D2\n");
  6371. /* no break here */
  6372. case ParamDeviceStateD3:
  6373. DBGLOG(OID, INFO, "Set Power State: D3\n");
  6374. fgRetValue = nicpmSetAcpiPowerD3(prAdapter);
  6375. kalDevSetPowerState(prAdapter->prGlueInfo, (UINT_32) ParamDeviceStateD3);
  6376. break;
  6377. default:
  6378. break;
  6379. }
  6380. if (fgRetValue == TRUE)
  6381. return WLAN_STATUS_SUCCESS;
  6382. else
  6383. return WLAN_STATUS_FAILURE;
  6384. } /* end of wlanoidSetAcpiDevicePowerState() */
  6385. /*----------------------------------------------------------------------------*/
  6386. /*!
  6387. * \brief This routine is called to query the current fragmentation threshold.
  6388. *
  6389. * \param[in] pvAdapter Pointer to the Adapter structure.
  6390. * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
  6391. * the query.
  6392. * \param[in] u4QueryBufferLen The length of the query buffer.
  6393. * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
  6394. * bytes written into the query buffer. If the call
  6395. * failed due to invalid length of the query buffer,
  6396. * returns the amount of storage needed.
  6397. *
  6398. * \retval WLAN_STATUS_SUCCESS
  6399. * \retval WLAN_STATUS_BUFFER_TOO_SHORT
  6400. */
  6401. /*----------------------------------------------------------------------------*/
  6402. WLAN_STATUS
  6403. wlanoidQueryFragThreshold(IN P_ADAPTER_T prAdapter,
  6404. OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  6405. {
  6406. DEBUGFUNC("wlanoidQueryFragThreshold");
  6407. ASSERT(prAdapter);
  6408. if (u4QueryBufferLen)
  6409. ASSERT(pvQueryBuffer);
  6410. ASSERT(pu4QueryInfoLen);
  6411. DBGLOG(OID, LOUD, "\n");
  6412. #if CFG_TX_FRAGMENT
  6413. return WLAN_STATUS_SUCCESS;
  6414. #else
  6415. return WLAN_STATUS_NOT_SUPPORTED;
  6416. #endif /* CFG_TX_FRAGMENT */
  6417. } /* end of wlanoidQueryFragThreshold() */
  6418. /*----------------------------------------------------------------------------*/
  6419. /*!
  6420. * \brief This routine is called to set a new fragmentation threshold to the
  6421. * driver.
  6422. *
  6423. * \param[in] pvAdapter Pointer to the Adapter structure.
  6424. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  6425. * \param[in] u4SetBufferLen The length of the set buffer.
  6426. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  6427. * bytes read from the set buffer. If the call failed
  6428. * due to invalid length of the set buffer, returns
  6429. * the amount of storage needed.
  6430. *
  6431. * \retval WLAN_STATUS_SUCCESS
  6432. * \retval WLAN_STATUS_INVALID_DATA
  6433. * \retval WLAN_STATUS_INVALID_LENGTH
  6434. */
  6435. /*----------------------------------------------------------------------------*/
  6436. WLAN_STATUS
  6437. wlanoidSetFragThreshold(IN P_ADAPTER_T prAdapter,
  6438. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  6439. {
  6440. #if CFG_TX_FRAGMENT
  6441. return WLAN_STATUS_SUCCESS;
  6442. #else
  6443. return WLAN_STATUS_NOT_SUPPORTED;
  6444. #endif /* CFG_TX_FRAGMENT */
  6445. } /* end of wlanoidSetFragThreshold() */
  6446. /*----------------------------------------------------------------------------*/
  6447. /*!
  6448. * \brief This routine is called to query the current RTS threshold.
  6449. *
  6450. * \param[in] pvAdapter Pointer to the Adapter structure.
  6451. * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
  6452. * the query.
  6453. * \param[in] u4QueryBufferLen The length of the query buffer.
  6454. * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
  6455. * bytes written into the query buffer. If the call
  6456. * failed due to invalid length of the query buffer,
  6457. * returns the amount of storage needed.
  6458. *
  6459. * \retval WLAN_STATUS_SUCCESS
  6460. * \retval WLAN_STATUS_BUFFER_TOO_SHORT
  6461. */
  6462. /*----------------------------------------------------------------------------*/
  6463. WLAN_STATUS
  6464. wlanoidQueryRtsThreshold(IN P_ADAPTER_T prAdapter,
  6465. OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  6466. {
  6467. DEBUGFUNC("wlanoidQueryRtsThreshold");
  6468. ASSERT(prAdapter);
  6469. if (u4QueryBufferLen)
  6470. ASSERT(pvQueryBuffer);
  6471. ASSERT(pu4QueryInfoLen);
  6472. DBGLOG(OID, LOUD, "\n");
  6473. if (u4QueryBufferLen < sizeof(PARAM_RTS_THRESHOLD)) {
  6474. *pu4QueryInfoLen = sizeof(PARAM_RTS_THRESHOLD);
  6475. return WLAN_STATUS_BUFFER_TOO_SHORT;
  6476. }
  6477. *((PARAM_RTS_THRESHOLD *) pvQueryBuffer) = prAdapter->rWlanInfo.eRtsThreshold;
  6478. return WLAN_STATUS_SUCCESS;
  6479. } /* wlanoidQueryRtsThreshold */
  6480. /*----------------------------------------------------------------------------*/
  6481. /*!
  6482. * \brief This routine is called to set a new RTS threshold to the driver.
  6483. *
  6484. * \param[in] pvAdapter Pointer to the Adapter structure.
  6485. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  6486. * \param[in] u4SetBufferLen The length of the set buffer.
  6487. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  6488. * bytes read from the set buffer. If the call failed
  6489. * due to invalid length of the set buffer, returns
  6490. * the amount of storage needed.
  6491. *
  6492. * \retval WLAN_STATUS_SUCCESS
  6493. * \retval WLAN_STATUS_INVALID_DATA
  6494. * \retval WLAN_STATUS_INVALID_LENGTH
  6495. */
  6496. /*----------------------------------------------------------------------------*/
  6497. WLAN_STATUS
  6498. wlanoidSetRtsThreshold(IN P_ADAPTER_T prAdapter,
  6499. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  6500. {
  6501. PARAM_RTS_THRESHOLD *prRtsThreshold;
  6502. ASSERT(prAdapter);
  6503. ASSERT(pu4SetInfoLen);
  6504. *pu4SetInfoLen = sizeof(PARAM_RTS_THRESHOLD);
  6505. if (u4SetBufferLen < sizeof(PARAM_RTS_THRESHOLD)) {
  6506. DBGLOG(OID, WARN, "Invalid length %u\n", u4SetBufferLen);
  6507. return WLAN_STATUS_INVALID_LENGTH;
  6508. }
  6509. prRtsThreshold = (PARAM_RTS_THRESHOLD *) pvSetBuffer;
  6510. *prRtsThreshold = prAdapter->rWlanInfo.eRtsThreshold;
  6511. return WLAN_STATUS_SUCCESS;
  6512. } /* wlanoidSetRtsThreshold */
  6513. /*----------------------------------------------------------------------------*/
  6514. /*!
  6515. * \brief This routine is used to turn radio off.
  6516. *
  6517. * \param[in] pvAdapter Pointer to the Adapter structure.
  6518. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  6519. * \param[in] u4SetBufferLen The length of the set buffer.
  6520. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  6521. * bytes read from the set buffer. If the call failed
  6522. * due to invalid length of the set buffer, returns
  6523. * the amount of storage needed.
  6524. *
  6525. * \retval WLAN_STATUS_SUCCESS
  6526. * \retval WLAN_STATUS_ADAPTER_NOT_READY
  6527. */
  6528. /*----------------------------------------------------------------------------*/
  6529. WLAN_STATUS
  6530. wlanoidSetDisassociate(IN P_ADAPTER_T prAdapter,
  6531. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  6532. {
  6533. P_MSG_AIS_ABORT_T prAisAbortMsg;
  6534. DEBUGFUNC("wlanoidSetDisassociate");
  6535. ASSERT(prAdapter);
  6536. ASSERT(pu4SetInfoLen);
  6537. *pu4SetInfoLen = 0;
  6538. if (prAdapter->rAcpiState == ACPI_STATE_D3) {
  6539. DBGLOG(OID, WARN,
  6540. "Fail in set disassociate! (Adapter not ready). ACPI=D%d, Radio=%d\n",
  6541. prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
  6542. return WLAN_STATUS_ADAPTER_NOT_READY;
  6543. }
  6544. /* prepare message to AIS */
  6545. prAdapter->rWifiVar.rConnSettings.fgIsConnReqIssued = FALSE;
  6546. /* Send AIS Abort Message */
  6547. prAisAbortMsg = (P_MSG_AIS_ABORT_T) cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_AIS_ABORT_T));
  6548. if (!prAisAbortMsg) {
  6549. ASSERT(0);
  6550. return WLAN_STATUS_FAILURE;
  6551. }
  6552. prAisAbortMsg->rMsgHdr.eMsgId = MID_OID_AIS_FSM_JOIN_REQ;
  6553. prAisAbortMsg->ucReasonOfDisconnect = DISCONNECT_REASON_CODE_NEW_CONNECTION;
  6554. prAisAbortMsg->fgDelayIndication = FALSE;
  6555. mboxSendMsg(prAdapter, MBOX_ID_0, (P_MSG_HDR_T) prAisAbortMsg, MSG_SEND_METHOD_BUF);
  6556. /* indicate for disconnection */
  6557. if (kalGetMediaStateIndicated(prAdapter->prGlueInfo) == PARAM_MEDIA_STATE_CONNECTED)
  6558. kalIndicateStatusAndComplete(prAdapter->prGlueInfo, WLAN_STATUS_MEDIA_DISCONNECT_LOCALLY, NULL, 0);
  6559. #if !defined(LINUX)
  6560. prAdapter->fgIsRadioOff = TRUE;
  6561. #endif
  6562. return WLAN_STATUS_SUCCESS;
  6563. } /* wlanoidSetDisassociate */
  6564. /*----------------------------------------------------------------------------*/
  6565. /*!
  6566. * \brief This routine is used to query the power save profile.
  6567. *
  6568. * \param[in] prAdapter Pointer to the Adapter structure.
  6569. * \param[out] pvQueryBuf A pointer to the buffer that holds the result of
  6570. * the query.
  6571. * \param[in] u4QueryBufLen The length of the query buffer.
  6572. * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
  6573. * bytes written into the query buffer. If the call
  6574. * failed due to invalid length of the query buffer,
  6575. * returns the amount of storage needed.
  6576. *
  6577. * \return WLAN_STATUS_SUCCESS
  6578. */
  6579. /*----------------------------------------------------------------------------*/
  6580. WLAN_STATUS
  6581. wlanoidQuery802dot11PowerSaveProfile(IN P_ADAPTER_T prAdapter,
  6582. IN PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  6583. {
  6584. DEBUGFUNC("wlanoidQuery802dot11PowerSaveProfile");
  6585. ASSERT(prAdapter);
  6586. ASSERT(pu4QueryInfoLen);
  6587. if (u4QueryBufferLen != 0) {
  6588. ASSERT(pvQueryBuffer);
  6589. /* *(PPARAM_POWER_MODE) pvQueryBuffer = (PARAM_POWER_MODE)(prAdapter->rWlanInfo.ePowerSaveMode.ucPsProfile); */
  6590. *(PPARAM_POWER_MODE) pvQueryBuffer =
  6591. (PARAM_POWER_MODE) (prAdapter->rWlanInfo.
  6592. arPowerSaveMode[prAdapter->prAisBssInfo->ucBssIndex].ucPsProfile);
  6593. *pu4QueryInfoLen = sizeof(PARAM_POWER_MODE);
  6594. /* hack for CTIA power mode setting function */
  6595. if (prAdapter->fgEnCtiaPowerMode) {
  6596. /* set to non-zero value (to prevent MMI query 0, */
  6597. /* before it intends to set 0, which will skip its following state machine) */
  6598. *(PPARAM_POWER_MODE) pvQueryBuffer = (PARAM_POWER_MODE) 2;
  6599. }
  6600. }
  6601. return WLAN_STATUS_SUCCESS;
  6602. }
  6603. /*----------------------------------------------------------------------------*/
  6604. /*!
  6605. * \brief This routine is used to set the power save profile.
  6606. *
  6607. * \param[in] pvAdapter Pointer to the Adapter structure.
  6608. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  6609. * \param[in] u4SetBufferLen The length of the set buffer.
  6610. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  6611. * bytes read from the set buffer. If the call failed
  6612. * due to invalid length of the set buffer, returns
  6613. * the amount of storage needed.
  6614. *
  6615. * \retval WLAN_STATUS_SUCCESS
  6616. * \retval WLAN_STATUS_INVALID_LENGTH
  6617. */
  6618. /*----------------------------------------------------------------------------*/
  6619. WLAN_STATUS
  6620. wlanoidSet802dot11PowerSaveProfile(IN P_ADAPTER_T prAdapter,
  6621. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  6622. {
  6623. WLAN_STATUS status;
  6624. P_PARAM_POWER_MODE_T prPowerMode;
  6625. P_BSS_INFO_T prBssInfo;
  6626. const PUINT_8 apucPsMode[Param_PowerModeMax] = {
  6627. (PUINT_8) "CAM",
  6628. (PUINT_8) "MAX PS",
  6629. (PUINT_8) "FAST PS"
  6630. };
  6631. DEBUGFUNC("wlanoidSet802dot11PowerSaveProfile");
  6632. ASSERT(prAdapter);
  6633. ASSERT(pu4SetInfoLen);
  6634. *pu4SetInfoLen = sizeof(PARAM_POWER_MODE_T);
  6635. prPowerMode = (P_PARAM_POWER_MODE_T) pvSetBuffer;
  6636. if (u4SetBufferLen < sizeof(PARAM_POWER_MODE_T)) {
  6637. DBGLOG(OID, WARN, "Set power mode error: Invalid length %ld\n", u4SetBufferLen);
  6638. return WLAN_STATUS_INVALID_LENGTH;
  6639. } else if (prPowerMode->ePowerMode >= Param_PowerModeMax) {
  6640. DBGLOG(OID, WARN, "Set power mode error: Invalid power mode(%u)\n", prPowerMode->ePowerMode);
  6641. return WLAN_STATUS_INVALID_DATA;
  6642. } else if (prPowerMode->ucBssIdx >= BSS_INFO_NUM) {
  6643. DBGLOG(OID, WARN, "Set power mode error: Invalid BSS index(%u)\n", prPowerMode->ucBssIdx);
  6644. return WLAN_STATUS_INVALID_DATA;
  6645. }
  6646. prBssInfo = GET_BSS_INFO_BY_INDEX(prAdapter, prPowerMode->ucBssIdx);
  6647. if (prAdapter->fgEnCtiaPowerMode) {
  6648. if (prPowerMode->ePowerMode != Param_PowerModeCAM) {
  6649. /* User setting to PS mode (Param_PowerModeMAX_PSP or Param_PowerModeFast_PSP) */
  6650. if (prAdapter->u4CtiaPowerMode == 0)
  6651. /* force to keep in CAM mode */
  6652. prPowerMode->ePowerMode = Param_PowerModeCAM;
  6653. else if (prAdapter->u4CtiaPowerMode == 1)
  6654. prPowerMode->ePowerMode = Param_PowerModeMAX_PSP;
  6655. else if (prAdapter->u4CtiaPowerMode == 2)
  6656. prPowerMode->ePowerMode = Param_PowerModeFast_PSP;
  6657. }
  6658. }
  6659. status = nicConfigPowerSaveProfile(prAdapter, prPowerMode->ucBssIdx, prPowerMode->ePowerMode, TRUE);
  6660. if (prPowerMode->ePowerMode < Param_PowerModeMax) {
  6661. DBGLOG(OID, INFO, "Set %s Network BSS(%u) PS mode to %s (%d)\n",
  6662. apucNetworkType[prBssInfo->eNetworkType],
  6663. prPowerMode->ucBssIdx, apucPsMode[prPowerMode->ePowerMode], prPowerMode->ePowerMode);
  6664. } else {
  6665. DBGLOG(OID, INFO, "Invalid PS mode setting (%d) for %s Network BSS(%u)\n",
  6666. prPowerMode->ePowerMode, apucNetworkType[prBssInfo->eNetworkType], prPowerMode->ucBssIdx);
  6667. }
  6668. return status;
  6669. } /* end of wlanoidSetAcpiDevicePowerStateMode() */
  6670. /*----------------------------------------------------------------------------*/
  6671. /*!
  6672. * \brief This routine is called to query current status of AdHoc Mode.
  6673. *
  6674. * \param[in] prAdapter Pointer to the Adapter structure.
  6675. * \param[in] pvQueryBuffer Pointer to the buffer that holds the result of
  6676. * the query.
  6677. * \param[in] u4QueryBufferLen The length of the query buffer.
  6678. * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
  6679. * bytes written into the query buffer. If the call
  6680. * failed due to invalid length of the query buffer,
  6681. * returns the amount of storage needed.
  6682. *
  6683. * \retval WLAN_STATUS_SUCCESS
  6684. * \retval WLAN_STATUS_BUFFER_TOO_SHORT
  6685. */
  6686. /*----------------------------------------------------------------------------*/
  6687. WLAN_STATUS
  6688. wlanoidQueryAdHocMode(IN P_ADAPTER_T prAdapter,
  6689. OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  6690. {
  6691. return WLAN_STATUS_SUCCESS;
  6692. } /* end of wlanoidQueryAdHocMode() */
  6693. /*----------------------------------------------------------------------------*/
  6694. /*!
  6695. * \brief This routine is called to set AdHoc Mode.
  6696. *
  6697. * \param[in] prAdapter Pointer to the Adapter structure.
  6698. * \param[in] pvSetBuffer Pointer to the buffer that holds the data to be set.
  6699. * \param[in] u4SetBufferLen The length of the set buffer.
  6700. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  6701. * bytes read from the set buffer. If the call failed
  6702. * due to invalid length of the set buffer, returns
  6703. * the amount of storage needed.
  6704. *
  6705. * \retval WLAN_STATUS_SUCCESS
  6706. * \retval WLAN_STATUS_INVALID_LENGTH
  6707. * \retval WLAN_STATUS_INVALID_DATA
  6708. */
  6709. /*----------------------------------------------------------------------------*/
  6710. WLAN_STATUS
  6711. wlanoidSetAdHocMode(IN P_ADAPTER_T prAdapter,
  6712. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  6713. {
  6714. return WLAN_STATUS_SUCCESS;
  6715. } /* end of wlanoidSetAdHocMode() */
  6716. /*----------------------------------------------------------------------------*/
  6717. /*!
  6718. * \brief This routine is called to query RF frequency.
  6719. *
  6720. * \param[in] prAdapter Pointer to the Adapter structure.
  6721. * \param[in] pvQueryBuffer Pointer to the buffer that holds the result of
  6722. * the query.
  6723. * \param[in] u4QueryBufferLen The length of the query buffer.
  6724. * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
  6725. * bytes written into the query buffer. If the call
  6726. * failed due to invalid length of the query buffer,
  6727. * returns the amount of storage needed.
  6728. *
  6729. * \retval WLAN_STATUS_SUCCESS
  6730. * \retval WLAN_STATUS_BUFFER_TOO_SHORT
  6731. */
  6732. /*----------------------------------------------------------------------------*/
  6733. WLAN_STATUS
  6734. wlanoidQueryFrequency(IN P_ADAPTER_T prAdapter,
  6735. OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  6736. {
  6737. DEBUGFUNC("wlanoidQueryFrequency");
  6738. ASSERT(prAdapter);
  6739. ASSERT(pu4QueryInfoLen);
  6740. if (u4QueryBufferLen)
  6741. ASSERT(pvQueryBuffer);
  6742. if (u4QueryBufferLen < sizeof(UINT_32))
  6743. return WLAN_STATUS_BUFFER_TOO_SHORT;
  6744. if (prAdapter->rWifiVar.rConnSettings.eOPMode == NET_TYPE_INFRA) {
  6745. if (kalGetMediaStateIndicated(prAdapter->prGlueInfo) == PARAM_MEDIA_STATE_CONNECTED)
  6746. *(PUINT_32) pvQueryBuffer = nicChannelNum2Freq(prAdapter->prAisBssInfo->ucPrimaryChannel);
  6747. else
  6748. *(PUINT_32) pvQueryBuffer = 0;
  6749. } else
  6750. *(PUINT_32) pvQueryBuffer = nicChannelNum2Freq(prAdapter->rWifiVar.rConnSettings.ucAdHocChannelNum);
  6751. return WLAN_STATUS_SUCCESS;
  6752. } /* end of wlanoidQueryFrequency() */
  6753. /*----------------------------------------------------------------------------*/
  6754. /*!
  6755. * \brief This routine is called to set RF frequency by User Settings.
  6756. *
  6757. * \param[in] prAdapter Pointer to the Adapter structure.
  6758. * \param[in] pvQueryBuffer Pointer to the buffer that holds the result of
  6759. * the query.
  6760. * \param[in] u4QueryBufferLen The length of the query buffer.
  6761. * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
  6762. * bytes written into the query buffer. If the call
  6763. * failed due to invalid length of the query buffer,
  6764. * returns the amount of storage needed.
  6765. *
  6766. * \retval WLAN_STATUS_SUCCESS
  6767. * \retval WLAN_STATUS_INVALID_LENGTH
  6768. * \retval WLAN_STATUS_INVALID_DATA
  6769. */
  6770. /*----------------------------------------------------------------------------*/
  6771. WLAN_STATUS
  6772. wlanoidSetFrequency(IN P_ADAPTER_T prAdapter,
  6773. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  6774. {
  6775. PUINT_32 pu4FreqInKHz;
  6776. DEBUGFUNC("wlanoidSetFrequency");
  6777. ASSERT(prAdapter);
  6778. ASSERT(pu4SetInfoLen);
  6779. *pu4SetInfoLen = sizeof(UINT_32);
  6780. if (u4SetBufferLen < sizeof(UINT_32))
  6781. return WLAN_STATUS_INVALID_LENGTH;
  6782. ASSERT(pvSetBuffer);
  6783. pu4FreqInKHz = (PUINT_32) pvSetBuffer;
  6784. prAdapter->rWifiVar.rConnSettings.ucAdHocChannelNum = (UINT_8) nicFreq2ChannelNum(*pu4FreqInKHz);
  6785. prAdapter->rWifiVar.rConnSettings.eAdHocBand = *pu4FreqInKHz < 5000000 ? BAND_2G4 : BAND_5G;
  6786. return WLAN_STATUS_SUCCESS;
  6787. } /* end of wlanoidSetFrequency() */
  6788. /*----------------------------------------------------------------------------*/
  6789. /*!
  6790. * \brief This routine is called to set 802.11 channel of the radio frequency.
  6791. * This is a proprietary function call to Lunux currently.
  6792. *
  6793. * \param[in] prAdapter Pointer to the Adapter structure.
  6794. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  6795. * \param[in] u4SetBufferLen The length of the set buffer.
  6796. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  6797. * bytes read from the set buffer. If the call failed
  6798. * due to invalid length of the set buffer, returns
  6799. * the amount of storage needed.
  6800. *
  6801. * \retval WLAN_STATUS_SUCCESS
  6802. * \retval WLAN_STATUS_INVALID_LENGTH
  6803. * \retval WLAN_STATUS_INVALID_DATA
  6804. */
  6805. /*----------------------------------------------------------------------------*/
  6806. WLAN_STATUS
  6807. wlanoidSetChannel(IN P_ADAPTER_T prAdapter, IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  6808. {
  6809. ASSERT(0); /* // */
  6810. return WLAN_STATUS_SUCCESS;
  6811. }
  6812. /*----------------------------------------------------------------------------*/
  6813. /*!
  6814. * \brief This routine is called to query the Beacon Interval from User Settings.
  6815. *
  6816. * \param[in] prAdapter Pointer to the Adapter structure.
  6817. * \param[in] pvQueryBuffer Pointer to the buffer that holds the result of
  6818. * the query.
  6819. * \param[in] u4QueryBufferLen The length of the query buffer.
  6820. * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
  6821. * bytes written into the query buffer. If the call
  6822. * failed due to invalid length of the query buffer,
  6823. * returns the amount of storage needed.
  6824. *
  6825. * \retval WLAN_STATUS_SUCCESS
  6826. * \retval WLAN_STATUS_BUFFER_TOO_SHORT
  6827. */
  6828. /*----------------------------------------------------------------------------*/
  6829. WLAN_STATUS
  6830. wlanoidQueryBeaconInterval(IN P_ADAPTER_T prAdapter,
  6831. OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  6832. {
  6833. DEBUGFUNC("wlanoidQueryBeaconInterval");
  6834. ASSERT(prAdapter);
  6835. ASSERT(pu4QueryInfoLen);
  6836. if (u4QueryBufferLen)
  6837. ASSERT(pvQueryBuffer);
  6838. *pu4QueryInfoLen = sizeof(UINT_32);
  6839. if (u4QueryBufferLen < sizeof(UINT_32))
  6840. return WLAN_STATUS_BUFFER_TOO_SHORT;
  6841. if (kalGetMediaStateIndicated(prAdapter->prGlueInfo) == PARAM_MEDIA_STATE_CONNECTED) {
  6842. if (prAdapter->rWifiVar.rConnSettings.eOPMode == NET_TYPE_INFRA)
  6843. *(PUINT_32) pvQueryBuffer = prAdapter->rWlanInfo.rCurrBssId.rConfiguration.u4BeaconPeriod;
  6844. else
  6845. *(PUINT_32) pvQueryBuffer = (UINT_32) prAdapter->rWlanInfo.u2BeaconPeriod;
  6846. } else {
  6847. if (prAdapter->rWifiVar.rConnSettings.eOPMode == NET_TYPE_INFRA)
  6848. *(PUINT_32) pvQueryBuffer = 0;
  6849. else
  6850. *(PUINT_32) pvQueryBuffer = (UINT_32) prAdapter->rWlanInfo.u2BeaconPeriod;
  6851. }
  6852. return WLAN_STATUS_SUCCESS;
  6853. } /* end of wlanoidQueryBeaconInterval() */
  6854. /*----------------------------------------------------------------------------*/
  6855. /*!
  6856. * \brief This routine is called to set the Beacon Interval to User Settings.
  6857. *
  6858. * \param[in] prAdapter Pointer to the Adapter structure.
  6859. * \param[in] pvSetBuffer Pointer to the buffer that holds the data to be set.
  6860. * \param[in] u4SetBufferLen The length of the set buffer.
  6861. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  6862. * bytes read from the set buffer. If the call failed
  6863. * due to invalid length of the set buffer, returns
  6864. * the amount of storage needed.
  6865. *
  6866. * \retval WLAN_STATUS_SUCCESS
  6867. * \retval WLAN_STATUS_INVALID_LENGTH
  6868. * \retval WLAN_STATUS_INVALID_DATA
  6869. */
  6870. /*----------------------------------------------------------------------------*/
  6871. WLAN_STATUS
  6872. wlanoidSetBeaconInterval(IN P_ADAPTER_T prAdapter,
  6873. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  6874. {
  6875. PUINT_32 pu4BeaconInterval;
  6876. DEBUGFUNC("wlanoidSetBeaconInterval");
  6877. ASSERT(prAdapter);
  6878. ASSERT(pu4SetInfoLen);
  6879. *pu4SetInfoLen = sizeof(UINT_32);
  6880. if (u4SetBufferLen < sizeof(UINT_32))
  6881. return WLAN_STATUS_INVALID_LENGTH;
  6882. ASSERT(pvSetBuffer);
  6883. pu4BeaconInterval = (PUINT_32) pvSetBuffer;
  6884. if ((*pu4BeaconInterval < DOT11_BEACON_PERIOD_MIN)
  6885. || (*pu4BeaconInterval > DOT11_BEACON_PERIOD_MAX)) {
  6886. DBGLOG(OID, TRACE, "Invalid Beacon Interval = %ld\n", *pu4BeaconInterval);
  6887. return WLAN_STATUS_INVALID_DATA;
  6888. }
  6889. prAdapter->rWlanInfo.u2BeaconPeriod = (UINT_16) *pu4BeaconInterval;
  6890. DBGLOG(OID, INFO, "Set beacon interval: %d\n", prAdapter->rWlanInfo.u2BeaconPeriod);
  6891. return WLAN_STATUS_SUCCESS;
  6892. } /* end of wlanoidSetBeaconInterval() */
  6893. /*----------------------------------------------------------------------------*/
  6894. /*!
  6895. * \brief This routine is called to query the ATIM window from User Settings.
  6896. *
  6897. * \param[in] prAdapter Pointer to the Adapter structure.
  6898. * \param[in] pvQueryBuffer Pointer to the buffer that holds the result of
  6899. * the query.
  6900. * \param[in] u4QueryBufferLen The length of the query buffer.
  6901. * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
  6902. * bytes written into the query buffer. If the call
  6903. * failed due to invalid length of the query buffer,
  6904. * returns the amount of storage needed.
  6905. *
  6906. * \retval WLAN_STATUS_SUCCESS
  6907. * \retval WLAN_STATUS_BUFFER_TOO_SHORT
  6908. */
  6909. /*----------------------------------------------------------------------------*/
  6910. WLAN_STATUS
  6911. wlanoidQueryAtimWindow(IN P_ADAPTER_T prAdapter,
  6912. OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  6913. {
  6914. DEBUGFUNC("wlanoidQueryAtimWindow");
  6915. ASSERT(prAdapter);
  6916. ASSERT(pu4QueryInfoLen);
  6917. if (u4QueryBufferLen)
  6918. ASSERT(pvQueryBuffer);
  6919. *pu4QueryInfoLen = sizeof(UINT_32);
  6920. if (u4QueryBufferLen < sizeof(UINT_32))
  6921. return WLAN_STATUS_BUFFER_TOO_SHORT;
  6922. if (prAdapter->rWifiVar.rConnSettings.eOPMode == NET_TYPE_INFRA)
  6923. *(PUINT_32) pvQueryBuffer = 0;
  6924. else
  6925. *(PUINT_32) pvQueryBuffer = (UINT_32) prAdapter->rWlanInfo.u2AtimWindow;
  6926. return WLAN_STATUS_SUCCESS;
  6927. } /* end of wlanoidQueryAtimWindow() */
  6928. /*----------------------------------------------------------------------------*/
  6929. /*!
  6930. * \brief This routine is called to set the ATIM window to User Settings.
  6931. *
  6932. * \param[in] prAdapter Pointer to the Adapter structure.
  6933. * \param[in] pvSetBuffer Pointer to the buffer that holds the data to be set.
  6934. * \param[in] u4SetBufferLen The length of the set buffer.
  6935. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  6936. * bytes read from the set buffer. If the call failed
  6937. * due to invalid length of the set buffer, returns
  6938. * the amount of storage needed.
  6939. *
  6940. * \retval WLAN_STATUS_SUCCESS
  6941. * \retval WLAN_STATUS_INVALID_LENGTH
  6942. * \retval WLAN_STATUS_INVALID_DATA
  6943. */
  6944. /*----------------------------------------------------------------------------*/
  6945. WLAN_STATUS
  6946. wlanoidSetAtimWindow(IN P_ADAPTER_T prAdapter,
  6947. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  6948. {
  6949. PUINT_32 pu4AtimWindow;
  6950. DEBUGFUNC("wlanoidSetAtimWindow");
  6951. ASSERT(prAdapter);
  6952. ASSERT(pu4SetInfoLen);
  6953. *pu4SetInfoLen = sizeof(UINT_32);
  6954. if (u4SetBufferLen < sizeof(UINT_32))
  6955. return WLAN_STATUS_INVALID_LENGTH;
  6956. ASSERT(pvSetBuffer);
  6957. pu4AtimWindow = (PUINT_32) pvSetBuffer;
  6958. prAdapter->rWlanInfo.u2AtimWindow = (UINT_16) *pu4AtimWindow;
  6959. return WLAN_STATUS_SUCCESS;
  6960. } /* end of wlanoidSetAtimWindow() */
  6961. /*----------------------------------------------------------------------------*/
  6962. /*!
  6963. * \brief This routine is called to Set the MAC address which is currently used by the NIC.
  6964. *
  6965. * \param[in] prAdapter Pointer to the Adapter structure.
  6966. * \param[in] pvSetBuffer Pointer to the buffer that holds the data to be set.
  6967. * \param[in] u4SetBufferLen The length of the set buffer.
  6968. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  6969. * bytes read from the set buffer. If the call failed
  6970. * due to invalid length of the set buffer, returns
  6971. * the amount of storage needed.
  6972. *
  6973. *
  6974. * \retval WLAN_STATUS_SUCCESS
  6975. * \retval WLAN_STATUS_INVALID_LENGTH
  6976. * \retval WLAN_STATUS_INVALID_DATA
  6977. */
  6978. /*----------------------------------------------------------------------------*/
  6979. WLAN_STATUS
  6980. wlanoidSetCurrentAddr(IN P_ADAPTER_T prAdapter,
  6981. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  6982. {
  6983. ASSERT(0); /* // */
  6984. return WLAN_STATUS_SUCCESS;
  6985. } /* end of wlanoidSetCurrentAddr() */
  6986. #if CFG_TCP_IP_CHKSUM_OFFLOAD
  6987. /*----------------------------------------------------------------------------*/
  6988. /*!
  6989. * \brief Setting the checksum offload function.
  6990. *
  6991. * \param[in] prAdapter Pointer to the Adapter structure.
  6992. * \param[in] pvSetBuffer Pointer to the buffer that holds the data to be set.
  6993. * \param[in] u4SetBufferLen The length of the set buffer.
  6994. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  6995. * bytes read from the set buffer. If the call failed
  6996. * due to invalid length of the set buffer, returns
  6997. * the amount of storage needed.
  6998. *
  6999. * \retval WLAN_STATUS_SUCCESS
  7000. * \retval WLAN_STATUS_INVALID_LENGTH
  7001. * \retval WLAN_STATUS_ADAPTER_NOT_READY
  7002. */
  7003. /*----------------------------------------------------------------------------*/
  7004. WLAN_STATUS
  7005. wlanoidSetCSUMOffload(IN P_ADAPTER_T prAdapter,
  7006. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  7007. {
  7008. UINT_32 u4CSUMFlags;
  7009. CMD_BASIC_CONFIG_T rCmdBasicConfig;
  7010. DEBUGFUNC("wlanoidSetCSUMOffload");
  7011. DBGLOG(OID, LOUD, "\n");
  7012. ASSERT(prAdapter);
  7013. ASSERT(pu4SetInfoLen);
  7014. *pu4SetInfoLen = sizeof(UINT_32);
  7015. if (u4SetBufferLen < sizeof(UINT_32))
  7016. return WLAN_STATUS_INVALID_LENGTH;
  7017. ASSERT(pvSetBuffer);
  7018. u4CSUMFlags = *(PUINT_32) pvSetBuffer;
  7019. kalMemZero(&rCmdBasicConfig, sizeof(CMD_BASIC_CONFIG_T));
  7020. rCmdBasicConfig.ucNative80211 = 0; /* @FIXME: for Vista */
  7021. if (u4CSUMFlags & CSUM_OFFLOAD_EN_TX_TCP)
  7022. rCmdBasicConfig.rCsumOffload.u2TxChecksum |= BIT(2);
  7023. if (u4CSUMFlags & CSUM_OFFLOAD_EN_TX_UDP)
  7024. rCmdBasicConfig.rCsumOffload.u2TxChecksum |= BIT(1);
  7025. if (u4CSUMFlags & CSUM_OFFLOAD_EN_TX_IP)
  7026. rCmdBasicConfig.rCsumOffload.u2TxChecksum |= BIT(0);
  7027. if (u4CSUMFlags & CSUM_OFFLOAD_EN_RX_TCP)
  7028. rCmdBasicConfig.rCsumOffload.u2RxChecksum |= BIT(2);
  7029. if (u4CSUMFlags & CSUM_OFFLOAD_EN_RX_UDP)
  7030. rCmdBasicConfig.rCsumOffload.u2RxChecksum |= BIT(1);
  7031. if (u4CSUMFlags & (CSUM_OFFLOAD_EN_RX_IPv4 | CSUM_OFFLOAD_EN_RX_IPv6))
  7032. rCmdBasicConfig.rCsumOffload.u2RxChecksum |= BIT(0);
  7033. prAdapter->u4CSUMFlags = u4CSUMFlags;
  7034. return wlanSendSetQueryCmd(prAdapter,
  7035. CMD_ID_BASIC_CONFIG,
  7036. TRUE,
  7037. FALSE,
  7038. TRUE,
  7039. nicCmdEventSetCommon,
  7040. nicOidCmdTimeoutCommon,
  7041. sizeof(CMD_BASIC_CONFIG_T),
  7042. (PUINT_8) &rCmdBasicConfig, pvSetBuffer, u4SetBufferLen);
  7043. }
  7044. #endif /* CFG_TCP_IP_CHKSUM_OFFLOAD */
  7045. /*----------------------------------------------------------------------------*/
  7046. /*!
  7047. * \brief Setting the IP address for pattern search function.
  7048. *
  7049. * \param[in] prAdapter Pointer to the Adapter structure.
  7050. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  7051. * \param[in] u4SetBufferLen The length of the set buffer.
  7052. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  7053. * bytes read from the set buffer. If the call failed
  7054. * due to invalid length of the set buffer, returns
  7055. * the amount of storage needed.
  7056. *
  7057. * \return WLAN_STATUS_SUCCESS
  7058. * \return WLAN_STATUS_ADAPTER_NOT_READY
  7059. * \return WLAN_STATUS_INVALID_LENGTH
  7060. */
  7061. /*----------------------------------------------------------------------------*/
  7062. WLAN_STATUS
  7063. wlanoidSetNetworkAddress(IN P_ADAPTER_T prAdapter,
  7064. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  7065. {
  7066. WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
  7067. UINT_32 i, u4IPv4AddrIdx;
  7068. P_CMD_SET_NETWORK_ADDRESS_LIST prCmdNetworkAddressList;
  7069. P_PARAM_NETWORK_ADDRESS_LIST prNetworkAddressList = (P_PARAM_NETWORK_ADDRESS_LIST) pvSetBuffer;
  7070. P_PARAM_NETWORK_ADDRESS prNetworkAddress;
  7071. UINT_32 u4IPv4AddrCount, u4CmdSize;
  7072. #if CFG_ENABLE_GTK_FRAME_FILTER
  7073. UINT_32 u4IpV4AddrListSize;
  7074. P_BSS_INFO_T prBssInfo = &prAdapter->rWifiVar.arBssInfoPool[KAL_NETWORK_TYPE_AIS_INDEX];
  7075. #endif
  7076. DEBUGFUNC("wlanoidSetNetworkAddress");
  7077. DBGLOG(OID, LOUD, "\n");
  7078. ASSERT(prAdapter);
  7079. ASSERT(pu4SetInfoLen);
  7080. *pu4SetInfoLen = 4;
  7081. if (u4SetBufferLen < OFFSET_OF(PARAM_NETWORK_ADDRESS_LIST, arAddress))
  7082. return WLAN_STATUS_INVALID_DATA;
  7083. *pu4SetInfoLen = 0;
  7084. u4IPv4AddrCount = 0;
  7085. /* 4 <1.1> Get IPv4 address count */
  7086. /* We only suppot IPv4 address setting */
  7087. prNetworkAddress = prNetworkAddressList->arAddress;
  7088. for (i = 0; i < prNetworkAddressList->u4AddressCount; i++) {
  7089. if ((prNetworkAddress->u2AddressType == PARAM_PROTOCOL_ID_TCP_IP) &&
  7090. (prNetworkAddress->u2AddressLength == IPV4_ADDR_LEN)) {
  7091. u4IPv4AddrCount++;
  7092. }
  7093. prNetworkAddress = (P_PARAM_NETWORK_ADDRESS) ((ULONG) prNetworkAddress + (ULONG)
  7094. (prNetworkAddress->u2AddressLength +
  7095. OFFSET_OF(PARAM_NETWORK_ADDRESS, aucAddress)));
  7096. }
  7097. /* 4 <2> Calculate command buffer size */
  7098. /* construct payload of command packet */
  7099. if (u4IPv4AddrCount == 0)
  7100. u4CmdSize = sizeof(CMD_SET_NETWORK_ADDRESS_LIST);
  7101. else
  7102. u4CmdSize = OFFSET_OF(CMD_SET_NETWORK_ADDRESS_LIST, arNetAddress) +
  7103. (sizeof(IPV4_NETWORK_ADDRESS) * u4IPv4AddrCount);
  7104. /* 4 <3> Allocate command buffer */
  7105. prCmdNetworkAddressList = (P_CMD_SET_NETWORK_ADDRESS_LIST) kalMemAlloc(u4CmdSize, VIR_MEM_TYPE);
  7106. if (prCmdNetworkAddressList == NULL)
  7107. return WLAN_STATUS_FAILURE;
  7108. #if CFG_ENABLE_GTK_FRAME_FILTER
  7109. u4IpV4AddrListSize = OFFSET_OF(IPV4_NETWORK_ADDRESS_LIST, arNetAddr) +
  7110. (u4IPv4AddrCount * sizeof(IPV4_NETWORK_ADDRESS));
  7111. if (prBssInfo->prIpV4NetAddrList)
  7112. FREE_IPV4_NETWORK_ADDR_LIST(prBssInfo->prIpV4NetAddrList);
  7113. prBssInfo->prIpV4NetAddrList = (P_IPV4_NETWORK_ADDRESS_LIST) kalMemAlloc(u4IpV4AddrListSize, VIR_MEM_TYPE);
  7114. if (prBssInfo->prIpV4NetAddrList == NULL) {
  7115. kalMemFree(prCmdNetworkAddressList, VIR_MEM_TYPE, u4CmdSize);
  7116. return WLAN_STATUS_FAILURE;
  7117. }
  7118. prBssInfo->prIpV4NetAddrList->ucAddrCount = (UINT_8) u4IPv4AddrCount;
  7119. #endif
  7120. /* 4 <4> Fill P_CMD_SET_NETWORK_ADDRESS_LIST */
  7121. prCmdNetworkAddressList->ucBssIndex = prNetworkAddressList->ucBssIdx;
  7122. /* only to set IP address to FW once ARP filter is enabled */
  7123. if (prAdapter->fgEnArpFilter) {
  7124. prCmdNetworkAddressList->ucAddressCount = (UINT_8) u4IPv4AddrCount;
  7125. prNetworkAddress = prNetworkAddressList->arAddress;
  7126. /* DBGLOG(INIT, INFO, ("%s: u4IPv4AddrCount (%lu)\n", __FUNCTION__, u4IPv4AddrCount)); */
  7127. for (i = 0, u4IPv4AddrIdx = 0; i < prNetworkAddressList->u4AddressCount; i++) {
  7128. if (prNetworkAddress->u2AddressType == PARAM_PROTOCOL_ID_TCP_IP &&
  7129. prNetworkAddress->u2AddressLength == IPV4_ADDR_LEN) {
  7130. kalMemCopy(prCmdNetworkAddressList->arNetAddress[u4IPv4AddrIdx].aucIpAddr,
  7131. prNetworkAddress->aucAddress, sizeof(UINT_32));
  7132. #if CFG_ENABLE_GTK_FRAME_FILTER
  7133. kalMemCopy(prBssInfo->prIpV4NetAddrList->arNetAddr[u4IPv4AddrIdx].aucIpAddr,
  7134. prNetworkAddress->aucAddress, sizeof(UINT_32));
  7135. #endif
  7136. DBGLOG(OID, INFO,
  7137. "%s: IPv4 Addr [%u][" IPV4STR "]\n", __func__,
  7138. u4IPv4AddrIdx, IPV4TOSTR(prNetworkAddress->aucAddress));
  7139. u4IPv4AddrIdx++;
  7140. }
  7141. prNetworkAddress = (P_PARAM_NETWORK_ADDRESS) ((ULONG) prNetworkAddress + (ULONG)
  7142. (prNetworkAddress->u2AddressLength +
  7143. OFFSET_OF(PARAM_NETWORK_ADDRESS, aucAddress)));
  7144. }
  7145. } else {
  7146. prCmdNetworkAddressList->ucAddressCount = 0;
  7147. }
  7148. DBGLOG(OID, INFO,
  7149. "%s: Set %lu IPv4 address for BSS[%u]\n", __func__, u4IPv4AddrCount,
  7150. prCmdNetworkAddressList->ucBssIndex);
  7151. /* 4 <5> Send command */
  7152. rStatus = wlanSendSetQueryCmd(prAdapter,
  7153. CMD_ID_SET_IP_ADDRESS,
  7154. TRUE,
  7155. FALSE,
  7156. TRUE,
  7157. nicCmdEventSetIpAddress,
  7158. nicOidCmdTimeoutCommon,
  7159. u4CmdSize, (PUINT_8) prCmdNetworkAddressList, pvSetBuffer, u4SetBufferLen);
  7160. kalMemFree(prCmdNetworkAddressList, VIR_MEM_TYPE, u4CmdSize);
  7161. return rStatus;
  7162. }
  7163. /*----------------------------------------------------------------------------*/
  7164. /*!
  7165. * \brief Set driver to switch into RF test mode
  7166. *
  7167. * \param[in] prAdapter Pointer to the Adapter structure.
  7168. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set,
  7169. * should be NULL
  7170. * \param[in] u4SetBufferLen The length of the set buffer, should be 0
  7171. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  7172. * bytes read from the set buffer. If the call failed
  7173. * due to invalid length of the set buffer, returns
  7174. * the amount of storage needed.
  7175. *
  7176. * \return WLAN_STATUS_SUCCESS
  7177. * \return WLAN_STATUS_ADAPTER_NOT_READY
  7178. * \return WLAN_STATUS_INVALID_DATA
  7179. * \return WLAN_STATUS_INVALID_LENGTH
  7180. */
  7181. /*----------------------------------------------------------------------------*/
  7182. WLAN_STATUS
  7183. wlanoidRftestSetTestMode(IN P_ADAPTER_T prAdapter,
  7184. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  7185. {
  7186. WLAN_STATUS rStatus;
  7187. CMD_TEST_CTRL_T rCmdTestCtrl;
  7188. DEBUGFUNC("wlanoidRftestSetTestMode");
  7189. ASSERT(prAdapter);
  7190. ASSERT(pu4SetInfoLen);
  7191. *pu4SetInfoLen = 0;
  7192. if (u4SetBufferLen == 0) {
  7193. if ((prAdapter->fgTestMode == FALSE)
  7194. || (prAdapter->fgIcapMode == TRUE)) {
  7195. /* switch to RF Test mode */
  7196. rCmdTestCtrl.ucAction = 0; /* Switch mode */
  7197. rCmdTestCtrl.u.u4OpMode = 1; /* RF test mode */
  7198. rStatus = wlanSendSetQueryCmd(prAdapter,
  7199. CMD_ID_TEST_CTRL,
  7200. TRUE,
  7201. FALSE,
  7202. TRUE,
  7203. nicCmdEventEnterRfTest,
  7204. nicOidCmdEnterRFTestTimeout,
  7205. sizeof(CMD_TEST_CTRL_T),
  7206. (PUINT_8) &rCmdTestCtrl, pvSetBuffer, u4SetBufferLen);
  7207. } else {
  7208. /* already in test mode .. */
  7209. rStatus = WLAN_STATUS_SUCCESS;
  7210. }
  7211. } else {
  7212. rStatus = WLAN_STATUS_INVALID_DATA;
  7213. }
  7214. return rStatus;
  7215. }
  7216. /*----------------------------------------------------------------------------*/
  7217. /*!
  7218. * \brief Set driver to switch into RF test ICAP mode
  7219. *
  7220. * \param[in] prAdapter Pointer to the Adapter structure.
  7221. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set,
  7222. * should be NULL
  7223. * \param[in] u4SetBufferLen The length of the set buffer, should be 0
  7224. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  7225. * bytes read from the set buffer. If the call failed
  7226. * due to invalid length of the set buffer, returns
  7227. * the amount of storage needed.
  7228. *
  7229. * \return WLAN_STATUS_SUCCESS
  7230. * \return WLAN_STATUS_ADAPTER_NOT_READY
  7231. * \return WLAN_STATUS_INVALID_DATA
  7232. * \return WLAN_STATUS_INVALID_LENGTH
  7233. */
  7234. /*----------------------------------------------------------------------------*/
  7235. WLAN_STATUS
  7236. wlanoidRftestSetTestIcapMode(IN P_ADAPTER_T prAdapter,
  7237. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  7238. {
  7239. WLAN_STATUS rStatus;
  7240. CMD_TEST_CTRL_T rCmdTestCtrl;
  7241. DEBUGFUNC("wlanoidRftestSetTestMode");
  7242. ASSERT(prAdapter);
  7243. ASSERT(pu4SetInfoLen);
  7244. *pu4SetInfoLen = 0;
  7245. if (u4SetBufferLen == 0) {
  7246. if (prAdapter->fgIcapMode == FALSE) {
  7247. /* switch to RF Test mode */
  7248. rCmdTestCtrl.ucAction = 0; /* Switch mode */
  7249. rCmdTestCtrl.u.u4OpMode = 2; /* RF test mode */
  7250. rStatus = wlanSendSetQueryCmd(prAdapter,
  7251. CMD_ID_TEST_CTRL,
  7252. TRUE,
  7253. FALSE,
  7254. TRUE,
  7255. nicCmdEventEnterRfTest,
  7256. nicOidCmdEnterRFTestTimeout,
  7257. sizeof(CMD_TEST_CTRL_T),
  7258. (PUINT_8) &rCmdTestCtrl, pvSetBuffer, u4SetBufferLen);
  7259. } else {
  7260. /* already in ICAP mode .. */
  7261. rStatus = WLAN_STATUS_SUCCESS;
  7262. }
  7263. } else {
  7264. rStatus = WLAN_STATUS_INVALID_DATA;
  7265. }
  7266. return rStatus;
  7267. }
  7268. /*----------------------------------------------------------------------------*/
  7269. /*!
  7270. * \brief Set driver to switch into normal operation mode from RF test mode
  7271. *
  7272. * \param[in] prAdapter Pointer to the Adapter structure.
  7273. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set
  7274. * should be NULL
  7275. * \param[in] u4SetBufferLen The length of the set buffer, should be 0
  7276. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  7277. * bytes read from the set buffer. If the call failed
  7278. * due to invalid length of the set buffer, returns
  7279. * the amount of storage needed.
  7280. *
  7281. * \return WLAN_STATUS_SUCCESS
  7282. * \return WLAN_STATUS_ADAPTER_NOT_READY
  7283. * \return WLAN_STATUS_INVALID_DATA
  7284. * \return WLAN_STATUS_INVALID_LENGTH
  7285. */
  7286. /*----------------------------------------------------------------------------*/
  7287. WLAN_STATUS
  7288. wlanoidRftestSetAbortTestMode(IN P_ADAPTER_T prAdapter,
  7289. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  7290. {
  7291. WLAN_STATUS rStatus;
  7292. CMD_TEST_CTRL_T rCmdTestCtrl;
  7293. DEBUGFUNC("wlanoidRftestSetTestMode");
  7294. ASSERT(prAdapter);
  7295. ASSERT(pu4SetInfoLen);
  7296. *pu4SetInfoLen = 0;
  7297. if (u4SetBufferLen == 0) {
  7298. if (prAdapter->fgTestMode == TRUE) {
  7299. /* switch to normal mode */
  7300. rCmdTestCtrl.ucAction = 0; /* Switch mode */
  7301. rCmdTestCtrl.u.u4OpMode = 0; /* normal mode */
  7302. rStatus = wlanSendSetQueryCmd(prAdapter,
  7303. CMD_ID_TEST_CTRL,
  7304. TRUE,
  7305. FALSE,
  7306. TRUE,
  7307. nicCmdEventLeaveRfTest,
  7308. nicOidCmdTimeoutCommon,
  7309. sizeof(CMD_TEST_CTRL_T),
  7310. (PUINT_8) &rCmdTestCtrl, pvSetBuffer, u4SetBufferLen);
  7311. } else {
  7312. /* already in normal mode .. */
  7313. rStatus = WLAN_STATUS_SUCCESS;
  7314. }
  7315. } else {
  7316. rStatus = WLAN_STATUS_INVALID_DATA;
  7317. }
  7318. return rStatus;
  7319. }
  7320. /*----------------------------------------------------------------------------*/
  7321. /*!
  7322. * \brief query for RF test parameter
  7323. *
  7324. * \param[in] prAdapter Pointer to the Adapter structure.
  7325. * \param[in] pvQueryBuffer Pointer to the buffer that holds the result of
  7326. * the query.
  7327. * \param[in] u4QueryBufferLen The length of the query buffer.
  7328. * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
  7329. * bytes written into the query buffer. If the call
  7330. * failed due to invalid length of the query buffer,
  7331. * returns the amount of storage needed.
  7332. *
  7333. * \retval WLAN_STATUS_SUCCESS
  7334. * \retval WLAN_STATUS_BUFFER_TOO_SHORT
  7335. * \retval WLAN_STATUS_NOT_SUPPORTED
  7336. * \retval WLAN_STATUS_NOT_ACCEPTED
  7337. */
  7338. /*----------------------------------------------------------------------------*/
  7339. WLAN_STATUS
  7340. wlanoidRftestQueryAutoTest(IN P_ADAPTER_T prAdapter,
  7341. OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  7342. {
  7343. P_PARAM_MTK_WIFI_TEST_STRUCT_T prRfATInfo;
  7344. WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
  7345. DEBUGFUNC("wlanoidRftestQueryAutoTest");
  7346. ASSERT(prAdapter);
  7347. if (u4QueryBufferLen)
  7348. ASSERT(pvQueryBuffer);
  7349. ASSERT(pu4QueryInfoLen);
  7350. /*pu4QueryInfoLen is depended on upper-layer*/
  7351. *pu4QueryInfoLen = u4QueryBufferLen;
  7352. if (u4QueryBufferLen != sizeof(PARAM_MTK_WIFI_TEST_STRUCT_T))
  7353. DBGLOG(OID, WARN, "Invalid data. QueryBufferLen: %ld.\n", u4QueryBufferLen);
  7354. prRfATInfo = (P_PARAM_MTK_WIFI_TEST_STRUCT_T) pvQueryBuffer;
  7355. rStatus = rftestQueryATInfo(prAdapter,
  7356. prRfATInfo->u4FuncIndex, prRfATInfo->u4FuncData, pvQueryBuffer, u4QueryBufferLen);
  7357. return rStatus;
  7358. }
  7359. /*----------------------------------------------------------------------------*/
  7360. /*!
  7361. * \brief Set RF test parameter
  7362. *
  7363. * \param[in] prAdapter Pointer to the Adapter structure.
  7364. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  7365. * \param[in] u4SetBufferLen The length of the set buffer.
  7366. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  7367. * bytes read from the set buffer. If the call failed
  7368. * due to invalid length of the set buffer, returns
  7369. * the amount of storage needed.
  7370. *
  7371. * \return WLAN_STATUS_SUCCESS
  7372. * \return WLAN_STATUS_ADAPTER_NOT_READY
  7373. * \return WLAN_STATUS_INVALID_LENGTH
  7374. */
  7375. /*----------------------------------------------------------------------------*/
  7376. WLAN_STATUS
  7377. wlanoidRftestSetAutoTest(IN P_ADAPTER_T prAdapter,
  7378. OUT PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  7379. {
  7380. P_PARAM_MTK_WIFI_TEST_STRUCT_T prRfATInfo;
  7381. WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
  7382. DEBUGFUNC("wlanoidRftestSetAutoTest");
  7383. ASSERT(prAdapter);
  7384. ASSERT(pvSetBuffer);
  7385. ASSERT(pu4SetInfoLen);
  7386. *pu4SetInfoLen = sizeof(PARAM_MTK_WIFI_TEST_STRUCT_T);
  7387. if (u4SetBufferLen != sizeof(PARAM_MTK_WIFI_TEST_STRUCT_T))
  7388. DBGLOG(OID, WARN, "Invalid data. SetBufferLen: %u.\n", u4SetBufferLen);
  7389. prRfATInfo = (P_PARAM_MTK_WIFI_TEST_STRUCT_T) pvSetBuffer;
  7390. rStatus = rftestSetATInfo(prAdapter, prRfATInfo->u4FuncIndex, prRfATInfo->u4FuncData);
  7391. return rStatus;
  7392. }
  7393. /* RF test OID set handler */
  7394. WLAN_STATUS rftestSetATInfo(IN P_ADAPTER_T prAdapter, UINT_32 u4FuncIndex, UINT_32 u4FuncData)
  7395. {
  7396. P_GLUE_INFO_T prGlueInfo;
  7397. P_CMD_INFO_T prCmdInfo;
  7398. P_WIFI_CMD_T prWifiCmd;
  7399. P_CMD_TEST_CTRL_T pCmdTestCtrl;
  7400. UINT_8 ucCmdSeqNum;
  7401. ASSERT(prAdapter);
  7402. prGlueInfo = prAdapter->prGlueInfo;
  7403. prCmdInfo = cmdBufAllocateCmdInfo(prAdapter, (CMD_HDR_SIZE + sizeof(CMD_TEST_CTRL_T)));
  7404. if (!prCmdInfo) {
  7405. DBGLOG(OID, ERROR, "Allocate CMD_INFO_T ==> FAILED.\n");
  7406. return WLAN_STATUS_FAILURE;
  7407. }
  7408. /* increase command sequence number */
  7409. ucCmdSeqNum = nicIncreaseCmdSeqNum(prAdapter);
  7410. /* Setup common CMD Info Packet */
  7411. prCmdInfo->eCmdType = COMMAND_TYPE_GENERAL_IOCTL;
  7412. prCmdInfo->u2InfoBufLen = CMD_HDR_SIZE + sizeof(CMD_TEST_CTRL_T);
  7413. prCmdInfo->pfCmdDoneHandler = nicCmdEventSetCommon;
  7414. prCmdInfo->pfCmdTimeoutHandler = nicOidCmdTimeoutCommon;
  7415. prCmdInfo->fgIsOid = TRUE;
  7416. prCmdInfo->ucCID = CMD_ID_TEST_CTRL;
  7417. prCmdInfo->fgSetQuery = TRUE;
  7418. prCmdInfo->fgNeedResp = FALSE;
  7419. prCmdInfo->fgDriverDomainMCR = FALSE;
  7420. prCmdInfo->ucCmdSeqNum = ucCmdSeqNum;
  7421. prCmdInfo->u4SetInfoLen = sizeof(CMD_TEST_CTRL_T);
  7422. prCmdInfo->pvInformationBuffer = NULL;
  7423. prCmdInfo->u4InformationBufferLength = 0;
  7424. /* Setup WIFI_CMD_T (payload = CMD_TEST_CTRL_T) */
  7425. prWifiCmd = (P_WIFI_CMD_T) (prCmdInfo->pucInfoBuffer);
  7426. prWifiCmd->u2TxByteCount = prCmdInfo->u2InfoBufLen;
  7427. prWifiCmd->u2PQ_ID = CMD_PQ_ID;
  7428. prWifiCmd->ucPktTypeID = CMD_PACKET_TYPE_ID;
  7429. prWifiCmd->ucCID = prCmdInfo->ucCID;
  7430. prWifiCmd->ucSetQuery = prCmdInfo->fgSetQuery;
  7431. prWifiCmd->ucSeqNum = prCmdInfo->ucCmdSeqNum;
  7432. pCmdTestCtrl = (P_CMD_TEST_CTRL_T) (prWifiCmd->aucBuffer);
  7433. pCmdTestCtrl->ucAction = 1; /* Set ATInfo */
  7434. pCmdTestCtrl->u.rRfATInfo.u4FuncIndex = u4FuncIndex;
  7435. pCmdTestCtrl->u.rRfATInfo.u4FuncData = u4FuncData;
  7436. if ((u4FuncIndex == RF_AT_FUNCID_COMMAND) && (u4FuncData == RF_AT_COMMAND_ICAP)) {
  7437. g_bIcapEnable = TRUE;
  7438. g_bCaptureDone = FALSE;
  7439. }
  7440. /* ICAP dump name Reset */
  7441. if ((u4FuncIndex == RF_AT_FUNCID_COMMAND) && (u4FuncData == RF_AT_COMMAND_RESET_DUMP_NAME))
  7442. g_u2DumpIndex = 0;
  7443. /* insert into prCmdQueue */
  7444. kalEnqueueCommand(prGlueInfo, (P_QUE_ENTRY_T) prCmdInfo);
  7445. /* wakeup txServiceThread later */
  7446. GLUE_SET_EVENT(prAdapter->prGlueInfo);
  7447. return WLAN_STATUS_PENDING;
  7448. }
  7449. WLAN_STATUS
  7450. rftestQueryATInfo(IN P_ADAPTER_T prAdapter,
  7451. UINT_32 u4FuncIndex, UINT_32 u4FuncData, OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen)
  7452. {
  7453. P_GLUE_INFO_T prGlueInfo;
  7454. P_CMD_INFO_T prCmdInfo;
  7455. P_WIFI_CMD_T prWifiCmd;
  7456. P_CMD_TEST_CTRL_T pCmdTestCtrl;
  7457. UINT_8 ucCmdSeqNum;
  7458. P_EVENT_TEST_STATUS prTestStatus;
  7459. ASSERT(prAdapter);
  7460. prGlueInfo = prAdapter->prGlueInfo;
  7461. if (u4FuncIndex == RF_AT_FUNCID_FW_INFO) {
  7462. /* driver implementation */
  7463. prTestStatus = (P_EVENT_TEST_STATUS) pvQueryBuffer;
  7464. prTestStatus->rATInfo.u4FuncData =
  7465. (prAdapter->rVerInfo.u2FwProductID << 16) | (prAdapter->rVerInfo.u2FwOwnVersion);
  7466. prTestStatus->rATInfo.u4FuncData2 = prAdapter->rVerInfo.u2FwOwnVersionExtend;
  7467. if (u4QueryBufferLen > 8) {
  7468. /*support FW version extended*/
  7469. prTestStatus->rATInfo.u4FuncData2 = prAdapter->rVerInfo.u2FwOwnVersionExtend;
  7470. DBGLOG(OID, INFO, "<wifi> version: 0x%x ,extended : 0x%x\n"
  7471. , prTestStatus->rATInfo.u4FuncData
  7472. , prTestStatus->rATInfo.u4FuncData2);
  7473. } else
  7474. DBGLOG(OID, INFO, "<wifi> version: 0x%x\n"
  7475. , prTestStatus->rATInfo.u4FuncData);
  7476. } else if (u4FuncIndex == RF_AT_FUNCID_DRV_INFO) {
  7477. /* driver implementation */
  7478. prTestStatus = (P_EVENT_TEST_STATUS) pvQueryBuffer;
  7479. prTestStatus->rATInfo.u4FuncData = CFG_DRV_OWN_VERSION;
  7480. } else if (u4FuncIndex == RF_AT_FUNCID_QUERY_ICAP_DUMP_FILE) {
  7481. /* driver implementation */
  7482. prTestStatus = (P_EVENT_TEST_STATUS) pvQueryBuffer;
  7483. prTestStatus->rATInfo.u4FuncData = g_u2DumpIndex;
  7484. u4QueryBufferLen = sizeof(EVENT_TEST_STATUS);
  7485. } else {
  7486. prCmdInfo = cmdBufAllocateCmdInfo(prAdapter, (CMD_HDR_SIZE + sizeof(CMD_TEST_CTRL_T)));
  7487. if (!prCmdInfo) {
  7488. DBGLOG(INIT, ERROR, "Allocate CMD_INFO_T ==> FAILED.\n");
  7489. return WLAN_STATUS_FAILURE;
  7490. }
  7491. /* increase command sequence number */
  7492. ucCmdSeqNum = nicIncreaseCmdSeqNum(prAdapter);
  7493. /* Setup common CMD Info Packet */
  7494. prCmdInfo->eCmdType = COMMAND_TYPE_GENERAL_IOCTL;
  7495. prCmdInfo->u2InfoBufLen = CMD_HDR_SIZE + sizeof(CMD_TEST_CTRL_T);
  7496. prCmdInfo->pfCmdDoneHandler = nicCmdEventQueryRfTestATInfo;
  7497. prCmdInfo->pfCmdTimeoutHandler = nicOidCmdTimeoutCommon;
  7498. prCmdInfo->fgIsOid = TRUE;
  7499. prCmdInfo->ucCID = CMD_ID_TEST_CTRL;
  7500. prCmdInfo->fgSetQuery = FALSE;
  7501. prCmdInfo->fgNeedResp = TRUE;
  7502. prCmdInfo->fgDriverDomainMCR = FALSE;
  7503. prCmdInfo->ucCmdSeqNum = ucCmdSeqNum;
  7504. prCmdInfo->u4SetInfoLen = sizeof(CMD_TEST_CTRL_T);
  7505. prCmdInfo->pvInformationBuffer = pvQueryBuffer;
  7506. prCmdInfo->u4InformationBufferLength = u4QueryBufferLen;
  7507. /* Setup WIFI_CMD_T (payload = CMD_TEST_CTRL_T) */
  7508. prWifiCmd = (P_WIFI_CMD_T) (prCmdInfo->pucInfoBuffer);
  7509. prWifiCmd->u2TxByteCount = prCmdInfo->u2InfoBufLen;
  7510. prWifiCmd->u2PQ_ID = CMD_PQ_ID;
  7511. prWifiCmd->ucPktTypeID = CMD_PACKET_TYPE_ID;
  7512. prWifiCmd->ucCID = prCmdInfo->ucCID;
  7513. prWifiCmd->ucSetQuery = prCmdInfo->fgSetQuery;
  7514. prWifiCmd->ucSeqNum = prCmdInfo->ucCmdSeqNum;
  7515. pCmdTestCtrl = (P_CMD_TEST_CTRL_T) (prWifiCmd->aucBuffer);
  7516. pCmdTestCtrl->ucAction = 2; /* Get ATInfo */
  7517. pCmdTestCtrl->u.rRfATInfo.u4FuncIndex = u4FuncIndex;
  7518. pCmdTestCtrl->u.rRfATInfo.u4FuncData = u4FuncData;
  7519. /* insert into prCmdQueue */
  7520. kalEnqueueCommand(prGlueInfo, (P_QUE_ENTRY_T) prCmdInfo);
  7521. /* wakeup txServiceThread later */
  7522. GLUE_SET_EVENT(prAdapter->prGlueInfo);
  7523. return WLAN_STATUS_PENDING;
  7524. }
  7525. return WLAN_STATUS_SUCCESS;
  7526. }
  7527. WLAN_STATUS rftestSetFrequency(IN P_ADAPTER_T prAdapter, IN UINT_32 u4FreqInKHz, IN PUINT_32 pu4SetInfoLen)
  7528. {
  7529. CMD_TEST_CTRL_T rCmdTestCtrl;
  7530. ASSERT(prAdapter);
  7531. rCmdTestCtrl.ucAction = 5; /* Set Channel Frequency */
  7532. rCmdTestCtrl.u.u4ChannelFreq = u4FreqInKHz;
  7533. return wlanSendSetQueryCmd(prAdapter,
  7534. CMD_ID_TEST_CTRL,
  7535. TRUE,
  7536. FALSE,
  7537. TRUE,
  7538. nicCmdEventSetCommon,
  7539. nicOidCmdTimeoutCommon, sizeof(CMD_TEST_CTRL_T), (PUINT_8) &rCmdTestCtrl, NULL, 0);
  7540. }
  7541. /*----------------------------------------------------------------------------*/
  7542. /*!
  7543. * \brief command packet generation utility
  7544. *
  7545. * \param[in] prAdapter Pointer to the Adapter structure.
  7546. * \param[in] ucCID Command ID
  7547. * \param[in] fgSetQuery Set or Query
  7548. * \param[in] fgNeedResp Need for response
  7549. * \param[in] pfCmdDoneHandler Function pointer when command is done
  7550. * \param[in] u4SetQueryInfoLen The length of the set/query buffer
  7551. * \param[in] pucInfoBuffer Pointer to set/query buffer
  7552. *
  7553. *
  7554. * \retval WLAN_STATUS_PENDING
  7555. * \retval WLAN_STATUS_FAILURE
  7556. */
  7557. /*----------------------------------------------------------------------------*/
  7558. WLAN_STATUS
  7559. wlanSendSetQueryCmd(IN P_ADAPTER_T prAdapter,
  7560. UINT_8 ucCID,
  7561. BOOLEAN fgSetQuery,
  7562. BOOLEAN fgNeedResp,
  7563. BOOLEAN fgIsOid,
  7564. PFN_CMD_DONE_HANDLER pfCmdDoneHandler,
  7565. PFN_CMD_TIMEOUT_HANDLER pfCmdTimeoutHandler,
  7566. UINT_32 u4SetQueryInfoLen,
  7567. PUINT_8 pucInfoBuffer, OUT PVOID pvSetQueryBuffer, IN UINT_32 u4SetQueryBufferLen)
  7568. {
  7569. P_GLUE_INFO_T prGlueInfo;
  7570. P_CMD_INFO_T prCmdInfo;
  7571. P_WIFI_CMD_T prWifiCmd;
  7572. UINT_8 ucCmdSeqNum;
  7573. prGlueInfo = prAdapter->prGlueInfo;
  7574. prCmdInfo = cmdBufAllocateCmdInfo(prAdapter, (CMD_HDR_SIZE + u4SetQueryInfoLen));
  7575. DEBUGFUNC("wlanSendSetQueryCmd");
  7576. if (!prCmdInfo || !prAdapter || !prAdapter->prAisBssInfo) {
  7577. DBGLOG(OID, ERROR, "prCmdInfo, prAdapter or prAisBssInfo is not allocated.\n");
  7578. return WLAN_STATUS_FAILURE;
  7579. }
  7580. /* increase command sequence number */
  7581. ucCmdSeqNum = nicIncreaseCmdSeqNum(prAdapter);
  7582. DBGLOG(OID, TRACE, "ucCmdSeqNum =%d\n", ucCmdSeqNum);
  7583. /* Setup common CMD Info Packet */
  7584. prCmdInfo->eCmdType = COMMAND_TYPE_NETWORK_IOCTL;
  7585. prCmdInfo->ucBssIndex = prAdapter->prAisBssInfo->ucBssIndex;
  7586. prCmdInfo->u2InfoBufLen = (UINT_16) (CMD_HDR_SIZE + u4SetQueryInfoLen);
  7587. prCmdInfo->pfCmdDoneHandler = pfCmdDoneHandler;
  7588. prCmdInfo->pfCmdTimeoutHandler = pfCmdTimeoutHandler;
  7589. prCmdInfo->fgIsOid = fgIsOid;
  7590. prCmdInfo->ucCID = ucCID;
  7591. prCmdInfo->fgSetQuery = fgSetQuery;
  7592. prCmdInfo->fgNeedResp = fgNeedResp;
  7593. prCmdInfo->fgDriverDomainMCR = FALSE;
  7594. prCmdInfo->ucCmdSeqNum = ucCmdSeqNum;
  7595. prCmdInfo->u4SetInfoLen = u4SetQueryInfoLen;
  7596. prCmdInfo->pvInformationBuffer = pvSetQueryBuffer;
  7597. prCmdInfo->u4InformationBufferLength = u4SetQueryBufferLen;
  7598. /* Setup WIFI_CMD_T (no payload) */
  7599. prWifiCmd = (P_WIFI_CMD_T) (prCmdInfo->pucInfoBuffer);
  7600. prWifiCmd->u2TxByteCount = prCmdInfo->u2InfoBufLen;
  7601. prWifiCmd->u2PQ_ID = CMD_PQ_ID;
  7602. prWifiCmd->ucPktTypeID = CMD_PACKET_TYPE_ID;
  7603. prWifiCmd->ucCID = prCmdInfo->ucCID;
  7604. prWifiCmd->ucSetQuery = prCmdInfo->fgSetQuery;
  7605. prWifiCmd->ucSeqNum = prCmdInfo->ucCmdSeqNum;
  7606. if (u4SetQueryInfoLen > 0 && pucInfoBuffer != NULL)
  7607. kalMemCopy(prWifiCmd->aucBuffer, pucInfoBuffer, u4SetQueryInfoLen);
  7608. /* insert into prCmdQueue */
  7609. kalEnqueueCommand(prGlueInfo, (P_QUE_ENTRY_T) prCmdInfo);
  7610. /* wakeup txServiceThread later */
  7611. GLUE_SET_EVENT(prGlueInfo);
  7612. return WLAN_STATUS_PENDING;
  7613. }
  7614. #if CFG_SUPPORT_WAPI
  7615. /*----------------------------------------------------------------------------*/
  7616. /*!
  7617. * \brief This routine is called by WAPI ui to set wapi mode, which is needed to info the the driver
  7618. * to operation at WAPI mode while driver initialize.
  7619. *
  7620. * \param[in] prAdapter Pointer to the Adapter structure
  7621. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set
  7622. * \param[in] u4SetBufferLen The length of the set buffer
  7623. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  7624. * bytes read from the set buffer. If the call failed due to invalid length of
  7625. * the set buffer, returns the amount of storage needed.
  7626. *
  7627. * \retval WLAN_STATUS_SUCCESS
  7628. * \retval WLAN_STATUS_INVALID_DATA If new setting value is wrong.
  7629. * \retval WLAN_STATUS_INVALID_LENGTH
  7630. *
  7631. */
  7632. /*----------------------------------------------------------------------------*/
  7633. WLAN_STATUS
  7634. wlanoidSetWapiMode(IN P_ADAPTER_T prAdapter,
  7635. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  7636. {
  7637. DEBUGFUNC("wlanoidSetWapiMode");
  7638. DBGLOG(OID, LOUD, "\r\n");
  7639. ASSERT(prAdapter);
  7640. ASSERT(pu4SetInfoLen);
  7641. ASSERT(pvSetBuffer);
  7642. /* Todo:: For support WAPI and Wi-Fi at same driver, use the set wapi assoc ie at the check point */
  7643. /* The Adapter Connection setting fgUseWapi will cleat whil oid set mode (infra), */
  7644. /* And set fgUseWapi True while set wapi assoc ie */
  7645. /* policay selection, add key all depend on this flag, */
  7646. /* The fgUseWapi may remove later */
  7647. if (*(PUINT_32) pvSetBuffer)
  7648. prAdapter->fgUseWapi = TRUE;
  7649. else
  7650. prAdapter->fgUseWapi = FALSE;
  7651. #if 0
  7652. prCmdInfo = cmdBufAllocateCmdInfo(prAdapter, (CMD_HDR_SIZE + 4));
  7653. if (!prCmdInfo) {
  7654. DBGLOG(OID, ERROR, "Allocate CMD_INFO_T ==> FAILED.\n");
  7655. return WLAN_STATUS_FAILURE;
  7656. }
  7657. /* increase command sequence number */
  7658. ucCmdSeqNum = nicIncreaseCmdSeqNum(prAdapter);
  7659. /* compose CMD_BUILD_CONNECTION cmd pkt */
  7660. prCmdInfo->eCmdType = COMMAND_TYPE_NETWORK_IOCTL;
  7661. prCmdInfo->ucBssIndex = prAdapter->prAisBssInfo->ucBssIndex;
  7662. prCmdInfo->u2InfoBufLen = CMD_HDR_SIZE + 4;
  7663. prCmdInfo->pfCmdDoneHandler = nicCmdEventSetCommon;
  7664. prCmdInfo->pfCmdTimeoutHandler = NULL;
  7665. prCmdInfo->fgIsOid = TRUE;
  7666. prCmdInfo->ucCID = CMD_ID_WAPI_MODE;
  7667. prCmdInfo->fgSetQuery = TRUE;
  7668. prCmdInfo->fgNeedResp = FALSE;
  7669. prCmdInfo->fgDriverDomainMCR = FALSE;
  7670. prCmdInfo->ucCmdSeqNum = ucCmdSeqNum;
  7671. prCmdInfo->u4SetInfoLen = u4SetBufferLen;
  7672. prCmdInfo->pvInformationBuffer = pvSetBuffer;
  7673. prCmdInfo->u4InformationBufferLength = u4SetBufferLen;
  7674. /* Setup WIFI_CMD_T */
  7675. prWifiCmd = (P_WIFI_CMD_T) (prCmdInfo->pucInfoBuffer);
  7676. prWifiCmd->u2TxByteCount = prCmdInfo->u2InfoBufLen;
  7677. prWifiCmd->u2PQ_ID = CMD_PQ_ID;
  7678. prWifiCmd->ucPktTypeID = CMD_PACKET_TYPE_ID;
  7679. prWifiCmd->ucCID = prCmdInfo->ucCID;
  7680. prWifiCmd->ucSetQuery = prCmdInfo->fgSetQuery;
  7681. prWifiCmd->ucSeqNum = prCmdInfo->ucCmdSeqNum;
  7682. cp = (PUINT_8) (prWifiCmd->aucBuffer);
  7683. kalMemCopy(cp, (PUINT_8) pvSetBuffer, 4);
  7684. /* insert into prCmdQueue */
  7685. kalEnqueueCommand(prGlueInfo, (P_QUE_ENTRY_T) prCmdInfo);
  7686. /* wakeup txServiceThread later */
  7687. GLUE_SET_EVENT(prGlueInfo);
  7688. return WLAN_STATUS_PENDING;
  7689. #else
  7690. return WLAN_STATUS_SUCCESS;
  7691. #endif
  7692. }
  7693. /*----------------------------------------------------------------------------*/
  7694. /*!
  7695. * \brief This routine is called by WAPI to set the assoc info, which is needed to add to
  7696. * Association request frame while join WAPI AP.
  7697. *
  7698. * \param[in] prAdapter Pointer to the Adapter structure
  7699. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set
  7700. * \param[in] u4SetBufferLen The length of the set buffer
  7701. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  7702. * bytes read from the set buffer. If the call failed due to invalid length of
  7703. * the set buffer, returns the amount of storage needed.
  7704. *
  7705. * \retval WLAN_STATUS_SUCCESS
  7706. * \retval WLAN_STATUS_INVALID_DATA If new setting value is wrong.
  7707. * \retval WLAN_STATUS_INVALID_LENGTH
  7708. *
  7709. */
  7710. /*----------------------------------------------------------------------------*/
  7711. WLAN_STATUS
  7712. wlanoidSetWapiAssocInfo(IN P_ADAPTER_T prAdapter,
  7713. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  7714. {
  7715. P_WAPI_INFO_ELEM_T prWapiInfo;
  7716. PUINT_8 cp;
  7717. UINT_16 u2AuthSuiteCount = 0;
  7718. UINT_16 u2PairSuiteCount = 0;
  7719. UINT_32 u4AuthKeyMgtSuite = 0;
  7720. UINT_32 u4PairSuite = 0;
  7721. UINT_32 u4GroupSuite = 0;
  7722. UINT_16 u2IeLength = 0;
  7723. ASSERT(prAdapter);
  7724. ASSERT(pvSetBuffer);
  7725. ASSERT(pu4SetInfoLen);
  7726. DEBUGFUNC("wlanoidSetWapiAssocInfo");
  7727. DBGLOG(OID, LOUD, "\r\n");
  7728. prAdapter->rWifiVar.rConnSettings.fgWapiMode = FALSE;
  7729. if (u4SetBufferLen < 20 /* From EID to Group cipher */)
  7730. return WLAN_STATUS_INVALID_LENGTH;
  7731. if (!wextSrchDesiredWAPIIE((PUINT_8) pvSetBuffer, u4SetBufferLen, (PUINT_8 *) &prWapiInfo))
  7732. return WLAN_STATUS_INVALID_LENGTH;
  7733. if (!prWapiInfo || prWapiInfo->ucLength < 18)
  7734. return WLAN_STATUS_INVALID_LENGTH;
  7735. u2IeLength = prWapiInfo->ucLength + 2;
  7736. /* Skip Version check */
  7737. cp = (PUINT_8) &prWapiInfo->u2AuthKeyMgtSuiteCount;
  7738. WLAN_GET_FIELD_16(cp, &u2AuthSuiteCount);
  7739. if (u2AuthSuiteCount > 1)
  7740. return WLAN_STATUS_INVALID_LENGTH;
  7741. cp += 2;
  7742. WLAN_GET_FIELD_32(cp, &u4AuthKeyMgtSuite);
  7743. DBGLOG(SEC, TRACE, "WAPI: Assoc Info auth mgt suite [%d]: %02x-%02x-%02x-%02x\n",
  7744. u2AuthSuiteCount,
  7745. (UCHAR) (u4AuthKeyMgtSuite & 0x000000FF),
  7746. (UCHAR) ((u4AuthKeyMgtSuite >> 8) & 0x000000FF),
  7747. (UCHAR) ((u4AuthKeyMgtSuite >> 16) & 0x000000FF), (UCHAR) ((u4AuthKeyMgtSuite >> 24) & 0x000000FF));
  7748. if (u4AuthKeyMgtSuite != WAPI_AKM_SUITE_802_1X && u4AuthKeyMgtSuite != WAPI_AKM_SUITE_PSK)
  7749. ASSERT(FALSE);
  7750. cp += 4;
  7751. WLAN_GET_FIELD_16(cp, &u2PairSuiteCount);
  7752. if (u2PairSuiteCount > 1)
  7753. return WLAN_STATUS_INVALID_LENGTH;
  7754. cp += 2;
  7755. WLAN_GET_FIELD_32(cp, &u4PairSuite);
  7756. DBGLOG(SEC, TRACE, "WAPI: Assoc Info pairwise cipher suite [%d]: %02x-%02x-%02x-%02x\n",
  7757. u2PairSuiteCount,
  7758. (UCHAR) (u4PairSuite & 0x000000FF),
  7759. (UCHAR) ((u4PairSuite >> 8) & 0x000000FF),
  7760. (UCHAR) ((u4PairSuite >> 16) & 0x000000FF), (UCHAR) ((u4PairSuite >> 24) & 0x000000FF));
  7761. if (u4PairSuite != WAPI_CIPHER_SUITE_WPI)
  7762. ASSERT(FALSE);
  7763. cp += 4;
  7764. WLAN_GET_FIELD_32(cp, &u4GroupSuite);
  7765. DBGLOG(SEC, TRACE, "WAPI: Assoc Info group cipher suite : %02x-%02x-%02x-%02x\n",
  7766. (UCHAR) (u4GroupSuite & 0x000000FF),
  7767. (UCHAR) ((u4GroupSuite >> 8) & 0x000000FF),
  7768. (UCHAR) ((u4GroupSuite >> 16) & 0x000000FF), (UCHAR) ((u4GroupSuite >> 24) & 0x000000FF));
  7769. if (u4GroupSuite != WAPI_CIPHER_SUITE_WPI)
  7770. ASSERT(FALSE);
  7771. prAdapter->rWifiVar.rConnSettings.u4WapiSelectedAKMSuite = u4AuthKeyMgtSuite;
  7772. prAdapter->rWifiVar.rConnSettings.u4WapiSelectedPairwiseCipher = u4PairSuite;
  7773. prAdapter->rWifiVar.rConnSettings.u4WapiSelectedGroupCipher = u4GroupSuite;
  7774. kalMemCopy(prAdapter->prGlueInfo->aucWapiAssocInfoIEs, prWapiInfo, u2IeLength);
  7775. prAdapter->prGlueInfo->u2WapiAssocInfoIESz = u2IeLength;
  7776. DBGLOG(SEC, TRACE, "Assoc Info IE sz %ld\n", u2IeLength);
  7777. prAdapter->rWifiVar.rConnSettings.fgWapiMode = TRUE;
  7778. return WLAN_STATUS_SUCCESS;
  7779. }
  7780. /*----------------------------------------------------------------------------*/
  7781. /*!
  7782. * \brief This routine is called to set the wpi key to the driver.
  7783. *
  7784. * \param[in] prAdapter Pointer to the Adapter structure.
  7785. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  7786. * \param[in] u4SetBufferLen The length of the set buffer.
  7787. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  7788. * bytes read from the set buffer. If the call failed
  7789. * due to invalid length of the set buffer, returns
  7790. * the amount of storage needed.
  7791. *
  7792. * \retval WLAN_STATUS_SUCCESS
  7793. * \retval WLAN_STATUS_ADAPTER_NOT_READY
  7794. * \retval WLAN_STATUS_INVALID_LENGTH
  7795. * \retval WLAN_STATUS_INVALID_DATA
  7796. *
  7797. * \note The setting buffer P_PARAM_WPI_KEY, which is set by NDIS, is unpacked.
  7798. */
  7799. /*----------------------------------------------------------------------------*/
  7800. WLAN_STATUS
  7801. wlanoidSetWapiKey(IN P_ADAPTER_T prAdapter, IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  7802. {
  7803. P_GLUE_INFO_T prGlueInfo;
  7804. P_CMD_INFO_T prCmdInfo;
  7805. P_WIFI_CMD_T prWifiCmd;
  7806. P_PARAM_WPI_KEY_T prNewKey;
  7807. P_CMD_802_11_KEY prCmdKey;
  7808. PUINT_8 pc;
  7809. UINT_8 ucCmdSeqNum;
  7810. P_STA_RECORD_T prStaRec;
  7811. P_BSS_INFO_T prBssInfo;
  7812. DEBUGFUNC("wlanoidSetWapiKey");
  7813. DBGLOG(OID, LOUD, "\r\n");
  7814. ASSERT(prAdapter);
  7815. ASSERT(pvSetBuffer);
  7816. ASSERT(pu4SetInfoLen);
  7817. if (prAdapter->rAcpiState == ACPI_STATE_D3) {
  7818. DBGLOG(OID, WARN,
  7819. "Fail in set add key! (Adapter not ready). ACPI=D%d, Radio=%d\r\n",
  7820. prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
  7821. return WLAN_STATUS_ADAPTER_NOT_READY;
  7822. }
  7823. prNewKey = (P_PARAM_WPI_KEY_T) pvSetBuffer;
  7824. DBGLOG_MEM8(OID, TRACE, (PUINT_8) pvSetBuffer, 560);
  7825. pc = (PUINT_8) pvSetBuffer;
  7826. *pu4SetInfoLen = u4SetBufferLen;
  7827. /* Todo:: WAPI AP mode !!!!! */
  7828. prBssInfo = prAdapter->prAisBssInfo;
  7829. /* Exception check */
  7830. if (prNewKey->ucKeyID != 0x1 || prNewKey->ucKeyID != 0x0) {
  7831. prNewKey->ucKeyID = prNewKey->ucKeyID & BIT(0);
  7832. /* DBGLOG(SEC, INFO, ("Invalid WAPI key ID (%d)\r\n", prNewKey->ucKeyID)); */
  7833. }
  7834. /* Dump P_PARAM_WPI_KEY_T content. */
  7835. DBGLOG(OID, TRACE, "Set: Dump P_PARAM_WPI_KEY_T content\r\n");
  7836. DBGLOG(OID, TRACE, "TYPE : %d\r\n", prNewKey->eKeyType);
  7837. DBGLOG(OID, TRACE, "Direction : %d\r\n", prNewKey->eDirection);
  7838. DBGLOG(OID, TRACE, "KeyID : %d\r\n", prNewKey->ucKeyID);
  7839. DBGLOG(OID, TRACE, "AddressIndex:\r\n");
  7840. DBGLOG_MEM8(OID, TRACE, prNewKey->aucAddrIndex, 12);
  7841. prNewKey->u4LenWPIEK = 16;
  7842. DBGLOG_MEM8(OID, TRACE, (PUINT_8) prNewKey->aucWPIEK, (UINT_8) prNewKey->u4LenWPIEK);
  7843. prNewKey->u4LenWPICK = 16;
  7844. DBGLOG(OID, TRACE, "CK Key(%d):\r\n", (UINT_8) prNewKey->u4LenWPICK);
  7845. DBGLOG_MEM8(OID, TRACE, (PUINT_8) prNewKey->aucWPICK, (UINT_8) prNewKey->u4LenWPICK);
  7846. DBGLOG(OID, TRACE, "PN:\r\n");
  7847. if (prNewKey->eKeyType == 0) {
  7848. prNewKey->aucPN[0] = 0x5c;
  7849. prNewKey->aucPN[1] = 0x36;
  7850. prNewKey->aucPN[2] = 0x5c;
  7851. prNewKey->aucPN[3] = 0x36;
  7852. prNewKey->aucPN[4] = 0x5c;
  7853. prNewKey->aucPN[5] = 0x36;
  7854. prNewKey->aucPN[6] = 0x5c;
  7855. prNewKey->aucPN[7] = 0x36;
  7856. prNewKey->aucPN[8] = 0x5c;
  7857. prNewKey->aucPN[9] = 0x36;
  7858. prNewKey->aucPN[10] = 0x5c;
  7859. prNewKey->aucPN[11] = 0x36;
  7860. prNewKey->aucPN[12] = 0x5c;
  7861. prNewKey->aucPN[13] = 0x36;
  7862. prNewKey->aucPN[14] = 0x5c;
  7863. prNewKey->aucPN[15] = 0x36;
  7864. }
  7865. DBGLOG_MEM8(OID, TRACE, (PUINT_8) prNewKey->aucPN, 16);
  7866. prGlueInfo = prAdapter->prGlueInfo;
  7867. prCmdInfo = cmdBufAllocateCmdInfo(prAdapter, (CMD_HDR_SIZE + u4SetBufferLen));
  7868. if (!prCmdInfo) {
  7869. DBGLOG(OID, ERROR, "Allocate CMD_INFO_T ==> FAILED.\n");
  7870. return WLAN_STATUS_FAILURE;
  7871. }
  7872. /* increase command sequence number */
  7873. ucCmdSeqNum = nicIncreaseCmdSeqNum(prAdapter);
  7874. /* compose CMD_ID_ADD_REMOVE_KEY cmd pkt */
  7875. prCmdInfo->eCmdType = COMMAND_TYPE_NETWORK_IOCTL;
  7876. prCmdInfo->ucBssIndex = prAdapter->prAisBssInfo->ucBssIndex;
  7877. prCmdInfo->u2InfoBufLen = CMD_HDR_SIZE + sizeof(CMD_802_11_KEY);
  7878. prCmdInfo->pfCmdDoneHandler = nicCmdEventSetCommon;
  7879. prCmdInfo->pfCmdTimeoutHandler = nicOidCmdTimeoutCommon;
  7880. prCmdInfo->fgIsOid = TRUE;
  7881. prCmdInfo->ucCID = CMD_ID_ADD_REMOVE_KEY;
  7882. prCmdInfo->fgSetQuery = TRUE;
  7883. prCmdInfo->fgNeedResp = FALSE;
  7884. prCmdInfo->fgDriverDomainMCR = FALSE;
  7885. prCmdInfo->ucCmdSeqNum = ucCmdSeqNum;
  7886. prCmdInfo->u4SetInfoLen = u4SetBufferLen;
  7887. prCmdInfo->pvInformationBuffer = pvSetBuffer;
  7888. prCmdInfo->u4InformationBufferLength = u4SetBufferLen;
  7889. /* Setup WIFI_CMD_T */
  7890. prWifiCmd = (P_WIFI_CMD_T) (prCmdInfo->pucInfoBuffer);
  7891. prWifiCmd->u2TxByteCount = prCmdInfo->u2InfoBufLen;
  7892. prWifiCmd->u2PQ_ID = CMD_PQ_ID;
  7893. prWifiCmd->ucPktTypeID = CMD_PACKET_TYPE_ID;
  7894. prWifiCmd->ucCID = prCmdInfo->ucCID;
  7895. prWifiCmd->ucSetQuery = prCmdInfo->fgSetQuery;
  7896. prWifiCmd->ucSeqNum = prCmdInfo->ucCmdSeqNum;
  7897. prCmdKey = (P_CMD_802_11_KEY) (prWifiCmd->aucBuffer);
  7898. kalMemZero(prCmdKey, sizeof(CMD_802_11_KEY));
  7899. prCmdKey->ucAddRemove = 1; /* Add */
  7900. if (prNewKey->eKeyType == ENUM_WPI_PAIRWISE_KEY) {
  7901. prCmdKey->ucTxKey = 1;
  7902. prCmdKey->ucKeyType = 1;
  7903. }
  7904. kalMemCopy(prCmdKey->aucPeerAddr, (PUINT_8) prNewKey->aucAddrIndex, MAC_ADDR_LEN);
  7905. if ((prCmdKey->aucPeerAddr[0] & prCmdKey->aucPeerAddr[1] & prCmdKey->aucPeerAddr[2] &
  7906. prCmdKey->aucPeerAddr[3] & prCmdKey->aucPeerAddr[4] & prCmdKey->aucPeerAddr[5]) == 0xFF) {
  7907. prStaRec = cnmGetStaRecByAddress(prAdapter, prBssInfo->ucBssIndex, prBssInfo->aucBSSID);
  7908. ASSERT(prStaRec); /* AIS RSN Group key, addr is BC addr */
  7909. kalMemCopy(prCmdKey->aucPeerAddr, prStaRec->aucMacAddr, MAC_ADDR_LEN);
  7910. } else {
  7911. prStaRec = cnmGetStaRecByAddress(prAdapter, prBssInfo->ucBssIndex, prCmdKey->aucPeerAddr);
  7912. }
  7913. prCmdKey->ucBssIdx = prAdapter->prAisBssInfo->ucBssIndex; /* AIS */
  7914. prCmdKey->ucKeyId = prNewKey->ucKeyID;
  7915. prCmdKey->ucKeyLen = 32;
  7916. prCmdKey->ucAlgorithmId = CIPHER_SUITE_WPI;
  7917. kalMemCopy(prCmdKey->aucKeyMaterial, (PUINT_8) prNewKey->aucWPIEK, 16);
  7918. kalMemCopy(prCmdKey->aucKeyMaterial + 16, (PUINT_8) prNewKey->aucWPICK, 16);
  7919. kalMemCopy(prCmdKey->aucKeyRsc, (PUINT_8) prNewKey->aucPN, 16);
  7920. if (prCmdKey->ucTxKey) {
  7921. if (prStaRec) {
  7922. if (prCmdKey->ucKeyType) { /* AIS RSN STA */
  7923. prCmdKey->ucWlanIndex = prStaRec->ucWlanIndex;
  7924. prStaRec->fgTransmitKeyExist = TRUE; /* wait for CMD Done ? */
  7925. } else {
  7926. ASSERT(FALSE);
  7927. }
  7928. }
  7929. #if 0
  7930. if (fgAddTxBcKey || !prStaRec) {
  7931. if ((prCmdKey->aucPeerAddr[0] & prCmdKey->aucPeerAddr[1] & prCmdKey->aucPeerAddr[2] & prCmdKey->
  7932. aucPeerAddr[3] & prCmdKey->aucPeerAddr[4] & prCmdKey->aucPeerAddr[5]) == 0xFF) {
  7933. prCmdKey->ucWlanIndex = 255; /* AIS WEP Tx key */
  7934. } else { /* Exist this case ? */
  7935. ASSERT(FALSE);
  7936. /* prCmdKey->ucWlanIndex = */
  7937. /* secPrivacySeekForBcEntry(prAdapter, */
  7938. /* prBssInfo->ucBssIndex, */
  7939. /* NETWORK_TYPE_AIS, */
  7940. /* prCmdKey->aucPeerAddr, */
  7941. /* prCmdKey->ucAlgorithmId, */
  7942. /* prCmdKey->ucKeyId, */
  7943. /* prBssInfo->ucCurrentGtkId, */
  7944. /* BIT(1)); */
  7945. }
  7946. prBssInfo->fgTxBcKeyExist = TRUE;
  7947. prBssInfo->ucBMCWlanIndex = prCmdKey->ucWlanIndex; /* Saved for AIS WEP */
  7948. prBssInfo->ucTxDefaultKeyID = prCmdKey->ucKeyId;
  7949. }
  7950. #endif
  7951. } else {
  7952. /* Including IBSS RSN Rx BC key ? */
  7953. if ((prCmdKey->aucPeerAddr[0] & prCmdKey->aucPeerAddr[1] & prCmdKey->aucPeerAddr[2] & prCmdKey->
  7954. aucPeerAddr[3] & prCmdKey->aucPeerAddr[4] & prCmdKey->aucPeerAddr[5]) == 0xFF) {
  7955. prCmdKey->ucWlanIndex = 255; /* AIS WEP, should not have this case!! */
  7956. } else {
  7957. if (prStaRec) { /* AIS RSN Group key but addr is BSSID */
  7958. /* ASSERT(prStaRec->ucBMCWlanIndex < WTBL_SIZE) */
  7959. prCmdKey->ucWlanIndex =
  7960. secPrivacySeekForBcEntry(prAdapter, prStaRec->ucBssIndex,
  7961. prStaRec->aucMacAddr,
  7962. prStaRec->ucIndex,
  7963. prCmdKey->ucAlgorithmId,
  7964. prCmdKey->ucKeyId, prStaRec->ucCurrentGtkId, BIT(0));
  7965. prStaRec->ucBMCWlanIndex = prCmdKey->ucWlanIndex;
  7966. } else { /* Exist this case ? */
  7967. ASSERT(FALSE);
  7968. /* prCmdKey->ucWlanIndex = */
  7969. /* secPrivacySeekForBcEntry(prAdapter, */
  7970. /* prBssInfo->ucBssIndex, */
  7971. /* NETWORK_TYPE_AIS, */
  7972. /* prCmdKey->aucPeerAddr, */
  7973. /* prCmdKey->ucAlgorithmId, */
  7974. /* prCmdKey->ucKeyId, */
  7975. /* prBssInfo->ucCurrentGtkId, */
  7976. /* BIT(0)); */
  7977. }
  7978. }
  7979. }
  7980. /* insert into prCmdQueue */
  7981. kalEnqueueCommand(prGlueInfo, (P_QUE_ENTRY_T) prCmdInfo);
  7982. /* wakeup txServiceThread later */
  7983. GLUE_SET_EVENT(prGlueInfo);
  7984. return WLAN_STATUS_PENDING;
  7985. } /* wlanoidSetAddKey */
  7986. #endif
  7987. #if CFG_SUPPORT_WPS2
  7988. /*----------------------------------------------------------------------------*/
  7989. /*!
  7990. * \brief This routine is called by WSC to set the assoc info, which is needed to add to
  7991. * Association request frame while join WPS AP.
  7992. *
  7993. * \param[in] prAdapter Pointer to the Adapter structure
  7994. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set
  7995. * \param[in] u4SetBufferLen The length of the set buffer
  7996. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  7997. * bytes read from the set buffer. If the call failed due to invalid length of
  7998. * the set buffer, returns the amount of storage needed.
  7999. *
  8000. * \retval WLAN_STATUS_SUCCESS
  8001. * \retval WLAN_STATUS_INVALID_DATA If new setting value is wrong.
  8002. * \retval WLAN_STATUS_INVALID_LENGTH
  8003. *
  8004. */
  8005. /*----------------------------------------------------------------------------*/
  8006. WLAN_STATUS
  8007. wlanoidSetWSCAssocInfo(IN P_ADAPTER_T prAdapter,
  8008. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  8009. {
  8010. ASSERT(prAdapter);
  8011. ASSERT(pvSetBuffer);
  8012. ASSERT(pu4SetInfoLen);
  8013. DEBUGFUNC("wlanoidSetWSCAssocInfo");
  8014. DBGLOG(OID, LOUD, "\r\n");
  8015. if (u4SetBufferLen == 0)
  8016. return WLAN_STATUS_INVALID_LENGTH;
  8017. *pu4SetInfoLen = u4SetBufferLen;
  8018. kalMemCopy(prAdapter->prGlueInfo->aucWSCAssocInfoIE, pvSetBuffer, u4SetBufferLen);
  8019. prAdapter->prGlueInfo->u2WSCAssocInfoIELen = (UINT_16) u4SetBufferLen;
  8020. DBGLOG(SEC, TRACE, "Assoc Info IE sz %u\n", u4SetBufferLen);
  8021. return WLAN_STATUS_SUCCESS;
  8022. }
  8023. #endif
  8024. #if CFG_ENABLE_WAKEUP_ON_LAN
  8025. WLAN_STATUS
  8026. wlanoidSetAddWakeupPattern(IN P_ADAPTER_T prAdapter,
  8027. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  8028. {
  8029. P_PARAM_PM_PACKET_PATTERN prPacketPattern;
  8030. DEBUGFUNC("wlanoidSetAddWakeupPattern");
  8031. DBGLOG(OID, LOUD, "\r\n");
  8032. ASSERT(prAdapter);
  8033. ASSERT(pu4SetInfoLen);
  8034. *pu4SetInfoLen = sizeof(PARAM_PM_PACKET_PATTERN);
  8035. if (u4SetBufferLen < sizeof(PARAM_PM_PACKET_PATTERN))
  8036. return WLAN_STATUS_INVALID_LENGTH;
  8037. ASSERT(pvSetBuffer);
  8038. prPacketPattern = (P_PARAM_PM_PACKET_PATTERN) pvSetBuffer;
  8039. /* FIXME:
  8040. * Send the struct to firmware */
  8041. return WLAN_STATUS_FAILURE;
  8042. }
  8043. WLAN_STATUS
  8044. wlanoidSetRemoveWakeupPattern(IN P_ADAPTER_T prAdapter,
  8045. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  8046. {
  8047. P_PARAM_PM_PACKET_PATTERN prPacketPattern;
  8048. DEBUGFUNC("wlanoidSetAddWakeupPattern");
  8049. DBGLOG(OID, LOUD, "\r\n");
  8050. ASSERT(prAdapter);
  8051. ASSERT(pu4SetInfoLen);
  8052. *pu4SetInfoLen = sizeof(PARAM_PM_PACKET_PATTERN);
  8053. if (u4SetBufferLen < sizeof(PARAM_PM_PACKET_PATTERN))
  8054. return WLAN_STATUS_INVALID_LENGTH;
  8055. ASSERT(pvSetBuffer);
  8056. prPacketPattern = (P_PARAM_PM_PACKET_PATTERN) pvSetBuffer;
  8057. /* FIXME:
  8058. * Send the struct to firmware */
  8059. return WLAN_STATUS_FAILURE;
  8060. }
  8061. WLAN_STATUS
  8062. wlanoidQueryEnableWakeup(IN P_ADAPTER_T prAdapter,
  8063. OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  8064. {
  8065. PUINT_32 pu4WakeupEventEnable;
  8066. DEBUGFUNC("wlanoidQueryEnableWakeup");
  8067. DBGLOG(OID, LOUD, "\r\n");
  8068. ASSERT(prAdapter);
  8069. ASSERT(pu4QueryInfoLen);
  8070. if (u4QueryBufferLen)
  8071. ASSERT(pvQueryBuffer);
  8072. *pu4QueryInfoLen = sizeof(UINT_32);
  8073. if (u4QueryBufferLen < sizeof(UINT_32))
  8074. return WLAN_STATUS_BUFFER_TOO_SHORT;
  8075. pu4WakeupEventEnable = (PUINT_32) pvQueryBuffer;
  8076. *pu4WakeupEventEnable = prAdapter->u4WakeupEventEnable;
  8077. return WLAN_STATUS_SUCCESS;
  8078. }
  8079. WLAN_STATUS
  8080. wlanoidSetEnableWakeup(IN P_ADAPTER_T prAdapter,
  8081. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  8082. {
  8083. PUINT_32 pu4WakeupEventEnable;
  8084. DEBUGFUNC("wlanoidSetEnableWakup");
  8085. DBGLOG(OID, LOUD, "\r\n");
  8086. ASSERT(prAdapter);
  8087. ASSERT(pu4SetInfoLen);
  8088. *pu4SetInfoLen = sizeof(UINT_32);
  8089. if (u4SetBufferLen < sizeof(UINT_32))
  8090. return WLAN_STATUS_INVALID_LENGTH;
  8091. ASSERT(pvSetBuffer);
  8092. pu4WakeupEventEnable = (PUINT_32) pvSetBuffer;
  8093. prAdapter->u4WakeupEventEnable = *pu4WakeupEventEnable;
  8094. /* FIXME:
  8095. * Send Command Event for setting wakeup-pattern / Magic Packet to firmware
  8096. * */
  8097. return WLAN_STATUS_FAILURE;
  8098. }
  8099. #endif
  8100. /*----------------------------------------------------------------------------*/
  8101. /*!
  8102. * \brief This routine is called to configure PS related settings for WMM-PS test.
  8103. *
  8104. * \param[in] prAdapter Pointer to the Adapter structure.
  8105. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  8106. * \param[in] u4SetBufferLen The length of the set buffer.
  8107. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  8108. * bytes read from the set buffer. If the call failed
  8109. * due to invalid length of the set buffer, returns
  8110. * the amount of storage needed.
  8111. *
  8112. * \retval WLAN_STATUS_SUCCESS
  8113. */
  8114. /*----------------------------------------------------------------------------*/
  8115. WLAN_STATUS
  8116. wlanoidSetWiFiWmmPsTest(IN P_ADAPTER_T prAdapter,
  8117. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  8118. {
  8119. P_PARAM_CUSTOM_WMM_PS_TEST_STRUCT_T prWmmPsTestInfo;
  8120. WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
  8121. CMD_SET_WMM_PS_TEST_STRUCT_T rSetWmmPsTestParam;
  8122. UINT_16 u2CmdBufLen;
  8123. P_PM_PROFILE_SETUP_INFO_T prPmProfSetupInfo;
  8124. P_BSS_INFO_T prBssInfo;
  8125. DEBUGFUNC("wlanoidSetWiFiWmmPsTest");
  8126. ASSERT(prAdapter);
  8127. ASSERT(pvSetBuffer);
  8128. ASSERT(pu4SetInfoLen);
  8129. *pu4SetInfoLen = sizeof(PARAM_CUSTOM_WMM_PS_TEST_STRUCT_T);
  8130. prWmmPsTestInfo = (P_PARAM_CUSTOM_WMM_PS_TEST_STRUCT_T) pvSetBuffer;
  8131. rSetWmmPsTestParam.ucBssIndex = prAdapter->prAisBssInfo->ucBssIndex;
  8132. rSetWmmPsTestParam.bmfgApsdEnAc = prWmmPsTestInfo->bmfgApsdEnAc;
  8133. rSetWmmPsTestParam.ucIsEnterPsAtOnce = prWmmPsTestInfo->ucIsEnterPsAtOnce;
  8134. rSetWmmPsTestParam.ucIsDisableUcTrigger = prWmmPsTestInfo->ucIsDisableUcTrigger;
  8135. prBssInfo = GET_BSS_INFO_BY_INDEX(prAdapter, rSetWmmPsTestParam.ucBssIndex);
  8136. prPmProfSetupInfo = &prBssInfo->rPmProfSetupInfo;
  8137. prPmProfSetupInfo->ucBmpDeliveryAC = (rSetWmmPsTestParam.bmfgApsdEnAc >> 4) & BITS(0, 3);
  8138. prPmProfSetupInfo->ucBmpTriggerAC = rSetWmmPsTestParam.bmfgApsdEnAc & BITS(0, 3);
  8139. u2CmdBufLen = sizeof(CMD_SET_WMM_PS_TEST_STRUCT_T);
  8140. #if 0
  8141. /* it will apply the disable trig or not immediately */
  8142. if (prPmInfo->ucWmmPsDisableUcPoll && prPmInfo->ucWmmPsConnWithTrig)
  8143. ; /* NIC_PM_WMM_PS_DISABLE_UC_TRIG(prAdapter, TRUE); */
  8144. else
  8145. ; /* NIC_PM_WMM_PS_DISABLE_UC_TRIG(prAdapter, FALSE); */
  8146. #endif
  8147. rStatus = wlanSendSetQueryCmd(prAdapter,
  8148. CMD_ID_SET_WMM_PS_TEST_PARMS,
  8149. TRUE,
  8150. FALSE,
  8151. TRUE,
  8152. nicCmdEventSetCommon,
  8153. nicCmdTimeoutCommon,
  8154. u2CmdBufLen,
  8155. (PUINT_8) (&rSetWmmPsTestParam),
  8156. NULL,
  8157. 0);
  8158. return rStatus;
  8159. } /* wlanoidSetWiFiWmmPsTest */
  8160. /*----------------------------------------------------------------------------*/
  8161. /*!
  8162. * \brief This routine is called to configure enable/disable TX A-MPDU feature.
  8163. *
  8164. * \param[in] prAdapter Pointer to the Adapter structure.
  8165. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  8166. * \param[in] u4SetBufferLen The length of the set buffer.
  8167. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  8168. * bytes read from the set buffer. If the call failed
  8169. * due to invalid length of the set buffer, returns
  8170. * the amount of storage needed.
  8171. *
  8172. * \retval WLAN_STATUS_SUCCESS
  8173. */
  8174. /*----------------------------------------------------------------------------*/
  8175. WLAN_STATUS
  8176. wlanoidSetTxAmpdu(IN P_ADAPTER_T prAdapter, IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  8177. {
  8178. WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
  8179. CMD_TX_AMPDU_T rTxAmpdu;
  8180. UINT_16 u2CmdBufLen;
  8181. PBOOLEAN pfgEnable;
  8182. DEBUGFUNC("wlanoidSetTxAmpdu");
  8183. ASSERT(prAdapter);
  8184. ASSERT(pvSetBuffer);
  8185. ASSERT(pu4SetInfoLen);
  8186. *pu4SetInfoLen = sizeof(BOOLEAN);
  8187. pfgEnable = (PBOOLEAN) pvSetBuffer;
  8188. rTxAmpdu.fgEnable = *pfgEnable;
  8189. u2CmdBufLen = sizeof(CMD_TX_AMPDU_T);
  8190. rStatus = wlanSendSetQueryCmd(prAdapter,
  8191. CMD_ID_TX_AMPDU,
  8192. TRUE, FALSE, TRUE, NULL, NULL, u2CmdBufLen, (PUINT_8) &rTxAmpdu, NULL, 0);
  8193. return rStatus;
  8194. } /* wlanoidSetTxAmpdu */
  8195. /*----------------------------------------------------------------------------*/
  8196. /*!
  8197. * \brief This routine is called to configure reject/accept ADDBA Request.
  8198. *
  8199. * \param[in] prAdapter Pointer to the Adapter structure.
  8200. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  8201. * \param[in] u4SetBufferLen The length of the set buffer.
  8202. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  8203. * bytes read from the set buffer. If the call failed
  8204. * due to invalid length of the set buffer, returns
  8205. * the amount of storage needed.
  8206. *
  8207. * \retval WLAN_STATUS_SUCCESS
  8208. */
  8209. /*----------------------------------------------------------------------------*/
  8210. WLAN_STATUS
  8211. wlanoidSetAddbaReject(IN P_ADAPTER_T prAdapter,
  8212. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  8213. {
  8214. WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
  8215. CMD_ADDBA_REJECT_T rAddbaReject;
  8216. UINT_16 u2CmdBufLen;
  8217. PBOOLEAN pfgEnable;
  8218. DEBUGFUNC("wlanoidSetAddbaReject");
  8219. ASSERT(prAdapter);
  8220. ASSERT(pvSetBuffer);
  8221. ASSERT(pu4SetInfoLen);
  8222. *pu4SetInfoLen = sizeof(BOOLEAN);
  8223. pfgEnable = (PBOOLEAN) pvSetBuffer;
  8224. rAddbaReject.fgEnable = *pfgEnable;
  8225. u2CmdBufLen = sizeof(CMD_ADDBA_REJECT_T);
  8226. rStatus = wlanSendSetQueryCmd(prAdapter,
  8227. CMD_ID_ADDBA_REJECT,
  8228. TRUE, FALSE, TRUE, NULL, NULL, u2CmdBufLen, (PUINT_8) &rAddbaReject, NULL, 0);
  8229. return rStatus;
  8230. } /* wlanoidSetAddbaReject */
  8231. #if CFG_SLT_SUPPORT
  8232. WLAN_STATUS
  8233. wlanoidQuerySLTStatus(IN P_ADAPTER_T prAdapter,
  8234. OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  8235. {
  8236. WLAN_STATUS rWlanStatus = WLAN_STATUS_SUCCESS;
  8237. P_PARAM_MTK_SLT_TEST_STRUCT_T prMtkSltInfo = (P_PARAM_MTK_SLT_TEST_STRUCT_T) NULL;
  8238. P_SLT_INFO_T prSltInfo = (P_SLT_INFO_T) NULL;
  8239. DEBUGFUNC("wlanoidQuerySLTStatus");
  8240. DBGLOG(OID, LOUD, "\r\n");
  8241. ASSERT(prAdapter);
  8242. ASSERT(pu4QueryInfoLen);
  8243. *pu4QueryInfoLen = sizeof(PARAM_MTK_SLT_TEST_STRUCT_T);
  8244. if (u4QueryBufferLen < sizeof(PARAM_MTK_SLT_TEST_STRUCT_T))
  8245. return WLAN_STATUS_INVALID_LENGTH;
  8246. ASSERT(pvQueryBuffer);
  8247. prMtkSltInfo = (P_PARAM_MTK_SLT_TEST_STRUCT_T) pvQueryBuffer;
  8248. prSltInfo = &(prAdapter->rWifiVar.rSltInfo);
  8249. switch (prMtkSltInfo->rSltFuncIdx) {
  8250. case ENUM_MTK_SLT_FUNC_LP_SET:
  8251. {
  8252. P_PARAM_MTK_SLT_LP_TEST_STRUCT_T prLpSetting = (P_PARAM_MTK_SLT_LP_TEST_STRUCT_T) NULL;
  8253. ASSERT(prMtkSltInfo->u4FuncInfoLen == sizeof(PARAM_MTK_SLT_LP_TEST_STRUCT_T));
  8254. prLpSetting = (P_PARAM_MTK_SLT_LP_TEST_STRUCT_T) &prMtkSltInfo->unFuncInfoContent;
  8255. prLpSetting->u4BcnRcvNum = prSltInfo->u4BeaconReceiveCnt;
  8256. }
  8257. break;
  8258. default:
  8259. /* TBD... */
  8260. break;
  8261. }
  8262. return rWlanStatus;
  8263. } /* wlanoidQuerySLTStatus */
  8264. WLAN_STATUS
  8265. wlanoidUpdateSLTMode(IN P_ADAPTER_T prAdapter,
  8266. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  8267. {
  8268. WLAN_STATUS rWlanStatus = WLAN_STATUS_SUCCESS;
  8269. P_PARAM_MTK_SLT_TEST_STRUCT_T prMtkSltInfo = (P_PARAM_MTK_SLT_TEST_STRUCT_T) NULL;
  8270. P_SLT_INFO_T prSltInfo = (P_SLT_INFO_T) NULL;
  8271. P_BSS_DESC_T prBssDesc = (P_BSS_DESC_T) NULL;
  8272. P_STA_RECORD_T prStaRec = (P_STA_RECORD_T) NULL;
  8273. P_BSS_INFO_T prBssInfo = (P_BSS_INFO_T) NULL;
  8274. /* 1. Action: Update or Initial Set
  8275. * 2. Role.
  8276. * 3. Target MAC address.
  8277. * 4. RF BW & Rate Settings
  8278. */
  8279. DEBUGFUNC("wlanoidUpdateSLTMode");
  8280. DBGLOG(OID, LOUD, "\r\n");
  8281. ASSERT(prAdapter);
  8282. ASSERT(pu4SetInfoLen);
  8283. *pu4SetInfoLen = sizeof(PARAM_MTK_SLT_TEST_STRUCT_T);
  8284. if (u4SetBufferLen < sizeof(PARAM_MTK_SLT_TEST_STRUCT_T))
  8285. return WLAN_STATUS_INVALID_LENGTH;
  8286. ASSERT(pvSetBuffer);
  8287. prMtkSltInfo = (P_PARAM_MTK_SLT_TEST_STRUCT_T) pvSetBuffer;
  8288. prSltInfo = &(prAdapter->rWifiVar.rSltInfo);
  8289. prBssInfo = prAdapter->prAisBssInfo;
  8290. switch (prMtkSltInfo->rSltFuncIdx) {
  8291. case ENUM_MTK_SLT_FUNC_INITIAL: /* Initialize */
  8292. {
  8293. P_PARAM_MTK_SLT_INITIAL_STRUCT_T prMtkSltInit = (P_PARAM_MTK_SLT_INITIAL_STRUCT_T) NULL;
  8294. ASSERT(prMtkSltInfo->u4FuncInfoLen == sizeof(PARAM_MTK_SLT_INITIAL_STRUCT_T));
  8295. prMtkSltInit = (P_PARAM_MTK_SLT_INITIAL_STRUCT_T) &prMtkSltInfo->unFuncInfoContent;
  8296. if (prSltInfo->prPseudoStaRec != NULL) {
  8297. /* The driver has been initialized. */
  8298. prSltInfo->prPseudoStaRec = NULL;
  8299. }
  8300. prSltInfo->prPseudoBssDesc = scanSearchExistingBssDesc(prAdapter,
  8301. BSS_TYPE_IBSS,
  8302. prMtkSltInit->aucTargetMacAddr,
  8303. prMtkSltInit->aucTargetMacAddr);
  8304. prSltInfo->u2SiteID = prMtkSltInit->u2SiteID;
  8305. /* Bandwidth 2.4G: Channel 1~14
  8306. * Bandwidth 5G: *36, 40, 44, 48, 52, 56, 60, 64,
  8307. * *100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140,
  8308. * 149, 153, *157, 161,
  8309. * 184, 188, 192, 196, 200, 204, 208, 212, *216
  8310. */
  8311. prSltInfo->ucChannel2G4 = 1 + (prSltInfo->u2SiteID % 4) * 5;
  8312. switch (prSltInfo->ucChannel2G4) {
  8313. case 1:
  8314. prSltInfo->ucChannel5G = 36;
  8315. break;
  8316. case 6:
  8317. prSltInfo->ucChannel5G = 52;
  8318. break;
  8319. case 11:
  8320. prSltInfo->ucChannel5G = 104;
  8321. break;
  8322. case 16:
  8323. prSltInfo->ucChannel2G4 = 14;
  8324. prSltInfo->ucChannel5G = 161;
  8325. break;
  8326. default:
  8327. ASSERT(FALSE);
  8328. }
  8329. if (prSltInfo->prPseudoBssDesc == NULL) {
  8330. do {
  8331. prSltInfo->prPseudoBssDesc = scanAllocateBssDesc(prAdapter);
  8332. if (prSltInfo->prPseudoBssDesc == NULL)
  8333. rWlanStatus = WLAN_STATUS_FAILURE;
  8334. else
  8335. prBssDesc = prSltInfo->prPseudoBssDesc;
  8336. } while (FALSE);
  8337. } else {
  8338. prBssDesc = prSltInfo->prPseudoBssDesc;
  8339. }
  8340. if (prBssDesc) {
  8341. prBssDesc->eBSSType = BSS_TYPE_IBSS;
  8342. COPY_MAC_ADDR(prBssDesc->aucSrcAddr, prMtkSltInit->aucTargetMacAddr);
  8343. COPY_MAC_ADDR(prBssDesc->aucBSSID, prBssInfo->aucOwnMacAddr);
  8344. prBssDesc->u2BeaconInterval = 100;
  8345. prBssDesc->u2ATIMWindow = 0;
  8346. prBssDesc->ucDTIMPeriod = 1;
  8347. prBssDesc->u2IELength = 0;
  8348. prBssDesc->fgIsERPPresent = TRUE;
  8349. prBssDesc->fgIsHTPresent = TRUE;
  8350. prBssDesc->u2OperationalRateSet = BIT(RATE_36M_INDEX);
  8351. prBssDesc->u2BSSBasicRateSet = BIT(RATE_36M_INDEX);
  8352. prBssDesc->fgIsUnknownBssBasicRate = FALSE;
  8353. prBssDesc->fgIsLargerTSF = TRUE;
  8354. prBssDesc->eBand = BAND_2G4;
  8355. prBssDesc->ucChannelNum = prSltInfo->ucChannel2G4;
  8356. prBssDesc->ucPhyTypeSet = PHY_TYPE_SET_802_11ABGN;
  8357. GET_CURRENT_SYSTIME(&prBssDesc->rUpdateTime);
  8358. }
  8359. }
  8360. break;
  8361. case ENUM_MTK_SLT_FUNC_RATE_SET: /* Update RF Settings. */
  8362. if (prSltInfo->prPseudoStaRec == NULL) {
  8363. rWlanStatus = WLAN_STATUS_FAILURE;
  8364. } else {
  8365. P_PARAM_MTK_SLT_TR_TEST_STRUCT_T prTRSetting = (P_PARAM_MTK_SLT_TR_TEST_STRUCT_T) NULL;
  8366. ASSERT(prMtkSltInfo->u4FuncInfoLen == sizeof(PARAM_MTK_SLT_TR_TEST_STRUCT_T));
  8367. prStaRec = prSltInfo->prPseudoStaRec;
  8368. prTRSetting = (P_PARAM_MTK_SLT_TR_TEST_STRUCT_T) &prMtkSltInfo->unFuncInfoContent;
  8369. if (prTRSetting->rNetworkType == PARAM_NETWORK_TYPE_OFDM5) {
  8370. prBssInfo->eBand = BAND_5G;
  8371. prBssInfo->ucPrimaryChannel = prSltInfo->ucChannel5G;
  8372. }
  8373. if (prTRSetting->rNetworkType == PARAM_NETWORK_TYPE_OFDM24) {
  8374. prBssInfo->eBand = BAND_2G4;
  8375. prBssInfo->ucPrimaryChannel = prSltInfo->ucChannel2G4;
  8376. }
  8377. if ((prTRSetting->u4FixedRate & FIXED_BW_DL40) != 0) {
  8378. /* RF 40 */
  8379. /* It would controls RFBW capability in WTBL. */
  8380. prStaRec->u2HtCapInfo |= HT_CAP_INFO_SUP_CHNL_WIDTH;
  8381. /* This controls RF BW, RF BW would be 40 only if
  8382. * 1. PHY_TYPE_BIT_HT is TRUE.
  8383. * 2. SCO is SCA/SCB.
  8384. */
  8385. prStaRec->ucDesiredPhyTypeSet = PHY_TYPE_BIT_HT;
  8386. /* U20/L20 Control. */
  8387. switch (prTRSetting->u4FixedRate & 0xC000) {
  8388. case FIXED_EXT_CHNL_U20:
  8389. prBssInfo->eBssSCO = CHNL_EXT_SCB; /* +2 */
  8390. if (prTRSetting->rNetworkType == PARAM_NETWORK_TYPE_OFDM5) {
  8391. prBssInfo->ucPrimaryChannel += 2;
  8392. } else {
  8393. /* For channel 1, testing L20 at channel 8. AOSP */
  8394. SetTestChannel(&prBssInfo->ucPrimaryChannel);
  8395. }
  8396. break;
  8397. case FIXED_EXT_CHNL_L20:
  8398. default: /* 40M */
  8399. prBssInfo->eBssSCO = CHNL_EXT_SCA; /* -2 */
  8400. if (prTRSetting->rNetworkType == PARAM_NETWORK_TYPE_OFDM5) {
  8401. prBssInfo->ucPrimaryChannel -= 2;
  8402. } else {
  8403. /* For channel 11 / 14. testing U20 at channel 3. AOSP */
  8404. SetTestChannel(&prBssInfo->ucPrimaryChannel);
  8405. }
  8406. break;
  8407. }
  8408. } else {
  8409. /* RF 20 */
  8410. prStaRec->u2HtCapInfo &= ~HT_CAP_INFO_SUP_CHNL_WIDTH;
  8411. prBssInfo->eBssSCO = CHNL_EXT_SCN;
  8412. }
  8413. prBssInfo->fgErpProtectMode = FALSE;
  8414. prBssInfo->eHtProtectMode = HT_PROTECT_MODE_NONE;
  8415. prBssInfo->eGfOperationMode = GF_MODE_NORMAL;
  8416. nicUpdateBss(prAdapter, prBssInfo->ucNetTypeIndex);
  8417. prStaRec->u2HtCapInfo &= ~(HT_CAP_INFO_SHORT_GI_20M | HT_CAP_INFO_SHORT_GI_40M);
  8418. switch (prTRSetting->u4FixedRate & 0xFF) {
  8419. case RATE_OFDM_54M:
  8420. prStaRec->u2DesiredNonHTRateSet = BIT(RATE_54M_SW_INDEX);
  8421. break;
  8422. case RATE_OFDM_48M:
  8423. prStaRec->u2DesiredNonHTRateSet = BIT(RATE_48M_SW_INDEX);
  8424. break;
  8425. case RATE_OFDM_36M:
  8426. prStaRec->u2DesiredNonHTRateSet = BIT(RATE_36M_SW_INDEX);
  8427. break;
  8428. case RATE_OFDM_24M:
  8429. prStaRec->u2DesiredNonHTRateSet = BIT(RATE_24M_SW_INDEX);
  8430. break;
  8431. case RATE_OFDM_6M:
  8432. prStaRec->u2DesiredNonHTRateSet = BIT(RATE_6M_SW_INDEX);
  8433. break;
  8434. case RATE_CCK_11M_LONG:
  8435. prStaRec->u2DesiredNonHTRateSet = BIT(RATE_11M_SW_INDEX);
  8436. break;
  8437. case RATE_CCK_1M_LONG:
  8438. prStaRec->u2DesiredNonHTRateSet = BIT(RATE_1M_SW_INDEX);
  8439. break;
  8440. case RATE_GF_MCS_0:
  8441. prStaRec->u2DesiredNonHTRateSet = BIT(RATE_HT_PHY_SW_INDEX);
  8442. prStaRec->u2HtCapInfo |= HT_CAP_INFO_HT_GF;
  8443. break;
  8444. case RATE_MM_MCS_7:
  8445. prStaRec->u2DesiredNonHTRateSet = BIT(RATE_HT_PHY_SW_INDEX);
  8446. prStaRec->u2HtCapInfo &= ~HT_CAP_INFO_HT_GF;
  8447. #if 0 /* Only for Current Measurement Mode. */
  8448. prStaRec->u2HtCapInfo |= (HT_CAP_INFO_SHORT_GI_20M | HT_CAP_INFO_SHORT_GI_40M);
  8449. #endif
  8450. break;
  8451. case RATE_GF_MCS_7:
  8452. prStaRec->u2DesiredNonHTRateSet = BIT(RATE_HT_PHY_SW_INDEX);
  8453. prStaRec->u2HtCapInfo |= HT_CAP_INFO_HT_GF;
  8454. break;
  8455. default:
  8456. prStaRec->u2DesiredNonHTRateSet = BIT(RATE_36M_SW_INDEX);
  8457. break;
  8458. }
  8459. cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_1);
  8460. cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
  8461. }
  8462. break;
  8463. case ENUM_MTK_SLT_FUNC_LP_SET: /* Reset LP Test Result. */
  8464. {
  8465. P_PARAM_MTK_SLT_LP_TEST_STRUCT_T prLpSetting = (P_PARAM_MTK_SLT_LP_TEST_STRUCT_T) NULL;
  8466. ASSERT(prMtkSltInfo->u4FuncInfoLen == sizeof(PARAM_MTK_SLT_LP_TEST_STRUCT_T));
  8467. prLpSetting = (P_PARAM_MTK_SLT_LP_TEST_STRUCT_T) &prMtkSltInfo->unFuncInfoContent;
  8468. /* Please initial SLT Mode first. */
  8469. if (prSltInfo->prPseudoBssDesc == NULL)
  8470. break;
  8471. prBssDesc = prSltInfo->prPseudoBssDesc;
  8472. switch (prLpSetting->rLpTestMode) {
  8473. case ENUM_MTK_LP_TEST_NORMAL:
  8474. /* In normal mode, we would use target MAC address to be the BSSID. */
  8475. COPY_MAC_ADDR(prBssDesc->aucBSSID, prBssInfo->aucOwnMacAddr);
  8476. prSltInfo->fgIsDUT = FALSE;
  8477. break;
  8478. case ENUM_MTK_LP_TEST_GOLDEN_SAMPLE:
  8479. /* 1. Lower AIFS of BCN queue.
  8480. * 2. Fixed Random Number tobe 0.
  8481. */
  8482. prSltInfo->fgIsDUT = FALSE;
  8483. /* In LP test mode, we would use MAC address of Golden Sample to be the BSSID. */
  8484. COPY_MAC_ADDR(prBssDesc->aucBSSID, prBssInfo->aucOwnMacAddr);
  8485. break;
  8486. case ENUM_MTK_LP_TEST_DUT:
  8487. /* 1. Enter Sleep Mode.
  8488. * 2. Fix random number a large value & enlarge AIFN of BCN queue.
  8489. */
  8490. COPY_MAC_ADDR(prBssDesc->aucBSSID, prBssDesc->aucSrcAddr);
  8491. prSltInfo->u4BeaconReceiveCnt = 0;
  8492. prSltInfo->fgIsDUT = TRUE;
  8493. break;
  8494. }
  8495. }
  8496. break;
  8497. default:
  8498. break;
  8499. }
  8500. return WLAN_STATUS_FAILURE;
  8501. return rWlanStatus;
  8502. } /* wlanoidUpdateSLTMode */
  8503. #endif
  8504. /*----------------------------------------------------------------------------*/
  8505. /*!
  8506. * \brief This routine is called to query NVRAM value.
  8507. *
  8508. * \param[in] pvAdapter Pointer to the Adapter structure.
  8509. * \param[out] pvQueryBuf A pointer to the buffer that holds the result of
  8510. * the query.
  8511. * \param[in] u4QueryBufLen The length of the query buffer.
  8512. * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
  8513. * bytes written into the query buffer. If the call
  8514. * failed due to invalid length of the query buffer,
  8515. * returns the amount of storage needed.
  8516. *
  8517. * \retval WLAN_STATUS_SUCCESS
  8518. * \retval WLAN_STATUS_FAILURE
  8519. */
  8520. /*----------------------------------------------------------------------------*/
  8521. WLAN_STATUS
  8522. wlanoidQueryNvramRead(IN P_ADAPTER_T prAdapter,
  8523. OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  8524. {
  8525. P_PARAM_CUSTOM_NVRAM_RW_STRUCT_T prNvramRwInfo;
  8526. UINT_16 u2Data;
  8527. BOOLEAN fgStatus;
  8528. WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
  8529. DEBUGFUNC("wlanoidQueryNvramRead");
  8530. ASSERT(prAdapter);
  8531. ASSERT(pu4QueryInfoLen);
  8532. if (u4QueryBufferLen)
  8533. ASSERT(pvQueryBuffer);
  8534. *pu4QueryInfoLen = sizeof(PARAM_CUSTOM_NVRAM_RW_STRUCT_T);
  8535. if (u4QueryBufferLen < sizeof(PARAM_CUSTOM_NVRAM_RW_STRUCT_T))
  8536. return WLAN_STATUS_INVALID_LENGTH;
  8537. prNvramRwInfo = (P_PARAM_CUSTOM_NVRAM_RW_STRUCT_T) pvQueryBuffer;
  8538. if (prNvramRwInfo->ucEepromMethod == PARAM_EEPROM_READ_METHOD_READ) {
  8539. fgStatus = kalCfgDataRead16(prAdapter->prGlueInfo, prNvramRwInfo->ucEepromIndex << 1,
  8540. &u2Data); /* change to byte offset */
  8541. if (fgStatus) {
  8542. prNvramRwInfo->u2EepromData = u2Data;
  8543. DBGLOG(OID, INFO, "NVRAM Read: index=%#X, data=%#02X\r\n",
  8544. prNvramRwInfo->ucEepromIndex, u2Data);
  8545. } else {
  8546. DBGLOG(OID, ERROR, "NVRAM Read Failed: index=%#x.\r\n", prNvramRwInfo->ucEepromIndex);
  8547. rStatus = WLAN_STATUS_FAILURE;
  8548. }
  8549. } else if (prNvramRwInfo->ucEepromMethod == PARAM_EEPROM_READ_METHOD_GETSIZE) {
  8550. prNvramRwInfo->u2EepromData = CFG_FILE_WIFI_REC_SIZE;
  8551. DBGLOG(OID, INFO, "EEPROM size =%d\r\n", prNvramRwInfo->u2EepromData);
  8552. }
  8553. *pu4QueryInfoLen = sizeof(PARAM_CUSTOM_EEPROM_RW_STRUCT_T);
  8554. return rStatus;
  8555. } /* wlanoidQueryNvramRead */
  8556. /*----------------------------------------------------------------------------*/
  8557. /*!
  8558. * \brief This routine is called to write NVRAM value.
  8559. *
  8560. * \param[in] prAdapter Pointer to the Adapter structure.
  8561. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  8562. * \param[in] u4SetBufferLen The length of the set buffer.
  8563. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  8564. * bytes read from the set buffer. If the call failed
  8565. * due to invalid length of the set buffer, returns
  8566. * the amount of storage needed.
  8567. *
  8568. * \retval WLAN_STATUS_SUCCESS
  8569. * \retval WLAN_STATUS_FAILURE
  8570. */
  8571. /*----------------------------------------------------------------------------*/
  8572. WLAN_STATUS
  8573. wlanoidSetNvramWrite(IN P_ADAPTER_T prAdapter,
  8574. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  8575. {
  8576. P_PARAM_CUSTOM_NVRAM_RW_STRUCT_T prNvramRwInfo;
  8577. BOOLEAN fgStatus;
  8578. WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
  8579. DEBUGFUNC("wlanoidSetNvramWrite");
  8580. DBGLOG(OID, LOUD, "\n");
  8581. ASSERT(prAdapter);
  8582. ASSERT(pu4SetInfoLen);
  8583. *pu4SetInfoLen = sizeof(PARAM_CUSTOM_NVRAM_RW_STRUCT_T);
  8584. if (u4SetBufferLen < sizeof(PARAM_CUSTOM_NVRAM_RW_STRUCT_T))
  8585. return WLAN_STATUS_INVALID_LENGTH;
  8586. ASSERT(pvSetBuffer);
  8587. prNvramRwInfo = (P_PARAM_CUSTOM_NVRAM_RW_STRUCT_T) pvSetBuffer;
  8588. fgStatus = kalCfgDataWrite16(prAdapter->prGlueInfo, prNvramRwInfo->ucEepromIndex << 1,
  8589. prNvramRwInfo->u2EepromData); /* change to byte offset */
  8590. if (fgStatus == FALSE) {
  8591. DBGLOG(OID, ERROR, "NVRAM Write Failed.\r\n");
  8592. rStatus = WLAN_STATUS_FAILURE;
  8593. }
  8594. return rStatus;
  8595. } /* wlanoidSetNvramWrite */
  8596. /*----------------------------------------------------------------------------*/
  8597. /*!
  8598. * \brief This routine is called to get the config data source type.
  8599. *
  8600. * \param[in] prAdapter Pointer to the Adapter structure.
  8601. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  8602. * \param[in] u4SetBufferLen The length of the set buffer.
  8603. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  8604. * bytes read from the set buffer. If the call failed
  8605. * due to invalid length of the set buffer, returns
  8606. * the amount of storage needed.
  8607. *
  8608. * \retval WLAN_STATUS_SUCCESS
  8609. * \retval WLAN_STATUS_FAILURE
  8610. */
  8611. /*----------------------------------------------------------------------------*/
  8612. WLAN_STATUS
  8613. wlanoidQueryCfgSrcType(IN P_ADAPTER_T prAdapter,
  8614. OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  8615. {
  8616. ASSERT(prAdapter);
  8617. *pu4QueryInfoLen = sizeof(ENUM_CFG_SRC_TYPE_T);
  8618. if (kalIsConfigurationExist(prAdapter->prGlueInfo) == TRUE)
  8619. *(P_ENUM_CFG_SRC_TYPE_T) pvQueryBuffer = CFG_SRC_TYPE_NVRAM;
  8620. else
  8621. *(P_ENUM_CFG_SRC_TYPE_T) pvQueryBuffer = CFG_SRC_TYPE_EEPROM;
  8622. return WLAN_STATUS_SUCCESS;
  8623. }
  8624. /*----------------------------------------------------------------------------*/
  8625. /*!
  8626. * \brief This routine is called to get the config data source type.
  8627. *
  8628. * \param[in] prAdapter Pointer to the Adapter structure.
  8629. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  8630. * \param[in] u4SetBufferLen The length of the set buffer.
  8631. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  8632. * bytes read from the set buffer. If the call failed
  8633. * due to invalid length of the set buffer, returns
  8634. * the amount of storage needed.
  8635. *
  8636. * \retval WLAN_STATUS_SUCCESS
  8637. * \retval WLAN_STATUS_FAILURE
  8638. */
  8639. /*----------------------------------------------------------------------------*/
  8640. WLAN_STATUS
  8641. wlanoidQueryEepromType(IN P_ADAPTER_T prAdapter,
  8642. OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  8643. {
  8644. ASSERT(prAdapter);
  8645. *pu4QueryInfoLen = sizeof(P_ENUM_EEPROM_TYPE_T);
  8646. #if CFG_SUPPORT_NIC_CAPABILITY
  8647. if (prAdapter->fgIsEepromUsed == TRUE)
  8648. *(P_ENUM_EEPROM_TYPE_T) pvQueryBuffer = EEPROM_TYPE_PRESENT;
  8649. else
  8650. *(P_ENUM_EEPROM_TYPE_T) pvQueryBuffer = EEPROM_TYPE_NO;
  8651. #else
  8652. *(P_ENUM_EEPROM_TYPE_T) pvQueryBuffer = EEPROM_TYPE_NO;
  8653. #endif
  8654. return WLAN_STATUS_SUCCESS;
  8655. }
  8656. /*----------------------------------------------------------------------------*/
  8657. /*!
  8658. * \brief This routine is called to get the config data source type.
  8659. *
  8660. * \param[in] prAdapter Pointer to the Adapter structure.
  8661. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  8662. * \param[in] u4SetBufferLen The length of the set buffer.
  8663. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  8664. * bytes read from the set buffer. If the call failed
  8665. * due to invalid length of the set buffer, returns
  8666. * the amount of storage needed.
  8667. *
  8668. * \retval WLAN_STATUS_SUCCESS
  8669. * \retval WLAN_STATUS_FAILURE
  8670. */
  8671. /*----------------------------------------------------------------------------*/
  8672. WLAN_STATUS
  8673. wlanoidSetCountryCode(IN P_ADAPTER_T prAdapter,
  8674. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  8675. {
  8676. PUINT_8 pucCountry;
  8677. ASSERT(prAdapter);
  8678. ASSERT(pvSetBuffer);
  8679. ASSERT(u4SetBufferLen == 2);
  8680. *pu4SetInfoLen = 2;
  8681. pucCountry = pvSetBuffer;
  8682. prAdapter->rWifiVar.rConnSettings.u2CountryCode = (((UINT_16) pucCountry[0]) << 8) | ((UINT_16) pucCountry[1]);
  8683. /* Force to re-search country code in country domains */
  8684. prAdapter->prDomainInfo = NULL;
  8685. rlmDomainSendCmd(prAdapter, TRUE);
  8686. /* Update supported channel list in channel table based on current country domain */
  8687. wlanUpdateChannelTable(prAdapter->prGlueInfo);
  8688. return WLAN_STATUS_SUCCESS;
  8689. }
  8690. #if 0
  8691. WLAN_STATUS
  8692. wlanoidSetNoaParam(IN P_ADAPTER_T prAdapter,
  8693. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  8694. {
  8695. P_PARAM_CUSTOM_NOA_PARAM_STRUCT_T prNoaParam;
  8696. CMD_CUSTOM_NOA_PARAM_STRUCT_T rCmdNoaParam;
  8697. DEBUGFUNC("wlanoidSetNoaParam");
  8698. DBGLOG(OID, LOUD, "\n");
  8699. ASSERT(prAdapter);
  8700. ASSERT(pu4SetInfoLen);
  8701. *pu4SetInfoLen = sizeof(PARAM_CUSTOM_NOA_PARAM_STRUCT_T);
  8702. if (u4SetBufferLen < sizeof(PARAM_CUSTOM_NOA_PARAM_STRUCT_T))
  8703. return WLAN_STATUS_INVALID_LENGTH;
  8704. ASSERT(pvSetBuffer);
  8705. prNoaParam = (P_PARAM_CUSTOM_NOA_PARAM_STRUCT_T) pvSetBuffer;
  8706. kalMemZero(&rCmdNoaParam, sizeof(CMD_CUSTOM_NOA_PARAM_STRUCT_T));
  8707. rCmdNoaParam.u4NoaDurationMs = prNoaParam->u4NoaDurationMs;
  8708. rCmdNoaParam.u4NoaIntervalMs = prNoaParam->u4NoaIntervalMs;
  8709. rCmdNoaParam.u4NoaCount = prNoaParam->u4NoaCount;
  8710. return wlanSendSetQueryCmd(prAdapter,
  8711. CMD_ID_SET_NOA_PARAM,
  8712. TRUE,
  8713. FALSE,
  8714. TRUE,
  8715. nicCmdEventSetCommon,
  8716. nicOidCmdTimeoutCommon,
  8717. sizeof(CMD_CUSTOM_NOA_PARAM_STRUCT_T),
  8718. (PUINT_8) &rCmdNoaParam, pvSetBuffer, u4SetBufferLen);
  8719. }
  8720. WLAN_STATUS
  8721. wlanoidSetOppPsParam(IN P_ADAPTER_T prAdapter,
  8722. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  8723. {
  8724. P_PARAM_CUSTOM_OPPPS_PARAM_STRUCT_T prOppPsParam;
  8725. CMD_CUSTOM_OPPPS_PARAM_STRUCT_T rCmdOppPsParam;
  8726. DEBUGFUNC("wlanoidSetOppPsParam");
  8727. DBGLOG(OID, LOUD, "\n");
  8728. ASSERT(prAdapter);
  8729. ASSERT(pu4SetInfoLen);
  8730. *pu4SetInfoLen = sizeof(PARAM_CUSTOM_OPPPS_PARAM_STRUCT_T);
  8731. if (u4SetBufferLen < sizeof(PARAM_CUSTOM_OPPPS_PARAM_STRUCT_T))
  8732. return WLAN_STATUS_INVALID_LENGTH;
  8733. ASSERT(pvSetBuffer);
  8734. prOppPsParam = (P_PARAM_CUSTOM_OPPPS_PARAM_STRUCT_T) pvSetBuffer;
  8735. kalMemZero(&rCmdOppPsParam, sizeof(CMD_CUSTOM_OPPPS_PARAM_STRUCT_T));
  8736. rCmdOppPsParam.u4CTwindowMs = prOppPsParam->u4CTwindowMs;
  8737. return wlanSendSetQueryCmd(prAdapter,
  8738. CMD_ID_SET_OPPPS_PARAM,
  8739. TRUE,
  8740. FALSE,
  8741. TRUE,
  8742. nicCmdEventSetCommon,
  8743. nicOidCmdTimeoutCommon,
  8744. sizeof(CMD_CUSTOM_OPPPS_PARAM_STRUCT_T),
  8745. (PUINT_8) &rCmdOppPsParam, pvSetBuffer, u4SetBufferLen);
  8746. }
  8747. WLAN_STATUS
  8748. wlanoidSetUApsdParam(IN P_ADAPTER_T prAdapter,
  8749. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  8750. {
  8751. P_PARAM_CUSTOM_UAPSD_PARAM_STRUCT_T prUapsdParam;
  8752. CMD_CUSTOM_UAPSD_PARAM_STRUCT_T rCmdUapsdParam;
  8753. P_PM_PROFILE_SETUP_INFO_T prPmProfSetupInfo;
  8754. P_BSS_INFO_T prBssInfo;
  8755. DEBUGFUNC("wlanoidSetUApsdParam");
  8756. DBGLOG(OID, LOUD, "\n");
  8757. ASSERT(prAdapter);
  8758. ASSERT(pu4SetInfoLen);
  8759. *pu4SetInfoLen = sizeof(PARAM_CUSTOM_UAPSD_PARAM_STRUCT_T);
  8760. if (u4SetBufferLen < sizeof(PARAM_CUSTOM_UAPSD_PARAM_STRUCT_T))
  8761. return WLAN_STATUS_INVALID_LENGTH;
  8762. ASSERT(pvSetBuffer);
  8763. prBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_P2P_INDEX]);
  8764. prPmProfSetupInfo = &prBssInfo->rPmProfSetupInfo;
  8765. prUapsdParam = (P_PARAM_CUSTOM_UAPSD_PARAM_STRUCT_T) pvSetBuffer;
  8766. kalMemZero(&rCmdUapsdParam, sizeof(CMD_CUSTOM_OPPPS_PARAM_STRUCT_T));
  8767. rCmdUapsdParam.fgEnAPSD = prUapsdParam->fgEnAPSD;
  8768. prAdapter->rWifiVar.fgSupportUAPSD = prUapsdParam->fgEnAPSD;
  8769. rCmdUapsdParam.fgEnAPSD_AcBe = prUapsdParam->fgEnAPSD_AcBe;
  8770. rCmdUapsdParam.fgEnAPSD_AcBk = prUapsdParam->fgEnAPSD_AcBk;
  8771. rCmdUapsdParam.fgEnAPSD_AcVo = prUapsdParam->fgEnAPSD_AcVo;
  8772. rCmdUapsdParam.fgEnAPSD_AcVi = prUapsdParam->fgEnAPSD_AcVi;
  8773. prPmProfSetupInfo->ucBmpDeliveryAC =
  8774. ((prUapsdParam->fgEnAPSD_AcBe << 0) |
  8775. (prUapsdParam->fgEnAPSD_AcBk << 1) |
  8776. (prUapsdParam->fgEnAPSD_AcVi << 2) | (prUapsdParam->fgEnAPSD_AcVo << 3));
  8777. prPmProfSetupInfo->ucBmpTriggerAC =
  8778. ((prUapsdParam->fgEnAPSD_AcBe << 0) |
  8779. (prUapsdParam->fgEnAPSD_AcBk << 1) |
  8780. (prUapsdParam->fgEnAPSD_AcVi << 2) | (prUapsdParam->fgEnAPSD_AcVo << 3));
  8781. rCmdUapsdParam.ucMaxSpLen = prUapsdParam->ucMaxSpLen;
  8782. prPmProfSetupInfo->ucUapsdSp = prUapsdParam->ucMaxSpLen;
  8783. return wlanSendSetQueryCmd(prAdapter,
  8784. CMD_ID_SET_UAPSD_PARAM,
  8785. TRUE,
  8786. FALSE,
  8787. TRUE,
  8788. nicCmdEventSetCommon,
  8789. nicOidCmdTimeoutCommon,
  8790. sizeof(CMD_CUSTOM_OPPPS_PARAM_STRUCT_T),
  8791. (PUINT_8) &rCmdUapsdParam, pvSetBuffer, u4SetBufferLen);
  8792. }
  8793. #endif
  8794. /*----------------------------------------------------------------------------*/
  8795. /*!
  8796. * \brief This routine is called to set BT profile or BT information and the
  8797. * driver will set the built-in PTA configuration into chip.
  8798. *
  8799. *
  8800. * \param[in] prAdapter Pointer to the Adapter structure.
  8801. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  8802. * \param[in] u4SetBufferLen The length of the set buffer.
  8803. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  8804. * bytes read from the set buffer. If the call failed
  8805. * due to invalid length of the set buffer, returns
  8806. * the amount of storage needed.
  8807. *
  8808. * \retval WLAN_STATUS_SUCCESS
  8809. * \retval WLAN_STATUS_INVALID_LENGTH
  8810. */
  8811. /*----------------------------------------------------------------------------*/
  8812. WLAN_STATUS
  8813. wlanoidSetBT(IN P_ADAPTER_T prAdapter, IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  8814. {
  8815. P_PTA_IPC_T prPtaIpc;
  8816. DEBUGFUNC("wlanoidSetBT.\n");
  8817. ASSERT(prAdapter);
  8818. ASSERT(pu4SetInfoLen);
  8819. *pu4SetInfoLen = sizeof(PTA_IPC_T);
  8820. if (u4SetBufferLen != sizeof(PTA_IPC_T)) {
  8821. /* WARNLOG(("Invalid length %ld\n", u4SetBufferLen)); */
  8822. return WLAN_STATUS_INVALID_LENGTH;
  8823. }
  8824. if (prAdapter->rAcpiState == ACPI_STATE_D3) {
  8825. DBGLOG(OID, WARN, "Fail to set BT profile because of ACPI_D3\n");
  8826. return WLAN_STATUS_ADAPTER_NOT_READY;
  8827. }
  8828. ASSERT(pvSetBuffer);
  8829. prPtaIpc = (P_PTA_IPC_T) pvSetBuffer;
  8830. #if CFG_SUPPORT_BCM && CFG_SUPPORT_BCM_BWCS && CFG_SUPPORT_BCM_BWCS_DEBUG
  8831. DBGLOG(OID, INFO, "BCM BWCS CMD: BWCS CMD = %02x%02x%02x%02x\n",
  8832. prPtaIpc->u.aucBTPParams[0], prPtaIpc->u.aucBTPParams[1],
  8833. prPtaIpc->u.aucBTPParams[2], prPtaIpc->u.aucBTPParams[3]);
  8834. DBGLOG(OID, INFO,
  8835. "BCM BWCS CMD: BTPParams[0]=%02x, BTPParams[1]=%02x, BTPParams[2]=%02x, BTPParams[3]=%02x.\n",
  8836. prPtaIpc->u.aucBTPParams[0], prPtaIpc->u.aucBTPParams[1],
  8837. prPtaIpc->u.aucBTPParams[2], prPtaIpc->u.aucBTPParams[3]);
  8838. #endif
  8839. wlanSendSetQueryCmd(prAdapter,
  8840. CMD_ID_SET_BWCS,
  8841. TRUE, FALSE, FALSE, NULL, NULL, sizeof(PTA_IPC_T), (PUINT_8) prPtaIpc, NULL, 0);
  8842. return WLAN_STATUS_SUCCESS;
  8843. }
  8844. /*----------------------------------------------------------------------------*/
  8845. /*!
  8846. * \brief This routine is called to query current BT profile and BTCR values
  8847. *
  8848. * \param[in] prAdapter Pointer to the Adapter structure.
  8849. * \param[in] pvQueryBuffer Pointer to the buffer that holds the result of
  8850. * the query.
  8851. * \param[in] u4QueryBufferLen The length of the query buffer.
  8852. * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
  8853. * bytes written into the query buffer. If the call
  8854. * failed due to invalid length of the query buffer,
  8855. * returns the amount of storage needed.
  8856. *
  8857. * \retval WLAN_STATUS_SUCCESS
  8858. * \retval WLAN_STATUS_INVALID_LENGTH
  8859. */
  8860. /*----------------------------------------------------------------------------*/
  8861. WLAN_STATUS
  8862. wlanoidQueryBT(IN P_ADAPTER_T prAdapter,
  8863. OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  8864. {
  8865. /* P_PARAM_PTA_IPC_T prPtaIpc; */
  8866. /* UINT_32 u4QueryBuffLen; */
  8867. ASSERT(prAdapter);
  8868. ASSERT(pu4QueryInfoLen);
  8869. if (u4QueryBufferLen)
  8870. ASSERT(pvQueryBuffer);
  8871. *pu4QueryInfoLen = sizeof(PTA_IPC_T);
  8872. /* Check for query buffer length */
  8873. if (u4QueryBufferLen != sizeof(PTA_IPC_T)) {
  8874. DBGLOG(OID, WARN, "Invalid length %u\n", u4QueryBufferLen);
  8875. return WLAN_STATUS_INVALID_LENGTH;
  8876. }
  8877. ASSERT(pvQueryBuffer);
  8878. /* prPtaIpc = (P_PTA_IPC_T)pvQueryBuffer; */
  8879. /* prPtaIpc->ucCmd = BT_CMD_PROFILE; */
  8880. /* prPtaIpc->ucLen = sizeof(prPtaIpc->u); */
  8881. /* nicPtaGetProfile(prAdapter, (PUINT_8)&prPtaIpc->u, &u4QueryBuffLen); */
  8882. return WLAN_STATUS_SUCCESS;
  8883. }
  8884. #if 0
  8885. WLAN_STATUS
  8886. wlanoidQueryBtSingleAntenna(IN P_ADAPTER_T prAdapter,
  8887. OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  8888. {
  8889. P_PTA_INFO_T prPtaInfo;
  8890. PUINT_32 pu4SingleAntenna;
  8891. ASSERT(prAdapter);
  8892. ASSERT(pu4QueryInfoLen);
  8893. if (u4QueryBufferLen)
  8894. ASSERT(pvQueryBuffer);
  8895. *pu4QueryInfoLen = sizeof(UINT_32);
  8896. /* Check for query buffer length */
  8897. if (u4QueryBufferLen != sizeof(UINT_32)) {
  8898. DBGLOG(OID, WARN, "Invalid length %u\n", u4QueryBufferLen);
  8899. return WLAN_STATUS_INVALID_LENGTH;
  8900. }
  8901. ASSERT(pvQueryBuffer);
  8902. prPtaInfo = &prAdapter->rPtaInfo;
  8903. pu4SingleAntenna = (PUINT_32) pvQueryBuffer;
  8904. if (prPtaInfo->fgSingleAntenna) {
  8905. /* DBGLOG(OID, INFO, (KERN_WARNING DRV_NAME"Q Single Ant = 1\r\n")); */
  8906. *pu4SingleAntenna = 1;
  8907. } else {
  8908. /* DBGLOG(OID, INFO, (KERN_WARNING DRV_NAME"Q Single Ant = 0\r\n")); */
  8909. *pu4SingleAntenna = 0;
  8910. }
  8911. return WLAN_STATUS_SUCCESS;
  8912. }
  8913. WLAN_STATUS
  8914. wlanoidSetBtSingleAntenna(IN P_ADAPTER_T prAdapter,
  8915. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  8916. {
  8917. PUINT_32 pu4SingleAntenna;
  8918. UINT_32 u4SingleAntenna;
  8919. P_PTA_INFO_T prPtaInfo;
  8920. ASSERT(prAdapter);
  8921. ASSERT(pu4SetInfoLen);
  8922. prPtaInfo = &prAdapter->rPtaInfo;
  8923. *pu4SetInfoLen = sizeof(UINT_32);
  8924. if (u4SetBufferLen != sizeof(UINT_32))
  8925. return WLAN_STATUS_INVALID_LENGTH;
  8926. if (IS_ARB_IN_RFTEST_STATE(prAdapter))
  8927. return WLAN_STATUS_SUCCESS;
  8928. if (prAdapter->rAcpiState == ACPI_STATE_D3) {
  8929. DBGLOG(OID, WARN, "Fail to set antenna because of ACPI_D3\n");
  8930. return WLAN_STATUS_ADAPTER_NOT_READY;
  8931. }
  8932. ASSERT(pvSetBuffer);
  8933. pu4SingleAntenna = (PUINT_32) pvSetBuffer;
  8934. u4SingleAntenna = *pu4SingleAntenna;
  8935. if (u4SingleAntenna == 0) {
  8936. /* DBGLOG(OID, INFO, (KERN_WARNING DRV_NAME"Set Single Ant = 0\r\n")); */
  8937. prPtaInfo->fgSingleAntenna = FALSE;
  8938. } else {
  8939. /* DBGLOG(OID, INFO, (KERN_WARNING DRV_NAME"Set Single Ant = 1\r\n")); */
  8940. prPtaInfo->fgSingleAntenna = TRUE;
  8941. }
  8942. ptaFsmRunEventSetConfig(prAdapter, &prPtaInfo->rPtaParam);
  8943. return WLAN_STATUS_SUCCESS;
  8944. }
  8945. #if CFG_SUPPORT_BCM && CFG_SUPPORT_BCM_BWCS
  8946. WLAN_STATUS
  8947. wlanoidQueryPta(IN P_ADAPTER_T prAdapter,
  8948. OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  8949. {
  8950. P_PTA_INFO_T prPtaInfo;
  8951. PUINT_32 pu4Pta;
  8952. ASSERT(prAdapter);
  8953. ASSERT(pu4QueryInfoLen);
  8954. if (u4QueryBufferLen)
  8955. ASSERT(pvQueryBuffer);
  8956. *pu4QueryInfoLen = sizeof(UINT_32);
  8957. /* Check for query buffer length */
  8958. if (u4QueryBufferLen != sizeof(UINT_32)) {
  8959. DBGLOG(OID, WARN, "Invalid length %u\n", u4QueryBufferLen);
  8960. return WLAN_STATUS_INVALID_LENGTH;
  8961. }
  8962. ASSERT(pvQueryBuffer);
  8963. prPtaInfo = &prAdapter->rPtaInfo;
  8964. pu4Pta = (PUINT_32) pvQueryBuffer;
  8965. if (prPtaInfo->fgEnabled) {
  8966. /* DBGLOG(OID, INFO, (KERN_WARNING DRV_NAME"PTA = 1\r\n")); */
  8967. *pu4Pta = 1;
  8968. } else {
  8969. /* DBGLOG(OID, INFO, (KERN_WARNING DRV_NAME"PTA = 0\r\n")); */
  8970. *pu4Pta = 0;
  8971. }
  8972. return WLAN_STATUS_SUCCESS;
  8973. }
  8974. WLAN_STATUS
  8975. wlanoidSetPta(IN P_ADAPTER_T prAdapter, IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  8976. {
  8977. PUINT_32 pu4PtaCtrl;
  8978. UINT_32 u4PtaCtrl;
  8979. ASSERT(prAdapter);
  8980. ASSERT(pu4SetInfoLen);
  8981. *pu4SetInfoLen = sizeof(UINT_32);
  8982. if (u4SetBufferLen != sizeof(UINT_32))
  8983. return WLAN_STATUS_INVALID_LENGTH;
  8984. if (IS_ARB_IN_RFTEST_STATE(prAdapter))
  8985. return WLAN_STATUS_SUCCESS;
  8986. if (prAdapter->rAcpiState == ACPI_STATE_D3) {
  8987. DBGLOG(OID, WARN, "Fail to set BT setting because of ACPI_D3\n");
  8988. return WLAN_STATUS_ADAPTER_NOT_READY;
  8989. }
  8990. ASSERT(pvSetBuffer);
  8991. pu4PtaCtrl = (PUINT_32) pvSetBuffer;
  8992. u4PtaCtrl = *pu4PtaCtrl;
  8993. if (u4PtaCtrl == 0) {
  8994. /* DBGLOG(OID, INFO, (KERN_WARNING DRV_NAME"Set Pta= 0\r\n")); */
  8995. nicPtaSetFunc(prAdapter, FALSE);
  8996. } else {
  8997. /* DBGLOG(OID, INFO, (KERN_WARNING DRV_NAME"Set Pta= 1\r\n")); */
  8998. nicPtaSetFunc(prAdapter, TRUE);
  8999. }
  9000. return WLAN_STATUS_SUCCESS;
  9001. }
  9002. #endif
  9003. #endif
  9004. /*----------------------------------------------------------------------------*/
  9005. /*!
  9006. * \brief This routine is called to set Tx power profile.
  9007. *
  9008. *
  9009. * \param[in] prAdapter Pointer to the Adapter structure.
  9010. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  9011. * \param[in] u4SetBufferLen The length of the set buffer.
  9012. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  9013. * bytes read from the set buffer. If the call failed
  9014. * due to invalid length of the set buffer, returns
  9015. * the amount of storage needed.
  9016. *
  9017. * \retval WLAN_STATUS_SUCCESS
  9018. * \retval WLAN_STATUS_INVALID_LENGTH
  9019. */
  9020. /*----------------------------------------------------------------------------*/
  9021. WLAN_STATUS
  9022. wlanoidSetTxPower(IN P_ADAPTER_T prAdapter, IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  9023. {
  9024. P_SET_TXPWR_CTRL_T pTxPwr = (P_SET_TXPWR_CTRL_T) pvSetBuffer;
  9025. P_SET_TXPWR_CTRL_T prCmd;
  9026. UINT_32 i;
  9027. WLAN_STATUS rStatus;
  9028. DEBUGFUNC("wlanoidSetTxPower");
  9029. DBGLOG(OID, LOUD, "\r\n");
  9030. prCmd = cnmMemAlloc(prAdapter, RAM_TYPE_BUF, sizeof(SET_TXPWR_CTRL_T));
  9031. kalMemZero(prCmd, sizeof(SET_TXPWR_CTRL_T));
  9032. prCmd->c2GLegacyStaPwrOffset = pTxPwr->c2GLegacyStaPwrOffset;
  9033. prCmd->c2GHotspotPwrOffset = pTxPwr->c2GHotspotPwrOffset;
  9034. prCmd->c2GP2pPwrOffset = pTxPwr->c2GP2pPwrOffset;
  9035. prCmd->c2GBowPwrOffset = pTxPwr->c2GBowPwrOffset;
  9036. prCmd->c5GLegacyStaPwrOffset = pTxPwr->c5GLegacyStaPwrOffset;
  9037. prCmd->c5GHotspotPwrOffset = pTxPwr->c5GHotspotPwrOffset;
  9038. prCmd->c5GP2pPwrOffset = pTxPwr->c5GP2pPwrOffset;
  9039. prCmd->c5GBowPwrOffset = pTxPwr->c5GBowPwrOffset;
  9040. prCmd->ucConcurrencePolicy = pTxPwr->ucConcurrencePolicy;
  9041. for (i = 0; i < 14; i++)
  9042. prCmd->acTxPwrLimit2G[i] = pTxPwr->acTxPwrLimit2G[i];
  9043. for (i = 0; i < 4; i++)
  9044. prCmd->acTxPwrLimit5G[i] = pTxPwr->acTxPwrLimit5G[i];
  9045. ASSERT(prAdapter);
  9046. ASSERT(pvSetBuffer);
  9047. #if 0
  9048. DBGLOG(OID, INFO, "c2GLegacyStaPwrOffset=%d\n", pTxPwr->c2GLegacyStaPwrOffset);
  9049. DBGLOG(OID, INFO, "c2GHotspotPwrOffset=%d\n", pTxPwr->c2GHotspotPwrOffset);
  9050. DBGLOG(OID, INFO, "c2GP2pPwrOffset=%d\n", pTxPwr->c2GP2pPwrOffset);
  9051. DBGLOG(OID, INFO, "c2GBowPwrOffset=%d\n", pTxPwr->c2GBowPwrOffset);
  9052. DBGLOG(OID, INFO, "c5GLegacyStaPwrOffset=%d\n", pTxPwr->c5GLegacyStaPwrOffset);
  9053. DBGLOG(OID, INFO, "c5GHotspotPwrOffset=%d\n", pTxPwr->c5GHotspotPwrOffset);
  9054. DBGLOG(OID, INFO, "c5GP2pPwrOffset=%d\n", pTxPwr->c5GP2pPwrOffset);
  9055. DBGLOG(OID, INFO, "c5GBowPwrOffset=%d\n", pTxPwr->c5GBowPwrOffset);
  9056. DBGLOG(OID, INFO, "ucConcurrencePolicy=%d\n", pTxPwr->ucConcurrencePolicy);
  9057. for (i = 0; i < 14; i++)
  9058. DBGLOG(OID, INFO, "acTxPwrLimit2G[%d]=%d\n", i, pTxPwr->acTxPwrLimit2G[i]);
  9059. for (i = 0; i < 4; i++)
  9060. DBGLOG(OID, INFO, "acTxPwrLimit5G[%d]=%d\n", i, pTxPwr->acTxPwrLimit5G[i]);
  9061. #endif
  9062. rStatus = wlanSendSetQueryCmd(prAdapter, /* prAdapter */
  9063. CMD_ID_SET_TXPWR_CTRL, /* ucCID */
  9064. TRUE, /* fgSetQuery */
  9065. FALSE, /* fgNeedResp */
  9066. TRUE, /* fgIsOid */
  9067. nicCmdEventSetCommon, nicOidCmdTimeoutCommon, sizeof(SET_TXPWR_CTRL_T),
  9068. (PUINT_8) prCmd, /* pucInfoBuffer */
  9069. NULL, /* pvSetQueryBuffer */
  9070. 0 /* u4SetQueryBufferLen */
  9071. );
  9072. /* ASSERT(rStatus == WLAN_STATUS_PENDING); */
  9073. cnmMemFree(prAdapter, prCmd);
  9074. return rStatus;
  9075. }
  9076. WLAN_STATUS wlanSendMemDumpCmd(IN P_ADAPTER_T prAdapter, IN PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen)
  9077. {
  9078. P_PARAM_CUSTOM_MEM_DUMP_STRUCT_T prMemDumpInfo;
  9079. P_CMD_DUMP_MEM prCmdDumpMem;
  9080. CMD_DUMP_MEM rCmdDumpMem;
  9081. WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
  9082. UINT_32 u4MemSize = PARAM_MEM_DUMP_MAX_SIZE;
  9083. UINT_32 u4RemainLeng = 0;
  9084. UINT_32 u4CurAddr = 0;
  9085. UINT_8 ucFragNum = 0;
  9086. prCmdDumpMem = &rCmdDumpMem;
  9087. prMemDumpInfo = (P_PARAM_CUSTOM_MEM_DUMP_STRUCT_T) pvQueryBuffer;
  9088. u4RemainLeng = prMemDumpInfo->u4RemainLength;
  9089. u4CurAddr = prMemDumpInfo->u4Address + prMemDumpInfo->u4Length;
  9090. ucFragNum = prMemDumpInfo->ucFragNum + 1;
  9091. /* Query. If request length is larger than max length, do it as ping pong.
  9092. * Send a command and wait for a event. Send next command while the event is received.
  9093. *
  9094. */
  9095. do {
  9096. UINT_32 u4CurLeng = 0;
  9097. if (u4RemainLeng > u4MemSize) {
  9098. u4CurLeng = u4MemSize;
  9099. u4RemainLeng -= u4MemSize;
  9100. } else {
  9101. u4CurLeng = u4RemainLeng;
  9102. u4RemainLeng = 0;
  9103. }
  9104. prCmdDumpMem->u4Address = u4CurAddr;
  9105. prCmdDumpMem->u4Length = u4CurLeng;
  9106. prCmdDumpMem->u4RemainLength = u4RemainLeng;
  9107. prCmdDumpMem->ucFragNum = ucFragNum;
  9108. DBGLOG(OID, TRACE, "[%d] 0x%lX, len %lu, remain len %lu\n",
  9109. ucFragNum, prCmdDumpMem->u4Address, prCmdDumpMem->u4Length, prCmdDumpMem->u4RemainLength);
  9110. rStatus = wlanSendSetQueryCmd(prAdapter,
  9111. CMD_ID_DUMP_MEM,
  9112. FALSE,
  9113. TRUE,
  9114. TRUE,
  9115. nicCmdEventQueryMemDump,
  9116. nicOidCmdTimeoutCommon,
  9117. sizeof(CMD_DUMP_MEM),
  9118. (PUINT_8) prCmdDumpMem, pvQueryBuffer, u4QueryBufferLen);
  9119. } while (FALSE);
  9120. return rStatus;
  9121. }
  9122. /*----------------------------------------------------------------------------*/
  9123. /*!
  9124. * \brief This routine is called to dump memory.
  9125. *
  9126. * \param[in] pvAdapter Pointer to the Adapter structure.
  9127. * \param[out] pvQueryBuf A pointer to the buffer that holds the result of
  9128. * the query.
  9129. * \param[in] u4QueryBufLen The length of the query buffer.
  9130. * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
  9131. * bytes written into the query buffer. If the call
  9132. * failed due to invalid length of the query buffer,
  9133. * returns the amount of storage needed.
  9134. *
  9135. * \retval WLAN_STATUS_SUCCESS
  9136. * \retval WLAN_STATUS_INVALID_LENGTH
  9137. */
  9138. /*----------------------------------------------------------------------------*/
  9139. WLAN_STATUS
  9140. wlanoidQueryMemDump(IN P_ADAPTER_T prAdapter,
  9141. IN PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  9142. {
  9143. P_PARAM_CUSTOM_MEM_DUMP_STRUCT_T prMemDumpInfo;
  9144. DEBUGFUNC("wlanoidQueryMemDump");
  9145. DBGLOG(OID, LOUD, "\n");
  9146. ASSERT(prAdapter);
  9147. ASSERT(pu4QueryInfoLen);
  9148. if (u4QueryBufferLen)
  9149. ASSERT(pvQueryBuffer);
  9150. *pu4QueryInfoLen = sizeof(UINT_32);
  9151. prMemDumpInfo = (P_PARAM_CUSTOM_MEM_DUMP_STRUCT_T) pvQueryBuffer;
  9152. DBGLOG(OID, TRACE, "Dump 0x%lX, len %lu\n", prMemDumpInfo->u4Address, prMemDumpInfo->u4Length);
  9153. prMemDumpInfo->u4RemainLength = prMemDumpInfo->u4Length;
  9154. prMemDumpInfo->u4Length = 0;
  9155. prMemDumpInfo->ucFragNum = 0;
  9156. return wlanSendMemDumpCmd(prAdapter, pvQueryBuffer, u4QueryBufferLen);
  9157. } /* end of wlanoidQueryMcrRead() */
  9158. #if CFG_ENABLE_WIFI_DIRECT
  9159. /*----------------------------------------------------------------------------*/
  9160. /*!
  9161. * \brief This routine is used to set the p2p mode.
  9162. *
  9163. * \param[in] pvAdapter Pointer to the Adapter structure.
  9164. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  9165. * \param[in] u4SetBufferLen The length of the set buffer.
  9166. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  9167. * bytes read from the set buffer. If the call failed
  9168. * due to invalid length of the set buffer, returns
  9169. * the amount of storage needed.
  9170. *
  9171. * \retval WLAN_STATUS_SUCCESS
  9172. * \retval WLAN_STATUS_INVALID_LENGTH
  9173. */
  9174. /*----------------------------------------------------------------------------*/
  9175. WLAN_STATUS
  9176. wlanoidSetP2pMode(IN P_ADAPTER_T prAdapter, IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  9177. {
  9178. WLAN_STATUS status = WLAN_STATUS_SUCCESS;
  9179. P_PARAM_CUSTOM_P2P_SET_STRUCT_T prSetP2P = (P_PARAM_CUSTOM_P2P_SET_STRUCT_T) NULL;
  9180. /* P_MSG_P2P_NETDEV_REGISTER_T prP2pNetdevRegMsg = (P_MSG_P2P_NETDEV_REGISTER_T)NULL; */
  9181. DEBUGFUNC("wlanoidSetP2pMode");
  9182. ASSERT(prAdapter);
  9183. ASSERT(pu4SetInfoLen);
  9184. *pu4SetInfoLen = sizeof(PARAM_CUSTOM_P2P_SET_STRUCT_T);
  9185. if (u4SetBufferLen < sizeof(PARAM_CUSTOM_P2P_SET_STRUCT_T)) {
  9186. DBGLOG(OID, WARN, "Invalid length %u\n", u4SetBufferLen);
  9187. return WLAN_STATUS_INVALID_LENGTH;
  9188. }
  9189. prSetP2P = (P_PARAM_CUSTOM_P2P_SET_STRUCT_T) pvSetBuffer;
  9190. DBGLOG(P2P, INFO, "Set P2P enable %p [%u] mode[%u]\n", prSetP2P, prSetP2P->u4Enable, prSetP2P->u4Mode);
  9191. /*
  9192. * enable = 1, mode = 0 => init P2P network
  9193. * enable = 1, mode = 1 => init Soft AP network
  9194. * enable = 0 => uninit P2P/AP network
  9195. */
  9196. if (prSetP2P->u4Enable) {
  9197. p2pSetMode((prSetP2P->u4Mode == 1) ? TRUE : FALSE);
  9198. if (p2pLaunch(prAdapter->prGlueInfo)) {
  9199. /* ToDo:: ASSERT */
  9200. ASSERT(prAdapter->fgIsP2PRegistered);
  9201. } else {
  9202. status = WLAN_STATUS_FAILURE;
  9203. }
  9204. } else {
  9205. if (prAdapter->fgIsP2PRegistered) {
  9206. DBGLOG(P2P, INFO, "p2pRemove\n");
  9207. p2pRemove(prAdapter->prGlueInfo);
  9208. }
  9209. }
  9210. #if 0
  9211. prP2pNetdevRegMsg = (P_MSG_P2P_NETDEV_REGISTER_T) cnmMemAlloc(prAdapter,
  9212. RAM_TYPE_MSG,
  9213. (sizeof(MSG_P2P_NETDEV_REGISTER_T)));
  9214. if (prP2pNetdevRegMsg == NULL) {
  9215. ASSERT(FALSE);
  9216. status = WLAN_STATUS_RESOURCES;
  9217. return status;
  9218. }
  9219. prP2pNetdevRegMsg->rMsgHdr.eMsgId = MID_MNY_P2P_NET_DEV_REGISTER;
  9220. prP2pNetdevRegMsg->fgIsEnable = (prSetP2P->u4Enable == 1) ? TRUE : FALSE;
  9221. prP2pNetdevRegMsg->ucMode = (UINT_8) prSetP2P->u4Mode;
  9222. mboxSendMsg(prAdapter, MBOX_ID_0, (P_MSG_HDR_T) prP2pNetdevRegMsg, MSG_SEND_METHOD_BUF);
  9223. #endif
  9224. return status;
  9225. }
  9226. #endif
  9227. /*----------------------------------------------------------------------------*/
  9228. /*!
  9229. * \brief This routine is called to set the default key
  9230. *
  9231. * \param[in] prAdapter Pointer to the Adapter structure.
  9232. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  9233. * \param[in] u4SetBufferLen The length of the set buffer.
  9234. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  9235. * bytes read from the set buffer. If the call failed
  9236. * due to invalid length of the set buffer, returns
  9237. * the amount of storage needed.
  9238. *
  9239. * \retval WLAN_STATUS_SUCCESS
  9240. * \retval WLAN_STATUS_ADAPTER_NOT_READY
  9241. * \retval WLAN_STATUS_INVALID_LENGTH
  9242. * \retval WLAN_STATUS_INVALID_DATA
  9243. *
  9244. * \note The setting buffer PARAM_KEY_T, which is set by NDIS, is unpacked.
  9245. */
  9246. /*----------------------------------------------------------------------------*/
  9247. WLAN_STATUS
  9248. wlanoidSetDefaultKey(IN P_ADAPTER_T prAdapter,
  9249. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  9250. {
  9251. P_GLUE_INFO_T prGlueInfo;
  9252. P_CMD_INFO_T prCmdInfo;
  9253. P_WIFI_CMD_T prWifiCmd;
  9254. P_PARAM_DEFAULT_KEY_T prDefaultKey;
  9255. P_CMD_DEFAULT_KEY prCmdDefaultKey;
  9256. UINT_8 ucCmdSeqNum;
  9257. DEBUGFUNC("wlanoidSetDefaultKey");
  9258. DBGLOG(OID, LOUD, "\n");
  9259. ASSERT(prAdapter);
  9260. ASSERT(pvSetBuffer);
  9261. ASSERT(pu4SetInfoLen);
  9262. if (prAdapter->rAcpiState == ACPI_STATE_D3) {
  9263. DBGLOG(OID, WARN, "Fail in set add key! (Adapter not ready). ACPI=D%d, Radio=%d\n",
  9264. prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
  9265. return WLAN_STATUS_ADAPTER_NOT_READY;
  9266. }
  9267. prDefaultKey = (P_PARAM_DEFAULT_KEY_T) pvSetBuffer;
  9268. *pu4SetInfoLen = u4SetBufferLen;
  9269. /* Dump PARAM_DEFAULT_KEY_T content. */
  9270. DBGLOG(OID, TRACE, "Key Index : %d\n", prDefaultKey->ucKeyID);
  9271. DBGLOG(OID, TRACE, "Unicast Key : %d\n", prDefaultKey->ucUnicast);
  9272. DBGLOG(OID, TRACE, "Multicast Key : %d\n", prDefaultKey->ucMulticast);
  9273. /* prWlanTable = prAdapter->rWifiVar.arWtbl; */
  9274. prGlueInfo = prAdapter->prGlueInfo;
  9275. prCmdInfo = cmdBufAllocateCmdInfo(prAdapter, (CMD_HDR_SIZE + sizeof(CMD_DEFAULT_KEY)));
  9276. if (!prCmdInfo) {
  9277. DBGLOG(INIT, ERROR, "Allocate CMD_INFO_T ==> FAILED.\n");
  9278. return WLAN_STATUS_FAILURE;
  9279. }
  9280. /* increase command sequence number */
  9281. ucCmdSeqNum = nicIncreaseCmdSeqNum(prAdapter);
  9282. DBGLOG(OID, INFO, "ucCmdSeqNum = %d\n", ucCmdSeqNum);
  9283. /* compose CMD_802_11_KEY cmd pkt */
  9284. prCmdInfo->eCmdType = COMMAND_TYPE_NETWORK_IOCTL;
  9285. prCmdInfo->ucBssIndex = prAdapter->prAisBssInfo->ucBssIndex;
  9286. prCmdInfo->u2InfoBufLen = CMD_HDR_SIZE + sizeof(CMD_DEFAULT_KEY);
  9287. prCmdInfo->pfCmdDoneHandler = nicCmdEventSetCommon;
  9288. prCmdInfo->pfCmdTimeoutHandler = nicOidCmdTimeoutCommon;
  9289. prCmdInfo->fgIsOid = TRUE;
  9290. prCmdInfo->ucCID = CMD_ID_DEFAULT_KEY_ID;
  9291. prCmdInfo->fgSetQuery = TRUE;
  9292. prCmdInfo->fgNeedResp = FALSE;
  9293. prCmdInfo->fgDriverDomainMCR = FALSE;
  9294. prCmdInfo->ucCmdSeqNum = ucCmdSeqNum;
  9295. prCmdInfo->u4SetInfoLen = u4SetBufferLen;
  9296. prCmdInfo->pvInformationBuffer = pvSetBuffer;
  9297. prCmdInfo->u4InformationBufferLength = u4SetBufferLen;
  9298. /* Setup WIFI_CMD_T */
  9299. prWifiCmd = (P_WIFI_CMD_T) (prCmdInfo->pucInfoBuffer);
  9300. prWifiCmd->u2TxByteCount = prCmdInfo->u2InfoBufLen;
  9301. prWifiCmd->u2PQ_ID = CMD_PQ_ID;
  9302. prWifiCmd->ucPktTypeID = CMD_PACKET_TYPE_ID;
  9303. prWifiCmd->ucCID = prCmdInfo->ucCID;
  9304. prWifiCmd->ucSetQuery = prCmdInfo->fgSetQuery;
  9305. prWifiCmd->ucSeqNum = prCmdInfo->ucCmdSeqNum;
  9306. prCmdDefaultKey = (P_CMD_DEFAULT_KEY) (prWifiCmd->aucBuffer);
  9307. kalMemZero(prCmdDefaultKey, sizeof(CMD_DEFAULT_KEY));
  9308. prCmdDefaultKey->ucBssIdx = prAdapter->prAisBssInfo->ucBssIndex;
  9309. prCmdDefaultKey->ucKeyId = prDefaultKey->ucKeyID;
  9310. prCmdDefaultKey->ucUnicast = prDefaultKey->ucUnicast;
  9311. prCmdDefaultKey->ucMulticast = prDefaultKey->ucMulticast;
  9312. if (prDefaultKey->ucMulticast) {
  9313. prAdapter->prAisBssInfo->fgTxBcKeyExist = TRUE;
  9314. prAdapter->prAisBssInfo->ucTxDefaultKeyID = prDefaultKey->ucKeyID;
  9315. /* prBssInfo->ucBMCWlanIndex = secPrivacySeekForBcEntry(prAdapter, prBssInfo->ucBssIndex, */
  9316. /* NETWORK_TYPE_AIS, prCmdKey->aucPeerAddr, prCmdKey->ucAlgorithmId, prCmdKey->ucKeyId, */
  9317. /* prBssInfo->ucCurrentGtkId, BIT(1)); */
  9318. /* prCmdDefaultKey->ucBMCWlanIndex = prBssInfo->ucBMCWlanIndex; */
  9319. } else {
  9320. ASSERT(FALSE);
  9321. }
  9322. /* insert into prCmdQueue */
  9323. kalEnqueueCommand(prGlueInfo, (P_QUE_ENTRY_T) prCmdInfo);
  9324. /* wakeup txServiceThread later */
  9325. GLUE_SET_EVENT(prGlueInfo);
  9326. return WLAN_STATUS_PENDING;
  9327. } /* wlanoidSetDefaultKey */
  9328. /*----------------------------------------------------------------------------*/
  9329. /*!
  9330. * \brief This routine is called to set the GTK rekey data
  9331. *
  9332. * \param[in] prAdapter Pointer to the Adapter structure.
  9333. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  9334. * \param[in] u4SetBufferLen The length of the set buffer.
  9335. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  9336. * bytes read from the set buffer. If the call failed
  9337. * due to invalid length of the set buffer, returns
  9338. * the amount of storage needed.
  9339. *
  9340. * \retval WLAN_STATUS_SUCCESS
  9341. * \retval WLAN_STATUS_BUFFER_TOO_SHORT
  9342. * \retval WLAN_STATUS_INVALID_DATA
  9343. */
  9344. /*----------------------------------------------------------------------------*/
  9345. WLAN_STATUS
  9346. wlanoidSetGtkRekeyData(IN P_ADAPTER_T prAdapter,
  9347. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  9348. {
  9349. CMD_GTK_REKEY_DATA_T rCmdContent;
  9350. WLAN_STATUS rStatus;
  9351. ASSERT(prAdapter);
  9352. kalMemCopy(&rCmdContent, (PUINT_8) pvSetBuffer, u4SetBufferLen);
  9353. rStatus = wlanSendSetQueryCmd(prAdapter, /* prAdapter */
  9354. CMD_ID_SET_GTK_REKEY_DATA, /* ucCID */
  9355. TRUE, /* fgSetQuery */
  9356. FALSE, /* fgNeedResp */
  9357. TRUE, /* fgIsOid */
  9358. NULL, /* pfCmdDoneHandler */
  9359. NULL, /* pfCmdTimeoutHandler */
  9360. sizeof(CMD_GTK_REKEY_DATA_T), /* u4SetQueryInfoLen */
  9361. (PUINT_8) &rCmdContent, /* pucInfoBuffer */
  9362. NULL, /* pvSetQueryBuffer */
  9363. 0 /* u4SetQueryBufferLen */
  9364. );
  9365. /* ASSERT(rStatus == WLAN_STATUS_PENDING); */
  9366. return rStatus;
  9367. } /* wlanoidSetGtkRekeyData */
  9368. /*----------------------------------------------------------------------------*/
  9369. /*!
  9370. * \brief This routine is called to request starting of schedule scan
  9371. *
  9372. * \param[in] prAdapter Pointer to the Adapter structure.
  9373. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  9374. * \param[in] u4SetBufferLen The length of the set buffer.
  9375. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  9376. * bytes read from the set buffer. If the call failed
  9377. * due to invalid length of the set buffer, returns
  9378. * the amount of storage needed.
  9379. *
  9380. * \retval WLAN_STATUS_SUCCESS
  9381. * \retval WLAN_STATUS_ADAPTER_NOT_READY
  9382. * \retval WLAN_STATUS_INVALID_LENGTH
  9383. * \retval WLAN_STATUS_INVALID_DATA
  9384. *
  9385. * \note The setting buffer PARAM_SCHED_SCAN_REQUEST_EXT_T
  9386. */
  9387. /*----------------------------------------------------------------------------*/
  9388. WLAN_STATUS
  9389. wlanoidSetStartSchedScan(IN P_ADAPTER_T prAdapter,
  9390. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  9391. {
  9392. P_PARAM_SCHED_SCAN_REQUEST prSchedScanRequest;
  9393. DEBUGFUNC("wlanoidSetStartSchedScan()");
  9394. if (prAdapter->rAcpiState == ACPI_STATE_D3) {
  9395. DBGLOG(OID, WARN,
  9396. "Fail in set scheduled scan! (Adapter not ready). ACPI=D%d, Radio=%d\n",
  9397. prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
  9398. return WLAN_STATUS_ADAPTER_NOT_READY;
  9399. }
  9400. ASSERT(pu4SetInfoLen);
  9401. *pu4SetInfoLen = 0;
  9402. if (u4SetBufferLen != sizeof(PARAM_SCHED_SCAN_REQUEST))
  9403. return WLAN_STATUS_INVALID_LENGTH;
  9404. else if (pvSetBuffer == NULL)
  9405. return WLAN_STATUS_INVALID_DATA;
  9406. else if (kalGetMediaStateIndicated(prAdapter->prGlueInfo) == PARAM_MEDIA_STATE_CONNECTED
  9407. && prAdapter->fgEnOnlineScan == FALSE)
  9408. return WLAN_STATUS_FAILURE;
  9409. if (prAdapter->fgIsRadioOff) {
  9410. DBGLOG(OID, WARN, "Return from BSSID list scan! (radio off). ACPI=D%d, Radio=%d\n",
  9411. prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
  9412. return WLAN_STATUS_SUCCESS;
  9413. }
  9414. prSchedScanRequest = (P_PARAM_SCHED_SCAN_REQUEST) pvSetBuffer;
  9415. if (scnFsmSchedScanRequest(prAdapter,
  9416. (UINT_8) (prSchedScanRequest->u4SsidNum),
  9417. prSchedScanRequest->arSsid,
  9418. prSchedScanRequest->u4IELength,
  9419. prSchedScanRequest->pucIE, prSchedScanRequest->u2ScanInterval) == TRUE)
  9420. return WLAN_STATUS_PENDING;
  9421. else
  9422. return WLAN_STATUS_FAILURE;
  9423. }
  9424. /*----------------------------------------------------------------------------*/
  9425. /*!
  9426. * \brief This routine is called to request termination of schedule scan
  9427. *
  9428. * \param[in] prAdapter Pointer to the Adapter structure.
  9429. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  9430. * \param[in] u4SetBufferLen The length of the set buffer.
  9431. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  9432. * bytes read from the set buffer. If the call failed
  9433. * due to invalid length of the set buffer, returns
  9434. * the amount of storage needed.
  9435. *
  9436. * \retval WLAN_STATUS_SUCCESS
  9437. * \retval WLAN_STATUS_ADAPTER_NOT_READY
  9438. * \retval WLAN_STATUS_INVALID_LENGTH
  9439. * \retval WLAN_STATUS_INVALID_DATA
  9440. *
  9441. * \note The setting buffer PARAM_SCHED_SCAN_REQUEST_EXT_T
  9442. */
  9443. /*----------------------------------------------------------------------------*/
  9444. WLAN_STATUS
  9445. wlanoidSetStopSchedScan(IN P_ADAPTER_T prAdapter,
  9446. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  9447. {
  9448. ASSERT(prAdapter);
  9449. /* ask SCN module to stop scan request */
  9450. if (scnFsmSchedScanStopRequest(prAdapter) == TRUE)
  9451. return WLAN_STATUS_PENDING;
  9452. else
  9453. return WLAN_STATUS_FAILURE;
  9454. }
  9455. #if CFG_M0VE_BA_TO_DRIVER
  9456. /*----------------------------------------------------------------------------*/
  9457. /*!
  9458. * \brief This routine is called to reset BA scoreboard.
  9459. *
  9460. *
  9461. * \param[in] prAdapter Pointer to the Adapter structure.
  9462. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  9463. * \param[in] u4SetBufferLen The length of the set buffer.
  9464. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  9465. * bytes read from the set buffer. If the call failed
  9466. * due to invalid length of the set buffer, returns
  9467. * the amount of storage needed.
  9468. *
  9469. * \retval WLAN_STATUS_SUCCESS
  9470. * \retval WLAN_STATUS_INVALID_LENGTH
  9471. */
  9472. /*----------------------------------------------------------------------------*/
  9473. WLAN_STATUS wlanoidResetBAScoreboard(IN P_ADAPTER_T prAdapter, IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen)
  9474. {
  9475. WLAN_STATUS rStatus;
  9476. DEBUGFUNC("wlanoidResetBAScoreboard");
  9477. DBGLOG(OID, WARN, "[Puff]wlanoidResetBAScoreboard\n");
  9478. ASSERT(prAdapter);
  9479. ASSERT(pvSetBuffer);
  9480. rStatus = wlanSendSetQueryCmd(prAdapter, /* prAdapter */
  9481. CMD_ID_RESET_BA_SCOREBOARD, /* ucCID */
  9482. TRUE, /* fgSetQuery */
  9483. FALSE, /* fgNeedResp */
  9484. TRUE, /* fgIsOid */
  9485. NULL, /* pfCmdDoneHandler */
  9486. NULL, /* pfCmdTimeoutHandler */
  9487. u4SetBufferLen, /* u4SetQueryInfoLen */
  9488. (PUINT_8) pvSetBuffer, /* pucInfoBuffer */
  9489. NULL, /* pvSetQueryBuffer */
  9490. 0 /* u4SetQueryBufferLen */
  9491. );
  9492. /* ASSERT(rStatus == WLAN_STATUS_PENDING); */
  9493. return rStatus;
  9494. }
  9495. #endif
  9496. #if CFG_SUPPORT_BATCH_SCAN
  9497. #define CMD_WLS_BATCHING "WLS_BATCHING"
  9498. #define BATCHING_SET "SET"
  9499. #define BATCHING_GET "GET"
  9500. #define BATCHING_STOP "STOP"
  9501. #define PARAM_SCANFREQ "SCANFREQ"
  9502. #define PARAM_MSCAN "MSCAN"
  9503. #define PARAM_BESTN "BESTN"
  9504. #define PARAM_CHANNEL "CHANNEL"
  9505. #define PARAM_RTT "RTT"
  9506. WLAN_STATUS
  9507. batchSetCmd(IN P_ADAPTER_T prAdapter, IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4WritenLen)
  9508. {
  9509. P_CHANNEL_INFO_T prRfChannelInfo;
  9510. CMD_BATCH_REQ_T rCmdBatchReq;
  9511. WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
  9512. PCHAR head, p, p2;
  9513. UINT_32 tokens;
  9514. INT_32 scanfreq, mscan, bestn, rtt;
  9515. char *pcTemp;
  9516. /* CHAR c_scanfreq[4], c_mscan[4], c_bestn[4], c_rtt[4], c_channel[100]; */
  9517. /* INT32 ch_type; */
  9518. UINT_32 u4Value = 0;
  9519. INT_32 i4Ret = 0;
  9520. DBGLOG(SCN, TRACE, "[BATCH] command=%s, len=%d\n", pvSetBuffer, u4SetBufferLen);
  9521. if (!pu4WritenLen)
  9522. return -EINVAL;
  9523. *pu4WritenLen = 0;
  9524. if (u4SetBufferLen < kalStrLen(CMD_WLS_BATCHING)) {
  9525. DBGLOG(SCN, TRACE, "[BATCH] invalid len %d\n", u4SetBufferLen);
  9526. return -EINVAL;
  9527. }
  9528. head = pvSetBuffer + kalStrLen(CMD_WLS_BATCHING) + 1;
  9529. kalMemSet(&rCmdBatchReq, 0, sizeof(CMD_BATCH_REQ_T));
  9530. if (!kalStrnCmp(head, BATCHING_SET, kalStrLen(BATCHING_SET))) {
  9531. DBGLOG(SCN, TRACE, "XXX Start Batch Scan XXX\n");
  9532. head += kalStrLen(BATCHING_SET) + 1;
  9533. /* SCANFREQ, MSCAN, BESTN */
  9534. tokens = sscanf(head, "SCANFREQ=%d MSCAN=%d BESTN=%d", &scanfreq, &mscan, &bestn);
  9535. if (tokens != 3) {
  9536. DBGLOG(SCN, TRACE,
  9537. "[BATCH] Parse fail: tokens=%d, SCANFREQ=%d MSCAN=%d BESTN=%d\n",
  9538. tokens, scanfreq, mscan, bestn);
  9539. return -EINVAL;
  9540. }
  9541. /* RTT */
  9542. p = kalStrStr(head, PARAM_RTT);
  9543. if (!p) {
  9544. DBGLOG(SCN, TRACE, "[BATCH] Parse RTT fail. head=%s\n", head);
  9545. return -EINVAL;
  9546. }
  9547. tokens = sscanf(p, "RTT=%d", &rtt);
  9548. if (tokens != 1) {
  9549. DBGLOG(SCN, TRACE, "[BATCH] Parse fail: tokens=%d, rtt=%d\n", tokens, rtt);
  9550. return -EINVAL;
  9551. }
  9552. /* CHANNEL */
  9553. p = kalStrStr(head, PARAM_CHANNEL);
  9554. if (!p) {
  9555. DBGLOG(SCN, TRACE, "[BATCH] Parse CHANNEL fail(1)\n");
  9556. return -EINVAL;
  9557. }
  9558. head = p;
  9559. p = kalStrChr(head, '>');
  9560. if (!p) {
  9561. DBGLOG(SCN, TRACE, "[BATCH] Parse CHANNEL fail(2)\n");
  9562. return -EINVAL;
  9563. }
  9564. /* else {
  9565. *p = '.'; // remove '>' because sscanf can not parse <%s>
  9566. }*/
  9567. /*tokens = sscanf(head, "CHANNEL=<%s", c_channel);
  9568. if (tokens != 1) {
  9569. DBGLOG(SCN, TRACE, "[BATCH] Parse fail: tokens=%d, CHANNEL=<%s>\n",
  9570. tokens, c_channel);
  9571. return -EINVAL;
  9572. } */
  9573. rCmdBatchReq.ucChannelType = SCAN_CHANNEL_SPECIFIED;
  9574. rCmdBatchReq.ucChannelListNum = 0;
  9575. prRfChannelInfo = &rCmdBatchReq.arChannelList[0];
  9576. p = head + kalStrLen(PARAM_CHANNEL) + 2; /* c_channel; */
  9577. pcTemp = (char *)p;
  9578. while ((p2 = kalStrSep(&pcTemp, ",")) != NULL) {
  9579. if (p2 == NULL || *p2 == 0)
  9580. break;
  9581. if (*p2 == '\0')
  9582. continue;
  9583. if (*p2 == 'A') {
  9584. rCmdBatchReq.ucChannelType =
  9585. rCmdBatchReq.ucChannelType ==
  9586. SCAN_CHANNEL_2G4 ? SCAN_CHANNEL_FULL : SCAN_CHANNEL_5G;
  9587. } else if (*p2 == 'B') {
  9588. rCmdBatchReq.ucChannelType =
  9589. rCmdBatchReq.ucChannelType ==
  9590. SCAN_CHANNEL_5G ? SCAN_CHANNEL_FULL : SCAN_CHANNEL_2G4;
  9591. } else {
  9592. /* Translate Freq from MHz to channel number. */
  9593. /* prRfChannelInfo->ucChannelNum = kalStrtol(p2, NULL, 0); */
  9594. i4Ret = kalkStrtou32(p2, 0, &u4Value);
  9595. if (i4Ret)
  9596. DBGLOG(SCN, TRACE, "parse ucChannelNum error i4Ret=%d\n", i4Ret);
  9597. prRfChannelInfo->ucChannelNum = (UINT_8) u4Value;
  9598. DBGLOG(SCN, TRACE, "Scanning Channel:%d, freq: %d\n",
  9599. prRfChannelInfo->ucChannelNum,
  9600. nicChannelNum2Freq(prRfChannelInfo->ucChannelNum));
  9601. prRfChannelInfo->ucBand = prRfChannelInfo->ucChannelNum < 15 ? BAND_2G4 : BAND_5G;
  9602. rCmdBatchReq.ucChannelListNum++;
  9603. if (rCmdBatchReq.ucChannelListNum >= 32)
  9604. break;
  9605. prRfChannelInfo++;
  9606. }
  9607. }
  9608. /* set channel for test */
  9609. #if 0
  9610. rCmdBatchReq.ucChannelType = 4; /* SCAN_CHANNEL_SPECIFIED; */
  9611. rCmdBatchReq.ucChannelListNum = 0;
  9612. prRfChannelInfo = &rCmdBatchReq.arChannelList[0];
  9613. for (i = 1; i <= 14; i++) {
  9614. /* filter out some */
  9615. if (i == 1 || i == 5 || i == 11)
  9616. continue;
  9617. /* Translate Freq from MHz to channel number. */
  9618. prRfChannelInfo->ucChannelNum = i;
  9619. DBGLOG(SCN, TRACE, "Scanning Channel:%d, freq: %d\n",
  9620. prRfChannelInfo->ucChannelNum, nicChannelNum2Freq(prRfChannelInfo->ucChannelNum));
  9621. prRfChannelInfo->ucBand = BAND_2G4;
  9622. rCmdBatchReq.ucChannelListNum++;
  9623. prRfChannelInfo++;
  9624. }
  9625. #endif
  9626. #if 0
  9627. rCmdBatchReq.ucChannelType = 0; /* SCAN_CHANNEL_FULL; */
  9628. #endif
  9629. rCmdBatchReq.u4Scanfreq = scanfreq;
  9630. rCmdBatchReq.ucMScan = mscan > CFG_BATCH_MAX_MSCAN ? CFG_BATCH_MAX_MSCAN : mscan;
  9631. rCmdBatchReq.ucBestn = bestn;
  9632. rCmdBatchReq.ucRtt = rtt;
  9633. DBGLOG(SCN, TRACE, "[BATCH] SCANFREQ=%d MSCAN=%d BESTN=%d RTT=%d\n",
  9634. rCmdBatchReq.u4Scanfreq, rCmdBatchReq.ucMScan, rCmdBatchReq.ucBestn, rCmdBatchReq.ucRtt);
  9635. if (rCmdBatchReq.ucChannelType != SCAN_CHANNEL_SPECIFIED) {
  9636. DBGLOG(SCN, TRACE, "[BATCH] CHANNELS = %s\n",
  9637. rCmdBatchReq.ucChannelType ==
  9638. SCAN_CHANNEL_FULL ? "FULL" : rCmdBatchReq.ucChannelType ==
  9639. SCAN_CHANNEL_2G4 ? "2.4G all" : "5G all");
  9640. } else {
  9641. DBGLOG(SCN, TRACE, "[BATCH] CHANNEL list\n");
  9642. prRfChannelInfo = &rCmdBatchReq.arChannelList[0];
  9643. for (tokens = 0; tokens < rCmdBatchReq.ucChannelListNum; tokens++) {
  9644. DBGLOG(SCN, TRACE, "[BATCH] %s, %d\n",
  9645. prRfChannelInfo->ucBand ==
  9646. BAND_2G4 ? "2.4G" : "5G", prRfChannelInfo->ucChannelNum);
  9647. prRfChannelInfo++;
  9648. }
  9649. }
  9650. rCmdBatchReq.ucSeqNum = 1;
  9651. rCmdBatchReq.ucNetTypeIndex = KAL_NETWORK_TYPE_AIS_INDEX;
  9652. rCmdBatchReq.ucCmd = SCAN_BATCH_REQ_START;
  9653. *pu4WritenLen = kalSnprintf(pvSetBuffer, 3, "%d", rCmdBatchReq.ucMScan);
  9654. } else if (!kalStrnCmp(head, BATCHING_STOP, kalStrLen(BATCHING_STOP))) {
  9655. DBGLOG(SCN, TRACE, "XXX Stop Batch Scan XXX\n");
  9656. rCmdBatchReq.ucSeqNum = 1;
  9657. rCmdBatchReq.ucNetTypeIndex = KAL_NETWORK_TYPE_AIS_INDEX;
  9658. rCmdBatchReq.ucCmd = SCAN_BATCH_REQ_STOP;
  9659. } else {
  9660. return -EINVAL;
  9661. }
  9662. wlanSendSetQueryCmd(prAdapter,
  9663. CMD_ID_SET_BATCH_REQ,
  9664. TRUE, FALSE, TRUE, NULL, NULL, sizeof(CMD_BATCH_REQ_T), (PUINT_8) &rCmdBatchReq, NULL, 0);
  9665. /* kalMemSet(pvSetBuffer, 0, u4SetBufferLen); */
  9666. /* rStatus = kalSnprintf(pvSetBuffer, 2, "%s", "OK"); */
  9667. /* exit: */
  9668. return rStatus;
  9669. }
  9670. WLAN_STATUS
  9671. batchGetCmd(IN P_ADAPTER_T prAdapter,
  9672. OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  9673. {
  9674. CMD_BATCH_REQ_T rCmdBatchReq;
  9675. WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
  9676. P_EVENT_BATCH_RESULT_T prEventBatchResult;
  9677. /* UINT_32 i; */
  9678. ASSERT(prAdapter);
  9679. ASSERT(pu4QueryInfoLen);
  9680. if (u4QueryBufferLen)
  9681. ASSERT(pvQueryBuffer);
  9682. prEventBatchResult = (P_EVENT_BATCH_RESULT_T) pvQueryBuffer;
  9683. DBGLOG(SCN, TRACE, "XXX Get Batch Scan Result (%d) XXX\n", prEventBatchResult->ucScanCount);
  9684. *pu4QueryInfoLen = sizeof(EVENT_BATCH_RESULT_T);
  9685. rCmdBatchReq.ucSeqNum = 2;
  9686. rCmdBatchReq.ucCmd = SCAN_BATCH_REQ_RESULT;
  9687. rCmdBatchReq.ucMScan = prEventBatchResult->ucScanCount; /* Get which round result */
  9688. rStatus = wlanSendSetQueryCmd(prAdapter,
  9689. CMD_ID_SET_BATCH_REQ,
  9690. FALSE,
  9691. TRUE,
  9692. TRUE,
  9693. nicCmdEventBatchScanResult,
  9694. nicOidCmdTimeoutCommon,
  9695. sizeof(CMD_BATCH_REQ_T),
  9696. (PUINT_8) &rCmdBatchReq, (PVOID) pvQueryBuffer, u4QueryBufferLen);
  9697. return rStatus;
  9698. }
  9699. /*----------------------------------------------------------------------------*/
  9700. /*!
  9701. * \brief
  9702. *
  9703. * \param[in] prAdapter Pointer to the Adapter structure
  9704. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set
  9705. * \param[in] u4SetBufferLen The length of the set buffer
  9706. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  9707. * bytes read from the set buffer. If the call failed due to invalid length of
  9708. * the set buffer, returns the amount of storage needed.
  9709. *
  9710. * \retval WLAN_STATUS_SUCCESS
  9711. * \retval WLAN_STATUS_INVALID_DATA If new setting value is wrong.
  9712. * \retval WLAN_STATUS_INVALID_LENGTH
  9713. *
  9714. */
  9715. /*----------------------------------------------------------------------------*/
  9716. WLAN_STATUS
  9717. wlanoidSetBatchScanReq(IN P_ADAPTER_T prAdapter,
  9718. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  9719. {
  9720. return batchSetCmd(prAdapter, pvSetBuffer, u4SetBufferLen, pu4SetInfoLen);
  9721. }
  9722. /*----------------------------------------------------------------------------*/
  9723. /*!
  9724. * \brief
  9725. *
  9726. * \param[in] pvAdapter Pointer to the Adapter structure.
  9727. * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
  9728. * the query.
  9729. * \param[in] u4QueryBufferLen The length of the query buffer.
  9730. * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
  9731. * bytes written into the query buffer. If the call
  9732. * failed due to invalid length of the query buffer,
  9733. * returns the amount of storage needed.
  9734. *
  9735. * \retval WLAN_STATUS_SUCCESS
  9736. * \retval WLAN_STATUS_INVALID_LENGTH
  9737. */
  9738. /*----------------------------------------------------------------------------*/
  9739. WLAN_STATUS
  9740. wlanoidQueryBatchScanResult(IN P_ADAPTER_T prAdapter,
  9741. OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  9742. {
  9743. return batchGetCmd(prAdapter, pvQueryBuffer, u4QueryBufferLen, pu4QueryInfoLen);
  9744. } /* end of wlanoidQueryBatchScanResult() */
  9745. #endif /* CFG_SUPPORT_BATCH_SCAN */
  9746. #if CFG_SUPPORT_PASSPOINT
  9747. /*----------------------------------------------------------------------------*/
  9748. /*!
  9749. * \brief This routine is called by HS2.0 to set the assoc info, which is needed to add to
  9750. * Association request frame while join HS2.0 AP.
  9751. *
  9752. * \param[in] prAdapter Pointer to the Adapter structure
  9753. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set
  9754. * \param[in] u4SetBufferLen The length of the set buffer
  9755. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  9756. * bytes read from the set buffer. If the call failed due to invalid length of
  9757. * the set buffer, returns the amount of storage needed.
  9758. *
  9759. * \retval WLAN_STATUS_SUCCESS
  9760. * \retval WLAN_STATUS_INVALID_DATA If new setting value is wrong.
  9761. * \retval WLAN_STATUS_INVALID_LENGTH
  9762. *
  9763. */
  9764. /*----------------------------------------------------------------------------*/
  9765. WLAN_STATUS
  9766. wlanoidSetHS20Info(IN P_ADAPTER_T prAdapter,
  9767. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  9768. {
  9769. P_IE_HS20_INDICATION_T prHS20IndicationIe;
  9770. ASSERT(prAdapter);
  9771. ASSERT(pvSetBuffer);
  9772. ASSERT(pu4SetInfoLen);
  9773. DEBUGFUNC("wlanoidSetHS20AssocInfo");
  9774. DBGLOG(OID, LOUD, "\r\n");
  9775. if (u4SetBufferLen == 0)
  9776. return WLAN_STATUS_INVALID_LENGTH;
  9777. *pu4SetInfoLen = u4SetBufferLen;
  9778. prHS20IndicationIe = (P_IE_HS20_INDICATION_T) pvSetBuffer;
  9779. prAdapter->prGlueInfo->ucHotspotConfig = prHS20IndicationIe->ucHotspotConfig;
  9780. prAdapter->prGlueInfo->fgConnectHS20AP = TRUE;
  9781. DBGLOG(SEC, TRACE, "HS20 IE sz %ld\n", u4SetBufferLen);
  9782. kalMemCopy(prAdapter->prGlueInfo->aucHS20AssocInfoIE, pvSetBuffer, u4SetBufferLen);
  9783. prAdapter->prGlueInfo->u2HS20AssocInfoIELen = (UINT_16) u4SetBufferLen;
  9784. DBGLOG(SEC, TRACE, "HS20 Assoc Info IE sz %ld\n", u4SetBufferLen);
  9785. return WLAN_STATUS_SUCCESS;
  9786. }
  9787. /*----------------------------------------------------------------------------*/
  9788. /*!
  9789. * \brief This routine is called by WSC to set the assoc info, which is needed to add to
  9790. * Association request frame while join WPS AP.
  9791. *
  9792. * \param[in] prAdapter Pointer to the Adapter structure
  9793. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set
  9794. * \param[in] u4SetBufferLen The length of the set buffer
  9795. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  9796. * bytes read from the set buffer. If the call failed due to invalid length of
  9797. * the set buffer, returns the amount of storage needed.
  9798. *
  9799. * \retval WLAN_STATUS_SUCCESS
  9800. * \retval WLAN_STATUS_INVALID_DATA If new setting value is wrong.
  9801. * \retval WLAN_STATUS_INVALID_LENGTH
  9802. *
  9803. */
  9804. /*----------------------------------------------------------------------------*/
  9805. WLAN_STATUS
  9806. wlanoidSetInterworkingInfo(IN P_ADAPTER_T prAdapter,
  9807. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  9808. {
  9809. #if 0
  9810. P_HS20_INFO_T prHS20Info = NULL;
  9811. P_IE_INTERWORKING_T prInterWorkingIe;
  9812. ASSERT(prAdapter);
  9813. ASSERT(pvSetBuffer);
  9814. ASSERT(pu4SetInfoLen);
  9815. prHS20Info = &(prAdapter->rWifiVar.rHS20Info);
  9816. DEBUGFUNC("wlanoidSetInterworkingInfo");
  9817. DBGLOG(OID, TRACE, "\r\n");
  9818. if (u4SetBufferLen == 0)
  9819. return WLAN_STATUS_INVALID_LENGTH;
  9820. *pu4SetInfoLen = u4SetBufferLen;
  9821. prInterWorkingIe = (P_IE_INTERWORKING_T) pvSetBuffer;
  9822. prHS20Info->ucAccessNetworkOptions = prInterWorkingIe->ucAccNetOpt;
  9823. prHS20Info->ucVenueGroup = prInterWorkingIe->ucVenueGroup;
  9824. prHS20Info->ucVenueType = prInterWorkingIe->ucVenueType;
  9825. COPY_MAC_ADDR(prHS20Info->aucHESSID, prInterWorkingIe->aucHESSID);
  9826. DBGLOG(SEC, TRACE, "IW IE sz %ld\n", u4SetBufferLen);
  9827. #endif
  9828. return WLAN_STATUS_SUCCESS;
  9829. }
  9830. /*----------------------------------------------------------------------------*/
  9831. /*!
  9832. * \brief This routine is called by WSC to set the Roaming Consortium IE info, which is needed to
  9833. * add to Association request frame while join WPS AP.
  9834. *
  9835. * \param[in] prAdapter Pointer to the Adapter structure
  9836. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set
  9837. * \param[in] u4SetBufferLen The length of the set buffer
  9838. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  9839. * bytes read from the set buffer. If the call failed due to invalid length of
  9840. * the set buffer, returns the amount of storage needed.
  9841. *
  9842. * \retval WLAN_STATUS_SUCCESS
  9843. * \retval WLAN_STATUS_INVALID_DATA If new setting value is wrong.
  9844. * \retval WLAN_STATUS_INVALID_LENGTH
  9845. *
  9846. */
  9847. /*----------------------------------------------------------------------------*/
  9848. WLAN_STATUS
  9849. wlanoidSetRoamingConsortiumIEInfo(IN P_ADAPTER_T prAdapter,
  9850. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  9851. {
  9852. #if 0
  9853. P_HS20_INFO_T prHS20Info = NULL;
  9854. P_PARAM_HS20_ROAMING_CONSORTIUM_INFO prRCInfo;
  9855. ASSERT(prAdapter);
  9856. ASSERT(pvSetBuffer);
  9857. ASSERT(pu4SetInfoLen);
  9858. prHS20Info = &(prAdapter->rWifiVar.rHS20Info);
  9859. /* DEBUGFUNC("wlanoidSetRoamingConsortiumInfo"); */
  9860. /* DBGLOG(HS2, TRACE, ("\r\n")); */
  9861. if (u4SetBufferLen == 0)
  9862. return WLAN_STATUS_INVALID_LENGTH;
  9863. *pu4SetInfoLen = u4SetBufferLen;
  9864. prRCInfo = (P_PARAM_HS20_ROAMING_CONSORTIUM_INFO) pvSetBuffer;
  9865. kalMemCopy(&(prHS20Info->rRCInfo), prRCInfo, sizeof(PARAM_HS20_ROAMING_CONSORTIUM_INFO));
  9866. /* DBGLOG(HS2, TRACE, ("RoamingConsortium IE sz %ld\n", u4SetBufferLen)); */
  9867. #endif
  9868. return WLAN_STATUS_SUCCESS;
  9869. }
  9870. /*----------------------------------------------------------------------------*/
  9871. /*!
  9872. * \brief This routine is called to set_bssid_pool
  9873. *
  9874. * \param[in] prAdapter Pointer to the Adapter structure.
  9875. * \param[in] pvSetBuffer Pointer to the buffer that holds the data to be set.
  9876. * \param[in] u4SetBufferLen The length of the set buffer.
  9877. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  9878. * bytes read from the set buffer. If the call failed
  9879. * due to invalid length of the set buffer, returns
  9880. * the amount of storage needed.
  9881. *
  9882. * \retval WLAN_STATUS_SUCCESS
  9883. * \retval WLAN_STATUS_INVALID_LENGTH
  9884. * \retval WLAN_STATUS_ADAPTER_NOT_READY
  9885. * \retval WLAN_STATUS_MULTICAST_FULL
  9886. */
  9887. /*----------------------------------------------------------------------------*/
  9888. WLAN_STATUS
  9889. wlanoidSetHS20BssidPool(IN P_ADAPTER_T prAdapter,
  9890. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  9891. {
  9892. WLAN_STATUS rWlanStatus = WLAN_STATUS_SUCCESS;
  9893. ASSERT(prAdapter);
  9894. ASSERT(pu4SetInfoLen);
  9895. if (u4SetBufferLen)
  9896. ASSERT(pvSetBuffer);
  9897. if (u4SetBufferLen < sizeof(PARAM_HS20_SET_BSSID_POOL)) {
  9898. *pu4SetInfoLen = sizeof(PARAM_HS20_SET_BSSID_POOL);
  9899. return WLAN_STATUS_BUFFER_TOO_SHORT;
  9900. }
  9901. rWlanStatus = hs20SetBssidPool(prAdapter, pvSetBuffer, KAL_NETWORK_TYPE_AIS_INDEX);
  9902. return rWlanStatus;
  9903. } /* end of wlanoidSendHS20GASRequest() */
  9904. #endif /* CFG_SUPPORT_PASSPOINT */
  9905. #if CFG_SUPPORT_SNIFFER
  9906. WLAN_STATUS
  9907. wlanoidSetMonitor(IN P_ADAPTER_T prAdapter, IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  9908. {
  9909. P_PARAM_CUSTOM_MONITOR_SET_STRUCT_T prMonitorSetInfo;
  9910. CMD_MONITOR_SET_INFO_T rCmdMonitorSetInfo;
  9911. WLAN_STATUS rWlanStatus = WLAN_STATUS_SUCCESS;
  9912. DEBUGFUNC("wlanoidSetMonitor");
  9913. ASSERT(prAdapter);
  9914. ASSERT(pu4SetInfoLen);
  9915. *pu4SetInfoLen = sizeof(PARAM_CUSTOM_MONITOR_SET_STRUCT_T);
  9916. if (u4SetBufferLen < sizeof(PARAM_CUSTOM_MONITOR_SET_STRUCT_T))
  9917. return WLAN_STATUS_INVALID_LENGTH;
  9918. ASSERT(pvSetBuffer);
  9919. prMonitorSetInfo = (P_PARAM_CUSTOM_MONITOR_SET_STRUCT_T) pvSetBuffer;
  9920. rCmdMonitorSetInfo.ucEnable = prMonitorSetInfo->ucEnable;
  9921. rCmdMonitorSetInfo.ucBand = prMonitorSetInfo->ucBand;
  9922. rCmdMonitorSetInfo.ucPriChannel = prMonitorSetInfo->ucPriChannel;
  9923. rCmdMonitorSetInfo.ucSco = prMonitorSetInfo->ucSco;
  9924. rCmdMonitorSetInfo.ucChannelWidth = prMonitorSetInfo->ucChannelWidth;
  9925. rCmdMonitorSetInfo.ucChannelS1 = prMonitorSetInfo->ucChannelS1;
  9926. rCmdMonitorSetInfo.ucChannelS2 = prMonitorSetInfo->ucChannelS2;
  9927. rWlanStatus = wlanSendSetQueryCmd(prAdapter,
  9928. CMD_ID_SET_MONITOR,
  9929. TRUE,
  9930. FALSE,
  9931. TRUE,
  9932. nicCmdEventSetCommon,
  9933. nicOidCmdTimeoutCommon,
  9934. sizeof(CMD_MONITOR_SET_INFO_T),
  9935. (PUINT_8) &rCmdMonitorSetInfo, pvSetBuffer, u4SetBufferLen);
  9936. return rWlanStatus;
  9937. }
  9938. #endif
  9939. #if CFG_SUPPORT_SCN_PSCN
  9940. #if 0
  9941. /*----------------------------------------------------------------------------*/
  9942. /*!
  9943. * \brief This routine is called to request starting of schedule scan
  9944. *
  9945. * \param[in] prAdapter Pointer to the Adapter structure.
  9946. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  9947. * \param[in] u4SetBufferLen The length of the set buffer.
  9948. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  9949. * bytes read from the set buffer. If the call failed
  9950. * due to invalid length of the set buffer, returns
  9951. * the amount of storage needed.
  9952. *
  9953. * \retval WLAN_STATUS_SUCCESS
  9954. * \retval WLAN_STATUS_ADAPTER_NOT_READY
  9955. * \retval WLAN_STATUS_INVALID_LENGTH
  9956. * \retval WLAN_STATUS_INVALID_DATA
  9957. *
  9958. * \note The setting buffer PARAM_SCHED_SCAN_REQUEST_EXT_T
  9959. */
  9960. /*----------------------------------------------------------------------------*/
  9961. WLAN_STATUS
  9962. wlanoidSetStartSchedScan(IN P_ADAPTER_T prAdapter,
  9963. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  9964. {
  9965. P_PARAM_SCHED_SCAN_REQUEST prSchedScanRequest;
  9966. DEBUGFUNC("wlanoidSetStartSchedScan()");
  9967. if (prAdapter->rAcpiState == ACPI_STATE_D3) {
  9968. DBGLOG(OID, WARN,
  9969. ("Fail in set scheduled scan! (Adapter not ready). ACPI=D%d, Radio=%d\n",
  9970. prAdapter->rAcpiState, prAdapter->fgIsRadioOff));
  9971. return WLAN_STATUS_ADAPTER_NOT_READY;
  9972. }
  9973. ASSERT(pu4SetInfoLen);
  9974. *pu4SetInfoLen = 0;
  9975. if (u4SetBufferLen != sizeof(PARAM_SCHED_SCAN_REQUEST)) {
  9976. return WLAN_STATUS_INVALID_LENGTH;
  9977. } else if (pvSetBuffer == NULL) {
  9978. return WLAN_STATUS_INVALID_DATA;
  9979. } else if (kalGetMediaStateIndicated(prAdapter->prGlueInfo) == PARAM_MEDIA_STATE_CONNECTED
  9980. && prAdapter->fgEnOnlineScan == FALSE) {
  9981. return WLAN_STATUS_FAILURE;
  9982. }
  9983. if (prAdapter->fgIsRadioOff) {
  9984. DBGLOG(OID, WARN, ("Return from BSSID list scan! (radio off). ACPI=D%d, Radio=%d\n",
  9985. prAdapter->rAcpiState, prAdapter->fgIsRadioOff));
  9986. return WLAN_STATUS_SUCCESS;
  9987. }
  9988. prSchedScanRequest = (P_PARAM_SCHED_SCAN_REQUEST) pvSetBuffer;
  9989. if (scnFsmSchedScanRequest(prAdapter,
  9990. (UINT_8) (prSchedScanRequest->u4SsidNum),
  9991. prSchedScanRequest->arSsid,
  9992. prSchedScanRequest->u4IELength,
  9993. prSchedScanRequest->pucIE, prSchedScanRequest->u2ScanInterval) == TRUE) {
  9994. return WLAN_STATUS_PENDING;
  9995. } else {
  9996. return WLAN_STATUS_FAILURE;
  9997. }
  9998. }
  9999. /*----------------------------------------------------------------------------*/
  10000. /*!
  10001. * \brief This routine is called to request termination of schedule scan
  10002. *
  10003. * \param[in] prAdapter Pointer to the Adapter structure.
  10004. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  10005. * \param[in] u4SetBufferLen The length of the set buffer.
  10006. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  10007. * bytes read from the set buffer. If the call failed
  10008. * due to invalid length of the set buffer, returns
  10009. * the amount of storage needed.
  10010. *
  10011. * \retval WLAN_STATUS_SUCCESS
  10012. * \retval WLAN_STATUS_ADAPTER_NOT_READY
  10013. * \retval WLAN_STATUS_INVALID_LENGTH
  10014. * \retval WLAN_STATUS_INVALID_DATA
  10015. *
  10016. * \note The setting buffer PARAM_SCHED_SCAN_REQUEST_EXT_T
  10017. */
  10018. /*----------------------------------------------------------------------------*/
  10019. WLAN_STATUS
  10020. wlanoidSetStopSchedScan(IN P_ADAPTER_T prAdapter,
  10021. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  10022. {
  10023. ASSERT(prAdapter);
  10024. /* ask SCN module to stop scan request */
  10025. if (scnFsmSchedScanStopRequest(prAdapter) == TRUE)
  10026. return WLAN_STATUS_PENDING;
  10027. else
  10028. return WLAN_STATUS_FAILURE;
  10029. }
  10030. #endif
  10031. /*----------------------------------------------------------------------------*/
  10032. /*!
  10033. * \brief This routine is called to set a periodically scan action
  10034. *
  10035. * \param[in] prAdapter Pointer to the Adapter structure.
  10036. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  10037. * \param[in] u4SetBufferLen The length of the set buffer.
  10038. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  10039. * bytes read from the set buffer. If the call failed
  10040. * due to invalid length of the set buffer, returns
  10041. * the amount of storage needed.
  10042. *
  10043. * \retval WLAN_STATUS_SUCCESS
  10044. * \retval WLAN_STATUS_ADAPTER_NOT_READY
  10045. * \retval WLAN_STATUS_INVALID_LENGTH
  10046. * \retval WLAN_STATUS_INVALID_DATA
  10047. *
  10048. * \note The setting buffer PARAM_SCHED_SCAN_REQUEST_EXT_T
  10049. */
  10050. /*----------------------------------------------------------------------------*/
  10051. WLAN_STATUS
  10052. wlanoidSetGSCNAction(IN P_ADAPTER_T prAdapter,
  10053. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  10054. {
  10055. P_CMD_SET_PSCAN_ENABLE prCmdPscnAction;
  10056. P_SCAN_INFO_T prScanInfo;
  10057. prScanInfo = &(prAdapter->rWifiVar.rScanInfo);
  10058. /* DBGLOG(OID, TRACE, "wlanoidSetGSCNAction\n"); */
  10059. if (prAdapter->rAcpiState == ACPI_STATE_D3) {
  10060. DBGLOG(OID, WARN,
  10061. "Fail in set Periodically Scan! (Adapter not ready). ACPI=D%d, Radio=%d\n",
  10062. prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
  10063. return WLAN_STATUS_ADAPTER_NOT_READY;
  10064. }
  10065. if (u4SetBufferLen != sizeof(CMD_SET_PSCAN_ENABLE))
  10066. return WLAN_STATUS_INVALID_LENGTH;
  10067. else if (pvSetBuffer == NULL)
  10068. return WLAN_STATUS_INVALID_DATA;
  10069. if (prAdapter->fgIsRadioOff) {
  10070. DBGLOG(OID, WARN, "Return from BSSID list scan! (radio off). ACPI=D%d, Radio=%d\n",
  10071. prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
  10072. return WLAN_STATUS_SUCCESS;
  10073. }
  10074. prCmdPscnAction = (P_CMD_SET_PSCAN_ENABLE) pvSetBuffer;
  10075. if (prCmdPscnAction->ucPscanAct == ENABLE) {
  10076. #if 0
  10077. DBGLOG(OID, INFO, ("set PCSN ENABLE\n"));
  10078. if (scnFsmPSCNAction(prAdapter, (UINT_8) (prCmdPscnAction->ucPscanAct)) == TRUE) {
  10079. DBGLOG(OID, INFO, ("wlanoidSetGSCNAction < ---\n"));
  10080. return WLAN_STATUS_PENDING;
  10081. }
  10082. DBGLOG(OID, INFO, ("wlanoidSetGSCNAction < ---\n"));
  10083. return WLAN_STATUS_FAILURE;
  10084. #endif
  10085. scnPSCNFsm(prAdapter, PSCN_SCANNING, NULL, NULL, NULL, NULL, FALSE, FALSE, FALSE, TRUE);
  10086. } else if (prCmdPscnAction->ucPscanAct == DISABLE) {
  10087. #if 0
  10088. DBGLOG(OID, INFO, ("disable PCSN\n"));
  10089. scnFsmPSCNAction(prAdapter, (UINT_8) DISABLE);
  10090. DBGLOG(OID, TRACE, ("set new PCSN\n"));
  10091. scnCombineParamsIntoPSCN(prAdapter, NULL, NULL, NULL, NULL, FALSE, FALSE, TRUE);
  10092. DBGLOG(OID, INFO, ("ENABLE or disable PCSN\n"));
  10093. if (!prScanInfo->fgPscnOnnning) {
  10094. DBGLOG(OID, INFO, ("ENABLE PCSN\n"));
  10095. scnFsmPSCNAction(prAdapter, ENABLE);
  10096. } else {
  10097. DBGLOG(OID, INFO, ("All PCSN is disabled...\n"));
  10098. }
  10099. #endif
  10100. scnPSCNFsm(prAdapter, PSCN_RESET, NULL, NULL, NULL, NULL, FALSE, FALSE, TRUE, FALSE);
  10101. }
  10102. return WLAN_STATUS_SUCCESS;
  10103. }
  10104. /*----------------------------------------------------------------------------*/
  10105. /*!
  10106. * \brief This routine is called to set a periodically scan action
  10107. *
  10108. * \param[in] prAdapter Pointer to the Adapter structure.
  10109. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  10110. * \param[in] u4SetBufferLen The length of the set buffer.
  10111. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  10112. * bytes read from the set buffer. If the call failed
  10113. * due to invalid length of the set buffer, returns
  10114. * the amount of storage needed.
  10115. *
  10116. * \retval WLAN_STATUS_SUCCESS
  10117. * \retval WLAN_STATUS_ADAPTER_NOT_READY
  10118. * \retval WLAN_STATUS_INVALID_LENGTH
  10119. * \retval WLAN_STATUS_INVALID_DATA
  10120. *
  10121. * \note The setting buffer PARAM_SCHED_SCAN_REQUEST_EXT_T
  10122. */
  10123. /*----------------------------------------------------------------------------*/
  10124. WLAN_STATUS
  10125. wlanoidSetGSCNAParam(IN P_ADAPTER_T prAdapter,
  10126. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  10127. {
  10128. P_PARAM_WIFI_GSCAN_CMD_PARAMS prCmdGscnParam;
  10129. DBGLOG(OID, INFO, "wlanoidSetGSCNAParam v1\n");
  10130. if (prAdapter->rAcpiState == ACPI_STATE_D3) {
  10131. DBGLOG(OID, WARN,
  10132. "Fail in set Periodically Scan! (Adapter not ready). ACPI=D%d, Radio=%d\n",
  10133. prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
  10134. DBGLOG(OID, INFO,
  10135. "Fail in set Periodically Scan! (Adapter not ready). ACPI=D%d, Radio=%d\n",
  10136. prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
  10137. return WLAN_STATUS_ADAPTER_NOT_READY;
  10138. }
  10139. if (u4SetBufferLen != sizeof(PARAM_WIFI_GSCAN_CMD_PARAMS)) {
  10140. DBGLOG(OID, INFO, "(u4SetBufferLen != sizeof(P_PARAM_WIFI_GSCAN_CMD_PARAMS))\n");
  10141. return WLAN_STATUS_INVALID_LENGTH;
  10142. } else if (pvSetBuffer == NULL) {
  10143. DBGLOG(OID, INFO, "(pvSetBuffer == NULL)\n");
  10144. return WLAN_STATUS_INVALID_DATA;
  10145. }
  10146. if (prAdapter->fgIsRadioOff) {
  10147. DBGLOG(OID, WARN, "Return from BSSID list scan! (radio off). ACPI=D%d, Radio=%d\n",
  10148. prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
  10149. DBGLOG(OID, INFO, "Return from BSSID list scan! (radio off). ACPI=D%d, Radio=%d\n",
  10150. prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
  10151. return WLAN_STATUS_SUCCESS;
  10152. }
  10153. prCmdGscnParam = (P_PARAM_WIFI_GSCAN_CMD_PARAMS) pvSetBuffer;
  10154. /* memcpy(prCmdGscnParam, (P_PARAM_WIFI_GSCAN_CMD_PARAMS)pvSetBuffer,
  10155. sizeof(PARAM_WIFI_GSCAN_CMD_PARAMS) ); */
  10156. /*DBGLOG(OID, INFO, "prCmdGscnParam : base_period[%u],
  10157. max_ap_per_scan[%u] num_buckets[%u], report_threshold[%u]\n",
  10158. prCmdGscnParam->base_period, prCmdGscnParam->max_ap_per_scan,
  10159. prCmdGscnParam->num_buckets, prCmdGscnParam->report_threshold); */
  10160. #if 0
  10161. for (i = 0; i < prCmdGscnParam->num_buckets; i++) {
  10162. DBGLOG(OID, INFO,
  10163. "prCmdGscnParam->buckets : band[%u], bucket[%u] num_buckets[%u], period[%u] report_events[%u]\n",
  10164. prCmdGscnParam->buckets[i].band, prCmdGscnParam->buckets[i].bucket,
  10165. prCmdGscnParam->buckets[i].num_channels, prCmdGscnParam->buckets[i].period,
  10166. prCmdGscnParam->buckets[i].report_events);
  10167. DBGLOG(OID, INFO, "prCmdGscnParam->buckets[%d] has channel: ", i);
  10168. for (j = 0; j < prCmdGscnParam->buckets[i].num_channels; j++)
  10169. DBGLOG(OID, INFO, " %d, ", prCmdGscnParam->buckets[i].channels[j].channel);
  10170. DBGLOG(OID, INFO, "\n");
  10171. }
  10172. #endif
  10173. if (scnSetGSCNParam(prAdapter, prCmdGscnParam) == TRUE) {
  10174. DBGLOG(OID, INFO, "wlanoidSetGSCNAParam --->scnSetGSCNParam\n");
  10175. /*return WLAN_STATUS_PENDING; */
  10176. } else {
  10177. /*return WLAN_STATUS_FAILURE; */
  10178. }
  10179. return WLAN_STATUS_SUCCESS;
  10180. }
  10181. /*----------------------------------------------------------------------------*/
  10182. /*!
  10183. * \brief This routine is called to set configure gscan PARAMs
  10184. *
  10185. * \param[in] prAdapter Pointer to the Adapter structure.
  10186. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  10187. * \param[in] u4SetBufferLen The length of the set buffer.
  10188. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  10189. * bytes read from the set buffer. If the call failed
  10190. * due to invalid length of the set buffer, returns
  10191. * the amount of storage needed.
  10192. *
  10193. * \retval WLAN_STATUS_SUCCESS
  10194. * \retval WLAN_STATUS_ADAPTER_NOT_READY
  10195. * \retval WLAN_STATUS_INVALID_LENGTH
  10196. * \retval WLAN_STATUS_INVALID_DATA
  10197. *
  10198. * \note The setting buffer PARAM_SCHED_SCAN_REQUEST_EXT_T
  10199. */
  10200. /*----------------------------------------------------------------------------*/
  10201. WLAN_STATUS
  10202. wlanoidSetGSCNAConfig(IN P_ADAPTER_T prAdapter,
  10203. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  10204. {
  10205. P_PARAM_WIFI_GSCAN_CMD_PARAMS prCmdGscnScnConfigParam;
  10206. CMD_GSCN_SCN_COFIG_T rCmdGscnScnConfig;
  10207. DBGLOG(OID, INFO, "wlanoidSetGSCNAConfig v1\n");
  10208. if (prAdapter->rAcpiState == ACPI_STATE_D3) {
  10209. DBGLOG(OID, WARN,
  10210. "Fail in set Periodically Scan! (Adapter not ready). ACPI=D%d, Radio=%d\n",
  10211. prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
  10212. return WLAN_STATUS_ADAPTER_NOT_READY;
  10213. }
  10214. if (u4SetBufferLen != sizeof(PARAM_WIFI_GSCAN_CMD_PARAMS)) {
  10215. DBGLOG(OID, INFO, "(u4SetBufferLen != sizeof(CMD_GSCN_SCN_COFIG_T))\n");
  10216. return WLAN_STATUS_INVALID_LENGTH;
  10217. } else if (pvSetBuffer == NULL) {
  10218. DBGLOG(OID, INFO, "(pvSetBuffer == NULL)\n");
  10219. return WLAN_STATUS_INVALID_DATA;
  10220. }
  10221. if (prAdapter->fgIsRadioOff) {
  10222. DBGLOG(OID, WARN, "Return from BSSID list scan! (radio off). ACPI=D%d, Radio=%d\n",
  10223. prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
  10224. return WLAN_STATUS_SUCCESS;
  10225. }
  10226. DBGLOG(OID, INFO, "prCmdGscnScnConfigParam = (P_PARAM_WIFI_GSCAN_CMD_PARAMS)pvSetBuffer\n");
  10227. prCmdGscnScnConfigParam = (P_PARAM_WIFI_GSCAN_CMD_PARAMS) pvSetBuffer;
  10228. memcpy(prCmdGscnScnConfigParam, (P_PARAM_WIFI_GSCAN_CMD_PARAMS) pvSetBuffer,
  10229. sizeof(PARAM_WIFI_GSCAN_CMD_PARAMS));
  10230. DBGLOG(OID, INFO, "prCmdGscnScnConfigParam assign prCmdGscnScnConfig\n");
  10231. rCmdGscnScnConfig.u4BufferThreshold = prCmdGscnScnConfigParam->report_threshold;
  10232. rCmdGscnScnConfig.ucNumApPerScn = prCmdGscnScnConfigParam->max_ap_per_scan;
  10233. rCmdGscnScnConfig.u4NumScnToCache = prCmdGscnScnConfigParam->num_scans;
  10234. DBGLOG(OID, INFO, " report_threshold %d report_threshold %d num_scans %d\n",
  10235. rCmdGscnScnConfig.u4BufferThreshold, rCmdGscnScnConfig.ucNumApPerScn, rCmdGscnScnConfig.u4NumScnToCache);
  10236. if (scnFsmSetGSCNConfig(prAdapter, &rCmdGscnScnConfig) == TRUE) {
  10237. DBGLOG(OID, INFO, "wlanoidSetGSCNAParam --->scnSetGSCNParam\n");
  10238. /*return WLAN_STATUS_PENDING; */
  10239. } else {
  10240. /*return WLAN_STATUS_FAILURE; */
  10241. }
  10242. return WLAN_STATUS_SUCCESS;
  10243. }
  10244. /*----------------------------------------------------------------------------*/
  10245. /*!
  10246. * \brief This routine is called to get a gscan result
  10247. *
  10248. * \param[in] prAdapter Pointer to the Adapter structure.
  10249. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  10250. * \param[in] u4SetBufferLen The length of the set buffer.
  10251. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  10252. * bytes read from the set buffer. If the call failed
  10253. * due to invalid length of the set buffer, returns
  10254. * the amount of storage needed.
  10255. *
  10256. * \retval WLAN_STATUS_SUCCESS
  10257. * \retval WLAN_STATUS_ADAPTER_NOT_READY
  10258. * \retval WLAN_STATUS_INVALID_LENGTH
  10259. * \retval WLAN_STATUS_INVALID_DATA
  10260. *
  10261. * \note The setting buffer PARAM_SCHED_SCAN_REQUEST_EXT_T
  10262. */
  10263. /*----------------------------------------------------------------------------*/
  10264. WLAN_STATUS
  10265. wlanoidGetGSCNResult(IN P_ADAPTER_T prAdapter,
  10266. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  10267. {
  10268. P_PARAM_WIFI_GSCAN_GET_RESULT_PARAMS prGetGscnScnResultParm;
  10269. CMD_GET_GSCAN_RESULT_T rGetGscnScnResultCmd;
  10270. DEBUGFUNC("wlanoidGetGSCNResult()");
  10271. DBGLOG(INIT, INFO, "wlanoidGetGSCNResult v1\n");
  10272. if (prAdapter->rAcpiState == ACPI_STATE_D3) {
  10273. DBGLOG(OID, WARN,
  10274. "Fail in set Periodically Scan! (Adapter not ready). ACPI=D%d, Radio=%d\n",
  10275. prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
  10276. return WLAN_STATUS_ADAPTER_NOT_READY;
  10277. }
  10278. if (u4SetBufferLen != sizeof(PARAM_WIFI_GSCAN_GET_RESULT_PARAMS)) {
  10279. DBGLOG(OID, INFO, "(u4SetBufferLen != sizeof(CMD_GSCN_SCN_COFIG_T))\n");
  10280. return WLAN_STATUS_INVALID_LENGTH;
  10281. } else if (pvSetBuffer == NULL) {
  10282. DBGLOG(OID, INFO, "(pvSetBuffer == NULL)\n");
  10283. return WLAN_STATUS_INVALID_DATA;
  10284. }
  10285. if (prAdapter->fgIsRadioOff) {
  10286. DBGLOG(OID, WARN, "Return from BSSID list scan! (radio off). ACPI=D%d, Radio=%d\n",
  10287. prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
  10288. DBGLOG(OID, INFO, "Return from BSSID list scan! (radio off). ACPI=D%d, Radio=%d\n",
  10289. prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
  10290. return WLAN_STATUS_SUCCESS;
  10291. }
  10292. prGetGscnScnResultParm = (P_PARAM_WIFI_GSCAN_GET_RESULT_PARAMS) pvSetBuffer;
  10293. /*memcpy(&rGetGscnScnResultCmd, prGetGscnScnResultParm, sizeof(PARAM_WIFI_GSCAN_GET_RESULT_PARAMS) ); */
  10294. rGetGscnScnResultCmd.u4Num = prGetGscnScnResultParm->get_num;
  10295. rGetGscnScnResultCmd.ucFlush = prGetGscnScnResultParm->flush;
  10296. rGetGscnScnResultCmd.ucVersion = PSCAN_VERSION;
  10297. if (scnFsmGetGSCNResult(prAdapter, &rGetGscnScnResultCmd) == TRUE) {
  10298. DBGLOG(INIT, INFO, "wlanoidGetGSCNResult --->scnFsmGetGSCNResult\n");
  10299. /*return WLAN_STATUS_FAILURE; */
  10300. } else {
  10301. /*return WLAN_STATUS_FAILURE; */
  10302. }
  10303. return WLAN_STATUS_SUCCESS;
  10304. }
  10305. #endif