wlan_oid.c 410 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635663666376638663966406641664266436644664566466647664866496650665166526653665466556656665766586659666066616662666366646665666666676668666966706671667266736674667566766677667866796680668166826683668466856686668766886689669066916692669366946695669666976698669967006701670267036704670567066707670867096710671167126713671467156716671767186719672067216722672367246725672667276728672967306731673267336734673567366737673867396740674167426743674467456746674767486749675067516752675367546755675667576758675967606761676267636764676567666767676867696770677167726773677467756776677767786779678067816782678367846785678667876788678967906791679267936794679567966797679867996800680168026803680468056806680768086809681068116812681368146815681668176818681968206821682268236824682568266827682868296830683168326833683468356836683768386839684068416842684368446845684668476848684968506851685268536854685568566857685868596860686168626863686468656866686768686869687068716872687368746875687668776878687968806881688268836884688568866887688868896890689168926893689468956896689768986899690069016902690369046905690669076908690969106911691269136914691569166917691869196920692169226923692469256926692769286929693069316932693369346935693669376938693969406941694269436944694569466947694869496950695169526953695469556956695769586959696069616962696369646965696669676968696969706971697269736974697569766977697869796980698169826983698469856986698769886989699069916992699369946995699669976998699970007001700270037004700570067007700870097010701170127013701470157016701770187019702070217022702370247025702670277028702970307031703270337034703570367037703870397040704170427043704470457046704770487049705070517052705370547055705670577058705970607061706270637064706570667067706870697070707170727073707470757076707770787079708070817082708370847085708670877088708970907091709270937094709570967097709870997100710171027103710471057106710771087109711071117112711371147115711671177118711971207121712271237124712571267127712871297130713171327133713471357136713771387139714071417142714371447145714671477148714971507151715271537154715571567157715871597160716171627163716471657166716771687169717071717172717371747175717671777178717971807181718271837184718571867187718871897190719171927193719471957196719771987199720072017202720372047205720672077208720972107211721272137214721572167217721872197220722172227223722472257226722772287229723072317232723372347235723672377238723972407241724272437244724572467247724872497250725172527253725472557256725772587259726072617262726372647265726672677268726972707271727272737274727572767277727872797280728172827283728472857286728772887289729072917292729372947295729672977298729973007301730273037304730573067307730873097310731173127313731473157316731773187319732073217322732373247325732673277328732973307331733273337334733573367337733873397340734173427343734473457346734773487349735073517352735373547355735673577358735973607361736273637364736573667367736873697370737173727373737473757376737773787379738073817382738373847385738673877388738973907391739273937394739573967397739873997400740174027403740474057406740774087409741074117412741374147415741674177418741974207421742274237424742574267427742874297430743174327433743474357436743774387439744074417442744374447445744674477448744974507451745274537454745574567457745874597460746174627463746474657466746774687469747074717472747374747475747674777478747974807481748274837484748574867487748874897490749174927493749474957496749774987499750075017502750375047505750675077508750975107511751275137514751575167517751875197520752175227523752475257526752775287529753075317532753375347535753675377538753975407541754275437544754575467547754875497550755175527553755475557556755775587559756075617562756375647565756675677568756975707571757275737574757575767577757875797580758175827583758475857586758775887589759075917592759375947595759675977598759976007601760276037604760576067607760876097610761176127613761476157616761776187619762076217622762376247625762676277628762976307631763276337634763576367637763876397640764176427643764476457646764776487649765076517652765376547655765676577658765976607661766276637664766576667667766876697670767176727673767476757676767776787679768076817682768376847685768676877688768976907691769276937694769576967697769876997700770177027703770477057706770777087709771077117712771377147715771677177718771977207721772277237724772577267727772877297730773177327733773477357736773777387739774077417742774377447745774677477748774977507751775277537754775577567757775877597760776177627763776477657766776777687769777077717772777377747775777677777778777977807781778277837784778577867787778877897790779177927793779477957796779777987799780078017802780378047805780678077808780978107811781278137814781578167817781878197820782178227823782478257826782778287829783078317832783378347835783678377838783978407841784278437844784578467847784878497850785178527853785478557856785778587859786078617862786378647865786678677868786978707871787278737874787578767877787878797880788178827883788478857886788778887889789078917892789378947895789678977898789979007901790279037904790579067907790879097910791179127913791479157916791779187919792079217922792379247925792679277928792979307931793279337934793579367937793879397940794179427943794479457946794779487949795079517952795379547955795679577958795979607961796279637964796579667967796879697970797179727973797479757976797779787979798079817982798379847985798679877988798979907991799279937994799579967997799879998000800180028003800480058006800780088009801080118012801380148015801680178018801980208021802280238024802580268027802880298030803180328033803480358036803780388039804080418042804380448045804680478048804980508051805280538054805580568057805880598060806180628063806480658066806780688069807080718072807380748075807680778078807980808081808280838084808580868087808880898090809180928093809480958096809780988099810081018102810381048105810681078108810981108111811281138114811581168117811881198120812181228123812481258126812781288129813081318132813381348135813681378138813981408141814281438144814581468147814881498150815181528153815481558156815781588159816081618162816381648165816681678168816981708171817281738174817581768177817881798180818181828183818481858186818781888189819081918192819381948195819681978198819982008201820282038204820582068207820882098210821182128213821482158216821782188219822082218222822382248225822682278228822982308231823282338234823582368237823882398240824182428243824482458246824782488249825082518252825382548255825682578258825982608261826282638264826582668267826882698270827182728273827482758276827782788279828082818282828382848285828682878288828982908291829282938294829582968297829882998300830183028303830483058306830783088309831083118312831383148315831683178318831983208321832283238324832583268327832883298330833183328333833483358336833783388339834083418342834383448345834683478348834983508351835283538354835583568357835883598360836183628363836483658366836783688369837083718372837383748375837683778378837983808381838283838384838583868387838883898390839183928393839483958396839783988399840084018402840384048405840684078408840984108411841284138414841584168417841884198420842184228423842484258426842784288429843084318432843384348435843684378438843984408441844284438444844584468447844884498450845184528453845484558456845784588459846084618462846384648465846684678468846984708471847284738474847584768477847884798480848184828483848484858486848784888489849084918492849384948495849684978498849985008501850285038504850585068507850885098510851185128513851485158516851785188519852085218522852385248525852685278528852985308531853285338534853585368537853885398540854185428543854485458546854785488549855085518552855385548555855685578558855985608561856285638564856585668567856885698570857185728573857485758576857785788579858085818582858385848585858685878588858985908591859285938594859585968597859885998600860186028603860486058606860786088609861086118612861386148615861686178618861986208621862286238624862586268627862886298630863186328633863486358636863786388639864086418642864386448645864686478648864986508651865286538654865586568657865886598660866186628663866486658666866786688669867086718672867386748675867686778678867986808681868286838684868586868687868886898690869186928693869486958696869786988699870087018702870387048705870687078708870987108711871287138714871587168717871887198720872187228723872487258726872787288729873087318732873387348735873687378738873987408741874287438744874587468747874887498750875187528753875487558756875787588759876087618762876387648765876687678768876987708771877287738774877587768777877887798780878187828783878487858786878787888789879087918792879387948795879687978798879988008801880288038804880588068807880888098810881188128813881488158816881788188819882088218822882388248825882688278828882988308831883288338834883588368837883888398840884188428843884488458846884788488849885088518852885388548855885688578858885988608861886288638864886588668867886888698870887188728873887488758876887788788879888088818882888388848885888688878888888988908891889288938894889588968897889888998900890189028903890489058906890789088909891089118912891389148915891689178918891989208921892289238924892589268927892889298930893189328933893489358936893789388939894089418942894389448945894689478948894989508951895289538954895589568957895889598960896189628963896489658966896789688969897089718972897389748975897689778978897989808981898289838984898589868987898889898990899189928993899489958996899789988999900090019002900390049005900690079008900990109011901290139014901590169017901890199020902190229023902490259026902790289029903090319032903390349035903690379038903990409041904290439044904590469047904890499050905190529053905490559056905790589059906090619062906390649065906690679068906990709071907290739074907590769077907890799080908190829083908490859086908790889089909090919092909390949095909690979098909991009101910291039104910591069107910891099110911191129113911491159116911791189119912091219122912391249125912691279128912991309131913291339134913591369137913891399140914191429143914491459146914791489149915091519152915391549155915691579158915991609161916291639164916591669167916891699170917191729173917491759176917791789179918091819182918391849185918691879188918991909191919291939194919591969197919891999200920192029203920492059206920792089209921092119212921392149215921692179218921992209221922292239224922592269227922892299230923192329233923492359236923792389239924092419242924392449245924692479248924992509251925292539254925592569257925892599260926192629263926492659266926792689269927092719272927392749275927692779278927992809281928292839284928592869287928892899290929192929293929492959296929792989299930093019302930393049305930693079308930993109311931293139314931593169317931893199320932193229323932493259326932793289329933093319332933393349335933693379338933993409341934293439344934593469347934893499350935193529353935493559356935793589359936093619362936393649365936693679368936993709371937293739374937593769377937893799380938193829383938493859386938793889389939093919392939393949395939693979398939994009401940294039404940594069407940894099410941194129413941494159416941794189419942094219422942394249425942694279428942994309431943294339434943594369437943894399440944194429443944494459446944794489449945094519452945394549455945694579458945994609461946294639464946594669467946894699470947194729473947494759476947794789479948094819482948394849485948694879488948994909491949294939494949594969497949894999500950195029503950495059506950795089509951095119512951395149515951695179518951995209521952295239524952595269527952895299530953195329533953495359536953795389539954095419542954395449545954695479548954995509551955295539554955595569557955895599560956195629563956495659566956795689569957095719572957395749575957695779578957995809581958295839584958595869587958895899590959195929593959495959596959795989599960096019602960396049605960696079608960996109611961296139614961596169617961896199620962196229623962496259626962796289629963096319632963396349635963696379638963996409641964296439644964596469647964896499650965196529653965496559656965796589659966096619662966396649665966696679668966996709671967296739674967596769677967896799680968196829683968496859686968796889689969096919692969396949695969696979698969997009701970297039704970597069707970897099710971197129713971497159716971797189719972097219722972397249725972697279728972997309731973297339734973597369737973897399740974197429743974497459746974797489749975097519752975397549755975697579758975997609761976297639764976597669767976897699770977197729773977497759776977797789779978097819782978397849785978697879788978997909791979297939794979597969797979897999800980198029803980498059806980798089809981098119812981398149815981698179818981998209821982298239824982598269827982898299830983198329833983498359836983798389839984098419842984398449845984698479848984998509851985298539854985598569857985898599860986198629863986498659866986798689869987098719872987398749875987698779878987998809881988298839884988598869887988898899890989198929893989498959896989798989899990099019902990399049905990699079908990999109911991299139914991599169917991899199920992199229923992499259926992799289929993099319932993399349935993699379938993999409941994299439944994599469947994899499950995199529953995499559956995799589959996099619962996399649965996699679968996999709971997299739974997599769977997899799980998199829983998499859986998799889989999099919992999399949995999699979998999910000100011000210003100041000510006100071000810009100101001110012100131001410015100161001710018100191002010021100221002310024100251002610027100281002910030100311003210033100341003510036100371003810039100401004110042100431004410045100461004710048100491005010051100521005310054100551005610057100581005910060100611006210063100641006510066100671006810069100701007110072100731007410075100761007710078100791008010081100821008310084100851008610087100881008910090100911009210093100941009510096100971009810099101001010110102101031010410105101061010710108101091011010111101121011310114101151011610117101181011910120101211012210123101241012510126101271012810129101301013110132101331013410135101361013710138101391014010141101421014310144101451014610147101481014910150101511015210153101541015510156101571015810159101601016110162101631016410165101661016710168101691017010171101721017310174101751017610177101781017910180101811018210183101841018510186101871018810189101901019110192101931019410195101961019710198101991020010201102021020310204102051020610207102081020910210102111021210213102141021510216102171021810219102201022110222102231022410225102261022710228102291023010231102321023310234102351023610237102381023910240102411024210243102441024510246102471024810249102501025110252102531025410255102561025710258102591026010261102621026310264102651026610267102681026910270102711027210273102741027510276102771027810279102801028110282102831028410285102861028710288102891029010291102921029310294102951029610297102981029910300103011030210303103041030510306103071030810309103101031110312103131031410315103161031710318103191032010321103221032310324103251032610327103281032910330103311033210333103341033510336103371033810339103401034110342103431034410345103461034710348103491035010351103521035310354103551035610357103581035910360103611036210363103641036510366103671036810369103701037110372103731037410375103761037710378103791038010381103821038310384103851038610387103881038910390103911039210393103941039510396103971039810399104001040110402104031040410405104061040710408104091041010411104121041310414104151041610417104181041910420104211042210423104241042510426104271042810429104301043110432104331043410435104361043710438104391044010441104421044310444104451044610447104481044910450104511045210453104541045510456104571045810459104601046110462104631046410465104661046710468104691047010471104721047310474104751047610477104781047910480104811048210483104841048510486104871048810489104901049110492104931049410495104961049710498104991050010501105021050310504105051050610507105081050910510105111051210513105141051510516105171051810519105201052110522105231052410525105261052710528105291053010531105321053310534105351053610537105381053910540105411054210543105441054510546105471054810549105501055110552105531055410555105561055710558105591056010561105621056310564105651056610567105681056910570105711057210573105741057510576105771057810579105801058110582105831058410585105861058710588105891059010591105921059310594105951059610597105981059910600106011060210603106041060510606106071060810609106101061110612106131061410615106161061710618106191062010621106221062310624106251062610627106281062910630106311063210633106341063510636106371063810639106401064110642106431064410645106461064710648106491065010651106521065310654106551065610657106581065910660106611066210663106641066510666106671066810669106701067110672106731067410675106761067710678106791068010681106821068310684106851068610687106881068910690106911069210693106941069510696106971069810699107001070110702107031070410705107061070710708107091071010711107121071310714107151071610717107181071910720107211072210723107241072510726107271072810729107301073110732107331073410735107361073710738107391074010741107421074310744107451074610747107481074910750107511075210753107541075510756107571075810759107601076110762107631076410765107661076710768107691077010771107721077310774107751077610777107781077910780107811078210783107841078510786107871078810789107901079110792107931079410795107961079710798107991080010801108021080310804108051080610807108081080910810108111081210813108141081510816108171081810819108201082110822108231082410825108261082710828108291083010831108321083310834108351083610837108381083910840108411084210843108441084510846108471084810849108501085110852108531085410855108561085710858108591086010861108621086310864108651086610867108681086910870108711087210873108741087510876108771087810879108801088110882108831088410885108861088710888108891089010891108921089310894108951089610897108981089910900109011090210903109041090510906109071090810909109101091110912109131091410915109161091710918109191092010921109221092310924109251092610927109281092910930109311093210933109341093510936109371093810939109401094110942109431094410945109461094710948109491095010951109521095310954109551095610957109581095910960109611096210963109641096510966109671096810969109701097110972109731097410975109761097710978109791098010981109821098310984109851098610987109881098910990109911099210993109941099510996109971099810999110001100111002110031100411005110061100711008110091101011011110121101311014110151101611017110181101911020110211102211023110241102511026110271102811029110301103111032110331103411035110361103711038110391104011041110421104311044110451104611047110481104911050110511105211053110541105511056110571105811059110601106111062110631106411065110661106711068110691107011071110721107311074110751107611077110781107911080110811108211083110841108511086110871108811089110901109111092110931109411095110961109711098110991110011101111021110311104111051110611107111081110911110111111111211113111141111511116111171111811119111201112111122111231112411125111261112711128111291113011131111321113311134111351113611137111381113911140111411114211143111441114511146111471114811149111501115111152111531115411155111561115711158111591116011161111621116311164111651116611167111681116911170111711117211173111741117511176111771117811179111801118111182111831118411185111861118711188111891119011191111921119311194111951119611197111981119911200112011120211203112041120511206112071120811209112101121111212112131121411215112161121711218112191122011221112221122311224112251122611227112281122911230112311123211233112341123511236112371123811239112401124111242112431124411245112461124711248112491125011251112521125311254112551125611257112581125911260112611126211263112641126511266112671126811269112701127111272112731127411275112761127711278112791128011281112821128311284112851128611287112881128911290112911129211293112941129511296112971129811299113001130111302113031130411305113061130711308113091131011311113121131311314113151131611317113181131911320113211132211323113241132511326113271132811329113301133111332113331133411335113361133711338113391134011341113421134311344113451134611347113481134911350113511135211353113541135511356113571135811359113601136111362113631136411365113661136711368113691137011371113721137311374113751137611377113781137911380113811138211383113841138511386113871138811389113901139111392113931139411395113961139711398113991140011401114021140311404114051140611407114081140911410114111141211413114141141511416114171141811419114201142111422114231142411425114261142711428114291143011431114321143311434114351143611437114381143911440114411144211443114441144511446114471144811449114501145111452114531145411455114561145711458114591146011461114621146311464114651146611467114681146911470114711147211473114741147511476114771147811479114801148111482114831148411485114861148711488114891149011491114921149311494114951149611497114981149911500115011150211503115041150511506115071150811509115101151111512115131151411515115161151711518115191152011521115221152311524115251152611527115281152911530115311153211533115341153511536115371153811539115401154111542115431154411545115461154711548115491155011551115521155311554115551155611557115581155911560115611156211563115641156511566115671156811569115701157111572115731157411575115761157711578115791158011581115821158311584115851158611587115881158911590115911159211593115941159511596115971159811599116001160111602116031160411605116061160711608116091161011611116121161311614116151161611617116181161911620116211162211623116241162511626116271162811629116301163111632116331163411635116361163711638116391164011641116421164311644116451164611647116481164911650116511165211653116541165511656116571165811659116601166111662116631166411665116661166711668116691167011671116721167311674116751167611677116781167911680116811168211683116841168511686116871168811689116901169111692116931169411695116961169711698116991170011701117021170311704117051170611707117081170911710117111171211713117141171511716117171171811719117201172111722117231172411725117261172711728117291173011731117321173311734117351173611737117381173911740117411174211743117441174511746117471174811749117501175111752117531175411755117561175711758117591176011761117621176311764117651176611767117681176911770117711177211773117741177511776117771177811779117801178111782117831178411785117861178711788117891179011791117921179311794117951179611797117981179911800118011180211803118041180511806118071180811809118101181111812118131181411815118161181711818118191182011821118221182311824118251182611827118281182911830118311183211833118341183511836118371183811839118401184111842118431184411845118461184711848118491185011851118521185311854118551185611857118581185911860118611186211863118641186511866118671186811869118701187111872118731187411875118761187711878118791188011881118821188311884118851188611887118881188911890118911189211893118941189511896118971189811899119001190111902119031190411905119061190711908119091191011911119121191311914119151191611917119181191911920119211192211923119241192511926119271192811929119301193111932119331193411935119361193711938119391194011941
  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 = sizeof(PARAM_MTK_WIFI_TEST_STRUCT_T);
  7351. if (u4QueryBufferLen != sizeof(PARAM_MTK_WIFI_TEST_STRUCT_T)) {
  7352. DBGLOG(OID, ERROR, "Invalid data. QueryBufferLen: %ld.\n", u4QueryBufferLen);
  7353. return WLAN_STATUS_INVALID_LENGTH;
  7354. }
  7355. prRfATInfo = (P_PARAM_MTK_WIFI_TEST_STRUCT_T) pvQueryBuffer;
  7356. rStatus = rftestQueryATInfo(prAdapter,
  7357. prRfATInfo->u4FuncIndex, prRfATInfo->u4FuncData, pvQueryBuffer, u4QueryBufferLen);
  7358. return rStatus;
  7359. }
  7360. /*----------------------------------------------------------------------------*/
  7361. /*!
  7362. * \brief Set RF test parameter
  7363. *
  7364. * \param[in] prAdapter Pointer to the Adapter structure.
  7365. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  7366. * \param[in] u4SetBufferLen The length of the set buffer.
  7367. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  7368. * bytes read from the set buffer. If the call failed
  7369. * due to invalid length of the set buffer, returns
  7370. * the amount of storage needed.
  7371. *
  7372. * \return WLAN_STATUS_SUCCESS
  7373. * \return WLAN_STATUS_ADAPTER_NOT_READY
  7374. * \return WLAN_STATUS_INVALID_LENGTH
  7375. */
  7376. /*----------------------------------------------------------------------------*/
  7377. WLAN_STATUS
  7378. wlanoidRftestSetAutoTest(IN P_ADAPTER_T prAdapter,
  7379. OUT PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  7380. {
  7381. P_PARAM_MTK_WIFI_TEST_STRUCT_T prRfATInfo;
  7382. WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
  7383. DEBUGFUNC("wlanoidRftestSetAutoTest");
  7384. ASSERT(prAdapter);
  7385. ASSERT(pvSetBuffer);
  7386. ASSERT(pu4SetInfoLen);
  7387. *pu4SetInfoLen = sizeof(PARAM_MTK_WIFI_TEST_STRUCT_T);
  7388. if (u4SetBufferLen != sizeof(PARAM_MTK_WIFI_TEST_STRUCT_T)) {
  7389. DBGLOG(OID, ERROR, "Invalid data. SetBufferLen: %u.\n", u4SetBufferLen);
  7390. return WLAN_STATUS_INVALID_LENGTH;
  7391. }
  7392. prRfATInfo = (P_PARAM_MTK_WIFI_TEST_STRUCT_T) pvSetBuffer;
  7393. rStatus = rftestSetATInfo(prAdapter, prRfATInfo->u4FuncIndex, prRfATInfo->u4FuncData);
  7394. return rStatus;
  7395. }
  7396. /* RF test OID set handler */
  7397. WLAN_STATUS rftestSetATInfo(IN P_ADAPTER_T prAdapter, UINT_32 u4FuncIndex, UINT_32 u4FuncData)
  7398. {
  7399. P_GLUE_INFO_T prGlueInfo;
  7400. P_CMD_INFO_T prCmdInfo;
  7401. P_WIFI_CMD_T prWifiCmd;
  7402. P_CMD_TEST_CTRL_T pCmdTestCtrl;
  7403. UINT_8 ucCmdSeqNum;
  7404. ASSERT(prAdapter);
  7405. prGlueInfo = prAdapter->prGlueInfo;
  7406. prCmdInfo = cmdBufAllocateCmdInfo(prAdapter, (CMD_HDR_SIZE + sizeof(CMD_TEST_CTRL_T)));
  7407. if (!prCmdInfo) {
  7408. DBGLOG(OID, ERROR, "Allocate CMD_INFO_T ==> FAILED.\n");
  7409. return WLAN_STATUS_FAILURE;
  7410. }
  7411. /* increase command sequence number */
  7412. ucCmdSeqNum = nicIncreaseCmdSeqNum(prAdapter);
  7413. /* Setup common CMD Info Packet */
  7414. prCmdInfo->eCmdType = COMMAND_TYPE_GENERAL_IOCTL;
  7415. prCmdInfo->u2InfoBufLen = CMD_HDR_SIZE + sizeof(CMD_TEST_CTRL_T);
  7416. prCmdInfo->pfCmdDoneHandler = nicCmdEventSetCommon;
  7417. prCmdInfo->pfCmdTimeoutHandler = nicOidCmdTimeoutCommon;
  7418. prCmdInfo->fgIsOid = TRUE;
  7419. prCmdInfo->ucCID = CMD_ID_TEST_CTRL;
  7420. prCmdInfo->fgSetQuery = TRUE;
  7421. prCmdInfo->fgNeedResp = FALSE;
  7422. prCmdInfo->fgDriverDomainMCR = FALSE;
  7423. prCmdInfo->ucCmdSeqNum = ucCmdSeqNum;
  7424. prCmdInfo->u4SetInfoLen = sizeof(CMD_TEST_CTRL_T);
  7425. prCmdInfo->pvInformationBuffer = NULL;
  7426. prCmdInfo->u4InformationBufferLength = 0;
  7427. /* Setup WIFI_CMD_T (payload = CMD_TEST_CTRL_T) */
  7428. prWifiCmd = (P_WIFI_CMD_T) (prCmdInfo->pucInfoBuffer);
  7429. prWifiCmd->u2TxByteCount = prCmdInfo->u2InfoBufLen;
  7430. prWifiCmd->u2PQ_ID = CMD_PQ_ID;
  7431. prWifiCmd->ucPktTypeID = CMD_PACKET_TYPE_ID;
  7432. prWifiCmd->ucCID = prCmdInfo->ucCID;
  7433. prWifiCmd->ucSetQuery = prCmdInfo->fgSetQuery;
  7434. prWifiCmd->ucSeqNum = prCmdInfo->ucCmdSeqNum;
  7435. pCmdTestCtrl = (P_CMD_TEST_CTRL_T) (prWifiCmd->aucBuffer);
  7436. pCmdTestCtrl->ucAction = 1; /* Set ATInfo */
  7437. pCmdTestCtrl->u.rRfATInfo.u4FuncIndex = u4FuncIndex;
  7438. pCmdTestCtrl->u.rRfATInfo.u4FuncData = u4FuncData;
  7439. if ((u4FuncIndex == RF_AT_FUNCID_COMMAND) && (u4FuncData == RF_AT_COMMAND_ICAP)) {
  7440. g_bIcapEnable = TRUE;
  7441. g_bCaptureDone = FALSE;
  7442. }
  7443. /* ICAP dump name Reset */
  7444. if ((u4FuncIndex == RF_AT_FUNCID_COMMAND) && (u4FuncData == RF_AT_COMMAND_RESET_DUMP_NAME))
  7445. g_u2DumpIndex = 0;
  7446. /* insert into prCmdQueue */
  7447. kalEnqueueCommand(prGlueInfo, (P_QUE_ENTRY_T) prCmdInfo);
  7448. /* wakeup txServiceThread later */
  7449. GLUE_SET_EVENT(prAdapter->prGlueInfo);
  7450. return WLAN_STATUS_PENDING;
  7451. }
  7452. WLAN_STATUS
  7453. rftestQueryATInfo(IN P_ADAPTER_T prAdapter,
  7454. UINT_32 u4FuncIndex, UINT_32 u4FuncData, OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen)
  7455. {
  7456. P_GLUE_INFO_T prGlueInfo;
  7457. P_CMD_INFO_T prCmdInfo;
  7458. P_WIFI_CMD_T prWifiCmd;
  7459. P_CMD_TEST_CTRL_T pCmdTestCtrl;
  7460. UINT_8 ucCmdSeqNum;
  7461. P_EVENT_TEST_STATUS prTestStatus;
  7462. ASSERT(prAdapter);
  7463. prGlueInfo = prAdapter->prGlueInfo;
  7464. if (u4FuncIndex == RF_AT_FUNCID_FW_INFO) {
  7465. /* driver implementation */
  7466. prTestStatus = (P_EVENT_TEST_STATUS) pvQueryBuffer;
  7467. prTestStatus->rATInfo.u4FuncData =
  7468. (prAdapter->rVerInfo.u2FwProductID << 16) | (prAdapter->rVerInfo.u2FwOwnVersion);
  7469. u4QueryBufferLen = sizeof(EVENT_TEST_STATUS);
  7470. } else if (u4FuncIndex == RF_AT_FUNCID_DRV_INFO) {
  7471. /* driver implementation */
  7472. prTestStatus = (P_EVENT_TEST_STATUS) pvQueryBuffer;
  7473. prTestStatus->rATInfo.u4FuncData = CFG_DRV_OWN_VERSION;
  7474. u4QueryBufferLen = sizeof(EVENT_TEST_STATUS);
  7475. } else if (u4FuncIndex == RF_AT_FUNCID_QUERY_ICAP_DUMP_FILE) {
  7476. /* driver implementation */
  7477. prTestStatus = (P_EVENT_TEST_STATUS) pvQueryBuffer;
  7478. prTestStatus->rATInfo.u4FuncData = g_u2DumpIndex;
  7479. u4QueryBufferLen = sizeof(EVENT_TEST_STATUS);
  7480. } else {
  7481. prCmdInfo = cmdBufAllocateCmdInfo(prAdapter, (CMD_HDR_SIZE + sizeof(CMD_TEST_CTRL_T)));
  7482. if (!prCmdInfo) {
  7483. DBGLOG(INIT, ERROR, "Allocate CMD_INFO_T ==> FAILED.\n");
  7484. return WLAN_STATUS_FAILURE;
  7485. }
  7486. /* increase command sequence number */
  7487. ucCmdSeqNum = nicIncreaseCmdSeqNum(prAdapter);
  7488. /* Setup common CMD Info Packet */
  7489. prCmdInfo->eCmdType = COMMAND_TYPE_GENERAL_IOCTL;
  7490. prCmdInfo->u2InfoBufLen = CMD_HDR_SIZE + sizeof(CMD_TEST_CTRL_T);
  7491. prCmdInfo->pfCmdDoneHandler = nicCmdEventQueryRfTestATInfo;
  7492. prCmdInfo->pfCmdTimeoutHandler = nicOidCmdTimeoutCommon;
  7493. prCmdInfo->fgIsOid = TRUE;
  7494. prCmdInfo->ucCID = CMD_ID_TEST_CTRL;
  7495. prCmdInfo->fgSetQuery = FALSE;
  7496. prCmdInfo->fgNeedResp = TRUE;
  7497. prCmdInfo->fgDriverDomainMCR = FALSE;
  7498. prCmdInfo->ucCmdSeqNum = ucCmdSeqNum;
  7499. prCmdInfo->u4SetInfoLen = sizeof(CMD_TEST_CTRL_T);
  7500. prCmdInfo->pvInformationBuffer = pvQueryBuffer;
  7501. prCmdInfo->u4InformationBufferLength = u4QueryBufferLen;
  7502. /* Setup WIFI_CMD_T (payload = CMD_TEST_CTRL_T) */
  7503. prWifiCmd = (P_WIFI_CMD_T) (prCmdInfo->pucInfoBuffer);
  7504. prWifiCmd->u2TxByteCount = prCmdInfo->u2InfoBufLen;
  7505. prWifiCmd->u2PQ_ID = CMD_PQ_ID;
  7506. prWifiCmd->ucPktTypeID = CMD_PACKET_TYPE_ID;
  7507. prWifiCmd->ucCID = prCmdInfo->ucCID;
  7508. prWifiCmd->ucSetQuery = prCmdInfo->fgSetQuery;
  7509. prWifiCmd->ucSeqNum = prCmdInfo->ucCmdSeqNum;
  7510. pCmdTestCtrl = (P_CMD_TEST_CTRL_T) (prWifiCmd->aucBuffer);
  7511. pCmdTestCtrl->ucAction = 2; /* Get ATInfo */
  7512. pCmdTestCtrl->u.rRfATInfo.u4FuncIndex = u4FuncIndex;
  7513. pCmdTestCtrl->u.rRfATInfo.u4FuncData = u4FuncData;
  7514. /* insert into prCmdQueue */
  7515. kalEnqueueCommand(prGlueInfo, (P_QUE_ENTRY_T) prCmdInfo);
  7516. /* wakeup txServiceThread later */
  7517. GLUE_SET_EVENT(prAdapter->prGlueInfo);
  7518. return WLAN_STATUS_PENDING;
  7519. }
  7520. return WLAN_STATUS_SUCCESS;
  7521. }
  7522. WLAN_STATUS rftestSetFrequency(IN P_ADAPTER_T prAdapter, IN UINT_32 u4FreqInKHz, IN PUINT_32 pu4SetInfoLen)
  7523. {
  7524. CMD_TEST_CTRL_T rCmdTestCtrl;
  7525. ASSERT(prAdapter);
  7526. rCmdTestCtrl.ucAction = 5; /* Set Channel Frequency */
  7527. rCmdTestCtrl.u.u4ChannelFreq = u4FreqInKHz;
  7528. return wlanSendSetQueryCmd(prAdapter,
  7529. CMD_ID_TEST_CTRL,
  7530. TRUE,
  7531. FALSE,
  7532. TRUE,
  7533. nicCmdEventSetCommon,
  7534. nicOidCmdTimeoutCommon, sizeof(CMD_TEST_CTRL_T), (PUINT_8) &rCmdTestCtrl, NULL, 0);
  7535. }
  7536. /*----------------------------------------------------------------------------*/
  7537. /*!
  7538. * \brief command packet generation utility
  7539. *
  7540. * \param[in] prAdapter Pointer to the Adapter structure.
  7541. * \param[in] ucCID Command ID
  7542. * \param[in] fgSetQuery Set or Query
  7543. * \param[in] fgNeedResp Need for response
  7544. * \param[in] pfCmdDoneHandler Function pointer when command is done
  7545. * \param[in] u4SetQueryInfoLen The length of the set/query buffer
  7546. * \param[in] pucInfoBuffer Pointer to set/query buffer
  7547. *
  7548. *
  7549. * \retval WLAN_STATUS_PENDING
  7550. * \retval WLAN_STATUS_FAILURE
  7551. */
  7552. /*----------------------------------------------------------------------------*/
  7553. WLAN_STATUS
  7554. wlanSendSetQueryCmd(IN P_ADAPTER_T prAdapter,
  7555. UINT_8 ucCID,
  7556. BOOLEAN fgSetQuery,
  7557. BOOLEAN fgNeedResp,
  7558. BOOLEAN fgIsOid,
  7559. PFN_CMD_DONE_HANDLER pfCmdDoneHandler,
  7560. PFN_CMD_TIMEOUT_HANDLER pfCmdTimeoutHandler,
  7561. UINT_32 u4SetQueryInfoLen,
  7562. PUINT_8 pucInfoBuffer, OUT PVOID pvSetQueryBuffer, IN UINT_32 u4SetQueryBufferLen)
  7563. {
  7564. P_GLUE_INFO_T prGlueInfo;
  7565. P_CMD_INFO_T prCmdInfo;
  7566. P_WIFI_CMD_T prWifiCmd;
  7567. UINT_8 ucCmdSeqNum;
  7568. prGlueInfo = prAdapter->prGlueInfo;
  7569. prCmdInfo = cmdBufAllocateCmdInfo(prAdapter, (CMD_HDR_SIZE + u4SetQueryInfoLen));
  7570. DEBUGFUNC("wlanSendSetQueryCmd");
  7571. if (!prCmdInfo || !prAdapter || !prAdapter->prAisBssInfo) {
  7572. DBGLOG(OID, ERROR, "prCmdInfo, prAdapter or prAisBssInfo is not allocated.\n");
  7573. return WLAN_STATUS_FAILURE;
  7574. }
  7575. /* increase command sequence number */
  7576. ucCmdSeqNum = nicIncreaseCmdSeqNum(prAdapter);
  7577. DBGLOG(OID, TRACE, "ucCmdSeqNum =%d\n", ucCmdSeqNum);
  7578. /* Setup common CMD Info Packet */
  7579. prCmdInfo->eCmdType = COMMAND_TYPE_NETWORK_IOCTL;
  7580. prCmdInfo->ucBssIndex = prAdapter->prAisBssInfo->ucBssIndex;
  7581. prCmdInfo->u2InfoBufLen = (UINT_16) (CMD_HDR_SIZE + u4SetQueryInfoLen);
  7582. prCmdInfo->pfCmdDoneHandler = pfCmdDoneHandler;
  7583. prCmdInfo->pfCmdTimeoutHandler = pfCmdTimeoutHandler;
  7584. prCmdInfo->fgIsOid = fgIsOid;
  7585. prCmdInfo->ucCID = ucCID;
  7586. prCmdInfo->fgSetQuery = fgSetQuery;
  7587. prCmdInfo->fgNeedResp = fgNeedResp;
  7588. prCmdInfo->fgDriverDomainMCR = FALSE;
  7589. prCmdInfo->ucCmdSeqNum = ucCmdSeqNum;
  7590. prCmdInfo->u4SetInfoLen = u4SetQueryInfoLen;
  7591. prCmdInfo->pvInformationBuffer = pvSetQueryBuffer;
  7592. prCmdInfo->u4InformationBufferLength = u4SetQueryBufferLen;
  7593. /* Setup WIFI_CMD_T (no payload) */
  7594. prWifiCmd = (P_WIFI_CMD_T) (prCmdInfo->pucInfoBuffer);
  7595. prWifiCmd->u2TxByteCount = prCmdInfo->u2InfoBufLen;
  7596. prWifiCmd->u2PQ_ID = CMD_PQ_ID;
  7597. prWifiCmd->ucPktTypeID = CMD_PACKET_TYPE_ID;
  7598. prWifiCmd->ucCID = prCmdInfo->ucCID;
  7599. prWifiCmd->ucSetQuery = prCmdInfo->fgSetQuery;
  7600. prWifiCmd->ucSeqNum = prCmdInfo->ucCmdSeqNum;
  7601. if (u4SetQueryInfoLen > 0 && pucInfoBuffer != NULL)
  7602. kalMemCopy(prWifiCmd->aucBuffer, pucInfoBuffer, u4SetQueryInfoLen);
  7603. /* insert into prCmdQueue */
  7604. kalEnqueueCommand(prGlueInfo, (P_QUE_ENTRY_T) prCmdInfo);
  7605. /* wakeup txServiceThread later */
  7606. GLUE_SET_EVENT(prGlueInfo);
  7607. return WLAN_STATUS_PENDING;
  7608. }
  7609. #if CFG_SUPPORT_WAPI
  7610. /*----------------------------------------------------------------------------*/
  7611. /*!
  7612. * \brief This routine is called by WAPI ui to set wapi mode, which is needed to info the the driver
  7613. * to operation at WAPI mode while driver initialize.
  7614. *
  7615. * \param[in] prAdapter Pointer to the Adapter structure
  7616. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set
  7617. * \param[in] u4SetBufferLen The length of the set buffer
  7618. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  7619. * bytes read from the set buffer. If the call failed due to invalid length of
  7620. * the set buffer, returns the amount of storage needed.
  7621. *
  7622. * \retval WLAN_STATUS_SUCCESS
  7623. * \retval WLAN_STATUS_INVALID_DATA If new setting value is wrong.
  7624. * \retval WLAN_STATUS_INVALID_LENGTH
  7625. *
  7626. */
  7627. /*----------------------------------------------------------------------------*/
  7628. WLAN_STATUS
  7629. wlanoidSetWapiMode(IN P_ADAPTER_T prAdapter,
  7630. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  7631. {
  7632. DEBUGFUNC("wlanoidSetWapiMode");
  7633. DBGLOG(OID, LOUD, "\r\n");
  7634. ASSERT(prAdapter);
  7635. ASSERT(pu4SetInfoLen);
  7636. ASSERT(pvSetBuffer);
  7637. /* Todo:: For support WAPI and Wi-Fi at same driver, use the set wapi assoc ie at the check point */
  7638. /* The Adapter Connection setting fgUseWapi will cleat whil oid set mode (infra), */
  7639. /* And set fgUseWapi True while set wapi assoc ie */
  7640. /* policay selection, add key all depend on this flag, */
  7641. /* The fgUseWapi may remove later */
  7642. if (*(PUINT_32) pvSetBuffer)
  7643. prAdapter->fgUseWapi = TRUE;
  7644. else
  7645. prAdapter->fgUseWapi = FALSE;
  7646. #if 0
  7647. prCmdInfo = cmdBufAllocateCmdInfo(prAdapter, (CMD_HDR_SIZE + 4));
  7648. if (!prCmdInfo) {
  7649. DBGLOG(OID, ERROR, "Allocate CMD_INFO_T ==> FAILED.\n");
  7650. return WLAN_STATUS_FAILURE;
  7651. }
  7652. /* increase command sequence number */
  7653. ucCmdSeqNum = nicIncreaseCmdSeqNum(prAdapter);
  7654. /* compose CMD_BUILD_CONNECTION cmd pkt */
  7655. prCmdInfo->eCmdType = COMMAND_TYPE_NETWORK_IOCTL;
  7656. prCmdInfo->ucBssIndex = prAdapter->prAisBssInfo->ucBssIndex;
  7657. prCmdInfo->u2InfoBufLen = CMD_HDR_SIZE + 4;
  7658. prCmdInfo->pfCmdDoneHandler = nicCmdEventSetCommon;
  7659. prCmdInfo->pfCmdTimeoutHandler = NULL;
  7660. prCmdInfo->fgIsOid = TRUE;
  7661. prCmdInfo->ucCID = CMD_ID_WAPI_MODE;
  7662. prCmdInfo->fgSetQuery = TRUE;
  7663. prCmdInfo->fgNeedResp = FALSE;
  7664. prCmdInfo->fgDriverDomainMCR = FALSE;
  7665. prCmdInfo->ucCmdSeqNum = ucCmdSeqNum;
  7666. prCmdInfo->u4SetInfoLen = u4SetBufferLen;
  7667. prCmdInfo->pvInformationBuffer = pvSetBuffer;
  7668. prCmdInfo->u4InformationBufferLength = u4SetBufferLen;
  7669. /* Setup WIFI_CMD_T */
  7670. prWifiCmd = (P_WIFI_CMD_T) (prCmdInfo->pucInfoBuffer);
  7671. prWifiCmd->u2TxByteCount = prCmdInfo->u2InfoBufLen;
  7672. prWifiCmd->u2PQ_ID = CMD_PQ_ID;
  7673. prWifiCmd->ucPktTypeID = CMD_PACKET_TYPE_ID;
  7674. prWifiCmd->ucCID = prCmdInfo->ucCID;
  7675. prWifiCmd->ucSetQuery = prCmdInfo->fgSetQuery;
  7676. prWifiCmd->ucSeqNum = prCmdInfo->ucCmdSeqNum;
  7677. cp = (PUINT_8) (prWifiCmd->aucBuffer);
  7678. kalMemCopy(cp, (PUINT_8) pvSetBuffer, 4);
  7679. /* insert into prCmdQueue */
  7680. kalEnqueueCommand(prGlueInfo, (P_QUE_ENTRY_T) prCmdInfo);
  7681. /* wakeup txServiceThread later */
  7682. GLUE_SET_EVENT(prGlueInfo);
  7683. return WLAN_STATUS_PENDING;
  7684. #else
  7685. return WLAN_STATUS_SUCCESS;
  7686. #endif
  7687. }
  7688. /*----------------------------------------------------------------------------*/
  7689. /*!
  7690. * \brief This routine is called by WAPI to set the assoc info, which is needed to add to
  7691. * Association request frame while join WAPI AP.
  7692. *
  7693. * \param[in] prAdapter Pointer to the Adapter structure
  7694. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set
  7695. * \param[in] u4SetBufferLen The length of the set buffer
  7696. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  7697. * bytes read from the set buffer. If the call failed due to invalid length of
  7698. * the set buffer, returns the amount of storage needed.
  7699. *
  7700. * \retval WLAN_STATUS_SUCCESS
  7701. * \retval WLAN_STATUS_INVALID_DATA If new setting value is wrong.
  7702. * \retval WLAN_STATUS_INVALID_LENGTH
  7703. *
  7704. */
  7705. /*----------------------------------------------------------------------------*/
  7706. WLAN_STATUS
  7707. wlanoidSetWapiAssocInfo(IN P_ADAPTER_T prAdapter,
  7708. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  7709. {
  7710. P_WAPI_INFO_ELEM_T prWapiInfo;
  7711. PUINT_8 cp;
  7712. UINT_16 u2AuthSuiteCount = 0;
  7713. UINT_16 u2PairSuiteCount = 0;
  7714. UINT_32 u4AuthKeyMgtSuite = 0;
  7715. UINT_32 u4PairSuite = 0;
  7716. UINT_32 u4GroupSuite = 0;
  7717. UINT_16 u2IeLength = 0;
  7718. ASSERT(prAdapter);
  7719. ASSERT(pvSetBuffer);
  7720. ASSERT(pu4SetInfoLen);
  7721. DEBUGFUNC("wlanoidSetWapiAssocInfo");
  7722. DBGLOG(OID, LOUD, "\r\n");
  7723. prAdapter->rWifiVar.rConnSettings.fgWapiMode = FALSE;
  7724. if (u4SetBufferLen < 20 /* From EID to Group cipher */)
  7725. return WLAN_STATUS_INVALID_LENGTH;
  7726. if (!wextSrchDesiredWAPIIE((PUINT_8) pvSetBuffer, u4SetBufferLen, (PUINT_8 *) &prWapiInfo))
  7727. return WLAN_STATUS_INVALID_LENGTH;
  7728. if (!prWapiInfo || prWapiInfo->ucLength < 18)
  7729. return WLAN_STATUS_INVALID_LENGTH;
  7730. u2IeLength = prWapiInfo->ucLength + 2;
  7731. /* Skip Version check */
  7732. cp = (PUINT_8) &prWapiInfo->u2AuthKeyMgtSuiteCount;
  7733. WLAN_GET_FIELD_16(cp, &u2AuthSuiteCount);
  7734. if (u2AuthSuiteCount > 1)
  7735. return WLAN_STATUS_INVALID_LENGTH;
  7736. cp += 2;
  7737. WLAN_GET_FIELD_32(cp, &u4AuthKeyMgtSuite);
  7738. DBGLOG(SEC, TRACE, "WAPI: Assoc Info auth mgt suite [%d]: %02x-%02x-%02x-%02x\n",
  7739. u2AuthSuiteCount,
  7740. (UCHAR) (u4AuthKeyMgtSuite & 0x000000FF),
  7741. (UCHAR) ((u4AuthKeyMgtSuite >> 8) & 0x000000FF),
  7742. (UCHAR) ((u4AuthKeyMgtSuite >> 16) & 0x000000FF), (UCHAR) ((u4AuthKeyMgtSuite >> 24) & 0x000000FF));
  7743. if (u4AuthKeyMgtSuite != WAPI_AKM_SUITE_802_1X && u4AuthKeyMgtSuite != WAPI_AKM_SUITE_PSK)
  7744. ASSERT(FALSE);
  7745. cp += 4;
  7746. WLAN_GET_FIELD_16(cp, &u2PairSuiteCount);
  7747. if (u2PairSuiteCount > 1)
  7748. return WLAN_STATUS_INVALID_LENGTH;
  7749. cp += 2;
  7750. WLAN_GET_FIELD_32(cp, &u4PairSuite);
  7751. DBGLOG(SEC, TRACE, "WAPI: Assoc Info pairwise cipher suite [%d]: %02x-%02x-%02x-%02x\n",
  7752. u2PairSuiteCount,
  7753. (UCHAR) (u4PairSuite & 0x000000FF),
  7754. (UCHAR) ((u4PairSuite >> 8) & 0x000000FF),
  7755. (UCHAR) ((u4PairSuite >> 16) & 0x000000FF), (UCHAR) ((u4PairSuite >> 24) & 0x000000FF));
  7756. if (u4PairSuite != WAPI_CIPHER_SUITE_WPI)
  7757. ASSERT(FALSE);
  7758. cp += 4;
  7759. WLAN_GET_FIELD_32(cp, &u4GroupSuite);
  7760. DBGLOG(SEC, TRACE, "WAPI: Assoc Info group cipher suite : %02x-%02x-%02x-%02x\n",
  7761. (UCHAR) (u4GroupSuite & 0x000000FF),
  7762. (UCHAR) ((u4GroupSuite >> 8) & 0x000000FF),
  7763. (UCHAR) ((u4GroupSuite >> 16) & 0x000000FF), (UCHAR) ((u4GroupSuite >> 24) & 0x000000FF));
  7764. if (u4GroupSuite != WAPI_CIPHER_SUITE_WPI)
  7765. ASSERT(FALSE);
  7766. prAdapter->rWifiVar.rConnSettings.u4WapiSelectedAKMSuite = u4AuthKeyMgtSuite;
  7767. prAdapter->rWifiVar.rConnSettings.u4WapiSelectedPairwiseCipher = u4PairSuite;
  7768. prAdapter->rWifiVar.rConnSettings.u4WapiSelectedGroupCipher = u4GroupSuite;
  7769. kalMemCopy(prAdapter->prGlueInfo->aucWapiAssocInfoIEs, prWapiInfo, u2IeLength);
  7770. prAdapter->prGlueInfo->u2WapiAssocInfoIESz = u2IeLength;
  7771. DBGLOG(SEC, TRACE, "Assoc Info IE sz %ld\n", u2IeLength);
  7772. prAdapter->rWifiVar.rConnSettings.fgWapiMode = TRUE;
  7773. return WLAN_STATUS_SUCCESS;
  7774. }
  7775. /*----------------------------------------------------------------------------*/
  7776. /*!
  7777. * \brief This routine is called to set the wpi key to the driver.
  7778. *
  7779. * \param[in] prAdapter Pointer to the Adapter structure.
  7780. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  7781. * \param[in] u4SetBufferLen The length of the set buffer.
  7782. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  7783. * bytes read from the set buffer. If the call failed
  7784. * due to invalid length of the set buffer, returns
  7785. * the amount of storage needed.
  7786. *
  7787. * \retval WLAN_STATUS_SUCCESS
  7788. * \retval WLAN_STATUS_ADAPTER_NOT_READY
  7789. * \retval WLAN_STATUS_INVALID_LENGTH
  7790. * \retval WLAN_STATUS_INVALID_DATA
  7791. *
  7792. * \note The setting buffer P_PARAM_WPI_KEY, which is set by NDIS, is unpacked.
  7793. */
  7794. /*----------------------------------------------------------------------------*/
  7795. WLAN_STATUS
  7796. wlanoidSetWapiKey(IN P_ADAPTER_T prAdapter, IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  7797. {
  7798. P_GLUE_INFO_T prGlueInfo;
  7799. P_CMD_INFO_T prCmdInfo;
  7800. P_WIFI_CMD_T prWifiCmd;
  7801. P_PARAM_WPI_KEY_T prNewKey;
  7802. P_CMD_802_11_KEY prCmdKey;
  7803. PUINT_8 pc;
  7804. UINT_8 ucCmdSeqNum;
  7805. P_STA_RECORD_T prStaRec;
  7806. P_BSS_INFO_T prBssInfo;
  7807. DEBUGFUNC("wlanoidSetWapiKey");
  7808. DBGLOG(OID, LOUD, "\r\n");
  7809. ASSERT(prAdapter);
  7810. ASSERT(pvSetBuffer);
  7811. ASSERT(pu4SetInfoLen);
  7812. if (prAdapter->rAcpiState == ACPI_STATE_D3) {
  7813. DBGLOG(OID, WARN,
  7814. "Fail in set add key! (Adapter not ready). ACPI=D%d, Radio=%d\r\n",
  7815. prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
  7816. return WLAN_STATUS_ADAPTER_NOT_READY;
  7817. }
  7818. prNewKey = (P_PARAM_WPI_KEY_T) pvSetBuffer;
  7819. DBGLOG_MEM8(OID, TRACE, (PUINT_8) pvSetBuffer, 560);
  7820. pc = (PUINT_8) pvSetBuffer;
  7821. *pu4SetInfoLen = u4SetBufferLen;
  7822. /* Todo:: WAPI AP mode !!!!! */
  7823. prBssInfo = prAdapter->prAisBssInfo;
  7824. /* Exception check */
  7825. if (prNewKey->ucKeyID != 0x1 || prNewKey->ucKeyID != 0x0) {
  7826. prNewKey->ucKeyID = prNewKey->ucKeyID & BIT(0);
  7827. /* DBGLOG(SEC, INFO, ("Invalid WAPI key ID (%d)\r\n", prNewKey->ucKeyID)); */
  7828. }
  7829. /* Dump P_PARAM_WPI_KEY_T content. */
  7830. DBGLOG(OID, TRACE, "Set: Dump P_PARAM_WPI_KEY_T content\r\n");
  7831. DBGLOG(OID, TRACE, "TYPE : %d\r\n", prNewKey->eKeyType);
  7832. DBGLOG(OID, TRACE, "Direction : %d\r\n", prNewKey->eDirection);
  7833. DBGLOG(OID, TRACE, "KeyID : %d\r\n", prNewKey->ucKeyID);
  7834. DBGLOG(OID, TRACE, "AddressIndex:\r\n");
  7835. DBGLOG_MEM8(OID, TRACE, prNewKey->aucAddrIndex, 12);
  7836. prNewKey->u4LenWPIEK = 16;
  7837. DBGLOG_MEM8(OID, TRACE, (PUINT_8) prNewKey->aucWPIEK, (UINT_8) prNewKey->u4LenWPIEK);
  7838. prNewKey->u4LenWPICK = 16;
  7839. DBGLOG(OID, TRACE, "CK Key(%d):\r\n", (UINT_8) prNewKey->u4LenWPICK);
  7840. DBGLOG_MEM8(OID, TRACE, (PUINT_8) prNewKey->aucWPICK, (UINT_8) prNewKey->u4LenWPICK);
  7841. DBGLOG(OID, TRACE, "PN:\r\n");
  7842. if (prNewKey->eKeyType == 0) {
  7843. prNewKey->aucPN[0] = 0x5c;
  7844. prNewKey->aucPN[1] = 0x36;
  7845. prNewKey->aucPN[2] = 0x5c;
  7846. prNewKey->aucPN[3] = 0x36;
  7847. prNewKey->aucPN[4] = 0x5c;
  7848. prNewKey->aucPN[5] = 0x36;
  7849. prNewKey->aucPN[6] = 0x5c;
  7850. prNewKey->aucPN[7] = 0x36;
  7851. prNewKey->aucPN[8] = 0x5c;
  7852. prNewKey->aucPN[9] = 0x36;
  7853. prNewKey->aucPN[10] = 0x5c;
  7854. prNewKey->aucPN[11] = 0x36;
  7855. prNewKey->aucPN[12] = 0x5c;
  7856. prNewKey->aucPN[13] = 0x36;
  7857. prNewKey->aucPN[14] = 0x5c;
  7858. prNewKey->aucPN[15] = 0x36;
  7859. }
  7860. DBGLOG_MEM8(OID, TRACE, (PUINT_8) prNewKey->aucPN, 16);
  7861. prGlueInfo = prAdapter->prGlueInfo;
  7862. prCmdInfo = cmdBufAllocateCmdInfo(prAdapter, (CMD_HDR_SIZE + u4SetBufferLen));
  7863. if (!prCmdInfo) {
  7864. DBGLOG(OID, ERROR, "Allocate CMD_INFO_T ==> FAILED.\n");
  7865. return WLAN_STATUS_FAILURE;
  7866. }
  7867. /* increase command sequence number */
  7868. ucCmdSeqNum = nicIncreaseCmdSeqNum(prAdapter);
  7869. /* compose CMD_ID_ADD_REMOVE_KEY cmd pkt */
  7870. prCmdInfo->eCmdType = COMMAND_TYPE_NETWORK_IOCTL;
  7871. prCmdInfo->ucBssIndex = prAdapter->prAisBssInfo->ucBssIndex;
  7872. prCmdInfo->u2InfoBufLen = CMD_HDR_SIZE + sizeof(CMD_802_11_KEY);
  7873. prCmdInfo->pfCmdDoneHandler = nicCmdEventSetCommon;
  7874. prCmdInfo->pfCmdTimeoutHandler = nicOidCmdTimeoutCommon;
  7875. prCmdInfo->fgIsOid = TRUE;
  7876. prCmdInfo->ucCID = CMD_ID_ADD_REMOVE_KEY;
  7877. prCmdInfo->fgSetQuery = TRUE;
  7878. prCmdInfo->fgNeedResp = FALSE;
  7879. prCmdInfo->fgDriverDomainMCR = FALSE;
  7880. prCmdInfo->ucCmdSeqNum = ucCmdSeqNum;
  7881. prCmdInfo->u4SetInfoLen = u4SetBufferLen;
  7882. prCmdInfo->pvInformationBuffer = pvSetBuffer;
  7883. prCmdInfo->u4InformationBufferLength = u4SetBufferLen;
  7884. /* Setup WIFI_CMD_T */
  7885. prWifiCmd = (P_WIFI_CMD_T) (prCmdInfo->pucInfoBuffer);
  7886. prWifiCmd->u2TxByteCount = prCmdInfo->u2InfoBufLen;
  7887. prWifiCmd->u2PQ_ID = CMD_PQ_ID;
  7888. prWifiCmd->ucPktTypeID = CMD_PACKET_TYPE_ID;
  7889. prWifiCmd->ucCID = prCmdInfo->ucCID;
  7890. prWifiCmd->ucSetQuery = prCmdInfo->fgSetQuery;
  7891. prWifiCmd->ucSeqNum = prCmdInfo->ucCmdSeqNum;
  7892. prCmdKey = (P_CMD_802_11_KEY) (prWifiCmd->aucBuffer);
  7893. kalMemZero(prCmdKey, sizeof(CMD_802_11_KEY));
  7894. prCmdKey->ucAddRemove = 1; /* Add */
  7895. if (prNewKey->eKeyType == ENUM_WPI_PAIRWISE_KEY) {
  7896. prCmdKey->ucTxKey = 1;
  7897. prCmdKey->ucKeyType = 1;
  7898. }
  7899. kalMemCopy(prCmdKey->aucPeerAddr, (PUINT_8) prNewKey->aucAddrIndex, MAC_ADDR_LEN);
  7900. if ((prCmdKey->aucPeerAddr[0] & prCmdKey->aucPeerAddr[1] & prCmdKey->aucPeerAddr[2] &
  7901. prCmdKey->aucPeerAddr[3] & prCmdKey->aucPeerAddr[4] & prCmdKey->aucPeerAddr[5]) == 0xFF) {
  7902. prStaRec = cnmGetStaRecByAddress(prAdapter, prBssInfo->ucBssIndex, prBssInfo->aucBSSID);
  7903. ASSERT(prStaRec); /* AIS RSN Group key, addr is BC addr */
  7904. kalMemCopy(prCmdKey->aucPeerAddr, prStaRec->aucMacAddr, MAC_ADDR_LEN);
  7905. } else {
  7906. prStaRec = cnmGetStaRecByAddress(prAdapter, prBssInfo->ucBssIndex, prCmdKey->aucPeerAddr);
  7907. }
  7908. prCmdKey->ucBssIdx = prAdapter->prAisBssInfo->ucBssIndex; /* AIS */
  7909. prCmdKey->ucKeyId = prNewKey->ucKeyID;
  7910. prCmdKey->ucKeyLen = 32;
  7911. prCmdKey->ucAlgorithmId = CIPHER_SUITE_WPI;
  7912. kalMemCopy(prCmdKey->aucKeyMaterial, (PUINT_8) prNewKey->aucWPIEK, 16);
  7913. kalMemCopy(prCmdKey->aucKeyMaterial + 16, (PUINT_8) prNewKey->aucWPICK, 16);
  7914. kalMemCopy(prCmdKey->aucKeyRsc, (PUINT_8) prNewKey->aucPN, 16);
  7915. if (prCmdKey->ucTxKey) {
  7916. if (prStaRec) {
  7917. if (prCmdKey->ucKeyType) { /* AIS RSN STA */
  7918. prCmdKey->ucWlanIndex = prStaRec->ucWlanIndex;
  7919. prStaRec->fgTransmitKeyExist = TRUE; /* wait for CMD Done ? */
  7920. } else {
  7921. ASSERT(FALSE);
  7922. }
  7923. }
  7924. #if 0
  7925. if (fgAddTxBcKey || !prStaRec) {
  7926. if ((prCmdKey->aucPeerAddr[0] & prCmdKey->aucPeerAddr[1] & prCmdKey->aucPeerAddr[2] & prCmdKey->
  7927. aucPeerAddr[3] & prCmdKey->aucPeerAddr[4] & prCmdKey->aucPeerAddr[5]) == 0xFF) {
  7928. prCmdKey->ucWlanIndex = 255; /* AIS WEP Tx key */
  7929. } else { /* Exist this case ? */
  7930. ASSERT(FALSE);
  7931. /* prCmdKey->ucWlanIndex = */
  7932. /* secPrivacySeekForBcEntry(prAdapter, */
  7933. /* prBssInfo->ucBssIndex, */
  7934. /* NETWORK_TYPE_AIS, */
  7935. /* prCmdKey->aucPeerAddr, */
  7936. /* prCmdKey->ucAlgorithmId, */
  7937. /* prCmdKey->ucKeyId, */
  7938. /* prBssInfo->ucCurrentGtkId, */
  7939. /* BIT(1)); */
  7940. }
  7941. prBssInfo->fgTxBcKeyExist = TRUE;
  7942. prBssInfo->ucBMCWlanIndex = prCmdKey->ucWlanIndex; /* Saved for AIS WEP */
  7943. prBssInfo->ucTxDefaultKeyID = prCmdKey->ucKeyId;
  7944. }
  7945. #endif
  7946. } else {
  7947. /* Including IBSS RSN Rx BC key ? */
  7948. if ((prCmdKey->aucPeerAddr[0] & prCmdKey->aucPeerAddr[1] & prCmdKey->aucPeerAddr[2] & prCmdKey->
  7949. aucPeerAddr[3] & prCmdKey->aucPeerAddr[4] & prCmdKey->aucPeerAddr[5]) == 0xFF) {
  7950. prCmdKey->ucWlanIndex = 255; /* AIS WEP, should not have this case!! */
  7951. } else {
  7952. if (prStaRec) { /* AIS RSN Group key but addr is BSSID */
  7953. /* ASSERT(prStaRec->ucBMCWlanIndex < WTBL_SIZE) */
  7954. prCmdKey->ucWlanIndex =
  7955. secPrivacySeekForBcEntry(prAdapter, prStaRec->ucBssIndex,
  7956. prStaRec->aucMacAddr,
  7957. prStaRec->ucIndex,
  7958. prCmdKey->ucAlgorithmId,
  7959. prCmdKey->ucKeyId, prStaRec->ucCurrentGtkId, BIT(0));
  7960. prStaRec->ucBMCWlanIndex = prCmdKey->ucWlanIndex;
  7961. } else { /* Exist this case ? */
  7962. ASSERT(FALSE);
  7963. /* prCmdKey->ucWlanIndex = */
  7964. /* secPrivacySeekForBcEntry(prAdapter, */
  7965. /* prBssInfo->ucBssIndex, */
  7966. /* NETWORK_TYPE_AIS, */
  7967. /* prCmdKey->aucPeerAddr, */
  7968. /* prCmdKey->ucAlgorithmId, */
  7969. /* prCmdKey->ucKeyId, */
  7970. /* prBssInfo->ucCurrentGtkId, */
  7971. /* BIT(0)); */
  7972. }
  7973. }
  7974. }
  7975. /* insert into prCmdQueue */
  7976. kalEnqueueCommand(prGlueInfo, (P_QUE_ENTRY_T) prCmdInfo);
  7977. /* wakeup txServiceThread later */
  7978. GLUE_SET_EVENT(prGlueInfo);
  7979. return WLAN_STATUS_PENDING;
  7980. } /* wlanoidSetAddKey */
  7981. #endif
  7982. #if CFG_SUPPORT_WPS2
  7983. /*----------------------------------------------------------------------------*/
  7984. /*!
  7985. * \brief This routine is called by WSC to set the assoc info, which is needed to add to
  7986. * Association request frame while join WPS AP.
  7987. *
  7988. * \param[in] prAdapter Pointer to the Adapter structure
  7989. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set
  7990. * \param[in] u4SetBufferLen The length of the set buffer
  7991. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  7992. * bytes read from the set buffer. If the call failed due to invalid length of
  7993. * the set buffer, returns the amount of storage needed.
  7994. *
  7995. * \retval WLAN_STATUS_SUCCESS
  7996. * \retval WLAN_STATUS_INVALID_DATA If new setting value is wrong.
  7997. * \retval WLAN_STATUS_INVALID_LENGTH
  7998. *
  7999. */
  8000. /*----------------------------------------------------------------------------*/
  8001. WLAN_STATUS
  8002. wlanoidSetWSCAssocInfo(IN P_ADAPTER_T prAdapter,
  8003. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  8004. {
  8005. ASSERT(prAdapter);
  8006. ASSERT(pvSetBuffer);
  8007. ASSERT(pu4SetInfoLen);
  8008. DEBUGFUNC("wlanoidSetWSCAssocInfo");
  8009. DBGLOG(OID, LOUD, "\r\n");
  8010. if (u4SetBufferLen == 0)
  8011. return WLAN_STATUS_INVALID_LENGTH;
  8012. *pu4SetInfoLen = u4SetBufferLen;
  8013. kalMemCopy(prAdapter->prGlueInfo->aucWSCAssocInfoIE, pvSetBuffer, u4SetBufferLen);
  8014. prAdapter->prGlueInfo->u2WSCAssocInfoIELen = (UINT_16) u4SetBufferLen;
  8015. DBGLOG(SEC, TRACE, "Assoc Info IE sz %u\n", u4SetBufferLen);
  8016. return WLAN_STATUS_SUCCESS;
  8017. }
  8018. #endif
  8019. #if CFG_ENABLE_WAKEUP_ON_LAN
  8020. WLAN_STATUS
  8021. wlanoidSetAddWakeupPattern(IN P_ADAPTER_T prAdapter,
  8022. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  8023. {
  8024. P_PARAM_PM_PACKET_PATTERN prPacketPattern;
  8025. DEBUGFUNC("wlanoidSetAddWakeupPattern");
  8026. DBGLOG(OID, LOUD, "\r\n");
  8027. ASSERT(prAdapter);
  8028. ASSERT(pu4SetInfoLen);
  8029. *pu4SetInfoLen = sizeof(PARAM_PM_PACKET_PATTERN);
  8030. if (u4SetBufferLen < sizeof(PARAM_PM_PACKET_PATTERN))
  8031. return WLAN_STATUS_INVALID_LENGTH;
  8032. ASSERT(pvSetBuffer);
  8033. prPacketPattern = (P_PARAM_PM_PACKET_PATTERN) pvSetBuffer;
  8034. /* FIXME:
  8035. * Send the struct to firmware */
  8036. return WLAN_STATUS_FAILURE;
  8037. }
  8038. WLAN_STATUS
  8039. wlanoidSetRemoveWakeupPattern(IN P_ADAPTER_T prAdapter,
  8040. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  8041. {
  8042. P_PARAM_PM_PACKET_PATTERN prPacketPattern;
  8043. DEBUGFUNC("wlanoidSetAddWakeupPattern");
  8044. DBGLOG(OID, LOUD, "\r\n");
  8045. ASSERT(prAdapter);
  8046. ASSERT(pu4SetInfoLen);
  8047. *pu4SetInfoLen = sizeof(PARAM_PM_PACKET_PATTERN);
  8048. if (u4SetBufferLen < sizeof(PARAM_PM_PACKET_PATTERN))
  8049. return WLAN_STATUS_INVALID_LENGTH;
  8050. ASSERT(pvSetBuffer);
  8051. prPacketPattern = (P_PARAM_PM_PACKET_PATTERN) pvSetBuffer;
  8052. /* FIXME:
  8053. * Send the struct to firmware */
  8054. return WLAN_STATUS_FAILURE;
  8055. }
  8056. WLAN_STATUS
  8057. wlanoidQueryEnableWakeup(IN P_ADAPTER_T prAdapter,
  8058. OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  8059. {
  8060. PUINT_32 pu4WakeupEventEnable;
  8061. DEBUGFUNC("wlanoidQueryEnableWakeup");
  8062. DBGLOG(OID, LOUD, "\r\n");
  8063. ASSERT(prAdapter);
  8064. ASSERT(pu4QueryInfoLen);
  8065. if (u4QueryBufferLen)
  8066. ASSERT(pvQueryBuffer);
  8067. *pu4QueryInfoLen = sizeof(UINT_32);
  8068. if (u4QueryBufferLen < sizeof(UINT_32))
  8069. return WLAN_STATUS_BUFFER_TOO_SHORT;
  8070. pu4WakeupEventEnable = (PUINT_32) pvQueryBuffer;
  8071. *pu4WakeupEventEnable = prAdapter->u4WakeupEventEnable;
  8072. return WLAN_STATUS_SUCCESS;
  8073. }
  8074. WLAN_STATUS
  8075. wlanoidSetEnableWakeup(IN P_ADAPTER_T prAdapter,
  8076. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  8077. {
  8078. PUINT_32 pu4WakeupEventEnable;
  8079. DEBUGFUNC("wlanoidSetEnableWakup");
  8080. DBGLOG(OID, LOUD, "\r\n");
  8081. ASSERT(prAdapter);
  8082. ASSERT(pu4SetInfoLen);
  8083. *pu4SetInfoLen = sizeof(UINT_32);
  8084. if (u4SetBufferLen < sizeof(UINT_32))
  8085. return WLAN_STATUS_INVALID_LENGTH;
  8086. ASSERT(pvSetBuffer);
  8087. pu4WakeupEventEnable = (PUINT_32) pvSetBuffer;
  8088. prAdapter->u4WakeupEventEnable = *pu4WakeupEventEnable;
  8089. /* FIXME:
  8090. * Send Command Event for setting wakeup-pattern / Magic Packet to firmware
  8091. * */
  8092. return WLAN_STATUS_FAILURE;
  8093. }
  8094. #endif
  8095. /*----------------------------------------------------------------------------*/
  8096. /*!
  8097. * \brief This routine is called to configure PS related settings for WMM-PS test.
  8098. *
  8099. * \param[in] prAdapter Pointer to the Adapter structure.
  8100. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  8101. * \param[in] u4SetBufferLen The length of the set buffer.
  8102. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  8103. * bytes read from the set buffer. If the call failed
  8104. * due to invalid length of the set buffer, returns
  8105. * the amount of storage needed.
  8106. *
  8107. * \retval WLAN_STATUS_SUCCESS
  8108. */
  8109. /*----------------------------------------------------------------------------*/
  8110. WLAN_STATUS
  8111. wlanoidSetWiFiWmmPsTest(IN P_ADAPTER_T prAdapter,
  8112. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  8113. {
  8114. P_PARAM_CUSTOM_WMM_PS_TEST_STRUCT_T prWmmPsTestInfo;
  8115. WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
  8116. CMD_SET_WMM_PS_TEST_STRUCT_T rSetWmmPsTestParam;
  8117. UINT_16 u2CmdBufLen;
  8118. P_PM_PROFILE_SETUP_INFO_T prPmProfSetupInfo;
  8119. P_BSS_INFO_T prBssInfo;
  8120. DEBUGFUNC("wlanoidSetWiFiWmmPsTest");
  8121. ASSERT(prAdapter);
  8122. ASSERT(pvSetBuffer);
  8123. ASSERT(pu4SetInfoLen);
  8124. *pu4SetInfoLen = sizeof(PARAM_CUSTOM_WMM_PS_TEST_STRUCT_T);
  8125. prWmmPsTestInfo = (P_PARAM_CUSTOM_WMM_PS_TEST_STRUCT_T) pvSetBuffer;
  8126. rSetWmmPsTestParam.ucBssIndex = prAdapter->prAisBssInfo->ucBssIndex;
  8127. rSetWmmPsTestParam.bmfgApsdEnAc = prWmmPsTestInfo->bmfgApsdEnAc;
  8128. rSetWmmPsTestParam.ucIsEnterPsAtOnce = prWmmPsTestInfo->ucIsEnterPsAtOnce;
  8129. rSetWmmPsTestParam.ucIsDisableUcTrigger = prWmmPsTestInfo->ucIsDisableUcTrigger;
  8130. prBssInfo = GET_BSS_INFO_BY_INDEX(prAdapter, rSetWmmPsTestParam.ucBssIndex);
  8131. prPmProfSetupInfo = &prBssInfo->rPmProfSetupInfo;
  8132. prPmProfSetupInfo->ucBmpDeliveryAC = (rSetWmmPsTestParam.bmfgApsdEnAc >> 4) & BITS(0, 3);
  8133. prPmProfSetupInfo->ucBmpTriggerAC = rSetWmmPsTestParam.bmfgApsdEnAc & BITS(0, 3);
  8134. u2CmdBufLen = sizeof(CMD_SET_WMM_PS_TEST_STRUCT_T);
  8135. #if 0
  8136. /* it will apply the disable trig or not immediately */
  8137. if (prPmInfo->ucWmmPsDisableUcPoll && prPmInfo->ucWmmPsConnWithTrig)
  8138. ; /* NIC_PM_WMM_PS_DISABLE_UC_TRIG(prAdapter, TRUE); */
  8139. else
  8140. ; /* NIC_PM_WMM_PS_DISABLE_UC_TRIG(prAdapter, FALSE); */
  8141. #endif
  8142. rStatus = wlanSendSetQueryCmd(prAdapter,
  8143. CMD_ID_SET_WMM_PS_TEST_PARMS,
  8144. TRUE,
  8145. FALSE,
  8146. TRUE,
  8147. nicCmdEventSetCommon,
  8148. nicCmdTimeoutCommon,
  8149. u2CmdBufLen,
  8150. (PUINT_8) (&rSetWmmPsTestParam),
  8151. NULL,
  8152. 0);
  8153. return rStatus;
  8154. } /* wlanoidSetWiFiWmmPsTest */
  8155. /*----------------------------------------------------------------------------*/
  8156. /*!
  8157. * \brief This routine is called to configure enable/disable TX A-MPDU feature.
  8158. *
  8159. * \param[in] prAdapter Pointer to the Adapter structure.
  8160. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  8161. * \param[in] u4SetBufferLen The length of the set buffer.
  8162. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  8163. * bytes read from the set buffer. If the call failed
  8164. * due to invalid length of the set buffer, returns
  8165. * the amount of storage needed.
  8166. *
  8167. * \retval WLAN_STATUS_SUCCESS
  8168. */
  8169. /*----------------------------------------------------------------------------*/
  8170. WLAN_STATUS
  8171. wlanoidSetTxAmpdu(IN P_ADAPTER_T prAdapter, IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  8172. {
  8173. WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
  8174. CMD_TX_AMPDU_T rTxAmpdu;
  8175. UINT_16 u2CmdBufLen;
  8176. PBOOLEAN pfgEnable;
  8177. DEBUGFUNC("wlanoidSetTxAmpdu");
  8178. ASSERT(prAdapter);
  8179. ASSERT(pvSetBuffer);
  8180. ASSERT(pu4SetInfoLen);
  8181. *pu4SetInfoLen = sizeof(BOOLEAN);
  8182. pfgEnable = (PBOOLEAN) pvSetBuffer;
  8183. rTxAmpdu.fgEnable = *pfgEnable;
  8184. u2CmdBufLen = sizeof(CMD_TX_AMPDU_T);
  8185. rStatus = wlanSendSetQueryCmd(prAdapter,
  8186. CMD_ID_TX_AMPDU,
  8187. TRUE, FALSE, TRUE, NULL, NULL, u2CmdBufLen, (PUINT_8) &rTxAmpdu, NULL, 0);
  8188. return rStatus;
  8189. } /* wlanoidSetTxAmpdu */
  8190. /*----------------------------------------------------------------------------*/
  8191. /*!
  8192. * \brief This routine is called to configure reject/accept ADDBA Request.
  8193. *
  8194. * \param[in] prAdapter Pointer to the Adapter structure.
  8195. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  8196. * \param[in] u4SetBufferLen The length of the set buffer.
  8197. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  8198. * bytes read from the set buffer. If the call failed
  8199. * due to invalid length of the set buffer, returns
  8200. * the amount of storage needed.
  8201. *
  8202. * \retval WLAN_STATUS_SUCCESS
  8203. */
  8204. /*----------------------------------------------------------------------------*/
  8205. WLAN_STATUS
  8206. wlanoidSetAddbaReject(IN P_ADAPTER_T prAdapter,
  8207. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  8208. {
  8209. WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
  8210. CMD_ADDBA_REJECT_T rAddbaReject;
  8211. UINT_16 u2CmdBufLen;
  8212. PBOOLEAN pfgEnable;
  8213. DEBUGFUNC("wlanoidSetAddbaReject");
  8214. ASSERT(prAdapter);
  8215. ASSERT(pvSetBuffer);
  8216. ASSERT(pu4SetInfoLen);
  8217. *pu4SetInfoLen = sizeof(BOOLEAN);
  8218. pfgEnable = (PBOOLEAN) pvSetBuffer;
  8219. rAddbaReject.fgEnable = *pfgEnable;
  8220. u2CmdBufLen = sizeof(CMD_ADDBA_REJECT_T);
  8221. rStatus = wlanSendSetQueryCmd(prAdapter,
  8222. CMD_ID_ADDBA_REJECT,
  8223. TRUE, FALSE, TRUE, NULL, NULL, u2CmdBufLen, (PUINT_8) &rAddbaReject, NULL, 0);
  8224. return rStatus;
  8225. } /* wlanoidSetAddbaReject */
  8226. #if CFG_SLT_SUPPORT
  8227. WLAN_STATUS
  8228. wlanoidQuerySLTStatus(IN P_ADAPTER_T prAdapter,
  8229. OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  8230. {
  8231. WLAN_STATUS rWlanStatus = WLAN_STATUS_SUCCESS;
  8232. P_PARAM_MTK_SLT_TEST_STRUCT_T prMtkSltInfo = (P_PARAM_MTK_SLT_TEST_STRUCT_T) NULL;
  8233. P_SLT_INFO_T prSltInfo = (P_SLT_INFO_T) NULL;
  8234. DEBUGFUNC("wlanoidQuerySLTStatus");
  8235. DBGLOG(OID, LOUD, "\r\n");
  8236. ASSERT(prAdapter);
  8237. ASSERT(pu4QueryInfoLen);
  8238. *pu4QueryInfoLen = sizeof(PARAM_MTK_SLT_TEST_STRUCT_T);
  8239. if (u4QueryBufferLen < sizeof(PARAM_MTK_SLT_TEST_STRUCT_T))
  8240. return WLAN_STATUS_INVALID_LENGTH;
  8241. ASSERT(pvQueryBuffer);
  8242. prMtkSltInfo = (P_PARAM_MTK_SLT_TEST_STRUCT_T) pvQueryBuffer;
  8243. prSltInfo = &(prAdapter->rWifiVar.rSltInfo);
  8244. switch (prMtkSltInfo->rSltFuncIdx) {
  8245. case ENUM_MTK_SLT_FUNC_LP_SET:
  8246. {
  8247. P_PARAM_MTK_SLT_LP_TEST_STRUCT_T prLpSetting = (P_PARAM_MTK_SLT_LP_TEST_STRUCT_T) NULL;
  8248. ASSERT(prMtkSltInfo->u4FuncInfoLen == sizeof(PARAM_MTK_SLT_LP_TEST_STRUCT_T));
  8249. prLpSetting = (P_PARAM_MTK_SLT_LP_TEST_STRUCT_T) &prMtkSltInfo->unFuncInfoContent;
  8250. prLpSetting->u4BcnRcvNum = prSltInfo->u4BeaconReceiveCnt;
  8251. }
  8252. break;
  8253. default:
  8254. /* TBD... */
  8255. break;
  8256. }
  8257. return rWlanStatus;
  8258. } /* wlanoidQuerySLTStatus */
  8259. WLAN_STATUS
  8260. wlanoidUpdateSLTMode(IN P_ADAPTER_T prAdapter,
  8261. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  8262. {
  8263. WLAN_STATUS rWlanStatus = WLAN_STATUS_SUCCESS;
  8264. P_PARAM_MTK_SLT_TEST_STRUCT_T prMtkSltInfo = (P_PARAM_MTK_SLT_TEST_STRUCT_T) NULL;
  8265. P_SLT_INFO_T prSltInfo = (P_SLT_INFO_T) NULL;
  8266. P_BSS_DESC_T prBssDesc = (P_BSS_DESC_T) NULL;
  8267. P_STA_RECORD_T prStaRec = (P_STA_RECORD_T) NULL;
  8268. P_BSS_INFO_T prBssInfo = (P_BSS_INFO_T) NULL;
  8269. /* 1. Action: Update or Initial Set
  8270. * 2. Role.
  8271. * 3. Target MAC address.
  8272. * 4. RF BW & Rate Settings
  8273. */
  8274. DEBUGFUNC("wlanoidUpdateSLTMode");
  8275. DBGLOG(OID, LOUD, "\r\n");
  8276. ASSERT(prAdapter);
  8277. ASSERT(pu4SetInfoLen);
  8278. *pu4SetInfoLen = sizeof(PARAM_MTK_SLT_TEST_STRUCT_T);
  8279. if (u4SetBufferLen < sizeof(PARAM_MTK_SLT_TEST_STRUCT_T))
  8280. return WLAN_STATUS_INVALID_LENGTH;
  8281. ASSERT(pvSetBuffer);
  8282. prMtkSltInfo = (P_PARAM_MTK_SLT_TEST_STRUCT_T) pvSetBuffer;
  8283. prSltInfo = &(prAdapter->rWifiVar.rSltInfo);
  8284. prBssInfo = prAdapter->prAisBssInfo;
  8285. switch (prMtkSltInfo->rSltFuncIdx) {
  8286. case ENUM_MTK_SLT_FUNC_INITIAL: /* Initialize */
  8287. {
  8288. P_PARAM_MTK_SLT_INITIAL_STRUCT_T prMtkSltInit = (P_PARAM_MTK_SLT_INITIAL_STRUCT_T) NULL;
  8289. ASSERT(prMtkSltInfo->u4FuncInfoLen == sizeof(PARAM_MTK_SLT_INITIAL_STRUCT_T));
  8290. prMtkSltInit = (P_PARAM_MTK_SLT_INITIAL_STRUCT_T) &prMtkSltInfo->unFuncInfoContent;
  8291. if (prSltInfo->prPseudoStaRec != NULL) {
  8292. /* The driver has been initialized. */
  8293. prSltInfo->prPseudoStaRec = NULL;
  8294. }
  8295. prSltInfo->prPseudoBssDesc = scanSearchExistingBssDesc(prAdapter,
  8296. BSS_TYPE_IBSS,
  8297. prMtkSltInit->aucTargetMacAddr,
  8298. prMtkSltInit->aucTargetMacAddr);
  8299. prSltInfo->u2SiteID = prMtkSltInit->u2SiteID;
  8300. /* Bandwidth 2.4G: Channel 1~14
  8301. * Bandwidth 5G: *36, 40, 44, 48, 52, 56, 60, 64,
  8302. * *100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140,
  8303. * 149, 153, *157, 161,
  8304. * 184, 188, 192, 196, 200, 204, 208, 212, *216
  8305. */
  8306. prSltInfo->ucChannel2G4 = 1 + (prSltInfo->u2SiteID % 4) * 5;
  8307. switch (prSltInfo->ucChannel2G4) {
  8308. case 1:
  8309. prSltInfo->ucChannel5G = 36;
  8310. break;
  8311. case 6:
  8312. prSltInfo->ucChannel5G = 52;
  8313. break;
  8314. case 11:
  8315. prSltInfo->ucChannel5G = 104;
  8316. break;
  8317. case 16:
  8318. prSltInfo->ucChannel2G4 = 14;
  8319. prSltInfo->ucChannel5G = 161;
  8320. break;
  8321. default:
  8322. ASSERT(FALSE);
  8323. }
  8324. if (prSltInfo->prPseudoBssDesc == NULL) {
  8325. do {
  8326. prSltInfo->prPseudoBssDesc = scanAllocateBssDesc(prAdapter);
  8327. if (prSltInfo->prPseudoBssDesc == NULL)
  8328. rWlanStatus = WLAN_STATUS_FAILURE;
  8329. else
  8330. prBssDesc = prSltInfo->prPseudoBssDesc;
  8331. } while (FALSE);
  8332. } else {
  8333. prBssDesc = prSltInfo->prPseudoBssDesc;
  8334. }
  8335. if (prBssDesc) {
  8336. prBssDesc->eBSSType = BSS_TYPE_IBSS;
  8337. COPY_MAC_ADDR(prBssDesc->aucSrcAddr, prMtkSltInit->aucTargetMacAddr);
  8338. COPY_MAC_ADDR(prBssDesc->aucBSSID, prBssInfo->aucOwnMacAddr);
  8339. prBssDesc->u2BeaconInterval = 100;
  8340. prBssDesc->u2ATIMWindow = 0;
  8341. prBssDesc->ucDTIMPeriod = 1;
  8342. prBssDesc->u2IELength = 0;
  8343. prBssDesc->fgIsERPPresent = TRUE;
  8344. prBssDesc->fgIsHTPresent = TRUE;
  8345. prBssDesc->u2OperationalRateSet = BIT(RATE_36M_INDEX);
  8346. prBssDesc->u2BSSBasicRateSet = BIT(RATE_36M_INDEX);
  8347. prBssDesc->fgIsUnknownBssBasicRate = FALSE;
  8348. prBssDesc->fgIsLargerTSF = TRUE;
  8349. prBssDesc->eBand = BAND_2G4;
  8350. prBssDesc->ucChannelNum = prSltInfo->ucChannel2G4;
  8351. prBssDesc->ucPhyTypeSet = PHY_TYPE_SET_802_11ABGN;
  8352. GET_CURRENT_SYSTIME(&prBssDesc->rUpdateTime);
  8353. }
  8354. }
  8355. break;
  8356. case ENUM_MTK_SLT_FUNC_RATE_SET: /* Update RF Settings. */
  8357. if (prSltInfo->prPseudoStaRec == NULL) {
  8358. rWlanStatus = WLAN_STATUS_FAILURE;
  8359. } else {
  8360. P_PARAM_MTK_SLT_TR_TEST_STRUCT_T prTRSetting = (P_PARAM_MTK_SLT_TR_TEST_STRUCT_T) NULL;
  8361. ASSERT(prMtkSltInfo->u4FuncInfoLen == sizeof(PARAM_MTK_SLT_TR_TEST_STRUCT_T));
  8362. prStaRec = prSltInfo->prPseudoStaRec;
  8363. prTRSetting = (P_PARAM_MTK_SLT_TR_TEST_STRUCT_T) &prMtkSltInfo->unFuncInfoContent;
  8364. if (prTRSetting->rNetworkType == PARAM_NETWORK_TYPE_OFDM5) {
  8365. prBssInfo->eBand = BAND_5G;
  8366. prBssInfo->ucPrimaryChannel = prSltInfo->ucChannel5G;
  8367. }
  8368. if (prTRSetting->rNetworkType == PARAM_NETWORK_TYPE_OFDM24) {
  8369. prBssInfo->eBand = BAND_2G4;
  8370. prBssInfo->ucPrimaryChannel = prSltInfo->ucChannel2G4;
  8371. }
  8372. if ((prTRSetting->u4FixedRate & FIXED_BW_DL40) != 0) {
  8373. /* RF 40 */
  8374. /* It would controls RFBW capability in WTBL. */
  8375. prStaRec->u2HtCapInfo |= HT_CAP_INFO_SUP_CHNL_WIDTH;
  8376. /* This controls RF BW, RF BW would be 40 only if
  8377. * 1. PHY_TYPE_BIT_HT is TRUE.
  8378. * 2. SCO is SCA/SCB.
  8379. */
  8380. prStaRec->ucDesiredPhyTypeSet = PHY_TYPE_BIT_HT;
  8381. /* U20/L20 Control. */
  8382. switch (prTRSetting->u4FixedRate & 0xC000) {
  8383. case FIXED_EXT_CHNL_U20:
  8384. prBssInfo->eBssSCO = CHNL_EXT_SCB; /* +2 */
  8385. if (prTRSetting->rNetworkType == PARAM_NETWORK_TYPE_OFDM5) {
  8386. prBssInfo->ucPrimaryChannel += 2;
  8387. } else {
  8388. /* For channel 1, testing L20 at channel 8. AOSP */
  8389. SetTestChannel(&prBssInfo->ucPrimaryChannel);
  8390. }
  8391. break;
  8392. case FIXED_EXT_CHNL_L20:
  8393. default: /* 40M */
  8394. prBssInfo->eBssSCO = CHNL_EXT_SCA; /* -2 */
  8395. if (prTRSetting->rNetworkType == PARAM_NETWORK_TYPE_OFDM5) {
  8396. prBssInfo->ucPrimaryChannel -= 2;
  8397. } else {
  8398. /* For channel 11 / 14. testing U20 at channel 3. AOSP */
  8399. SetTestChannel(&prBssInfo->ucPrimaryChannel);
  8400. }
  8401. break;
  8402. }
  8403. } else {
  8404. /* RF 20 */
  8405. prStaRec->u2HtCapInfo &= ~HT_CAP_INFO_SUP_CHNL_WIDTH;
  8406. prBssInfo->eBssSCO = CHNL_EXT_SCN;
  8407. }
  8408. prBssInfo->fgErpProtectMode = FALSE;
  8409. prBssInfo->eHtProtectMode = HT_PROTECT_MODE_NONE;
  8410. prBssInfo->eGfOperationMode = GF_MODE_NORMAL;
  8411. nicUpdateBss(prAdapter, prBssInfo->ucNetTypeIndex);
  8412. prStaRec->u2HtCapInfo &= ~(HT_CAP_INFO_SHORT_GI_20M | HT_CAP_INFO_SHORT_GI_40M);
  8413. switch (prTRSetting->u4FixedRate & 0xFF) {
  8414. case RATE_OFDM_54M:
  8415. prStaRec->u2DesiredNonHTRateSet = BIT(RATE_54M_SW_INDEX);
  8416. break;
  8417. case RATE_OFDM_48M:
  8418. prStaRec->u2DesiredNonHTRateSet = BIT(RATE_48M_SW_INDEX);
  8419. break;
  8420. case RATE_OFDM_36M:
  8421. prStaRec->u2DesiredNonHTRateSet = BIT(RATE_36M_SW_INDEX);
  8422. break;
  8423. case RATE_OFDM_24M:
  8424. prStaRec->u2DesiredNonHTRateSet = BIT(RATE_24M_SW_INDEX);
  8425. break;
  8426. case RATE_OFDM_6M:
  8427. prStaRec->u2DesiredNonHTRateSet = BIT(RATE_6M_SW_INDEX);
  8428. break;
  8429. case RATE_CCK_11M_LONG:
  8430. prStaRec->u2DesiredNonHTRateSet = BIT(RATE_11M_SW_INDEX);
  8431. break;
  8432. case RATE_CCK_1M_LONG:
  8433. prStaRec->u2DesiredNonHTRateSet = BIT(RATE_1M_SW_INDEX);
  8434. break;
  8435. case RATE_GF_MCS_0:
  8436. prStaRec->u2DesiredNonHTRateSet = BIT(RATE_HT_PHY_SW_INDEX);
  8437. prStaRec->u2HtCapInfo |= HT_CAP_INFO_HT_GF;
  8438. break;
  8439. case RATE_MM_MCS_7:
  8440. prStaRec->u2DesiredNonHTRateSet = BIT(RATE_HT_PHY_SW_INDEX);
  8441. prStaRec->u2HtCapInfo &= ~HT_CAP_INFO_HT_GF;
  8442. #if 0 /* Only for Current Measurement Mode. */
  8443. prStaRec->u2HtCapInfo |= (HT_CAP_INFO_SHORT_GI_20M | HT_CAP_INFO_SHORT_GI_40M);
  8444. #endif
  8445. break;
  8446. case RATE_GF_MCS_7:
  8447. prStaRec->u2DesiredNonHTRateSet = BIT(RATE_HT_PHY_SW_INDEX);
  8448. prStaRec->u2HtCapInfo |= HT_CAP_INFO_HT_GF;
  8449. break;
  8450. default:
  8451. prStaRec->u2DesiredNonHTRateSet = BIT(RATE_36M_SW_INDEX);
  8452. break;
  8453. }
  8454. cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_1);
  8455. cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
  8456. }
  8457. break;
  8458. case ENUM_MTK_SLT_FUNC_LP_SET: /* Reset LP Test Result. */
  8459. {
  8460. P_PARAM_MTK_SLT_LP_TEST_STRUCT_T prLpSetting = (P_PARAM_MTK_SLT_LP_TEST_STRUCT_T) NULL;
  8461. ASSERT(prMtkSltInfo->u4FuncInfoLen == sizeof(PARAM_MTK_SLT_LP_TEST_STRUCT_T));
  8462. prLpSetting = (P_PARAM_MTK_SLT_LP_TEST_STRUCT_T) &prMtkSltInfo->unFuncInfoContent;
  8463. /* Please initial SLT Mode first. */
  8464. if (prSltInfo->prPseudoBssDesc == NULL)
  8465. break;
  8466. prBssDesc = prSltInfo->prPseudoBssDesc;
  8467. switch (prLpSetting->rLpTestMode) {
  8468. case ENUM_MTK_LP_TEST_NORMAL:
  8469. /* In normal mode, we would use target MAC address to be the BSSID. */
  8470. COPY_MAC_ADDR(prBssDesc->aucBSSID, prBssInfo->aucOwnMacAddr);
  8471. prSltInfo->fgIsDUT = FALSE;
  8472. break;
  8473. case ENUM_MTK_LP_TEST_GOLDEN_SAMPLE:
  8474. /* 1. Lower AIFS of BCN queue.
  8475. * 2. Fixed Random Number tobe 0.
  8476. */
  8477. prSltInfo->fgIsDUT = FALSE;
  8478. /* In LP test mode, we would use MAC address of Golden Sample to be the BSSID. */
  8479. COPY_MAC_ADDR(prBssDesc->aucBSSID, prBssInfo->aucOwnMacAddr);
  8480. break;
  8481. case ENUM_MTK_LP_TEST_DUT:
  8482. /* 1. Enter Sleep Mode.
  8483. * 2. Fix random number a large value & enlarge AIFN of BCN queue.
  8484. */
  8485. COPY_MAC_ADDR(prBssDesc->aucBSSID, prBssDesc->aucSrcAddr);
  8486. prSltInfo->u4BeaconReceiveCnt = 0;
  8487. prSltInfo->fgIsDUT = TRUE;
  8488. break;
  8489. }
  8490. }
  8491. break;
  8492. default:
  8493. break;
  8494. }
  8495. return WLAN_STATUS_FAILURE;
  8496. return rWlanStatus;
  8497. } /* wlanoidUpdateSLTMode */
  8498. #endif
  8499. /*----------------------------------------------------------------------------*/
  8500. /*!
  8501. * \brief This routine is called to query NVRAM value.
  8502. *
  8503. * \param[in] pvAdapter Pointer to the Adapter structure.
  8504. * \param[out] pvQueryBuf A pointer to the buffer that holds the result of
  8505. * the query.
  8506. * \param[in] u4QueryBufLen The length of the query buffer.
  8507. * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
  8508. * bytes written into the query buffer. If the call
  8509. * failed due to invalid length of the query buffer,
  8510. * returns the amount of storage needed.
  8511. *
  8512. * \retval WLAN_STATUS_SUCCESS
  8513. * \retval WLAN_STATUS_FAILURE
  8514. */
  8515. /*----------------------------------------------------------------------------*/
  8516. WLAN_STATUS
  8517. wlanoidQueryNvramRead(IN P_ADAPTER_T prAdapter,
  8518. OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  8519. {
  8520. P_PARAM_CUSTOM_NVRAM_RW_STRUCT_T prNvramRwInfo;
  8521. UINT_16 u2Data;
  8522. BOOLEAN fgStatus;
  8523. WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
  8524. DEBUGFUNC("wlanoidQueryNvramRead");
  8525. ASSERT(prAdapter);
  8526. ASSERT(pu4QueryInfoLen);
  8527. if (u4QueryBufferLen)
  8528. ASSERT(pvQueryBuffer);
  8529. *pu4QueryInfoLen = sizeof(PARAM_CUSTOM_NVRAM_RW_STRUCT_T);
  8530. if (u4QueryBufferLen < sizeof(PARAM_CUSTOM_NVRAM_RW_STRUCT_T))
  8531. return WLAN_STATUS_INVALID_LENGTH;
  8532. prNvramRwInfo = (P_PARAM_CUSTOM_NVRAM_RW_STRUCT_T) pvQueryBuffer;
  8533. if (prNvramRwInfo->ucEepromMethod == PARAM_EEPROM_READ_METHOD_READ) {
  8534. fgStatus = kalCfgDataRead16(prAdapter->prGlueInfo, prNvramRwInfo->ucEepromIndex << 1,
  8535. &u2Data); /* change to byte offset */
  8536. if (fgStatus) {
  8537. prNvramRwInfo->u2EepromData = u2Data;
  8538. DBGLOG(OID, INFO, "NVRAM Read: index=%#X, data=%#02X\r\n",
  8539. prNvramRwInfo->ucEepromIndex, u2Data);
  8540. } else {
  8541. DBGLOG(OID, ERROR, "NVRAM Read Failed: index=%#x.\r\n", prNvramRwInfo->ucEepromIndex);
  8542. rStatus = WLAN_STATUS_FAILURE;
  8543. }
  8544. } else if (prNvramRwInfo->ucEepromMethod == PARAM_EEPROM_READ_METHOD_GETSIZE) {
  8545. prNvramRwInfo->u2EepromData = CFG_FILE_WIFI_REC_SIZE;
  8546. DBGLOG(OID, INFO, "EEPROM size =%d\r\n", prNvramRwInfo->u2EepromData);
  8547. }
  8548. *pu4QueryInfoLen = sizeof(PARAM_CUSTOM_EEPROM_RW_STRUCT_T);
  8549. return rStatus;
  8550. } /* wlanoidQueryNvramRead */
  8551. /*----------------------------------------------------------------------------*/
  8552. /*!
  8553. * \brief This routine is called to write NVRAM value.
  8554. *
  8555. * \param[in] prAdapter Pointer to the Adapter structure.
  8556. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  8557. * \param[in] u4SetBufferLen The length of the set buffer.
  8558. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  8559. * bytes read from the set buffer. If the call failed
  8560. * due to invalid length of the set buffer, returns
  8561. * the amount of storage needed.
  8562. *
  8563. * \retval WLAN_STATUS_SUCCESS
  8564. * \retval WLAN_STATUS_FAILURE
  8565. */
  8566. /*----------------------------------------------------------------------------*/
  8567. WLAN_STATUS
  8568. wlanoidSetNvramWrite(IN P_ADAPTER_T prAdapter,
  8569. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  8570. {
  8571. P_PARAM_CUSTOM_NVRAM_RW_STRUCT_T prNvramRwInfo;
  8572. BOOLEAN fgStatus;
  8573. WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
  8574. DEBUGFUNC("wlanoidSetNvramWrite");
  8575. DBGLOG(OID, LOUD, "\n");
  8576. ASSERT(prAdapter);
  8577. ASSERT(pu4SetInfoLen);
  8578. *pu4SetInfoLen = sizeof(PARAM_CUSTOM_NVRAM_RW_STRUCT_T);
  8579. if (u4SetBufferLen < sizeof(PARAM_CUSTOM_NVRAM_RW_STRUCT_T))
  8580. return WLAN_STATUS_INVALID_LENGTH;
  8581. ASSERT(pvSetBuffer);
  8582. prNvramRwInfo = (P_PARAM_CUSTOM_NVRAM_RW_STRUCT_T) pvSetBuffer;
  8583. fgStatus = kalCfgDataWrite16(prAdapter->prGlueInfo, prNvramRwInfo->ucEepromIndex << 1,
  8584. prNvramRwInfo->u2EepromData); /* change to byte offset */
  8585. if (fgStatus == FALSE) {
  8586. DBGLOG(OID, ERROR, "NVRAM Write Failed.\r\n");
  8587. rStatus = WLAN_STATUS_FAILURE;
  8588. }
  8589. return rStatus;
  8590. } /* wlanoidSetNvramWrite */
  8591. /*----------------------------------------------------------------------------*/
  8592. /*!
  8593. * \brief This routine is called to get the config data source type.
  8594. *
  8595. * \param[in] prAdapter Pointer to the Adapter structure.
  8596. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  8597. * \param[in] u4SetBufferLen The length of the set buffer.
  8598. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  8599. * bytes read from the set buffer. If the call failed
  8600. * due to invalid length of the set buffer, returns
  8601. * the amount of storage needed.
  8602. *
  8603. * \retval WLAN_STATUS_SUCCESS
  8604. * \retval WLAN_STATUS_FAILURE
  8605. */
  8606. /*----------------------------------------------------------------------------*/
  8607. WLAN_STATUS
  8608. wlanoidQueryCfgSrcType(IN P_ADAPTER_T prAdapter,
  8609. OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  8610. {
  8611. ASSERT(prAdapter);
  8612. *pu4QueryInfoLen = sizeof(ENUM_CFG_SRC_TYPE_T);
  8613. if (kalIsConfigurationExist(prAdapter->prGlueInfo) == TRUE)
  8614. *(P_ENUM_CFG_SRC_TYPE_T) pvQueryBuffer = CFG_SRC_TYPE_NVRAM;
  8615. else
  8616. *(P_ENUM_CFG_SRC_TYPE_T) pvQueryBuffer = CFG_SRC_TYPE_EEPROM;
  8617. return WLAN_STATUS_SUCCESS;
  8618. }
  8619. /*----------------------------------------------------------------------------*/
  8620. /*!
  8621. * \brief This routine is called to get the config data source type.
  8622. *
  8623. * \param[in] prAdapter Pointer to the Adapter structure.
  8624. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  8625. * \param[in] u4SetBufferLen The length of the set buffer.
  8626. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  8627. * bytes read from the set buffer. If the call failed
  8628. * due to invalid length of the set buffer, returns
  8629. * the amount of storage needed.
  8630. *
  8631. * \retval WLAN_STATUS_SUCCESS
  8632. * \retval WLAN_STATUS_FAILURE
  8633. */
  8634. /*----------------------------------------------------------------------------*/
  8635. WLAN_STATUS
  8636. wlanoidQueryEepromType(IN P_ADAPTER_T prAdapter,
  8637. OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  8638. {
  8639. ASSERT(prAdapter);
  8640. *pu4QueryInfoLen = sizeof(P_ENUM_EEPROM_TYPE_T);
  8641. #if CFG_SUPPORT_NIC_CAPABILITY
  8642. if (prAdapter->fgIsEepromUsed == TRUE)
  8643. *(P_ENUM_EEPROM_TYPE_T) pvQueryBuffer = EEPROM_TYPE_PRESENT;
  8644. else
  8645. *(P_ENUM_EEPROM_TYPE_T) pvQueryBuffer = EEPROM_TYPE_NO;
  8646. #else
  8647. *(P_ENUM_EEPROM_TYPE_T) pvQueryBuffer = EEPROM_TYPE_NO;
  8648. #endif
  8649. return WLAN_STATUS_SUCCESS;
  8650. }
  8651. /*----------------------------------------------------------------------------*/
  8652. /*!
  8653. * \brief This routine is called to get the config data source type.
  8654. *
  8655. * \param[in] prAdapter Pointer to the Adapter structure.
  8656. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  8657. * \param[in] u4SetBufferLen The length of the set buffer.
  8658. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  8659. * bytes read from the set buffer. If the call failed
  8660. * due to invalid length of the set buffer, returns
  8661. * the amount of storage needed.
  8662. *
  8663. * \retval WLAN_STATUS_SUCCESS
  8664. * \retval WLAN_STATUS_FAILURE
  8665. */
  8666. /*----------------------------------------------------------------------------*/
  8667. WLAN_STATUS
  8668. wlanoidSetCountryCode(IN P_ADAPTER_T prAdapter,
  8669. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  8670. {
  8671. PUINT_8 pucCountry;
  8672. ASSERT(prAdapter);
  8673. ASSERT(pvSetBuffer);
  8674. ASSERT(u4SetBufferLen == 2);
  8675. *pu4SetInfoLen = 2;
  8676. pucCountry = pvSetBuffer;
  8677. prAdapter->rWifiVar.rConnSettings.u2CountryCode = (((UINT_16) pucCountry[0]) << 8) | ((UINT_16) pucCountry[1]);
  8678. /* Force to re-search country code in country domains */
  8679. prAdapter->prDomainInfo = NULL;
  8680. rlmDomainSendCmd(prAdapter, TRUE);
  8681. /* Update supported channel list in channel table based on current country domain */
  8682. wlanUpdateChannelTable(prAdapter->prGlueInfo);
  8683. return WLAN_STATUS_SUCCESS;
  8684. }
  8685. #if 0
  8686. WLAN_STATUS
  8687. wlanoidSetNoaParam(IN P_ADAPTER_T prAdapter,
  8688. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  8689. {
  8690. P_PARAM_CUSTOM_NOA_PARAM_STRUCT_T prNoaParam;
  8691. CMD_CUSTOM_NOA_PARAM_STRUCT_T rCmdNoaParam;
  8692. DEBUGFUNC("wlanoidSetNoaParam");
  8693. DBGLOG(OID, LOUD, "\n");
  8694. ASSERT(prAdapter);
  8695. ASSERT(pu4SetInfoLen);
  8696. *pu4SetInfoLen = sizeof(PARAM_CUSTOM_NOA_PARAM_STRUCT_T);
  8697. if (u4SetBufferLen < sizeof(PARAM_CUSTOM_NOA_PARAM_STRUCT_T))
  8698. return WLAN_STATUS_INVALID_LENGTH;
  8699. ASSERT(pvSetBuffer);
  8700. prNoaParam = (P_PARAM_CUSTOM_NOA_PARAM_STRUCT_T) pvSetBuffer;
  8701. kalMemZero(&rCmdNoaParam, sizeof(CMD_CUSTOM_NOA_PARAM_STRUCT_T));
  8702. rCmdNoaParam.u4NoaDurationMs = prNoaParam->u4NoaDurationMs;
  8703. rCmdNoaParam.u4NoaIntervalMs = prNoaParam->u4NoaIntervalMs;
  8704. rCmdNoaParam.u4NoaCount = prNoaParam->u4NoaCount;
  8705. return wlanSendSetQueryCmd(prAdapter,
  8706. CMD_ID_SET_NOA_PARAM,
  8707. TRUE,
  8708. FALSE,
  8709. TRUE,
  8710. nicCmdEventSetCommon,
  8711. nicOidCmdTimeoutCommon,
  8712. sizeof(CMD_CUSTOM_NOA_PARAM_STRUCT_T),
  8713. (PUINT_8) &rCmdNoaParam, pvSetBuffer, u4SetBufferLen);
  8714. }
  8715. WLAN_STATUS
  8716. wlanoidSetOppPsParam(IN P_ADAPTER_T prAdapter,
  8717. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  8718. {
  8719. P_PARAM_CUSTOM_OPPPS_PARAM_STRUCT_T prOppPsParam;
  8720. CMD_CUSTOM_OPPPS_PARAM_STRUCT_T rCmdOppPsParam;
  8721. DEBUGFUNC("wlanoidSetOppPsParam");
  8722. DBGLOG(OID, LOUD, "\n");
  8723. ASSERT(prAdapter);
  8724. ASSERT(pu4SetInfoLen);
  8725. *pu4SetInfoLen = sizeof(PARAM_CUSTOM_OPPPS_PARAM_STRUCT_T);
  8726. if (u4SetBufferLen < sizeof(PARAM_CUSTOM_OPPPS_PARAM_STRUCT_T))
  8727. return WLAN_STATUS_INVALID_LENGTH;
  8728. ASSERT(pvSetBuffer);
  8729. prOppPsParam = (P_PARAM_CUSTOM_OPPPS_PARAM_STRUCT_T) pvSetBuffer;
  8730. kalMemZero(&rCmdOppPsParam, sizeof(CMD_CUSTOM_OPPPS_PARAM_STRUCT_T));
  8731. rCmdOppPsParam.u4CTwindowMs = prOppPsParam->u4CTwindowMs;
  8732. return wlanSendSetQueryCmd(prAdapter,
  8733. CMD_ID_SET_OPPPS_PARAM,
  8734. TRUE,
  8735. FALSE,
  8736. TRUE,
  8737. nicCmdEventSetCommon,
  8738. nicOidCmdTimeoutCommon,
  8739. sizeof(CMD_CUSTOM_OPPPS_PARAM_STRUCT_T),
  8740. (PUINT_8) &rCmdOppPsParam, pvSetBuffer, u4SetBufferLen);
  8741. }
  8742. WLAN_STATUS
  8743. wlanoidSetUApsdParam(IN P_ADAPTER_T prAdapter,
  8744. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  8745. {
  8746. P_PARAM_CUSTOM_UAPSD_PARAM_STRUCT_T prUapsdParam;
  8747. CMD_CUSTOM_UAPSD_PARAM_STRUCT_T rCmdUapsdParam;
  8748. P_PM_PROFILE_SETUP_INFO_T prPmProfSetupInfo;
  8749. P_BSS_INFO_T prBssInfo;
  8750. DEBUGFUNC("wlanoidSetUApsdParam");
  8751. DBGLOG(OID, LOUD, "\n");
  8752. ASSERT(prAdapter);
  8753. ASSERT(pu4SetInfoLen);
  8754. *pu4SetInfoLen = sizeof(PARAM_CUSTOM_UAPSD_PARAM_STRUCT_T);
  8755. if (u4SetBufferLen < sizeof(PARAM_CUSTOM_UAPSD_PARAM_STRUCT_T))
  8756. return WLAN_STATUS_INVALID_LENGTH;
  8757. ASSERT(pvSetBuffer);
  8758. prBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_P2P_INDEX]);
  8759. prPmProfSetupInfo = &prBssInfo->rPmProfSetupInfo;
  8760. prUapsdParam = (P_PARAM_CUSTOM_UAPSD_PARAM_STRUCT_T) pvSetBuffer;
  8761. kalMemZero(&rCmdUapsdParam, sizeof(CMD_CUSTOM_OPPPS_PARAM_STRUCT_T));
  8762. rCmdUapsdParam.fgEnAPSD = prUapsdParam->fgEnAPSD;
  8763. prAdapter->rWifiVar.fgSupportUAPSD = prUapsdParam->fgEnAPSD;
  8764. rCmdUapsdParam.fgEnAPSD_AcBe = prUapsdParam->fgEnAPSD_AcBe;
  8765. rCmdUapsdParam.fgEnAPSD_AcBk = prUapsdParam->fgEnAPSD_AcBk;
  8766. rCmdUapsdParam.fgEnAPSD_AcVo = prUapsdParam->fgEnAPSD_AcVo;
  8767. rCmdUapsdParam.fgEnAPSD_AcVi = prUapsdParam->fgEnAPSD_AcVi;
  8768. prPmProfSetupInfo->ucBmpDeliveryAC =
  8769. ((prUapsdParam->fgEnAPSD_AcBe << 0) |
  8770. (prUapsdParam->fgEnAPSD_AcBk << 1) |
  8771. (prUapsdParam->fgEnAPSD_AcVi << 2) | (prUapsdParam->fgEnAPSD_AcVo << 3));
  8772. prPmProfSetupInfo->ucBmpTriggerAC =
  8773. ((prUapsdParam->fgEnAPSD_AcBe << 0) |
  8774. (prUapsdParam->fgEnAPSD_AcBk << 1) |
  8775. (prUapsdParam->fgEnAPSD_AcVi << 2) | (prUapsdParam->fgEnAPSD_AcVo << 3));
  8776. rCmdUapsdParam.ucMaxSpLen = prUapsdParam->ucMaxSpLen;
  8777. prPmProfSetupInfo->ucUapsdSp = prUapsdParam->ucMaxSpLen;
  8778. return wlanSendSetQueryCmd(prAdapter,
  8779. CMD_ID_SET_UAPSD_PARAM,
  8780. TRUE,
  8781. FALSE,
  8782. TRUE,
  8783. nicCmdEventSetCommon,
  8784. nicOidCmdTimeoutCommon,
  8785. sizeof(CMD_CUSTOM_OPPPS_PARAM_STRUCT_T),
  8786. (PUINT_8) &rCmdUapsdParam, pvSetBuffer, u4SetBufferLen);
  8787. }
  8788. #endif
  8789. /*----------------------------------------------------------------------------*/
  8790. /*!
  8791. * \brief This routine is called to set BT profile or BT information and the
  8792. * driver will set the built-in PTA configuration into chip.
  8793. *
  8794. *
  8795. * \param[in] prAdapter Pointer to the Adapter structure.
  8796. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  8797. * \param[in] u4SetBufferLen The length of the set buffer.
  8798. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  8799. * bytes read from the set buffer. If the call failed
  8800. * due to invalid length of the set buffer, returns
  8801. * the amount of storage needed.
  8802. *
  8803. * \retval WLAN_STATUS_SUCCESS
  8804. * \retval WLAN_STATUS_INVALID_LENGTH
  8805. */
  8806. /*----------------------------------------------------------------------------*/
  8807. WLAN_STATUS
  8808. wlanoidSetBT(IN P_ADAPTER_T prAdapter, IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  8809. {
  8810. P_PTA_IPC_T prPtaIpc;
  8811. DEBUGFUNC("wlanoidSetBT.\n");
  8812. ASSERT(prAdapter);
  8813. ASSERT(pu4SetInfoLen);
  8814. *pu4SetInfoLen = sizeof(PTA_IPC_T);
  8815. if (u4SetBufferLen != sizeof(PTA_IPC_T)) {
  8816. /* WARNLOG(("Invalid length %ld\n", u4SetBufferLen)); */
  8817. return WLAN_STATUS_INVALID_LENGTH;
  8818. }
  8819. if (prAdapter->rAcpiState == ACPI_STATE_D3) {
  8820. DBGLOG(OID, WARN, "Fail to set BT profile because of ACPI_D3\n");
  8821. return WLAN_STATUS_ADAPTER_NOT_READY;
  8822. }
  8823. ASSERT(pvSetBuffer);
  8824. prPtaIpc = (P_PTA_IPC_T) pvSetBuffer;
  8825. #if CFG_SUPPORT_BCM && CFG_SUPPORT_BCM_BWCS && CFG_SUPPORT_BCM_BWCS_DEBUG
  8826. DBGLOG(OID, INFO, "BCM BWCS CMD: BWCS CMD = %02x%02x%02x%02x\n",
  8827. prPtaIpc->u.aucBTPParams[0], prPtaIpc->u.aucBTPParams[1],
  8828. prPtaIpc->u.aucBTPParams[2], prPtaIpc->u.aucBTPParams[3]);
  8829. DBGLOG(OID, INFO,
  8830. "BCM BWCS CMD: BTPParams[0]=%02x, BTPParams[1]=%02x, BTPParams[2]=%02x, BTPParams[3]=%02x.\n",
  8831. prPtaIpc->u.aucBTPParams[0], prPtaIpc->u.aucBTPParams[1],
  8832. prPtaIpc->u.aucBTPParams[2], prPtaIpc->u.aucBTPParams[3]);
  8833. #endif
  8834. wlanSendSetQueryCmd(prAdapter,
  8835. CMD_ID_SET_BWCS,
  8836. TRUE, FALSE, FALSE, NULL, NULL, sizeof(PTA_IPC_T), (PUINT_8) prPtaIpc, NULL, 0);
  8837. return WLAN_STATUS_SUCCESS;
  8838. }
  8839. /*----------------------------------------------------------------------------*/
  8840. /*!
  8841. * \brief This routine is called to query current BT profile and BTCR values
  8842. *
  8843. * \param[in] prAdapter Pointer to the Adapter structure.
  8844. * \param[in] pvQueryBuffer Pointer to the buffer that holds the result of
  8845. * the query.
  8846. * \param[in] u4QueryBufferLen The length of the query buffer.
  8847. * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
  8848. * bytes written into the query buffer. If the call
  8849. * failed due to invalid length of the query buffer,
  8850. * returns the amount of storage needed.
  8851. *
  8852. * \retval WLAN_STATUS_SUCCESS
  8853. * \retval WLAN_STATUS_INVALID_LENGTH
  8854. */
  8855. /*----------------------------------------------------------------------------*/
  8856. WLAN_STATUS
  8857. wlanoidQueryBT(IN P_ADAPTER_T prAdapter,
  8858. OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  8859. {
  8860. /* P_PARAM_PTA_IPC_T prPtaIpc; */
  8861. /* UINT_32 u4QueryBuffLen; */
  8862. ASSERT(prAdapter);
  8863. ASSERT(pu4QueryInfoLen);
  8864. if (u4QueryBufferLen)
  8865. ASSERT(pvQueryBuffer);
  8866. *pu4QueryInfoLen = sizeof(PTA_IPC_T);
  8867. /* Check for query buffer length */
  8868. if (u4QueryBufferLen != sizeof(PTA_IPC_T)) {
  8869. DBGLOG(OID, WARN, "Invalid length %u\n", u4QueryBufferLen);
  8870. return WLAN_STATUS_INVALID_LENGTH;
  8871. }
  8872. ASSERT(pvQueryBuffer);
  8873. /* prPtaIpc = (P_PTA_IPC_T)pvQueryBuffer; */
  8874. /* prPtaIpc->ucCmd = BT_CMD_PROFILE; */
  8875. /* prPtaIpc->ucLen = sizeof(prPtaIpc->u); */
  8876. /* nicPtaGetProfile(prAdapter, (PUINT_8)&prPtaIpc->u, &u4QueryBuffLen); */
  8877. return WLAN_STATUS_SUCCESS;
  8878. }
  8879. #if 0
  8880. WLAN_STATUS
  8881. wlanoidQueryBtSingleAntenna(IN P_ADAPTER_T prAdapter,
  8882. OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  8883. {
  8884. P_PTA_INFO_T prPtaInfo;
  8885. PUINT_32 pu4SingleAntenna;
  8886. ASSERT(prAdapter);
  8887. ASSERT(pu4QueryInfoLen);
  8888. if (u4QueryBufferLen)
  8889. ASSERT(pvQueryBuffer);
  8890. *pu4QueryInfoLen = sizeof(UINT_32);
  8891. /* Check for query buffer length */
  8892. if (u4QueryBufferLen != sizeof(UINT_32)) {
  8893. DBGLOG(OID, WARN, "Invalid length %u\n", u4QueryBufferLen);
  8894. return WLAN_STATUS_INVALID_LENGTH;
  8895. }
  8896. ASSERT(pvQueryBuffer);
  8897. prPtaInfo = &prAdapter->rPtaInfo;
  8898. pu4SingleAntenna = (PUINT_32) pvQueryBuffer;
  8899. if (prPtaInfo->fgSingleAntenna) {
  8900. /* DBGLOG(OID, INFO, (KERN_WARNING DRV_NAME"Q Single Ant = 1\r\n")); */
  8901. *pu4SingleAntenna = 1;
  8902. } else {
  8903. /* DBGLOG(OID, INFO, (KERN_WARNING DRV_NAME"Q Single Ant = 0\r\n")); */
  8904. *pu4SingleAntenna = 0;
  8905. }
  8906. return WLAN_STATUS_SUCCESS;
  8907. }
  8908. WLAN_STATUS
  8909. wlanoidSetBtSingleAntenna(IN P_ADAPTER_T prAdapter,
  8910. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  8911. {
  8912. PUINT_32 pu4SingleAntenna;
  8913. UINT_32 u4SingleAntenna;
  8914. P_PTA_INFO_T prPtaInfo;
  8915. ASSERT(prAdapter);
  8916. ASSERT(pu4SetInfoLen);
  8917. prPtaInfo = &prAdapter->rPtaInfo;
  8918. *pu4SetInfoLen = sizeof(UINT_32);
  8919. if (u4SetBufferLen != sizeof(UINT_32))
  8920. return WLAN_STATUS_INVALID_LENGTH;
  8921. if (IS_ARB_IN_RFTEST_STATE(prAdapter))
  8922. return WLAN_STATUS_SUCCESS;
  8923. if (prAdapter->rAcpiState == ACPI_STATE_D3) {
  8924. DBGLOG(OID, WARN, "Fail to set antenna because of ACPI_D3\n");
  8925. return WLAN_STATUS_ADAPTER_NOT_READY;
  8926. }
  8927. ASSERT(pvSetBuffer);
  8928. pu4SingleAntenna = (PUINT_32) pvSetBuffer;
  8929. u4SingleAntenna = *pu4SingleAntenna;
  8930. if (u4SingleAntenna == 0) {
  8931. /* DBGLOG(OID, INFO, (KERN_WARNING DRV_NAME"Set Single Ant = 0\r\n")); */
  8932. prPtaInfo->fgSingleAntenna = FALSE;
  8933. } else {
  8934. /* DBGLOG(OID, INFO, (KERN_WARNING DRV_NAME"Set Single Ant = 1\r\n")); */
  8935. prPtaInfo->fgSingleAntenna = TRUE;
  8936. }
  8937. ptaFsmRunEventSetConfig(prAdapter, &prPtaInfo->rPtaParam);
  8938. return WLAN_STATUS_SUCCESS;
  8939. }
  8940. #if CFG_SUPPORT_BCM && CFG_SUPPORT_BCM_BWCS
  8941. WLAN_STATUS
  8942. wlanoidQueryPta(IN P_ADAPTER_T prAdapter,
  8943. OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  8944. {
  8945. P_PTA_INFO_T prPtaInfo;
  8946. PUINT_32 pu4Pta;
  8947. ASSERT(prAdapter);
  8948. ASSERT(pu4QueryInfoLen);
  8949. if (u4QueryBufferLen)
  8950. ASSERT(pvQueryBuffer);
  8951. *pu4QueryInfoLen = sizeof(UINT_32);
  8952. /* Check for query buffer length */
  8953. if (u4QueryBufferLen != sizeof(UINT_32)) {
  8954. DBGLOG(OID, WARN, "Invalid length %u\n", u4QueryBufferLen);
  8955. return WLAN_STATUS_INVALID_LENGTH;
  8956. }
  8957. ASSERT(pvQueryBuffer);
  8958. prPtaInfo = &prAdapter->rPtaInfo;
  8959. pu4Pta = (PUINT_32) pvQueryBuffer;
  8960. if (prPtaInfo->fgEnabled) {
  8961. /* DBGLOG(OID, INFO, (KERN_WARNING DRV_NAME"PTA = 1\r\n")); */
  8962. *pu4Pta = 1;
  8963. } else {
  8964. /* DBGLOG(OID, INFO, (KERN_WARNING DRV_NAME"PTA = 0\r\n")); */
  8965. *pu4Pta = 0;
  8966. }
  8967. return WLAN_STATUS_SUCCESS;
  8968. }
  8969. WLAN_STATUS
  8970. wlanoidSetPta(IN P_ADAPTER_T prAdapter, IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  8971. {
  8972. PUINT_32 pu4PtaCtrl;
  8973. UINT_32 u4PtaCtrl;
  8974. ASSERT(prAdapter);
  8975. ASSERT(pu4SetInfoLen);
  8976. *pu4SetInfoLen = sizeof(UINT_32);
  8977. if (u4SetBufferLen != sizeof(UINT_32))
  8978. return WLAN_STATUS_INVALID_LENGTH;
  8979. if (IS_ARB_IN_RFTEST_STATE(prAdapter))
  8980. return WLAN_STATUS_SUCCESS;
  8981. if (prAdapter->rAcpiState == ACPI_STATE_D3) {
  8982. DBGLOG(OID, WARN, "Fail to set BT setting because of ACPI_D3\n");
  8983. return WLAN_STATUS_ADAPTER_NOT_READY;
  8984. }
  8985. ASSERT(pvSetBuffer);
  8986. pu4PtaCtrl = (PUINT_32) pvSetBuffer;
  8987. u4PtaCtrl = *pu4PtaCtrl;
  8988. if (u4PtaCtrl == 0) {
  8989. /* DBGLOG(OID, INFO, (KERN_WARNING DRV_NAME"Set Pta= 0\r\n")); */
  8990. nicPtaSetFunc(prAdapter, FALSE);
  8991. } else {
  8992. /* DBGLOG(OID, INFO, (KERN_WARNING DRV_NAME"Set Pta= 1\r\n")); */
  8993. nicPtaSetFunc(prAdapter, TRUE);
  8994. }
  8995. return WLAN_STATUS_SUCCESS;
  8996. }
  8997. #endif
  8998. #endif
  8999. /*----------------------------------------------------------------------------*/
  9000. /*!
  9001. * \brief This routine is called to set Tx power profile.
  9002. *
  9003. *
  9004. * \param[in] prAdapter Pointer to the Adapter structure.
  9005. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  9006. * \param[in] u4SetBufferLen The length of the set buffer.
  9007. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  9008. * bytes read from the set buffer. If the call failed
  9009. * due to invalid length of the set buffer, returns
  9010. * the amount of storage needed.
  9011. *
  9012. * \retval WLAN_STATUS_SUCCESS
  9013. * \retval WLAN_STATUS_INVALID_LENGTH
  9014. */
  9015. /*----------------------------------------------------------------------------*/
  9016. WLAN_STATUS
  9017. wlanoidSetTxPower(IN P_ADAPTER_T prAdapter, IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  9018. {
  9019. P_SET_TXPWR_CTRL_T pTxPwr = (P_SET_TXPWR_CTRL_T) pvSetBuffer;
  9020. P_SET_TXPWR_CTRL_T prCmd;
  9021. UINT_32 i;
  9022. WLAN_STATUS rStatus;
  9023. DEBUGFUNC("wlanoidSetTxPower");
  9024. DBGLOG(OID, LOUD, "\r\n");
  9025. prCmd = cnmMemAlloc(prAdapter, RAM_TYPE_BUF, sizeof(SET_TXPWR_CTRL_T));
  9026. kalMemZero(prCmd, sizeof(SET_TXPWR_CTRL_T));
  9027. prCmd->c2GLegacyStaPwrOffset = pTxPwr->c2GLegacyStaPwrOffset;
  9028. prCmd->c2GHotspotPwrOffset = pTxPwr->c2GHotspotPwrOffset;
  9029. prCmd->c2GP2pPwrOffset = pTxPwr->c2GP2pPwrOffset;
  9030. prCmd->c2GBowPwrOffset = pTxPwr->c2GBowPwrOffset;
  9031. prCmd->c5GLegacyStaPwrOffset = pTxPwr->c5GLegacyStaPwrOffset;
  9032. prCmd->c5GHotspotPwrOffset = pTxPwr->c5GHotspotPwrOffset;
  9033. prCmd->c5GP2pPwrOffset = pTxPwr->c5GP2pPwrOffset;
  9034. prCmd->c5GBowPwrOffset = pTxPwr->c5GBowPwrOffset;
  9035. prCmd->ucConcurrencePolicy = pTxPwr->ucConcurrencePolicy;
  9036. for (i = 0; i < 14; i++)
  9037. prCmd->acTxPwrLimit2G[i] = pTxPwr->acTxPwrLimit2G[i];
  9038. for (i = 0; i < 4; i++)
  9039. prCmd->acTxPwrLimit5G[i] = pTxPwr->acTxPwrLimit5G[i];
  9040. ASSERT(prAdapter);
  9041. ASSERT(pvSetBuffer);
  9042. #if 0
  9043. DBGLOG(OID, INFO, "c2GLegacyStaPwrOffset=%d\n", pTxPwr->c2GLegacyStaPwrOffset);
  9044. DBGLOG(OID, INFO, "c2GHotspotPwrOffset=%d\n", pTxPwr->c2GHotspotPwrOffset);
  9045. DBGLOG(OID, INFO, "c2GP2pPwrOffset=%d\n", pTxPwr->c2GP2pPwrOffset);
  9046. DBGLOG(OID, INFO, "c2GBowPwrOffset=%d\n", pTxPwr->c2GBowPwrOffset);
  9047. DBGLOG(OID, INFO, "c5GLegacyStaPwrOffset=%d\n", pTxPwr->c5GLegacyStaPwrOffset);
  9048. DBGLOG(OID, INFO, "c5GHotspotPwrOffset=%d\n", pTxPwr->c5GHotspotPwrOffset);
  9049. DBGLOG(OID, INFO, "c5GP2pPwrOffset=%d\n", pTxPwr->c5GP2pPwrOffset);
  9050. DBGLOG(OID, INFO, "c5GBowPwrOffset=%d\n", pTxPwr->c5GBowPwrOffset);
  9051. DBGLOG(OID, INFO, "ucConcurrencePolicy=%d\n", pTxPwr->ucConcurrencePolicy);
  9052. for (i = 0; i < 14; i++)
  9053. DBGLOG(OID, INFO, "acTxPwrLimit2G[%d]=%d\n", i, pTxPwr->acTxPwrLimit2G[i]);
  9054. for (i = 0; i < 4; i++)
  9055. DBGLOG(OID, INFO, "acTxPwrLimit5G[%d]=%d\n", i, pTxPwr->acTxPwrLimit5G[i]);
  9056. #endif
  9057. rStatus = wlanSendSetQueryCmd(prAdapter, /* prAdapter */
  9058. CMD_ID_SET_TXPWR_CTRL, /* ucCID */
  9059. TRUE, /* fgSetQuery */
  9060. FALSE, /* fgNeedResp */
  9061. TRUE, /* fgIsOid */
  9062. nicCmdEventSetCommon, nicOidCmdTimeoutCommon, sizeof(SET_TXPWR_CTRL_T),
  9063. (PUINT_8) prCmd, /* pucInfoBuffer */
  9064. NULL, /* pvSetQueryBuffer */
  9065. 0 /* u4SetQueryBufferLen */
  9066. );
  9067. /* ASSERT(rStatus == WLAN_STATUS_PENDING); */
  9068. cnmMemFree(prAdapter, prCmd);
  9069. return rStatus;
  9070. }
  9071. WLAN_STATUS wlanSendMemDumpCmd(IN P_ADAPTER_T prAdapter, IN PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen)
  9072. {
  9073. P_PARAM_CUSTOM_MEM_DUMP_STRUCT_T prMemDumpInfo;
  9074. P_CMD_DUMP_MEM prCmdDumpMem;
  9075. CMD_DUMP_MEM rCmdDumpMem;
  9076. WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
  9077. UINT_32 u4MemSize = PARAM_MEM_DUMP_MAX_SIZE;
  9078. UINT_32 u4RemainLeng = 0;
  9079. UINT_32 u4CurAddr = 0;
  9080. UINT_8 ucFragNum = 0;
  9081. prCmdDumpMem = &rCmdDumpMem;
  9082. prMemDumpInfo = (P_PARAM_CUSTOM_MEM_DUMP_STRUCT_T) pvQueryBuffer;
  9083. u4RemainLeng = prMemDumpInfo->u4RemainLength;
  9084. u4CurAddr = prMemDumpInfo->u4Address + prMemDumpInfo->u4Length;
  9085. ucFragNum = prMemDumpInfo->ucFragNum + 1;
  9086. /* Query. If request length is larger than max length, do it as ping pong.
  9087. * Send a command and wait for a event. Send next command while the event is received.
  9088. *
  9089. */
  9090. do {
  9091. UINT_32 u4CurLeng = 0;
  9092. if (u4RemainLeng > u4MemSize) {
  9093. u4CurLeng = u4MemSize;
  9094. u4RemainLeng -= u4MemSize;
  9095. } else {
  9096. u4CurLeng = u4RemainLeng;
  9097. u4RemainLeng = 0;
  9098. }
  9099. prCmdDumpMem->u4Address = u4CurAddr;
  9100. prCmdDumpMem->u4Length = u4CurLeng;
  9101. prCmdDumpMem->u4RemainLength = u4RemainLeng;
  9102. prCmdDumpMem->ucFragNum = ucFragNum;
  9103. DBGLOG(OID, TRACE, "[%d] 0x%lX, len %lu, remain len %lu\n",
  9104. ucFragNum, prCmdDumpMem->u4Address, prCmdDumpMem->u4Length, prCmdDumpMem->u4RemainLength);
  9105. rStatus = wlanSendSetQueryCmd(prAdapter,
  9106. CMD_ID_DUMP_MEM,
  9107. FALSE,
  9108. TRUE,
  9109. TRUE,
  9110. nicCmdEventQueryMemDump,
  9111. nicOidCmdTimeoutCommon,
  9112. sizeof(CMD_DUMP_MEM),
  9113. (PUINT_8) prCmdDumpMem, pvQueryBuffer, u4QueryBufferLen);
  9114. } while (FALSE);
  9115. return rStatus;
  9116. }
  9117. /*----------------------------------------------------------------------------*/
  9118. /*!
  9119. * \brief This routine is called to dump memory.
  9120. *
  9121. * \param[in] pvAdapter Pointer to the Adapter structure.
  9122. * \param[out] pvQueryBuf A pointer to the buffer that holds the result of
  9123. * the query.
  9124. * \param[in] u4QueryBufLen The length of the query buffer.
  9125. * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
  9126. * bytes written into the query buffer. If the call
  9127. * failed due to invalid length of the query buffer,
  9128. * returns the amount of storage needed.
  9129. *
  9130. * \retval WLAN_STATUS_SUCCESS
  9131. * \retval WLAN_STATUS_INVALID_LENGTH
  9132. */
  9133. /*----------------------------------------------------------------------------*/
  9134. WLAN_STATUS
  9135. wlanoidQueryMemDump(IN P_ADAPTER_T prAdapter,
  9136. IN PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  9137. {
  9138. P_PARAM_CUSTOM_MEM_DUMP_STRUCT_T prMemDumpInfo;
  9139. DEBUGFUNC("wlanoidQueryMemDump");
  9140. DBGLOG(OID, LOUD, "\n");
  9141. ASSERT(prAdapter);
  9142. ASSERT(pu4QueryInfoLen);
  9143. if (u4QueryBufferLen)
  9144. ASSERT(pvQueryBuffer);
  9145. *pu4QueryInfoLen = sizeof(UINT_32);
  9146. prMemDumpInfo = (P_PARAM_CUSTOM_MEM_DUMP_STRUCT_T) pvQueryBuffer;
  9147. DBGLOG(OID, TRACE, "Dump 0x%lX, len %lu\n", prMemDumpInfo->u4Address, prMemDumpInfo->u4Length);
  9148. prMemDumpInfo->u4RemainLength = prMemDumpInfo->u4Length;
  9149. prMemDumpInfo->u4Length = 0;
  9150. prMemDumpInfo->ucFragNum = 0;
  9151. return wlanSendMemDumpCmd(prAdapter, pvQueryBuffer, u4QueryBufferLen);
  9152. } /* end of wlanoidQueryMcrRead() */
  9153. #if CFG_ENABLE_WIFI_DIRECT
  9154. /*----------------------------------------------------------------------------*/
  9155. /*!
  9156. * \brief This routine is used to set the p2p mode.
  9157. *
  9158. * \param[in] pvAdapter Pointer to the Adapter structure.
  9159. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  9160. * \param[in] u4SetBufferLen The length of the set buffer.
  9161. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  9162. * bytes read from the set buffer. If the call failed
  9163. * due to invalid length of the set buffer, returns
  9164. * the amount of storage needed.
  9165. *
  9166. * \retval WLAN_STATUS_SUCCESS
  9167. * \retval WLAN_STATUS_INVALID_LENGTH
  9168. */
  9169. /*----------------------------------------------------------------------------*/
  9170. WLAN_STATUS
  9171. wlanoidSetP2pMode(IN P_ADAPTER_T prAdapter, IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  9172. {
  9173. WLAN_STATUS status = WLAN_STATUS_SUCCESS;
  9174. P_PARAM_CUSTOM_P2P_SET_STRUCT_T prSetP2P = (P_PARAM_CUSTOM_P2P_SET_STRUCT_T) NULL;
  9175. /* P_MSG_P2P_NETDEV_REGISTER_T prP2pNetdevRegMsg = (P_MSG_P2P_NETDEV_REGISTER_T)NULL; */
  9176. DEBUGFUNC("wlanoidSetP2pMode");
  9177. ASSERT(prAdapter);
  9178. ASSERT(pu4SetInfoLen);
  9179. *pu4SetInfoLen = sizeof(PARAM_CUSTOM_P2P_SET_STRUCT_T);
  9180. if (u4SetBufferLen < sizeof(PARAM_CUSTOM_P2P_SET_STRUCT_T)) {
  9181. DBGLOG(OID, WARN, "Invalid length %u\n", u4SetBufferLen);
  9182. return WLAN_STATUS_INVALID_LENGTH;
  9183. }
  9184. prSetP2P = (P_PARAM_CUSTOM_P2P_SET_STRUCT_T) pvSetBuffer;
  9185. DBGLOG(P2P, INFO, "Set P2P enable %p [%u] mode[%u]\n", prSetP2P, prSetP2P->u4Enable, prSetP2P->u4Mode);
  9186. /*
  9187. * enable = 1, mode = 0 => init P2P network
  9188. * enable = 1, mode = 1 => init Soft AP network
  9189. * enable = 0 => uninit P2P/AP network
  9190. */
  9191. if (prSetP2P->u4Enable) {
  9192. p2pSetMode((prSetP2P->u4Mode == 1) ? TRUE : FALSE);
  9193. if (p2pLaunch(prAdapter->prGlueInfo)) {
  9194. /* ToDo:: ASSERT */
  9195. ASSERT(prAdapter->fgIsP2PRegistered);
  9196. } else {
  9197. status = WLAN_STATUS_FAILURE;
  9198. }
  9199. } else {
  9200. if (prAdapter->fgIsP2PRegistered) {
  9201. DBGLOG(P2P, INFO, "p2pRemove\n");
  9202. p2pRemove(prAdapter->prGlueInfo);
  9203. }
  9204. }
  9205. #if 0
  9206. prP2pNetdevRegMsg = (P_MSG_P2P_NETDEV_REGISTER_T) cnmMemAlloc(prAdapter,
  9207. RAM_TYPE_MSG,
  9208. (sizeof(MSG_P2P_NETDEV_REGISTER_T)));
  9209. if (prP2pNetdevRegMsg == NULL) {
  9210. ASSERT(FALSE);
  9211. status = WLAN_STATUS_RESOURCES;
  9212. return status;
  9213. }
  9214. prP2pNetdevRegMsg->rMsgHdr.eMsgId = MID_MNY_P2P_NET_DEV_REGISTER;
  9215. prP2pNetdevRegMsg->fgIsEnable = (prSetP2P->u4Enable == 1) ? TRUE : FALSE;
  9216. prP2pNetdevRegMsg->ucMode = (UINT_8) prSetP2P->u4Mode;
  9217. mboxSendMsg(prAdapter, MBOX_ID_0, (P_MSG_HDR_T) prP2pNetdevRegMsg, MSG_SEND_METHOD_BUF);
  9218. #endif
  9219. return status;
  9220. }
  9221. #endif
  9222. /*----------------------------------------------------------------------------*/
  9223. /*!
  9224. * \brief This routine is called to set the default key
  9225. *
  9226. * \param[in] prAdapter Pointer to the Adapter structure.
  9227. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  9228. * \param[in] u4SetBufferLen The length of the set buffer.
  9229. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  9230. * bytes read from the set buffer. If the call failed
  9231. * due to invalid length of the set buffer, returns
  9232. * the amount of storage needed.
  9233. *
  9234. * \retval WLAN_STATUS_SUCCESS
  9235. * \retval WLAN_STATUS_ADAPTER_NOT_READY
  9236. * \retval WLAN_STATUS_INVALID_LENGTH
  9237. * \retval WLAN_STATUS_INVALID_DATA
  9238. *
  9239. * \note The setting buffer PARAM_KEY_T, which is set by NDIS, is unpacked.
  9240. */
  9241. /*----------------------------------------------------------------------------*/
  9242. WLAN_STATUS
  9243. wlanoidSetDefaultKey(IN P_ADAPTER_T prAdapter,
  9244. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  9245. {
  9246. P_GLUE_INFO_T prGlueInfo;
  9247. P_CMD_INFO_T prCmdInfo;
  9248. P_WIFI_CMD_T prWifiCmd;
  9249. P_PARAM_DEFAULT_KEY_T prDefaultKey;
  9250. P_CMD_DEFAULT_KEY prCmdDefaultKey;
  9251. UINT_8 ucCmdSeqNum;
  9252. DEBUGFUNC("wlanoidSetDefaultKey");
  9253. DBGLOG(OID, LOUD, "\n");
  9254. ASSERT(prAdapter);
  9255. ASSERT(pvSetBuffer);
  9256. ASSERT(pu4SetInfoLen);
  9257. if (prAdapter->rAcpiState == ACPI_STATE_D3) {
  9258. DBGLOG(OID, WARN, "Fail in set add key! (Adapter not ready). ACPI=D%d, Radio=%d\n",
  9259. prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
  9260. return WLAN_STATUS_ADAPTER_NOT_READY;
  9261. }
  9262. prDefaultKey = (P_PARAM_DEFAULT_KEY_T) pvSetBuffer;
  9263. *pu4SetInfoLen = u4SetBufferLen;
  9264. /* Dump PARAM_DEFAULT_KEY_T content. */
  9265. DBGLOG(OID, TRACE, "Key Index : %d\n", prDefaultKey->ucKeyID);
  9266. DBGLOG(OID, TRACE, "Unicast Key : %d\n", prDefaultKey->ucUnicast);
  9267. DBGLOG(OID, TRACE, "Multicast Key : %d\n", prDefaultKey->ucMulticast);
  9268. /* prWlanTable = prAdapter->rWifiVar.arWtbl; */
  9269. prGlueInfo = prAdapter->prGlueInfo;
  9270. prCmdInfo = cmdBufAllocateCmdInfo(prAdapter, (CMD_HDR_SIZE + sizeof(CMD_DEFAULT_KEY)));
  9271. if (!prCmdInfo) {
  9272. DBGLOG(INIT, ERROR, "Allocate CMD_INFO_T ==> FAILED.\n");
  9273. return WLAN_STATUS_FAILURE;
  9274. }
  9275. /* increase command sequence number */
  9276. ucCmdSeqNum = nicIncreaseCmdSeqNum(prAdapter);
  9277. DBGLOG(OID, INFO, "ucCmdSeqNum = %d\n", ucCmdSeqNum);
  9278. /* compose CMD_802_11_KEY cmd pkt */
  9279. prCmdInfo->eCmdType = COMMAND_TYPE_NETWORK_IOCTL;
  9280. prCmdInfo->ucBssIndex = prAdapter->prAisBssInfo->ucBssIndex;
  9281. prCmdInfo->u2InfoBufLen = CMD_HDR_SIZE + sizeof(CMD_DEFAULT_KEY);
  9282. prCmdInfo->pfCmdDoneHandler = nicCmdEventSetCommon;
  9283. prCmdInfo->pfCmdTimeoutHandler = nicOidCmdTimeoutCommon;
  9284. prCmdInfo->fgIsOid = TRUE;
  9285. prCmdInfo->ucCID = CMD_ID_DEFAULT_KEY_ID;
  9286. prCmdInfo->fgSetQuery = TRUE;
  9287. prCmdInfo->fgNeedResp = FALSE;
  9288. prCmdInfo->fgDriverDomainMCR = FALSE;
  9289. prCmdInfo->ucCmdSeqNum = ucCmdSeqNum;
  9290. prCmdInfo->u4SetInfoLen = u4SetBufferLen;
  9291. prCmdInfo->pvInformationBuffer = pvSetBuffer;
  9292. prCmdInfo->u4InformationBufferLength = u4SetBufferLen;
  9293. /* Setup WIFI_CMD_T */
  9294. prWifiCmd = (P_WIFI_CMD_T) (prCmdInfo->pucInfoBuffer);
  9295. prWifiCmd->u2TxByteCount = prCmdInfo->u2InfoBufLen;
  9296. prWifiCmd->u2PQ_ID = CMD_PQ_ID;
  9297. prWifiCmd->ucPktTypeID = CMD_PACKET_TYPE_ID;
  9298. prWifiCmd->ucCID = prCmdInfo->ucCID;
  9299. prWifiCmd->ucSetQuery = prCmdInfo->fgSetQuery;
  9300. prWifiCmd->ucSeqNum = prCmdInfo->ucCmdSeqNum;
  9301. prCmdDefaultKey = (P_CMD_DEFAULT_KEY) (prWifiCmd->aucBuffer);
  9302. kalMemZero(prCmdDefaultKey, sizeof(CMD_DEFAULT_KEY));
  9303. prCmdDefaultKey->ucBssIdx = prAdapter->prAisBssInfo->ucBssIndex;
  9304. prCmdDefaultKey->ucKeyId = prDefaultKey->ucKeyID;
  9305. prCmdDefaultKey->ucUnicast = prDefaultKey->ucUnicast;
  9306. prCmdDefaultKey->ucMulticast = prDefaultKey->ucMulticast;
  9307. if (prDefaultKey->ucMulticast) {
  9308. prAdapter->prAisBssInfo->fgTxBcKeyExist = TRUE;
  9309. prAdapter->prAisBssInfo->ucTxDefaultKeyID = prDefaultKey->ucKeyID;
  9310. /* prBssInfo->ucBMCWlanIndex = secPrivacySeekForBcEntry(prAdapter, prBssInfo->ucBssIndex, */
  9311. /* NETWORK_TYPE_AIS, prCmdKey->aucPeerAddr, prCmdKey->ucAlgorithmId, prCmdKey->ucKeyId, */
  9312. /* prBssInfo->ucCurrentGtkId, BIT(1)); */
  9313. /* prCmdDefaultKey->ucBMCWlanIndex = prBssInfo->ucBMCWlanIndex; */
  9314. } else {
  9315. ASSERT(FALSE);
  9316. }
  9317. /* insert into prCmdQueue */
  9318. kalEnqueueCommand(prGlueInfo, (P_QUE_ENTRY_T) prCmdInfo);
  9319. /* wakeup txServiceThread later */
  9320. GLUE_SET_EVENT(prGlueInfo);
  9321. return WLAN_STATUS_PENDING;
  9322. } /* wlanoidSetDefaultKey */
  9323. /*----------------------------------------------------------------------------*/
  9324. /*!
  9325. * \brief This routine is called to set the GTK rekey data
  9326. *
  9327. * \param[in] prAdapter Pointer to the Adapter structure.
  9328. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  9329. * \param[in] u4SetBufferLen The length of the set buffer.
  9330. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  9331. * bytes read from the set buffer. If the call failed
  9332. * due to invalid length of the set buffer, returns
  9333. * the amount of storage needed.
  9334. *
  9335. * \retval WLAN_STATUS_SUCCESS
  9336. * \retval WLAN_STATUS_BUFFER_TOO_SHORT
  9337. * \retval WLAN_STATUS_INVALID_DATA
  9338. */
  9339. /*----------------------------------------------------------------------------*/
  9340. WLAN_STATUS
  9341. wlanoidSetGtkRekeyData(IN P_ADAPTER_T prAdapter,
  9342. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  9343. {
  9344. CMD_GTK_REKEY_DATA_T rCmdContent;
  9345. WLAN_STATUS rStatus;
  9346. ASSERT(prAdapter);
  9347. kalMemCopy(&rCmdContent, (PUINT_8) pvSetBuffer, u4SetBufferLen);
  9348. rStatus = wlanSendSetQueryCmd(prAdapter, /* prAdapter */
  9349. CMD_ID_SET_GTK_REKEY_DATA, /* ucCID */
  9350. TRUE, /* fgSetQuery */
  9351. FALSE, /* fgNeedResp */
  9352. TRUE, /* fgIsOid */
  9353. NULL, /* pfCmdDoneHandler */
  9354. NULL, /* pfCmdTimeoutHandler */
  9355. sizeof(CMD_GTK_REKEY_DATA_T), /* u4SetQueryInfoLen */
  9356. (PUINT_8) &rCmdContent, /* pucInfoBuffer */
  9357. NULL, /* pvSetQueryBuffer */
  9358. 0 /* u4SetQueryBufferLen */
  9359. );
  9360. /* ASSERT(rStatus == WLAN_STATUS_PENDING); */
  9361. return rStatus;
  9362. } /* wlanoidSetGtkRekeyData */
  9363. /*----------------------------------------------------------------------------*/
  9364. /*!
  9365. * \brief This routine is called to request starting of schedule scan
  9366. *
  9367. * \param[in] prAdapter Pointer to the Adapter structure.
  9368. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  9369. * \param[in] u4SetBufferLen The length of the set buffer.
  9370. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  9371. * bytes read from the set buffer. If the call failed
  9372. * due to invalid length of the set buffer, returns
  9373. * the amount of storage needed.
  9374. *
  9375. * \retval WLAN_STATUS_SUCCESS
  9376. * \retval WLAN_STATUS_ADAPTER_NOT_READY
  9377. * \retval WLAN_STATUS_INVALID_LENGTH
  9378. * \retval WLAN_STATUS_INVALID_DATA
  9379. *
  9380. * \note The setting buffer PARAM_SCHED_SCAN_REQUEST_EXT_T
  9381. */
  9382. /*----------------------------------------------------------------------------*/
  9383. WLAN_STATUS
  9384. wlanoidSetStartSchedScan(IN P_ADAPTER_T prAdapter,
  9385. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  9386. {
  9387. P_PARAM_SCHED_SCAN_REQUEST prSchedScanRequest;
  9388. DEBUGFUNC("wlanoidSetStartSchedScan()");
  9389. if (prAdapter->rAcpiState == ACPI_STATE_D3) {
  9390. DBGLOG(OID, WARN,
  9391. "Fail in set scheduled scan! (Adapter not ready). ACPI=D%d, Radio=%d\n",
  9392. prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
  9393. return WLAN_STATUS_ADAPTER_NOT_READY;
  9394. }
  9395. ASSERT(pu4SetInfoLen);
  9396. *pu4SetInfoLen = 0;
  9397. if (u4SetBufferLen != sizeof(PARAM_SCHED_SCAN_REQUEST))
  9398. return WLAN_STATUS_INVALID_LENGTH;
  9399. else if (pvSetBuffer == NULL)
  9400. return WLAN_STATUS_INVALID_DATA;
  9401. else if (kalGetMediaStateIndicated(prAdapter->prGlueInfo) == PARAM_MEDIA_STATE_CONNECTED
  9402. && prAdapter->fgEnOnlineScan == FALSE)
  9403. return WLAN_STATUS_FAILURE;
  9404. if (prAdapter->fgIsRadioOff) {
  9405. DBGLOG(OID, WARN, "Return from BSSID list scan! (radio off). ACPI=D%d, Radio=%d\n",
  9406. prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
  9407. return WLAN_STATUS_SUCCESS;
  9408. }
  9409. prSchedScanRequest = (P_PARAM_SCHED_SCAN_REQUEST) pvSetBuffer;
  9410. if (scnFsmSchedScanRequest(prAdapter,
  9411. (UINT_8) (prSchedScanRequest->u4SsidNum),
  9412. prSchedScanRequest->arSsid,
  9413. prSchedScanRequest->u4IELength,
  9414. prSchedScanRequest->pucIE, prSchedScanRequest->u2ScanInterval) == TRUE)
  9415. return WLAN_STATUS_PENDING;
  9416. else
  9417. return WLAN_STATUS_FAILURE;
  9418. }
  9419. /*----------------------------------------------------------------------------*/
  9420. /*!
  9421. * \brief This routine is called to request termination of schedule scan
  9422. *
  9423. * \param[in] prAdapter Pointer to the Adapter structure.
  9424. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  9425. * \param[in] u4SetBufferLen The length of the set buffer.
  9426. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  9427. * bytes read from the set buffer. If the call failed
  9428. * due to invalid length of the set buffer, returns
  9429. * the amount of storage needed.
  9430. *
  9431. * \retval WLAN_STATUS_SUCCESS
  9432. * \retval WLAN_STATUS_ADAPTER_NOT_READY
  9433. * \retval WLAN_STATUS_INVALID_LENGTH
  9434. * \retval WLAN_STATUS_INVALID_DATA
  9435. *
  9436. * \note The setting buffer PARAM_SCHED_SCAN_REQUEST_EXT_T
  9437. */
  9438. /*----------------------------------------------------------------------------*/
  9439. WLAN_STATUS
  9440. wlanoidSetStopSchedScan(IN P_ADAPTER_T prAdapter,
  9441. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  9442. {
  9443. ASSERT(prAdapter);
  9444. /* ask SCN module to stop scan request */
  9445. if (scnFsmSchedScanStopRequest(prAdapter) == TRUE)
  9446. return WLAN_STATUS_PENDING;
  9447. else
  9448. return WLAN_STATUS_FAILURE;
  9449. }
  9450. #if CFG_M0VE_BA_TO_DRIVER
  9451. /*----------------------------------------------------------------------------*/
  9452. /*!
  9453. * \brief This routine is called to reset BA scoreboard.
  9454. *
  9455. *
  9456. * \param[in] prAdapter Pointer to the Adapter structure.
  9457. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  9458. * \param[in] u4SetBufferLen The length of the set buffer.
  9459. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  9460. * bytes read from the set buffer. If the call failed
  9461. * due to invalid length of the set buffer, returns
  9462. * the amount of storage needed.
  9463. *
  9464. * \retval WLAN_STATUS_SUCCESS
  9465. * \retval WLAN_STATUS_INVALID_LENGTH
  9466. */
  9467. /*----------------------------------------------------------------------------*/
  9468. WLAN_STATUS wlanoidResetBAScoreboard(IN P_ADAPTER_T prAdapter, IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen)
  9469. {
  9470. WLAN_STATUS rStatus;
  9471. DEBUGFUNC("wlanoidResetBAScoreboard");
  9472. DBGLOG(OID, WARN, "[Puff]wlanoidResetBAScoreboard\n");
  9473. ASSERT(prAdapter);
  9474. ASSERT(pvSetBuffer);
  9475. rStatus = wlanSendSetQueryCmd(prAdapter, /* prAdapter */
  9476. CMD_ID_RESET_BA_SCOREBOARD, /* ucCID */
  9477. TRUE, /* fgSetQuery */
  9478. FALSE, /* fgNeedResp */
  9479. TRUE, /* fgIsOid */
  9480. NULL, /* pfCmdDoneHandler */
  9481. NULL, /* pfCmdTimeoutHandler */
  9482. u4SetBufferLen, /* u4SetQueryInfoLen */
  9483. (PUINT_8) pvSetBuffer, /* pucInfoBuffer */
  9484. NULL, /* pvSetQueryBuffer */
  9485. 0 /* u4SetQueryBufferLen */
  9486. );
  9487. /* ASSERT(rStatus == WLAN_STATUS_PENDING); */
  9488. return rStatus;
  9489. }
  9490. #endif
  9491. #if CFG_SUPPORT_BATCH_SCAN
  9492. #define CMD_WLS_BATCHING "WLS_BATCHING"
  9493. #define BATCHING_SET "SET"
  9494. #define BATCHING_GET "GET"
  9495. #define BATCHING_STOP "STOP"
  9496. #define PARAM_SCANFREQ "SCANFREQ"
  9497. #define PARAM_MSCAN "MSCAN"
  9498. #define PARAM_BESTN "BESTN"
  9499. #define PARAM_CHANNEL "CHANNEL"
  9500. #define PARAM_RTT "RTT"
  9501. WLAN_STATUS
  9502. batchSetCmd(IN P_ADAPTER_T prAdapter, IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4WritenLen)
  9503. {
  9504. P_CHANNEL_INFO_T prRfChannelInfo;
  9505. CMD_BATCH_REQ_T rCmdBatchReq;
  9506. WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
  9507. PCHAR head, p, p2;
  9508. UINT_32 tokens;
  9509. INT_32 scanfreq, mscan, bestn, rtt;
  9510. char *pcTemp;
  9511. /* CHAR c_scanfreq[4], c_mscan[4], c_bestn[4], c_rtt[4], c_channel[100]; */
  9512. /* INT32 ch_type; */
  9513. UINT_32 u4Value = 0;
  9514. INT_32 i4Ret = 0;
  9515. DBGLOG(SCN, TRACE, "[BATCH] command=%s, len=%d\n", pvSetBuffer, u4SetBufferLen);
  9516. if (!pu4WritenLen)
  9517. return -EINVAL;
  9518. *pu4WritenLen = 0;
  9519. if (u4SetBufferLen < kalStrLen(CMD_WLS_BATCHING)) {
  9520. DBGLOG(SCN, TRACE, "[BATCH] invalid len %d\n", u4SetBufferLen);
  9521. return -EINVAL;
  9522. }
  9523. head = pvSetBuffer + kalStrLen(CMD_WLS_BATCHING) + 1;
  9524. kalMemSet(&rCmdBatchReq, 0, sizeof(CMD_BATCH_REQ_T));
  9525. if (!kalStrnCmp(head, BATCHING_SET, kalStrLen(BATCHING_SET))) {
  9526. DBGLOG(SCN, TRACE, "XXX Start Batch Scan XXX\n");
  9527. head += kalStrLen(BATCHING_SET) + 1;
  9528. /* SCANFREQ, MSCAN, BESTN */
  9529. tokens = sscanf(head, "SCANFREQ=%d MSCAN=%d BESTN=%d", &scanfreq, &mscan, &bestn);
  9530. if (tokens != 3) {
  9531. DBGLOG(SCN, TRACE,
  9532. "[BATCH] Parse fail: tokens=%d, SCANFREQ=%d MSCAN=%d BESTN=%d\n",
  9533. tokens, scanfreq, mscan, bestn);
  9534. return -EINVAL;
  9535. }
  9536. /* RTT */
  9537. p = kalStrStr(head, PARAM_RTT);
  9538. if (!p) {
  9539. DBGLOG(SCN, TRACE, "[BATCH] Parse RTT fail. head=%s\n", head);
  9540. return -EINVAL;
  9541. }
  9542. tokens = sscanf(p, "RTT=%d", &rtt);
  9543. if (tokens != 1) {
  9544. DBGLOG(SCN, TRACE, "[BATCH] Parse fail: tokens=%d, rtt=%d\n", tokens, rtt);
  9545. return -EINVAL;
  9546. }
  9547. /* CHANNEL */
  9548. p = kalStrStr(head, PARAM_CHANNEL);
  9549. if (!p) {
  9550. DBGLOG(SCN, TRACE, "[BATCH] Parse CHANNEL fail(1)\n");
  9551. return -EINVAL;
  9552. }
  9553. head = p;
  9554. p = kalStrChr(head, '>');
  9555. if (!p) {
  9556. DBGLOG(SCN, TRACE, "[BATCH] Parse CHANNEL fail(2)\n");
  9557. return -EINVAL;
  9558. }
  9559. /* else {
  9560. *p = '.'; // remove '>' because sscanf can not parse <%s>
  9561. }*/
  9562. /*tokens = sscanf(head, "CHANNEL=<%s", c_channel);
  9563. if (tokens != 1) {
  9564. DBGLOG(SCN, TRACE, "[BATCH] Parse fail: tokens=%d, CHANNEL=<%s>\n",
  9565. tokens, c_channel);
  9566. return -EINVAL;
  9567. } */
  9568. rCmdBatchReq.ucChannelType = SCAN_CHANNEL_SPECIFIED;
  9569. rCmdBatchReq.ucChannelListNum = 0;
  9570. prRfChannelInfo = &rCmdBatchReq.arChannelList[0];
  9571. p = head + kalStrLen(PARAM_CHANNEL) + 2; /* c_channel; */
  9572. pcTemp = (char *)p;
  9573. while ((p2 = kalStrSep(&pcTemp, ",")) != NULL) {
  9574. if (p2 == NULL || *p2 == 0)
  9575. break;
  9576. if (*p2 == '\0')
  9577. continue;
  9578. if (*p2 == 'A') {
  9579. rCmdBatchReq.ucChannelType =
  9580. rCmdBatchReq.ucChannelType ==
  9581. SCAN_CHANNEL_2G4 ? SCAN_CHANNEL_FULL : SCAN_CHANNEL_5G;
  9582. } else if (*p2 == 'B') {
  9583. rCmdBatchReq.ucChannelType =
  9584. rCmdBatchReq.ucChannelType ==
  9585. SCAN_CHANNEL_5G ? SCAN_CHANNEL_FULL : SCAN_CHANNEL_2G4;
  9586. } else {
  9587. /* Translate Freq from MHz to channel number. */
  9588. /* prRfChannelInfo->ucChannelNum = kalStrtol(p2, NULL, 0); */
  9589. i4Ret = kalkStrtou32(p2, 0, &u4Value);
  9590. if (i4Ret)
  9591. DBGLOG(SCN, TRACE, "parse ucChannelNum error i4Ret=%d\n", i4Ret);
  9592. prRfChannelInfo->ucChannelNum = (UINT_8) u4Value;
  9593. DBGLOG(SCN, TRACE, "Scanning Channel:%d, freq: %d\n",
  9594. prRfChannelInfo->ucChannelNum,
  9595. nicChannelNum2Freq(prRfChannelInfo->ucChannelNum));
  9596. prRfChannelInfo->ucBand = prRfChannelInfo->ucChannelNum < 15 ? BAND_2G4 : BAND_5G;
  9597. rCmdBatchReq.ucChannelListNum++;
  9598. if (rCmdBatchReq.ucChannelListNum >= 32)
  9599. break;
  9600. prRfChannelInfo++;
  9601. }
  9602. }
  9603. /* set channel for test */
  9604. #if 0
  9605. rCmdBatchReq.ucChannelType = 4; /* SCAN_CHANNEL_SPECIFIED; */
  9606. rCmdBatchReq.ucChannelListNum = 0;
  9607. prRfChannelInfo = &rCmdBatchReq.arChannelList[0];
  9608. for (i = 1; i <= 14; i++) {
  9609. /* filter out some */
  9610. if (i == 1 || i == 5 || i == 11)
  9611. continue;
  9612. /* Translate Freq from MHz to channel number. */
  9613. prRfChannelInfo->ucChannelNum = i;
  9614. DBGLOG(SCN, TRACE, "Scanning Channel:%d, freq: %d\n",
  9615. prRfChannelInfo->ucChannelNum, nicChannelNum2Freq(prRfChannelInfo->ucChannelNum));
  9616. prRfChannelInfo->ucBand = BAND_2G4;
  9617. rCmdBatchReq.ucChannelListNum++;
  9618. prRfChannelInfo++;
  9619. }
  9620. #endif
  9621. #if 0
  9622. rCmdBatchReq.ucChannelType = 0; /* SCAN_CHANNEL_FULL; */
  9623. #endif
  9624. rCmdBatchReq.u4Scanfreq = scanfreq;
  9625. rCmdBatchReq.ucMScan = mscan > CFG_BATCH_MAX_MSCAN ? CFG_BATCH_MAX_MSCAN : mscan;
  9626. rCmdBatchReq.ucBestn = bestn;
  9627. rCmdBatchReq.ucRtt = rtt;
  9628. DBGLOG(SCN, TRACE, "[BATCH] SCANFREQ=%d MSCAN=%d BESTN=%d RTT=%d\n",
  9629. rCmdBatchReq.u4Scanfreq, rCmdBatchReq.ucMScan, rCmdBatchReq.ucBestn, rCmdBatchReq.ucRtt);
  9630. if (rCmdBatchReq.ucChannelType != SCAN_CHANNEL_SPECIFIED) {
  9631. DBGLOG(SCN, TRACE, "[BATCH] CHANNELS = %s\n",
  9632. rCmdBatchReq.ucChannelType ==
  9633. SCAN_CHANNEL_FULL ? "FULL" : rCmdBatchReq.ucChannelType ==
  9634. SCAN_CHANNEL_2G4 ? "2.4G all" : "5G all");
  9635. } else {
  9636. DBGLOG(SCN, TRACE, "[BATCH] CHANNEL list\n");
  9637. prRfChannelInfo = &rCmdBatchReq.arChannelList[0];
  9638. for (tokens = 0; tokens < rCmdBatchReq.ucChannelListNum; tokens++) {
  9639. DBGLOG(SCN, TRACE, "[BATCH] %s, %d\n",
  9640. prRfChannelInfo->ucBand ==
  9641. BAND_2G4 ? "2.4G" : "5G", prRfChannelInfo->ucChannelNum);
  9642. prRfChannelInfo++;
  9643. }
  9644. }
  9645. rCmdBatchReq.ucSeqNum = 1;
  9646. rCmdBatchReq.ucNetTypeIndex = KAL_NETWORK_TYPE_AIS_INDEX;
  9647. rCmdBatchReq.ucCmd = SCAN_BATCH_REQ_START;
  9648. *pu4WritenLen = kalSnprintf(pvSetBuffer, 3, "%d", rCmdBatchReq.ucMScan);
  9649. } else if (!kalStrnCmp(head, BATCHING_STOP, kalStrLen(BATCHING_STOP))) {
  9650. DBGLOG(SCN, TRACE, "XXX Stop Batch Scan XXX\n");
  9651. rCmdBatchReq.ucSeqNum = 1;
  9652. rCmdBatchReq.ucNetTypeIndex = KAL_NETWORK_TYPE_AIS_INDEX;
  9653. rCmdBatchReq.ucCmd = SCAN_BATCH_REQ_STOP;
  9654. } else {
  9655. return -EINVAL;
  9656. }
  9657. wlanSendSetQueryCmd(prAdapter,
  9658. CMD_ID_SET_BATCH_REQ,
  9659. TRUE, FALSE, TRUE, NULL, NULL, sizeof(CMD_BATCH_REQ_T), (PUINT_8) &rCmdBatchReq, NULL, 0);
  9660. /* kalMemSet(pvSetBuffer, 0, u4SetBufferLen); */
  9661. /* rStatus = kalSnprintf(pvSetBuffer, 2, "%s", "OK"); */
  9662. /* exit: */
  9663. return rStatus;
  9664. }
  9665. WLAN_STATUS
  9666. batchGetCmd(IN P_ADAPTER_T prAdapter,
  9667. OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  9668. {
  9669. CMD_BATCH_REQ_T rCmdBatchReq;
  9670. WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
  9671. P_EVENT_BATCH_RESULT_T prEventBatchResult;
  9672. /* UINT_32 i; */
  9673. ASSERT(prAdapter);
  9674. ASSERT(pu4QueryInfoLen);
  9675. if (u4QueryBufferLen)
  9676. ASSERT(pvQueryBuffer);
  9677. prEventBatchResult = (P_EVENT_BATCH_RESULT_T) pvQueryBuffer;
  9678. DBGLOG(SCN, TRACE, "XXX Get Batch Scan Result (%d) XXX\n", prEventBatchResult->ucScanCount);
  9679. *pu4QueryInfoLen = sizeof(EVENT_BATCH_RESULT_T);
  9680. rCmdBatchReq.ucSeqNum = 2;
  9681. rCmdBatchReq.ucCmd = SCAN_BATCH_REQ_RESULT;
  9682. rCmdBatchReq.ucMScan = prEventBatchResult->ucScanCount; /* Get which round result */
  9683. rStatus = wlanSendSetQueryCmd(prAdapter,
  9684. CMD_ID_SET_BATCH_REQ,
  9685. FALSE,
  9686. TRUE,
  9687. TRUE,
  9688. nicCmdEventBatchScanResult,
  9689. nicOidCmdTimeoutCommon,
  9690. sizeof(CMD_BATCH_REQ_T),
  9691. (PUINT_8) &rCmdBatchReq, (PVOID) pvQueryBuffer, u4QueryBufferLen);
  9692. return rStatus;
  9693. }
  9694. /*----------------------------------------------------------------------------*/
  9695. /*!
  9696. * \brief
  9697. *
  9698. * \param[in] prAdapter Pointer to the Adapter structure
  9699. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set
  9700. * \param[in] u4SetBufferLen The length of the set buffer
  9701. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  9702. * bytes read from the set buffer. If the call failed due to invalid length of
  9703. * the set buffer, returns the amount of storage needed.
  9704. *
  9705. * \retval WLAN_STATUS_SUCCESS
  9706. * \retval WLAN_STATUS_INVALID_DATA If new setting value is wrong.
  9707. * \retval WLAN_STATUS_INVALID_LENGTH
  9708. *
  9709. */
  9710. /*----------------------------------------------------------------------------*/
  9711. WLAN_STATUS
  9712. wlanoidSetBatchScanReq(IN P_ADAPTER_T prAdapter,
  9713. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  9714. {
  9715. return batchSetCmd(prAdapter, pvSetBuffer, u4SetBufferLen, pu4SetInfoLen);
  9716. }
  9717. /*----------------------------------------------------------------------------*/
  9718. /*!
  9719. * \brief
  9720. *
  9721. * \param[in] pvAdapter Pointer to the Adapter structure.
  9722. * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
  9723. * the query.
  9724. * \param[in] u4QueryBufferLen The length of the query buffer.
  9725. * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
  9726. * bytes written into the query buffer. If the call
  9727. * failed due to invalid length of the query buffer,
  9728. * returns the amount of storage needed.
  9729. *
  9730. * \retval WLAN_STATUS_SUCCESS
  9731. * \retval WLAN_STATUS_INVALID_LENGTH
  9732. */
  9733. /*----------------------------------------------------------------------------*/
  9734. WLAN_STATUS
  9735. wlanoidQueryBatchScanResult(IN P_ADAPTER_T prAdapter,
  9736. OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  9737. {
  9738. return batchGetCmd(prAdapter, pvQueryBuffer, u4QueryBufferLen, pu4QueryInfoLen);
  9739. } /* end of wlanoidQueryBatchScanResult() */
  9740. #endif /* CFG_SUPPORT_BATCH_SCAN */
  9741. #if CFG_SUPPORT_PASSPOINT
  9742. /*----------------------------------------------------------------------------*/
  9743. /*!
  9744. * \brief This routine is called by HS2.0 to set the assoc info, which is needed to add to
  9745. * Association request frame while join HS2.0 AP.
  9746. *
  9747. * \param[in] prAdapter Pointer to the Adapter structure
  9748. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set
  9749. * \param[in] u4SetBufferLen The length of the set buffer
  9750. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  9751. * bytes read from the set buffer. If the call failed due to invalid length of
  9752. * the set buffer, returns the amount of storage needed.
  9753. *
  9754. * \retval WLAN_STATUS_SUCCESS
  9755. * \retval WLAN_STATUS_INVALID_DATA If new setting value is wrong.
  9756. * \retval WLAN_STATUS_INVALID_LENGTH
  9757. *
  9758. */
  9759. /*----------------------------------------------------------------------------*/
  9760. WLAN_STATUS
  9761. wlanoidSetHS20Info(IN P_ADAPTER_T prAdapter,
  9762. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  9763. {
  9764. P_IE_HS20_INDICATION_T prHS20IndicationIe;
  9765. ASSERT(prAdapter);
  9766. ASSERT(pvSetBuffer);
  9767. ASSERT(pu4SetInfoLen);
  9768. DEBUGFUNC("wlanoidSetHS20AssocInfo");
  9769. DBGLOG(OID, LOUD, "\r\n");
  9770. if (u4SetBufferLen == 0)
  9771. return WLAN_STATUS_INVALID_LENGTH;
  9772. *pu4SetInfoLen = u4SetBufferLen;
  9773. prHS20IndicationIe = (P_IE_HS20_INDICATION_T) pvSetBuffer;
  9774. prAdapter->prGlueInfo->ucHotspotConfig = prHS20IndicationIe->ucHotspotConfig;
  9775. prAdapter->prGlueInfo->fgConnectHS20AP = TRUE;
  9776. DBGLOG(SEC, TRACE, "HS20 IE sz %ld\n", u4SetBufferLen);
  9777. kalMemCopy(prAdapter->prGlueInfo->aucHS20AssocInfoIE, pvSetBuffer, u4SetBufferLen);
  9778. prAdapter->prGlueInfo->u2HS20AssocInfoIELen = (UINT_16) u4SetBufferLen;
  9779. DBGLOG(SEC, TRACE, "HS20 Assoc Info IE sz %ld\n", u4SetBufferLen);
  9780. return WLAN_STATUS_SUCCESS;
  9781. }
  9782. /*----------------------------------------------------------------------------*/
  9783. /*!
  9784. * \brief This routine is called by WSC to set the assoc info, which is needed to add to
  9785. * Association request frame while join WPS AP.
  9786. *
  9787. * \param[in] prAdapter Pointer to the Adapter structure
  9788. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set
  9789. * \param[in] u4SetBufferLen The length of the set buffer
  9790. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  9791. * bytes read from the set buffer. If the call failed due to invalid length of
  9792. * the set buffer, returns the amount of storage needed.
  9793. *
  9794. * \retval WLAN_STATUS_SUCCESS
  9795. * \retval WLAN_STATUS_INVALID_DATA If new setting value is wrong.
  9796. * \retval WLAN_STATUS_INVALID_LENGTH
  9797. *
  9798. */
  9799. /*----------------------------------------------------------------------------*/
  9800. WLAN_STATUS
  9801. wlanoidSetInterworkingInfo(IN P_ADAPTER_T prAdapter,
  9802. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  9803. {
  9804. #if 0
  9805. P_HS20_INFO_T prHS20Info = NULL;
  9806. P_IE_INTERWORKING_T prInterWorkingIe;
  9807. ASSERT(prAdapter);
  9808. ASSERT(pvSetBuffer);
  9809. ASSERT(pu4SetInfoLen);
  9810. prHS20Info = &(prAdapter->rWifiVar.rHS20Info);
  9811. DEBUGFUNC("wlanoidSetInterworkingInfo");
  9812. DBGLOG(OID, TRACE, "\r\n");
  9813. if (u4SetBufferLen == 0)
  9814. return WLAN_STATUS_INVALID_LENGTH;
  9815. *pu4SetInfoLen = u4SetBufferLen;
  9816. prInterWorkingIe = (P_IE_INTERWORKING_T) pvSetBuffer;
  9817. prHS20Info->ucAccessNetworkOptions = prInterWorkingIe->ucAccNetOpt;
  9818. prHS20Info->ucVenueGroup = prInterWorkingIe->ucVenueGroup;
  9819. prHS20Info->ucVenueType = prInterWorkingIe->ucVenueType;
  9820. COPY_MAC_ADDR(prHS20Info->aucHESSID, prInterWorkingIe->aucHESSID);
  9821. DBGLOG(SEC, TRACE, "IW IE sz %ld\n", u4SetBufferLen);
  9822. #endif
  9823. return WLAN_STATUS_SUCCESS;
  9824. }
  9825. /*----------------------------------------------------------------------------*/
  9826. /*!
  9827. * \brief This routine is called by WSC to set the Roaming Consortium IE info, which is needed to
  9828. * add to Association request frame while join WPS AP.
  9829. *
  9830. * \param[in] prAdapter Pointer to the Adapter structure
  9831. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set
  9832. * \param[in] u4SetBufferLen The length of the set buffer
  9833. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  9834. * bytes read from the set buffer. If the call failed due to invalid length of
  9835. * the set buffer, returns the amount of storage needed.
  9836. *
  9837. * \retval WLAN_STATUS_SUCCESS
  9838. * \retval WLAN_STATUS_INVALID_DATA If new setting value is wrong.
  9839. * \retval WLAN_STATUS_INVALID_LENGTH
  9840. *
  9841. */
  9842. /*----------------------------------------------------------------------------*/
  9843. WLAN_STATUS
  9844. wlanoidSetRoamingConsortiumIEInfo(IN P_ADAPTER_T prAdapter,
  9845. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  9846. {
  9847. #if 0
  9848. P_HS20_INFO_T prHS20Info = NULL;
  9849. P_PARAM_HS20_ROAMING_CONSORTIUM_INFO prRCInfo;
  9850. ASSERT(prAdapter);
  9851. ASSERT(pvSetBuffer);
  9852. ASSERT(pu4SetInfoLen);
  9853. prHS20Info = &(prAdapter->rWifiVar.rHS20Info);
  9854. /* DEBUGFUNC("wlanoidSetRoamingConsortiumInfo"); */
  9855. /* DBGLOG(HS2, TRACE, ("\r\n")); */
  9856. if (u4SetBufferLen == 0)
  9857. return WLAN_STATUS_INVALID_LENGTH;
  9858. *pu4SetInfoLen = u4SetBufferLen;
  9859. prRCInfo = (P_PARAM_HS20_ROAMING_CONSORTIUM_INFO) pvSetBuffer;
  9860. kalMemCopy(&(prHS20Info->rRCInfo), prRCInfo, sizeof(PARAM_HS20_ROAMING_CONSORTIUM_INFO));
  9861. /* DBGLOG(HS2, TRACE, ("RoamingConsortium IE sz %ld\n", u4SetBufferLen)); */
  9862. #endif
  9863. return WLAN_STATUS_SUCCESS;
  9864. }
  9865. /*----------------------------------------------------------------------------*/
  9866. /*!
  9867. * \brief This routine is called to set_bssid_pool
  9868. *
  9869. * \param[in] prAdapter Pointer to the Adapter structure.
  9870. * \param[in] pvSetBuffer Pointer to the buffer that holds the data to be set.
  9871. * \param[in] u4SetBufferLen The length of the set buffer.
  9872. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  9873. * bytes read from the set buffer. If the call failed
  9874. * due to invalid length of the set buffer, returns
  9875. * the amount of storage needed.
  9876. *
  9877. * \retval WLAN_STATUS_SUCCESS
  9878. * \retval WLAN_STATUS_INVALID_LENGTH
  9879. * \retval WLAN_STATUS_ADAPTER_NOT_READY
  9880. * \retval WLAN_STATUS_MULTICAST_FULL
  9881. */
  9882. /*----------------------------------------------------------------------------*/
  9883. WLAN_STATUS
  9884. wlanoidSetHS20BssidPool(IN P_ADAPTER_T prAdapter,
  9885. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  9886. {
  9887. WLAN_STATUS rWlanStatus = WLAN_STATUS_SUCCESS;
  9888. ASSERT(prAdapter);
  9889. ASSERT(pu4SetInfoLen);
  9890. if (u4SetBufferLen)
  9891. ASSERT(pvSetBuffer);
  9892. if (u4SetBufferLen < sizeof(PARAM_HS20_SET_BSSID_POOL)) {
  9893. *pu4SetInfoLen = sizeof(PARAM_HS20_SET_BSSID_POOL);
  9894. return WLAN_STATUS_BUFFER_TOO_SHORT;
  9895. }
  9896. rWlanStatus = hs20SetBssidPool(prAdapter, pvSetBuffer, KAL_NETWORK_TYPE_AIS_INDEX);
  9897. return rWlanStatus;
  9898. } /* end of wlanoidSendHS20GASRequest() */
  9899. #endif /* CFG_SUPPORT_PASSPOINT */
  9900. #if CFG_SUPPORT_SNIFFER
  9901. WLAN_STATUS
  9902. wlanoidSetMonitor(IN P_ADAPTER_T prAdapter, IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  9903. {
  9904. P_PARAM_CUSTOM_MONITOR_SET_STRUCT_T prMonitorSetInfo;
  9905. CMD_MONITOR_SET_INFO_T rCmdMonitorSetInfo;
  9906. WLAN_STATUS rWlanStatus = WLAN_STATUS_SUCCESS;
  9907. DEBUGFUNC("wlanoidSetMonitor");
  9908. ASSERT(prAdapter);
  9909. ASSERT(pu4SetInfoLen);
  9910. *pu4SetInfoLen = sizeof(PARAM_CUSTOM_MONITOR_SET_STRUCT_T);
  9911. if (u4SetBufferLen < sizeof(PARAM_CUSTOM_MONITOR_SET_STRUCT_T))
  9912. return WLAN_STATUS_INVALID_LENGTH;
  9913. ASSERT(pvSetBuffer);
  9914. prMonitorSetInfo = (P_PARAM_CUSTOM_MONITOR_SET_STRUCT_T) pvSetBuffer;
  9915. rCmdMonitorSetInfo.ucEnable = prMonitorSetInfo->ucEnable;
  9916. rCmdMonitorSetInfo.ucBand = prMonitorSetInfo->ucBand;
  9917. rCmdMonitorSetInfo.ucPriChannel = prMonitorSetInfo->ucPriChannel;
  9918. rCmdMonitorSetInfo.ucSco = prMonitorSetInfo->ucSco;
  9919. rCmdMonitorSetInfo.ucChannelWidth = prMonitorSetInfo->ucChannelWidth;
  9920. rCmdMonitorSetInfo.ucChannelS1 = prMonitorSetInfo->ucChannelS1;
  9921. rCmdMonitorSetInfo.ucChannelS2 = prMonitorSetInfo->ucChannelS2;
  9922. rWlanStatus = wlanSendSetQueryCmd(prAdapter,
  9923. CMD_ID_SET_MONITOR,
  9924. TRUE,
  9925. FALSE,
  9926. TRUE,
  9927. nicCmdEventSetCommon,
  9928. nicOidCmdTimeoutCommon,
  9929. sizeof(CMD_MONITOR_SET_INFO_T),
  9930. (PUINT_8) &rCmdMonitorSetInfo, pvSetBuffer, u4SetBufferLen);
  9931. return rWlanStatus;
  9932. }
  9933. #endif
  9934. #if CFG_SUPPORT_SCN_PSCN
  9935. #if 0
  9936. /*----------------------------------------------------------------------------*/
  9937. /*!
  9938. * \brief This routine is called to request starting of schedule scan
  9939. *
  9940. * \param[in] prAdapter Pointer to the Adapter structure.
  9941. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  9942. * \param[in] u4SetBufferLen The length of the set buffer.
  9943. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  9944. * bytes read from the set buffer. If the call failed
  9945. * due to invalid length of the set buffer, returns
  9946. * the amount of storage needed.
  9947. *
  9948. * \retval WLAN_STATUS_SUCCESS
  9949. * \retval WLAN_STATUS_ADAPTER_NOT_READY
  9950. * \retval WLAN_STATUS_INVALID_LENGTH
  9951. * \retval WLAN_STATUS_INVALID_DATA
  9952. *
  9953. * \note The setting buffer PARAM_SCHED_SCAN_REQUEST_EXT_T
  9954. */
  9955. /*----------------------------------------------------------------------------*/
  9956. WLAN_STATUS
  9957. wlanoidSetStartSchedScan(IN P_ADAPTER_T prAdapter,
  9958. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  9959. {
  9960. P_PARAM_SCHED_SCAN_REQUEST prSchedScanRequest;
  9961. DEBUGFUNC("wlanoidSetStartSchedScan()");
  9962. if (prAdapter->rAcpiState == ACPI_STATE_D3) {
  9963. DBGLOG(OID, WARN,
  9964. ("Fail in set scheduled scan! (Adapter not ready). ACPI=D%d, Radio=%d\n",
  9965. prAdapter->rAcpiState, prAdapter->fgIsRadioOff));
  9966. return WLAN_STATUS_ADAPTER_NOT_READY;
  9967. }
  9968. ASSERT(pu4SetInfoLen);
  9969. *pu4SetInfoLen = 0;
  9970. if (u4SetBufferLen != sizeof(PARAM_SCHED_SCAN_REQUEST)) {
  9971. return WLAN_STATUS_INVALID_LENGTH;
  9972. } else if (pvSetBuffer == NULL) {
  9973. return WLAN_STATUS_INVALID_DATA;
  9974. } else if (kalGetMediaStateIndicated(prAdapter->prGlueInfo) == PARAM_MEDIA_STATE_CONNECTED
  9975. && prAdapter->fgEnOnlineScan == FALSE) {
  9976. return WLAN_STATUS_FAILURE;
  9977. }
  9978. if (prAdapter->fgIsRadioOff) {
  9979. DBGLOG(OID, WARN, ("Return from BSSID list scan! (radio off). ACPI=D%d, Radio=%d\n",
  9980. prAdapter->rAcpiState, prAdapter->fgIsRadioOff));
  9981. return WLAN_STATUS_SUCCESS;
  9982. }
  9983. prSchedScanRequest = (P_PARAM_SCHED_SCAN_REQUEST) pvSetBuffer;
  9984. if (scnFsmSchedScanRequest(prAdapter,
  9985. (UINT_8) (prSchedScanRequest->u4SsidNum),
  9986. prSchedScanRequest->arSsid,
  9987. prSchedScanRequest->u4IELength,
  9988. prSchedScanRequest->pucIE, prSchedScanRequest->u2ScanInterval) == TRUE) {
  9989. return WLAN_STATUS_PENDING;
  9990. } else {
  9991. return WLAN_STATUS_FAILURE;
  9992. }
  9993. }
  9994. /*----------------------------------------------------------------------------*/
  9995. /*!
  9996. * \brief This routine is called to request termination of schedule scan
  9997. *
  9998. * \param[in] prAdapter Pointer to the Adapter structure.
  9999. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  10000. * \param[in] u4SetBufferLen The length of the set buffer.
  10001. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  10002. * bytes read from the set buffer. If the call failed
  10003. * due to invalid length of the set buffer, returns
  10004. * the amount of storage needed.
  10005. *
  10006. * \retval WLAN_STATUS_SUCCESS
  10007. * \retval WLAN_STATUS_ADAPTER_NOT_READY
  10008. * \retval WLAN_STATUS_INVALID_LENGTH
  10009. * \retval WLAN_STATUS_INVALID_DATA
  10010. *
  10011. * \note The setting buffer PARAM_SCHED_SCAN_REQUEST_EXT_T
  10012. */
  10013. /*----------------------------------------------------------------------------*/
  10014. WLAN_STATUS
  10015. wlanoidSetStopSchedScan(IN P_ADAPTER_T prAdapter,
  10016. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  10017. {
  10018. ASSERT(prAdapter);
  10019. /* ask SCN module to stop scan request */
  10020. if (scnFsmSchedScanStopRequest(prAdapter) == TRUE)
  10021. return WLAN_STATUS_PENDING;
  10022. else
  10023. return WLAN_STATUS_FAILURE;
  10024. }
  10025. #endif
  10026. /*----------------------------------------------------------------------------*/
  10027. /*!
  10028. * \brief This routine is called to set a periodically scan action
  10029. *
  10030. * \param[in] prAdapter Pointer to the Adapter structure.
  10031. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  10032. * \param[in] u4SetBufferLen The length of the set buffer.
  10033. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  10034. * bytes read from the set buffer. If the call failed
  10035. * due to invalid length of the set buffer, returns
  10036. * the amount of storage needed.
  10037. *
  10038. * \retval WLAN_STATUS_SUCCESS
  10039. * \retval WLAN_STATUS_ADAPTER_NOT_READY
  10040. * \retval WLAN_STATUS_INVALID_LENGTH
  10041. * \retval WLAN_STATUS_INVALID_DATA
  10042. *
  10043. * \note The setting buffer PARAM_SCHED_SCAN_REQUEST_EXT_T
  10044. */
  10045. /*----------------------------------------------------------------------------*/
  10046. WLAN_STATUS
  10047. wlanoidSetGSCNAction(IN P_ADAPTER_T prAdapter,
  10048. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  10049. {
  10050. P_CMD_SET_PSCAN_ENABLE prCmdPscnAction;
  10051. P_SCAN_INFO_T prScanInfo;
  10052. prScanInfo = &(prAdapter->rWifiVar.rScanInfo);
  10053. /* DBGLOG(OID, TRACE, "wlanoidSetGSCNAction\n"); */
  10054. if (prAdapter->rAcpiState == ACPI_STATE_D3) {
  10055. DBGLOG(OID, WARN,
  10056. "Fail in set Periodically Scan! (Adapter not ready). ACPI=D%d, Radio=%d\n",
  10057. prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
  10058. return WLAN_STATUS_ADAPTER_NOT_READY;
  10059. }
  10060. if (u4SetBufferLen != sizeof(CMD_SET_PSCAN_ENABLE))
  10061. return WLAN_STATUS_INVALID_LENGTH;
  10062. else if (pvSetBuffer == NULL)
  10063. return WLAN_STATUS_INVALID_DATA;
  10064. if (prAdapter->fgIsRadioOff) {
  10065. DBGLOG(OID, WARN, "Return from BSSID list scan! (radio off). ACPI=D%d, Radio=%d\n",
  10066. prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
  10067. return WLAN_STATUS_SUCCESS;
  10068. }
  10069. prCmdPscnAction = (P_CMD_SET_PSCAN_ENABLE) pvSetBuffer;
  10070. if (prCmdPscnAction->ucPscanAct == ENABLE) {
  10071. #if 0
  10072. DBGLOG(OID, INFO, ("set PCSN ENABLE\n"));
  10073. if (scnFsmPSCNAction(prAdapter, (UINT_8) (prCmdPscnAction->ucPscanAct)) == TRUE) {
  10074. DBGLOG(OID, INFO, ("wlanoidSetGSCNAction < ---\n"));
  10075. return WLAN_STATUS_PENDING;
  10076. }
  10077. DBGLOG(OID, INFO, ("wlanoidSetGSCNAction < ---\n"));
  10078. return WLAN_STATUS_FAILURE;
  10079. #endif
  10080. scnPSCNFsm(prAdapter, PSCN_SCANNING, NULL, NULL, NULL, NULL, FALSE, FALSE, FALSE, TRUE);
  10081. } else if (prCmdPscnAction->ucPscanAct == DISABLE) {
  10082. #if 0
  10083. DBGLOG(OID, INFO, ("disable PCSN\n"));
  10084. scnFsmPSCNAction(prAdapter, (UINT_8) DISABLE);
  10085. DBGLOG(OID, TRACE, ("set new PCSN\n"));
  10086. scnCombineParamsIntoPSCN(prAdapter, NULL, NULL, NULL, NULL, FALSE, FALSE, TRUE);
  10087. DBGLOG(OID, INFO, ("ENABLE or disable PCSN\n"));
  10088. if (!prScanInfo->fgPscnOnnning) {
  10089. DBGLOG(OID, INFO, ("ENABLE PCSN\n"));
  10090. scnFsmPSCNAction(prAdapter, ENABLE);
  10091. } else {
  10092. DBGLOG(OID, INFO, ("All PCSN is disabled...\n"));
  10093. }
  10094. #endif
  10095. scnPSCNFsm(prAdapter, PSCN_RESET, NULL, NULL, NULL, NULL, FALSE, FALSE, TRUE, FALSE);
  10096. }
  10097. return WLAN_STATUS_SUCCESS;
  10098. }
  10099. /*----------------------------------------------------------------------------*/
  10100. /*!
  10101. * \brief This routine is called to set a periodically scan action
  10102. *
  10103. * \param[in] prAdapter Pointer to the Adapter structure.
  10104. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  10105. * \param[in] u4SetBufferLen The length of the set buffer.
  10106. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  10107. * bytes read from the set buffer. If the call failed
  10108. * due to invalid length of the set buffer, returns
  10109. * the amount of storage needed.
  10110. *
  10111. * \retval WLAN_STATUS_SUCCESS
  10112. * \retval WLAN_STATUS_ADAPTER_NOT_READY
  10113. * \retval WLAN_STATUS_INVALID_LENGTH
  10114. * \retval WLAN_STATUS_INVALID_DATA
  10115. *
  10116. * \note The setting buffer PARAM_SCHED_SCAN_REQUEST_EXT_T
  10117. */
  10118. /*----------------------------------------------------------------------------*/
  10119. WLAN_STATUS
  10120. wlanoidSetGSCNAParam(IN P_ADAPTER_T prAdapter,
  10121. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  10122. {
  10123. P_PARAM_WIFI_GSCAN_CMD_PARAMS prCmdGscnParam;
  10124. DBGLOG(OID, INFO, "wlanoidSetGSCNAParam v1\n");
  10125. if (prAdapter->rAcpiState == ACPI_STATE_D3) {
  10126. DBGLOG(OID, WARN,
  10127. "Fail in set Periodically Scan! (Adapter not ready). ACPI=D%d, Radio=%d\n",
  10128. prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
  10129. DBGLOG(OID, INFO,
  10130. "Fail in set Periodically Scan! (Adapter not ready). ACPI=D%d, Radio=%d\n",
  10131. prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
  10132. return WLAN_STATUS_ADAPTER_NOT_READY;
  10133. }
  10134. if (u4SetBufferLen != sizeof(PARAM_WIFI_GSCAN_CMD_PARAMS)) {
  10135. DBGLOG(OID, INFO, "(u4SetBufferLen != sizeof(P_PARAM_WIFI_GSCAN_CMD_PARAMS))\n");
  10136. return WLAN_STATUS_INVALID_LENGTH;
  10137. } else if (pvSetBuffer == NULL) {
  10138. DBGLOG(OID, INFO, "(pvSetBuffer == NULL)\n");
  10139. return WLAN_STATUS_INVALID_DATA;
  10140. }
  10141. if (prAdapter->fgIsRadioOff) {
  10142. DBGLOG(OID, WARN, "Return from BSSID list scan! (radio off). ACPI=D%d, Radio=%d\n",
  10143. prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
  10144. DBGLOG(OID, INFO, "Return from BSSID list scan! (radio off). ACPI=D%d, Radio=%d\n",
  10145. prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
  10146. return WLAN_STATUS_SUCCESS;
  10147. }
  10148. prCmdGscnParam = (P_PARAM_WIFI_GSCAN_CMD_PARAMS) pvSetBuffer;
  10149. /* memcpy(prCmdGscnParam, (P_PARAM_WIFI_GSCAN_CMD_PARAMS)pvSetBuffer,
  10150. sizeof(PARAM_WIFI_GSCAN_CMD_PARAMS) ); */
  10151. /*DBGLOG(OID, INFO, "prCmdGscnParam : base_period[%u],
  10152. max_ap_per_scan[%u] num_buckets[%u], report_threshold[%u]\n",
  10153. prCmdGscnParam->base_period, prCmdGscnParam->max_ap_per_scan,
  10154. prCmdGscnParam->num_buckets, prCmdGscnParam->report_threshold); */
  10155. #if 0
  10156. for (i = 0; i < prCmdGscnParam->num_buckets; i++) {
  10157. DBGLOG(OID, INFO,
  10158. "prCmdGscnParam->buckets : band[%u], bucket[%u] num_buckets[%u], period[%u] report_events[%u]\n",
  10159. prCmdGscnParam->buckets[i].band, prCmdGscnParam->buckets[i].bucket,
  10160. prCmdGscnParam->buckets[i].num_channels, prCmdGscnParam->buckets[i].period,
  10161. prCmdGscnParam->buckets[i].report_events);
  10162. DBGLOG(OID, INFO, "prCmdGscnParam->buckets[%d] has channel: ", i);
  10163. for (j = 0; j < prCmdGscnParam->buckets[i].num_channels; j++)
  10164. DBGLOG(OID, INFO, " %d, ", prCmdGscnParam->buckets[i].channels[j].channel);
  10165. DBGLOG(OID, INFO, "\n");
  10166. }
  10167. #endif
  10168. if (scnSetGSCNParam(prAdapter, prCmdGscnParam) == TRUE) {
  10169. DBGLOG(OID, INFO, "wlanoidSetGSCNAParam --->scnSetGSCNParam\n");
  10170. /*return WLAN_STATUS_PENDING; */
  10171. } else {
  10172. /*return WLAN_STATUS_FAILURE; */
  10173. }
  10174. return WLAN_STATUS_SUCCESS;
  10175. }
  10176. /*----------------------------------------------------------------------------*/
  10177. /*!
  10178. * \brief This routine is called to set configure gscan PARAMs
  10179. *
  10180. * \param[in] prAdapter Pointer to the Adapter structure.
  10181. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  10182. * \param[in] u4SetBufferLen The length of the set buffer.
  10183. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  10184. * bytes read from the set buffer. If the call failed
  10185. * due to invalid length of the set buffer, returns
  10186. * the amount of storage needed.
  10187. *
  10188. * \retval WLAN_STATUS_SUCCESS
  10189. * \retval WLAN_STATUS_ADAPTER_NOT_READY
  10190. * \retval WLAN_STATUS_INVALID_LENGTH
  10191. * \retval WLAN_STATUS_INVALID_DATA
  10192. *
  10193. * \note The setting buffer PARAM_SCHED_SCAN_REQUEST_EXT_T
  10194. */
  10195. /*----------------------------------------------------------------------------*/
  10196. WLAN_STATUS
  10197. wlanoidSetGSCNAConfig(IN P_ADAPTER_T prAdapter,
  10198. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  10199. {
  10200. P_PARAM_WIFI_GSCAN_CMD_PARAMS prCmdGscnScnConfigParam;
  10201. CMD_GSCN_SCN_COFIG_T rCmdGscnScnConfig;
  10202. DBGLOG(OID, INFO, "wlanoidSetGSCNAConfig v1\n");
  10203. if (prAdapter->rAcpiState == ACPI_STATE_D3) {
  10204. DBGLOG(OID, WARN,
  10205. "Fail in set Periodically Scan! (Adapter not ready). ACPI=D%d, Radio=%d\n",
  10206. prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
  10207. return WLAN_STATUS_ADAPTER_NOT_READY;
  10208. }
  10209. if (u4SetBufferLen != sizeof(PARAM_WIFI_GSCAN_CMD_PARAMS)) {
  10210. DBGLOG(OID, INFO, "(u4SetBufferLen != sizeof(CMD_GSCN_SCN_COFIG_T))\n");
  10211. return WLAN_STATUS_INVALID_LENGTH;
  10212. } else if (pvSetBuffer == NULL) {
  10213. DBGLOG(OID, INFO, "(pvSetBuffer == NULL)\n");
  10214. return WLAN_STATUS_INVALID_DATA;
  10215. }
  10216. if (prAdapter->fgIsRadioOff) {
  10217. DBGLOG(OID, WARN, "Return from BSSID list scan! (radio off). ACPI=D%d, Radio=%d\n",
  10218. prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
  10219. return WLAN_STATUS_SUCCESS;
  10220. }
  10221. DBGLOG(OID, INFO, "prCmdGscnScnConfigParam = (P_PARAM_WIFI_GSCAN_CMD_PARAMS)pvSetBuffer\n");
  10222. prCmdGscnScnConfigParam = (P_PARAM_WIFI_GSCAN_CMD_PARAMS) pvSetBuffer;
  10223. memcpy(prCmdGscnScnConfigParam, (P_PARAM_WIFI_GSCAN_CMD_PARAMS) pvSetBuffer,
  10224. sizeof(PARAM_WIFI_GSCAN_CMD_PARAMS));
  10225. DBGLOG(OID, INFO, "prCmdGscnScnConfigParam assign prCmdGscnScnConfig\n");
  10226. rCmdGscnScnConfig.u4BufferThreshold = prCmdGscnScnConfigParam->report_threshold;
  10227. rCmdGscnScnConfig.ucNumApPerScn = prCmdGscnScnConfigParam->max_ap_per_scan;
  10228. rCmdGscnScnConfig.u4NumScnToCache = prCmdGscnScnConfigParam->num_scans;
  10229. DBGLOG(OID, INFO, " report_threshold %d report_threshold %d num_scans %d\n",
  10230. rCmdGscnScnConfig.u4BufferThreshold, rCmdGscnScnConfig.ucNumApPerScn, rCmdGscnScnConfig.u4NumScnToCache);
  10231. if (scnFsmSetGSCNConfig(prAdapter, &rCmdGscnScnConfig) == TRUE) {
  10232. DBGLOG(OID, INFO, "wlanoidSetGSCNAParam --->scnSetGSCNParam\n");
  10233. /*return WLAN_STATUS_PENDING; */
  10234. } else {
  10235. /*return WLAN_STATUS_FAILURE; */
  10236. }
  10237. return WLAN_STATUS_SUCCESS;
  10238. }
  10239. /*----------------------------------------------------------------------------*/
  10240. /*!
  10241. * \brief This routine is called to get a gscan result
  10242. *
  10243. * \param[in] prAdapter Pointer to the Adapter structure.
  10244. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  10245. * \param[in] u4SetBufferLen The length of the set buffer.
  10246. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  10247. * bytes read from the set buffer. If the call failed
  10248. * due to invalid length of the set buffer, returns
  10249. * the amount of storage needed.
  10250. *
  10251. * \retval WLAN_STATUS_SUCCESS
  10252. * \retval WLAN_STATUS_ADAPTER_NOT_READY
  10253. * \retval WLAN_STATUS_INVALID_LENGTH
  10254. * \retval WLAN_STATUS_INVALID_DATA
  10255. *
  10256. * \note The setting buffer PARAM_SCHED_SCAN_REQUEST_EXT_T
  10257. */
  10258. /*----------------------------------------------------------------------------*/
  10259. WLAN_STATUS
  10260. wlanoidGetGSCNResult(IN P_ADAPTER_T prAdapter,
  10261. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  10262. {
  10263. P_PARAM_WIFI_GSCAN_GET_RESULT_PARAMS prGetGscnScnResultParm;
  10264. CMD_GET_GSCAN_RESULT_T rGetGscnScnResultCmd;
  10265. DEBUGFUNC("wlanoidGetGSCNResult()");
  10266. DBGLOG(INIT, INFO, "wlanoidGetGSCNResult v1\n");
  10267. if (prAdapter->rAcpiState == ACPI_STATE_D3) {
  10268. DBGLOG(OID, WARN,
  10269. "Fail in set Periodically Scan! (Adapter not ready). ACPI=D%d, Radio=%d\n",
  10270. prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
  10271. return WLAN_STATUS_ADAPTER_NOT_READY;
  10272. }
  10273. if (u4SetBufferLen != sizeof(PARAM_WIFI_GSCAN_GET_RESULT_PARAMS)) {
  10274. DBGLOG(OID, INFO, "(u4SetBufferLen != sizeof(CMD_GSCN_SCN_COFIG_T))\n");
  10275. return WLAN_STATUS_INVALID_LENGTH;
  10276. } else if (pvSetBuffer == NULL) {
  10277. DBGLOG(OID, INFO, "(pvSetBuffer == NULL)\n");
  10278. return WLAN_STATUS_INVALID_DATA;
  10279. }
  10280. if (prAdapter->fgIsRadioOff) {
  10281. DBGLOG(OID, WARN, "Return from BSSID list scan! (radio off). ACPI=D%d, Radio=%d\n",
  10282. prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
  10283. DBGLOG(OID, INFO, "Return from BSSID list scan! (radio off). ACPI=D%d, Radio=%d\n",
  10284. prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
  10285. return WLAN_STATUS_SUCCESS;
  10286. }
  10287. prGetGscnScnResultParm = (P_PARAM_WIFI_GSCAN_GET_RESULT_PARAMS) pvSetBuffer;
  10288. /*memcpy(&rGetGscnScnResultCmd, prGetGscnScnResultParm, sizeof(PARAM_WIFI_GSCAN_GET_RESULT_PARAMS) ); */
  10289. rGetGscnScnResultCmd.u4Num = prGetGscnScnResultParm->get_num;
  10290. rGetGscnScnResultCmd.ucFlush = prGetGscnScnResultParm->flush;
  10291. rGetGscnScnResultCmd.ucVersion = PSCAN_VERSION;
  10292. if (scnFsmGetGSCNResult(prAdapter, &rGetGscnScnResultCmd) == TRUE) {
  10293. DBGLOG(INIT, INFO, "wlanoidGetGSCNResult --->scnFsmGetGSCNResult\n");
  10294. /*return WLAN_STATUS_FAILURE; */
  10295. } else {
  10296. /*return WLAN_STATUS_FAILURE; */
  10297. }
  10298. return WLAN_STATUS_SUCCESS;
  10299. }
  10300. #endif