| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897789878997900790179027903790479057906790779087909791079117912791379147915791679177918791979207921792279237924792579267927792879297930793179327933793479357936793779387939794079417942794379447945794679477948794979507951795279537954795579567957795879597960796179627963796479657966796779687969797079717972797379747975797679777978797979807981798279837984798579867987798879897990799179927993799479957996799779987999800080018002800380048005800680078008800980108011801280138014801580168017801880198020802180228023802480258026802780288029803080318032803380348035803680378038803980408041804280438044804580468047804880498050805180528053805480558056805780588059806080618062806380648065806680678068806980708071807280738074807580768077807880798080808180828083808480858086808780888089809080918092809380948095809680978098809981008101810281038104810581068107810881098110811181128113811481158116811781188119812081218122812381248125812681278128812981308131813281338134813581368137813881398140814181428143814481458146814781488149815081518152815381548155815681578158815981608161816281638164816581668167816881698170817181728173817481758176817781788179818081818182818381848185818681878188818981908191819281938194819581968197819881998200820182028203820482058206820782088209821082118212821382148215821682178218821982208221822282238224822582268227822882298230823182328233823482358236823782388239824082418242824382448245824682478248824982508251825282538254825582568257825882598260826182628263826482658266826782688269827082718272827382748275827682778278827982808281828282838284828582868287828882898290829182928293829482958296829782988299830083018302830383048305830683078308830983108311831283138314831583168317831883198320832183228323832483258326832783288329833083318332833383348335833683378338833983408341834283438344834583468347834883498350835183528353835483558356835783588359836083618362836383648365836683678368836983708371837283738374837583768377837883798380838183828383838483858386838783888389839083918392839383948395839683978398839984008401840284038404840584068407840884098410841184128413841484158416841784188419842084218422842384248425842684278428842984308431843284338434843584368437843884398440844184428443844484458446844784488449845084518452845384548455845684578458845984608461846284638464846584668467846884698470847184728473847484758476847784788479848084818482848384848485848684878488848984908491849284938494849584968497849884998500850185028503850485058506850785088509851085118512851385148515851685178518851985208521852285238524852585268527852885298530853185328533853485358536853785388539854085418542854385448545854685478548854985508551855285538554855585568557855885598560856185628563856485658566856785688569857085718572857385748575857685778578857985808581858285838584858585868587858885898590859185928593859485958596859785988599860086018602860386048605860686078608860986108611861286138614861586168617861886198620862186228623862486258626862786288629863086318632863386348635863686378638863986408641864286438644864586468647864886498650865186528653865486558656865786588659866086618662866386648665866686678668866986708671867286738674867586768677867886798680868186828683868486858686868786888689869086918692869386948695869686978698869987008701870287038704870587068707870887098710871187128713871487158716871787188719872087218722872387248725872687278728872987308731873287338734873587368737873887398740874187428743874487458746874787488749875087518752875387548755875687578758875987608761876287638764876587668767876887698770877187728773877487758776877787788779878087818782878387848785878687878788878987908791879287938794879587968797879887998800880188028803880488058806880788088809881088118812881388148815881688178818881988208821882288238824882588268827882888298830883188328833883488358836883788388839884088418842884388448845884688478848884988508851885288538854885588568857885888598860886188628863886488658866886788688869887088718872887388748875887688778878887988808881888288838884888588868887888888898890889188928893889488958896889788988899890089018902890389048905890689078908890989108911891289138914891589168917891889198920892189228923892489258926892789288929893089318932893389348935893689378938893989408941894289438944894589468947894889498950895189528953895489558956895789588959896089618962896389648965896689678968896989708971897289738974897589768977897889798980898189828983898489858986898789888989899089918992899389948995899689978998899990009001900290039004900590069007900890099010901190129013901490159016901790189019902090219022902390249025902690279028902990309031903290339034903590369037903890399040904190429043904490459046904790489049905090519052905390549055905690579058905990609061906290639064906590669067906890699070907190729073907490759076907790789079908090819082908390849085908690879088908990909091909290939094909590969097909890999100910191029103910491059106910791089109911091119112911391149115911691179118911991209121912291239124912591269127912891299130913191329133913491359136913791389139914091419142914391449145914691479148914991509151915291539154915591569157915891599160916191629163916491659166916791689169917091719172917391749175917691779178917991809181918291839184918591869187918891899190919191929193919491959196919791989199920092019202920392049205920692079208920992109211921292139214921592169217921892199220922192229223922492259226922792289229923092319232923392349235923692379238923992409241924292439244924592469247924892499250925192529253925492559256925792589259926092619262926392649265926692679268926992709271927292739274927592769277927892799280928192829283928492859286928792889289929092919292929392949295929692979298929993009301930293039304930593069307930893099310931193129313931493159316931793189319932093219322932393249325932693279328932993309331933293339334933593369337933893399340934193429343934493459346934793489349935093519352935393549355935693579358935993609361936293639364936593669367936893699370937193729373937493759376937793789379938093819382938393849385938693879388938993909391939293939394939593969397939893999400940194029403940494059406940794089409941094119412941394149415941694179418941994209421942294239424942594269427942894299430943194329433943494359436943794389439944094419442944394449445944694479448944994509451945294539454945594569457945894599460946194629463946494659466946794689469947094719472947394749475947694779478947994809481948294839484948594869487948894899490949194929493949494959496949794989499950095019502950395049505950695079508950995109511951295139514951595169517951895199520952195229523952495259526952795289529953095319532953395349535953695379538953995409541954295439544954595469547954895499550955195529553955495559556955795589559956095619562956395649565956695679568956995709571957295739574957595769577957895799580958195829583958495859586958795889589959095919592959395949595959695979598959996009601960296039604960596069607960896099610961196129613961496159616961796189619962096219622962396249625962696279628962996309631963296339634963596369637963896399640964196429643964496459646964796489649965096519652965396549655965696579658965996609661966296639664966596669667966896699670967196729673967496759676967796789679968096819682968396849685968696879688968996909691969296939694969596969697969896999700970197029703970497059706970797089709971097119712971397149715971697179718971997209721972297239724972597269727972897299730973197329733973497359736973797389739974097419742974397449745974697479748974997509751975297539754975597569757975897599760976197629763976497659766976797689769977097719772977397749775977697779778977997809781978297839784978597869787978897899790979197929793979497959796979797989799980098019802980398049805980698079808980998109811981298139814981598169817981898199820982198229823982498259826982798289829983098319832983398349835983698379838983998409841984298439844984598469847984898499850985198529853985498559856985798589859986098619862986398649865986698679868986998709871987298739874987598769877987898799880988198829883988498859886988798889889989098919892989398949895989698979898989999009901990299039904990599069907990899099910991199129913991499159916991799189919992099219922992399249925992699279928992999309931993299339934993599369937993899399940994199429943994499459946994799489949995099519952995399549955995699579958995999609961996299639964996599669967996899699970997199729973997499759976997799789979998099819982998399849985998699879988998999909991999299939994999599969997999899991000010001100021000310004100051000610007100081000910010100111001210013100141001510016100171001810019100201002110022100231002410025100261002710028100291003010031100321003310034100351003610037100381003910040100411004210043100441004510046100471004810049100501005110052100531005410055100561005710058100591006010061100621006310064100651006610067100681006910070100711007210073100741007510076100771007810079100801008110082100831008410085100861008710088100891009010091100921009310094100951009610097100981009910100101011010210103101041010510106101071010810109101101011110112101131011410115101161011710118101191012010121101221012310124101251012610127101281012910130101311013210133101341013510136101371013810139101401014110142101431014410145101461014710148101491015010151101521015310154101551015610157101581015910160101611016210163101641016510166101671016810169101701017110172101731017410175101761017710178101791018010181101821018310184101851018610187101881018910190101911019210193101941019510196101971019810199102001020110202102031020410205102061020710208102091021010211102121021310214102151021610217102181021910220102211022210223102241022510226102271022810229102301023110232102331023410235102361023710238102391024010241102421024310244102451024610247102481024910250102511025210253102541025510256102571025810259102601026110262102631026410265102661026710268102691027010271102721027310274102751027610277102781027910280102811028210283102841028510286102871028810289102901029110292102931029410295102961029710298102991030010301103021030310304103051030610307103081030910310103111031210313103141031510316103171031810319103201032110322103231032410325103261032710328103291033010331103321033310334103351033610337103381033910340103411034210343103441034510346103471034810349103501035110352103531035410355103561035710358103591036010361103621036310364103651036610367103681036910370103711037210373103741037510376103771037810379103801038110382103831038410385103861038710388103891039010391103921039310394103951039610397103981039910400104011040210403104041040510406104071040810409104101041110412104131041410415104161041710418104191042010421104221042310424104251042610427104281042910430104311043210433104341043510436104371043810439104401044110442104431044410445104461044710448104491045010451104521045310454104551045610457104581045910460104611046210463104641046510466104671046810469104701047110472104731047410475104761047710478104791048010481104821048310484104851048610487104881048910490104911049210493104941049510496104971049810499105001050110502105031050410505105061050710508105091051010511105121051310514105151051610517105181051910520105211052210523105241052510526105271052810529105301053110532105331053410535105361053710538105391054010541105421054310544105451054610547105481054910550105511055210553105541055510556105571055810559105601056110562105631056410565105661056710568105691057010571105721057310574105751057610577105781057910580105811058210583105841058510586105871058810589105901059110592105931059410595105961059710598105991060010601106021060310604106051060610607106081060910610106111061210613106141061510616106171061810619106201062110622106231062410625106261062710628106291063010631106321063310634106351063610637106381063910640106411064210643106441064510646106471064810649106501065110652106531065410655106561065710658106591066010661106621066310664106651066610667106681066910670106711067210673106741067510676106771067810679106801068110682106831068410685106861068710688106891069010691106921069310694106951069610697106981069910700107011070210703107041070510706107071070810709107101071110712107131071410715107161071710718107191072010721107221072310724107251072610727107281072910730107311073210733107341073510736107371073810739107401074110742107431074410745107461074710748107491075010751107521075310754107551075610757107581075910760107611076210763107641076510766107671076810769107701077110772107731077410775107761077710778107791078010781107821078310784107851078610787107881078910790107911079210793107941079510796107971079810799108001080110802108031080410805108061080710808108091081010811108121081310814108151081610817108181081910820108211082210823108241082510826108271082810829108301083110832108331083410835108361083710838108391084010841108421084310844108451084610847108481084910850108511085210853108541085510856108571085810859108601086110862108631086410865108661086710868108691087010871108721087310874108751087610877108781087910880108811088210883108841088510886108871088810889108901089110892108931089410895108961089710898108991090010901109021090310904109051090610907109081090910910109111091210913109141091510916109171091810919109201092110922109231092410925109261092710928109291093010931109321093310934109351093610937109381093910940109411094210943109441094510946109471094810949109501095110952109531095410955109561095710958109591096010961109621096310964109651096610967109681096910970109711097210973109741097510976109771097810979109801098110982109831098410985109861098710988109891099010991109921099310994109951099610997109981099911000110011100211003110041100511006110071100811009110101101111012110131101411015110161101711018110191102011021110221102311024110251102611027110281102911030110311103211033110341103511036110371103811039110401104111042110431104411045110461104711048110491105011051110521105311054110551105611057110581105911060110611106211063110641106511066110671106811069110701107111072110731107411075110761107711078110791108011081110821108311084110851108611087110881108911090110911109211093110941109511096110971109811099111001110111102111031110411105111061110711108111091111011111111121111311114111151111611117111181111911120 |
- /*
- ** Id: //Department/DaVinci/BRANCHES/MT6620_WIFI_DRIVER_V2_3/common/wlan_oid.c#5
- */
- /*! \file wlanoid.c
- \brief This file contains the WLAN OID processing routines of Windows driver for
- MediaTek Inc. 802.11 Wireless LAN Adapters.
- */
- /*
- ** Log: wlan_oid.c
- **
- ** 09 05 2013 cp.wu
- ** isolate logic regarding roaming & reassociation
- **
- ** 09 03 2013 cp.wu
- ** add path for reassociation
- **
- ** 09 02 2013 cp.wu
- ** add path to handle reassociation request
- **
- ** 07 19 2012 yuche.tsai
- ** NULL
- ** Code update for JB.
- *
- * 07 17 2012 yuche.tsai
- * NULL
- * Let netdev bring up.
- *
- * 07 17 2012 yuche.tsai
- * NULL
- * Compile no error before trial run.
- *
- * 03 02 2012 terry.wu
- * NULL
- * Sync CFG80211 modification from branch 2,2.
- *
- * 01 06 2012 wh.su
- * [WCXRP00001153] [MT6620 Wi-Fi][Driver] Adding the get_ch_list and set_tx_power proto type function
- * using the wlanSendSetQueryCmd to set the tx power control cmd.
- *
- * 01 06 2012 wh.su
- * [WCXRP00001153] [MT6620 Wi-Fi][Driver] Adding the get_ch_list and set_tx_power proto type function
- * change the set tx power cmd name.
- *
- * 01 05 2012 wh.su
- * [WCXRP00001153] [MT6620 Wi-Fi][Driver] Adding the get_ch_list and set_tx_power proto type function
- * Adding the related ioctl / wlan oid function to set the Tx power cfg.
- *
- * 12 20 2011 cp.wu
- * [WCXRP00001144] [MT6620 Wi-Fi][Driver][Firmware] Add RF_FUNC_ID for exposing device and related version information
- * add driver implementations for RF_AT_FUNCID_FW_INFO & RF_AT_FUNCID_DRV_INFO
- * to expose version information
- *
- * 12 05 2011 cp.wu
- * [WCXRP00001131] [MT6620 Wi-Fi][Driver][AIS] Implement connect-by-BSSID path
- * add CONNECT_BY_BSSID policy
- *
- * 11 22 2011 cp.wu
- * [WCXRP00001120] [MT6620 Wi-Fi][Driver] Modify roaming to AIS state transition from synchronous to
- * asynchronous approach to avoid incomplete state termination
- * 1. change RDD related compile option brace position.
- * 2. when roaming is triggered, ask AIS to transit immediately only when AIS is in Normal TR state
- * without join timeout timer ticking
- * 3. otherwise, insert AIS_REQUEST into pending request queue
- *
- * 11 21 2011 cp.wu
- * [WCXRP00001118] [MT6620 Wi-Fi][Driver] Corner case protections to pass Monkey testing
- * 1. wlanoidQueryBssIdList might be passed with a non-zero length but a NULL pointer of buffer
- * add more checking for such cases
- *
- * 2. kalSendComplete() might be invoked with a packet belongs to P2P network right after P2P is unregistered.
- * add some tweaking to protect such cases because that net device has become invalid.
- *
- * 11 15 2011 cm.chang
- * NULL
- * Fix compiling warning
- *
- * 11 11 2011 wh.su
- * [WCXRP00001078] [MT6620 Wi-Fi][Driver] Adding the mediatek log improment support : XLOG
- * modify the xlog related code.
- *
- * 11 11 2011 tsaiyuan.hsu
- * [WCXRP00001083] [MT6620 Wi-Fi][DRV]] dump debug counter or frames when debugging is triggered
- * add debug counters of bb and ar for xlog.
- *
- * 11 10 2011 wh.su
- * [WCXRP00001078] [MT6620 Wi-Fi][Driver] Adding the mediatek log improment support : XLOG
- * change the debug module level.
- *
- * 11 09 2011 george.huang
- * [WCXRP00000871] [MT6620 Wi-Fi][FW] Include additional wakeup condition, which is by
- * consequent DTIM unicast indication add XLOG for Set PS mode entry
- *
- * 11 08 2011 tsaiyuan.hsu
- * [WCXRP00001083] [MT6620 Wi-Fi][DRV]] dump debug counter or frames when debugging is triggered
- * check if CFG_SUPPORT_SWCR is defined to aoid compiler error.
- *
- * 11 07 2011 tsaiyuan.hsu
- * [WCXRP00001083] [MT6620 Wi-Fi][DRV]] dump debug counter or frames when debugging is triggered
- * add debug counters and periodically dump counters for debugging.
- *
- * 11 03 2011 wh.su
- * [WCXRP00001078] [MT6620 Wi-Fi][Driver] Adding the mediatek log improment support : XLOG
- * change the DBGLOG for "\n" and "\r\n". LABEL to LOUD for XLOG
- *
- * 11 02 2011 chinghwa.yu
- * [WCXRP00000612] [MT6620 Wi-Fi] [FW] CSD update SWRDD algorithm
- * Add RDD certification features.
- *
- * 10 21 2011 eddie.chen
- * [WCXRP00001051] [MT6620 Wi-Fi][Driver/Fw] Adjust the STA aging timeout
- * Add switch to ignore the STA aging timeout.
- *
- * 10 12 2011 wh.su
- * [WCXRP00001036] [MT6620 Wi-Fi][Driver][FW] Adding the 802.11w code for MFP
- * adding the 802.11w related function and define .
- *
- * 09 15 2011 tsaiyuan.hsu
- * [WCXRP00000938] [MT6620 Wi-Fi][FW] add system config for CTIA
- * correct fifo full control from query to set operation for CTIA.
- *
- * 08 31 2011 cm.chang
- * [WCXRP00000969] [MT6620 Wi-Fi][Driver][FW] Channel list for 5G band based on country code
- * .
- *
- * 08 17 2011 tsaiyuan.hsu
- * [WCXRP00000938] [MT6620 Wi-Fi][FW] add system config for CTIA
- * add system config for CTIA.
- *
- * 08 15 2011 george.huang
- * [MT6620 Wi-Fi][FW] handle TSF drift for connection detection
- * .
- *
- * 07 28 2011 chinghwa.yu
- * [WCXRP00000063] Update BCM CoEx design and settings
- * Add BWCS cmd and event.
- *
- * 07 18 2011 chinghwa.yu
- * [WCXRP00000063] Update BCM CoEx design and settings[WCXRP00000612] [MT6620 Wi-Fi] [FW] CSD update SWRDD algorithm
- * Add CMD/Event for RDD and BWCS.
- *
- * 07 11 2011 wh.su
- * [WCXRP00000849] [MT6620 Wi-Fi][Driver] Remove some of the WAPI define for make sure the value is initialize,
- * for customer not enable WAPI
- * For make sure wapi initial value is set.
- *
- * 06 23 2011 cp.wu
- * [WCXRP00000812] [MT6620 Wi-Fi][Driver] not show NVRAM when there is no valid MAC address in NVRAM content
- * check with firmware for valid MAC address.
- *
- * 05 02 2011 eddie.chen
- * [WCXRP00000373] [MT6620 Wi-Fi][FW] SW debug control
- * Fix compile warning.
- *
- * 04 29 2011 george.huang
- * [WCXRP00000684] [MT6620 Wi-Fi][Driver] Support P2P setting ARP filter
- * .
- *
- * 04 27 2011 george.huang
- * [WCXRP00000684] [MT6620 Wi-Fi][Driver] Support P2P setting ARP filter
- * add more debug message
- *
- * 04 26 2011 eddie.chen
- * [WCXRP00000373] [MT6620 Wi-Fi][FW] SW debug control
- * Add rx path profiling.
- *
- * 04 12 2011 eddie.chen
- * [WCXRP00000617] [MT6620 Wi-Fi][DRV/FW] Fix for sigma
- * Fix the sta index in processing security frame
- * Simple flow control for TC4 to avoid mgt frames for PS STA to occupy the TC4
- * Add debug message.
- *
- * 04 08 2011 george.huang
- * [WCXRP00000621] [MT6620 Wi-Fi][Driver] Support P2P supplicant to set power mode
- * separate settings of P2P and AIS
- *
- * 03 31 2011 puff.wen
- * NULL
- * .
- *
- * 03 29 2011 puff.wen
- * NULL
- * Add chennel switch for stress test
- *
- * 03 29 2011 cp.wu
- * [WCXRP00000604] [MT6620 Wi-Fi][Driver] Surpress Klockwork Warning
- * surpress klock warning with code path rewritten
- *
- * 03 24 2011 wh.su
- * [WCXRP00000595] [MT6620 Wi-Fi][Driver] at CTIA indicate disconnect to make the ps profile can apply
- * use disconnect event instead of ais abort for CTIA testing.
- *
- * 03 23 2011 george.huang
- * [WCXRP00000586] [MT6620 Wi-Fi][FW] Modify for blocking absence request right after connected
- * revise for CTIA power mode setting
- *
- * 03 22 2011 george.huang
- * [WCXRP00000504] [MT6620 Wi-Fi][FW] Support Sigma CAPI for power saving related command
- * link with supplicant commands
- *
- * 03 17 2011 chinglan.wang
- * [WCXRP00000570] [MT6620 Wi-Fi][Driver] Add Wi-Fi Protected Setup v2.0 feature
- * .
- *
- * 03 17 2011 yarco.yang
- * [WCXRP00000569] [MT6620 Wi-Fi][F/W][Driver] Set multicast address support current network usage
- * .
- *
- * 03 15 2011 george.huang
- * [WCXRP00000557] [MT6620 Wi-Fi] Support current consumption test mode commands
- * Support current consumption measurement mode command
- *
- * 03 15 2011 eddie.chen
- * [WCXRP00000554] [MT6620 Wi-Fi][DRV] Add sw control debug counter
- * Add sw debug counter for QM.
- *
- * 03 10 2011 cp.wu
- * [WCXRP00000532] [MT6620 Wi-Fi][Driver] Migrate NVRAM configuration procedures from MT6620 E2 to MT6620 E3
- * deprecate configuration used by MT6620 E2
- *
- * 03 07 2011 terry.wu
- * [WCXRP00000521] [MT6620 Wi-Fi][Driver] Remove non-standard debug message
- * Toggle non-standard debug messages to comments.
- *
- * 03 04 2011 cp.wu
- * [WCXRP00000515] [MT6620 Wi-Fi][Driver] Surpress compiler warning which is identified by GNU compiler collection
- * surpress compile warning occurred when compiled by GNU compiler collection.
- *
- * 03 03 2011 wh.su
- * [WCXRP00000510] [MT6620 Wi-Fi] [Driver] Fixed the CTIA enter test mode issue
- * fixed the enter ctia test mode issue.
- *
- * 03 02 2011 george.huang
- * [WCXRP00000504] [MT6620 Wi-Fi][FW] Support Sigma CAPI for power saving related command
- * Update sigma CAPI for U-APSD setting
- *
- * 03 02 2011 george.huang
- * [WCXRP00000504] [MT6620 Wi-Fi][FW] Support Sigma CAPI for power saving related command
- * Support UAPSD/OppPS/NoA parameter setting
- *
- * 03 02 2011 cp.wu
- * [WCXRP00000503] [MT6620 Wi-Fi][Driver] Take RCPI brought by association response as
- * initial RSSI right after connection is built.
- * use RCPI brought by ASSOC-RESP after connection is built as initial RCPI to avoid using a uninitialized MAC-RX RCPI.
- *
- * 01 27 2011 george.huang
- * [WCXRP00000400] [MT6620 Wi-Fi] support CTIA power mode setting
- * Support CTIA power mode setting.
- *
- * 01 26 2011 wh.su
- * [WCXRP00000396] [MT6620 Wi-Fi][Driver] Support Sw Ctrl ioctl at linux
- * adding the SW cmd ioctl support, use set/get structure ioctl.
- *
- * 01 25 2011 cp.wu
- * [WCXRP00000394] [MT6620 Wi-Fi][Driver] Count space needed for generating error message in
- * scanning list into buffer size checking
- * when doing size prechecking, check illegal MAC address as well
- *
- * 01 20 2011 eddie.chen
- * [WCXRP00000374] [MT6620 Wi-Fi][DRV] SW debug control
- * Add Oid for sw control debug command
- *
- * 01 15 2011 puff.wen
- * NULL
- * Add Stress test
- *
- * 01 12 2011 cp.wu
- * [WCXRP00000358] [MT6620 Wi-Fi][Driver] Provide concurrent information for each module
- * check if allow to switch to IBSS mode via concurrent module before setting to IBSS mode
- *
- * 01 12 2011 cm.chang
- * [WCXRP00000354] [MT6620 Wi-Fi][Driver][FW] Follow NVRAM bandwidth setting
- * User-defined bandwidth is for 2.4G and 5G individually
- *
- * 01 04 2011 cp.wu
- * [WCXRP00000342] [MT6620 Wi-Fi][Driver] show error code in scanning list when MAC address is not
- * correctly configured in NVRAM
- * show error code 0x10 when MAC address in NVRAM is not configured correctly.
- *
- * 01 04 2011 cp.wu
- * [WCXRP00000338] [MT6620 Wi-Fi][Driver] Separate kalMemAlloc into kmalloc and vmalloc implementations
- * to ease physically continuous memory demands
- * separate kalMemAlloc() into virtually-continuous and physically-continuous type to ease slab system pressure
- *
- * 12 28 2010 george.huang
- * [WCXRP00000232] [MT5931 Wi-Fi][FW] Modifications for updated HW power on sequence and related design
- * support WMM-PS U-APSD AC assignment.
- *
- * 12 28 2010 cp.wu
- * [WCXRP00000269] [MT6620 Wi-Fi][Driver][Firmware] Prepare for v1.1 branch release
- * report EEPROM used flag via NIC_CAPABILITY
- *
- * 12 28 2010 cp.wu
- * [WCXRP00000269] [MT6620 Wi-Fi][Driver][Firmware] Prepare for v1.1 branch release
- * integrate with 'EEPROM used' flag for reporting correct capability to Engineer Mode/META and other tools
- *
- * 12 16 2010 cp.wu
- * [WCXRP00000268] [MT6620 Wi-Fi][Driver] correction for WHQL failed items
- * correction for OID_802_11_NETWORK_TYPES_SUPPORTED handlers
- *
- * 12 13 2010 cp.wu
- * [WCXRP00000256] [MT6620 Wi-Fi][Driver] Eliminate potential issues which is identified by Klockwork
- * suppress warning reported by Klockwork.
- *
- * 12 07 2010 cm.chang
- * [WCXRP00000239] MT6620 Wi-Fi][Driver][FW] Merge concurrent branch back to maintrunk
- * 1. BSSINFO include RLM parameter
- * 2. free all sta records when network is disconnected
- *
- * 12 07 2010 cm.chang
- * [WCXRP00000238] MT6620 Wi-Fi][Driver][FW] Support regulation domain setting from NVRAM and supplicant
- * 1. Country code is from NVRAM or supplicant
- * 2. Change band definition in CMD/EVENT.
- *
- * 11 30 2010 cp.wu
- * [WCXRP00000213] [MT6620 Wi-Fi][Driver] Implement scanning with specified SSID for wpa_supplicant with ap_scan=1
- * .
- *
- * 11 26 2010 cp.wu
- * [WCXRP00000209] [MT6620 Wi-Fi][Driver] Modify NVRAM checking mechanism to warning only
- * with necessary data field checking
- * 1. NVRAM error is now treated as warning only, thus normal operation is still available
- * but extra scan result used to indicate user is attached
- * 2. DPD and TX-PWR are needed fields from now on, if these 2 fields are not available then warning message is shown
- *
- * 11 25 2010 cp.wu
- * [WCXRP00000208] [MT6620 Wi-Fi][Driver] Add scanning with specified SSID to AIS FSM
- * add scanning with specified SSID facility to AIS-FSM
- *
- * 11 21 2010 wh.su
- * [WCXRP00000192] [MT6620 Wi-Fi][Driver] Fixed fail trying to build connection with Security
- * AP while enable WAPI message check
- * Not set the wapi mode while the wapi assoc info set non-wapi ie.
- *
- * 11 05 2010 wh.su
- * [WCXRP00000165] [MT6620 Wi-Fi] [Pre-authentication] Assoc req rsn ie use wrong pmkid value
- * fixed the.pmkid value mismatch issue
- *
- * 11 01 2010 cp.wu
- * [WCXRP00000056] [MT6620 Wi-Fi][Driver] NVRAM implementation with Version
- * Check[WCXRP00000150] [MT6620 Wi-Fi][Driver] Add implementation for querying
- * current TX rate from firmware auto rate module
- * 1) Query link speed (TX rate) from firmware directly with buffering mechanism to reduce overhead
- * 2) Remove CNM CH-RECOVER event handling
- * 3) cfg read/write API renamed with kal prefix for unified naming rules.
- *
- * 10 26 2010 cp.wu
- * [WCXRP00000056] [MT6620 Wi-Fi][Driver] NVRAM implementation with Version
- * Check[WCXRP00000137] [MT6620 Wi-Fi] [FW] Support NIC capability query command
- * 1) update NVRAM content template to ver 1.02
- * 2) add compile option for querying NIC capability (default: off)
- * 3) modify AIS 5GHz support to run-time option, which could be turned on by registry or NVRAM setting
- * 4) correct auto-rate compiler error under linux (treat warning as error)
- * 5) simplify usage of NVRAM and REG_INFO_T
- * 6) add version checking between driver and firmware
- *
- * 10 22 2010 cp.wu
- * [WCXRP00000122] [MT6620 Wi-Fi][Driver] Preparation for YuSu source tree integration
- * dos2unix conversion.
- *
- * 10 20 2010 cp.wu
- * [WCXRP00000117] [MT6620 Wi-Fi][Driver] Add logic for suspending driver when MT6620 is not responding anymore
- * use OID_CUSTOM_TEST_MODE as indication for driver reset
- * by dropping pending TX packets
- *
- * 10 18 2010 cp.wu
- * [WCXRP00000056] [MT6620 Wi-Fi][Driver] NVRAM implementation with Version
- * Check[WCXRP00000086] [MT6620 Wi-Fi][Driver] The mac address is all zero at android complete
- * implementation of Android NVRAM access
- *
- * 10 06 2010 yuche.tsai
- * NULL
- * Update SLT 5G Test Channel Set.
- *
- * 10 06 2010 cp.wu
- * [WCXRP00000052] [MT6620 Wi-Fi][Driver] Eliminate Linux Compile Warning
- * code reorganization to improve isolation between GLUE and CORE layers.
- *
- * 10 06 2010 yuche.tsai
- * NULL
- * Update For SLT 5G Test Channel Selection Rule.
- *
- * 10 05 2010 cp.wu
- * [WCXRP00000075] [MT6620 Wi-Fi][Driver] Fill query buffer for OID_802_11_BSSID_LIST in 4-bytes aligned form
- * Query buffer size needs to be enlarged due to result is filled in 4-bytes alignment boundary
- *
- * 10 05 2010 cp.wu
- * [WCXRP00000056] [MT6620 Wi-Fi][Driver] NVRAM implementation with Version Check
- * 1) add NVRAM access API
- * 2) fake scanning result when NVRAM doesn't exist and/or version mismatch. (off by compiler option)
- * 3) add OID implementation for NVRAM read/write service
- *
- * 10 04 2010 cp.wu
- * [WCXRP00000077] [MT6620 Wi-Fi][Driver][FW] Eliminate use of ENUM_NETWORK_TYPE_T and
- * replaced by ENUM_NETWORK_TYPE_INDEX_T only remove ENUM_NETWORK_TYPE_T definitions
- *
- * 10 04 2010 cp.wu
- * [WCXRP00000075] [MT6620 Wi-Fi][Driver] Fill query buffer for OID_802_11_BSSID_LIST in 4-bytes aligned form
- * Extend result length to multiples of 4-bytes
- *
- * 09 24 2010 cp.wu
- * [WCXRP00000052] [MT6620 Wi-Fi][Driver] Eliminate Linux Compile Warning
- * eliminate unused variables which lead gcc to argue
- *
- * 09 24 2010 cp.wu
- * [WCXRP00000057] [MT6620 Wi-Fi][Driver] Modify online scan to a run-time switchable feature
- * Modify online scan as a run-time adjustable option (for Windows, in registry)
- *
- * 09 23 2010 cp.wu
- * [WCXRP00000051] [MT6620 Wi-Fi][Driver] WHQL test fail in MAC address changed item
- * use firmware reported mac address right after wlanAdapterStart() as permanent address
- *
- * 09 23 2010 cp.wu
- * [WCXRP00000056] [MT6620 Wi-Fi][Driver] NVRAM implementation with Version Check
- * add skeleton for NVRAM integration
- *
- * 09 08 2010 cp.wu
- * NULL
- * use static memory pool for storing IEs of scanning result.
- *
- * 09 07 2010 yuche.tsai
- * NULL
- * Update SLT due to API change of SCAN module.
- *
- * 09 06 2010 cp.wu
- * NULL
- * Androi/Linux: return current operating channel information
- *
- * 09 06 2010 cp.wu
- * NULL
- * 1) initialize for correct parameter even for disassociation.
- * 2) AIS-FSM should have a limit on trials to build connection
- *
- * 09 03 2010 yuche.tsai
- * NULL
- * Refine SLT IO control handler.
- *
- * 09 03 2010 kevin.huang
- * NULL
- * Refine #include sequence and solve recursive/nested #include issue
- *
- * 09 01 2010 wh.su
- * NULL
- * adding the wapi support for integration test.
- *
- * 08 30 2010 chinglan.wang
- * NULL
- * Modify the rescan condition.
- *
- * 08 29 2010 yuche.tsai
- * NULL
- * Finish SLT TX/RX & Rate Changing Support.
- *
- * 08 27 2010 chinglan.wang
- * NULL
- * Update configuration for MT6620_E1_PRE_ALPHA_1832_0827_2010
- *
- * 08 25 2010 george.huang
- * NULL
- * update OID/ registry control path for PM related settings
- *
- * 08 24 2010 cp.wu
- * NULL
- * 1) initialize variable for enabling short premable/short time slot.
- * 2) add compile option for disabling online scan
- *
- * 08 16 2010 george.huang
- * NULL
- * .
- *
- * 08 16 2010 george.huang
- * NULL
- * update params defined in CMD_SET_NETWORK_ADDRESS_LIST
- *
- * 08 04 2010 cp.wu
- * NULL
- * fix for check build WHQL testing:
- * 1) do not assert query buffer if indicated buffer length is zero
- * 2) sdio.c has bugs which cause freeing same pointer twice
- *
- * 08 04 2010 cp.wu
- * NULL
- * revert changelist #15371, efuse read/write access will be done by RF test approach
- *
- * 08 04 2010 cp.wu
- * NULL
- * add OID definitions for EFUSE read/write access.
- *
- * 08 04 2010 george.huang
- * NULL
- * handle change PS mode OID/ CMD
- *
- * 08 04 2010 cp.wu
- * NULL
- * add an extra parameter to rftestQueryATInfo 'cause it's necessary to pass u4FuncData for query request.
- *
- * 08 04 2010 cp.wu
- * NULL
- * bypass u4FuncData for RF-Test query request as well.
- *
- * 08 04 2010 yarco.yang
- * NULL
- * Add TX_AMPDU and ADDBA_REJECT command
- *
- * 08 03 2010 cp.wu
- * NULL
- * surpress compilation warning.
- *
- * 08 02 2010 george.huang
- * NULL
- * add WMM-PS test related OID/ CMD handlers
- *
- * 07 29 2010 cp.wu
- * NULL
- * eliminate u4FreqInKHz usage, combined into rConnections.ucAdHoc*
- *
- * 07 28 2010 cp.wu
- * NULL
- * 1) eliminate redundant variable eOPMode in prAdapter->rWlanInfo
- * 2) change nicMediaStateChange() API prototype
- *
- * 07 26 2010 cp.wu
- *
- * re-commit code logic being overwriten.
- *
- * 07 24 2010 wh.su
- *
- * .support the Wi-Fi RSN
- *
- * 07 21 2010 cp.wu
- *
- * 1) change BG_SCAN to ONLINE_SCAN for consistent term
- * 2) only clear scanning result when scan is permitted to do
- *
- * 07 20 2010 cp.wu
- *
- * 1) [AIS] when new scan is issued, clear currently available scanning result except the connected one
- * 2) refine disconnection behaviour when issued during BG-SCAN process
- *
- * 07 19 2010 wh.su
- *
- * modify the auth and encry status variable.
- *
- * 07 16 2010 cp.wu
- *
- * remove work-around in case SCN is not available.
- *
- * 07 08 2010 cp.wu
- *
- * [WPD00003833] [MT6620 and MT5931] Driver migration - move to new repository.
- *
- * 07 05 2010 cp.wu
- * [WPD00003833][MT6620 and MT5931] Driver migration
- * 1) change fake BSS_DESC from channel 6 to channel 1 due to channel switching is not done yet.
- * 2) after MAC address is queried from firmware, all related variables in driver domain should be updated as well
- *
- * 07 01 2010 cp.wu
- * [WPD00003833][MT6620 and MT5931] Driver migration
- * AIS-FSM integration with CNM channel request messages
- *
- * 07 01 2010 cp.wu
- * [WPD00003833][MT6620 and MT5931] Driver migration
- * implementation of DRV-SCN and related mailbox message handling.
- *
- * 06 29 2010 cp.wu
- * [WPD00003833][MT6620 and MT5931] Driver migration
- * 1) sync to. CMD/EVENT document v0.03
- * 2) simplify DTIM period parsing in scan.c only, bss.c no longer parses it again.
- * 3) send command packet to indicate FW-PM after
- * a) 1st beacon is received after AIS has connected to an AP
- * b) IBSS-ALONE has been created
- * c) IBSS-MERGE has occurred
- *
- * 06 25 2010 cp.wu
- * [WPD00003833][MT6620 and MT5931] Driver migration
- * add API in que_mgt to retrieve sta-rec index for security frames.
- *
- * 06 24 2010 cp.wu
- * [WPD00003833][MT6620 and MT5931] Driver migration
- * 802.1x and bluetooth-over-Wi-Fi security frames are now delievered to firmware via command path instead of data path.
- *
- * 06 23 2010 cp.wu
- * [WPD00003833][MT6620 and MT5931] Driver migration
- * 1) add SCN compilation option.
- * 2) when SCN is not turned on, BSSID_SCAN will generate a fake entry for 1st connection
- *
- * 06 23 2010 cp.wu
- * [WPD00003833][MT6620 and MT5931] Driver migration
- * implement SCAN-REQUEST oid as mailbox message dispatching.
- *
- * 06 23 2010 cp.wu
- * [WPD00003833][MT6620 and MT5931] Driver migration
- * integrate .
- *
- * 06 22 2010 cp.wu
- * [WPD00003833][MT6620 and MT5931] Driver migration
- * 1) add command warpper for STA-REC/BSS-INFO sync.
- * 2) enhance command packet sending procedure for non-oid part
- * 3) add command packet definitions for STA-REC/BSS-INFO sync.
- *
- * 06 21 2010 wh.su
- * [WPD00003840][MT6620 5931] Security migration
- * remove duplicate variable for migration.
- *
- * 06 21 2010 wh.su
- * [WPD00003840][MT6620 5931] Security migration
- * adding the compiling flag for oid pmkid.
- *
- * 06 21 2010 cp.wu
- * [WPD00003833][MT6620 and MT5931] Driver migration
- * enable RX management frame handling.
- *
- * 06 18 2010 wh.su
- * [WPD00003840][MT6620 5931] Security migration
- * migration the security related function from firmware.
- *
- * 06 11 2010 cp.wu
- * [WPD00003833][MT6620 and MT5931] Driver migration
- * 1) migrate assoc.c.
- * 2) add ucTxSeqNum for tracking frames which needs TX-DONE awareness
- * 3) add configuration options for CNM_MEM and RSN modules
- * 4) add data path for management frames
- * 5) eliminate rPacketInfo of MSDU_INFO_T
- *
- * 06 10 2010 cp.wu
- * [WPD00003833][MT6620 and MT5931] Driver migration
- * 1) eliminate CFG_CMD_EVENT_VERSION_0_9
- * 2) when disconnected, indicate nic directly (no event is needed)
- *
- * 06 07 2010 cp.wu
- * [WPD00003833][MT6620 and MT5931] Driver migration
- * merge wlan_def.h.
- *
- * 06 07 2010 cp.wu
- * [WPD00003833][MT6620 and MT5931] Driver migration
- * merge wifi_var.h, precomp.h, cnm_timer.h (data type only)
- *
- * 06 06 2010 kevin.huang
- * [WPD00003832][MT6620 5931] Create driver base
- * [MT6620 5931] Create driver base
- *
- * 06 03 2010 cp.wu
- * [WPD00001943]Create WiFi test driver framework on WinXP
- * move timer callback to glue layer.
- *
- * 05 28 2010 cp.wu
- * [WPD00001943]Create WiFi test driver framework on WinXP
- * simplify cmd packet sending for RF test and MCR access OIDs
- *
- * 05 27 2010 cp.wu
- * [WPD00001943]Create WiFi test driver framework on WinXP
- * disable radio even when STA is not associated.
- *
- * 05 27 2010 cp.wu
- * [WPD00001943]Create WiFi test driver framework on WinXP
- * correct 2 OID behaviour to meet WHQL requirement.
- *
- * 05 26 2010 jeffrey.chang
- * [WPD00003826]Initial import for Linux port
- * 1) Modify set mac address code
- * 2) remove power management macro
- *
- * 05 25 2010 cp.wu
- * [WPD00001943]Create WiFi test driver framework on WinXP
- * correct BSSID_LIST oid when radio if turned off.
- *
- * 05 24 2010 cp.wu
- * [WPD00001943]Create WiFi test driver framework on WinXP
- * 1) when acquiring LP-own, write for clr-own with lower frequency compared to read poll
- * 2) correct address list parsing
- *
- * 05 24 2010 cp.wu
- * [WPD00001943]Create WiFi test driver framework on WinXP
- * disable wlanoidSetNetworkAddress() temporally.
- *
- * 05 22 2010 cp.wu
- * [WPD00001943]Create WiFi test driver framework on WinXP
- * some OIDs should be DRIVER_CORE instead of GLUE_EXTENSION
- *
- * 05 22 2010 cp.wu
- * [WPD00001943]Create WiFi test driver framework on WinXP
- * 1) disable NETWORK_LAYER_ADDRESSES handling temporally.
- * 2) finish statistics OIDs
- *
- * 05 22 2010 cp.wu
- * [WPD00001943]Create WiFi test driver framework on WinXP
- * change OID behavior to meet WHQL requirement.
- *
- * 05 20 2010 cp.wu
- * [WPD00001943]Create WiFi test driver framework on WinXP
- * 1) integrate OID_GEN_NETWORK_LAYER_ADDRESSES with CMD_ID_SET_IP_ADDRESS
- * 2) buffer statistics data for 2 seconds
- * 3) use default value for adhoc parameters instead of 0
- *
- * 05 19 2010 cp.wu
- * [WPD00001943]Create WiFi test driver framework on WinXP
- * 1) do not take timeout mechanism for power mode oids
- * 2) retrieve network type from connection status
- * 3) after disassciation, set radio state to off
- * 4) TCP option over IPv6 is supported
- *
- * 05 18 2010 cp.wu
- * [WPD00001943]Create WiFi test driver framework on WinXP
- * implement Wakeup-on-LAN except firmware integration part
- *
- * 05 17 2010 cp.wu
- * [WPD00001943]Create WiFi test driver framework on WinXP
- * correct wlanoidSet802dot11PowerSaveProfile implementation.
- *
- * 05 17 2010 cp.wu
- * [WPD00001943]Create WiFi test driver framework on WinXP
- * 1) enable CMD/EVENT ver 0.9 definition.
- * 2) abandon use of ENUM_MEDIA_STATE
- *
- * 05 17 2010 cp.wu
- * [WPD00001943]Create WiFi test driver framework on WinXP
- * correct OID_802_11_DISASSOCIATE handling.
- *
- * 05 17 2010 cp.wu
- * [WPD00003831][MT6620 Wi-Fi] Add framework for Wi-Fi Direct support
- * 1) add timeout handler mechanism for pending command packets
- * 2) add p2p add/removal key
- *
- * 05 14 2010 jeffrey.chang
- * [WPD00003826]Initial import for Linux port
- * Add dissassocation support for wpa supplicant
- *
- * 05 14 2010 cp.wu
- * [WPD00001943]Create WiFi test driver framework on WinXP
- * correct return value.
- *
- * 05 13 2010 cp.wu
- * [WPD00001943]Create WiFi test driver framework on WinXP
- * add NULL OID implementation for WOL-related OIDs.
- *
- * 05 06 2010 cp.wu
- * [WPD00001943]Create WiFi test driver framework on WinXP
- * for disassociation, still use parameter with current setting.
- *
- * 05 06 2010 cp.wu
- * [WPD00001943]Create WiFi test driver framework on WinXP
- * for disassociation, generate a WZC-compatible invalid SSID.
- *
- * 05 06 2010 cp.wu
- * [WPD00001943]Create WiFi test driver framework on WinXP
- * associate to illegal SSID when handling OID_802_11_DISASSOCIATE
- *
- * 04 27 2010 cp.wu
- * [WPD00001943]Create WiFi test driver framework on WinXP
- * reserve field of privacy filter and RTS threshold setting.
- *
- * 04 23 2010 cp.wu
- * [WPD00001943]Create WiFi test driver framework on WinXP
- * surpress compiler warning
- *
- * 04 23 2010 cp.wu
- * [WPD00001943]Create WiFi test driver framework on WinXP
- * .
- *
- * 04 22 2010 cp.wu
- * [WPD00003830]add OID_802_11_PRIVACY_FILTER support
- * enable RX filter OID
- *
- * 04 19 2010 jeffrey.chang
- * [WPD00003826]Initial import for Linux port
- * Add ioctl of power management
- *
- * 04 14 2010 cp.wu
- * [WPD00001943]Create WiFi test driver framework on WinXP
- * information buffer for query oid/ioctl is now buffered in prCmdInfo
- * * instead of glue-layer variable to improve multiple oid/ioctl capability
- *
- * 04 13 2010 cp.wu
- * [WPD00003823][MT6620 Wi-Fi] Add Bluetooth-over-Wi-Fi support
- * add framework for BT-over-Wi-Fi support.
- * * * * 1) prPendingCmdInfo is replaced by queue for multiple handler capability
- * * * * 2) command sequence number is now increased atomically
- * * * * 3) private data could be hold and taken use for other purpose
- *
- * 04 12 2010 cp.wu
- * [WPD00001943]Create WiFi test driver framework on WinXP
- * correct OID_802_11_CONFIGURATION query for infrastructure mode.
- *
- * 04 09 2010 jeffrey.chang
- * [WPD00003826]Initial import for Linux port
- * 1) remove unused spin lock declaration
- *
- * 04 07 2010 cp.wu
- * [WPD00001943]Create WiFi test driver framework on WinXP
- * finish non-glue layer access to glue variables
- *
- * 04 07 2010 cp.wu
- * [WPD00001943]Create WiFi test driver framework on WinXP
- * rWlanInfo should be placed at adapter rather than glue due to most operations
- * * are done in adapter layer.
- *
- * 04 07 2010 jeffrey.chang
- * [WPD00003826]Initial import for Linux port
- * (1)improve none-glue code portability
- * (2) disable set Multicast address during atomic context
- *
- * 04 07 2010 cp.wu
- * [WPD00001943]Create WiFi test driver framework on WinXP
- * eliminate direct access to prGlueInfo->eParamMediaStateIndicated from non-glue layer
- *
- * 04 06 2010 cp.wu
- * [WPD00001943]Create WiFi test driver framework on WinXP
- * ePowerCtrl is not necessary as a glue variable.
- *
- * 04 06 2010 cp.wu
- * [WPD00001943]Create WiFi test driver framework on WinXP
- * eliminate direct access to prGlueInfo->rWlanInfo.eLinkAttr.ucMediaStreamMode from non-glue layer.
- *
- * 04 06 2010 jeffrey.chang
- * [WPD00003826]Initial import for Linux port
- * improve none-glue code portability
- *
- * 04 06 2010 cp.wu
- * [WPD00001943]Create WiFi test driver framework on WinXP
- * code refine: fgTestMode should be at adapter rather than glue due to the device/fw is also involved
- *
- * 04 01 2010 cp.wu
- * [WPD00001943]Create WiFi test driver framework on WinXP
- * .
- *
- * 03 31 2010 wh.su
- * [WPD00003816][MT6620 Wi-Fi] Adding the security support
- * modify the wapi related code for new driver's design.
- *
- * 03 30 2010 cp.wu
- * [WPD00001943]Create WiFi test driver framework on WinXP
- * statistics information OIDs are now handled by querying from firmware domain
- *
- * 03 28 2010 jeffrey.chang
- * [WPD00003826]Initial import for Linux port
- * improve glue code portability
- *
- * 03 26 2010 cp.wu
- * [WPD00001943]Create WiFi test driver framework on WinXP
- * indicate media stream mode after set is done
- *
- * 03 26 2010 cp.wu
- * [WPD00001943]Create WiFi test driver framework on WinXP
- * add a temporary flag for integration with CMD/EVENT v0.9.
- *
- * 03 25 2010 cp.wu
- * [WPD00001943]Create WiFi test driver framework on WinXP
- * 1) correct OID_802_11_CONFIGURATION with frequency setting behavior.
- * the frequency is used for adhoc connection only
- * 2) update with SD1 v0.9 CMD/EVENT documentation
- *
- * 03 24 2010 jeffrey.chang
- * [WPD00003826]Initial import for Linux port
- * [WPD00003826] Initial import for Linux port
- * initial import for Linux port
- *
- * 03 24 2010 jeffrey.chang
- * [WPD00003826]Initial import for Linux port
- * initial import for Linux port
- *
- * 03 24 2010 cp.wu
- * [WPD00001943]Create WiFi test driver framework on WinXP
- * generate information for OID_GEN_RCV_OK & OID_GEN_XMIT_OK
- *
- *
- * 03 22 2010 cp.wu
- * [WPD00003824][MT6620 Wi-Fi][New Feature] Add support of large scan list
- * Implement feature needed by CR: WPD00003824: refining association command by pasting scanning result
- *
- * 03 19 2010 wh.su
- * [WPD00003820][MT6620 Wi-Fi] Modify the code for meet the WHQL test
- * adding the check for pass WHQL test item.
- *
- * 03 19 2010 cp.wu
- * [WPD00001943]Create WiFi test driver framework on WinXP
- * 1) add ACPI D0/D3 state switching support
- * * 2) use more formal way to handle interrupt when the status is retrieved from enhanced RX response
- *
- * 03 16 2010 wh.su
- * [WPD00003820][MT6620 Wi-Fi] Modify the code for meet the WHQL test
- * fixed some whql pre-test fail case.
- *
- * 03 03 2010 cp.wu
- * [WPD00001943]Create WiFi test driver framework on WinXP
- * implement custom OID: EEPROM read/write access
- *
- * 03 03 2010 cp.wu
- * [WPD00001943]Create WiFi test driver framework on WinXP
- * implement OID_802_3_MULTICAST_LIST oid handling
- *
- * 03 02 2010 cp.wu
- * [WPD00001943]Create WiFi test driver framework on WinXP
- * 1) the use of prPendingOid revised, all accessing are now protected by spin lock
- * * 2) ensure wlanReleasePendingOid will clear all command queues
- *
- * 02 25 2010 cp.wu
- * [WPD00001943]Create WiFi test driver framework on WinXP
- * send CMD_ID_INFRASTRUCTURE when handling OID_802_11_INFRASTRUCTURE_MODE set.
- *
- * 02 24 2010 wh.su
- * [WPD00003820][MT6620 Wi-Fi] Modify the code for meet the WHQL test
- * Don't needed to check the auth mode, WHQL testing not specific at auth wpa2.
- *
- * 02 23 2010 cp.wu
- * [WPD00001943]Create WiFi test driver framework on WinXP
- * do not check SSID validity anymore.
- *
- * 02 23 2010 cp.wu
- * [WPD00001943]Create WiFi test driver framework on WinXP
- * add checksum offloading support.
- *
- * 02 09 2010 cp.wu
- * [WPD00001943]Create WiFi test driver framework on WinXP
- * 1. Permanent and current MAC address are now retrieved by CMD/EVENT packets instead of hard-coded address
- * * 2. follow MSDN defined behavior when associates to another AP
- * * 3. for firmware download, packet size could be up to 2048 bytes
- *
- * 02 09 2010 cp.wu
- * [WPD00001943]Create WiFi test driver framework on WinXP
- * move ucCmdSeqNum as instance variable
- *
- * 02 04 2010 cp.wu
- * [WPD00001943]Create WiFi test driver framework on WinXP
- * when OID_CUSTOM_OID_INTERFACE_VERSION is queried, do modify connection states
- *
- * 01 27 2010 cp.wu
- * [WPD00001943]Create WiFi test driver framework on WinXP
- * 1) implement timeout mechanism when OID is pending for longer than 1 second
- * * 2) allow OID_802_11_CONFIGURATION to be executed when RF test mode is turned on
- *
- * 01 27 2010 wh.su
- * [WPD00003816][MT6620 Wi-Fi] Adding the security support
- * .
- *
- * 01 27 2010 cp.wu
- * [WPD00001943]Create WiFi test driver framework on WinXP
- * 1. eliminate improper variable in rHifInfo
- * * 2. block TX/ordinary OID when RF test mode is engaged
- * * 3. wait until firmware finish operation when entering into and leaving from RF test mode
- * * 4. correct some HAL implementation
- *
- * 01 22 2010 cp.wu
- * [WPD00001943]Create WiFi test driver framework on WinXP
- * implement following 802.11 OIDs:
- * OID_802_11_RSSI,
- * OID_802_11_RSSI_TRIGGER,
- * OID_802_11_STATISTICS,
- * OID_802_11_DISASSOCIATE,
- * OID_802_11_POWER_MODE
- *
- * 01 21 2010 cp.wu
- * [WPD00001943]Create WiFi test driver framework on WinXP
- * implement OID_802_11_MEDIA_STREAM_MODE
- *
- * 01 21 2010 cp.wu
- * [WPD00001943]Create WiFi test driver framework on WinXP
- * implement OID_802_11_SUPPORTED_RATES / OID_802_11_DESIRED_RATES
- *
- * 01 21 2010 cp.wu
- * [WPD00001943]Create WiFi test driver framework on WinXP
- * do not fill ucJoinOnly currently
- *
- * 01 14 2010 cp.wu
- * [WPD00001943]Create WiFi test driver framework on WinXP
- * enable to connect to ad-hoc network
- *
- * 01 07 2010 cp.wu
- * [WPD00001943]Create WiFi test driver framework on WinXP
- * .implement Set/Query BeaconInterval/AtimWindow
- *
- * 01 07 2010 cp.wu
- * [WPD00001943]Create WiFi test driver framework on WinXP
- * .Set/Get AT Info is not blocked even when driver is not in fg test mode
- *
- * 12 30 2009 cp.wu
- * [WPD00001943]Create WiFi test driver framework on WinXP
- * 1) According to CMD/EVENT documentation v0.8,
- * OID_CUSTOM_TEST_RX_STATUS & OID_CUSTOM_TEST_TX_STATUS is no longer used,
- * and result is retrieved by get ATInfo instead
- * 2) add 4 counter for recording aggregation statistics
- *
- * 12 28 2009 cp.wu
- * [WPD00001943]Create WiFi test driver framework on WinXP
- * eliminate redundant variables for connection_state
- ** \main\maintrunk.MT6620WiFiDriver_Prj\32 2009-12-16 22:13:36 GMT mtk02752
- ** change hard-coded MAC address to match with FW (temporally)
- ** \main\maintrunk.MT6620WiFiDriver_Prj\31 2009-12-10 16:49:50 GMT mtk02752
- ** code clean
- ** \main\maintrunk.MT6620WiFiDriver_Prj\30 2009-12-08 17:38:49 GMT mtk02752
- ** + add OID for RF test
- ** * MCR RD/WR are modified to match with cmd/event definition
- ** \main\maintrunk.MT6620WiFiDriver_Prj\29 2009-12-08 11:32:20 GMT mtk02752
- ** add skeleton for RF test implementation
- ** \main\maintrunk.MT6620WiFiDriver_Prj\28 2009-12-03 16:43:24 GMT mtk01461
- ** Modify query SCAN list oid by adding prEventScanResult
- **
- ** \main\maintrunk.MT6620WiFiDriver_Prj\27 2009-12-03 16:39:27 GMT mtk01461
- ** Sync CMD data structure in set ssid oid
- ** \main\maintrunk.MT6620WiFiDriver_Prj\26 2009-12-03 16:28:22 GMT mtk01461
- ** Add invalid check of set SSID oid and fix query scan list oid
- ** \main\maintrunk.MT6620WiFiDriver_Prj\25 2009-11-30 17:33:08 GMT mtk02752
- ** implement wlanoidSetInfrastructureMode/wlanoidQueryInfrastructureMode
- ** \main\maintrunk.MT6620WiFiDriver_Prj\24 2009-11-30 10:53:49 GMT mtk02752
- ** 1st DW of WIFI_CMD_T is shared with HIF_TX_HEADER_T
- ** \main\maintrunk.MT6620WiFiDriver_Prj\23 2009-11-30 09:22:48 GMT mtk02752
- ** correct wifi cmd length mismatch
- ** \main\maintrunk.MT6620WiFiDriver_Prj\22 2009-11-25 21:34:33 GMT mtk02752
- ** sync EVENT_SCAN_RESULT_T with firmware
- ** \main\maintrunk.MT6620WiFiDriver_Prj\21 2009-11-25 21:03:27 GMT mtk02752
- ** implement wlanoidQueryBssidList()
- ** \main\maintrunk.MT6620WiFiDriver_Prj\20 2009-11-25 18:17:17 GMT mtk02752
- ** refine GL_WLAN_INFO_T for buffering scan result
- ** \main\maintrunk.MT6620WiFiDriver_Prj\19 2009-11-23 20:28:51 GMT mtk02752
- ** some OID will be set to WLAN_STATUS_PENDING until it is sent via wlanSendCommand()
- ** \main\maintrunk.MT6620WiFiDriver_Prj\18 2009-11-23 17:56:36 GMT mtk02752
- ** implement wlanoidSetBssidListScan(), wlanoidSetBssid() and wlanoidSetSsid()
- **
- ** \main\maintrunk.MT6620WiFiDriver_Prj\17 2009-11-13 17:20:53 GMT mtk02752
- ** add Set BSSID/SSID path but disabled temporally due to FW is not ready yet
- ** \main\maintrunk.MT6620WiFiDriver_Prj\16 2009-11-13 12:28:58 GMT mtk02752
- ** add wlanoidSetBssidListScan -> cmd_info path
- ** \main\maintrunk.MT6620WiFiDriver_Prj\15 2009-11-09 22:48:07 GMT mtk01084
- ** modify test cases entry
- ** \main\maintrunk.MT6620WiFiDriver_Prj\14 2009-11-04 14:10:58 GMT mtk01084
- ** add new test interfaces
- ** \main\maintrunk.MT6620WiFiDriver_Prj\13 2009-10-30 18:17:10 GMT mtk01084
- ** fix compiler warning
- ** \main\maintrunk.MT6620WiFiDriver_Prj\12 2009-10-29 19:46:26 GMT mtk01084
- ** add test functions
- ** \main\maintrunk.MT6620WiFiDriver_Prj\11 2009-10-23 16:07:56 GMT mtk01084
- ** include new file
- ** \main\maintrunk.MT6620WiFiDriver_Prj\10 2009-10-13 21:58:29 GMT mtk01084
- ** modify for new HW architecture
- ** \main\maintrunk.MT6620WiFiDriver_Prj\9 2009-10-02 13:48:49 GMT mtk01725
- ** \main\maintrunk.MT6620WiFiDriver_Prj\8 2009-09-09 17:26:04 GMT mtk01084
- ** \main\maintrunk.MT6620WiFiDriver_Prj\7 2009-04-21 12:09:50 GMT mtk01461
- ** Update for MCR Write OID
- ** \main\maintrunk.MT6620WiFiDriver_Prj\6 2009-04-21 09:35:18 GMT mtk01461
- ** Update wlanoidQueryMcrRead() for composing CMD_INFO_T
- ** \main\maintrunk.MT6620WiFiDriver_Prj\5 2009-04-17 18:09:51 GMT mtk01426
- ** Remove kalIndicateStatusAndComplete() in wlanoidQueryOidInterfaceVersion()
- ** \main\maintrunk.MT6620WiFiDriver_Prj\4 2009-04-14 15:51:50 GMT mtk01426
- ** Add MCR read/write support
- ** \main\maintrunk.MT6620WiFiDriver_Prj\3 2009-03-19 18:32:40 GMT mtk01084
- ** update for basic power management functions
- ** \main\maintrunk.MT6620WiFiDriver_Prj\2 2009-03-10 20:06:31 GMT mtk01426
- ** Init for develop
- **
- */
- /******************************************************************************
- * C O M P I L E R F L A G S
- *******************************************************************************
- */
- /******************************************************************************
- * E X T E R N A L R E F E R E N C E S
- *******************************************************************************
- */
- #include "precomp.h"
- #include "mgmt/rsn.h"
- #ifdef FW_CFG_SUPPORT
- #include "fwcfg.h"
- #endif
- #include <stddef.h>
- /******************************************************************************
- * C O N S T A N T S
- *******************************************************************************
- */
- /******************************************************************************
- * D A T A T Y P E S
- *******************************************************************************
- */
- /******************************************************************************
- * P U B L I C D A T A
- *******************************************************************************
- */
- /******************************************************************************
- * P R I V A T E D A T A
- *******************************************************************************
- */
- /******************************************************************************
- * M A C R O S
- *******************************************************************************
- */
- /******************************************************************************
- * F U N C T I O N D E C L A R A T I O N S
- *******************************************************************************
- */
- /******************************************************************************
- * F U N C T I O N S
- *******************************************************************************
- */
- #if CFG_ENABLE_STATISTICS_BUFFERING
- static BOOLEAN IsBufferedStatisticsUsable(P_ADAPTER_T prAdapter)
- {
- ASSERT(prAdapter);
- if (prAdapter->fgIsStatValid == TRUE &&
- (kalGetTimeTick() - prAdapter->rStatUpdateTime) <= CFG_STATISTICS_VALID_CYCLE)
- return TRUE;
- else
- return FALSE;
- }
- #endif
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to query the supported physical layer network
- * type that can be used by the driver.
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
- * the query.
- * \param[in] u4QueryBufferLen The length of the query buffer.
- * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
- * bytes written into the query buffer. If the call
- * failed due to invalid length of the query buffer,
- * returns the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_INVALID_LENGTH
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidQueryNetworkTypesSupported(IN P_ADAPTER_T prAdapter,
- OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
- {
- UINT_32 u4NumItem = 0;
- ENUM_PARAM_NETWORK_TYPE_T eSupportedNetworks[PARAM_NETWORK_TYPE_NUM];
- PPARAM_NETWORK_TYPE_LIST prSupported;
- /* The array of all physical layer network subtypes that the driver supports. */
- DEBUGFUNC("wlanoidQueryNetworkTypesSupported");
- ASSERT(prAdapter);
- ASSERT(pu4QueryInfoLen);
- if (u4QueryBufferLen)
- ASSERT(pvQueryBuffer);
- /* Init. */
- for (u4NumItem = 0; u4NumItem < PARAM_NETWORK_TYPE_NUM; u4NumItem++)
- eSupportedNetworks[u4NumItem] = 0;
- u4NumItem = 0;
- eSupportedNetworks[u4NumItem] = PARAM_NETWORK_TYPE_DS;
- u4NumItem++;
- eSupportedNetworks[u4NumItem] = PARAM_NETWORK_TYPE_OFDM24;
- u4NumItem++;
- *pu4QueryInfoLen =
- (UINT_32) OFFSET_OF(PARAM_NETWORK_TYPE_LIST, eNetworkType) +
- (u4NumItem * sizeof(ENUM_PARAM_NETWORK_TYPE_T));
- if (u4QueryBufferLen < *pu4QueryInfoLen)
- return WLAN_STATUS_INVALID_LENGTH;
- prSupported = (PPARAM_NETWORK_TYPE_LIST) pvQueryBuffer;
- prSupported->NumberOfItems = u4NumItem;
- kalMemCopy(prSupported->eNetworkType, eSupportedNetworks, u4NumItem * sizeof(ENUM_PARAM_NETWORK_TYPE_T));
- DBGLOG(OID, TRACE, "NDIS supported network type list: %u\n", prSupported->NumberOfItems);
- DBGLOG_MEM8(OID, TRACE, prSupported, *pu4QueryInfoLen);
- return WLAN_STATUS_SUCCESS;
- } /* wlanoidQueryNetworkTypesSupported */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to query the current physical layer network
- * type used by the driver.
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
- * the query.
- * \param[in] u4QueryBufferLen The length of the query buffer.
- * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
- * bytes written into the query buffer. If the
- * call failed due to invalid length of the query
- * buffer, returns the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_BUFFER_TOO_SHORT
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidQueryNetworkTypeInUse(IN P_ADAPTER_T prAdapter,
- OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
- {
- /* TODO: need to check the OID handler content again!! */
- ENUM_PARAM_NETWORK_TYPE_T rCurrentNetworkTypeInUse = PARAM_NETWORK_TYPE_OFDM24;
- DEBUGFUNC("wlanoidQueryNetworkTypeInUse");
- ASSERT(prAdapter);
- ASSERT(pu4QueryInfoLen);
- if (u4QueryBufferLen)
- ASSERT(pvQueryBuffer);
- if (u4QueryBufferLen < sizeof(ENUM_PARAM_NETWORK_TYPE_T)) {
- *pu4QueryInfoLen = sizeof(ENUM_PARAM_NETWORK_TYPE_T);
- return WLAN_STATUS_BUFFER_TOO_SHORT;
- }
- if (kalGetMediaStateIndicated(prAdapter->prGlueInfo) == PARAM_MEDIA_STATE_CONNECTED)
- rCurrentNetworkTypeInUse = (ENUM_PARAM_NETWORK_TYPE_T) (prAdapter->rWlanInfo.ucNetworkType);
- else
- rCurrentNetworkTypeInUse = (ENUM_PARAM_NETWORK_TYPE_T) (prAdapter->rWlanInfo.ucNetworkTypeInUse);
- *(P_ENUM_PARAM_NETWORK_TYPE_T) pvQueryBuffer = rCurrentNetworkTypeInUse;
- *pu4QueryInfoLen = sizeof(ENUM_PARAM_NETWORK_TYPE_T);
- DBGLOG(OID, TRACE, "Network type in use: %d\n", rCurrentNetworkTypeInUse);
- return WLAN_STATUS_SUCCESS;
- } /* wlanoidQueryNetworkTypeInUse */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to set the physical layer network type used
- * by the driver.
- *
- * \param[in] pvAdapter Pointer to the Adapter structure.
- * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
- * \param[in] u4SetBufferLen The length of the set buffer.
- * \param[out] pu4SetInfoLen If the call is successful, returns the number of
- * bytes read from the set buffer. If the call failed
- * due to invalid length of the set buffer, returns the
- * amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS The given network type is supported and accepted.
- * \retval WLAN_STATUS_INVALID_DATA The given network type is not in the
- * supported list.
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidSetNetworkTypeInUse(IN P_ADAPTER_T prAdapter,
- IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- /* TODO: need to check the OID handler content again!! */
- ENUM_PARAM_NETWORK_TYPE_T eNewNetworkType;
- WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
- DEBUGFUNC("wlanoidSetNetworkTypeInUse");
- ASSERT(prAdapter);
- ASSERT(pvSetBuffer);
- ASSERT(pu4SetInfoLen);
- if (u4SetBufferLen < sizeof(ENUM_PARAM_NETWORK_TYPE_T)) {
- *pu4SetInfoLen = sizeof(ENUM_PARAM_NETWORK_TYPE_T);
- return WLAN_STATUS_INVALID_LENGTH;
- }
- eNewNetworkType = *(P_ENUM_PARAM_NETWORK_TYPE_T) pvSetBuffer;
- *pu4SetInfoLen = sizeof(ENUM_PARAM_NETWORK_TYPE_T);
- DBGLOG(OID, INFO, "New network type: %d mode\n", eNewNetworkType);
- switch (eNewNetworkType) {
- case PARAM_NETWORK_TYPE_DS:
- prAdapter->rWlanInfo.ucNetworkTypeInUse = (UINT_8) PARAM_NETWORK_TYPE_DS;
- break;
- case PARAM_NETWORK_TYPE_OFDM5:
- prAdapter->rWlanInfo.ucNetworkTypeInUse = (UINT_8) PARAM_NETWORK_TYPE_OFDM5;
- break;
- case PARAM_NETWORK_TYPE_OFDM24:
- prAdapter->rWlanInfo.ucNetworkTypeInUse = (UINT_8) PARAM_NETWORK_TYPE_OFDM24;
- break;
- case PARAM_NETWORK_TYPE_AUTOMODE:
- prAdapter->rWlanInfo.ucNetworkTypeInUse = (UINT_8) PARAM_NETWORK_TYPE_AUTOMODE;
- break;
- case PARAM_NETWORK_TYPE_FH:
- DBGLOG(OID, INFO, "Not support network type: %d\n", eNewNetworkType);
- rStatus = WLAN_STATUS_NOT_SUPPORTED;
- break;
- default:
- DBGLOG(OID, INFO, "Unknown network type: %d\n", eNewNetworkType);
- rStatus = WLAN_STATUS_INVALID_DATA;
- break;
- }
- /* Verify if we support the new network type. */
- if (rStatus != WLAN_STATUS_SUCCESS)
- DBGLOG(OID, WARN, "Unknown network type: %d\n", eNewNetworkType);
- return rStatus;
- } /* wlanoidSetNetworkTypeInUse */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to query the current BSSID.
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
- * the query.
- * \param[in] u4QueryBufferLen The length of the query buffer.
- * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
- * bytes written into the query buffer. If the call
- * failed due to invalid length of the query buffer,
- * returns the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_ADAPTER_NOT_READY
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidQueryBssid(IN P_ADAPTER_T prAdapter,
- OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
- {
- WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
- DEBUGFUNC("wlanoidQueryBssid");
- ASSERT(prAdapter);
- if (u4QueryBufferLen < MAC_ADDR_LEN) {
- ASSERT(pu4QueryInfoLen);
- *pu4QueryInfoLen = MAC_ADDR_LEN;
- return WLAN_STATUS_BUFFER_TOO_SHORT;
- }
- ASSERT(u4QueryBufferLen >= MAC_ADDR_LEN);
- if (u4QueryBufferLen)
- ASSERT(pvQueryBuffer);
- ASSERT(pu4QueryInfoLen);
- if (kalGetMediaStateIndicated(prAdapter->prGlueInfo) == PARAM_MEDIA_STATE_CONNECTED)
- kalMemCopy(pvQueryBuffer, prAdapter->rWlanInfo.rCurrBssId.arMacAddress, MAC_ADDR_LEN);
- else if (prAdapter->rWifiVar.rConnSettings.eOPMode == NET_TYPE_IBSS) {
- PARAM_MAC_ADDRESS aucTemp; /*!< BSSID */
- COPY_MAC_ADDR(aucTemp, prAdapter->rWlanInfo.rCurrBssId.arMacAddress);
- aucTemp[0] &= ~BIT(0);
- aucTemp[1] |= BIT(1);
- COPY_MAC_ADDR(pvQueryBuffer, aucTemp);
- } else
- rStatus = WLAN_STATUS_ADAPTER_NOT_READY;
- *pu4QueryInfoLen = MAC_ADDR_LEN;
- return rStatus;
- } /* wlanoidQueryBssid */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to query the list of all BSSIDs detected by
- * the driver.
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
- * the query.
- * \param[in] u4QueryBufferLen The length of the query buffer.
- * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
- * bytes written into the query buffer. If the call
- * failed due to invalid length of the query buffer,
- * returns the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_INVALID_LENGTH
- * \retval WLAN_STATUS_ADAPTER_NOT_READY
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidQueryBssidList(IN P_ADAPTER_T prAdapter,
- OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
- {
- P_GLUE_INFO_T prGlueInfo;
- UINT_32 i, u4BssidListExLen;
- P_PARAM_BSSID_LIST_EX_T prList;
- P_PARAM_BSSID_EX_T prBssidEx;
- PUINT_8 cp;
- DEBUGFUNC("wlanoidQueryBssidList");
- ASSERT(prAdapter);
- ASSERT(pu4QueryInfoLen);
- if (u4QueryBufferLen) {
- ASSERT(pvQueryBuffer);
- if (!pvQueryBuffer)
- return WLAN_STATUS_INVALID_DATA;
- }
- prGlueInfo = prAdapter->prGlueInfo;
- if (prAdapter->rAcpiState == ACPI_STATE_D3) {
- DBGLOG(OID, WARN, "Fail in qeury BSSID list! (Adapter not ready). ACPI=D%d, Radio=%d\n",
- prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
- return WLAN_STATUS_ADAPTER_NOT_READY;
- }
- u4BssidListExLen = 0;
- if (prAdapter->fgIsRadioOff == FALSE) {
- for (i = 0; i < prAdapter->rWlanInfo.u4ScanResultNum; i++)
- u4BssidListExLen += ALIGN_4(prAdapter->rWlanInfo.arScanResult[i].u4Length);
- }
- if (u4BssidListExLen)
- u4BssidListExLen += 4; /* u4NumberOfItems. */
- else
- u4BssidListExLen = sizeof(PARAM_BSSID_LIST_EX_T);
- *pu4QueryInfoLen = u4BssidListExLen;
- if (u4QueryBufferLen < *pu4QueryInfoLen)
- return WLAN_STATUS_INVALID_LENGTH;
- /* Clear the buffer */
- kalMemZero(pvQueryBuffer, u4BssidListExLen);
- prList = (P_PARAM_BSSID_LIST_EX_T) pvQueryBuffer;
- cp = (PUINT_8) &prList->arBssid[0];
- if (prAdapter->fgIsRadioOff == FALSE && prAdapter->rWlanInfo.u4ScanResultNum > 0) {
- /* fill up for each entry */
- for (i = 0; i < prAdapter->rWlanInfo.u4ScanResultNum; i++) {
- prBssidEx = (P_PARAM_BSSID_EX_T) cp;
- /* copy structure */
- kalMemCopy(prBssidEx,
- &(prAdapter->rWlanInfo.arScanResult[i]), OFFSET_OF(PARAM_BSSID_EX_T, aucIEs));
- /*For WHQL test, Rssi should be in range -10 ~ -200 dBm */
- if (prBssidEx->rRssi > PARAM_WHQL_RSSI_MAX_DBM)
- prBssidEx->rRssi = PARAM_WHQL_RSSI_MAX_DBM;
- if (prAdapter->rWlanInfo.arScanResult[i].u4IELength > 0) {
- /* copy IEs */
- kalMemCopy(prBssidEx->aucIEs,
- prAdapter->rWlanInfo.apucScanResultIEs[i],
- prAdapter->rWlanInfo.arScanResult[i].u4IELength);
- }
- /* 4-bytes alignement */
- prBssidEx->u4Length = ALIGN_4(prBssidEx->u4Length);
- cp += prBssidEx->u4Length;
- prList->u4NumberOfItems++;
- }
- }
- return WLAN_STATUS_SUCCESS;
- } /* wlanoidQueryBssidList */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to request the driver to perform
- * scanning.
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[in] pvSetBuffer Pointer to the buffer that holds the data to be set.
- * \param[in] u4SetBufferLen The length of the set buffer.
- * \param[out] pu4SetInfoLen If the call is successful, returns the number of
- * bytes read from the set buffer. If the call failed
- * due to invalid length of the set buffer, returns
- * the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_ADAPTER_NOT_READY
- * \retval WLAN_STATUS_FAILURE
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidSetBssidListScan(IN P_ADAPTER_T prAdapter,
- IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- P_PARAM_SSID_T prSsid;
- PARAM_SSID_T rSsid;
- WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
- DEBUGFUNC("wlanoidSetBssidListScan()");
- if (prAdapter->rAcpiState == ACPI_STATE_D3) {
- DBGLOG(OID, WARN, "Fail in set BSSID list scan! (Adapter not ready). ACPI=D%d, Radio=%d\n",
- prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
- return WLAN_STATUS_ADAPTER_NOT_READY;
- }
- ASSERT(pu4SetInfoLen);
- *pu4SetInfoLen = 0;
- if (prAdapter->fgIsRadioOff) {
- DBGLOG(OID, WARN, "Return from BSSID list scan! (radio off). ACPI=D%d, Radio=%d\n",
- prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
- return WLAN_STATUS_SUCCESS;
- }
- DBGLOG(OID, TRACE, "Scan\n");
- if (pvSetBuffer != NULL && u4SetBufferLen != 0) {
- COPY_SSID(rSsid.aucSsid, rSsid.u4SsidLen, pvSetBuffer, u4SetBufferLen);
- prSsid = &rSsid;
- } else {
- prSsid = NULL;
- }
- #if CFG_SUPPORT_RDD_TEST_MODE
- if (prAdapter->prGlueInfo->rRegInfo.u4RddTestMode) {
- if ((prAdapter->fgEnOnlineScan == TRUE) && (prAdapter->ucRddStatus)) {
- if (kalGetMediaStateIndicated(prAdapter->prGlueInfo) != PARAM_MEDIA_STATE_CONNECTED) {
- aisFsmScanRequest(prAdapter, prSsid, NULL, 0);
- } else {
- /* reject the scan request */
- rStatus = WLAN_STATUS_FAILURE;
- }
- } else {
- /* reject the scan request */
- rStatus = WLAN_STATUS_FAILURE;
- }
- } else
- #endif
- {
- if (prAdapter->fgEnOnlineScan == TRUE) {
- aisFsmScanRequest(prAdapter, prSsid, NULL, 0);
- } else if (kalGetMediaStateIndicated(prAdapter->prGlueInfo) != PARAM_MEDIA_STATE_CONNECTED) {
- aisFsmScanRequest(prAdapter, prSsid, NULL, 0);
- } else {
- /* reject the scan request */
- rStatus = WLAN_STATUS_FAILURE;
- }
- }
- return rStatus;
- } /* wlanoidSetBssidListScan */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to request the driver to perform
- * scanning with attaching information elements(IEs) specified from user space
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[in] pvSetBuffer Pointer to the buffer that holds the data to be set.
- * \param[in] u4SetBufferLen The length of the set buffer.
- * \param[out] pu4SetInfoLen If the call is successful, returns the number of
- * bytes read from the set buffer. If the call failed
- * due to invalid length of the set buffer, returns
- * the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_ADAPTER_NOT_READY
- * \retval WLAN_STATUS_FAILURE
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidSetBssidListScanExt(IN P_ADAPTER_T prAdapter,
- IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- P_PARAM_SCAN_REQUEST_EXT_T prScanRequest;
- P_AIS_FSM_INFO_T prAisFsmInfo;
- P_PARAM_SSID_T prSsid;
- PUINT_8 pucIe;
- UINT_32 u4IeLength;
- WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
- UINT_8 ucScanTime = AIS_SCN_DONE_TIMEOUT_SEC;
- DEBUGFUNC("wlanoidSetBssidListScanExt()");
- if (prAdapter->rAcpiState == ACPI_STATE_D3) {
- DBGLOG(OID, ERROR, "Fail in set BSSID list scan! (Adapter not ready). ACPI=D%d, Radio=%d\n",
- prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
- return WLAN_STATUS_ADAPTER_NOT_READY;
- }
- ASSERT(pu4SetInfoLen);
- *pu4SetInfoLen = 0;
- if (u4SetBufferLen != sizeof(PARAM_SCAN_REQUEST_EXT_T)) {
- DBGLOG(OID, ERROR, "u4SetBufferLen != sizeof(PARAM_SCAN_REQUEST_EXT_T)\n");
- return WLAN_STATUS_INVALID_LENGTH;
- }
- if (prAdapter->fgIsRadioOff) {
- DBGLOG(OID, INFO, "Return from BSSID list scan! (radio off). ACPI=D%d, Radio=%d\n",
- prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
- return WLAN_STATUS_SUCCESS;
- }
- DBGLOG(OID, TRACE, "ScanEx\n");
- /* clear old scan backup results if exists */
- {
- P_SCAN_INFO_T prScanInfo;
- P_LINK_T prBSSDescList;
- P_BSS_DESC_T prBssDesc;
- prScanInfo = &(prAdapter->rWifiVar.rScanInfo);
- prBSSDescList = &prScanInfo->rBSSDescList;
- LINK_FOR_EACH_ENTRY(prBssDesc, prBSSDescList, rLinkEntry, BSS_DESC_T) {
- if (prBssDesc->eBSSType == BSS_TYPE_INFRASTRUCTURE) {
- kalMemZero(prBssDesc->aucRawBuf, CFG_RAW_BUFFER_SIZE);
- prBssDesc->u2RawLength = 0;
- }
- }
- }
- if (pvSetBuffer != NULL && u4SetBufferLen != 0) {
- prScanRequest = (P_PARAM_SCAN_REQUEST_EXT_T) pvSetBuffer;
- prSsid = &(prScanRequest->rSsid);
- pucIe = prScanRequest->pucIE;
- u4IeLength = prScanRequest->u4IELength;
- } else {
- prScanRequest = NULL;
- prSsid = NULL;
- pucIe = NULL;
- u4IeLength = 0;
- }
- /* P_AIS_FSM_INFO_T prAisFsmInfo; */
- prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
- /* #if CFG_SUPPORT_WFD */
- #if 0
- if ((prAdapter->rWifiVar.prP2pFsmInfo->rWfdConfigureSettings.ucWfdEnable) &&
- ((prAdapter->rWifiVar.prP2pFsmInfo->rWfdConfigureSettings.u4WfdFlag & WFD_FLAGS_DEV_INFO_VALID))) {
- if (prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_P2P_INDEX].eConnectionState ==
- PARAM_MEDIA_STATE_CONNECTED) {
- DBGLOG(OID, TRACE, "Twice the Scan Time for WFD\n");
- ucScanTime *= 2;
- }
- }
- #endif /* CFG_SUPPORT_WFD */
- cnmTimerStartTimer(prAdapter, &prAisFsmInfo->rScanDoneTimer, SEC_TO_MSEC(ucScanTime));
- #if CFG_SUPPORT_RDD_TEST_MODE
- if (prAdapter->prGlueInfo->rRegInfo.u4RddTestMode) {
- if ((prAdapter->fgEnOnlineScan == TRUE) && (prAdapter->ucRddStatus)) {
- if (kalGetMediaStateIndicated(prAdapter->prGlueInfo) != PARAM_MEDIA_STATE_CONNECTED) {
- aisFsmScanRequest(prAdapter, prSsid, pucIe, u4IeLength);
- } else {
- /* reject the scan request */
- cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rScanDoneTimer);
- rStatus = WLAN_STATUS_FAILURE;
- }
- } else {
- /* reject the scan request */
- cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rScanDoneTimer);
- rStatus = WLAN_STATUS_FAILURE;
- }
- } else
- #endif
- {
- if (prAdapter->fgEnOnlineScan == TRUE) {
- aisFsmScanRequest(prAdapter, prSsid, pucIe, u4IeLength);
- } else if (kalGetMediaStateIndicated(prAdapter->prGlueInfo) != PARAM_MEDIA_STATE_CONNECTED) {
- aisFsmScanRequest(prAdapter, prSsid, pucIe, u4IeLength);
- } else {
- /* reject the scan request */
- cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rScanDoneTimer);
- rStatus = WLAN_STATUS_FAILURE;
- DBGLOG(OID, WARN, "ScanEx fail %d!\n", prAdapter->fgEnOnlineScan);
- }
- }
- return rStatus;
- } /* wlanoidSetBssidListScanWithIE */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine will initiate the join procedure to attempt to associate
- * with the specified BSSID.
- *
- * \param[in] pvAdapter Pointer to the Adapter structure.
- * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
- * \param[in] u4SetBufferLen The length of the set buffer.
- * \param[out] pu4SetInfoLen If the call is successful, returns the number of
- * bytes read from the set buffer. If the call failed
- * due to invalid length of the set buffer, returns
- * the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_INVALID_LENGTH
- * \retval WLAN_STATUS_INVALID_DATA
- * \retval WLAN_STATUS_ADAPTER_NOT_READY
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidSetBssid(IN P_ADAPTER_T prAdapter, IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- P_GLUE_INFO_T prGlueInfo;
- P_UINT_8 pAddr;
- UINT_32 i;
- INT_32 i4Idx = -1;
- P_MSG_AIS_ABORT_T prAisAbortMsg;
- UINT_8 ucReasonOfDisconnect;
- ASSERT(prAdapter);
- ASSERT(pu4SetInfoLen);
- *pu4SetInfoLen = MAC_ADDR_LEN;
- if (u4SetBufferLen != MAC_ADDR_LEN) {
- *pu4SetInfoLen = MAC_ADDR_LEN;
- return WLAN_STATUS_INVALID_LENGTH;
- } else if (prAdapter->rAcpiState == ACPI_STATE_D3) {
- DBGLOG(OID, WARN, "Fail in set ssid! (Adapter not ready). ACPI=D%d, Radio=%d\n",
- prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
- return WLAN_STATUS_ADAPTER_NOT_READY;
- }
- prGlueInfo = prAdapter->prGlueInfo;
- pAddr = (P_UINT_8) pvSetBuffer;
- /* re-association check */
- if (kalGetMediaStateIndicated(prGlueInfo) == PARAM_MEDIA_STATE_CONNECTED) {
- if (EQUAL_MAC_ADDR(prAdapter->rWlanInfo.rCurrBssId.arMacAddress, pAddr)) {
- kalSetMediaStateIndicated(prGlueInfo, PARAM_MEDIA_STATE_TO_BE_INDICATED);
- ucReasonOfDisconnect = DISCONNECT_REASON_CODE_REASSOCIATION;
- } else {
- DBGLOG(OID, TRACE, "DisByBssid\n");
- kalIndicateStatusAndComplete(prGlueInfo, WLAN_STATUS_MEDIA_DISCONNECT, NULL, 0);
- ucReasonOfDisconnect = DISCONNECT_REASON_CODE_NEW_CONNECTION;
- }
- } else {
- ucReasonOfDisconnect = DISCONNECT_REASON_CODE_NEW_CONNECTION;
- }
- /* check if any scanned result matchs with the BSSID */
- for (i = 0; i < prAdapter->rWlanInfo.u4ScanResultNum; i++) {
- if (EQUAL_MAC_ADDR(prAdapter->rWlanInfo.arScanResult[i].arMacAddress, pAddr)) {
- i4Idx = (INT_32) i;
- break;
- }
- }
- /* prepare message to AIS */
- if (prAdapter->rWifiVar.rConnSettings.eOPMode == NET_TYPE_IBSS
- || prAdapter->rWifiVar.rConnSettings.eOPMode == NET_TYPE_DEDICATED_IBSS) {
- /* IBSS *//* beacon period */
- prAdapter->rWifiVar.rConnSettings.u2BeaconPeriod = prAdapter->rWlanInfo.u2BeaconPeriod;
- prAdapter->rWifiVar.rConnSettings.u2AtimWindow = prAdapter->rWlanInfo.u2AtimWindow;
- }
- /* Set Connection Request Issued Flag */
- prAdapter->rWifiVar.rConnSettings.fgIsConnReqIssued = TRUE;
- prAdapter->rWifiVar.rConnSettings.eConnectionPolicy = CONNECT_BY_BSSID;
- /* Send AIS Abort Message */
- prAisAbortMsg = (P_MSG_AIS_ABORT_T) cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_AIS_ABORT_T));
- if (!prAisAbortMsg) {
- ASSERT(0);
- return WLAN_STATUS_FAILURE;
- }
- prAisAbortMsg->rMsgHdr.eMsgId = MID_OID_AIS_FSM_JOIN_REQ;
- prAisAbortMsg->ucReasonOfDisconnect = ucReasonOfDisconnect;
- /* Update the information to CONNECTION_SETTINGS_T */
- prAdapter->rWifiVar.rConnSettings.ucSSIDLen = 0;
- prAdapter->rWifiVar.rConnSettings.aucSSID[0] = '\0';
- COPY_MAC_ADDR(prAdapter->rWifiVar.rConnSettings.aucBSSID, pAddr);
- if (EQUAL_MAC_ADDR(prAdapter->rWlanInfo.rCurrBssId.arMacAddress, pAddr))
- prAisAbortMsg->fgDelayIndication = TRUE;
- else
- prAisAbortMsg->fgDelayIndication = FALSE;
- mboxSendMsg(prAdapter, MBOX_ID_0, (P_MSG_HDR_T) prAisAbortMsg, MSG_SEND_METHOD_BUF);
- DBGLOG(OID, INFO, "SetBssid\n");
- return WLAN_STATUS_SUCCESS;
- } /* end of wlanoidSetBssid() */
- WLAN_STATUS
- wlanoidSetConnect(IN P_ADAPTER_T prAdapter, IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- P_GLUE_INFO_T prGlueInfo;
- P_PARAM_CONNECT_T pParamConn;
- P_CONNECTION_SETTINGS_T prConnSettings;
- UINT_32 i;
- /*INT_32 i4Idx = -1, i4MaxRSSI = INT_MIN;*/
- P_MSG_AIS_ABORT_T prAisAbortMsg;
- BOOLEAN fgIsValidSsid = TRUE;
- BOOLEAN fgEqualSsid = FALSE;
- BOOLEAN fgEqualBssid = FALSE;
- const UINT_8 aucZeroMacAddr[] = NULL_MAC_ADDR;
- ASSERT(prAdapter);
- ASSERT(pu4SetInfoLen);
- /* MSDN:
- * Powering on the radio if the radio is powered off through a setting of OID_802_11_DISASSOCIATE
- */
- if (prAdapter->fgIsRadioOff == TRUE)
- prAdapter->fgIsRadioOff = FALSE;
- if (u4SetBufferLen != sizeof(PARAM_CONNECT_T))
- return WLAN_STATUS_INVALID_LENGTH;
- else if (prAdapter->rAcpiState == ACPI_STATE_D3) {
- DBGLOG(OID, WARN, "Fail in set ssid! (Adapter not ready). ACPI=D%d, Radio=%d\n",
- prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
- return WLAN_STATUS_ADAPTER_NOT_READY;
- }
- prAisAbortMsg = (P_MSG_AIS_ABORT_T) cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_AIS_ABORT_T));
- if (!prAisAbortMsg) {
- ASSERT(0);
- return WLAN_STATUS_FAILURE;
- }
- prAisAbortMsg->rMsgHdr.eMsgId = MID_OID_AIS_FSM_JOIN_REQ;
- pParamConn = (P_PARAM_CONNECT_T) pvSetBuffer;
- prConnSettings = &prAdapter->rWifiVar.rConnSettings;
- if (pParamConn->u4SsidLen > 32) {
- cnmMemFree(prAdapter, prAisAbortMsg);
- return WLAN_STATUS_INVALID_LENGTH;
- } else if (!pParamConn->pucBssid && !pParamConn->pucSsid) {
- cnmMemFree(prAdapter, prAisAbortMsg);
- return WLAN_STATUS_INVALID_LENGTH;
- }
- prGlueInfo = prAdapter->prGlueInfo;
- kalMemZero(prConnSettings->aucSSID, sizeof(prConnSettings->aucSSID));
- kalMemZero(prConnSettings->aucBSSID, sizeof(prConnSettings->aucBSSID));
- prConnSettings->eConnectionPolicy = CONNECT_BY_SSID_ANY;
- prConnSettings->fgIsConnByBssidIssued = FALSE;
- if (pParamConn->pucSsid) {
- prConnSettings->eConnectionPolicy = CONNECT_BY_SSID_BEST_RSSI;
- COPY_SSID(prConnSettings->aucSSID,
- prConnSettings->ucSSIDLen, pParamConn->pucSsid, (UINT_8) pParamConn->u4SsidLen);
- if (EQUAL_SSID(prAdapter->rWlanInfo.rCurrBssId.rSsid.aucSsid,
- prAdapter->rWlanInfo.rCurrBssId.rSsid.u4SsidLen,
- pParamConn->pucSsid, pParamConn->u4SsidLen))
- fgEqualSsid = TRUE;
- }
- if (pParamConn->pucBssid) {
- if (!EQUAL_MAC_ADDR(aucZeroMacAddr, pParamConn->pucBssid) && IS_UCAST_MAC_ADDR(pParamConn->pucBssid)) {
- prConnSettings->eConnectionPolicy = CONNECT_BY_BSSID;
- prConnSettings->fgIsConnByBssidIssued = TRUE;
- COPY_MAC_ADDR(prConnSettings->aucBSSID, pParamConn->pucBssid);
- if (EQUAL_MAC_ADDR(prAdapter->rWlanInfo.rCurrBssId.arMacAddress, pParamConn->pucBssid))
- fgEqualBssid = TRUE;
- } else
- DBGLOG(OID, TRACE, "wrong bssid %pM to connect\n", pParamConn->pucBssid);
- } else
- DBGLOG(OID, TRACE, "No Bssid set\n");
- prConnSettings->u4FreqInKHz = pParamConn->u4CenterFreq;
- /* prepare for CMD_BUILD_CONNECTION & CMD_GET_CONNECTION_STATUS */
- /* re-association check */
- if (kalGetMediaStateIndicated(prGlueInfo) == PARAM_MEDIA_STATE_CONNECTED) {
- if (fgEqualSsid) {
- prAisAbortMsg->ucReasonOfDisconnect = DISCONNECT_REASON_CODE_ROAMING;
- if (fgEqualBssid) {
- kalSetMediaStateIndicated(prGlueInfo, PARAM_MEDIA_STATE_TO_BE_INDICATED);
- prAisAbortMsg->ucReasonOfDisconnect = DISCONNECT_REASON_CODE_REASSOCIATION;
- }
- } else {
- DBGLOG(OID, TRACE, "DisBySsid\n");
- kalIndicateStatusAndComplete(prGlueInfo, WLAN_STATUS_MEDIA_DISCONNECT, NULL, 0);
- prAisAbortMsg->ucReasonOfDisconnect = DISCONNECT_REASON_CODE_NEW_CONNECTION;
- }
- } else
- prAisAbortMsg->ucReasonOfDisconnect = DISCONNECT_REASON_CODE_NEW_CONNECTION;
- #if 0
- /* check if any scanned result matchs with the SSID */
- for (i = 0; i < prAdapter->rWlanInfo.u4ScanResultNum; i++) {
- PUINT_8 aucSsid = prAdapter->rWlanInfo.arScanResult[i].rSsid.aucSsid;
- UINT_8 ucSsidLength = (UINT_8) prAdapter->rWlanInfo.arScanResult[i].rSsid.u4SsidLen;
- INT_32 i4RSSI = prAdapter->rWlanInfo.arScanResult[i].rRssi;
- if (EQUAL_SSID(aucSsid, ucSsidLength, pParamConn->pucSsid, pParamConn->u4SsidLen) &&
- i4RSSI >= i4MaxRSSI) {
- i4Idx = (INT_32) i;
- i4MaxRSSI = i4RSSI;
- }
- if (EQUAL_MAC_ADDR(prAdapter->rWlanInfo.arScanResult[i].arMacAddress, pAddr)) {
- i4Idx = (INT_32) i;
- break;
- }
- }
- #endif
- /* prepare message to AIS */
- if (prConnSettings->eOPMode == NET_TYPE_IBSS || prConnSettings->eOPMode == NET_TYPE_DEDICATED_IBSS) {
- /* IBSS *//* beacon period */
- prConnSettings->u2BeaconPeriod = prAdapter->rWlanInfo.u2BeaconPeriod;
- prConnSettings->u2AtimWindow = prAdapter->rWlanInfo.u2AtimWindow;
- }
- if (prAdapter->rWifiVar.fgSupportWZCDisassociation) {
- if (pParamConn->u4SsidLen == ELEM_MAX_LEN_SSID) {
- fgIsValidSsid = FALSE;
- for (i = 0; i < ELEM_MAX_LEN_SSID; i++) {
- if (pParamConn->pucSsid) {
- if (!((0 < pParamConn->pucSsid[i]) && (pParamConn->pucSsid[i] <= 0x1F))) {
- fgIsValidSsid = TRUE;
- break;
- }
- }
- }
- }
- }
- /* Set Connection Request Issued Flag */
- if (fgIsValidSsid)
- prConnSettings->fgIsConnReqIssued = TRUE;
- else {
- prConnSettings->eReConnectLevel = RECONNECT_LEVEL_USER_SET;
- prConnSettings->fgIsConnReqIssued = FALSE;
- }
- if (fgEqualSsid || fgEqualBssid)
- prAisAbortMsg->fgDelayIndication = TRUE;
- else
- /* Update the information to CONNECTION_SETTINGS_T */
- prAisAbortMsg->fgDelayIndication = FALSE;
- mboxSendMsg(prAdapter, MBOX_ID_0, (P_MSG_HDR_T) prAisAbortMsg, MSG_SEND_METHOD_BUF);
- DBGLOG(OID, INFO, "ssid %s, bssid %pM, conn policy %d, disc reason %d\n",
- prConnSettings->aucSSID, prConnSettings->aucBSSID,
- prConnSettings->eConnectionPolicy, prAisAbortMsg->ucReasonOfDisconnect);
- return WLAN_STATUS_SUCCESS;
- }
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine will initiate the join procedure to attempt
- * to associate with the new SSID. If the previous scanning
- * result is aged, we will scan the channels at first.
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[in] pvSetBuffer Pointer to the buffer that holds the data to be set.
- * \param[in] u4SetBufferLen The length of the set buffer.
- * \param[out] pu4SetInfoLen If the call is successful, returns the number of
- * bytes read from the set buffer. If the call failed
- * due to invalid length of the set buffer, returns
- * the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_INVALID_DATA
- * \retval WLAN_STATUS_ADAPTER_NOT_READY
- * \retval WLAN_STATUS_INVALID_LENGTH
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidSetSsid(IN P_ADAPTER_T prAdapter, IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- P_GLUE_INFO_T prGlueInfo;
- P_PARAM_SSID_T pParamSsid;
- UINT_32 i;
- INT_32 i4Idx = -1, i4MaxRSSI = INT_MIN;
- P_MSG_AIS_ABORT_T prAisAbortMsg;
- BOOLEAN fgIsValidSsid = TRUE;
- ASSERT(prAdapter);
- ASSERT(pu4SetInfoLen);
- /* MSDN:
- * Powering on the radio if the radio is powered off through a setting of OID_802_11_DISASSOCIATE
- */
- if (prAdapter->fgIsRadioOff == TRUE)
- prAdapter->fgIsRadioOff = FALSE;
- if (u4SetBufferLen < sizeof(PARAM_SSID_T) || u4SetBufferLen > sizeof(PARAM_SSID_T)) {
- return WLAN_STATUS_INVALID_LENGTH;
- } else if (prAdapter->rAcpiState == ACPI_STATE_D3) {
- DBGLOG(OID, WARN, "Fail in set ssid! (Adapter not ready). ACPI=D%d, Radio=%d\n",
- prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
- return WLAN_STATUS_ADAPTER_NOT_READY;
- }
- pParamSsid = (P_PARAM_SSID_T) pvSetBuffer;
- if (pParamSsid->u4SsidLen > 32)
- return WLAN_STATUS_INVALID_LENGTH;
- prGlueInfo = prAdapter->prGlueInfo;
- /* prepare for CMD_BUILD_CONNECTION & CMD_GET_CONNECTION_STATUS */
- /* re-association check */
- if (kalGetMediaStateIndicated(prGlueInfo) == PARAM_MEDIA_STATE_CONNECTED) {
- if (EQUAL_SSID(prAdapter->rWlanInfo.rCurrBssId.rSsid.aucSsid,
- prAdapter->rWlanInfo.rCurrBssId.rSsid.u4SsidLen,
- pParamSsid->aucSsid, pParamSsid->u4SsidLen)) {
- kalSetMediaStateIndicated(prGlueInfo, PARAM_MEDIA_STATE_TO_BE_INDICATED);
- } else {
- DBGLOG(OID, TRACE, "DisBySsid\n");
- kalIndicateStatusAndComplete(prGlueInfo, WLAN_STATUS_MEDIA_DISCONNECT, NULL, 0);
- }
- }
- /* check if any scanned result matchs with the SSID */
- for (i = 0; i < prAdapter->rWlanInfo.u4ScanResultNum; i++) {
- PUINT_8 aucSsid = prAdapter->rWlanInfo.arScanResult[i].rSsid.aucSsid;
- UINT_8 ucSsidLength = (UINT_8) prAdapter->rWlanInfo.arScanResult[i].rSsid.u4SsidLen;
- INT_32 i4RSSI = prAdapter->rWlanInfo.arScanResult[i].rRssi;
- if (EQUAL_SSID(aucSsid, ucSsidLength, pParamSsid->aucSsid, pParamSsid->u4SsidLen) &&
- i4RSSI >= i4MaxRSSI) {
- i4Idx = (INT_32) i;
- i4MaxRSSI = i4RSSI;
- }
- }
- /* prepare message to AIS */
- if (prAdapter->rWifiVar.rConnSettings.eOPMode == NET_TYPE_IBSS
- || prAdapter->rWifiVar.rConnSettings.eOPMode == NET_TYPE_DEDICATED_IBSS) {
- /* IBSS *//* beacon period */
- prAdapter->rWifiVar.rConnSettings.u2BeaconPeriod = prAdapter->rWlanInfo.u2BeaconPeriod;
- prAdapter->rWifiVar.rConnSettings.u2AtimWindow = prAdapter->rWlanInfo.u2AtimWindow;
- }
- if (prAdapter->rWifiVar.fgSupportWZCDisassociation) {
- if (pParamSsid->u4SsidLen == ELEM_MAX_LEN_SSID) {
- fgIsValidSsid = FALSE;
- for (i = 0; i < ELEM_MAX_LEN_SSID; i++) {
- if (!((0 < pParamSsid->aucSsid[i]) && (pParamSsid->aucSsid[i] <= 0x1F))) {
- fgIsValidSsid = TRUE;
- break;
- }
- }
- }
- }
- /* Set Connection Request Issued Flag */
- if (fgIsValidSsid) {
- prAdapter->rWifiVar.rConnSettings.fgIsConnReqIssued = TRUE;
- if (pParamSsid->u4SsidLen) {
- prAdapter->rWifiVar.rConnSettings.eConnectionPolicy = CONNECT_BY_SSID_BEST_RSSI;
- } else {
- /* wildcard SSID */
- prAdapter->rWifiVar.rConnSettings.eConnectionPolicy = CONNECT_BY_SSID_ANY;
- }
- } else {
- prAdapter->rWifiVar.rConnSettings.fgIsConnReqIssued = FALSE;
- }
- /* Send AIS Abort Message */
- prAisAbortMsg = (P_MSG_AIS_ABORT_T) cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_AIS_ABORT_T));
- if (!prAisAbortMsg) {
- ASSERT(0);
- return WLAN_STATUS_FAILURE;
- }
- prAisAbortMsg->rMsgHdr.eMsgId = MID_OID_AIS_FSM_JOIN_REQ;
- prAisAbortMsg->ucReasonOfDisconnect = DISCONNECT_REASON_CODE_NEW_CONNECTION;
- COPY_SSID(prAdapter->rWifiVar.rConnSettings.aucSSID,
- prAdapter->rWifiVar.rConnSettings.ucSSIDLen, pParamSsid->aucSsid, (UINT_8) pParamSsid->u4SsidLen);
- prAdapter->rWifiVar.rConnSettings.u4FreqInKHz = pParamSsid->u4CenterFreq;
- if (EQUAL_SSID(prAdapter->rWlanInfo.rCurrBssId.rSsid.aucSsid,
- prAdapter->rWlanInfo.rCurrBssId.rSsid.u4SsidLen, pParamSsid->aucSsid, pParamSsid->u4SsidLen)) {
- prAisAbortMsg->fgDelayIndication = TRUE;
- } else {
- /* Update the information to CONNECTION_SETTINGS_T */
- prAisAbortMsg->fgDelayIndication = FALSE;
- }
- DBGLOG(SCN, INFO, "SSID %s\n", prAdapter->rWifiVar.rConnSettings.aucSSID);
- mboxSendMsg(prAdapter, MBOX_ID_0, (P_MSG_HDR_T) prAisAbortMsg, MSG_SEND_METHOD_BUF);
- return WLAN_STATUS_SUCCESS;
- } /* end of wlanoidSetSsid() */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to query the currently associated SSID.
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[in] pvQueryBuffer Pointer to the buffer that holds the result of
- * the query.
- * \param[in] u4QueryBufferLen The length of the query buffer.
- * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
- * bytes written into the query buffer. If the call
- * failed due to invalid length of the query buffer,
- * returns the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_INVALID_LENGTH
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidQuerySsid(IN P_ADAPTER_T prAdapter,
- OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
- {
- P_PARAM_SSID_T prAssociatedSsid;
- DEBUGFUNC("wlanoidQuerySsid");
- ASSERT(prAdapter);
- ASSERT(pu4QueryInfoLen);
- if (u4QueryBufferLen)
- ASSERT(pvQueryBuffer);
- *pu4QueryInfoLen = sizeof(PARAM_SSID_T);
- /* Check for query buffer length */
- if (u4QueryBufferLen < *pu4QueryInfoLen) {
- DBGLOG(OID, WARN, "Invalid length %u\n", u4QueryBufferLen);
- return WLAN_STATUS_INVALID_LENGTH;
- }
- prAssociatedSsid = (P_PARAM_SSID_T) pvQueryBuffer;
- kalMemZero(prAssociatedSsid->aucSsid, sizeof(prAssociatedSsid->aucSsid));
- if (kalGetMediaStateIndicated(prAdapter->prGlueInfo) == PARAM_MEDIA_STATE_CONNECTED) {
- prAssociatedSsid->u4SsidLen = prAdapter->rWlanInfo.rCurrBssId.rSsid.u4SsidLen;
- if (prAssociatedSsid->u4SsidLen) {
- kalMemCopy(prAssociatedSsid->aucSsid,
- prAdapter->rWlanInfo.rCurrBssId.rSsid.aucSsid, prAssociatedSsid->u4SsidLen);
- }
- } else {
- prAssociatedSsid->u4SsidLen = 0;
- DBGLOG(OID, TRACE, "Null SSID\n");
- }
- return WLAN_STATUS_SUCCESS;
- } /* wlanoidQuerySsid */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to query the current 802.11 network type.
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[in] pvQueryBuffer Pointer to the buffer that holds the result of
- * the query.
- * \param[in] u4QueryBufferLen The length of the query buffer.
- * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
- * bytes written into the query buffer. If the call
- * failed due to invalid length of the query buffer,
- * returns the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_BUFFER_TOO_SHORT
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidQueryInfrastructureMode(IN P_ADAPTER_T prAdapter,
- OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
- {
- DEBUGFUNC("wlanoidQueryInfrastructureMode");
- ASSERT(prAdapter);
- ASSERT(pu4QueryInfoLen);
- *pu4QueryInfoLen = sizeof(ENUM_PARAM_OP_MODE_T);
- if (u4QueryBufferLen < sizeof(ENUM_PARAM_OP_MODE_T))
- return WLAN_STATUS_BUFFER_TOO_SHORT;
- if (u4QueryBufferLen)
- ASSERT(pvQueryBuffer);
- *(P_ENUM_PARAM_OP_MODE_T) pvQueryBuffer = prAdapter->rWifiVar.rConnSettings.eOPMode;
- /*
- ** According to OID_802_11_INFRASTRUCTURE_MODE
- ** If there is no prior OID_802_11_INFRASTRUCTURE_MODE,
- ** NDIS_STATUS_ADAPTER_NOT_READY shall be returned.
- */
- #if DBG
- switch (*(P_ENUM_PARAM_OP_MODE_T) pvQueryBuffer) {
- case NET_TYPE_IBSS:
- DBGLOG(OID, INFO, "IBSS mode\n");
- break;
- case NET_TYPE_INFRA:
- DBGLOG(OID, INFO, "Infrastructure mode\n");
- break;
- default:
- DBGLOG(OID, INFO, "Automatic mode\n");
- }
- #endif
- return WLAN_STATUS_SUCCESS;
- } /* wlanoidQueryInfrastructureMode */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to set mode to infrastructure or
- * IBSS, or automatic switch between the two.
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[in] pvSetBuffer Pointer to the buffer that holds the data to be set.
- * \param[in] u4SetBufferLen The length of the set buffer.
- * \param[out] pu4SetInfoLen If the call is successful, returns the number of
- * bytes read from the set buffer. If the call failed due to invalid
- * length of the set buffer, returns the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_INVALID_DATA
- * \retval WLAN_STATUS_ADAPTER_NOT_READY
- * \retval WLAN_STATUS_INVALID_LENGTH
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidSetInfrastructureMode(IN P_ADAPTER_T prAdapter,
- IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- P_GLUE_INFO_T prGlueInfo;
- ENUM_PARAM_OP_MODE_T eOpMode;
- DEBUGFUNC("wlanoidSetInfrastructureMode");
- ASSERT(prAdapter);
- ASSERT(pvSetBuffer);
- ASSERT(pu4SetInfoLen);
- prGlueInfo = prAdapter->prGlueInfo;
- if (u4SetBufferLen < sizeof(ENUM_PARAM_OP_MODE_T))
- return WLAN_STATUS_BUFFER_TOO_SHORT;
- *pu4SetInfoLen = sizeof(ENUM_PARAM_OP_MODE_T);
- if (prAdapter->rAcpiState == ACPI_STATE_D3) {
- DBGLOG(OID, WARN, "Fail in set infrastructure mode! (Adapter not ready). ACPI=D%d, Radio=%d\n",
- prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
- return WLAN_STATUS_ADAPTER_NOT_READY;
- }
- eOpMode = *(P_ENUM_PARAM_OP_MODE_T) pvSetBuffer;
- /* Verify the new infrastructure mode. */
- if (eOpMode >= NET_TYPE_NUM) {
- DBGLOG(OID, TRACE, "Invalid mode value %d\n", eOpMode);
- return WLAN_STATUS_INVALID_DATA;
- }
- /* check if possible to switch to AdHoc mode */
- if (eOpMode == NET_TYPE_IBSS || eOpMode == NET_TYPE_DEDICATED_IBSS) {
- if (cnmAisIbssIsPermitted(prAdapter) == FALSE) {
- DBGLOG(OID, TRACE, "Mode value %d unallowed\n", eOpMode);
- return WLAN_STATUS_FAILURE;
- }
- }
- /* Save the new infrastructure mode setting. */
- prAdapter->rWifiVar.rConnSettings.eOPMode = eOpMode;
- /* Clean up the Tx key flag */
- prAdapter->rWifiVar.rAisSpecificBssInfo.fgTransmitKeyExist = FALSE;
- prAdapter->rWifiVar.rConnSettings.fgWapiMode = FALSE;
- #if CFG_SUPPORT_WAPI
- prAdapter->prGlueInfo->u2WapiAssocInfoIESz = 0;
- kalMemZero(&prAdapter->prGlueInfo->aucWapiAssocInfoIEs, 42);
- #endif
- #if CFG_SUPPORT_802_11W
- prAdapter->rWifiVar.rAisSpecificBssInfo.fgMgmtProtection = FALSE;
- prAdapter->rWifiVar.rAisSpecificBssInfo.fgBipKeyInstalled = FALSE;
- #endif
- #if CFG_SUPPORT_WPS2
- kalMemZero(&prAdapter->prGlueInfo->aucWSCAssocInfoIE, 200);
- prAdapter->prGlueInfo->u2WSCAssocInfoIELen = 0;
- #endif
- return wlanSendSetQueryCmd(prAdapter,
- CMD_ID_INFRASTRUCTURE,
- TRUE,
- FALSE,
- TRUE,
- nicCmdEventSetCommon, nicOidCmdTimeoutCommon, 0, NULL, pvSetBuffer, u4SetBufferLen);
- } /* wlanoidSetInfrastructureMode */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to query the current 802.11 authentication
- * mode.
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
- * the query.
- * \param[in] u4QueryBufferLen The length of the query buffer.
- * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
- * bytes written into the query buffer. If the call
- * failed due to invalid length of the query buffer,
- * returns the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_BUFFER_TOO_SHORT
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidQueryAuthMode(IN P_ADAPTER_T prAdapter,
- OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
- {
- DEBUGFUNC("wlanoidQueryAuthMode");
- ASSERT(prAdapter);
- if (u4QueryBufferLen)
- ASSERT(pvQueryBuffer);
- ASSERT(pu4QueryInfoLen);
- *pu4QueryInfoLen = sizeof(ENUM_PARAM_AUTH_MODE_T);
- if (u4QueryBufferLen < sizeof(ENUM_PARAM_AUTH_MODE_T))
- return WLAN_STATUS_BUFFER_TOO_SHORT;
- *(P_ENUM_PARAM_AUTH_MODE_T) pvQueryBuffer = prAdapter->rWifiVar.rConnSettings.eAuthMode;
- #if DBG
- switch (*(P_ENUM_PARAM_AUTH_MODE_T) pvQueryBuffer) {
- case AUTH_MODE_OPEN:
- DBGLOG(OID, INFO, "Current auth mode: Open\n");
- break;
- case AUTH_MODE_SHARED:
- DBGLOG(OID, INFO, "Current auth mode: Shared\n");
- break;
- case AUTH_MODE_AUTO_SWITCH:
- DBGLOG(OID, INFO, "Current auth mode: Auto-switch\n");
- break;
- case AUTH_MODE_WPA:
- DBGLOG(OID, INFO, "Current auth mode: WPA\n");
- break;
- case AUTH_MODE_WPA_PSK:
- DBGLOG(OID, INFO, "Current auth mode: WPA PSK\n");
- break;
- case AUTH_MODE_WPA_NONE:
- DBGLOG(OID, INFO, "Current auth mode: WPA None\n");
- break;
- case AUTH_MODE_WPA2:
- DBGLOG(OID, INFO, "Current auth mode: WPA2\n");
- break;
- case AUTH_MODE_WPA2_PSK:
- DBGLOG(OID, INFO, "Current auth mode: WPA2 PSK\n");
- break;
- default:
- DBGLOG(OID, INFO, "Current auth mode: %d\n", *(P_ENUM_PARAM_AUTH_MODE_T) pvQueryBuffer);
- break;
- }
- #endif
- return WLAN_STATUS_SUCCESS;
- } /* wlanoidQueryAuthMode */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to set the IEEE 802.11 authentication mode
- * to the driver.
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
- * \param[in] u4SetBufferLen The length of the set buffer.
- * \param[out] pu4SetInfoLen If the call is successful, returns the number of
- * bytes read from the set buffer. If the call failed
- * due to invalid length of the set buffer, returns
- * the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_INVALID_DATA
- * \retval WLAN_STATUS_INVALID_LENGTH
- * \retval WLAN_STATUS_ADAPTER_NOT_READY
- * \retval WLAN_STATUS_NOT_ACCEPTED
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidSetAuthMode(IN P_ADAPTER_T prAdapter,
- IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- P_GLUE_INFO_T prGlueInfo;
- UINT_32 i, u4AkmSuite;
- P_DOT11_RSNA_CONFIG_AUTHENTICATION_SUITES_ENTRY prEntry;
- DEBUGFUNC("wlanoidSetAuthMode");
- ASSERT(prAdapter);
- ASSERT(pu4SetInfoLen);
- ASSERT(pvSetBuffer);
- prGlueInfo = prAdapter->prGlueInfo;
- *pu4SetInfoLen = sizeof(ENUM_PARAM_AUTH_MODE_T);
- if (u4SetBufferLen < sizeof(ENUM_PARAM_AUTH_MODE_T))
- return WLAN_STATUS_INVALID_LENGTH;
- /* RF Test */
- /* if (IS_ARB_IN_RFTEST_STATE(prAdapter)) { */
- /* return WLAN_STATUS_SUCCESS; */
- /* } */
- if (prAdapter->rAcpiState == ACPI_STATE_D3) {
- DBGLOG(OID, WARN, "Fail in set Authentication mode! (Adapter not ready). ACPI=D%d, Radio=%d\n",
- prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
- return WLAN_STATUS_ADAPTER_NOT_READY;
- }
- /* Check if the new authentication mode is valid. */
- if (*(P_ENUM_PARAM_AUTH_MODE_T) pvSetBuffer >= AUTH_MODE_NUM) {
- DBGLOG(OID, TRACE, "Invalid auth mode %d\n", *(P_ENUM_PARAM_AUTH_MODE_T) pvSetBuffer);
- return WLAN_STATUS_INVALID_DATA;
- }
- switch (*(P_ENUM_PARAM_AUTH_MODE_T) pvSetBuffer) {
- case AUTH_MODE_WPA:
- case AUTH_MODE_WPA_PSK:
- case AUTH_MODE_WPA2:
- case AUTH_MODE_WPA2_PSK:
- /* infrastructure mode only */
- if (prAdapter->rWifiVar.rConnSettings.eOPMode != NET_TYPE_INFRA)
- return WLAN_STATUS_NOT_ACCEPTED;
- break;
- case AUTH_MODE_WPA_NONE:
- /* ad hoc mode only */
- if (prAdapter->rWifiVar.rConnSettings.eOPMode != NET_TYPE_IBSS)
- return WLAN_STATUS_NOT_ACCEPTED;
- break;
- default:
- break;
- }
- /* Save the new authentication mode. */
- prAdapter->rWifiVar.rConnSettings.eAuthMode = *(P_ENUM_PARAM_AUTH_MODE_T) pvSetBuffer;
- #if DBG
- switch (prAdapter->rWifiVar.rConnSettings.eAuthMode) {
- case AUTH_MODE_OPEN:
- DBGLOG(RSN, TRACE, "New auth mode: open\n");
- break;
- case AUTH_MODE_SHARED:
- DBGLOG(RSN, TRACE, "New auth mode: shared\n");
- break;
- case AUTH_MODE_AUTO_SWITCH:
- DBGLOG(RSN, TRACE, "New auth mode: auto-switch\n");
- break;
- case AUTH_MODE_WPA:
- DBGLOG(RSN, TRACE, "New auth mode: WPA\n");
- break;
- case AUTH_MODE_WPA_PSK:
- DBGLOG(RSN, TRACE, "New auth mode: WPA PSK\n");
- break;
- case AUTH_MODE_WPA_NONE:
- DBGLOG(RSN, TRACE, "New auth mode: WPA None\n");
- break;
- case AUTH_MODE_WPA2:
- DBGLOG(RSN, TRACE, "New auth mode: WPA2\n");
- break;
- case AUTH_MODE_WPA2_PSK:
- DBGLOG(RSN, TRACE, "New auth mode: WPA2 PSK\n");
- break;
- default:
- DBGLOG(RSN, TRACE, "New auth mode: unknown (%d)\n", prAdapter->rWifiVar.rConnSettings.eAuthMode);
- }
- #endif
- if (prAdapter->rWifiVar.rConnSettings.eAuthMode >= AUTH_MODE_WPA) {
- switch (prAdapter->rWifiVar.rConnSettings.eAuthMode) {
- case AUTH_MODE_WPA:
- u4AkmSuite = WPA_AKM_SUITE_802_1X;
- break;
- case AUTH_MODE_WPA_PSK:
- u4AkmSuite = WPA_AKM_SUITE_PSK;
- break;
- case AUTH_MODE_WPA_NONE:
- u4AkmSuite = WPA_AKM_SUITE_NONE;
- break;
- case AUTH_MODE_WPA2:
- u4AkmSuite = RSN_AKM_SUITE_802_1X;
- break;
- case AUTH_MODE_WPA2_PSK:
- u4AkmSuite = RSN_AKM_SUITE_PSK;
- break;
- default:
- u4AkmSuite = 0;
- }
- } else {
- u4AkmSuite = 0;
- }
- /* Enable the specific AKM suite only. */
- for (i = 0; i < MAX_NUM_SUPPORTED_AKM_SUITES; i++) {
- prEntry = &prAdapter->rMib.dot11RSNAConfigAuthenticationSuitesTable[i];
- if (prEntry->dot11RSNAConfigAuthenticationSuite == u4AkmSuite)
- prEntry->dot11RSNAConfigAuthenticationSuiteEnabled = TRUE;
- else
- prEntry->dot11RSNAConfigAuthenticationSuiteEnabled = FALSE;
- #if CFG_SUPPORT_802_11W
- if (kalGetMfpSetting(prAdapter->prGlueInfo) != RSN_AUTH_MFP_DISABLED) {
- if ((u4AkmSuite == RSN_AKM_SUITE_PSK) &&
- prEntry->dot11RSNAConfigAuthenticationSuite == RSN_AKM_SUITE_PSK_SHA256) {
- DBGLOG(RSN, TRACE, "Enable RSN_AKM_SUITE_PSK_SHA256 AKM support\n");
- prEntry->dot11RSNAConfigAuthenticationSuiteEnabled = TRUE;
- }
- if ((u4AkmSuite == RSN_AKM_SUITE_802_1X) &&
- prEntry->dot11RSNAConfigAuthenticationSuite == RSN_AKM_SUITE_802_1X_SHA256) {
- DBGLOG(RSN, TRACE, "Enable RSN_AKM_SUITE_802_1X_SHA256 AKM support\n");
- prEntry->dot11RSNAConfigAuthenticationSuiteEnabled = TRUE;
- }
- }
- #endif
- }
- return WLAN_STATUS_SUCCESS;
- } /* wlanoidSetAuthMode */
- #if 0
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to query the current 802.11 privacy filter
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
- * the query.
- * \param[in] u4QueryBufferLen The length of the query buffer.
- * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
- * bytes written into the query buffer. If the call
- * failed due to invalid length of the query buffer,
- * returns the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_BUFFER_TOO_SHORT
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidQueryPrivacyFilter(IN P_ADAPTER_T prAdapter,
- OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
- {
- DEBUGFUNC("wlanoidQueryPrivacyFilter");
- ASSERT(prAdapter);
- ASSERT(pvQueryBuffer);
- ASSERT(pu4QueryInfoLen);
- *pu4QueryInfoLen = sizeof(ENUM_PARAM_PRIVACY_FILTER_T);
- if (u4QueryBufferLen < sizeof(ENUM_PARAM_PRIVACY_FILTER_T))
- return WLAN_STATUS_BUFFER_TOO_SHORT;
- *(P_ENUM_PARAM_PRIVACY_FILTER_T) pvQueryBuffer = prAdapter->rWlanInfo.ePrivacyFilter;
- #if DBG
- switch (*(P_ENUM_PARAM_PRIVACY_FILTER_T) pvQueryBuffer) {
- case PRIVACY_FILTER_ACCEPT_ALL:
- DBGLOG(OID, INFO, "Current privacy mode: open mode\n");
- break;
- case PRIVACY_FILTER_8021xWEP:
- DBGLOG(OID, INFO, "Current privacy mode: filtering mode\n");
- break;
- default:
- DBGLOG(OID, INFO, "Current auth mode: %d\n", *(P_ENUM_PARAM_AUTH_MODE_T) pvQueryBuffer);
- }
- #endif
- return WLAN_STATUS_SUCCESS;
- } /* wlanoidQueryPrivacyFilter */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to set the IEEE 802.11 privacy filter
- * to the driver.
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
- * \param[in] u4SetBufferLen The length of the set buffer.
- * \param[out] pu4SetInfoLen If the call is successful, returns the number of
- * bytes read from the set buffer. If the call failed
- * due to invalid length of the set buffer, returns
- * the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_INVALID_DATA
- * \retval WLAN_STATUS_INVALID_LENGTH
- * \retval WLAN_STATUS_ADAPTER_NOT_READY
- * \retval WLAN_STATUS_NOT_ACCEPTED
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidSetPrivacyFilter(IN P_ADAPTER_T prAdapter,
- IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- P_GLUE_INFO_T prGlueInfo;
- DEBUGFUNC("wlanoidSetPrivacyFilter");
- ASSERT(prAdapter);
- ASSERT(pu4SetInfoLen);
- ASSERT(pvSetBuffer);
- prGlueInfo = prAdapter->prGlueInfo;
- *pu4SetInfoLen = sizeof(ENUM_PARAM_PRIVACY_FILTER_T);
- if (u4SetBufferLen < sizeof(ENUM_PARAM_PRIVACY_FILTER_T))
- return WLAN_STATUS_INVALID_LENGTH;
- if (prAdapter->rAcpiState == ACPI_STATE_D3) {
- DBGLOG(OID, WARN, "Fail in set Authentication mode! (Adapter not ready). ACPI=D%d, Radio=%d\n",
- prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
- return WLAN_STATUS_ADAPTER_NOT_READY;
- }
- /* Check if the new authentication mode is valid. */
- if (*(P_ENUM_PARAM_PRIVACY_FILTER_T) pvSetBuffer >= PRIVACY_FILTER_NUM) {
- DBGLOG(OID, TRACE, "Invalid privacy filter %d\n", *(P_ENUM_PARAM_PRIVACY_FILTER_T) pvSetBuffer);
- return WLAN_STATUS_INVALID_DATA;
- }
- switch (*(P_ENUM_PARAM_PRIVACY_FILTER_T) pvSetBuffer) {
- default:
- break;
- }
- /* Save the new authentication mode. */
- prAdapter->rWlanInfo.ePrivacyFilter = *(ENUM_PARAM_PRIVACY_FILTER_T) pvSetBuffer;
- return WLAN_STATUS_SUCCESS;
- } /* wlanoidSetPrivacyFilter */
- #endif
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to reload the available default settings for
- * the specified type field.
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
- * \param[in] u4SetBufferLen The length of the set buffer.
- * \param[out] pu4SetInfoLen If the call is successful, returns the number of
- * bytes read from the set buffer. If the call failed
- * due to invalid length of the set buffer, returns
- * the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_ADAPTER_NOT_READY
- * \retval WLAN_STATUS_INVALID_DATA
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidSetReloadDefaults(IN P_ADAPTER_T prAdapter,
- IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
- ENUM_PARAM_NETWORK_TYPE_T eNetworkType;
- UINT_32 u4Len;
- UINT_8 ucCmdSeqNum;
- DEBUGFUNC("wlanoidSetReloadDefaults");
- ASSERT(prAdapter);
- ASSERT(pu4SetInfoLen);
- *pu4SetInfoLen = sizeof(PARAM_RELOAD_DEFAULTS);
- /* if (IS_ARB_IN_RFTEST_STATE(prAdapter)) { */
- /* return WLAN_STATUS_SUCCESS; */
- /* } */
- if (prAdapter->rAcpiState == ACPI_STATE_D3) {
- DBGLOG(OID, WARN, "Fail in set Reload default! (Adapter not ready). ACPI=D%d, Radio=%d\n",
- prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
- return WLAN_STATUS_ADAPTER_NOT_READY;
- }
- ASSERT(pvSetBuffer);
- /* Verify the available reload options and reload the settings. */
- switch (*(P_PARAM_RELOAD_DEFAULTS) pvSetBuffer) {
- case ENUM_RELOAD_WEP_KEYS:
- /* Reload available default WEP keys from the permanent
- storage. */
- prAdapter->rWifiVar.rConnSettings.eAuthMode = AUTH_MODE_OPEN;
- /* ENUM_ENCRYPTION_DISABLED; */
- prAdapter->rWifiVar.rConnSettings.eEncStatus = ENUM_ENCRYPTION1_KEY_ABSENT;
- {
- P_GLUE_INFO_T prGlueInfo;
- P_CMD_INFO_T prCmdInfo;
- P_WIFI_CMD_T prWifiCmd;
- P_CMD_802_11_KEY prCmdKey;
- UINT_8 aucBCAddr[] = BC_MAC_ADDR;
- prGlueInfo = prAdapter->prGlueInfo;
- prCmdInfo = cmdBufAllocateCmdInfo(prAdapter, (CMD_HDR_SIZE + sizeof(CMD_802_11_KEY)));
- if (!prCmdInfo) {
- DBGLOG(OID, ERROR, "Allocate CMD_INFO_T ==> FAILED.\n");
- return WLAN_STATUS_FAILURE;
- }
- /* increase command sequence number */
- ucCmdSeqNum = nicIncreaseCmdSeqNum(prAdapter);
- /* compose CMD_802_11_KEY cmd pkt */
- prCmdInfo->eCmdType = COMMAND_TYPE_NETWORK_IOCTL;
- prCmdInfo->eNetworkType = NETWORK_TYPE_AIS_INDEX;
- prCmdInfo->u2InfoBufLen = CMD_HDR_SIZE + sizeof(CMD_802_11_KEY);
- prCmdInfo->pfCmdDoneHandler = nicCmdEventSetCommon;
- prCmdInfo->pfCmdTimeoutHandler = nicOidCmdTimeoutCommon;
- prCmdInfo->fgIsOid = TRUE;
- prCmdInfo->ucCID = CMD_ID_ADD_REMOVE_KEY;
- prCmdInfo->fgSetQuery = TRUE;
- prCmdInfo->fgNeedResp = FALSE;
- prCmdInfo->fgDriverDomainMCR = FALSE;
- prCmdInfo->ucCmdSeqNum = ucCmdSeqNum;
- prCmdInfo->u4SetInfoLen = sizeof(PARAM_REMOVE_KEY_T);
- prCmdInfo->pvInformationBuffer = pvSetBuffer;
- prCmdInfo->u4InformationBufferLength = u4SetBufferLen;
- /* Setup WIFI_CMD_T */
- prWifiCmd = (P_WIFI_CMD_T) (prCmdInfo->pucInfoBuffer);
- prWifiCmd->u2TxByteCount_UserPriority = prCmdInfo->u2InfoBufLen;
- prWifiCmd->ucCID = prCmdInfo->ucCID;
- prWifiCmd->ucSetQuery = prCmdInfo->fgSetQuery;
- prWifiCmd->ucSeqNum = prCmdInfo->ucCmdSeqNum;
- prCmdKey = (P_CMD_802_11_KEY) (prWifiCmd->aucBuffer);
- kalMemZero((PUINT_8) prCmdKey, sizeof(CMD_802_11_KEY));
- prCmdKey->ucAddRemove = 0; /* Remove */
- prCmdKey->ucKeyId = 0; /* (UINT_8)(prRemovedKey->u4KeyIndex & 0x000000ff); */
- kalMemCopy(prCmdKey->aucPeerAddr, aucBCAddr, MAC_ADDR_LEN);
- ASSERT(prCmdKey->ucKeyId < MAX_KEY_NUM);
- prCmdKey->ucKeyType = 0;
- /* insert into prCmdQueue */
- kalEnqueueCommand(prGlueInfo, (P_QUE_ENTRY_T) prCmdInfo);
- /* wakeup txServiceThread later */
- GLUE_SET_EVENT(prGlueInfo);
- return WLAN_STATUS_PENDING;
- }
- break;
- default:
- DBGLOG(OID, TRACE, "Invalid reload option %d\n", *(P_PARAM_RELOAD_DEFAULTS) pvSetBuffer);
- rStatus = WLAN_STATUS_INVALID_DATA;
- }
- /* OID_802_11_RELOAD_DEFAULTS requiest to reset to auto mode */
- eNetworkType = PARAM_NETWORK_TYPE_AUTOMODE;
- wlanoidSetNetworkTypeInUse(prAdapter, &eNetworkType, sizeof(eNetworkType), &u4Len);
- return rStatus;
- } /* wlanoidSetReloadDefaults */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to set a WEP key to the driver.
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
- * \param[in] u4SetBufferLen The length of the set buffer.
- * \param[out] pu4SetInfoLen If the call is successful, returns the number of
- * bytes read from the set buffer. If the call failed
- * due to invalid length of the set buffer, returns
- * the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_INVALID_LENGTH
- * \retval WLAN_STATUS_INVALID_DATA
- * \retval WLAN_STATUS_ADAPTER_NOT_READY
- * \retval WLAN_STATUS_BUFFER_TOO_SHORT
- */
- /*----------------------------------------------------------------------------*/
- #ifdef LINUX
- UINT_8 keyBuffer[sizeof(PARAM_KEY_T) + 16 /* LEGACY_KEY_MAX_LEN */];
- UINT_8 aucBCAddr[] = BC_MAC_ADDR;
- #endif
- WLAN_STATUS
- wlanoidSetAddWep(IN P_ADAPTER_T prAdapter, IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- #ifndef LINUX
- UINT_8 keyBuffer[sizeof(PARAM_KEY_T) + 16 /* LEGACY_KEY_MAX_LEN */];
- UINT_8 aucBCAddr[] = BC_MAC_ADDR;
- #endif
- P_PARAM_WEP_T prNewWepKey;
- P_PARAM_KEY_T prParamKey = (P_PARAM_KEY_T) keyBuffer;
- UINT_32 u4KeyId, u4SetLen;
- DEBUGFUNC("wlanoidSetAddWep");
- ASSERT(prAdapter);
- *pu4SetInfoLen = OFFSET_OF(PARAM_WEP_T, aucKeyMaterial);
- if (u4SetBufferLen < OFFSET_OF(PARAM_WEP_T, aucKeyMaterial)) {
- ASSERT(pu4SetInfoLen);
- return WLAN_STATUS_BUFFER_TOO_SHORT;
- }
- ASSERT(pvSetBuffer);
- ASSERT(pu4SetInfoLen);
- if (prAdapter->rAcpiState == ACPI_STATE_D3) {
- DBGLOG(OID, WARN, "Fail in set add WEP! (Adapter not ready). ACPI=D%d, Radio=%d\n",
- prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
- return WLAN_STATUS_ADAPTER_NOT_READY;
- }
- prNewWepKey = (P_PARAM_WEP_T) pvSetBuffer;
- /* Verify the total buffer for minimum length. */
- if (u4SetBufferLen < OFFSET_OF(PARAM_WEP_T, aucKeyMaterial) + prNewWepKey->u4KeyLength) {
- DBGLOG(OID, WARN, "Invalid total buffer length (%d) than minimum length (%d)\n",
- (UINT_8) u4SetBufferLen, (UINT_8) OFFSET_OF(PARAM_WEP_T, aucKeyMaterial));
- *pu4SetInfoLen = OFFSET_OF(PARAM_WEP_T, aucKeyMaterial);
- return WLAN_STATUS_INVALID_DATA;
- }
- /* Verify the key structure length. */
- if (prNewWepKey->u4Length > u4SetBufferLen) {
- DBGLOG(OID, WARN, "Invalid key structure length (%d) greater than total buffer length (%d)\n",
- (UINT_8) prNewWepKey->u4Length, (UINT_8) u4SetBufferLen);
- *pu4SetInfoLen = u4SetBufferLen;
- return WLAN_STATUS_INVALID_DATA;
- }
- /* Verify the key material length for maximum key material length:16 */
- if (prNewWepKey->u4KeyLength > 16 /* LEGACY_KEY_MAX_LEN */) {
- DBGLOG(OID, WARN, "Invalid key material length (%d) greater than maximum key material length (16)\n",
- (UINT_8) prNewWepKey->u4KeyLength);
- *pu4SetInfoLen = u4SetBufferLen;
- return WLAN_STATUS_INVALID_DATA;
- }
- *pu4SetInfoLen = u4SetBufferLen;
- u4KeyId = prNewWepKey->u4KeyIndex & BITS(0, 29) /* WEP_KEY_ID_FIELD */;
- /* Verify whether key index is valid or not, current version
- driver support only 4 global WEP keys setting by this OID */
- if (u4KeyId > MAX_KEY_NUM - 1) {
- DBGLOG(OID, ERROR, "Error, invalid WEP key ID: %d\n", (UINT_8) u4KeyId);
- return WLAN_STATUS_INVALID_DATA;
- }
- prParamKey->u4KeyIndex = u4KeyId;
- /* Transmit key */
- if (prNewWepKey->u4KeyIndex & IS_TRANSMIT_KEY)
- prParamKey->u4KeyIndex |= IS_TRANSMIT_KEY;
- /* Per client key */
- if (prNewWepKey->u4KeyIndex & IS_UNICAST_KEY)
- prParamKey->u4KeyIndex |= IS_UNICAST_KEY;
- prParamKey->u4KeyLength = prNewWepKey->u4KeyLength;
- kalMemCopy(prParamKey->arBSSID, aucBCAddr, MAC_ADDR_LEN);
- kalMemCopy(prParamKey->aucKeyMaterial, prNewWepKey->aucKeyMaterial, prNewWepKey->u4KeyLength);
- prParamKey->u4Length = OFFSET_OF(PARAM_KEY_T, aucKeyMaterial) + prNewWepKey->u4KeyLength;
- wlanoidSetAddKey(prAdapter, (PVOID) prParamKey, prParamKey->u4Length, &u4SetLen);
- return WLAN_STATUS_PENDING;
- } /* wlanoidSetAddWep */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to request the driver to remove the WEP key
- * at the specified key index.
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
- * \param[in] u4SetBufferLen The length of the set buffer.
- * \param[out] pu4SetInfoLen If the call is successful, returns the number of
- * bytes read from the set buffer. If the call failed
- * due to invalid length of the set buffer, returns
- * the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_INVALID_DATA
- * \retval WLAN_STATUS_INVALID_LENGTH
- * \retval WLAN_STATUS_ADAPTER_NOT_READY
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidSetRemoveWep(IN P_ADAPTER_T prAdapter,
- IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- UINT_32 u4KeyId, u4SetLen;
- PARAM_REMOVE_KEY_T rRemoveKey;
- UINT_8 aucBCAddr[] = BC_MAC_ADDR;
- DEBUGFUNC("wlanoidSetRemoveWep");
- ASSERT(prAdapter);
- ASSERT(pu4SetInfoLen);
- *pu4SetInfoLen = sizeof(PARAM_KEY_INDEX);
- if (u4SetBufferLen < sizeof(PARAM_KEY_INDEX))
- return WLAN_STATUS_INVALID_LENGTH;
- ASSERT(pvSetBuffer);
- u4KeyId = *(PUINT_32) pvSetBuffer;
- /* Dump PARAM_WEP content. */
- DBGLOG(OID, INFO, "Set: Dump PARAM_KEY_INDEX content\n");
- DBGLOG(OID, INFO, "Index : 0x%08x\n", u4KeyId);
- if (prAdapter->rAcpiState == ACPI_STATE_D3) {
- DBGLOG(OID, WARN, "Fail in set remove WEP! (Adapter not ready). ACPI=D%d, Radio=%d\n",
- prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
- return WLAN_STATUS_ADAPTER_NOT_READY;
- }
- if (u4KeyId & IS_TRANSMIT_KEY) {
- /* Bit 31 should not be set */
- DBGLOG(OID, ERROR, "Invalid WEP key index: 0x%08x\n", u4KeyId);
- return WLAN_STATUS_INVALID_DATA;
- }
- u4KeyId &= BITS(0, 7);
- /* Verify whether key index is valid or not. Current version
- driver support only 4 global WEP keys. */
- if (u4KeyId > MAX_KEY_NUM - 1) {
- DBGLOG(OID, ERROR, "invalid WEP key ID %u\n", u4KeyId);
- return WLAN_STATUS_INVALID_DATA;
- }
- rRemoveKey.u4Length = sizeof(PARAM_REMOVE_KEY_T);
- rRemoveKey.u4KeyIndex = *(PUINT_32) pvSetBuffer;
- kalMemCopy(rRemoveKey.arBSSID, aucBCAddr, MAC_ADDR_LEN);
- wlanoidSetRemoveKey(prAdapter, (PVOID)&rRemoveKey, sizeof(PARAM_REMOVE_KEY_T), &u4SetLen);
- return WLAN_STATUS_PENDING;
- } /* wlanoidSetRemoveWep */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to set a key to the driver.
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
- * \param[in] u4SetBufferLen The length of the set buffer.
- * \param[out] pu4SetInfoLen If the call is successful, returns the number of
- * bytes read from the set buffer. If the call failed
- * due to invalid length of the set buffer, returns
- * the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_ADAPTER_NOT_READY
- * \retval WLAN_STATUS_INVALID_LENGTH
- * \retval WLAN_STATUS_INVALID_DATA
- *
- * \note The setting buffer PARAM_KEY_T, which is set by NDIS, is unpacked.
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- _wlanoidSetAddKey(IN P_ADAPTER_T prAdapter,
- IN PVOID pvSetBuffer,
- IN UINT_32 u4SetBufferLen, IN BOOLEAN fgIsOid, IN UINT_8 ucAlgorithmId, OUT PUINT_32 pu4SetInfoLen)
- {
- P_GLUE_INFO_T prGlueInfo;
- P_CMD_INFO_T prCmdInfo;
- P_WIFI_CMD_T prWifiCmd;
- P_PARAM_KEY_T prNewKey;
- P_CMD_802_11_KEY prCmdKey;
- UINT_8 ucCmdSeqNum;
- #if 0
- DEBUGFUNC("wlanoidSetAddKey");
- DBGLOG(OID, LOUD, "\n");
- ASSERT(prAdapter);
- ASSERT(pvSetBuffer);
- ASSERT(pu4SetInfoLen);
- if (prAdapter->rAcpiState == ACPI_STATE_D3) {
- DBGLOG(OID, WARN, "Fail in set add key! (Adapter not ready). ACPI=D%d, Radio=%d\n",
- prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
- return WLAN_STATUS_ADAPTER_NOT_READY;
- }
- #endif
- prNewKey = (P_PARAM_KEY_T) pvSetBuffer;
- #if 0
- /* Verify the key structure length. */
- if (prNewKey->u4Length > u4SetBufferLen) {
- DBGLOG(OID, WARN, "Invalid key structure length (%d) greater than total buffer length (%d)\n",
- (UINT_8) prNewKey->u4Length, (UINT_8) u4SetBufferLen);
- *pu4SetInfoLen = u4SetBufferLen;
- return WLAN_STATUS_INVALID_LENGTH;
- }
- /* Verify the key material length for key material buffer */
- if (prNewKey->u4KeyLength > prNewKey->u4Length - OFFSET_OF(PARAM_KEY_T, aucKeyMaterial)) {
- DBGLOG(OID, WARN, "Invalid key material length (%d)\n", (UINT_8) prNewKey->u4KeyLength);
- *pu4SetInfoLen = u4SetBufferLen;
- return WLAN_STATUS_INVALID_DATA;
- }
- /* Exception check */
- if (prNewKey->u4KeyIndex & 0x0fffff00)
- return WLAN_STATUS_INVALID_DATA;
- /* Exception check, pairwise key must with transmit bit enabled */
- if ((prNewKey->u4KeyIndex & BITS(30, 31)) == IS_UNICAST_KEY)
- return WLAN_STATUS_INVALID_DATA;
- if (!(prNewKey->u4KeyLength == WEP_40_LEN || prNewKey->u4KeyLength == WEP_104_LEN ||
- prNewKey->u4KeyLength == CCMP_KEY_LEN || prNewKey->u4KeyLength == TKIP_KEY_LEN)) {
- return WLAN_STATUS_INVALID_DATA;
- }
- /* Exception check, pairwise key must with transmit bit enabled */
- if ((prNewKey->u4KeyIndex & BITS(30, 31)) == BITS(30, 31)) {
- if (((prNewKey->u4KeyIndex & 0xff) != 0) ||
- ((prNewKey->arBSSID[0] == 0xff) && (prNewKey->arBSSID[1] == 0xff) && (prNewKey->arBSSID[2] == 0xff)
- && (prNewKey->arBSSID[3] == 0xff) && (prNewKey->arBSSID[4] == 0xff)
- && (prNewKey->arBSSID[5] == 0xff))) {
- return WLAN_STATUS_INVALID_DATA;
- }
- }
- *pu4SetInfoLen = u4SetBufferLen;
- #endif
- /* Dump PARAM_KEY content. */
- DBGLOG(OID, TRACE, "Set: PARAM_KEY Length: 0x%08x, Key Index: 0x%08x, Key Length: 0x%08x\n",
- prNewKey->u4Length, prNewKey->u4KeyIndex, prNewKey->u4KeyLength);
- DBGLOG(OID, TRACE, "BSSID:\n");
- DBGLOG_MEM8(OID, TRACE, prNewKey->arBSSID, sizeof(PARAM_MAC_ADDRESS));
- DBGLOG(OID, TRACE, "Key RSC:\n");
- DBGLOG_MEM8(OID, TRACE, &prNewKey->rKeyRSC, sizeof(PARAM_KEY_RSC));
- DBGLOG(OID, TRACE, "Key Material:\n");
- DBGLOG_MEM8(OID, TRACE, prNewKey->aucKeyMaterial, prNewKey->u4KeyLength);
- if (prAdapter->rWifiVar.rConnSettings.eAuthMode < AUTH_MODE_WPA) {
- /* Todo:: Store the legacy wep key for OID_802_11_RELOAD_DEFAULTS */
- /* Todo:: Nothing */
- }
- if (prNewKey->u4KeyIndex & IS_TRANSMIT_KEY)
- prAdapter->rWifiVar.rAisSpecificBssInfo.fgTransmitKeyExist = TRUE;
- prGlueInfo = prAdapter->prGlueInfo;
- prCmdInfo = cmdBufAllocateCmdInfo(prAdapter, (CMD_HDR_SIZE + sizeof(CMD_802_11_KEY)));
- if (!prCmdInfo) {
- DBGLOG(OID, ERROR, "Allocate CMD_INFO_T ==> FAILED.\n");
- return WLAN_STATUS_FAILURE;
- }
- /* increase command sequence number */
- ucCmdSeqNum = nicIncreaseCmdSeqNum(prAdapter);
- DBGLOG(OID, TRACE, "ucCmdSeqNum = %d\n", ucCmdSeqNum);
- /* compose CMD_802_11_KEY cmd pkt */
- prCmdInfo->eCmdType = COMMAND_TYPE_NETWORK_IOCTL;
- prCmdInfo->eNetworkType = NETWORK_TYPE_AIS_INDEX;
- prCmdInfo->u2InfoBufLen = CMD_HDR_SIZE + sizeof(CMD_802_11_KEY);
- prCmdInfo->pfCmdDoneHandler = nicCmdEventSetCommon;
- prCmdInfo->pfCmdTimeoutHandler = nicOidCmdTimeoutCommon;
- prCmdInfo->fgIsOid = fgIsOid;
- prCmdInfo->ucCID = CMD_ID_ADD_REMOVE_KEY;
- prCmdInfo->fgSetQuery = TRUE;
- prCmdInfo->fgNeedResp = FALSE;
- prCmdInfo->fgDriverDomainMCR = FALSE;
- prCmdInfo->ucCmdSeqNum = ucCmdSeqNum;
- prCmdInfo->u4SetInfoLen = u4SetBufferLen;
- prCmdInfo->pvInformationBuffer = pvSetBuffer;
- prCmdInfo->u4InformationBufferLength = u4SetBufferLen;
- /* Setup WIFI_CMD_T */
- prWifiCmd = (P_WIFI_CMD_T) (prCmdInfo->pucInfoBuffer);
- prWifiCmd->u2TxByteCount_UserPriority = prCmdInfo->u2InfoBufLen;
- prWifiCmd->ucCID = prCmdInfo->ucCID;
- prWifiCmd->ucSetQuery = prCmdInfo->fgSetQuery;
- prWifiCmd->ucSeqNum = prCmdInfo->ucCmdSeqNum;
- prCmdKey = (P_CMD_802_11_KEY) (prWifiCmd->aucBuffer);
- kalMemZero(prCmdKey, sizeof(CMD_802_11_KEY));
- prCmdKey->ucAddRemove = 1; /* Add */
- prCmdKey->ucTxKey = ((prNewKey->u4KeyIndex & IS_TRANSMIT_KEY) == IS_TRANSMIT_KEY) ? 1 : 0;
- prCmdKey->ucKeyType = ((prNewKey->u4KeyIndex & IS_UNICAST_KEY) == IS_UNICAST_KEY) ? 1 : 0;
- prCmdKey->ucIsAuthenticator = ((prNewKey->u4KeyIndex & IS_AUTHENTICATOR) == IS_AUTHENTICATOR) ? 1 : 0;
- kalMemCopy(prCmdKey->aucPeerAddr, (PUINT_8) prNewKey->arBSSID, MAC_ADDR_LEN);
- prCmdKey->ucNetType = 0; /* AIS */
- prCmdKey->ucKeyId = (UINT_8) (prNewKey->u4KeyIndex & 0xff);
- /* Note: adjust the key length for WPA-None */
- prCmdKey->ucKeyLen = (UINT_8) prNewKey->u4KeyLength;
- kalMemCopy(prCmdKey->aucKeyMaterial, (PUINT_8) prNewKey->aucKeyMaterial, prCmdKey->ucKeyLen);
- if (prNewKey->u4KeyLength == 5) {
- prCmdKey->ucAlgorithmId = CIPHER_SUITE_WEP40;
- } else if (prNewKey->u4KeyLength == 13) {
- prCmdKey->ucAlgorithmId = CIPHER_SUITE_WEP104;
- } else if (prNewKey->u4KeyLength == 16) {
- if ((ucAlgorithmId != CIPHER_SUITE_CCMP) &&
- (prAdapter->rWifiVar.rConnSettings.eAuthMode < AUTH_MODE_WPA))
- prCmdKey->ucAlgorithmId = CIPHER_SUITE_WEP128;
- else {
- #if CFG_SUPPORT_802_11W
- if (prCmdKey->ucKeyId >= 4) {
- prCmdKey->ucAlgorithmId = CIPHER_SUITE_BIP;
- P_AIS_SPECIFIC_BSS_INFO_T prAisSpecBssInfo;
- prAisSpecBssInfo = &prAdapter->rWifiVar.rAisSpecificBssInfo;
- prAisSpecBssInfo->fgBipKeyInstalled = TRUE;
- } else
- #endif
- prCmdKey->ucAlgorithmId = CIPHER_SUITE_CCMP;
- if (rsnCheckPmkidCandicate(prAdapter)) {
- P_AIS_SPECIFIC_BSS_INFO_T prAisSpecBssInfo;
- prAisSpecBssInfo = &prAdapter->rWifiVar.rAisSpecificBssInfo;
- DBGLOG(RSN, TRACE,
- "Add key: Prepare a timer to indicate candidate PMKID Candidate\n");
- cnmTimerStopTimer(prAdapter, &prAisSpecBssInfo->rPreauthenticationTimer);
- cnmTimerStartTimer(prAdapter, &prAisSpecBssInfo->rPreauthenticationTimer,
- SEC_TO_MSEC(WAIT_TIME_IND_PMKID_CANDICATE_SEC));
- }
- }
- } else if (prNewKey->u4KeyLength == 32) {
- if (prAdapter->rWifiVar.rConnSettings.eAuthMode == AUTH_MODE_WPA_NONE) {
- if (prAdapter->rWifiVar.rConnSettings.eEncStatus == ENUM_ENCRYPTION2_ENABLED)
- prCmdKey->ucAlgorithmId = CIPHER_SUITE_TKIP;
- else if (prAdapter->rWifiVar.rConnSettings.eEncStatus == ENUM_ENCRYPTION3_ENABLED) {
- prCmdKey->ucAlgorithmId = CIPHER_SUITE_CCMP;
- prCmdKey->ucKeyLen = CCMP_KEY_LEN;
- }
- } else
- prCmdKey->ucAlgorithmId = CIPHER_SUITE_TKIP;
- }
- DBGLOG(RSN, TRACE, "prCmdKey->ucAlgorithmId=%d, key len=%d\n",
- prCmdKey->ucAlgorithmId, (UINT32) prNewKey->u4KeyLength);
- /* insert into prCmdQueue */
- kalEnqueueCommand(prGlueInfo, (P_QUE_ENTRY_T) prCmdInfo);
- /* wakeup txServiceThread later */
- GLUE_SET_EVENT(prGlueInfo);
- return WLAN_STATUS_PENDING;
- }
- WLAN_STATUS
- wlanoidSetAddKey(IN P_ADAPTER_T prAdapter, IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- P_PARAM_KEY_T prNewKey;
- DEBUGFUNC("wlanoidSetAddKey");
- DBGLOG(OID, LOUD, "\n");
- ASSERT(prAdapter);
- ASSERT(pvSetBuffer);
- ASSERT(pu4SetInfoLen);
- if (prAdapter->rAcpiState == ACPI_STATE_D3) {
- DBGLOG(OID, WARN, "Fail in set add key! (Adapter not ready). ACPI=D%d, Radio=%d\n",
- prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
- return WLAN_STATUS_ADAPTER_NOT_READY;
- }
- prNewKey = (P_PARAM_KEY_T) pvSetBuffer;
- /* Verify the key structure length. */
- if (prNewKey->u4Length > u4SetBufferLen) {
- DBGLOG(OID, WARN, "Invalid key structure length (%d) greater than total buffer length (%d)\n",
- (UINT_8) prNewKey->u4Length, (UINT_8) u4SetBufferLen);
- *pu4SetInfoLen = u4SetBufferLen;
- return WLAN_STATUS_INVALID_LENGTH;
- }
- /* Verify the key material length for key material buffer */
- if (prNewKey->u4KeyLength > prNewKey->u4Length - OFFSET_OF(PARAM_KEY_T, aucKeyMaterial)) {
- DBGLOG(OID, WARN, "Invalid key material length (%d)\n", (UINT_8) prNewKey->u4KeyLength);
- *pu4SetInfoLen = u4SetBufferLen;
- return WLAN_STATUS_INVALID_DATA;
- }
- /* Exception check */
- if (prNewKey->u4KeyIndex & 0x0fffff00)
- return WLAN_STATUS_INVALID_DATA;
- /* Exception check, pairwise key must with transmit bit enabled */
- if ((prNewKey->u4KeyIndex & BITS(30, 31)) == BITS(30, 31)) {
- if (((prNewKey->u4KeyLength == CCMP_KEY_LEN || prNewKey->u4KeyLength == TKIP_KEY_LEN) &&
- (prNewKey->u4KeyIndex & 0xff) != 0) ||
- EQUAL_MAC_ADDR(prNewKey->arBSSID, "\xff\xff\xff\xff\xff\xff")) {
- return WLAN_STATUS_INVALID_DATA;
- }
- } else if ((prNewKey->u4KeyIndex & BITS(30, 31)) == IS_UNICAST_KEY)
- return WLAN_STATUS_INVALID_DATA;
- if (!(prNewKey->u4KeyLength == WEP_40_LEN || prNewKey->u4KeyLength == WEP_104_LEN ||
- prNewKey->u4KeyLength == CCMP_KEY_LEN || prNewKey->u4KeyLength == TKIP_KEY_LEN)) {
- return WLAN_STATUS_INVALID_DATA;
- }
- *pu4SetInfoLen = u4SetBufferLen;
- #if (CFG_SUPPORT_TDLS == 1)
- /*
- supplicant will set key before updating station & enabling the link so we need to
- backup the key information and set key when link is enabled
- */
- if (TdlsexKeyHandle(prAdapter, prNewKey) == TDLS_STATUS_SUCCESS)
- return WLAN_STATUS_SUCCESS;
- #endif /* CFG_SUPPORT_TDLS */
- return _wlanoidSetAddKey(prAdapter, pvSetBuffer, u4SetBufferLen, TRUE, CIPHER_SUITE_NONE, pu4SetInfoLen);
- } /* wlanoidSetAddKey */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to request the driver to remove the key at
- * the specified key index.
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
- * \param[in] u4SetBufferLen The length of the set buffer.
- * \param[out] pu4SetInfoLen If the call is successful, returns the number of
- * bytes read from the set buffer. If the call failed
- * due to invalid length of the set buffer, returns
- * the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_INVALID_DATA
- * \retval WLAN_STATUS_INVALID_LENGTH
- * \retval WLAN_STATUS_ADAPTER_NOT_READY
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidSetRemoveKey(IN P_ADAPTER_T prAdapter,
- IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- P_GLUE_INFO_T prGlueInfo;
- P_CMD_INFO_T prCmdInfo;
- P_WIFI_CMD_T prWifiCmd;
- P_PARAM_REMOVE_KEY_T prRemovedKey;
- P_CMD_802_11_KEY prCmdKey;
- UINT_8 ucCmdSeqNum;
- DEBUGFUNC("wlanoidSetRemoveKey");
- ASSERT(prAdapter);
- ASSERT(pu4SetInfoLen);
- *pu4SetInfoLen = sizeof(PARAM_REMOVE_KEY_T);
- if (u4SetBufferLen < sizeof(PARAM_REMOVE_KEY_T))
- return WLAN_STATUS_INVALID_LENGTH;
- if (prAdapter->rAcpiState == ACPI_STATE_D3) {
- DBGLOG(OID, WARN, "Fail in set remove key! (Adapter not ready). ACPI=D%d, Radio=%d\n",
- prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
- return WLAN_STATUS_ADAPTER_NOT_READY;
- }
- ASSERT(pvSetBuffer);
- prRemovedKey = (P_PARAM_REMOVE_KEY_T) pvSetBuffer;
- /* Dump PARAM_REMOVE_KEY content. */
- DBGLOG(OID, TRACE, "Set: Dump PARAM_REMOVE_KEY content\n");
- DBGLOG(OID, TRACE, "Length : 0x%08x\n", prRemovedKey->u4Length);
- DBGLOG(OID, TRACE, "Key Index : 0x%08x\n", prRemovedKey->u4KeyIndex);
- DBGLOG(OID, TRACE, "BSSID:\n");
- DBGLOG_MEM8(OID, TRACE, prRemovedKey->arBSSID, MAC_ADDR_LEN);
- /* Check bit 31: this bit should always 0 */
- if (prRemovedKey->u4KeyIndex & IS_TRANSMIT_KEY) {
- /* Bit 31 should not be set */
- DBGLOG(OID, ERROR, "invalid key index: 0x%08x\n", prRemovedKey->u4KeyIndex);
- return WLAN_STATUS_INVALID_DATA;
- }
- /* Check bits 8 ~ 29 should always be 0 */
- if (prRemovedKey->u4KeyIndex & BITS(8, 29)) {
- /* Bit 31 should not be set */
- DBGLOG(OID, ERROR, "invalid key index: 0x%08x\n", prRemovedKey->u4KeyIndex);
- return WLAN_STATUS_INVALID_DATA;
- }
- /* Clean up the Tx key flag */
- if (prRemovedKey->u4KeyIndex & IS_UNICAST_KEY)
- prAdapter->rWifiVar.rAisSpecificBssInfo.fgTransmitKeyExist = FALSE;
- prGlueInfo = prAdapter->prGlueInfo;
- prCmdInfo = cmdBufAllocateCmdInfo(prAdapter, (CMD_HDR_SIZE + sizeof(CMD_802_11_KEY)));
- if (!prCmdInfo) {
- DBGLOG(OID, ERROR, "Allocate CMD_INFO_T ==> FAILED.\n");
- return WLAN_STATUS_FAILURE;
- }
- /* increase command sequence number */
- ucCmdSeqNum = nicIncreaseCmdSeqNum(prAdapter);
- /* compose CMD_802_11_KEY cmd pkt */
- prCmdInfo->eCmdType = COMMAND_TYPE_NETWORK_IOCTL;
- prCmdInfo->eNetworkType = NETWORK_TYPE_AIS_INDEX;
- prCmdInfo->u2InfoBufLen = CMD_HDR_SIZE + sizeof(CMD_802_11_KEY);
- prCmdInfo->pfCmdDoneHandler = nicCmdEventSetCommon;
- prCmdInfo->pfCmdTimeoutHandler = nicOidCmdTimeoutCommon;
- prCmdInfo->fgIsOid = TRUE;
- prCmdInfo->ucCID = CMD_ID_ADD_REMOVE_KEY;
- prCmdInfo->fgSetQuery = TRUE;
- prCmdInfo->fgNeedResp = FALSE;
- prCmdInfo->fgDriverDomainMCR = FALSE;
- prCmdInfo->ucCmdSeqNum = ucCmdSeqNum;
- prCmdInfo->u4SetInfoLen = sizeof(PARAM_REMOVE_KEY_T);
- prCmdInfo->pvInformationBuffer = pvSetBuffer;
- prCmdInfo->u4InformationBufferLength = u4SetBufferLen;
- /* Setup WIFI_CMD_T */
- prWifiCmd = (P_WIFI_CMD_T) (prCmdInfo->pucInfoBuffer);
- prWifiCmd->u2TxByteCount_UserPriority = prCmdInfo->u2InfoBufLen;
- prWifiCmd->ucCID = prCmdInfo->ucCID;
- prWifiCmd->ucSetQuery = prCmdInfo->fgSetQuery;
- prWifiCmd->ucSeqNum = prCmdInfo->ucCmdSeqNum;
- prCmdKey = (P_CMD_802_11_KEY) (prWifiCmd->aucBuffer);
- kalMemZero((PUINT_8) prCmdKey, sizeof(CMD_802_11_KEY));
- prCmdKey->ucAddRemove = 0; /* Remove */
- prCmdKey->ucKeyId = (UINT_8) (prRemovedKey->u4KeyIndex & 0x000000ff);
- kalMemCopy(prCmdKey->aucPeerAddr, (PUINT_8) prRemovedKey->arBSSID, MAC_ADDR_LEN);
- #if CFG_SUPPORT_802_11W
- ASSERT(prCmdKey->ucKeyId < MAX_KEY_NUM + 2);
- #else
- /* ASSERT(prCmdKey->ucKeyId < MAX_KEY_NUM); */
- #endif
- if (prRemovedKey->u4KeyIndex & IS_UNICAST_KEY)
- prCmdKey->ucKeyType = 1;
- /* insert into prCmdQueue */
- kalEnqueueCommand(prGlueInfo, (P_QUE_ENTRY_T) prCmdInfo);
- /* wakeup txServiceThread later */
- GLUE_SET_EVENT(prGlueInfo);
- return WLAN_STATUS_PENDING;
- } /* wlanoidSetRemoveKey */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to query the current encryption status.
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
- * the query.
- * \param[in] u4QueryBufferLen The length of the query buffer.
- * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
- * bytes written into the query buffer. If the call
- * failed due to invalid length of the query buffer,
- * returns the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidQueryEncryptionStatus(IN P_ADAPTER_T prAdapter,
- IN PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
- {
- BOOLEAN fgTransmitKeyAvailable = TRUE;
- ENUM_PARAM_ENCRYPTION_STATUS_T eEncStatus = 0;
- DEBUGFUNC("wlanoidQueryEncryptionStatus");
- ASSERT(prAdapter);
- ASSERT(pu4QueryInfoLen);
- if (u4QueryBufferLen)
- ASSERT(pvQueryBuffer);
- *pu4QueryInfoLen = sizeof(ENUM_PARAM_ENCRYPTION_STATUS_T);
- fgTransmitKeyAvailable = prAdapter->rWifiVar.rAisSpecificBssInfo.fgTransmitKeyExist;
- switch (prAdapter->rWifiVar.rConnSettings.eEncStatus) {
- case ENUM_ENCRYPTION3_ENABLED:
- if (fgTransmitKeyAvailable)
- eEncStatus = ENUM_ENCRYPTION3_ENABLED;
- else
- eEncStatus = ENUM_ENCRYPTION3_KEY_ABSENT;
- break;
- case ENUM_ENCRYPTION2_ENABLED:
- if (fgTransmitKeyAvailable) {
- eEncStatus = ENUM_ENCRYPTION2_ENABLED;
- break;
- }
- eEncStatus = ENUM_ENCRYPTION2_KEY_ABSENT;
- break;
- case ENUM_ENCRYPTION1_ENABLED:
- if (fgTransmitKeyAvailable)
- eEncStatus = ENUM_ENCRYPTION1_ENABLED;
- else
- eEncStatus = ENUM_ENCRYPTION1_KEY_ABSENT;
- break;
- case ENUM_ENCRYPTION_DISABLED:
- eEncStatus = ENUM_ENCRYPTION_DISABLED;
- break;
- default:
- DBGLOG(OID, ERROR, "Unknown Encryption Status Setting:%d\n",
- prAdapter->rWifiVar.rConnSettings.eEncStatus);
- }
- #if DBG
- DBGLOG(OID, INFO,
- "Encryption status: %d Return:%d\n", prAdapter->rWifiVar.rConnSettings.eEncStatus, eEncStatus);
- #endif
- *(P_ENUM_PARAM_ENCRYPTION_STATUS_T) pvQueryBuffer = eEncStatus;
- return WLAN_STATUS_SUCCESS;
- } /* wlanoidQueryEncryptionStatus */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to set the encryption status to the driver.
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
- * \param[in] u4SetBufferLen The length of the set buffer.
- * \param[out] pu4SetInfoLen If the call is successful, returns the number of
- * bytes read from the set buffer. If the call failed
- * due to invalid length of the set buffer, returns
- * the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_ADAPTER_NOT_READY
- * \retval WLAN_STATUS_NOT_SUPPORTED
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidSetEncryptionStatus(IN P_ADAPTER_T prAdapter,
- IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- P_GLUE_INFO_T prGlueInfo;
- WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
- ENUM_PARAM_ENCRYPTION_STATUS_T eEewEncrypt;
- DEBUGFUNC("wlanoidSetEncryptionStatus");
- ASSERT(prAdapter);
- ASSERT(pvSetBuffer);
- ASSERT(pu4SetInfoLen);
- prGlueInfo = prAdapter->prGlueInfo;
- *pu4SetInfoLen = sizeof(ENUM_PARAM_ENCRYPTION_STATUS_T);
- /* if (IS_ARB_IN_RFTEST_STATE(prAdapter)) { */
- /* return WLAN_STATUS_SUCCESS; */
- /* } */
- if (prAdapter->rAcpiState == ACPI_STATE_D3) {
- DBGLOG(OID, WARN, "Fail in set encryption status! (Adapter not ready). ACPI=D%d, Radio=%d\n",
- prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
- return WLAN_STATUS_ADAPTER_NOT_READY;
- }
- eEewEncrypt = *(P_ENUM_PARAM_ENCRYPTION_STATUS_T) pvSetBuffer;
- DBGLOG(OID, TRACE, "ENCRYPTION_STATUS %d\n", eEewEncrypt);
- switch (eEewEncrypt) {
- case ENUM_ENCRYPTION_DISABLED: /* Disable WEP, TKIP, AES */
- DBGLOG(RSN, TRACE, "Disable Encryption\n");
- secSetCipherSuite(prAdapter, CIPHER_FLAG_WEP40 | CIPHER_FLAG_WEP104 | CIPHER_FLAG_WEP128);
- break;
- case ENUM_ENCRYPTION1_ENABLED: /* Enable WEP. Disable TKIP, AES */
- DBGLOG(RSN, TRACE, "Enable Encryption1\n");
- secSetCipherSuite(prAdapter, CIPHER_FLAG_WEP40 | CIPHER_FLAG_WEP104 | CIPHER_FLAG_WEP128);
- break;
- case ENUM_ENCRYPTION2_ENABLED: /* Enable WEP, TKIP. Disable AES */
- secSetCipherSuite(prAdapter,
- CIPHER_FLAG_WEP40 | CIPHER_FLAG_WEP104 | CIPHER_FLAG_WEP128 | CIPHER_FLAG_TKIP);
- DBGLOG(RSN, TRACE, "Enable Encryption2\n");
- break;
- case ENUM_ENCRYPTION3_ENABLED: /* Enable WEP, TKIP, AES */
- secSetCipherSuite(prAdapter,
- CIPHER_FLAG_WEP40 |
- CIPHER_FLAG_WEP104 | CIPHER_FLAG_WEP128 | CIPHER_FLAG_TKIP | CIPHER_FLAG_CCMP);
- DBGLOG(RSN, TRACE, "Enable Encryption3\n");
- break;
- default:
- DBGLOG(RSN, WARN, "Unacceptible encryption status: %d\n",
- *(P_ENUM_PARAM_ENCRYPTION_STATUS_T) pvSetBuffer);
- rStatus = WLAN_STATUS_NOT_SUPPORTED;
- }
- if (rStatus == WLAN_STATUS_SUCCESS) {
- /* Save the new encryption status. */
- prAdapter->rWifiVar.rConnSettings.eEncStatus = *(P_ENUM_PARAM_ENCRYPTION_STATUS_T) pvSetBuffer;
- DBGLOG(RSN, TRACE, "wlanoidSetEncryptionStatus to %d\n",
- prAdapter->rWifiVar.rConnSettings.eEncStatus);
- }
- return rStatus;
- } /* wlanoidSetEncryptionStatus */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to test the driver.
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
- * \param[in] u4SetBufferLen The length of the set buffer.
- * \param[out] pu4SetInfoLen If the call is successful, returns the number of
- * bytes read from the set buffer. If the call failed
- * due to invalid length of the set buffer, returns
- * the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_INVALID_LENGTH
- * \retval WLAN_STATUS_INVALID_DATA
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidSetTest(IN P_ADAPTER_T prAdapter, IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- P_PARAM_802_11_TEST_T prTest;
- PVOID pvTestData;
- PVOID pvStatusBuffer;
- UINT_32 u4StatusBufferSize;
- DEBUGFUNC("wlanoidSetTest");
- ASSERT(prAdapter);
- ASSERT(pu4SetInfoLen);
- ASSERT(pvSetBuffer);
- *pu4SetInfoLen = u4SetBufferLen;
- prTest = (P_PARAM_802_11_TEST_T) pvSetBuffer;
- DBGLOG(OID, TRACE, "Test - Type %u\n", prTest->u4Type);
- switch (prTest->u4Type) {
- case 1: /* Type 1: generate an authentication event */
- pvTestData = (PVOID) &prTest->u.AuthenticationEvent;
- pvStatusBuffer = (PVOID) prAdapter->aucIndicationEventBuffer;
- u4StatusBufferSize = prTest->u4Length - 8;
- if (u4StatusBufferSize > sizeof(PARAM_AUTH_EVENT_T)) {
- DBGLOG(OID, TRACE, "prTest->u4Length error %u\n", u4StatusBufferSize);
- ASSERT(FALSE);
- }
- break;
- case 2: /* Type 2: generate an RSSI status indication */
- pvTestData = (PVOID) &prTest->u.RssiTrigger;
- pvStatusBuffer = (PVOID) &prAdapter->rWlanInfo.rCurrBssId.rRssi;
- u4StatusBufferSize = sizeof(PARAM_RSSI);
- break;
- default:
- return WLAN_STATUS_INVALID_DATA;
- }
- ASSERT(u4StatusBufferSize <= 180);
- if (u4StatusBufferSize > 180)
- return WLAN_STATUS_INVALID_LENGTH;
- /* Get the contents of the StatusBuffer from the test structure. */
- kalMemCopy(pvStatusBuffer, pvTestData, u4StatusBufferSize);
- kalIndicateStatusAndComplete(prAdapter->prGlueInfo,
- WLAN_STATUS_MEDIA_SPECIFIC_INDICATION, pvStatusBuffer, u4StatusBufferSize);
- return WLAN_STATUS_SUCCESS;
- } /* wlanoidSetTest */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to query the driver's WPA2 status.
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
- * the query.
- * \param[in] u4QueryBufferLen The length of the query buffer.
- * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
- * bytes written into the query buffer. If the call
- * failed due to invalid length of the query buffer,
- * returns the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_INVALID_LENGTH
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidQueryCapability(IN P_ADAPTER_T prAdapter,
- OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
- {
- P_PARAM_CAPABILITY_T prCap;
- P_PARAM_AUTH_ENCRYPTION_T prAuthenticationEncryptionSupported;
- DEBUGFUNC("wlanoidQueryCapability");
- ASSERT(prAdapter);
- ASSERT(pu4QueryInfoLen);
- if (u4QueryBufferLen)
- ASSERT(pvQueryBuffer);
- *pu4QueryInfoLen = 4 * sizeof(UINT_32) + 14 * sizeof(PARAM_AUTH_ENCRYPTION_T);
- if (u4QueryBufferLen < *pu4QueryInfoLen)
- return WLAN_STATUS_INVALID_LENGTH;
- prCap = (P_PARAM_CAPABILITY_T) pvQueryBuffer;
- prCap->u4Length = *pu4QueryInfoLen;
- prCap->u4Version = 2; /* WPA2 */
- prCap->u4NoOfPMKIDs = CFG_MAX_PMKID_CACHE;
- prCap->u4NoOfAuthEncryptPairsSupported = 14;
- prAuthenticationEncryptionSupported = &prCap->arAuthenticationEncryptionSupported[0];
- /* fill 14 entries of supported settings */
- prAuthenticationEncryptionSupported[0].eAuthModeSupported = AUTH_MODE_OPEN;
- prAuthenticationEncryptionSupported[0].eEncryptStatusSupported = ENUM_ENCRYPTION_DISABLED;
- prAuthenticationEncryptionSupported[1].eAuthModeSupported = AUTH_MODE_OPEN;
- prAuthenticationEncryptionSupported[1].eEncryptStatusSupported = ENUM_ENCRYPTION1_ENABLED;
- prAuthenticationEncryptionSupported[2].eAuthModeSupported = AUTH_MODE_SHARED;
- prAuthenticationEncryptionSupported[2].eEncryptStatusSupported = ENUM_ENCRYPTION_DISABLED;
- prAuthenticationEncryptionSupported[3].eAuthModeSupported = AUTH_MODE_SHARED;
- prAuthenticationEncryptionSupported[3].eEncryptStatusSupported = ENUM_ENCRYPTION1_ENABLED;
- prAuthenticationEncryptionSupported[4].eAuthModeSupported = AUTH_MODE_WPA;
- prAuthenticationEncryptionSupported[4].eEncryptStatusSupported = ENUM_ENCRYPTION2_ENABLED;
- prAuthenticationEncryptionSupported[5].eAuthModeSupported = AUTH_MODE_WPA;
- prAuthenticationEncryptionSupported[5].eEncryptStatusSupported = ENUM_ENCRYPTION3_ENABLED;
- prAuthenticationEncryptionSupported[6].eAuthModeSupported = AUTH_MODE_WPA_PSK;
- prAuthenticationEncryptionSupported[6].eEncryptStatusSupported = ENUM_ENCRYPTION2_ENABLED;
- prAuthenticationEncryptionSupported[7].eAuthModeSupported = AUTH_MODE_WPA_PSK;
- prAuthenticationEncryptionSupported[7].eEncryptStatusSupported = ENUM_ENCRYPTION3_ENABLED;
- prAuthenticationEncryptionSupported[8].eAuthModeSupported = AUTH_MODE_WPA_NONE;
- prAuthenticationEncryptionSupported[8].eEncryptStatusSupported = ENUM_ENCRYPTION2_ENABLED;
- prAuthenticationEncryptionSupported[9].eAuthModeSupported = AUTH_MODE_WPA_NONE;
- prAuthenticationEncryptionSupported[9].eEncryptStatusSupported = ENUM_ENCRYPTION3_ENABLED;
- prAuthenticationEncryptionSupported[10].eAuthModeSupported = AUTH_MODE_WPA2;
- prAuthenticationEncryptionSupported[10].eEncryptStatusSupported = ENUM_ENCRYPTION2_ENABLED;
- prAuthenticationEncryptionSupported[11].eAuthModeSupported = AUTH_MODE_WPA2;
- prAuthenticationEncryptionSupported[11].eEncryptStatusSupported = ENUM_ENCRYPTION3_ENABLED;
- prAuthenticationEncryptionSupported[12].eAuthModeSupported = AUTH_MODE_WPA2_PSK;
- prAuthenticationEncryptionSupported[12].eEncryptStatusSupported = ENUM_ENCRYPTION2_ENABLED;
- prAuthenticationEncryptionSupported[13].eAuthModeSupported = AUTH_MODE_WPA2_PSK;
- prAuthenticationEncryptionSupported[13].eEncryptStatusSupported = ENUM_ENCRYPTION3_ENABLED;
- return WLAN_STATUS_SUCCESS;
- } /* wlanoidQueryCapability */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to query the PMKID in the PMK cache.
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
- * the query.
- * \param[in] u4QueryBufferLen The length of the query buffer.
- * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
- * bytes written into the query buffer. If the call
- * failed due to invalid length of the query buffer,
- * returns the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_INVALID_LENGTH
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidQueryPmkid(IN P_ADAPTER_T prAdapter,
- OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
- {
- UINT_32 i;
- P_PARAM_PMKID_T prPmkid;
- P_AIS_SPECIFIC_BSS_INFO_T prAisSpecBssInfo;
- DEBUGFUNC("wlanoidQueryPmkid");
- ASSERT(prAdapter);
- ASSERT(pu4QueryInfoLen);
- if (u4QueryBufferLen)
- ASSERT(pvQueryBuffer);
- prAisSpecBssInfo = &prAdapter->rWifiVar.rAisSpecificBssInfo;
- *pu4QueryInfoLen = OFFSET_OF(PARAM_PMKID_T, arBSSIDInfo) +
- prAisSpecBssInfo->u4PmkidCacheCount * sizeof(PARAM_BSSID_INFO_T);
- if (u4QueryBufferLen < *pu4QueryInfoLen)
- return WLAN_STATUS_INVALID_LENGTH;
- prPmkid = (P_PARAM_PMKID_T) pvQueryBuffer;
- prPmkid->u4Length = *pu4QueryInfoLen;
- prPmkid->u4BSSIDInfoCount = prAisSpecBssInfo->u4PmkidCacheCount;
- for (i = 0; i < prAisSpecBssInfo->u4PmkidCacheCount; i++) {
- kalMemCopy(prPmkid->arBSSIDInfo[i].arBSSID,
- prAisSpecBssInfo->arPmkidCache[i].rBssidInfo.arBSSID, sizeof(PARAM_MAC_ADDRESS));
- kalMemCopy(prPmkid->arBSSIDInfo[i].arPMKID,
- prAisSpecBssInfo->arPmkidCache[i].rBssidInfo.arPMKID, sizeof(PARAM_PMKID_VALUE));
- }
- return WLAN_STATUS_SUCCESS;
- } /* wlanoidQueryPmkid */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to set the PMKID to the PMK cache in the driver.
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
- * \param[in] u4SetBufferLen The length of the set buffer.
- * \param[out] pu4SetInfoLen If the call is successful, returns the number of
- * bytes read from the set buffer. If the call failed
- * due to invalid length of the set buffer, returns
- * the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_BUFFER_TOO_SHORT
- * \retval WLAN_STATUS_INVALID_DATA
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidSetPmkid(IN P_ADAPTER_T prAdapter, IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- UINT_32 i, j;
- P_PARAM_PMKID_T prPmkid;
- P_AIS_SPECIFIC_BSS_INFO_T prAisSpecBssInfo;
- DEBUGFUNC("wlanoidSetPmkid");
- ASSERT(prAdapter);
- ASSERT(pu4SetInfoLen);
- *pu4SetInfoLen = u4SetBufferLen;
- /* It's possibble BSSIDInfoCount is zero, because OS wishes to clean PMKID */
- if (u4SetBufferLen < OFFSET_OF(PARAM_PMKID_T, arBSSIDInfo))
- return WLAN_STATUS_BUFFER_TOO_SHORT;
- ASSERT(pvSetBuffer);
- prPmkid = (P_PARAM_PMKID_T) pvSetBuffer;
- if (u4SetBufferLen <
- ((prPmkid->u4BSSIDInfoCount * sizeof(PARAM_BSSID_INFO_T)) + OFFSET_OF(PARAM_PMKID_T, arBSSIDInfo)))
- return WLAN_STATUS_INVALID_DATA;
- if (prPmkid->u4BSSIDInfoCount > CFG_MAX_PMKID_CACHE)
- return WLAN_STATUS_INVALID_DATA;
- DBGLOG(OID, TRACE, "Count %u\n", prPmkid->u4BSSIDInfoCount);
- prAisSpecBssInfo = &prAdapter->rWifiVar.rAisSpecificBssInfo;
- /* This OID replace everything in the PMKID cache. */
- if (prPmkid->u4BSSIDInfoCount == 0) {
- prAisSpecBssInfo->u4PmkidCacheCount = 0;
- kalMemZero(prAisSpecBssInfo->arPmkidCache, sizeof(PMKID_ENTRY_T) * CFG_MAX_PMKID_CACHE);
- }
- if ((prAisSpecBssInfo->u4PmkidCacheCount + prPmkid->u4BSSIDInfoCount > CFG_MAX_PMKID_CACHE)) {
- prAisSpecBssInfo->u4PmkidCacheCount = 0;
- kalMemZero(prAisSpecBssInfo->arPmkidCache, sizeof(PMKID_ENTRY_T) * CFG_MAX_PMKID_CACHE);
- }
- /*
- The driver can only clear its PMKID cache whenever it make a media disconnect
- indication. Otherwise, it must change the PMKID cache only when set through this OID.
- */
- #if CFG_RSN_MIGRATION
- for (i = 0; i < prPmkid->u4BSSIDInfoCount; i++) {
- /* Search for desired BSSID. If desired BSSID is found,
- then set the PMKID */
- if (!rsnSearchPmkidEntry(prAdapter, (PUINT_8) prPmkid->arBSSIDInfo[i].arBSSID, &j)) {
- /* No entry found for the specified BSSID, so add one entry */
- if (prAisSpecBssInfo->u4PmkidCacheCount < CFG_MAX_PMKID_CACHE - 1) {
- j = prAisSpecBssInfo->u4PmkidCacheCount;
- kalMemCopy(prAisSpecBssInfo->arPmkidCache[j].rBssidInfo.arBSSID,
- prPmkid->arBSSIDInfo[i].arBSSID, sizeof(PARAM_MAC_ADDRESS));
- prAisSpecBssInfo->u4PmkidCacheCount++;
- } else {
- j = CFG_MAX_PMKID_CACHE;
- }
- }
- if (j < CFG_MAX_PMKID_CACHE) {
- kalMemCopy(prAisSpecBssInfo->arPmkidCache[j].rBssidInfo.arPMKID,
- prPmkid->arBSSIDInfo[i].arPMKID, sizeof(PARAM_PMKID_VALUE));
- DBGLOG(RSN, TRACE, "Add BSSID %pM idx=%d PMKID value %pM\n",
- (prAisSpecBssInfo->arPmkidCache[j].rBssidInfo.arBSSID), (UINT_32) j,
- (prAisSpecBssInfo->arPmkidCache[j].rBssidInfo.arPMKID));
- prAisSpecBssInfo->arPmkidCache[j].fgPmkidExist = TRUE;
- }
- }
- #endif
- return WLAN_STATUS_SUCCESS;
- } /* wlanoidSetPmkid */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to query the set of supported data rates that
- * the radio is capable of running
- *
- * \param[in] prAdapter Pointer to the Adapter structure
- * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
- * the query
- * \param[in] u4QueryBufferLen The length of the query buffer
- * \param[out] pu4QueryInfoLen If the call is successful, returns the number
- * of bytes written into the query buffer. If the
- * call failed due to invalid length of the query
- * buffer, returns the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_INVALID_LENGTH
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidQuerySupportedRates(IN P_ADAPTER_T prAdapter,
- OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
- {
- PARAM_RATES eRate = {
- /* BSSBasicRateSet for 802.11n Non-HT rates */
- 0x8C, /* 6M */
- 0x92, /* 9M */
- 0x98, /* 12M */
- 0xA4, /* 18M */
- 0xB0, /* 24M */
- 0xC8, /* 36M */
- 0xE0, /* 48M */
- 0xEC /* 54M */
- };
- DEBUGFUNC("wlanoidQuerySupportedRates");
- ASSERT(prAdapter);
- ASSERT(pu4QueryInfoLen);
- if (u4QueryBufferLen)
- ASSERT(pvQueryBuffer);
- *pu4QueryInfoLen = sizeof(PARAM_RATES_EX);
- if (u4QueryBufferLen < *pu4QueryInfoLen) {
- DBGLOG(OID, WARN, "Invalid length %u\n", u4QueryBufferLen);
- return WLAN_STATUS_INVALID_LENGTH;
- }
- kalMemCopy(pvQueryBuffer, (PVOID) &eRate, sizeof(PARAM_RATES));
- return WLAN_STATUS_SUCCESS;
- } /* end of wlanoidQuerySupportedRates() */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to query current desired rates.
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[in] pvQueryBuffer Pointer to the buffer that holds the result of
- * the query.
- * \param[in] u4QueryBufferLen The length of the query buffer.
- * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
- * bytes written into the query buffer. If the call
- * failed due to invalid length of the query buffer,
- * returns the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_INVALID_LENGTH
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidQueryDesiredRates(IN P_ADAPTER_T prAdapter,
- OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
- {
- DEBUGFUNC("wlanoidQueryDesiredRates");
- ASSERT(prAdapter);
- ASSERT(pu4QueryInfoLen);
- if (u4QueryBufferLen)
- ASSERT(pvQueryBuffer);
- *pu4QueryInfoLen = sizeof(PARAM_RATES_EX);
- if (u4QueryBufferLen < *pu4QueryInfoLen) {
- DBGLOG(OID, WARN, "Invalid length %u\n", u4QueryBufferLen);
- return WLAN_STATUS_INVALID_LENGTH;
- }
- kalMemCopy(pvQueryBuffer, (PVOID) &(prAdapter->rWlanInfo.eDesiredRates), sizeof(PARAM_RATES));
- return WLAN_STATUS_SUCCESS;
- } /* end of wlanoidQueryDesiredRates() */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to Set the desired rates.
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[in] pvSetBuffer Pointer to the buffer that holds the data to be set.
- * \param[in] u4SetBufferLen The length of the set buffer.
- * \param[out] pu4SetInfoLen If the call is successful, returns the number of
- * bytes read from the set buffer. If the call failed
- * due to invalid length of the set buffer, returns
- * the amount of storage needed.
- *
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_INVALID_LENGTH
- * \retval WLAN_STATUS_INVALID_DATA
- * \retval WLAN_STATUS_ADAPTER_NOT_READY
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidSetDesiredRates(IN P_ADAPTER_T prAdapter,
- IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- UINT_32 i;
- DEBUGFUNC("wlanoidSetDesiredRates");
- ASSERT(prAdapter);
- ASSERT(pvSetBuffer);
- ASSERT(pu4SetInfoLen);
- if (u4SetBufferLen < sizeof(PARAM_RATES)) {
- DBGLOG(OID, WARN, "Invalid length %u\n", u4SetBufferLen);
- return WLAN_STATUS_INVALID_LENGTH;
- }
- *pu4SetInfoLen = sizeof(PARAM_RATES);
- if (u4SetBufferLen < sizeof(PARAM_RATES))
- return WLAN_STATUS_INVALID_LENGTH;
- kalMemCopy((PVOID) &(prAdapter->rWlanInfo.eDesiredRates), pvSetBuffer, sizeof(PARAM_RATES));
- prAdapter->rWlanInfo.eLinkAttr.ucDesiredRateLen = PARAM_MAX_LEN_RATES;
- for (i = 0; i < PARAM_MAX_LEN_RATES; i++)
- prAdapter->rWlanInfo.eLinkAttr.u2DesiredRate[i] = (UINT_16) (prAdapter->rWlanInfo.eDesiredRates[i]);
- return wlanSendSetQueryCmd(prAdapter,
- CMD_ID_LINK_ATTRIB,
- TRUE,
- FALSE,
- TRUE,
- nicCmdEventSetCommon,
- nicOidCmdTimeoutCommon,
- sizeof(CMD_LINK_ATTRIB),
- (PUINT_8) &(prAdapter->rWlanInfo.eLinkAttr), pvSetBuffer, u4SetBufferLen);
- } /* end of wlanoidSetDesiredRates() */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to query the maximum frame size in bytes,
- * not including the header.
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
- * the query.
- * \param[in] u4QueryBufferLen The length of the query buffer.
- * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
- * bytes written into the query buffer. If the
- * call failed due to invalid length of the query
- * buffer, returns the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_INVALID_LENGTH
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidQueryMaxFrameSize(IN P_ADAPTER_T prAdapter,
- OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
- {
- DEBUGFUNC("wlanoidQueryMaxFrameSize");
- ASSERT(prAdapter);
- ASSERT(pu4QueryInfoLen);
- if (u4QueryBufferLen)
- ASSERT(pvQueryBuffer);
- if (u4QueryBufferLen < sizeof(UINT_32)) {
- *pu4QueryInfoLen = sizeof(UINT_32);
- return WLAN_STATUS_INVALID_LENGTH;
- }
- *(PUINT_32) pvQueryBuffer = ETHERNET_MAX_PKT_SZ - ETHERNET_HEADER_SZ;
- *pu4QueryInfoLen = sizeof(UINT_32);
- return WLAN_STATUS_SUCCESS;
- } /* wlanoidQueryMaxFrameSize */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to query the maximum total packet length
- * in bytes.
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
- * the query.
- * \param[in] u4QueryBufferLen The length of the query buffer.
- * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
- * bytes written into the query buffer. If the call
- * failed due to invalid length of the query buffer,
- * returns the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_INVALID_LENGTH
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidQueryMaxTotalSize(IN P_ADAPTER_T prAdapter,
- OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
- {
- DEBUGFUNC("wlanoidQueryMaxTotalSize");
- ASSERT(prAdapter);
- ASSERT(pu4QueryInfoLen);
- if (u4QueryBufferLen)
- ASSERT(pvQueryBuffer);
- if (u4QueryBufferLen < sizeof(UINT_32)) {
- *pu4QueryInfoLen = sizeof(UINT_32);
- return WLAN_STATUS_INVALID_LENGTH;
- }
- *(PUINT_32) pvQueryBuffer = ETHERNET_MAX_PKT_SZ;
- *pu4QueryInfoLen = sizeof(UINT_32);
- return WLAN_STATUS_SUCCESS;
- } /* wlanoidQueryMaxTotalSize */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to query the vendor ID of the NIC.
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
- * the query.
- * \param[in] u4QueryBufferLen The length of the query buffer.
- * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
- * bytes written into the query buffer. If the call
- * failed due to invalid length of the query buffer,
- * returns the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_INVALID_LENGTH
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidQueryVendorId(IN P_ADAPTER_T prAdapter,
- OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
- {
- #if DBG
- PUINT_8 cp;
- #endif
- DEBUGFUNC("wlanoidQueryVendorId");
- ASSERT(prAdapter);
- ASSERT(pu4QueryInfoLen);
- if (u4QueryBufferLen)
- ASSERT(pvQueryBuffer);
- if (u4QueryBufferLen < sizeof(UINT_32)) {
- *pu4QueryInfoLen = sizeof(UINT_32);
- return WLAN_STATUS_INVALID_LENGTH;
- }
- kalMemCopy(pvQueryBuffer, prAdapter->aucMacAddress, 3);
- *((PUINT_8) pvQueryBuffer + 3) = 1;
- *pu4QueryInfoLen = sizeof(UINT_32);
- #if DBG
- cp = (PUINT_8) pvQueryBuffer;
- DBGLOG(OID, LOUD, "Vendor ID=%02x-%02x-%02x-%02x\n", cp[0], cp[1], cp[2], cp[3]);
- #endif
- return WLAN_STATUS_SUCCESS;
- } /* wlanoidQueryVendorId */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to query the current RSSI value.
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[in] pvQueryBuffer Pointer to the buffer that holds the result of the query.
- * \param[in] u4QueryBufferLen The length of the query buffer.
- * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
- * bytes written into the query buffer. If the call failed due to invalid length of
- * the query buffer, returns the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_BUFFER_TOO_SHORT
- * \retval WLAN_STATUS_ADAPTER_NOT_READY
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidQueryRssi(IN P_ADAPTER_T prAdapter,
- OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
- {
- DEBUGFUNC("wlanoidQueryRssi");
- ASSERT(prAdapter);
- ASSERT(pu4QueryInfoLen);
- if (u4QueryBufferLen)
- ASSERT(pvQueryBuffer);
- *pu4QueryInfoLen = sizeof(PARAM_RSSI);
- /* Check for query buffer length */
- if (u4QueryBufferLen < *pu4QueryInfoLen) {
- DBGLOG(OID, WARN, "Too short length %u\n", u4QueryBufferLen);
- return WLAN_STATUS_BUFFER_TOO_SHORT;
- }
- if (kalGetMediaStateIndicated(prAdapter->prGlueInfo) == PARAM_MEDIA_STATE_DISCONNECTED) {
- return WLAN_STATUS_ADAPTER_NOT_READY;
- } else if (prAdapter->fgIsLinkQualityValid == TRUE &&
- (kalGetTimeTick() - prAdapter->rLinkQualityUpdateTime) <= CFG_LINK_QUALITY_VALID_PERIOD) {
- PARAM_RSSI rRssi;
- rRssi = (PARAM_RSSI) prAdapter->rLinkQuality.cRssi; /* ranged from (-128 ~ 30) in unit of dBm */
- if (rRssi > PARAM_WHQL_RSSI_MAX_DBM)
- rRssi = PARAM_WHQL_RSSI_MAX_DBM;
- else if (rRssi < PARAM_WHQL_RSSI_MIN_DBM)
- rRssi = PARAM_WHQL_RSSI_MIN_DBM;
- kalMemCopy(pvQueryBuffer, &rRssi, sizeof(PARAM_RSSI));
- return WLAN_STATUS_SUCCESS;
- }
- #ifdef LINUX
- return wlanSendSetQueryCmd(prAdapter,
- CMD_ID_GET_LINK_QUALITY,
- FALSE,
- TRUE,
- TRUE,
- nicCmdEventQueryLinkQuality,
- nicOidCmdTimeoutCommon,
- *pu4QueryInfoLen, pvQueryBuffer, pvQueryBuffer, u4QueryBufferLen);
- #else
- return wlanSendSetQueryCmd(prAdapter,
- CMD_ID_GET_LINK_QUALITY,
- FALSE,
- TRUE,
- TRUE,
- nicCmdEventQueryLinkQuality,
- nicOidCmdTimeoutCommon, 0, NULL, pvQueryBuffer, u4QueryBufferLen);
- #endif
- } /* end of wlanoidQueryRssi() */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to query the current RSSI trigger value.
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[in] pvQueryBuffer Pointer to the buffer that holds the result of the query.
- * \param[in] u4QueryBufferLen The length of the query buffer.
- * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
- * bytes written into the query buffer. If the call failed due to invalid length of
- * the query buffer, returns the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_BUFFER_TOO_SHORT
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidQueryRssiTrigger(IN P_ADAPTER_T prAdapter,
- OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
- {
- DEBUGFUNC("wlanoidQueryRssiTrigger");
- ASSERT(prAdapter);
- ASSERT(pu4QueryInfoLen);
- if (u4QueryBufferLen)
- ASSERT(pvQueryBuffer);
- if (prAdapter->rWlanInfo.eRssiTriggerType == ENUM_RSSI_TRIGGER_NONE)
- return WLAN_STATUS_ADAPTER_NOT_READY;
- *pu4QueryInfoLen = sizeof(PARAM_RSSI);
- /* Check for query buffer length */
- if (u4QueryBufferLen < *pu4QueryInfoLen) {
- DBGLOG(OID, WARN, "Too short length %u\n", u4QueryBufferLen);
- return WLAN_STATUS_BUFFER_TOO_SHORT;
- }
- *(PARAM_RSSI *) pvQueryBuffer = prAdapter->rWlanInfo.rRssiTriggerValue;
- DBGLOG(OID, INFO, "RSSI trigger: %d dBm\n", *(PARAM_RSSI *) pvQueryBuffer);
- return WLAN_STATUS_SUCCESS;
- } /* wlanoidQueryRssiTrigger */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to set a trigger value of the RSSI event.
- *
- * \param[in] prAdapter Pointer to the Adapter structure
- * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
- * \param[in] u4SetBufferLen The length of the set buffer.
- * \param[out] pu4SetInfoLen If the call is successful, returns the number of
- * bytes read from the set buffer. If the call failed
- * due to invalid length of the set buffer, returns the
- * amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- *
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidSetRssiTrigger(IN P_ADAPTER_T prAdapter,
- IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- PARAM_RSSI rRssiTriggerValue;
- DEBUGFUNC("wlanoidSetRssiTrigger");
- ASSERT(prAdapter);
- ASSERT(pvSetBuffer);
- ASSERT(pu4SetInfoLen);
- *pu4SetInfoLen = sizeof(PARAM_RSSI);
- rRssiTriggerValue = *(PARAM_RSSI *) pvSetBuffer;
- if (rRssiTriggerValue > PARAM_WHQL_RSSI_MAX_DBM || rRssiTriggerValue < PARAM_WHQL_RSSI_MIN_DBM)
- return
- /* Save the RSSI trigger value to the Adapter structure */
- prAdapter->rWlanInfo.rRssiTriggerValue = rRssiTriggerValue;
- /* If the RSSI trigger value is equal to the current RSSI value, the
- * indication triggers immediately. We need to indicate the protocol
- * that an RSSI status indication event triggers. */
- if (rRssiTriggerValue == (PARAM_RSSI) (prAdapter->rLinkQuality.cRssi)) {
- prAdapter->rWlanInfo.eRssiTriggerType = ENUM_RSSI_TRIGGER_TRIGGERED;
- kalIndicateStatusAndComplete(prAdapter->prGlueInfo,
- WLAN_STATUS_MEDIA_SPECIFIC_INDICATION,
- (PVOID) &prAdapter->rWlanInfo.rRssiTriggerValue, sizeof(PARAM_RSSI));
- } else if (rRssiTriggerValue < (PARAM_RSSI) (prAdapter->rLinkQuality.cRssi))
- prAdapter->rWlanInfo.eRssiTriggerType = ENUM_RSSI_TRIGGER_GREATER;
- else if (rRssiTriggerValue > (PARAM_RSSI) (prAdapter->rLinkQuality.cRssi))
- prAdapter->rWlanInfo.eRssiTriggerType = ENUM_RSSI_TRIGGER_LESS;
- return WLAN_STATUS_SUCCESS;
- } /* wlanoidSetRssiTrigger */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to set a suggested value for the number of
- * bytes of received packet data that will be indicated to the protocol
- * driver. We just accept the set and ignore this value.
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
- * \param[in] u4SetBufferLen The length of the set buffer.
- * \param[out] pu4SetInfoLen If the call is successful, returns the number of
- * bytes read from the set buffer. If the call failed
- * due to invalid length of the set buffer, returns
- * the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_INVALID_LENGTH
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidSetCurrentLookahead(IN P_ADAPTER_T prAdapter,
- IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- DEBUGFUNC("wlanoidSetCurrentLookahead");
- ASSERT(prAdapter);
- ASSERT(pvSetBuffer);
- ASSERT(pu4SetInfoLen);
- if (u4SetBufferLen < sizeof(UINT_32)) {
- *pu4SetInfoLen = sizeof(UINT_32);
- return WLAN_STATUS_INVALID_LENGTH;
- }
- *pu4SetInfoLen = sizeof(UINT_32);
- return WLAN_STATUS_SUCCESS;
- } /* wlanoidSetCurrentLookahead */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to query the number of frames that the driver
- * receives but does not indicate to the protocols due to errors.
- *
- * \param[in] pvAdapter Pointer to the Adapter structure.
- * \param[out] pvQueryBuf A pointer to the buffer that holds the result of
- * the query.
- * \param[in] u4QueryBufLen The length of the query buffer.
- * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
- * bytes written into the query buffer. If the call
- * failed due to invalid length of the query buffer,
- * returns the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_INVALID_LENGTH
- * \retval WLAN_STATUS_ADAPTER_NOT_READY
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidQueryRcvError(IN P_ADAPTER_T prAdapter,
- IN PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
- {
- DEBUGFUNC("wlanoidQueryRcvError");
- DBGLOG(OID, LOUD, "\n");
- ASSERT(prAdapter);
- if (u4QueryBufferLen)
- ASSERT(pvQueryBuffer);
- ASSERT(pu4QueryInfoLen);
- if (prAdapter->rAcpiState == ACPI_STATE_D3) {
- DBGLOG(OID, WARN, "Fail in query receive error! (Adapter not ready). ACPI=D%d, Radio=%d\n",
- prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
- *pu4QueryInfoLen = sizeof(UINT_32);
- return WLAN_STATUS_ADAPTER_NOT_READY;
- } else if (u4QueryBufferLen < sizeof(UINT_32)
- || (u4QueryBufferLen > sizeof(UINT_32) && u4QueryBufferLen < sizeof(UINT_64))) {
- *pu4QueryInfoLen = sizeof(UINT_64);
- return WLAN_STATUS_INVALID_LENGTH;
- }
- #if CFG_ENABLE_STATISTICS_BUFFERING
- if (IsBufferedStatisticsUsable(prAdapter) == TRUE) {
- /* @FIXME, RX_ERROR_DROP_COUNT/RX_FIFO_FULL_DROP_COUNT is not calculated */
- if (u4QueryBufferLen == sizeof(UINT_32)) {
- *pu4QueryInfoLen = sizeof(UINT_32);
- *(PUINT_32) pvQueryBuffer = (UINT_32) prAdapter->rStatStruct.rFCSErrorCount.QuadPart;
- } else {
- *pu4QueryInfoLen = sizeof(UINT_64);
- *(PUINT_64) pvQueryBuffer = (UINT_64) prAdapter->rStatStruct.rFCSErrorCount.QuadPart;
- }
- return WLAN_STATUS_SUCCESS;
- }
- #endif
- return wlanSendSetQueryCmd(prAdapter,
- CMD_ID_GET_STATISTICS,
- FALSE,
- TRUE,
- TRUE,
- nicCmdEventQueryRecvError,
- nicOidCmdTimeoutCommon, 0, NULL, pvQueryBuffer, u4QueryBufferLen);
- } /* wlanoidQueryRcvError */
- /*----------------------------------------------------------------------------*/
- /*! \brief This routine is called to query the number of frames that the NIC
- * cannot receive due to lack of NIC receive buffer space.
- *
- * \param[in] pvAdapter Pointer to the Adapter structure
- * \param[in] pvQueryBuf A pointer to the buffer that holds the result of the
- * query buffer
- * \param[in] u4QueryBufLen The length of the query buffer
- * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
- * bytes written into the query buffer. If the call
- * failed due to invalid length of the query buffer,
- * returns the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS If success;
- * \retval WLAN_STATUS_INVALID_LENGTH
- * \retval WLAN_STATUS_ADAPTER_NOT_READY
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidQueryRcvNoBuffer(IN P_ADAPTER_T prAdapter,
- IN PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
- {
- DEBUGFUNC("wlanoidQueryRcvNoBuffer");
- DBGLOG(OID, LOUD, "\n");
- ASSERT(prAdapter);
- if (u4QueryBufferLen)
- ASSERT(pvQueryBuffer);
- ASSERT(pu4QueryInfoLen);
- if (prAdapter->rAcpiState == ACPI_STATE_D3) {
- DBGLOG(OID, WARN, "Fail in query receive error! (Adapter not ready). ACPI=D%d, Radio=%d\n",
- prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
- *pu4QueryInfoLen = sizeof(UINT_32);
- return WLAN_STATUS_ADAPTER_NOT_READY;
- } else if (u4QueryBufferLen < sizeof(UINT_32)
- || (u4QueryBufferLen > sizeof(UINT_32) && u4QueryBufferLen < sizeof(UINT_64))) {
- *pu4QueryInfoLen = sizeof(UINT_64);
- return WLAN_STATUS_INVALID_LENGTH;
- }
- #if CFG_ENABLE_STATISTICS_BUFFERING
- if (IsBufferedStatisticsUsable(prAdapter) == TRUE) {
- if (u4QueryBufferLen == sizeof(UINT_32)) {
- *pu4QueryInfoLen = sizeof(UINT_32);
- *(PUINT_32) pvQueryBuffer = (UINT_32) 0; /* @FIXME */
- } else {
- *pu4QueryInfoLen = sizeof(UINT_64);
- *(PUINT_64) pvQueryBuffer = (UINT_64) 0; /* @FIXME */
- }
- return WLAN_STATUS_SUCCESS;
- }
- #endif
- return wlanSendSetQueryCmd(prAdapter,
- CMD_ID_GET_STATISTICS,
- FALSE,
- TRUE,
- TRUE,
- nicCmdEventQueryRecvNoBuffer,
- nicOidCmdTimeoutCommon, 0, NULL, pvQueryBuffer, u4QueryBufferLen);
- } /* wlanoidQueryRcvNoBuffer */
- /*----------------------------------------------------------------------------*/
- /*! \brief This routine is called to query the number of frames that the NIC
- * received and it is CRC error.
- *
- * \param[in] pvAdapter Pointer to the Adapter structure
- * \param[in] pvQueryBuf A pointer to the buffer that holds the result of the
- * query buffer
- * \param[in] u4QueryBufLen The length of the query buffer
- * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
- * bytes written into the query buffer. If the call
- * failed due to invalid length of the query buffer,
- * returns the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS If success;
- * \retval WLAN_STATUS_INVALID_LENGTH
- * \retval WLAN_STATUS_ADAPTER_NOT_READY
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidQueryRcvCrcError(IN P_ADAPTER_T prAdapter,
- IN PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
- {
- DEBUGFUNC("wlanoidQueryRcvCrcError");
- DBGLOG(OID, LOUD, "\n");
- ASSERT(prAdapter);
- if (u4QueryBufferLen)
- ASSERT(pvQueryBuffer);
- ASSERT(pu4QueryInfoLen);
- if (prAdapter->rAcpiState == ACPI_STATE_D3) {
- DBGLOG(OID, WARN, "Fail in query receive error! (Adapter not ready). ACPI=D%d, Radio=%d\n",
- prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
- *pu4QueryInfoLen = sizeof(UINT_32);
- return WLAN_STATUS_ADAPTER_NOT_READY;
- } else if (u4QueryBufferLen < sizeof(UINT_32)
- || (u4QueryBufferLen > sizeof(UINT_32) && u4QueryBufferLen < sizeof(UINT_64))) {
- *pu4QueryInfoLen = sizeof(UINT_64);
- return WLAN_STATUS_INVALID_LENGTH;
- }
- #if CFG_ENABLE_STATISTICS_BUFFERING
- if (IsBufferedStatisticsUsable(prAdapter) == TRUE) {
- if (u4QueryBufferLen == sizeof(UINT_32)) {
- *pu4QueryInfoLen = sizeof(UINT_32);
- *(PUINT_32) pvQueryBuffer = (UINT_32) prAdapter->rStatStruct.rFCSErrorCount.QuadPart;
- } else {
- *pu4QueryInfoLen = sizeof(UINT_64);
- *(PUINT_64) pvQueryBuffer = (UINT_64) prAdapter->rStatStruct.rFCSErrorCount.QuadPart;
- }
- return WLAN_STATUS_SUCCESS;
- }
- #endif
- return wlanSendSetQueryCmd(prAdapter,
- CMD_ID_GET_STATISTICS,
- FALSE,
- TRUE,
- TRUE,
- nicCmdEventQueryRecvCrcError,
- nicOidCmdTimeoutCommon, 0, NULL, pvQueryBuffer, u4QueryBufferLen);
- } /* wlanoidQueryRcvCrcError */
- /*----------------------------------------------------------------------------*/
- /*! \brief This routine is called to query the current 802.11 statistics.
- *
- * \param[in] pvAdapter Pointer to the Adapter structure
- * \param[in] pvQueryBuf A pointer to the buffer that holds the result of the
- * query buffer
- * \param[in] u4QueryBufLen The length of the query buffer
- * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
- * bytes written into the query buffer. If the call
- * failed due to invalid length of the query buffer,
- * returns the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_INVALID_LENGTH
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidQueryStatisticsPL(IN P_ADAPTER_T prAdapter,
- IN PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
- {
- DBGLOG(OID, LOUD, "\n");
- ASSERT(prAdapter);
- if (u4QueryBufferLen)
- ASSERT(pvQueryBuffer);
- ASSERT(pu4QueryInfoLen);
- *pu4QueryInfoLen = sizeof(PARAM_802_11_STATISTICS_STRUCT_T);
- if (prAdapter->rAcpiState == ACPI_STATE_D3) {
- DBGLOG(OID, WARN, "Fail in query receive error! (Adapter not ready). ACPI=D%d, Radio=%d\n",
- prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
- *pu4QueryInfoLen = sizeof(UINT_32);
- return WLAN_STATUS_ADAPTER_NOT_READY;
- } else if (u4QueryBufferLen < sizeof(PARAM_802_11_STATISTICS_STRUCT_T)) {
- DBGLOG(OID, WARN, "Too short length %u\n", u4QueryBufferLen);
- return WLAN_STATUS_INVALID_LENGTH;
- }
- #if CFG_ENABLE_STATISTICS_BUFFERING
- if (IsBufferedStatisticsUsable(prAdapter) == TRUE) {
- P_PARAM_802_11_STATISTICS_STRUCT_T prStatistics;
- *pu4QueryInfoLen = sizeof(PARAM_802_11_STATISTICS_STRUCT_T);
- prStatistics = (P_PARAM_802_11_STATISTICS_STRUCT_T) pvQueryBuffer;
- prStatistics->u4Length = sizeof(PARAM_802_11_STATISTICS_STRUCT_T);
- prStatistics->rTransmittedFragmentCount = prAdapter->rStatStruct.rTransmittedFragmentCount;
- prStatistics->rMulticastTransmittedFrameCount = prAdapter->rStatStruct.rMulticastTransmittedFrameCount;
- prStatistics->rFailedCount = prAdapter->rStatStruct.rFailedCount;
- prStatistics->rRetryCount = prAdapter->rStatStruct.rRetryCount;
- prStatistics->rMultipleRetryCount = prAdapter->rStatStruct.rMultipleRetryCount;
- prStatistics->rRTSSuccessCount = prAdapter->rStatStruct.rRTSSuccessCount;
- prStatistics->rRTSFailureCount = prAdapter->rStatStruct.rRTSFailureCount;
- prStatistics->rACKFailureCount = prAdapter->rStatStruct.rACKFailureCount;
- prStatistics->rFrameDuplicateCount = prAdapter->rStatStruct.rFrameDuplicateCount;
- prStatistics->rReceivedFragmentCount = prAdapter->rStatStruct.rReceivedFragmentCount;
- prStatistics->rMulticastReceivedFrameCount = prAdapter->rStatStruct.rMulticastReceivedFrameCount;
- prStatistics->rFCSErrorCount = prAdapter->rStatStruct.rFCSErrorCount;
- prStatistics->rTKIPLocalMICFailures.QuadPart = 0;
- prStatistics->rTKIPICVErrors.QuadPart = 0;
- prStatistics->rTKIPCounterMeasuresInvoked.QuadPart = 0;
- prStatistics->rTKIPReplays.QuadPart = 0;
- prStatistics->rCCMPFormatErrors.QuadPart = 0;
- prStatistics->rCCMPReplays.QuadPart = 0;
- prStatistics->rCCMPDecryptErrors.QuadPart = 0;
- prStatistics->rFourWayHandshakeFailures.QuadPart = 0;
- prStatistics->rWEPUndecryptableCount.QuadPart = 0;
- prStatistics->rWEPICVErrorCount.QuadPart = 0;
- prStatistics->rDecryptSuccessCount.QuadPart = 0;
- prStatistics->rDecryptFailureCount.QuadPart = 0;
- return WLAN_STATUS_SUCCESS;
- }
- #endif
- return wlanSendSetQueryCmd(prAdapter,
- CMD_ID_GET_STATISTICS_PL,
- FALSE,
- TRUE,
- TRUE,
- nicCmdEventQueryStatistics,
- nicOidCmdTimeoutCommon, 0, NULL, pvQueryBuffer, u4QueryBufferLen);
- } /* wlanoidQueryStatistics */
- /*----------------------------------------------------------------------------*/
- /*! \brief This routine is called to query the current 802.11 statistics.
- *
- * \param[in] pvAdapter Pointer to the Adapter structure
- * \param[in] pvQueryBuf A pointer to the buffer that holds the result of the
- * query buffer
- * \param[in] u4QueryBufLen The length of the query buffer
- * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
- * bytes written into the query buffer. If the call
- * failed due to invalid length of the query buffer,
- * returns the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_INVALID_LENGTH
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidQueryStatistics(IN P_ADAPTER_T prAdapter,
- IN PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
- {
- DEBUGFUNC("wlanoidQueryStatistics");
- DBGLOG(OID, LOUD, "\n");
- ASSERT(prAdapter);
- if (u4QueryBufferLen)
- ASSERT(pvQueryBuffer);
- ASSERT(pu4QueryInfoLen);
- *pu4QueryInfoLen = sizeof(PARAM_802_11_STATISTICS_STRUCT_T);
- if (prAdapter->rAcpiState == ACPI_STATE_D3) {
- DBGLOG(OID, WARN, "Fail in query receive error! (Adapter not ready). ACPI=D%d, Radio=%d\n",
- prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
- *pu4QueryInfoLen = sizeof(UINT_32);
- return WLAN_STATUS_ADAPTER_NOT_READY;
- } else if (u4QueryBufferLen < sizeof(PARAM_802_11_STATISTICS_STRUCT_T)) {
- DBGLOG(OID, WARN, "Too short length %u\n", u4QueryBufferLen);
- return WLAN_STATUS_INVALID_LENGTH;
- }
- #if CFG_ENABLE_STATISTICS_BUFFERING
- if (IsBufferedStatisticsUsable(prAdapter) == TRUE) {
- P_PARAM_802_11_STATISTICS_STRUCT_T prStatistics;
- *pu4QueryInfoLen = sizeof(PARAM_802_11_STATISTICS_STRUCT_T);
- prStatistics = (P_PARAM_802_11_STATISTICS_STRUCT_T) pvQueryBuffer;
- prStatistics->u4Length = sizeof(PARAM_802_11_STATISTICS_STRUCT_T);
- prStatistics->rTransmittedFragmentCount = prAdapter->rStatStruct.rTransmittedFragmentCount;
- prStatistics->rMulticastTransmittedFrameCount = prAdapter->rStatStruct.rMulticastTransmittedFrameCount;
- prStatistics->rFailedCount = prAdapter->rStatStruct.rFailedCount;
- prStatistics->rRetryCount = prAdapter->rStatStruct.rRetryCount;
- prStatistics->rMultipleRetryCount = prAdapter->rStatStruct.rMultipleRetryCount;
- prStatistics->rRTSSuccessCount = prAdapter->rStatStruct.rRTSSuccessCount;
- prStatistics->rRTSFailureCount = prAdapter->rStatStruct.rRTSFailureCount;
- prStatistics->rACKFailureCount = prAdapter->rStatStruct.rACKFailureCount;
- prStatistics->rFrameDuplicateCount = prAdapter->rStatStruct.rFrameDuplicateCount;
- prStatistics->rReceivedFragmentCount = prAdapter->rStatStruct.rReceivedFragmentCount;
- prStatistics->rMulticastReceivedFrameCount = prAdapter->rStatStruct.rMulticastReceivedFrameCount;
- prStatistics->rFCSErrorCount = prAdapter->rStatStruct.rFCSErrorCount;
- prStatistics->rTKIPLocalMICFailures.QuadPart = 0;
- prStatistics->rTKIPICVErrors.QuadPart = 0;
- prStatistics->rTKIPCounterMeasuresInvoked.QuadPart = 0;
- prStatistics->rTKIPReplays.QuadPart = 0;
- prStatistics->rCCMPFormatErrors.QuadPart = 0;
- prStatistics->rCCMPReplays.QuadPart = 0;
- prStatistics->rCCMPDecryptErrors.QuadPart = 0;
- prStatistics->rFourWayHandshakeFailures.QuadPart = 0;
- prStatistics->rWEPUndecryptableCount.QuadPart = 0;
- prStatistics->rWEPICVErrorCount.QuadPart = 0;
- prStatistics->rDecryptSuccessCount.QuadPart = 0;
- prStatistics->rDecryptFailureCount.QuadPart = 0;
- return WLAN_STATUS_SUCCESS;
- }
- #endif
- return wlanSendSetQueryCmd(prAdapter,
- CMD_ID_GET_STATISTICS,
- FALSE,
- TRUE,
- TRUE,
- nicCmdEventQueryStatistics,
- nicOidCmdTimeoutCommon, 0, NULL, pvQueryBuffer, u4QueryBufferLen);
- } /* wlanoidQueryStatistics */
- /*----------------------------------------------------------------------------*/
- /*! \brief This routine is called to query current media streaming status.
- *
- * \param[in] pvAdapter Pointer to the Adapter structure
- * \param[in] pvQueryBuf A pointer to the buffer that holds the result of the
- * query buffer
- * \param[in] u4QueryBufLen The length of the query buffer
- * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
- * bytes written into the query buffer. If the call
- * failed due to invalid length of the query buffer,
- * returns the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidQueryMediaStreamMode(IN P_ADAPTER_T prAdapter,
- IN PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
- {
- DEBUGFUNC("wlanoidQueryMediaStreamMode");
- ASSERT(prAdapter);
- ASSERT(pu4QueryInfoLen);
- if (u4QueryBufferLen)
- ASSERT(pvQueryBuffer);
- *pu4QueryInfoLen = sizeof(ENUM_MEDIA_STREAM_MODE);
- if (u4QueryBufferLen < *pu4QueryInfoLen) {
- DBGLOG(OID, WARN, "Invalid length %u\n", u4QueryBufferLen);
- return WLAN_STATUS_INVALID_LENGTH;
- }
- *(P_ENUM_MEDIA_STREAM_MODE) pvQueryBuffer =
- prAdapter->rWlanInfo.eLinkAttr.ucMediaStreamMode == 0 ? ENUM_MEDIA_STREAM_OFF : ENUM_MEDIA_STREAM_ON;
- return WLAN_STATUS_SUCCESS;
- } /* wlanoidQueryMediaStreamMode */
- /*----------------------------------------------------------------------------*/
- /*! \brief This routine is called to enter media streaming mode or exit media streaming mode
- *
- * \param[in] pvAdapter Pointer to the Adapter structure
- * \param[in] pvQueryBuf A pointer to the buffer that holds the result of the
- * query buffer
- * \param[in] u4QueryBufLen The length of the query buffer
- * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
- * bytes written into the query buffer. If the call
- * failed due to invalid length of the query buffer,
- * returns the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidSetMediaStreamMode(IN P_ADAPTER_T prAdapter,
- IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- ENUM_MEDIA_STREAM_MODE eStreamMode;
- DEBUGFUNC("wlanoidSetMediaStreamMode");
- ASSERT(prAdapter);
- ASSERT(pvSetBuffer);
- ASSERT(pu4SetInfoLen);
- if (u4SetBufferLen < sizeof(ENUM_MEDIA_STREAM_MODE)) {
- DBGLOG(OID, WARN, "Invalid length %u\n", u4SetBufferLen);
- return WLAN_STATUS_INVALID_LENGTH;
- }
- *pu4SetInfoLen = sizeof(ENUM_MEDIA_STREAM_MODE);
- eStreamMode = *(P_ENUM_MEDIA_STREAM_MODE) pvSetBuffer;
- if (eStreamMode == ENUM_MEDIA_STREAM_OFF)
- prAdapter->rWlanInfo.eLinkAttr.ucMediaStreamMode = 0;
- else
- prAdapter->rWlanInfo.eLinkAttr.ucMediaStreamMode = 1;
- return wlanSendSetQueryCmd(prAdapter,
- CMD_ID_LINK_ATTRIB,
- TRUE,
- FALSE,
- TRUE,
- nicCmdEventSetMediaStreamMode,
- nicOidCmdTimeoutCommon,
- sizeof(CMD_LINK_ATTRIB),
- (PUINT_8) &(prAdapter->rWlanInfo.eLinkAttr), pvSetBuffer, u4SetBufferLen);
- } /* wlanoidSetMediaStreamMode */
- /*----------------------------------------------------------------------------*/
- /*! \brief This routine is called to query the permanent MAC address of the NIC.
- *
- * \param[in] pvAdapter Pointer to the Adapter structure
- * \param[in] pvQueryBuf A pointer to the buffer that holds the result of the
- * query buffer
- * \param[in] u4QueryBufLen The length of the query buffer
- * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
- * bytes written into the query buffer. If the call
- * failed due to invalid length of the query buffer,
- * returns the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidQueryPermanentAddr(IN P_ADAPTER_T prAdapter,
- IN PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
- {
- DEBUGFUNC("wlanoidQueryPermanentAddr");
- DBGLOG(OID, LOUD, "\n");
- ASSERT(prAdapter);
- ASSERT(pu4QueryInfoLen);
- if (u4QueryBufferLen)
- ASSERT(pvQueryBuffer);
- if (u4QueryBufferLen < MAC_ADDR_LEN)
- return WLAN_STATUS_BUFFER_TOO_SHORT;
- COPY_MAC_ADDR(pvQueryBuffer, prAdapter->rWifiVar.aucPermanentAddress);
- *pu4QueryInfoLen = MAC_ADDR_LEN;
- return WLAN_STATUS_SUCCESS;
- } /* wlanoidQueryPermanentAddr */
- /*----------------------------------------------------------------------------*/
- /*! \brief This routine is called to query the MAC address the NIC is currently using.
- *
- * \param[in] pvAdapter Pointer to the Adapter structure
- * \param[in] pvQueryBuf A pointer to the buffer that holds the result of the
- * query buffer
- * \param[in] u4QueryBufLen The length of the query buffer
- * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
- * bytes written into the query buffer. If the call
- * failed due to invalid length of the query buffer,
- * returns the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_BUFFER_TOO_SHORT
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidQueryCurrentAddr(IN P_ADAPTER_T prAdapter,
- IN PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
- {
- CMD_BASIC_CONFIG rCmdBasicConfig;
- DEBUGFUNC("wlanoidQueryCurrentAddr");
- DBGLOG(OID, LOUD, "\n");
- ASSERT(prAdapter);
- ASSERT(pu4QueryInfoLen);
- if (u4QueryBufferLen)
- ASSERT(pvQueryBuffer);
- if (u4QueryBufferLen < MAC_ADDR_LEN)
- return WLAN_STATUS_BUFFER_TOO_SHORT;
- kalMemZero(&rCmdBasicConfig, sizeof(CMD_BASIC_CONFIG));
- return wlanSendSetQueryCmd(prAdapter,
- CMD_ID_BASIC_CONFIG,
- FALSE,
- TRUE,
- TRUE,
- nicCmdEventQueryAddress,
- nicOidCmdTimeoutCommon,
- sizeof(CMD_BASIC_CONFIG),
- (PUINT_8) &rCmdBasicConfig, pvQueryBuffer, u4QueryBufferLen);
- } /* wlanoidQueryCurrentAddr */
- /*----------------------------------------------------------------------------*/
- /*! \brief This routine is called to query NIC link speed.
- *
- * \param[in] pvAdapter Pointer to the Adapter structure
- * \param[in] pvQueryBuf A pointer to the buffer that holds the result of the
- * query buffer
- * \param[in] u4QueryBufLen The length of the query buffer
- * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
- * bytes written into the query buffer. If the call
- * failed due to invalid length of the query buffer,
- * returns the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_BUFFER_TOO_SHORT
- *
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidQueryLinkSpeed(IN P_ADAPTER_T prAdapter,
- IN PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
- {
- DEBUGFUNC("wlanoidQueryLinkSpeed");
- ASSERT(prAdapter);
- ASSERT(pu4QueryInfoLen);
- if (u4QueryBufferLen)
- ASSERT(pvQueryBuffer);
- *pu4QueryInfoLen = sizeof(UINT_32);
- if (u4QueryBufferLen < sizeof(UINT_32))
- return WLAN_STATUS_BUFFER_TOO_SHORT;
- if (kalGetMediaStateIndicated(prAdapter->prGlueInfo) != PARAM_MEDIA_STATE_CONNECTED) {
- return WLAN_STATUS_ADAPTER_NOT_READY;
- } else if (prAdapter->fgIsLinkRateValid == TRUE &&
- (kalGetTimeTick() - prAdapter->rLinkRateUpdateTime) <= CFG_LINK_QUALITY_VALID_PERIOD) {
- *(PUINT_32) pvQueryBuffer = prAdapter->rLinkQuality.u2LinkSpeed * 5000; /* change to unit of 100bps */
- return WLAN_STATUS_SUCCESS;
- } else {
- return wlanSendSetQueryCmd(prAdapter,
- CMD_ID_GET_LINK_QUALITY,
- FALSE,
- TRUE,
- TRUE,
- nicCmdEventQueryLinkSpeed,
- nicOidCmdTimeoutCommon, 0, NULL, pvQueryBuffer, u4QueryBufferLen);
- }
- } /* end of wlanoidQueryLinkSpeed() */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to query MCR value.
- *
- * \param[in] pvAdapter Pointer to the Adapter structure.
- * \param[out] pvQueryBuf A pointer to the buffer that holds the result of
- * the query.
- * \param[in] u4QueryBufLen The length of the query buffer.
- * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
- * bytes written into the query buffer. If the call
- * failed due to invalid length of the query buffer,
- * returns the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_INVALID_LENGTH
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidQueryMcrRead(IN P_ADAPTER_T prAdapter,
- IN PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
- {
- P_PARAM_CUSTOM_MCR_RW_STRUCT_T prMcrRdInfo;
- CMD_ACCESS_REG rCmdAccessReg;
- DEBUGFUNC("wlanoidQueryMcrRead");
- DBGLOG(OID, LOUD, "\n");
- ASSERT(prAdapter);
- ASSERT(pu4QueryInfoLen);
- if (u4QueryBufferLen)
- ASSERT(pvQueryBuffer);
- *pu4QueryInfoLen = sizeof(PARAM_CUSTOM_MCR_RW_STRUCT_T);
- if (u4QueryBufferLen < sizeof(PARAM_CUSTOM_MCR_RW_STRUCT_T))
- return WLAN_STATUS_INVALID_LENGTH;
- prMcrRdInfo = (P_PARAM_CUSTOM_MCR_RW_STRUCT_T) pvQueryBuffer;
- /* 0x9000 - 0x9EFF reserved for FW */
- #if CFG_SUPPORT_SWCR
- if ((prMcrRdInfo->u4McrOffset >> 16) == 0x9F00) {
- swCrReadWriteCmd(prAdapter,
- SWCR_READ,
- (UINT_16) (prMcrRdInfo->u4McrOffset & BITS(0, 15)), &prMcrRdInfo->u4McrData);
- return WLAN_STATUS_SUCCESS;
- }
- #endif /* CFG_SUPPORT_SWCR */
- /* Check if access F/W Domain MCR (due to WiFiSYS is placed from 0x6000-0000 */
- if (prMcrRdInfo->u4McrOffset & 0xFFFF0000) {
- /* fill command */
- rCmdAccessReg.u4Address = prMcrRdInfo->u4McrOffset;
- rCmdAccessReg.u4Data = 0;
- return wlanSendSetQueryCmd(prAdapter,
- CMD_ID_ACCESS_REG,
- FALSE,
- TRUE,
- TRUE,
- nicCmdEventQueryMcrRead,
- nicOidCmdTimeoutCommon,
- sizeof(CMD_ACCESS_REG),
- (PUINT_8) &rCmdAccessReg, pvQueryBuffer, u4QueryBufferLen);
- } else {
- HAL_MCR_RD(prAdapter, prMcrRdInfo->u4McrOffset & BITS(2, 31), /* address is in DWORD unit */
- &prMcrRdInfo->u4McrData);
- DBGLOG(OID, TRACE, "MCR Read: Offset = %#08x, Data = %#08x\n",
- prMcrRdInfo->u4McrOffset, prMcrRdInfo->u4McrData);
- return WLAN_STATUS_SUCCESS;
- }
- } /* end of wlanoidQueryMcrRead() */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to write MCR and enable specific function.
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
- * \param[in] u4SetBufferLen The length of the set buffer.
- * \param[out] pu4SetInfoLen If the call is successful, returns the number of
- * bytes read from the set buffer. If the call failed
- * due to invalid length of the set buffer, returns
- * the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_INVALID_LENGTH
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidSetMcrWrite(IN P_ADAPTER_T prAdapter,
- IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- P_PARAM_CUSTOM_MCR_RW_STRUCT_T prMcrWrInfo;
- CMD_ACCESS_REG rCmdAccessReg;
- #if CFG_STRESS_TEST_SUPPORT
- P_AIS_FSM_INFO_T prAisFsmInfo;
- P_BSS_INFO_T prBssInfo = &(prAdapter->rWifiVar.arBssInfo[(NETWORK_TYPE_AIS_INDEX)]);
- P_STA_RECORD_T prStaRec = prBssInfo->prStaRecOfAP;
- UINT_32 u4McrOffset, u4McrData;
- #endif
- DEBUGFUNC("wlanoidSetMcrWrite");
- DBGLOG(OID, LOUD, "\n");
- ASSERT(prAdapter);
- ASSERT(pu4SetInfoLen);
- *pu4SetInfoLen = sizeof(PARAM_CUSTOM_MCR_RW_STRUCT_T);
- if (u4SetBufferLen < sizeof(PARAM_CUSTOM_MCR_RW_STRUCT_T))
- return WLAN_STATUS_INVALID_LENGTH;
- ASSERT(pvSetBuffer);
- prMcrWrInfo = (P_PARAM_CUSTOM_MCR_RW_STRUCT_T) pvSetBuffer;
- /* 0x9000 - 0x9EFF reserved for FW */
- /* 0xFFFE reserved for FW */
- /* -- Puff Stress Test Begin */
- #if CFG_STRESS_TEST_SUPPORT
- /* 0xFFFFFFFE for Control Rate */
- if (prMcrWrInfo->u4McrOffset == 0xFFFFFFFE) {
- if (prMcrWrInfo->u4McrData < FIXED_RATE_NUM && prMcrWrInfo->u4McrData > 0)
- prAdapter->rWifiVar.eRateSetting = (ENUM_REGISTRY_FIXED_RATE_T) (prMcrWrInfo->u4McrData);
- cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_1);
- cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
- DEBUGFUNC("[Stress Test]Complete Rate is Changed...\n");
- DBGLOG(OID, TRACE,
- "[Stress Test] Rate is Changed to index %d...\n", prAdapter->rWifiVar.eRateSetting);
- }
- /* 0xFFFFFFFD for Switch Channel */
- else if (prMcrWrInfo->u4McrOffset == 0xFFFFFFFD) {
- if (prMcrWrInfo->u4McrData <= 11 && prMcrWrInfo->u4McrData >= 1)
- prBssInfo->ucPrimaryChannel = prMcrWrInfo->u4McrData;
- nicUpdateBss(prAdapter, prBssInfo->ucNetTypeIndex);
- DBGLOG(OID, TRACE, "[Stress Test] Channel is switched to %d ...\n", prBssInfo->ucPrimaryChannel);
- return WLAN_STATUS_SUCCESS;
- }
- /* 0xFFFFFFFFC for Control RF Band and SCO */
- else if (prMcrWrInfo->u4McrOffset == 0xFFFFFFFC) {
- /* Band */
- if (prMcrWrInfo->u4McrData & 0x80000000) {
- /* prBssInfo->eBand = BAND_5G; */
- /* prBssInfo->ucPrimaryChannel = 52; // Bond to Channel 52 */
- } else {
- prBssInfo->eBand = BAND_2G4;
- prBssInfo->ucPrimaryChannel = 8; /* Bond to Channel 6 */
- }
- /* Bandwidth */
- if (prMcrWrInfo->u4McrData & 0x00010000) {
- prStaRec->u2HtCapInfo |= HT_CAP_INFO_SUP_CHNL_WIDTH;
- prStaRec->ucDesiredPhyTypeSet = PHY_TYPE_BIT_HT;
- if (prMcrWrInfo->u4McrData == 0x00010002) {
- prBssInfo->eBssSCO = CHNL_EXT_SCB; /* U20 */
- prBssInfo->ucPrimaryChannel += 2;
- } else if (prMcrWrInfo->u4McrData == 0x00010001) {
- prBssInfo->eBssSCO = CHNL_EXT_SCA; /* L20 */
- prBssInfo->ucPrimaryChannel -= 2;
- } else {
- prBssInfo->eBssSCO = CHNL_EXT_SCA; /* 40 */
- }
- }
- if (prMcrWrInfo->u4McrData & 0x00000000) {
- prStaRec->u2HtCapInfo &= ~HT_CAP_INFO_SUP_CHNL_WIDTH;
- prBssInfo->eBssSCO = CHNL_EXT_SCN;
- }
- rlmBssInitForAPandIbss(prAdapter, prBssInfo);
- }
- /* 0xFFFFFFFB for HT Capability */
- else if (prMcrWrInfo->u4McrOffset == 0xFFFFFFFB) {
- /* Enable HT Capability */
- if (prMcrWrInfo->u4McrData & 0x00000001) {
- prStaRec->u2HtCapInfo |= HT_CAP_INFO_HT_GF;
- DEBUGFUNC("[Stress Test]Enable HT capability...\n");
- } else {
- prStaRec->u2HtCapInfo &= (~HT_CAP_INFO_HT_GF);
- DEBUGFUNC("[Stress Test]Disable HT capability...\n");
- }
- cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_1);
- cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
- }
- /* 0xFFFFFFFA for Enable Random Rx Reset */
- else if (prMcrWrInfo->u4McrOffset == 0xFFFFFFFA) {
- rCmdAccessReg.u4Address = prMcrWrInfo->u4McrOffset;
- rCmdAccessReg.u4Data = prMcrWrInfo->u4McrData;
- return wlanSendSetQueryCmd(prAdapter,
- CMD_ID_RANDOM_RX_RESET_EN,
- TRUE,
- FALSE,
- TRUE,
- nicCmdEventSetCommon,
- nicOidCmdTimeoutCommon,
- sizeof(CMD_ACCESS_REG),
- (PUINT_8) &rCmdAccessReg, pvSetBuffer, u4SetBufferLen);
- }
- /* 0xFFFFFFF9 for Disable Random Rx Reset */
- else if (prMcrWrInfo->u4McrOffset == 0xFFFFFFF9) {
- rCmdAccessReg.u4Address = prMcrWrInfo->u4McrOffset;
- rCmdAccessReg.u4Data = prMcrWrInfo->u4McrData;
- return wlanSendSetQueryCmd(prAdapter,
- CMD_ID_RANDOM_RX_RESET_DE,
- TRUE,
- FALSE,
- TRUE,
- nicCmdEventSetCommon,
- nicOidCmdTimeoutCommon,
- sizeof(CMD_ACCESS_REG),
- (PUINT_8) &rCmdAccessReg, pvSetBuffer, u4SetBufferLen);
- }
- /* 0xFFFFFFF8 for Enable SAPP */
- else if (prMcrWrInfo->u4McrOffset == 0xFFFFFFF8) {
- rCmdAccessReg.u4Address = prMcrWrInfo->u4McrOffset;
- rCmdAccessReg.u4Data = prMcrWrInfo->u4McrData;
- return wlanSendSetQueryCmd(prAdapter,
- CMD_ID_SAPP_EN,
- TRUE,
- FALSE,
- TRUE,
- nicCmdEventSetCommon,
- nicOidCmdTimeoutCommon,
- sizeof(CMD_ACCESS_REG),
- (PUINT_8) &rCmdAccessReg, pvSetBuffer, u4SetBufferLen);
- }
- /* 0xFFFFFFF7 for Disable SAPP */
- else if (prMcrWrInfo->u4McrOffset == 0xFFFFFFF7) {
- rCmdAccessReg.u4Address = prMcrWrInfo->u4McrOffset;
- rCmdAccessReg.u4Data = prMcrWrInfo->u4McrData;
- return wlanSendSetQueryCmd(prAdapter,
- CMD_ID_SAPP_DE,
- TRUE,
- FALSE,
- TRUE,
- nicCmdEventSetCommon,
- nicOidCmdTimeoutCommon,
- sizeof(CMD_ACCESS_REG),
- (PUINT_8) &rCmdAccessReg, pvSetBuffer, u4SetBufferLen);
- }
- else
- #endif
- /* -- Puff Stress Test End */
- /* Check if access F/W Domain MCR */
- if (prMcrWrInfo->u4McrOffset & 0xFFFF0000) {
- /* 0x9000 - 0x9EFF reserved for FW */
- #if CFG_SUPPORT_SWCR
- if ((prMcrWrInfo->u4McrOffset >> 16) == 0x9F00) {
- swCrReadWriteCmd(prAdapter,
- SWCR_WRITE,
- (UINT_16) (prMcrWrInfo->u4McrOffset & BITS(0, 15)), &prMcrWrInfo->u4McrData);
- return WLAN_STATUS_SUCCESS;
- }
- #endif /* CFG_SUPPORT_SWCR */
- #if 1
- /* low power test special command */
- if (prMcrWrInfo->u4McrOffset == 0x11111110) {
- WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
- /* DbgPrint("Enter test mode\n"); */
- prAdapter->fgTestMode = TRUE;
- return rStatus;
- }
- if (prMcrWrInfo->u4McrOffset == 0x11111111) {
- /* DbgPrint("nicpmSetAcpiPowerD3\n"); */
- nicpmSetAcpiPowerD3(prAdapter);
- kalDevSetPowerState(prAdapter->prGlueInfo, (UINT_32) ParamDeviceStateD3);
- return WLAN_STATUS_SUCCESS;
- }
- if (prMcrWrInfo->u4McrOffset == 0x11111112) {
- /* DbgPrint("LP enter sleep\n"); */
- /* fill command */
- rCmdAccessReg.u4Address = prMcrWrInfo->u4McrOffset;
- rCmdAccessReg.u4Data = prMcrWrInfo->u4McrData;
- return wlanSendSetQueryCmd(prAdapter,
- CMD_ID_ACCESS_REG,
- TRUE,
- FALSE,
- TRUE,
- nicCmdEventSetCommon,
- nicOidCmdTimeoutCommon,
- sizeof(CMD_ACCESS_REG),
- (PUINT_8) &rCmdAccessReg, pvSetBuffer, u4SetBufferLen);
- }
- #endif
- #if 1
- /* low power test special command */
- if (prMcrWrInfo->u4McrOffset == 0x11111110) {
- WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
- /* DbgPrint("Enter test mode\n"); */
- prAdapter->fgTestMode = TRUE;
- return rStatus;
- }
- if (prMcrWrInfo->u4McrOffset == 0x11111111) {
- /* DbgPrint("nicpmSetAcpiPowerD3\n"); */
- nicpmSetAcpiPowerD3(prAdapter);
- kalDevSetPowerState(prAdapter->prGlueInfo, (UINT_32) ParamDeviceStateD3);
- return WLAN_STATUS_SUCCESS;
- }
- if (prMcrWrInfo->u4McrOffset == 0x11111112) {
- /* DbgPrint("LP enter sleep\n"); */
- /* fill command */
- rCmdAccessReg.u4Address = prMcrWrInfo->u4McrOffset;
- rCmdAccessReg.u4Data = prMcrWrInfo->u4McrData;
- return wlanSendSetQueryCmd(prAdapter,
- CMD_ID_ACCESS_REG,
- TRUE,
- FALSE,
- TRUE,
- nicCmdEventSetCommon,
- nicOidCmdTimeoutCommon,
- sizeof(CMD_ACCESS_REG),
- (PUINT_8) &rCmdAccessReg, pvSetBuffer, u4SetBufferLen);
- }
- #endif
- /* fill command */
- rCmdAccessReg.u4Address = prMcrWrInfo->u4McrOffset;
- rCmdAccessReg.u4Data = prMcrWrInfo->u4McrData;
- return wlanSendSetQueryCmd(prAdapter,
- CMD_ID_ACCESS_REG,
- TRUE,
- FALSE,
- TRUE,
- nicCmdEventSetCommon,
- nicOidCmdTimeoutCommon,
- sizeof(CMD_ACCESS_REG),
- (PUINT_8) &rCmdAccessReg, pvSetBuffer, u4SetBufferLen);
- } else {
- HAL_MCR_WR(prAdapter, (prMcrWrInfo->u4McrOffset & BITS(2, 31)), /* address is in DWORD unit */
- prMcrWrInfo->u4McrData);
- DBGLOG(OID, TRACE, "MCR Write: Offset = %#08x, Data = %#08x\n",
- prMcrWrInfo->u4McrOffset, prMcrWrInfo->u4McrData);
- return WLAN_STATUS_SUCCESS;
- }
- } /* wlanoidSetMcrWrite */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to query SW CTRL
- *
- * \param[in] pvAdapter Pointer to the Adapter structure.
- * \param[out] pvQueryBuf A pointer to the buffer that holds the result of
- * the query.
- * \param[in] u4QueryBufLen The length of the query buffer.
- * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
- * bytes written into the query buffer. If the call
- * failed due to invalid length of the query buffer,
- * returns the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_INVALID_LENGTH
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidQuerySwCtrlRead(IN P_ADAPTER_T prAdapter,
- IN PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
- {
- P_PARAM_CUSTOM_SW_CTRL_STRUCT_T prSwCtrlInfo;
- WLAN_STATUS rWlanStatus;
- UINT_16 u2Id, u2SubId;
- UINT_32 u4Data;
- CMD_SW_DBG_CTRL_T rCmdSwCtrl;
- DEBUGFUNC("wlanoidQuerySwCtrlRead");
- DBGLOG(OID, LOUD, "\n");
- ASSERT(prAdapter);
- ASSERT(pu4QueryInfoLen);
- if (u4QueryBufferLen)
- ASSERT(pvQueryBuffer);
- *pu4QueryInfoLen = sizeof(PARAM_CUSTOM_SW_CTRL_STRUCT_T);
- if (u4QueryBufferLen < sizeof(PARAM_CUSTOM_SW_CTRL_STRUCT_T))
- return WLAN_STATUS_INVALID_LENGTH;
- prSwCtrlInfo = (P_PARAM_CUSTOM_SW_CTRL_STRUCT_T) pvQueryBuffer;
- u2Id = (UINT_16) (prSwCtrlInfo->u4Id >> 16);
- u2SubId = (UINT_16) (prSwCtrlInfo->u4Id & BITS(0, 15));
- u4Data = 0;
- rWlanStatus = WLAN_STATUS_SUCCESS;
- switch (u2Id) {
- /* 0x9000 - 0x9EFF reserved for FW */
- /* 0xFFFE reserved for FW */
- #if CFG_SUPPORT_SWCR
- case 0x9F00:
- swCrReadWriteCmd(prAdapter, SWCR_READ /* Read */ ,
- (UINT_16) u2SubId, &u4Data);
- break;
- #endif /* CFG_SUPPORT_SWCR */
- case 0xFFFF:
- {
- u4Data = 0x5AA56620;
- }
- break;
- case 0x9000:
- default:
- {
- rCmdSwCtrl.u4Id = prSwCtrlInfo->u4Id;
- rCmdSwCtrl.u4Data = 0;
- rWlanStatus = wlanSendSetQueryCmd(prAdapter,
- CMD_ID_SW_DBG_CTRL,
- FALSE,
- TRUE,
- TRUE,
- nicCmdEventQuerySwCtrlRead,
- nicOidCmdTimeoutCommon,
- sizeof(CMD_SW_DBG_CTRL_T),
- (PUINT_8) &rCmdSwCtrl, pvQueryBuffer, u4QueryBufferLen);
- }
- } /* switch(u2Id) */
- prSwCtrlInfo->u4Data = u4Data;
- return rWlanStatus;
- }
- /* end of wlanoidQuerySwCtrlRead() */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to write SW CTRL
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
- * \param[in] u4SetBufferLen The length of the set buffer.
- * \param[out] pu4SetInfoLen If the call is successful, returns the number of
- * bytes read from the set buffer. If the call failed
- * due to invalid length of the set buffer, returns
- * the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_INVALID_LENGTH
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidSetSwCtrlWrite(IN P_ADAPTER_T prAdapter,
- IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- P_PARAM_CUSTOM_SW_CTRL_STRUCT_T prSwCtrlInfo;
- CMD_SW_DBG_CTRL_T rCmdSwCtrl;
- WLAN_STATUS rWlanStatus;
- UINT_16 u2Id, u2SubId;
- UINT_32 u4Data;
- #if CFG_SUPPORT_HOTSPOT_OPTIMIZATION
- P_GLUE_INFO_T prGlueInfo;
- CMD_HOTSPOT_OPTIMIZATION_CONFIG arHotspotOptimizationCfg;
- #endif
- DEBUGFUNC("wlanoidSetSwCtrlWrite");
- DBGLOG(OID, LOUD, "\n");
- ASSERT(prAdapter);
- ASSERT(pu4SetInfoLen);
- #if CFG_SUPPORT_HOTSPOT_OPTIMIZATION
- prGlueInfo = prAdapter->prGlueInfo;
- #endif
- *pu4SetInfoLen = sizeof(PARAM_CUSTOM_SW_CTRL_STRUCT_T);
- if (u4SetBufferLen < sizeof(PARAM_CUSTOM_SW_CTRL_STRUCT_T))
- return WLAN_STATUS_INVALID_LENGTH;
- ASSERT(pvSetBuffer);
- prSwCtrlInfo = (P_PARAM_CUSTOM_SW_CTRL_STRUCT_T) pvSetBuffer;
- u2Id = (UINT_16) (prSwCtrlInfo->u4Id >> 16);
- u2SubId = (UINT_16) (prSwCtrlInfo->u4Id & BITS(0, 15));
- u4Data = prSwCtrlInfo->u4Data;
- rWlanStatus = WLAN_STATUS_SUCCESS;
- switch (u2Id) {
- /* 0x9000 - 0x9EFF reserved for FW */
- /* 0xFFFE reserved for FW */
- #if CFG_SUPPORT_SWCR
- case 0x9F00:
- swCrReadWriteCmd(prAdapter, SWCR_WRITE, (UINT_16) u2SubId, &u4Data);
- break;
- #endif /* CFG_SUPPORT_SWCR */
- case 0x1000:
- if (u2SubId == 0x8000) {
- /* CTIA power save mode setting (code: 0x10008000) */
- prAdapter->u4CtiaPowerMode = u4Data;
- prAdapter->fgEnCtiaPowerMode = TRUE;
- /* */
- {
- PARAM_POWER_MODE ePowerMode;
- if (prAdapter->u4CtiaPowerMode == 0)
- /* force to keep in CAM mode */
- ePowerMode = Param_PowerModeCAM;
- else if (prAdapter->u4CtiaPowerMode == 1)
- ePowerMode = Param_PowerModeMAX_PSP;
- else
- ePowerMode = Param_PowerModeFast_PSP;
- rWlanStatus = nicConfigPowerSaveProfile(prAdapter,
- NETWORK_TYPE_AIS_INDEX, ePowerMode, TRUE);
- }
- }
- break;
- case 0x1001:
- if (u2SubId == 0x0)
- prAdapter->fgEnOnlineScan = (BOOLEAN) u4Data;
- else if (u2SubId == 0x1)
- prAdapter->fgDisBcnLostDetection = (BOOLEAN) u4Data;
- else if (u2SubId == 0x2)
- prAdapter->rWifiVar.fgSupportUAPSD = (BOOLEAN) u4Data;
- else if (u2SubId == 0x3) {
- prAdapter->u4UapsdAcBmp = u4Data & BITS(0, 15);
- prAdapter->rWifiVar.arBssInfo[u4Data >> 16].rPmProfSetupInfo.ucBmpDeliveryAC =
- (UINT_8) prAdapter->u4UapsdAcBmp;
- prAdapter->rWifiVar.arBssInfo[u4Data >> 16].rPmProfSetupInfo.ucBmpTriggerAC =
- (UINT_8) prAdapter->u4UapsdAcBmp;
- } else if (u2SubId == 0x4)
- prAdapter->fgDisStaAgingTimeoutDetection = (BOOLEAN) u4Data;
- else if (u2SubId == 0x5)
- prAdapter->rWifiVar.rConnSettings.uc2G4BandwidthMode = (UINT_8) u4Data;
- else if (u2SubId == 0x0100)
- prAdapter->rWifiVar.u8SupportRxGf = (UINT_8) u4Data;
- else if (u2SubId == 0x0101) {
- prAdapter->rWifiVar.u8SupportRxSgi20 = (UINT_8) u4Data;
- prAdapter->rWifiVar.u8SupportRxSgi40 = (UINT_8) u4Data;
- } else if (u2SubId == 0x0102)
- prAdapter->rWifiVar.u8SupportRxSTBC = (UINT_8) u4Data;
- break;
- #if CFG_SUPPORT_SWCR
- case 0x1002:
- if (u2SubId == 0x0) {
- if (u4Data)
- u4Data = BIT(HIF_RX_PKT_TYPE_MANAGEMENT);
- swCrFrameCheckEnable(prAdapter, u4Data);
- } else if (u2SubId == 0x1) {
- BOOLEAN fgIsEnable;
- UINT_8 ucType;
- UINT_32 u4Timeout;
- fgIsEnable = (BOOLEAN) (u4Data & 0xff);
- ucType = 0; /* ((u4Data>>4) & 0xf); */
- u4Timeout = ((u4Data >> 8) & 0xff);
- swCrDebugCheckEnable(prAdapter, fgIsEnable, ucType, u4Timeout);
- }
- break;
- #endif
- #if CFG_SUPPORT_802_11W
- case 0x2000:
- DBGLOG(RSN, TRACE, "802.11w test 0x%x\n", u2SubId);
- if (u2SubId == 0x0)
- rsnStartSaQuery(prAdapter);
- if (u2SubId == 0x1)
- rsnStopSaQuery(prAdapter);
- if (u2SubId == 0x2)
- rsnSaQueryRequest(prAdapter, NULL);
- if (u2SubId == 0x3) {
- P_BSS_INFO_T prBssInfo = &(prAdapter->rWifiVar.arBssInfo[(NETWORK_TYPE_AIS_INDEX)]);
- authSendDeauthFrame(prAdapter, prBssInfo->prStaRecOfAP, NULL, 7, NULL);
- }
- if (u2SubId == 0x4) {
- P_BSS_INFO_T prBssInfo = &(prAdapter->rWifiVar.arBssInfo[(NETWORK_TYPE_AIS_INDEX)]);
- DBGLOG(RSN, INFO, "Send deauth\n");
- authSendDeauthFrame(prAdapter, prBssInfo->prStaRecOfAP, NULL, 1, NULL);
- }
- /* wext_set_mode */
- /*
- if (u2SubId == 0x3) {
- prAdapter->prGlueInfo->rWpaInfo.u4Mfp = RSN_AUTH_MFP_DISABLED;
- }
- if (u2SubId == 0x4) {
- //prAdapter->rWifiVar.rAisSpecificBssInfo.fgMgmtProtection = TRUE;
- prAdapter->prGlueInfo->rWpaInfo.u4Mfp = RSN_AUTH_MFP_OPTIONAL;
- }
- if (u2SubId == 0x5) {
- //prAdapter->rWifiVar.rAisSpecificBssInfo.fgMgmtProtection = TRUE;
- prAdapter->prGlueInfo->rWpaInfo.u4Mfp = RSN_AUTH_MFP_REQUIRED;
- }
- */
- break;
- #endif
- case 0xFFFF:
- {
- /* CMD_ACCESS_REG rCmdAccessReg; */
- #if 1 /* CFG_MT6573_SMT_TEST */
- if (u2SubId == 0x0123) {
- DBGLOG(HAL, TRACE, "set smt fixed rate: %u\n", u4Data);
- if ((ENUM_REGISTRY_FIXED_RATE_T) (u4Data) < FIXED_RATE_NUM)
- prAdapter->rWifiVar.eRateSetting = (ENUM_REGISTRY_FIXED_RATE_T) (u4Data);
- else
- prAdapter->rWifiVar.eRateSetting = FIXED_RATE_NONE;
- if (prAdapter->rWifiVar.eRateSetting == FIXED_RATE_NONE)
- /* Enable Auto (Long/Short) Preamble */
- prAdapter->rWifiVar.ePreambleType = PREAMBLE_TYPE_AUTO;
- else if ((prAdapter->rWifiVar.eRateSetting >= FIXED_RATE_MCS0_20M_400NS &&
- prAdapter->rWifiVar.eRateSetting <= FIXED_RATE_MCS7_20M_400NS)
- || (prAdapter->rWifiVar.eRateSetting >= FIXED_RATE_MCS0_40M_400NS &&
- prAdapter->rWifiVar.eRateSetting <= FIXED_RATE_MCS32_400NS))
- /* Force Short Preamble */
- prAdapter->rWifiVar.ePreambleType = PREAMBLE_TYPE_SHORT;
- else
- /* Force Long Preamble */
- prAdapter->rWifiVar.ePreambleType = PREAMBLE_TYPE_LONG;
- /* abort to re-connect */
- #if 1
- DBGLOG(OID, TRACE, "DisBySwC\n");
- kalIndicateStatusAndComplete(prAdapter->prGlueInfo,
- WLAN_STATUS_MEDIA_DISCONNECT, NULL, 0);
- #else
- aisBssBeaconTimeout(prAdapter);
- #endif
- return WLAN_STATUS_SUCCESS;
- } else if (u2SubId == 0x1234) {
- /* 1. Disable On-Lin Scan */
- /* 3. Disable FIFO FULL no ack */
- /* 4. Disable Roaming */
- /* Disalbe auto tx power */
- /* 2. Keep at CAM mode */
- /* 5. Disable Beacon Timeout Detection */
- rWlanStatus = nicEnterCtiaMode(prAdapter, TRUE, TRUE);
- } else if (u2SubId == 0x1235) {
- /* 1. Enaable On-Lin Scan */
- /* 3. Enable FIFO FULL no ack */
- /* 4. Enable Roaming */
- /* Enable auto tx power */
- /* 2. Keep at Fast PS */
- /* 5. Enable Beacon Timeout Detection */
- rWlanStatus = nicEnterCtiaMode(prAdapter, FALSE, TRUE);
- }
- #if CFG_SUPPORT_HOTSPOT_OPTIMIZATION
- else if (u2SubId == 0x1240) {
- DBGLOG(P2P, TRACE, "Disable Hotspot Optimization!\n");
- arHotspotOptimizationCfg.fgHotspotOptimizationEn = FALSE;
- arHotspotOptimizationCfg.u4Level = 0;
- wlanoidSendSetQueryP2PCmd(prAdapter,
- CMD_ID_SET_HOTSPOT_OPTIMIZATION,
- TRUE,
- FALSE,
- TRUE,
- NULL,
- NULL,
- sizeof(CMD_HOTSPOT_OPTIMIZATION_CONFIG),
- (PUINT_8) &arHotspotOptimizationCfg, NULL, 0);
- } else if (u2SubId == 0x1241) {
- DBGLOG(P2P, TRACE, "Enable Hotspot Optimization!\n");
- arHotspotOptimizationCfg.fgHotspotOptimizationEn = TRUE;
- arHotspotOptimizationCfg.u4Level = 5;
- wlanoidSendSetQueryP2PCmd(prAdapter,
- CMD_ID_SET_HOTSPOT_OPTIMIZATION,
- TRUE,
- FALSE,
- TRUE,
- NULL,
- NULL,
- sizeof(CMD_HOTSPOT_OPTIMIZATION_CONFIG),
- (PUINT_8) &arHotspotOptimizationCfg, NULL, 0);
- }
- #endif /* CFG_SUPPORT_HOTSPOT_OPTIMIZATION */
- else if (u2SubId == 0x1250) {
- DBGLOG(OID, TRACE, "LTE_COEX: SW SET DUAL BAND\n");
- prAdapter->aePreferBand[NETWORK_TYPE_AIS_INDEX] = BAND_NULL;
- } else if (u2SubId == 0x1251) {
- DBGLOG(OID, TRACE, "LTE_COEX: SW SET 2.4G BAND\n");
- prAdapter->aePreferBand[NETWORK_TYPE_AIS_INDEX] = BAND_2G4;
- } else if (u2SubId == 0x1252) {
- DBGLOG(OID, TRACE, "LTE_COEX: SW SET 5G BAND\n");
- prAdapter->aePreferBand[NETWORK_TYPE_AIS_INDEX] = BAND_5G;
- }
- #endif
- }
- break;
- case 0x9000:
- default:
- {
- rCmdSwCtrl.u4Id = prSwCtrlInfo->u4Id;
- rCmdSwCtrl.u4Data = prSwCtrlInfo->u4Data;
- rWlanStatus = wlanSendSetQueryCmd(prAdapter,
- CMD_ID_SW_DBG_CTRL,
- TRUE,
- FALSE,
- TRUE,
- nicCmdEventSetCommon,
- nicOidCmdTimeoutCommon,
- sizeof(CMD_SW_DBG_CTRL_T),
- (PUINT_8) &rCmdSwCtrl, pvSetBuffer, u4SetBufferLen);
- }
- } /* switch(u2Id) */
- return rWlanStatus;
- }
- /* wlanoidSetSwCtrlWrite */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to query EEPROM value.
- *
- * \param[in] pvAdapter Pointer to the Adapter structure.
- * \param[out] pvQueryBuf A pointer to the buffer that holds the result of
- * the query.
- * \param[in] u4QueryBufLen The length of the query buffer.
- * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
- * bytes written into the query buffer. If the call
- * failed due to invalid length of the query buffer,
- * returns the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_FAILURE
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidQueryEepromRead(IN P_ADAPTER_T prAdapter,
- IN PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
- {
- P_PARAM_CUSTOM_EEPROM_RW_STRUCT_T prEepromRwInfo;
- CMD_ACCESS_EEPROM rCmdAccessEeprom;
- DEBUGFUNC("wlanoidQueryEepromRead");
- ASSERT(prAdapter);
- ASSERT(pu4QueryInfoLen);
- if (u4QueryBufferLen)
- ASSERT(pvQueryBuffer);
- *pu4QueryInfoLen = sizeof(PARAM_CUSTOM_EEPROM_RW_STRUCT_T);
- if (u4QueryBufferLen < sizeof(PARAM_CUSTOM_EEPROM_RW_STRUCT_T))
- return WLAN_STATUS_INVALID_LENGTH;
- prEepromRwInfo = (P_PARAM_CUSTOM_EEPROM_RW_STRUCT_T) pvQueryBuffer;
- kalMemZero(&rCmdAccessEeprom, sizeof(CMD_ACCESS_EEPROM));
- rCmdAccessEeprom.u2Offset = prEepromRwInfo->ucEepromIndex;
- return wlanSendSetQueryCmd(prAdapter,
- CMD_ID_ACCESS_EEPROM,
- FALSE,
- TRUE,
- TRUE,
- nicCmdEventQueryEepromRead,
- nicOidCmdTimeoutCommon,
- sizeof(CMD_ACCESS_EEPROM),
- (PUINT_8) &rCmdAccessEeprom, pvQueryBuffer, u4QueryBufferLen);
- } /* wlanoidQueryEepromRead */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to write EEPROM value.
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
- * \param[in] u4SetBufferLen The length of the set buffer.
- * \param[out] pu4SetInfoLen If the call is successful, returns the number of
- * bytes read from the set buffer. If the call failed
- * due to invalid length of the set buffer, returns
- * the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_FAILURE
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidSetEepromWrite(IN P_ADAPTER_T prAdapter,
- IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- P_PARAM_CUSTOM_EEPROM_RW_STRUCT_T prEepromRwInfo;
- CMD_ACCESS_EEPROM rCmdAccessEeprom;
- DEBUGFUNC("wlanoidSetEepromWrite");
- DBGLOG(OID, LOUD, "\n");
- ASSERT(prAdapter);
- ASSERT(pu4SetInfoLen);
- *pu4SetInfoLen = sizeof(PARAM_CUSTOM_EEPROM_RW_STRUCT_T);
- if (u4SetBufferLen < sizeof(PARAM_CUSTOM_EEPROM_RW_STRUCT_T))
- return WLAN_STATUS_INVALID_LENGTH;
- ASSERT(pvSetBuffer);
- prEepromRwInfo = (P_PARAM_CUSTOM_EEPROM_RW_STRUCT_T) pvSetBuffer;
- kalMemZero(&rCmdAccessEeprom, sizeof(CMD_ACCESS_EEPROM));
- rCmdAccessEeprom.u2Offset = prEepromRwInfo->ucEepromIndex;
- rCmdAccessEeprom.u2Data = prEepromRwInfo->u2EepromData;
- return wlanSendSetQueryCmd(prAdapter,
- CMD_ID_ACCESS_EEPROM,
- TRUE,
- FALSE,
- TRUE,
- nicCmdEventSetCommon,
- nicOidCmdTimeoutCommon,
- sizeof(CMD_ACCESS_EEPROM),
- (PUINT_8) &rCmdAccessEeprom, pvSetBuffer, u4SetBufferLen);
- } /* wlanoidSetEepromWrite */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to query the number of the successfully transmitted
- * packets.
- *
- * \param[in] pvAdapter Pointer to the Adapter structure.
- * \param[out] pvQueryBuf A pointer to the buffer that holds the result of
- * the query.
- * \param[in] u4QueryBufLen The length of the query buffer.
- * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
- * bytes written into the query buffer. If the call
- * failed due to invalid length of the query buffer,
- * returns the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_INVALID_LENGTH
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidQueryXmitOk(IN P_ADAPTER_T prAdapter,
- IN PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
- {
- DEBUGFUNC("wlanoidQueryXmitOk");
- DBGLOG(OID, LOUD, "\n");
- ASSERT(prAdapter);
- if (u4QueryBufferLen)
- ASSERT(pvQueryBuffer);
- ASSERT(pu4QueryInfoLen);
- if (prAdapter->rAcpiState == ACPI_STATE_D3) {
- DBGLOG(OID, WARN, "Fail in query receive error! (Adapter not ready). ACPI=D%d, Radio=%d\n",
- prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
- *pu4QueryInfoLen = sizeof(UINT_32);
- return WLAN_STATUS_ADAPTER_NOT_READY;
- } else if (u4QueryBufferLen < sizeof(UINT_32)
- || (u4QueryBufferLen > sizeof(UINT_32) && u4QueryBufferLen < sizeof(UINT_64))) {
- *pu4QueryInfoLen = sizeof(UINT_64);
- return WLAN_STATUS_INVALID_LENGTH;
- }
- #if CFG_ENABLE_STATISTICS_BUFFERING
- if (IsBufferedStatisticsUsable(prAdapter) == TRUE) {
- if (u4QueryBufferLen == sizeof(UINT_32)) {
- *pu4QueryInfoLen = sizeof(UINT_32);
- *(PUINT_32) pvQueryBuffer = (UINT_32) prAdapter->rStatStruct.rTransmittedFragmentCount.QuadPart;
- } else {
- *pu4QueryInfoLen = sizeof(UINT_64);
- *(PUINT_64) pvQueryBuffer = (UINT_64) prAdapter->rStatStruct.rTransmittedFragmentCount.QuadPart;
- }
- return WLAN_STATUS_SUCCESS;
- }
- #endif
- return wlanSendSetQueryCmd(prAdapter,
- CMD_ID_GET_STATISTICS,
- FALSE,
- TRUE,
- TRUE,
- nicCmdEventQueryXmitOk,
- nicOidCmdTimeoutCommon, 0, NULL, pvQueryBuffer, u4QueryBufferLen);
- } /* wlanoidQueryXmitOk */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to query the number of the successfully received
- * packets.
- *
- * \param[in] pvAdapter Pointer to the Adapter structure.
- * \param[out] pvQueryBuf A pointer to the buffer that holds the result of
- * the query.
- * \param[in] u4QueryBufLen The length of the query buffer.
- * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
- * bytes written into the query buffer. If the call
- * failed due to invalid length of the query buffer,
- * returns the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_INVALID_LENGTH
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidQueryRcvOk(IN P_ADAPTER_T prAdapter,
- IN PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
- {
- DEBUGFUNC("wlanoidQueryRcvOk");
- DBGLOG(OID, LOUD, "\n");
- ASSERT(prAdapter);
- if (u4QueryBufferLen)
- ASSERT(pvQueryBuffer);
- ASSERT(pu4QueryInfoLen);
- if (prAdapter->rAcpiState == ACPI_STATE_D3) {
- DBGLOG(OID, WARN, "Fail in query receive error! (Adapter not ready). ACPI=D%d, Radio=%d\n",
- prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
- *pu4QueryInfoLen = sizeof(UINT_32);
- return WLAN_STATUS_ADAPTER_NOT_READY;
- } else if (u4QueryBufferLen < sizeof(UINT_32)
- || (u4QueryBufferLen > sizeof(UINT_32) && u4QueryBufferLen < sizeof(UINT_64))) {
- *pu4QueryInfoLen = sizeof(UINT_64);
- return WLAN_STATUS_INVALID_LENGTH;
- }
- #if CFG_ENABLE_STATISTICS_BUFFERING
- if (IsBufferedStatisticsUsable(prAdapter) == TRUE) {
- if (u4QueryBufferLen == sizeof(UINT_32)) {
- *pu4QueryInfoLen = sizeof(UINT_32);
- *(PUINT_32) pvQueryBuffer = (UINT_32) prAdapter->rStatStruct.rReceivedFragmentCount.QuadPart;
- } else {
- *pu4QueryInfoLen = sizeof(UINT_64);
- *(PUINT_64) pvQueryBuffer = (UINT_64) prAdapter->rStatStruct.rReceivedFragmentCount.QuadPart;
- }
- return WLAN_STATUS_SUCCESS;
- }
- #endif
- return wlanSendSetQueryCmd(prAdapter,
- CMD_ID_GET_STATISTICS,
- FALSE,
- TRUE,
- TRUE,
- nicCmdEventQueryRecvOk,
- nicOidCmdTimeoutCommon, 0, NULL, pvQueryBuffer, u4QueryBufferLen);
- } /* wlanoidQueryRcvOk */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to query the number of frames that the driver
- * fails to transmit.
- *
- * \param[in] pvAdapter Pointer to the Adapter structure.
- * \param[out] pvQueryBuf A pointer to the buffer that holds the result of
- * the query.
- * \param[in] u4QueryBufLen The length of the query buffer.
- * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
- * bytes written into the query buffer. If the call
- * failed due to invalid length of the query buffer,
- * returns the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_INVALID_LENGTH
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidQueryXmitError(IN P_ADAPTER_T prAdapter,
- IN PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
- {
- DEBUGFUNC("wlanoidQueryXmitError");
- DBGLOG(OID, LOUD, "\n");
- ASSERT(prAdapter);
- if (u4QueryBufferLen)
- ASSERT(pvQueryBuffer);
- ASSERT(pu4QueryInfoLen);
- if (prAdapter->rAcpiState == ACPI_STATE_D3) {
- DBGLOG(OID, WARN, "Fail in query receive error! (Adapter not ready). ACPI=D%d, Radio=%d\n",
- prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
- *pu4QueryInfoLen = sizeof(UINT_32);
- return WLAN_STATUS_ADAPTER_NOT_READY;
- } else if (u4QueryBufferLen < sizeof(UINT_32)
- || (u4QueryBufferLen > sizeof(UINT_32) && u4QueryBufferLen < sizeof(UINT_64))) {
- *pu4QueryInfoLen = sizeof(UINT_64);
- return WLAN_STATUS_INVALID_LENGTH;
- }
- #if CFG_ENABLE_STATISTICS_BUFFERING
- if (IsBufferedStatisticsUsable(prAdapter) == TRUE) {
- if (u4QueryBufferLen == sizeof(UINT_32)) {
- *pu4QueryInfoLen = sizeof(UINT_32);
- *(PUINT_32) pvQueryBuffer = (UINT_32) prAdapter->rStatStruct.rFailedCount.QuadPart;
- } else {
- *pu4QueryInfoLen = sizeof(UINT_64);
- *(PUINT_64) pvQueryBuffer = (UINT_64) prAdapter->rStatStruct.rFailedCount.QuadPart;
- }
- return WLAN_STATUS_SUCCESS;
- }
- #endif
- return wlanSendSetQueryCmd(prAdapter,
- CMD_ID_GET_STATISTICS,
- FALSE,
- TRUE,
- TRUE,
- nicCmdEventQueryXmitError,
- nicOidCmdTimeoutCommon, 0, NULL, pvQueryBuffer, u4QueryBufferLen);
- } /* wlanoidQueryXmitError */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to query the number of frames successfully
- * transmitted after exactly one collision.
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[out] pvQueryBuf A pointer to the buffer that holds the result of
- * the query.
- * \param[in] u4QueryBufLen The length of the query buffer.
- * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
- * bytes written into the query buffer. If the call
- * failed due to invalid length of the query buffer,
- * returns the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_INVALID_LENGTH
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidQueryXmitOneCollision(IN P_ADAPTER_T prAdapter,
- IN PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
- {
- DEBUGFUNC("wlanoidQueryXmitOneCollision");
- DBGLOG(OID, LOUD, "\n");
- ASSERT(prAdapter);
- if (u4QueryBufferLen)
- ASSERT(pvQueryBuffer);
- ASSERT(pu4QueryInfoLen);
- if (prAdapter->rAcpiState == ACPI_STATE_D3) {
- DBGLOG(OID, WARN, "Fail in query receive error! (Adapter not ready). ACPI=D%d, Radio=%d\n",
- prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
- *pu4QueryInfoLen = sizeof(UINT_32);
- return WLAN_STATUS_ADAPTER_NOT_READY;
- } else if (u4QueryBufferLen < sizeof(UINT_32)
- || (u4QueryBufferLen > sizeof(UINT_32) && u4QueryBufferLen < sizeof(UINT_64))) {
- *pu4QueryInfoLen = sizeof(UINT_64);
- return WLAN_STATUS_INVALID_LENGTH;
- }
- #if CFG_ENABLE_STATISTICS_BUFFERING
- if (IsBufferedStatisticsUsable(prAdapter) == TRUE) {
- if (u4QueryBufferLen == sizeof(UINT_32)) {
- *pu4QueryInfoLen = sizeof(UINT_32);
- *(PUINT_32) pvQueryBuffer = (UINT_32)
- (prAdapter->rStatStruct.rMultipleRetryCount.QuadPart -
- prAdapter->rStatStruct.rRetryCount.QuadPart);
- } else {
- *pu4QueryInfoLen = sizeof(UINT_64);
- *(PUINT_64) pvQueryBuffer = (UINT_64)
- (prAdapter->rStatStruct.rMultipleRetryCount.QuadPart -
- prAdapter->rStatStruct.rRetryCount.QuadPart);
- }
- return WLAN_STATUS_SUCCESS;
- }
- #endif
- return wlanSendSetQueryCmd(prAdapter,
- CMD_ID_GET_STATISTICS,
- FALSE,
- TRUE,
- TRUE,
- nicCmdEventQueryXmitOneCollision,
- nicOidCmdTimeoutCommon, 0, NULL, pvQueryBuffer, u4QueryBufferLen);
- } /* wlanoidQueryXmitOneCollision */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to query the number of frames successfully
- * transmitted after more than one collision.
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[out] pvQueryBuf A pointer to the buffer that holds the result of
- * the query.
- * \param[in] u4QueryBufLen The length of the query buffer.
- * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
- * bytes written into the query buffer. If the call
- * failed due to invalid length of the query buffer,
- * returns the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_INVALID_LENGTH
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidQueryXmitMoreCollisions(IN P_ADAPTER_T prAdapter,
- IN PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
- {
- DEBUGFUNC("wlanoidQueryXmitMoreCollisions");
- DBGLOG(OID, LOUD, "\n");
- ASSERT(prAdapter);
- if (u4QueryBufferLen)
- ASSERT(pvQueryBuffer);
- ASSERT(pu4QueryInfoLen);
- if (prAdapter->rAcpiState == ACPI_STATE_D3) {
- DBGLOG(OID, WARN, "Fail in query receive error! (Adapter not ready). ACPI=D%d, Radio=%d\n",
- prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
- *pu4QueryInfoLen = sizeof(UINT_32);
- return WLAN_STATUS_ADAPTER_NOT_READY;
- } else if (u4QueryBufferLen < sizeof(UINT_32)
- || (u4QueryBufferLen > sizeof(UINT_32) && u4QueryBufferLen < sizeof(UINT_64))) {
- *pu4QueryInfoLen = sizeof(UINT_64);
- return WLAN_STATUS_INVALID_LENGTH;
- }
- #if CFG_ENABLE_STATISTICS_BUFFERING
- if (IsBufferedStatisticsUsable(prAdapter) == TRUE) {
- if (u4QueryBufferLen == sizeof(UINT_32)) {
- *pu4QueryInfoLen = sizeof(UINT_32);
- *(PUINT_32) pvQueryBuffer = (UINT_32) (prAdapter->rStatStruct.rMultipleRetryCount.QuadPart);
- } else {
- *pu4QueryInfoLen = sizeof(UINT_64);
- *(PUINT_64) pvQueryBuffer = (UINT_64) (prAdapter->rStatStruct.rMultipleRetryCount.QuadPart);
- }
- return WLAN_STATUS_SUCCESS;
- }
- #endif
- return wlanSendSetQueryCmd(prAdapter,
- CMD_ID_GET_STATISTICS,
- FALSE,
- TRUE,
- TRUE,
- nicCmdEventQueryXmitMoreCollisions,
- nicOidCmdTimeoutCommon, 0, NULL, pvQueryBuffer, u4QueryBufferLen);
- } /* wlanoidQueryXmitMoreCollisions */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to query the number of frames
- * not transmitted due to excessive collisions.
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[in] pvQueryBuffer Pointer to the buffer that holds the result of
- * the query.
- * \param[in] u4QueryBufferLen The length of the query buffer.
- * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
- * bytes written into the query buffer. If the call
- * failed due to invalid length of the query buffer,
- * returns the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_INVALID_LENGTH
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidQueryXmitMaxCollisions(IN P_ADAPTER_T prAdapter,
- IN PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
- {
- DEBUGFUNC("wlanoidQueryXmitMaxCollisions");
- DBGLOG(OID, LOUD, "\n");
- ASSERT(prAdapter);
- if (u4QueryBufferLen)
- ASSERT(pvQueryBuffer);
- ASSERT(pu4QueryInfoLen);
- if (prAdapter->rAcpiState == ACPI_STATE_D3) {
- DBGLOG(OID, WARN, "Fail in query receive error! (Adapter not ready). ACPI=D%d, Radio=%d\n",
- prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
- *pu4QueryInfoLen = sizeof(UINT_32);
- return WLAN_STATUS_ADAPTER_NOT_READY;
- } else if (u4QueryBufferLen < sizeof(UINT_32)
- || (u4QueryBufferLen > sizeof(UINT_32) && u4QueryBufferLen < sizeof(UINT_64))) {
- *pu4QueryInfoLen = sizeof(UINT_64);
- return WLAN_STATUS_INVALID_LENGTH;
- }
- #if CFG_ENABLE_STATISTICS_BUFFERING
- if (IsBufferedStatisticsUsable(prAdapter) == TRUE) {
- if (u4QueryBufferLen == sizeof(UINT_32)) {
- *pu4QueryInfoLen = sizeof(UINT_32);
- *(PUINT_32) pvQueryBuffer = (UINT_32) prAdapter->rStatStruct.rFailedCount.QuadPart;
- } else {
- *pu4QueryInfoLen = sizeof(UINT_64);
- *(PUINT_64) pvQueryBuffer = (UINT_64) prAdapter->rStatStruct.rFailedCount.QuadPart;
- }
- return WLAN_STATUS_SUCCESS;
- }
- #endif
- return wlanSendSetQueryCmd(prAdapter,
- CMD_ID_GET_STATISTICS,
- FALSE,
- TRUE,
- TRUE,
- nicCmdEventQueryXmitMaxCollisions,
- nicOidCmdTimeoutCommon, 0, NULL, pvQueryBuffer, u4QueryBufferLen);
- } /* wlanoidQueryXmitMaxCollisions */
- #define MTK_CUSTOM_OID_INTERFACE_VERSION 0x00006620 /* for WPDWifi DLL */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to query current the OID interface version,
- * which is the interface between the application and driver.
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[in] pvQueryBuffer Pointer to the buffer that holds the result of
- * the query.
- * \param[in] u4QueryBufferLen The length of the query buffer.
- * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
- * bytes written into the query buffer. If the call
- * failed due to invalid length of the query buffer,
- * returns the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidQueryOidInterfaceVersion(IN P_ADAPTER_T prAdapter,
- IN PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
- {
- DEBUGFUNC("wlanoidQueryOidInterfaceVersion");
- ASSERT(prAdapter);
- if (u4QueryBufferLen)
- ASSERT(pvQueryBuffer);
- ASSERT(pu4QueryInfoLen);
- *(PUINT_32) pvQueryBuffer = MTK_CUSTOM_OID_INTERFACE_VERSION;
- *pu4QueryInfoLen = sizeof(UINT_32);
- DBGLOG(OID, WARN, "Custom OID interface version: %#08X\n", *(PUINT_32) pvQueryBuffer);
- return WLAN_STATUS_SUCCESS;
- } /* wlanoidQueryOidInterfaceVersion */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to query current Multicast Address List.
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[in] pvQueryBuffer Pointer to the buffer that holds the result of
- * the query.
- * \param[in] u4QueryBufferLen The length of the query buffer.
- * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
- * bytes written into the query buffer. If the call
- * failed due to invalid length of the query buffer,
- * returns the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_BUFFER_TOO_SHORT
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidQueryMulticastList(IN P_ADAPTER_T prAdapter,
- OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
- {
- #ifndef LINUX
- ASSERT(prAdapter);
- ASSERT(pu4QueryInfoLen);
- if (u4QueryBufferLen)
- ASSERT(pvQueryBuffer);
- return wlanSendSetQueryCmd(prAdapter,
- CMD_ID_MAC_MCAST_ADDR,
- FALSE,
- TRUE,
- TRUE,
- nicCmdEventQueryMcastAddr,
- nicOidCmdTimeoutCommon, 0, NULL, pvQueryBuffer, u4QueryBufferLen);
- #else
- return WLAN_STATUS_SUCCESS;
- #endif
- } /* end of wlanoidQueryMulticastList() */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to set Multicast Address List.
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[in] pvSetBuffer Pointer to the buffer that holds the data to be set.
- * \param[in] u4SetBufferLen The length of the set buffer.
- * \param[out] pu4SetInfoLen If the call is successful, returns the number of
- * bytes read from the set buffer. If the call failed
- * due to invalid length of the set buffer, returns
- * the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_INVALID_LENGTH
- * \retval WLAN_STATUS_ADAPTER_NOT_READY
- * \retval WLAN_STATUS_MULTICAST_FULL
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidSetMulticastList(IN P_ADAPTER_T prAdapter,
- IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- UINT_8 ucNetTypeIndex = NETWORK_TYPE_AIS_INDEX; /* Caller should provide this information */
- CMD_MAC_MCAST_ADDR rCmdMacMcastAddr;
- ASSERT(prAdapter);
- ASSERT(pu4SetInfoLen);
- /* The data must be a multiple of the Ethernet address size. */
- if ((u4SetBufferLen % MAC_ADDR_LEN)) {
- DBGLOG(OID, WARN, "Invalid MC list length %u\n", u4SetBufferLen);
- *pu4SetInfoLen = (((u4SetBufferLen + MAC_ADDR_LEN) - 1) / MAC_ADDR_LEN) * MAC_ADDR_LEN;
- return WLAN_STATUS_INVALID_LENGTH;
- }
- *pu4SetInfoLen = u4SetBufferLen;
- /* Verify if we can support so many multicast addresses. */
- if ((u4SetBufferLen / MAC_ADDR_LEN) > MAX_NUM_GROUP_ADDR) {
- DBGLOG(OID, WARN, "Too many MC addresses\n");
- return WLAN_STATUS_MULTICAST_FULL;
- }
- /* NOTE(Kevin): Windows may set u4SetBufferLen == 0 &&
- * pvSetBuffer == NULL to clear exist Multicast List.
- */
- if (u4SetBufferLen)
- ASSERT(pvSetBuffer);
- if (prAdapter->rAcpiState == ACPI_STATE_D3) {
- DBGLOG(OID, WARN, "Fail in set multicast list! (Adapter not ready). ACPI=D%d, Radio=%d\n",
- prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
- return WLAN_STATUS_ADAPTER_NOT_READY;
- }
- rCmdMacMcastAddr.u4NumOfGroupAddr = u4SetBufferLen / MAC_ADDR_LEN;
- rCmdMacMcastAddr.ucNetTypeIndex = ucNetTypeIndex;
- kalMemCopy(rCmdMacMcastAddr.arAddress, pvSetBuffer, u4SetBufferLen);
- return wlanSendSetQueryCmd(prAdapter,
- CMD_ID_MAC_MCAST_ADDR,
- TRUE,
- FALSE,
- TRUE,
- nicCmdEventSetCommon,
- nicOidCmdTimeoutCommon,
- sizeof(CMD_MAC_MCAST_ADDR),
- (PUINT_8) &rCmdMacMcastAddr, pvSetBuffer, u4SetBufferLen);
- } /* end of wlanoidSetMulticastList() */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to set Packet Filter.
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[in] pvSetBuffer Pointer to the buffer that holds the data to be set.
- * \param[in] u4SetBufferLen The length of the set buffer.
- * \param[out] pu4SetInfoLen If the call is successful, returns the number of
- * bytes read from the set buffer. If the call failed
- * due to invalid length of the set buffer, returns
- * the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_INVALID_LENGTH
- * \retval WLAN_STATUS_NOT_SUPPORTED
- * \retval WLAN_STATUS_ADAPTER_NOT_READY
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidSetCurrentPacketFilter(IN P_ADAPTER_T prAdapter,
- IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- UINT_32 u4NewPacketFilter;
- WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
- ASSERT(prAdapter);
- ASSERT(pu4SetInfoLen);
- if (u4SetBufferLen < sizeof(UINT_32)) {
- *pu4SetInfoLen = sizeof(UINT_32);
- DBGLOG(OID, INFO, "iput buffer is too small");
- return WLAN_STATUS_INVALID_LENGTH;
- }
- ASSERT(pvSetBuffer);
- /* Set the new packet filter. */
- u4NewPacketFilter = *(PUINT_32) pvSetBuffer;
- DBGLOG(OID, TRACE, "New packet filter: %#08x\n", u4NewPacketFilter);
- if (prAdapter->rAcpiState == ACPI_STATE_D3) {
- DBGLOG(OID, WARN, "Fail in set current packet filter! (Adapter not ready). ACPI=D%d, Radio=%d\n",
- prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
- return WLAN_STATUS_ADAPTER_NOT_READY;
- }
- do {
- /* Verify the bits of the new packet filter. If any bits are set that
- we don't support, leave. */
- if (u4NewPacketFilter & ~(PARAM_PACKET_FILTER_SUPPORTED)) {
- rStatus = WLAN_STATUS_NOT_SUPPORTED;
- break;
- }
- #if DBG
- /* Need to enable or disable promiscuous support depending on the new
- filter. */
- if (u4NewPacketFilter & PARAM_PACKET_FILTER_PROMISCUOUS)
- DBGLOG(OID, TRACE, "Enable promiscuous mode\n");
- else
- DBGLOG(OID, TRACE, "Disable promiscuous mode\n");
- if (u4NewPacketFilter & PARAM_PACKET_FILTER_ALL_MULTICAST)
- DBGLOG(OID, TRACE, "Enable all-multicast mode\n");
- else if (u4NewPacketFilter & PARAM_PACKET_FILTER_MULTICAST)
- DBGLOG(OID, TRACE, "Enable multicast\n");
- else
- DBGLOG(OID, TRACE, "Disable multicast\n");
- if (u4NewPacketFilter & PARAM_PACKET_FILTER_BROADCAST)
- DBGLOG(OID, TRACE, "Enable Broadcast\n");
- else
- DBGLOG(OID, TRACE, "Disable Broadcast\n");
- #endif
- } while (FALSE);
- if (rStatus == WLAN_STATUS_SUCCESS) {
- /* Store the packet filter */
- prAdapter->u4OsPacketFilter &= PARAM_PACKET_FILTER_P2P_MASK;
- prAdapter->u4OsPacketFilter |= u4NewPacketFilter;
- rStatus = wlanoidSetPacketFilter(prAdapter, prAdapter->u4OsPacketFilter,
- TRUE, pvSetBuffer, u4SetBufferLen);
- }
- DBGLOG(REQ, INFO, "[MC debug] u4OsPacketFilter=%x\n", prAdapter->u4OsPacketFilter);
- return rStatus;
- } /* wlanoidSetCurrentPacketFilter */
- WLAN_STATUS wlanoidSetPacketFilter(P_ADAPTER_T prAdapter, UINT_32 u4PacketFilter,
- BOOLEAN fgIsOid, PVOID pvSetBuffer, UINT_32 u4SetBufferLen)
- {
- #if CFG_SUPPORT_DROP_MC_PACKET
- /* Note:
- If PARAM_PACKET_FILTER_ALL_MULTICAST is set in PacketFilter,
- Firmware will pass multicast frame.
- Else if PARAM_PACKET_FILTER_MULTICAST is set in PacketFilter,
- Firmware will pass some multicast frame in multicast table.
- Else firmware will drop all multicast frame.
- */
- if (fgIsUnderSuspend)
- u4PacketFilter &= ~(PARAM_PACKET_FILTER_MULTICAST | PARAM_PACKET_FILTER_ALL_MULTICAST);
- #endif
- DBGLOG(REQ, INFO, "[MC debug] u4PacketFilter=%x, IsSuspend=%d\n", u4PacketFilter, fgIsUnderSuspend);
- return wlanSendSetQueryCmd(prAdapter,
- CMD_ID_SET_RX_FILTER,
- TRUE,
- FALSE,
- fgIsOid,
- nicCmdEventSetCommon,
- nicOidCmdTimeoutCommon,
- sizeof(UINT_32),
- (PUINT_8)&u4PacketFilter,
- pvSetBuffer, u4SetBufferLen);
- }
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to query current packet filter.
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[in] pvQueryBuffer Pointer to the buffer that holds the result of
- * the query.
- * \param[in] u4QueryBufferLen The length of the query buffer.
- * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
- * bytes written into the query buffer. If the call
- * failed due to invalid length of the query buffer,
- * returns the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidQueryCurrentPacketFilter(IN P_ADAPTER_T prAdapter,
- OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
- {
- DEBUGFUNC("wlanoidQueryCurrentPacketFilter");
- ASSERT(prAdapter);
- ASSERT(pu4QueryInfoLen);
- *pu4QueryInfoLen = sizeof(UINT_32);
- if (u4QueryBufferLen >= sizeof(UINT_32)) {
- ASSERT(pvQueryBuffer);
- *(PUINT_32) pvQueryBuffer = prAdapter->u4OsPacketFilter;
- }
- return WLAN_STATUS_SUCCESS;
- } /* wlanoidQueryCurrentPacketFilter */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to query ACPI device power state.
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[in] pvQueryBuffer Pointer to the buffer that holds the result of
- * the query.
- * \param[in] u4QueryBufferLen The length of the query buffer.
- * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
- * bytes written into the query buffer. If the call
- * failed due to invalid length of the query buffer,
- * returns the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidQueryAcpiDevicePowerState(IN P_ADAPTER_T prAdapter,
- IN PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
- {
- #if DBG
- PPARAM_DEVICE_POWER_STATE prPowerState;
- #endif
- DEBUGFUNC("wlanoidQueryAcpiDevicePowerState");
- ASSERT(prAdapter);
- ASSERT(pu4QueryInfoLen);
- if (u4QueryBufferLen)
- ASSERT(pvQueryBuffer);
- *pu4QueryInfoLen = sizeof(PARAM_DEVICE_POWER_STATE);
- #if DBG
- prPowerState = (PPARAM_DEVICE_POWER_STATE) pvQueryBuffer;
- switch (*prPowerState) {
- case ParamDeviceStateD0:
- DBGLOG(OID, INFO, "Query Power State: D0\n");
- break;
- case ParamDeviceStateD1:
- DBGLOG(OID, INFO, "Query Power State: D1\n");
- break;
- case ParamDeviceStateD2:
- DBGLOG(OID, INFO, "Query Power State: D2\n");
- break;
- case ParamDeviceStateD3:
- DBGLOG(OID, INFO, "Query Power State: D3\n");
- break;
- default:
- break;
- }
- #endif
- /* Since we will disconnect the newwork, therefore we do not
- need to check queue empty */
- *(PPARAM_DEVICE_POWER_STATE) pvQueryBuffer = ParamDeviceStateD3;
- /* WARNLOG(("Ready to transition to D3\n")); */
- return WLAN_STATUS_SUCCESS;
- } /* pwrmgtQueryPower */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to set ACPI device power state.
- *
- * \param[in] pvAdapter Pointer to the Adapter structure.
- * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
- * \param[in] u4SetBufferLen The length of the set buffer.
- * \param[out] pu4SetInfoLen If the call is successful, returns the number of
- * bytes read from the set buffer. If the call failed
- * due to invalid length of the set buffer, returns
- * the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidSetAcpiDevicePowerState(IN P_ADAPTER_T prAdapter,
- IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- PPARAM_DEVICE_POWER_STATE prPowerState;
- BOOLEAN fgRetValue = TRUE;
- DEBUGFUNC("wlanoidSetAcpiDevicePowerState");
- ASSERT(prAdapter);
- ASSERT(pu4SetInfoLen);
- *pu4SetInfoLen = sizeof(PARAM_DEVICE_POWER_STATE);
- ASSERT(pvSetBuffer);
- prPowerState = (PPARAM_DEVICE_POWER_STATE) pvSetBuffer;
- switch (*prPowerState) {
- case ParamDeviceStateD0:
- DBGLOG(OID, INFO, "Set Power State: D0\n");
- kalDevSetPowerState(prAdapter->prGlueInfo, (UINT_32) ParamDeviceStateD0);
- fgRetValue = nicpmSetAcpiPowerD0(prAdapter);
- break;
- case ParamDeviceStateD1:
- DBGLOG(OID, INFO, "Set Power State: D1\n");
- /* no break here */
- case ParamDeviceStateD2:
- DBGLOG(OID, INFO, "Set Power State: D2\n");
- /* no break here */
- case ParamDeviceStateD3:
- DBGLOG(OID, INFO, "Set Power State: D3\n");
- fgRetValue = nicpmSetAcpiPowerD3(prAdapter);
- kalDevSetPowerState(prAdapter->prGlueInfo, (UINT_32) ParamDeviceStateD3);
- break;
- default:
- break;
- }
- if (fgRetValue == TRUE)
- return WLAN_STATUS_SUCCESS;
- else
- return WLAN_STATUS_FAILURE;
- } /* end of wlanoidSetAcpiDevicePowerState() */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to query the current fragmentation threshold.
- *
- * \param[in] pvAdapter Pointer to the Adapter structure.
- * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
- * the query.
- * \param[in] u4QueryBufferLen The length of the query buffer.
- * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
- * bytes written into the query buffer. If the call
- * failed due to invalid length of the query buffer,
- * returns the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_BUFFER_TOO_SHORT
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidQueryFragThreshold(IN P_ADAPTER_T prAdapter,
- OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
- {
- DEBUGFUNC("wlanoidQueryFragThreshold");
- ASSERT(prAdapter);
- if (u4QueryBufferLen)
- ASSERT(pvQueryBuffer);
- ASSERT(pu4QueryInfoLen);
- DBGLOG(OID, LOUD, "\n");
- #if CFG_TX_FRAGMENT
- return WLAN_STATUS_SUCCESS;
- #else
- return WLAN_STATUS_NOT_SUPPORTED;
- #endif /* CFG_TX_FRAGMENT */
- } /* end of wlanoidQueryFragThreshold() */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to set a new fragmentation threshold to the
- * driver.
- *
- * \param[in] pvAdapter Pointer to the Adapter structure.
- * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
- * \param[in] u4SetBufferLen The length of the set buffer.
- * \param[out] pu4SetInfoLen If the call is successful, returns the number of
- * bytes read from the set buffer. If the call failed
- * due to invalid length of the set buffer, returns
- * the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_INVALID_DATA
- * \retval WLAN_STATUS_INVALID_LENGTH
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidSetFragThreshold(IN P_ADAPTER_T prAdapter,
- IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- #if CFG_TX_FRAGMENT
- return WLAN_STATUS_SUCCESS;
- #else
- return WLAN_STATUS_NOT_SUPPORTED;
- #endif /* CFG_TX_FRAGMENT */
- } /* end of wlanoidSetFragThreshold() */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to query the current RTS threshold.
- *
- * \param[in] pvAdapter Pointer to the Adapter structure.
- * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
- * the query.
- * \param[in] u4QueryBufferLen The length of the query buffer.
- * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
- * bytes written into the query buffer. If the call
- * failed due to invalid length of the query buffer,
- * returns the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_BUFFER_TOO_SHORT
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidQueryRtsThreshold(IN P_ADAPTER_T prAdapter,
- OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
- {
- DEBUGFUNC("wlanoidQueryRtsThreshold");
- ASSERT(prAdapter);
- if (u4QueryBufferLen)
- ASSERT(pvQueryBuffer);
- ASSERT(pu4QueryInfoLen);
- DBGLOG(OID, LOUD, "\n");
- if (u4QueryBufferLen < sizeof(PARAM_RTS_THRESHOLD)) {
- *pu4QueryInfoLen = sizeof(PARAM_RTS_THRESHOLD);
- return WLAN_STATUS_BUFFER_TOO_SHORT;
- }
- *((PARAM_RTS_THRESHOLD *) pvQueryBuffer) = prAdapter->rWlanInfo.eRtsThreshold;
- return WLAN_STATUS_SUCCESS;
- } /* wlanoidQueryRtsThreshold */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to set a new RTS threshold to the driver.
- *
- * \param[in] pvAdapter Pointer to the Adapter structure.
- * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
- * \param[in] u4SetBufferLen The length of the set buffer.
- * \param[out] pu4SetInfoLen If the call is successful, returns the number of
- * bytes read from the set buffer. If the call failed
- * due to invalid length of the set buffer, returns
- * the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_INVALID_DATA
- * \retval WLAN_STATUS_INVALID_LENGTH
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidSetRtsThreshold(IN P_ADAPTER_T prAdapter,
- IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- PARAM_RTS_THRESHOLD *prRtsThreshold;
- ASSERT(prAdapter);
- ASSERT(pu4SetInfoLen);
- *pu4SetInfoLen = sizeof(PARAM_RTS_THRESHOLD);
- if (u4SetBufferLen < sizeof(PARAM_RTS_THRESHOLD)) {
- DBGLOG(OID, WARN, "Invalid length %u\n", u4SetBufferLen);
- return WLAN_STATUS_INVALID_LENGTH;
- }
- prRtsThreshold = (PARAM_RTS_THRESHOLD *) pvSetBuffer;
- *prRtsThreshold = prAdapter->rWlanInfo.eRtsThreshold;
- return WLAN_STATUS_SUCCESS;
- } /* wlanoidSetRtsThreshold */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is used to turn radio off.
- *
- * \param[in] pvAdapter Pointer to the Adapter structure.
- * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
- * \param[in] u4SetBufferLen The length of the set buffer.
- * \param[out] pu4SetInfoLen If the call is successful, returns the number of
- * bytes read from the set buffer. If the call failed
- * due to invalid length of the set buffer, returns
- * the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_ADAPTER_NOT_READY
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidSetDisassociate(IN P_ADAPTER_T prAdapter,
- IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- P_MSG_AIS_ABORT_T prAisAbortMsg;
- DEBUGFUNC("wlanoidSetDisassociate");
- ASSERT(prAdapter);
- ASSERT(pu4SetInfoLen);
- *pu4SetInfoLen = 0;
- if (prAdapter->rAcpiState == ACPI_STATE_D3) {
- DBGLOG(OID, WARN, "Fail in set disassociate! (Adapter not ready). ACPI=D%d, Radio=%d\n",
- prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
- return WLAN_STATUS_ADAPTER_NOT_READY;
- }
- /* prepare message to AIS */
- prAdapter->rWifiVar.rConnSettings.fgIsConnReqIssued = FALSE;
- prAdapter->rWifiVar.rConnSettings.eReConnectLevel = RECONNECT_LEVEL_USER_SET;
- /* Send AIS Abort Message */
- prAisAbortMsg = (P_MSG_AIS_ABORT_T) cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_AIS_ABORT_T));
- if (!prAisAbortMsg) {
- ASSERT(0);
- return WLAN_STATUS_FAILURE;
- }
- prAisAbortMsg->rMsgHdr.eMsgId = MID_OID_AIS_FSM_JOIN_REQ;
- prAisAbortMsg->ucReasonOfDisconnect = DISCONNECT_REASON_CODE_NEW_CONNECTION;
- prAisAbortMsg->fgDelayIndication = FALSE;
- mboxSendMsg(prAdapter, MBOX_ID_0, (P_MSG_HDR_T) prAisAbortMsg, MSG_SEND_METHOD_BUF);
- /* indicate for disconnection */
- if (kalGetMediaStateIndicated(prAdapter->prGlueInfo) == PARAM_MEDIA_STATE_CONNECTED) {
- DBGLOG(OID, INFO, "DisconnectByOid\n");
- kalIndicateStatusAndComplete(prAdapter->prGlueInfo, WLAN_STATUS_MEDIA_DISCONNECT_LOCALLY, NULL, 0);
- }
- #if !defined(LINUX)
- prAdapter->fgIsRadioOff = TRUE;
- #endif
- return WLAN_STATUS_SUCCESS;
- } /* wlanoidSetDisassociate */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is used to query the power save profile.
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[out] pvQueryBuf A pointer to the buffer that holds the result of
- * the query.
- * \param[in] u4QueryBufLen The length of the query buffer.
- * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
- * bytes written into the query buffer. If the call
- * failed due to invalid length of the query buffer,
- * returns the amount of storage needed.
- *
- * \return WLAN_STATUS_SUCCESS
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidQuery802dot11PowerSaveProfile(IN P_ADAPTER_T prAdapter,
- IN PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
- {
- DEBUGFUNC("wlanoidQuery802dot11PowerSaveProfile");
- ASSERT(prAdapter);
- ASSERT(pu4QueryInfoLen);
- if (u4QueryBufferLen != 0) {
- ASSERT(pvQueryBuffer);
- /* *(PPARAM_POWER_MODE) pvQueryBuffer = (PARAM_POWER_MODE)(prAdapter->rWlanInfo.ePowerSaveMode.ucPsProfile); */
- *(PPARAM_POWER_MODE) pvQueryBuffer =
- (PARAM_POWER_MODE) (prAdapter->rWlanInfo.arPowerSaveMode[NETWORK_TYPE_AIS_INDEX].ucPsProfile);
- *pu4QueryInfoLen = sizeof(PARAM_POWER_MODE);
- /* hack for CTIA power mode setting function */
- if (prAdapter->fgEnCtiaPowerMode) {
- /* set to non-zero value (to prevent MMI query 0, before it intends to set 0, */
- /* which will skip its following state machine) */
- *(PPARAM_POWER_MODE) pvQueryBuffer = (PARAM_POWER_MODE) 2;
- }
- }
- return WLAN_STATUS_SUCCESS;
- }
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is used to set the power save profile.
- *
- * \param[in] pvAdapter Pointer to the Adapter structure.
- * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
- * \param[in] u4SetBufferLen The length of the set buffer.
- * \param[out] pu4SetInfoLen If the call is successful, returns the number of
- * bytes read from the set buffer. If the call failed
- * due to invalid length of the set buffer, returns
- * the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_INVALID_LENGTH
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidSet802dot11PowerSaveProfile(IN P_ADAPTER_T prAdapter,
- IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- WLAN_STATUS status;
- PARAM_POWER_MODE ePowerMode;
- DEBUGFUNC("wlanoidSet802dot11PowerSaveProfile");
- ASSERT(prAdapter);
- ASSERT(pu4SetInfoLen);
- *pu4SetInfoLen = sizeof(PARAM_POWER_MODE);
- if (u4SetBufferLen < sizeof(PARAM_POWER_MODE)) {
- DBGLOG(OID, WARN, "Invalid length %u\n", u4SetBufferLen);
- return WLAN_STATUS_INVALID_LENGTH;
- } else if (*(PPARAM_POWER_MODE) pvSetBuffer >= Param_PowerModeMax) {
- /* WARNLOG(("Invalid power mode %d\n", */
- /* *(PPARAM_POWER_MODE) pvSetBuffer)); */
- return WLAN_STATUS_INVALID_DATA;
- }
- ePowerMode = *(PPARAM_POWER_MODE) pvSetBuffer;
- if (prAdapter->fgEnCtiaPowerMode) {
- if (ePowerMode == Param_PowerModeCAM)
- ;
- else {
- /* User setting to PS mode (Param_PowerModeMAX_PSP or Param_PowerModeFast_PSP) */
- if (prAdapter->u4CtiaPowerMode == 0)
- /* force to keep in CAM mode */
- ePowerMode = Param_PowerModeCAM;
- else if (prAdapter->u4CtiaPowerMode == 1)
- ePowerMode = Param_PowerModeMAX_PSP;
- else if (prAdapter->u4CtiaPowerMode == 2)
- ePowerMode = Param_PowerModeFast_PSP;
- }
- }
- status = nicConfigPowerSaveProfile(prAdapter, NETWORK_TYPE_AIS_INDEX, ePowerMode, TRUE);
- switch (ePowerMode) {
- case Param_PowerModeCAM:
- DBGLOG(OID, INFO, "Set Wi-Fi PS mode to CAM (%d)\n", ePowerMode);
- break;
- case Param_PowerModeMAX_PSP:
- DBGLOG(OID, INFO, "Set Wi-Fi PS mode to MAX PS (%d)\n", ePowerMode);
- break;
- case Param_PowerModeFast_PSP:
- DBGLOG(OID, INFO, "Set Wi-Fi PS mode to FAST PS (%d)\n", ePowerMode);
- break;
- default:
- DBGLOG(OID, INFO, "invalid Wi-Fi PS mode setting (%d)\n", ePowerMode);
- break;
- }
- return status;
- } /* end of wlanoidSetAcpiDevicePowerStateMode() */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to query current status of AdHoc Mode.
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[in] pvQueryBuffer Pointer to the buffer that holds the result of
- * the query.
- * \param[in] u4QueryBufferLen The length of the query buffer.
- * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
- * bytes written into the query buffer. If the call
- * failed due to invalid length of the query buffer,
- * returns the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_BUFFER_TOO_SHORT
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidQueryAdHocMode(IN P_ADAPTER_T prAdapter,
- OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
- {
- return WLAN_STATUS_SUCCESS;
- } /* end of wlanoidQueryAdHocMode() */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to set AdHoc Mode.
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[in] pvSetBuffer Pointer to the buffer that holds the data to be set.
- * \param[in] u4SetBufferLen The length of the set buffer.
- * \param[out] pu4SetInfoLen If the call is successful, returns the number of
- * bytes read from the set buffer. If the call failed
- * due to invalid length of the set buffer, returns
- * the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_INVALID_LENGTH
- * \retval WLAN_STATUS_INVALID_DATA
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidSetAdHocMode(IN P_ADAPTER_T prAdapter,
- IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- return WLAN_STATUS_SUCCESS;
- } /* end of wlanoidSetAdHocMode() */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to query RF frequency.
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[in] pvQueryBuffer Pointer to the buffer that holds the result of
- * the query.
- * \param[in] u4QueryBufferLen The length of the query buffer.
- * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
- * bytes written into the query buffer. If the call
- * failed due to invalid length of the query buffer,
- * returns the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_BUFFER_TOO_SHORT
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidQueryFrequency(IN P_ADAPTER_T prAdapter,
- OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
- {
- DEBUGFUNC("wlanoidQueryFrequency");
- ASSERT(prAdapter);
- ASSERT(pu4QueryInfoLen);
- if (u4QueryBufferLen)
- ASSERT(pvQueryBuffer);
- if (u4QueryBufferLen < sizeof(UINT_32))
- return WLAN_STATUS_BUFFER_TOO_SHORT;
- if (prAdapter->rWifiVar.rConnSettings.eOPMode == NET_TYPE_INFRA) {
- if (kalGetMediaStateIndicated(prAdapter->prGlueInfo) == PARAM_MEDIA_STATE_CONNECTED) {
- *(PUINT_32) pvQueryBuffer =
- nicChannelNum2Freq(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX].ucPrimaryChannel);
- } else {
- *(PUINT_32) pvQueryBuffer = 0;
- }
- } else {
- *(PUINT_32) pvQueryBuffer = nicChannelNum2Freq(prAdapter->rWifiVar.rConnSettings.ucAdHocChannelNum);
- }
- return WLAN_STATUS_SUCCESS;
- } /* end of wlanoidQueryFrequency() */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to set RF frequency by User Settings.
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[in] pvQueryBuffer Pointer to the buffer that holds the result of
- * the query.
- * \param[in] u4QueryBufferLen The length of the query buffer.
- * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
- * bytes written into the query buffer. If the call
- * failed due to invalid length of the query buffer,
- * returns the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_INVALID_LENGTH
- * \retval WLAN_STATUS_INVALID_DATA
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidSetFrequency(IN P_ADAPTER_T prAdapter,
- IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- PUINT_32 pu4FreqInKHz;
- DEBUGFUNC("wlanoidSetFrequency");
- ASSERT(prAdapter);
- ASSERT(pu4SetInfoLen);
- *pu4SetInfoLen = sizeof(UINT_32);
- if (u4SetBufferLen < sizeof(UINT_32))
- return WLAN_STATUS_INVALID_LENGTH;
- ASSERT(pvSetBuffer);
- pu4FreqInKHz = (PUINT_32) pvSetBuffer;
- prAdapter->rWifiVar.rConnSettings.ucAdHocChannelNum = (UINT_8) nicFreq2ChannelNum(*pu4FreqInKHz);
- prAdapter->rWifiVar.rConnSettings.eAdHocBand = *pu4FreqInKHz < 5000000 ? BAND_2G4 : BAND_5G;
- return WLAN_STATUS_SUCCESS;
- } /* end of wlanoidSetFrequency() */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to set 802.11 channel of the radio frequency.
- * This is a proprietary function call to Lunux currently.
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
- * \param[in] u4SetBufferLen The length of the set buffer.
- * \param[out] pu4SetInfoLen If the call is successful, returns the number of
- * bytes read from the set buffer. If the call failed
- * due to invalid length of the set buffer, returns
- * the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_INVALID_LENGTH
- * \retval WLAN_STATUS_INVALID_DATA
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidSetChannel(IN P_ADAPTER_T prAdapter, IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- ASSERT(0); /* // */
- return WLAN_STATUS_SUCCESS;
- }
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to query the Beacon Interval from User Settings.
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[in] pvQueryBuffer Pointer to the buffer that holds the result of
- * the query.
- * \param[in] u4QueryBufferLen The length of the query buffer.
- * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
- * bytes written into the query buffer. If the call
- * failed due to invalid length of the query buffer,
- * returns the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_BUFFER_TOO_SHORT
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidQueryBeaconInterval(IN P_ADAPTER_T prAdapter,
- OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
- {
- DEBUGFUNC("wlanoidQueryBeaconInterval");
- ASSERT(prAdapter);
- ASSERT(pu4QueryInfoLen);
- if (u4QueryBufferLen)
- ASSERT(pvQueryBuffer);
- *pu4QueryInfoLen = sizeof(UINT_32);
- if (u4QueryBufferLen < sizeof(UINT_32))
- return WLAN_STATUS_BUFFER_TOO_SHORT;
- if (kalGetMediaStateIndicated(prAdapter->prGlueInfo) == PARAM_MEDIA_STATE_CONNECTED) {
- if (prAdapter->rWifiVar.rConnSettings.eOPMode == NET_TYPE_INFRA)
- *(PUINT_32) pvQueryBuffer = prAdapter->rWlanInfo.rCurrBssId.rConfiguration.u4BeaconPeriod;
- else
- *(PUINT_32) pvQueryBuffer = (UINT_32) prAdapter->rWlanInfo.u2BeaconPeriod;
- } else {
- if (prAdapter->rWifiVar.rConnSettings.eOPMode == NET_TYPE_INFRA)
- *(PUINT_32) pvQueryBuffer = 0;
- else
- *(PUINT_32) pvQueryBuffer = (UINT_32) prAdapter->rWlanInfo.u2BeaconPeriod;
- }
- return WLAN_STATUS_SUCCESS;
- } /* end of wlanoidQueryBeaconInterval() */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to set the Beacon Interval to User Settings.
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[in] pvSetBuffer Pointer to the buffer that holds the data to be set.
- * \param[in] u4SetBufferLen The length of the set buffer.
- * \param[out] pu4SetInfoLen If the call is successful, returns the number of
- * bytes read from the set buffer. If the call failed
- * due to invalid length of the set buffer, returns
- * the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_INVALID_LENGTH
- * \retval WLAN_STATUS_INVALID_DATA
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidSetBeaconInterval(IN P_ADAPTER_T prAdapter,
- IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- PUINT_32 pu4BeaconInterval;
- DEBUGFUNC("wlanoidSetBeaconInterval");
- ASSERT(prAdapter);
- ASSERT(pu4SetInfoLen);
- *pu4SetInfoLen = sizeof(UINT_32);
- if (u4SetBufferLen < sizeof(UINT_32))
- return WLAN_STATUS_INVALID_LENGTH;
- ASSERT(pvSetBuffer);
- pu4BeaconInterval = (PUINT_32) pvSetBuffer;
- if ((*pu4BeaconInterval < DOT11_BEACON_PERIOD_MIN) || (*pu4BeaconInterval > DOT11_BEACON_PERIOD_MAX)) {
- DBGLOG(OID, TRACE, "Invalid Beacon Interval = %u\n", *pu4BeaconInterval);
- return WLAN_STATUS_INVALID_DATA;
- }
- prAdapter->rWlanInfo.u2BeaconPeriod = (UINT_16) *pu4BeaconInterval;
- DBGLOG(OID, INFO, "Set beacon interval: %d\n", prAdapter->rWlanInfo.u2BeaconPeriod);
- return WLAN_STATUS_SUCCESS;
- } /* end of wlanoidSetBeaconInterval() */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to query the ATIM window from User Settings.
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[in] pvQueryBuffer Pointer to the buffer that holds the result of
- * the query.
- * \param[in] u4QueryBufferLen The length of the query buffer.
- * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
- * bytes written into the query buffer. If the call
- * failed due to invalid length of the query buffer,
- * returns the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_BUFFER_TOO_SHORT
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidQueryAtimWindow(IN P_ADAPTER_T prAdapter,
- OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
- {
- DEBUGFUNC("wlanoidQueryAtimWindow");
- ASSERT(prAdapter);
- ASSERT(pu4QueryInfoLen);
- if (u4QueryBufferLen)
- ASSERT(pvQueryBuffer);
- *pu4QueryInfoLen = sizeof(UINT_32);
- if (u4QueryBufferLen < sizeof(UINT_32))
- return WLAN_STATUS_BUFFER_TOO_SHORT;
- if (prAdapter->rWifiVar.rConnSettings.eOPMode == NET_TYPE_INFRA)
- *(PUINT_32) pvQueryBuffer = 0;
- else
- *(PUINT_32) pvQueryBuffer = (UINT_32) prAdapter->rWlanInfo.u2AtimWindow;
- return WLAN_STATUS_SUCCESS;
- } /* end of wlanoidQueryAtimWindow() */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to set the ATIM window to User Settings.
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[in] pvSetBuffer Pointer to the buffer that holds the data to be set.
- * \param[in] u4SetBufferLen The length of the set buffer.
- * \param[out] pu4SetInfoLen If the call is successful, returns the number of
- * bytes read from the set buffer. If the call failed
- * due to invalid length of the set buffer, returns
- * the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_INVALID_LENGTH
- * \retval WLAN_STATUS_INVALID_DATA
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidSetAtimWindow(IN P_ADAPTER_T prAdapter,
- IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- PUINT_32 pu4AtimWindow;
- DEBUGFUNC("wlanoidSetAtimWindow");
- ASSERT(prAdapter);
- ASSERT(pu4SetInfoLen);
- *pu4SetInfoLen = sizeof(UINT_32);
- if (u4SetBufferLen < sizeof(UINT_32))
- return WLAN_STATUS_INVALID_LENGTH;
- ASSERT(pvSetBuffer);
- pu4AtimWindow = (PUINT_32) pvSetBuffer;
- prAdapter->rWlanInfo.u2AtimWindow = (UINT_16) *pu4AtimWindow;
- return WLAN_STATUS_SUCCESS;
- } /* end of wlanoidSetAtimWindow() */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to Set the MAC address which is currently used by the NIC.
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[in] pvSetBuffer Pointer to the buffer that holds the data to be set.
- * \param[in] u4SetBufferLen The length of the set buffer.
- * \param[out] pu4SetInfoLen If the call is successful, returns the number of
- * bytes read from the set buffer. If the call failed
- * due to invalid length of the set buffer, returns
- * the amount of storage needed.
- *
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_INVALID_LENGTH
- * \retval WLAN_STATUS_INVALID_DATA
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidSetCurrentAddr(IN P_ADAPTER_T prAdapter,
- IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- ASSERT(0); /* // */
- return WLAN_STATUS_SUCCESS;
- } /* end of wlanoidSetCurrentAddr() */
- #if CFG_TCP_IP_CHKSUM_OFFLOAD
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief Setting the checksum offload function.
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[in] pvSetBuffer Pointer to the buffer that holds the data to be set.
- * \param[in] u4SetBufferLen The length of the set buffer.
- * \param[out] pu4SetInfoLen If the call is successful, returns the number of
- * bytes read from the set buffer. If the call failed
- * due to invalid length of the set buffer, returns
- * the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_INVALID_LENGTH
- * \retval WLAN_STATUS_ADAPTER_NOT_READY
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidSetCSUMOffload(IN P_ADAPTER_T prAdapter,
- IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- UINT_32 i, u4CSUMFlags;
- CMD_BASIC_CONFIG rCmdBasicConfig;
- DEBUGFUNC("wlanoidSetCSUMOffload");
- DBGLOG(OID, LOUD, "\n");
- ASSERT(prAdapter);
- ASSERT(pu4SetInfoLen);
- *pu4SetInfoLen = sizeof(UINT_32);
- if (u4SetBufferLen < sizeof(UINT_32))
- return WLAN_STATUS_INVALID_LENGTH;
- ASSERT(pvSetBuffer);
- u4CSUMFlags = *(PUINT_32) pvSetBuffer;
- kalMemZero(&rCmdBasicConfig, sizeof(CMD_BASIC_CONFIG));
- for (i = 0; i < 6; i++) { /* set to broadcast address for not-specified */
- rCmdBasicConfig.rMyMacAddr[i] = 0xff;
- }
- rCmdBasicConfig.ucNative80211 = 0; /* @FIXME: for Vista */
- if (u4CSUMFlags & CSUM_OFFLOAD_EN_TX_TCP)
- rCmdBasicConfig.rCsumOffload.u2TxChecksum |= BIT(2);
- if (u4CSUMFlags & CSUM_OFFLOAD_EN_TX_UDP)
- rCmdBasicConfig.rCsumOffload.u2TxChecksum |= BIT(1);
- if (u4CSUMFlags & CSUM_OFFLOAD_EN_TX_IP)
- rCmdBasicConfig.rCsumOffload.u2TxChecksum |= BIT(0);
- if (u4CSUMFlags & CSUM_OFFLOAD_EN_RX_TCP)
- rCmdBasicConfig.rCsumOffload.u2RxChecksum |= BIT(2);
- if (u4CSUMFlags & CSUM_OFFLOAD_EN_RX_UDP)
- rCmdBasicConfig.rCsumOffload.u2RxChecksum |= BIT(1);
- if (u4CSUMFlags & (CSUM_OFFLOAD_EN_RX_IPv4 | CSUM_OFFLOAD_EN_RX_IPv6))
- rCmdBasicConfig.rCsumOffload.u2RxChecksum |= BIT(0);
- prAdapter->u4CSUMFlags = u4CSUMFlags;
- return wlanSendSetQueryCmd(prAdapter,
- CMD_ID_BASIC_CONFIG,
- TRUE,
- FALSE,
- TRUE,
- nicCmdEventSetCommon,
- nicOidCmdTimeoutCommon,
- sizeof(CMD_BASIC_CONFIG), (PUINT_8) &rCmdBasicConfig, pvSetBuffer, u4SetBufferLen);
- }
- #endif /* CFG_TCP_IP_CHKSUM_OFFLOAD */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief Setting the IP address for pattern search function.
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
- * \param[in] u4SetBufferLen The length of the set buffer.
- * \param[out] pu4SetInfoLen If the call is successful, returns the number of
- * bytes read from the set buffer. If the call failed
- * due to invalid length of the set buffer, returns
- * the amount of storage needed.
- *
- * \return WLAN_STATUS_SUCCESS
- * \return WLAN_STATUS_ADAPTER_NOT_READY
- * \return WLAN_STATUS_INVALID_LENGTH
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidSetNetworkAddress(IN P_ADAPTER_T prAdapter,
- IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
- UINT_32 i, j;
- P_CMD_SET_NETWORK_ADDRESS_LIST prCmdNetworkAddressList;
- P_PARAM_NETWORK_ADDRESS_LIST prNetworkAddressList = (P_PARAM_NETWORK_ADDRESS_LIST) pvSetBuffer;
- P_PARAM_NETWORK_ADDRESS prNetworkAddress;
- P_PARAM_NETWORK_ADDRESS_IP prNetAddrIp;
- UINT_32 u4IpAddressCount, u4CmdSize;
- PUINT_8 pucBuf = (PUINT_8) pvSetBuffer;
- #if CFG_ENABLE_GTK_FRAME_FILTER
- UINT_32 u4IpV4AddrListSize;
- P_BSS_INFO_T prBssInfo = &prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX];
- #endif
- DEBUGFUNC("wlanoidSetNetworkAddress");
- DBGLOG(OID, LOUD, "\n");
- ASSERT(prAdapter);
- ASSERT(pu4SetInfoLen);
- *pu4SetInfoLen = 4;
- if (u4SetBufferLen < sizeof(PARAM_NETWORK_ADDRESS_LIST))
- return WLAN_STATUS_INVALID_DATA;
- *pu4SetInfoLen = 0;
- u4IpAddressCount = 0;
- prNetworkAddress = prNetworkAddressList->arAddress;
- for (i = 0; i < prNetworkAddressList->u4AddressCount; i++) {
- if (prNetworkAddress->u2AddressType == PARAM_PROTOCOL_ID_TCP_IP &&
- prNetworkAddress->u2AddressLength == sizeof(PARAM_NETWORK_ADDRESS_IP)) {
- u4IpAddressCount++;
- }
- prNetworkAddress = (P_PARAM_NETWORK_ADDRESS) (prNetworkAddress +
- (ULONG) (prNetworkAddress->u2AddressLength +
- OFFSET_OF(PARAM_NETWORK_ADDRESS, aucAddress)));
- }
- /* construct payload of command packet */
- u4CmdSize = OFFSET_OF(CMD_SET_NETWORK_ADDRESS_LIST, arNetAddress) +
- sizeof(IPV4_NETWORK_ADDRESS) * u4IpAddressCount;
- if (u4IpAddressCount == 0)
- u4CmdSize = sizeof(CMD_SET_NETWORK_ADDRESS_LIST);
- prCmdNetworkAddressList = (P_CMD_SET_NETWORK_ADDRESS_LIST) kalMemAlloc(u4CmdSize, VIR_MEM_TYPE);
- if (prCmdNetworkAddressList == NULL)
- return WLAN_STATUS_FAILURE;
- #if CFG_ENABLE_GTK_FRAME_FILTER
- u4IpV4AddrListSize = OFFSET_OF(IPV4_NETWORK_ADDRESS_LIST, arNetAddr) +
- (u4IpAddressCount * sizeof(IPV4_NETWORK_ADDRESS));
- if (prBssInfo->prIpV4NetAddrList)
- FREE_IPV4_NETWORK_ADDR_LIST(prBssInfo->prIpV4NetAddrList);
- prBssInfo->prIpV4NetAddrList = (P_IPV4_NETWORK_ADDRESS_LIST) kalMemAlloc(u4IpV4AddrListSize, VIR_MEM_TYPE);
- if (prBssInfo->prIpV4NetAddrList == NULL) {
- kalMemFree(prCmdNetworkAddressList, VIR_MEM_TYPE, u4CmdSize);
- return WLAN_STATUS_FAILURE;
- }
- prBssInfo->prIpV4NetAddrList->ucAddrCount = (UINT_8) u4IpAddressCount;
- #endif
- /* fill P_CMD_SET_NETWORK_ADDRESS_LIST */
- prCmdNetworkAddressList->ucNetTypeIndex = NETWORK_TYPE_AIS_INDEX;
- /* only to set IP address to FW once ARP filter is enabled */
- if (prAdapter->fgEnArpFilter) {
- prCmdNetworkAddressList->ucAddressCount = (UINT_8) u4IpAddressCount;
- prNetworkAddress = prNetworkAddressList->arAddress;
- DBGLOG(OID, INFO, "u4IpAddressCount (%u)\n", u4IpAddressCount);
- for (i = 0, j = 0; i < prNetworkAddressList->u4AddressCount; i++) {
- if (prNetworkAddress->u2AddressType == PARAM_PROTOCOL_ID_TCP_IP &&
- prNetworkAddress->u2AddressLength == sizeof(PARAM_NETWORK_ADDRESS_IP)) {
- prNetAddrIp = (P_PARAM_NETWORK_ADDRESS_IP) prNetworkAddress->aucAddress;
- kalMemCopy(prCmdNetworkAddressList->arNetAddress[j].aucIpAddr,
- &(prNetAddrIp->in_addr), sizeof(UINT_32));
- #if CFG_ENABLE_GTK_FRAME_FILTER
- kalMemCopy(prBssInfo->prIpV4NetAddrList->arNetAddr[j].aucIpAddr,
- &(prNetAddrIp->in_addr), sizeof(UINT_32));
- #endif
- j++;
- pucBuf = (PUINT_8) &prNetAddrIp->in_addr;
- DBGLOG(OID, INFO,
- "prNetAddrIp->in_addr:%d:%d:%d:%d\n", pucBuf[0], pucBuf[1], pucBuf[2],
- pucBuf[3]);
- }
- prNetworkAddress = (P_PARAM_NETWORK_ADDRESS) (prNetworkAddress +
- (ULONG) (prNetworkAddress->u2AddressLength +
- OFFSET_OF(PARAM_NETWORK_ADDRESS,
- aucAddress)));
- }
- } else {
- prCmdNetworkAddressList->ucAddressCount = 0;
- }
- rStatus = wlanSendSetQueryCmd(prAdapter,
- CMD_ID_SET_IP_ADDRESS,
- TRUE,
- FALSE,
- TRUE,
- nicCmdEventSetIpAddress,
- nicOidCmdTimeoutCommon,
- u4CmdSize, (PUINT_8) prCmdNetworkAddressList, pvSetBuffer, u4SetBufferLen);
- kalMemFree(prCmdNetworkAddressList, VIR_MEM_TYPE, u4CmdSize);
- return rStatus;
- }
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief Set driver to switch into RF test mode
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set,
- * should be NULL
- * \param[in] u4SetBufferLen The length of the set buffer, should be 0
- * \param[out] pu4SetInfoLen If the call is successful, returns the number of
- * bytes read from the set buffer. If the call failed
- * due to invalid length of the set buffer, returns
- * the amount of storage needed.
- *
- * \return WLAN_STATUS_SUCCESS
- * \return WLAN_STATUS_ADAPTER_NOT_READY
- * \return WLAN_STATUS_INVALID_DATA
- * \return WLAN_STATUS_INVALID_LENGTH
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidRftestSetTestMode(IN P_ADAPTER_T prAdapter,
- IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- WLAN_STATUS rStatus;
- CMD_TEST_CTRL_T rCmdTestCtrl;
- DEBUGFUNC("wlanoidRftestSetTestMode");
- ASSERT(prAdapter);
- ASSERT(pvSetBuffer);
- ASSERT(pu4SetInfoLen);
- *pu4SetInfoLen = 0;
- if (u4SetBufferLen == 0) {
- if (prAdapter->fgTestMode == FALSE) {
- /* switch to RF Test mode */
- rCmdTestCtrl.ucAction = 0; /* Switch mode */
- rCmdTestCtrl.u.u4OpMode = 1; /* RF test mode */
- rStatus = wlanSendSetQueryCmd(prAdapter,
- CMD_ID_TEST_MODE,
- TRUE,
- TRUE,
- TRUE,
- nicCmdEventEnterRfTest,
- nicOidCmdEnterRFTestTimeout,
- sizeof(CMD_TEST_CTRL_T),
- (PUINT_8) &rCmdTestCtrl, pvSetBuffer, u4SetBufferLen);
- } else {
- /* already in test mode .. */
- rStatus = WLAN_STATUS_SUCCESS;
- }
- } else {
- rStatus = WLAN_STATUS_INVALID_DATA;
- }
- DBGLOG(OID, INFO, "Enter TestMode, setBufLen %u, InTestMode %d, rStatus %u\n",
- u4SetBufferLen, prAdapter->fgTestMode, rStatus);
- return rStatus;
- }
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief Set driver to switch into normal operation mode from RF test mode
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set
- * should be NULL
- * \param[in] u4SetBufferLen The length of the set buffer, should be 0
- * \param[out] pu4SetInfoLen If the call is successful, returns the number of
- * bytes read from the set buffer. If the call failed
- * due to invalid length of the set buffer, returns
- * the amount of storage needed.
- *
- * \return WLAN_STATUS_SUCCESS
- * \return WLAN_STATUS_ADAPTER_NOT_READY
- * \return WLAN_STATUS_INVALID_DATA
- * \return WLAN_STATUS_INVALID_LENGTH
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidRftestSetAbortTestMode(IN P_ADAPTER_T prAdapter,
- IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- WLAN_STATUS rStatus;
- CMD_TEST_CTRL_T rCmdTestCtrl;
- DEBUGFUNC("wlanoidRftestSetTestMode");
- ASSERT(prAdapter);
- ASSERT(pvSetBuffer);
- ASSERT(pu4SetInfoLen);
- *pu4SetInfoLen = 0;
- if (u4SetBufferLen == 0) {
- if (prAdapter->fgTestMode == TRUE) {
- /* switch to normal mode */
- rCmdTestCtrl.ucAction = 0; /* Switch mode */
- rCmdTestCtrl.u.u4OpMode = 0; /* normal mode */
- rStatus = wlanSendSetQueryCmd(prAdapter,
- CMD_ID_TEST_MODE,
- TRUE,
- FALSE,
- TRUE,
- nicCmdEventLeaveRfTest,
- nicOidCmdTimeoutCommon,
- sizeof(CMD_TEST_CTRL_T),
- (PUINT_8) &rCmdTestCtrl, pvSetBuffer, u4SetBufferLen);
- } else {
- /* already in normal mode .. */
- rStatus = WLAN_STATUS_SUCCESS;
- }
- } else {
- rStatus = WLAN_STATUS_INVALID_DATA;
- }
- DBGLOG(OID, INFO, "Abort TestMode, setBufLen %u, InTestMode %d, rStatus %u\n",
- u4SetBufferLen, prAdapter->fgTestMode, rStatus);
- return rStatus;
- }
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief query for RF test parameter
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[in] pvQueryBuffer Pointer to the buffer that holds the result of
- * the query.
- * \param[in] u4QueryBufferLen The length of the query buffer.
- * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
- * bytes written into the query buffer. If the call
- * failed due to invalid length of the query buffer,
- * returns the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_BUFFER_TOO_SHORT
- * \retval WLAN_STATUS_NOT_SUPPORTED
- * \retval WLAN_STATUS_NOT_ACCEPTED
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidRftestQueryAutoTest(IN P_ADAPTER_T prAdapter,
- OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
- {
- P_PARAM_MTK_WIFI_TEST_STRUCT_T prRfATInfo;
- WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
- DEBUGFUNC("wlanoidRftestQueryAutoTest");
- ASSERT(prAdapter);
- if (u4QueryBufferLen)
- ASSERT(pvQueryBuffer);
- ASSERT(pu4QueryInfoLen);
- /*pu4QueryInfoLen is depended on upper-layer*/
- *pu4QueryInfoLen = u4QueryBufferLen;
- if (u4QueryBufferLen != sizeof(PARAM_MTK_WIFI_TEST_STRUCT_T))
- DBGLOG(OID, WARN, "Invalid data. QueryBufferLen: %u.\n", u4QueryBufferLen);
- prRfATInfo = (P_PARAM_MTK_WIFI_TEST_STRUCT_T) pvQueryBuffer;
- rStatus = rftestQueryATInfo(prAdapter,
- prRfATInfo->u4FuncIndex, prRfATInfo->u4FuncData, pvQueryBuffer, u4QueryBufferLen);
- return rStatus;
- }
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief Set RF test parameter
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
- * \param[in] u4SetBufferLen The length of the set buffer.
- * \param[out] pu4SetInfoLen If the call is successful, returns the number of
- * bytes read from the set buffer. If the call failed
- * due to invalid length of the set buffer, returns
- * the amount of storage needed.
- *
- * \return WLAN_STATUS_SUCCESS
- * \return WLAN_STATUS_ADAPTER_NOT_READY
- * \return WLAN_STATUS_INVALID_LENGTH
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidRftestSetAutoTest(IN P_ADAPTER_T prAdapter,
- OUT PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- P_PARAM_MTK_WIFI_TEST_STRUCT_T prRfATInfo;
- WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
- DEBUGFUNC("wlanoidRftestSetAutoTest");
- ASSERT(prAdapter);
- ASSERT(pvSetBuffer);
- ASSERT(pu4SetInfoLen);
- *pu4SetInfoLen = sizeof(PARAM_MTK_WIFI_TEST_STRUCT_T);
- if (u4SetBufferLen != sizeof(PARAM_MTK_WIFI_TEST_STRUCT_T))
- DBGLOG(OID, WARN, "Invalid data. SetBufferLen: %u.\n", u4SetBufferLen);
- prRfATInfo = (P_PARAM_MTK_WIFI_TEST_STRUCT_T) pvSetBuffer;
- rStatus = rftestSetATInfo(prAdapter, prRfATInfo->u4FuncIndex, prRfATInfo->u4FuncData);
- return rStatus;
- }
- /* RF test OID set handler */
- WLAN_STATUS rftestSetATInfo(IN P_ADAPTER_T prAdapter, UINT_32 u4FuncIndex, UINT_32 u4FuncData)
- {
- P_GLUE_INFO_T prGlueInfo;
- P_CMD_INFO_T prCmdInfo;
- P_WIFI_CMD_T prWifiCmd;
- P_CMD_TEST_CTRL_T pCmdTestCtrl;
- UINT_8 ucCmdSeqNum;
- ASSERT(prAdapter);
- prGlueInfo = prAdapter->prGlueInfo;
- prCmdInfo = cmdBufAllocateCmdInfo(prAdapter, (CMD_HDR_SIZE + sizeof(CMD_TEST_CTRL_T)));
- if (!prCmdInfo) {
- DBGLOG(OID, ERROR, "Allocate CMD_INFO_T ==> FAILED.\n");
- return WLAN_STATUS_FAILURE;
- }
- /* increase command sequence number */
- ucCmdSeqNum = nicIncreaseCmdSeqNum(prAdapter);
- /* Setup common CMD Info Packet */
- prCmdInfo->eCmdType = COMMAND_TYPE_GENERAL_IOCTL;
- prCmdInfo->u2InfoBufLen = CMD_HDR_SIZE + sizeof(CMD_TEST_CTRL_T);
- prCmdInfo->pfCmdDoneHandler = nicCmdEventSetCommon;
- prCmdInfo->pfCmdTimeoutHandler = nicOidCmdTimeoutCommon;
- prCmdInfo->fgIsOid = TRUE;
- prCmdInfo->ucCID = CMD_ID_TEST_MODE;
- prCmdInfo->fgSetQuery = TRUE;
- prCmdInfo->fgNeedResp = FALSE;
- prCmdInfo->fgDriverDomainMCR = FALSE;
- prCmdInfo->ucCmdSeqNum = ucCmdSeqNum;
- prCmdInfo->u4SetInfoLen = sizeof(CMD_TEST_CTRL_T);
- prCmdInfo->pvInformationBuffer = NULL;
- prCmdInfo->u4InformationBufferLength = 0;
- /* Setup WIFI_CMD_T (payload = CMD_TEST_CTRL_T) */
- prWifiCmd = (P_WIFI_CMD_T) (prCmdInfo->pucInfoBuffer);
- prWifiCmd->u2TxByteCount_UserPriority = prCmdInfo->u2InfoBufLen;
- prWifiCmd->ucCID = prCmdInfo->ucCID;
- prWifiCmd->ucSetQuery = prCmdInfo->fgSetQuery;
- prWifiCmd->ucSeqNum = prCmdInfo->ucCmdSeqNum;
- pCmdTestCtrl = (P_CMD_TEST_CTRL_T) (prWifiCmd->aucBuffer);
- pCmdTestCtrl->ucAction = 1; /* Set ATInfo */
- pCmdTestCtrl->u.rRfATInfo.u4FuncIndex = u4FuncIndex;
- pCmdTestCtrl->u.rRfATInfo.u4FuncData = u4FuncData;
- /* insert into prCmdQueue */
- kalEnqueueCommand(prGlueInfo, (P_QUE_ENTRY_T) prCmdInfo);
- /* wakeup txServiceThread later */
- GLUE_SET_EVENT(prAdapter->prGlueInfo);
- return WLAN_STATUS_PENDING;
- }
- WLAN_STATUS
- rftestQueryATInfo(IN P_ADAPTER_T prAdapter,
- UINT_32 u4FuncIndex, UINT_32 u4FuncData, OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen)
- {
- P_GLUE_INFO_T prGlueInfo;
- P_CMD_INFO_T prCmdInfo;
- P_WIFI_CMD_T prWifiCmd;
- P_CMD_TEST_CTRL_T pCmdTestCtrl;
- UINT_8 ucCmdSeqNum;
- P_EVENT_TEST_STATUS prTestStatus;
- ASSERT(prAdapter);
- prGlueInfo = prAdapter->prGlueInfo;
- if (u4FuncIndex == RF_AT_FUNCID_FW_INFO) {
- /* driver implementation */
- prTestStatus = (P_EVENT_TEST_STATUS) pvQueryBuffer;
- prTestStatus->rATInfo.u4FuncData =
- (prAdapter->rVerInfo.u2FwProductID << 16) | (prAdapter->rVerInfo.u2FwOwnVersion);
- if (u4QueryBufferLen > 8) {
- /*support FW version extended*/
- prTestStatus->rATInfo.u4FuncData2 = prAdapter->rVerInfo.u2FwOwnVersionExtend;
- DBGLOG(OID, INFO, "<wifi> version: 0x%x ,extended : 0x%x\n"
- , prTestStatus->rATInfo.u4FuncData
- , prTestStatus->rATInfo.u4FuncData2);
- } else
- DBGLOG(OID, INFO, "<wifi> version: 0x%x\n"
- , prTestStatus->rATInfo.u4FuncData);
- return WLAN_STATUS_SUCCESS;
- } else if (u4FuncIndex == RF_AT_FUNCID_DRV_INFO) {
- /* driver implementation */
- prTestStatus = (P_EVENT_TEST_STATUS) pvQueryBuffer;
- prTestStatus->rATInfo.u4FuncData = CFG_DRV_OWN_VERSION;
- return WLAN_STATUS_SUCCESS;
- }
- prCmdInfo = cmdBufAllocateCmdInfo(prAdapter, (CMD_HDR_SIZE + sizeof(CMD_TEST_CTRL_T)));
- if (!prCmdInfo) {
- DBGLOG(OID, ERROR, "Allocate CMD_INFO_T ==> FAILED.\n");
- return WLAN_STATUS_FAILURE;
- }
- /* increase command sequence number */
- ucCmdSeqNum = nicIncreaseCmdSeqNum(prAdapter);
- /* Setup common CMD Info Packet */
- prCmdInfo->eCmdType = COMMAND_TYPE_GENERAL_IOCTL;
- prCmdInfo->u2InfoBufLen = CMD_HDR_SIZE + sizeof(CMD_TEST_CTRL_T);
- prCmdInfo->pfCmdDoneHandler = nicCmdEventQueryRfTestATInfo;
- prCmdInfo->pfCmdTimeoutHandler = nicOidCmdTimeoutCommon;
- prCmdInfo->fgIsOid = TRUE;
- prCmdInfo->ucCID = CMD_ID_TEST_MODE;
- prCmdInfo->fgSetQuery = FALSE;
- prCmdInfo->fgNeedResp = TRUE;
- prCmdInfo->fgDriverDomainMCR = FALSE;
- prCmdInfo->ucCmdSeqNum = ucCmdSeqNum;
- prCmdInfo->u4SetInfoLen = sizeof(CMD_TEST_CTRL_T);
- prCmdInfo->pvInformationBuffer = pvQueryBuffer;
- prCmdInfo->u4InformationBufferLength = u4QueryBufferLen;
- /* Setup WIFI_CMD_T (payload = CMD_TEST_CTRL_T) */
- prWifiCmd = (P_WIFI_CMD_T) (prCmdInfo->pucInfoBuffer);
- prWifiCmd->u2TxByteCount_UserPriority = prCmdInfo->u2InfoBufLen;
- prWifiCmd->ucCID = prCmdInfo->ucCID;
- prWifiCmd->ucSetQuery = prCmdInfo->fgSetQuery;
- prWifiCmd->ucSeqNum = prCmdInfo->ucCmdSeqNum;
- pCmdTestCtrl = (P_CMD_TEST_CTRL_T) (prWifiCmd->aucBuffer);
- pCmdTestCtrl->ucAction = 2; /* Get ATInfo */
- pCmdTestCtrl->u.rRfATInfo.u4FuncIndex = u4FuncIndex;
- pCmdTestCtrl->u.rRfATInfo.u4FuncData = u4FuncData;
- /* insert into prCmdQueue */
- kalEnqueueCommand(prGlueInfo, (P_QUE_ENTRY_T) prCmdInfo);
- /* wakeup txServiceThread later */
- GLUE_SET_EVENT(prAdapter->prGlueInfo);
- return WLAN_STATUS_PENDING;
- }
- WLAN_STATUS rftestSetFrequency(IN P_ADAPTER_T prAdapter, IN UINT_32 u4FreqInKHz, IN PUINT_32 pu4SetInfoLen)
- {
- CMD_TEST_CTRL_T rCmdTestCtrl;
- ASSERT(prAdapter);
- rCmdTestCtrl.ucAction = 5; /* Set Channel Frequency */
- rCmdTestCtrl.u.u4ChannelFreq = u4FreqInKHz;
- return wlanSendSetQueryCmd(prAdapter,
- CMD_ID_TEST_MODE,
- TRUE,
- FALSE,
- TRUE,
- nicCmdEventSetCommon,
- nicOidCmdTimeoutCommon, sizeof(CMD_TEST_CTRL_T), (PUINT_8) &rCmdTestCtrl, NULL, 0);
- }
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief command packet generation utility
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[in] ucCID Command ID
- * \param[in] fgSetQuery Set or Query
- * \param[in] fgNeedResp Need for response
- * \param[in] pfCmdDoneHandler Function pointer when command is done
- * \param[in] u4SetQueryInfoLen The length of the set/query buffer
- * \param[in] pucInfoBuffer Pointer to set/query buffer
- *
- *
- * \retval WLAN_STATUS_PENDING
- * \retval WLAN_STATUS_FAILURE
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanSendSetQueryCmd(IN P_ADAPTER_T prAdapter,
- UINT_8 ucCID,
- BOOLEAN fgSetQuery,
- BOOLEAN fgNeedResp,
- BOOLEAN fgIsOid,
- PFN_CMD_DONE_HANDLER pfCmdDoneHandler,
- PFN_CMD_TIMEOUT_HANDLER pfCmdTimeoutHandler,
- UINT_32 u4SetQueryInfoLen,
- PUINT_8 pucInfoBuffer, OUT PVOID pvSetQueryBuffer, IN UINT_32 u4SetQueryBufferLen)
- {
- P_GLUE_INFO_T prGlueInfo;
- P_CMD_INFO_T prCmdInfo;
- P_WIFI_CMD_T prWifiCmd;
- UINT_8 ucCmdSeqNum;
- prGlueInfo = prAdapter->prGlueInfo;
- prCmdInfo = cmdBufAllocateCmdInfo(prAdapter, (CMD_HDR_SIZE + u4SetQueryInfoLen));
- DEBUGFUNC("wlanSendSetQueryCmd");
- if (!prCmdInfo) {
- DBGLOG(OID, ERROR, "Allocate CMD_INFO_T ==> FAILED.\n");
- return WLAN_STATUS_FAILURE;
- }
- /* increase command sequence number */
- ucCmdSeqNum = nicIncreaseCmdSeqNum(prAdapter);
- DBGLOG(OID, TRACE, "ucCmdSeqNum =%d, ucCID =%d\n", ucCmdSeqNum, ucCID);
- /* Setup common CMD Info Packet */
- prCmdInfo->eCmdType = COMMAND_TYPE_NETWORK_IOCTL;
- prCmdInfo->eNetworkType = NETWORK_TYPE_AIS_INDEX;
- prCmdInfo->u2InfoBufLen = (UINT_16) (CMD_HDR_SIZE + u4SetQueryInfoLen);
- prCmdInfo->pfCmdDoneHandler = pfCmdDoneHandler;
- prCmdInfo->pfCmdTimeoutHandler = pfCmdTimeoutHandler;
- prCmdInfo->fgIsOid = fgIsOid;
- prCmdInfo->ucCID = ucCID;
- prCmdInfo->fgSetQuery = fgSetQuery;
- prCmdInfo->fgNeedResp = fgNeedResp;
- prCmdInfo->fgDriverDomainMCR = FALSE;
- prCmdInfo->ucCmdSeqNum = ucCmdSeqNum;
- prCmdInfo->u4SetInfoLen = u4SetQueryInfoLen;
- prCmdInfo->pvInformationBuffer = pvSetQueryBuffer;
- prCmdInfo->u4InformationBufferLength = u4SetQueryBufferLen;
- /* Setup WIFI_CMD_T (no payload) */
- prWifiCmd = (P_WIFI_CMD_T) (prCmdInfo->pucInfoBuffer);
- prWifiCmd->u2TxByteCount_UserPriority = prCmdInfo->u2InfoBufLen;
- prWifiCmd->ucCID = prCmdInfo->ucCID;
- prWifiCmd->ucSetQuery = prCmdInfo->fgSetQuery;
- prWifiCmd->ucSeqNum = prCmdInfo->ucCmdSeqNum;
- if (u4SetQueryInfoLen > 0 && pucInfoBuffer != NULL)
- kalMemCopy(prWifiCmd->aucBuffer, pucInfoBuffer, u4SetQueryInfoLen);
- /* insert into prCmdQueue */
- kalEnqueueCommand(prGlueInfo, (P_QUE_ENTRY_T) prCmdInfo);
- /* wakeup txServiceThread later */
- GLUE_SET_EVENT(prGlueInfo);
- return WLAN_STATUS_PENDING;
- }
- #if CFG_SUPPORT_WAPI
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called by WAPI ui to set wapi mode, which is needed to info the the driver
- * to operation at WAPI mode while driver initialize.
- *
- * \param[in] prAdapter Pointer to the Adapter structure
- * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set
- * \param[in] u4SetBufferLen The length of the set buffer
- * \param[out] pu4SetInfoLen If the call is successful, returns the number of
- * bytes read from the set buffer. If the call failed due to invalid length of
- * the set buffer, returns the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_INVALID_DATA If new setting value is wrong.
- * \retval WLAN_STATUS_INVALID_LENGTH
- *
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidSetWapiMode(IN P_ADAPTER_T prAdapter,
- IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- DEBUGFUNC("wlanoidSetWapiMode");
- DBGLOG(OID, LOUD, "\r\n");
- ASSERT(prAdapter);
- ASSERT(pu4SetInfoLen);
- ASSERT(pvSetBuffer);
- /* Todo:: For support WAPI and Wi-Fi at same driver, use the set wapi assoc ie at the check point */
- /* The Adapter Connection setting fgUseWapi will cleat whil oid set mode (infra), */
- /* And set fgUseWapi True while set wapi assoc ie */
- /* policay selection, add key all depend on this flag, */
- /* The fgUseWapi may remove later */
- if (*(PUINT_32) pvSetBuffer)
- prAdapter->fgUseWapi = TRUE;
- else
- prAdapter->fgUseWapi = FALSE;
- #if 0
- prCmdInfo = cmdBufAllocateCmdInfo(prAdapter, (CMD_HDR_SIZE + 4));
- if (!prCmdInfo) {
- DBGLOG(OID, ERROR, "Allocate CMD_INFO_T ==> FAILED.\n");
- return WLAN_STATUS_FAILURE;
- }
- /* increase command sequence number */
- ucCmdSeqNum = nicIncreaseCmdSeqNum(prAdapter);
- /* compose CMD_BUILD_CONNECTION cmd pkt */
- prCmdInfo->eCmdType = COMMAND_TYPE_NETWORK_IOCTL;
- prCmdInfo->eNetworkType = NETWORK_TYPE_AIS_INDEX;
- prCmdInfo->u2InfoBufLen = CMD_HDR_SIZE + 4;
- prCmdInfo->pfCmdDoneHandler = nicCmdEventSetCommon;
- prCmdInfo->pfCmdTimeoutHandler = NULL;
- prCmdInfo->fgIsOid = TRUE;
- prCmdInfo->ucCID = CMD_ID_WAPI_MODE;
- prCmdInfo->fgSetQuery = TRUE;
- prCmdInfo->fgNeedResp = FALSE;
- prCmdInfo->fgDriverDomainMCR = FALSE;
- prCmdInfo->ucCmdSeqNum = ucCmdSeqNum;
- prCmdInfo->u4SetInfoLen = u4SetBufferLen;
- prCmdInfo->pvInformationBuffer = pvSetBuffer;
- prCmdInfo->u4InformationBufferLength = u4SetBufferLen;
- /* Setup WIFI_CMD_T */
- prWifiCmd = (P_WIFI_CMD_T) (prCmdInfo->pucInfoBuffer);
- prWifiCmd->u2TxByteCount_UserPriority = prCmdInfo->u2InfoBufLen;
- prWifiCmd->ucCID = prCmdInfo->ucCID;
- prWifiCmd->ucSetQuery = prCmdInfo->fgSetQuery;
- prWifiCmd->ucSeqNum = prCmdInfo->ucCmdSeqNum;
- cp = (PUINT_8) (prWifiCmd->aucBuffer);
- kalMemCopy(cp, (PUINT_8) pvSetBuffer, 4);
- /* insert into prCmdQueue */
- kalEnqueueCommand(prGlueInfo, (P_QUE_ENTRY_T) prCmdInfo);
- /* wakeup txServiceThread later */
- GLUE_SET_EVENT(prGlueInfo);
- return WLAN_STATUS_PENDING;
- #else
- return WLAN_STATUS_SUCCESS;
- #endif
- }
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called by WAPI to set the assoc info, which is needed to add to
- * Association request frame while join WAPI AP.
- *
- * \param[in] prAdapter Pointer to the Adapter structure
- * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set
- * \param[in] u4SetBufferLen The length of the set buffer
- * \param[out] pu4SetInfoLen If the call is successful, returns the number of
- * bytes read from the set buffer. If the call failed due to invalid length of
- * the set buffer, returns the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_INVALID_DATA If new setting value is wrong.
- * \retval WLAN_STATUS_INVALID_LENGTH
- *
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidSetWapiAssocInfo(IN P_ADAPTER_T prAdapter,
- IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- P_WAPI_INFO_ELEM_T prWapiInfo;
- PUINT_8 cp;
- UINT_16 u2AuthSuiteCount = 0;
- UINT_16 u2PairSuiteCount = 0;
- UINT_32 u4AuthKeyMgtSuite = 0;
- UINT_32 u4PairSuite = 0;
- UINT_32 u4GroupSuite = 0;
- ASSERT(prAdapter);
- ASSERT(pvSetBuffer);
- ASSERT(pu4SetInfoLen);
- DEBUGFUNC("wlanoidSetWapiAssocInfo");
- DBGLOG(OID, LOUD, "\r\n");
- if (u4SetBufferLen < 20 /* From EID to Group cipher */) {
- prAdapter->rWifiVar.rConnSettings.fgWapiMode = FALSE;
- DBGLOG(SEC, INFO, "fgWapiMode = FALSE due to u4SetBufferLen %u < 20!\n", u4SetBufferLen);
- return WLAN_STATUS_INVALID_LENGTH;
- }
- prAdapter->rWifiVar.rConnSettings.fgWapiMode = TRUE;
- /* if (prWapiInfo->ucElemId != ELEM_ID_WAPI) */
- /* DBGLOG(SEC, TRACE, ("Not WAPI IE ?!\n")); */
- /* if (prWapiInfo->ucLength < 18) */
- /* return WLAN_STATUS_INVALID_LENGTH; */
- *pu4SetInfoLen = u4SetBufferLen;
- prWapiInfo = (P_WAPI_INFO_ELEM_T) pvSetBuffer;
- if (prWapiInfo->ucElemId != ELEM_ID_WAPI) {
- DBGLOG(SEC, INFO, "Not WAPI IE ?! u4SetBufferLen = %u\n", u4SetBufferLen);
- prAdapter->rWifiVar.rConnSettings.fgWapiMode = FALSE;
- return WLAN_STATUS_INVALID_LENGTH;
- }
- if (prWapiInfo->ucLength < 18)
- return WLAN_STATUS_INVALID_LENGTH;
- /* Skip Version check */
- cp = (PUINT_8) &prWapiInfo->u2AuthKeyMgtSuiteCount;
- WLAN_GET_FIELD_16(cp, &u2AuthSuiteCount);
- if (u2AuthSuiteCount > 1)
- return WLAN_STATUS_INVALID_LENGTH;
- cp = (PUINT_8) &prWapiInfo->aucAuthKeyMgtSuite1[0];
- WLAN_GET_FIELD_32(cp, &u4AuthKeyMgtSuite);
- DBGLOG(SEC, TRACE, "WAPI: Assoc Info auth mgt suite [%d]: %02x-%02x-%02x-%02x\n",
- u2AuthSuiteCount,
- (UCHAR) (u4AuthKeyMgtSuite & 0x000000FF),
- (UCHAR) ((u4AuthKeyMgtSuite >> 8) & 0x000000FF),
- (UCHAR) ((u4AuthKeyMgtSuite >> 16) & 0x000000FF),
- (UCHAR) ((u4AuthKeyMgtSuite >> 24) & 0x000000FF));
- if (u4AuthKeyMgtSuite != WAPI_AKM_SUITE_802_1X && u4AuthKeyMgtSuite != WAPI_AKM_SUITE_PSK)
- ASSERT(FALSE);
- cp += 4;
- WLAN_GET_FIELD_16(cp, &u2PairSuiteCount);
- if (u2PairSuiteCount > 1)
- return WLAN_STATUS_INVALID_LENGTH;
- cp += 2;
- WLAN_GET_FIELD_32(cp, &u4PairSuite);
- DBGLOG(SEC, TRACE, "WAPI: Assoc Info pairwise cipher suite [%d]: %02x-%02x-%02x-%02x\n",
- u2PairSuiteCount,
- (UCHAR) (u4PairSuite & 0x000000FF),
- (UCHAR) ((u4PairSuite >> 8) & 0x000000FF),
- (UCHAR) ((u4PairSuite >> 16) & 0x000000FF), (UCHAR) ((u4PairSuite >> 24) & 0x000000FF));
- if (u4PairSuite != WAPI_CIPHER_SUITE_WPI)
- ASSERT(FALSE);
- cp += 4;
- WLAN_GET_FIELD_32(cp, &u4GroupSuite);
- DBGLOG(SEC, TRACE, "WAPI: Assoc Info group cipher suite : %02x-%02x-%02x-%02x\n",
- (UCHAR) (u4GroupSuite & 0x000000FF),
- (UCHAR) ((u4GroupSuite >> 8) & 0x000000FF),
- (UCHAR) ((u4GroupSuite >> 16) & 0x000000FF), (UCHAR) ((u4GroupSuite >> 24) & 0x000000FF));
- if (u4GroupSuite != WAPI_CIPHER_SUITE_WPI)
- ASSERT(FALSE);
- prAdapter->rWifiVar.rConnSettings.u4WapiSelectedAKMSuite = u4AuthKeyMgtSuite;
- prAdapter->rWifiVar.rConnSettings.u4WapiSelectedPairwiseCipher = u4PairSuite;
- prAdapter->rWifiVar.rConnSettings.u4WapiSelectedGroupCipher = u4GroupSuite;
- kalMemCopy(prAdapter->prGlueInfo->aucWapiAssocInfoIEs, pvSetBuffer, u4SetBufferLen);
- prAdapter->prGlueInfo->u2WapiAssocInfoIESz = (UINT_16) u4SetBufferLen;
- DBGLOG(SEC, TRACE, "Assoc Info IE sz %u\n", u4SetBufferLen);
- return WLAN_STATUS_SUCCESS;
- }
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to set the wpi key to the driver.
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
- * \param[in] u4SetBufferLen The length of the set buffer.
- * \param[out] pu4SetInfoLen If the call is successful, returns the number of
- * bytes read from the set buffer. If the call failed
- * due to invalid length of the set buffer, returns
- * the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_ADAPTER_NOT_READY
- * \retval WLAN_STATUS_INVALID_LENGTH
- * \retval WLAN_STATUS_INVALID_DATA
- *
- * \note The setting buffer P_PARAM_WPI_KEY, which is set by NDIS, is unpacked.
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidSetWapiKey(IN P_ADAPTER_T prAdapter, IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- P_GLUE_INFO_T prGlueInfo;
- P_CMD_INFO_T prCmdInfo;
- P_WIFI_CMD_T prWifiCmd;
- P_PARAM_WPI_KEY_T prNewKey;
- P_CMD_802_11_KEY prCmdKey;
- PUINT_8 pc;
- UINT_8 ucCmdSeqNum;
- DEBUGFUNC("wlanoidSetWapiKey");
- DBGLOG(OID, LOUD, "\r\n");
- ASSERT(prAdapter);
- ASSERT(pvSetBuffer);
- ASSERT(pu4SetInfoLen);
- if (prAdapter->rAcpiState == ACPI_STATE_D3) {
- DBGLOG(OID, WARN, "Fail in set add key! (Adapter not ready). ACPI=D%d, Radio=%d\r\n",
- prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
- return WLAN_STATUS_ADAPTER_NOT_READY;
- }
- prNewKey = (P_PARAM_WPI_KEY_T) pvSetBuffer;
- DBGLOG_MEM8(OID, TRACE, (PUINT_8) pvSetBuffer, 560);
- pc = (PUINT_8) pvSetBuffer;
- *pu4SetInfoLen = u4SetBufferLen;
- /* Exception check */
- if (prNewKey->ucKeyID != 0x1 || prNewKey->ucKeyID != 0x0) {
- prNewKey->ucKeyID = prNewKey->ucKeyID & BIT(0);
- /* DBGLOG(SEC, INFO, ("Invalid WAPI key ID (%d)\r\n", prNewKey->ucKeyID)); */
- }
- /* Dump P_PARAM_WPI_KEY_T content. */
- DBGLOG(OID, TRACE, "Set: Dump P_PARAM_WPI_KEY_T content\r\n");
- DBGLOG(OID, TRACE, "TYPE : %d\r\n", prNewKey->eKeyType);
- DBGLOG(OID, TRACE, "Direction : %d\r\n", prNewKey->eDirection);
- DBGLOG(OID, TRACE, "KeyID : %d\r\n", prNewKey->ucKeyID);
- DBGLOG(OID, TRACE, "AddressIndex:\r\n");
- DBGLOG_MEM8(OID, TRACE, prNewKey->aucAddrIndex, 12);
- prNewKey->u4LenWPIEK = 16;
- DBGLOG_MEM8(OID, TRACE, (PUINT_8) prNewKey->aucWPIEK, (UINT_8) prNewKey->u4LenWPIEK);
- prNewKey->u4LenWPICK = 16;
- DBGLOG(OID, TRACE, "CK Key(%d):\r\n", (UINT_8) prNewKey->u4LenWPICK);
- DBGLOG_MEM8(OID, TRACE, (PUINT_8) prNewKey->aucWPICK, (UINT_8) prNewKey->u4LenWPICK);
- DBGLOG(OID, TRACE, "PN:\r\n");
- if (prNewKey->eKeyType == 0) {
- prNewKey->aucPN[0] = 0x5c;
- prNewKey->aucPN[1] = 0x36;
- prNewKey->aucPN[2] = 0x5c;
- prNewKey->aucPN[3] = 0x36;
- prNewKey->aucPN[4] = 0x5c;
- prNewKey->aucPN[5] = 0x36;
- prNewKey->aucPN[6] = 0x5c;
- prNewKey->aucPN[7] = 0x36;
- prNewKey->aucPN[8] = 0x5c;
- prNewKey->aucPN[9] = 0x36;
- prNewKey->aucPN[10] = 0x5c;
- prNewKey->aucPN[11] = 0x36;
- prNewKey->aucPN[12] = 0x5c;
- prNewKey->aucPN[13] = 0x36;
- prNewKey->aucPN[14] = 0x5c;
- prNewKey->aucPN[15] = 0x36;
- }
- DBGLOG_MEM8(OID, TRACE, (PUINT_8) prNewKey->aucPN, 16);
- prGlueInfo = prAdapter->prGlueInfo;
- prCmdInfo = cmdBufAllocateCmdInfo(prAdapter, (CMD_HDR_SIZE + u4SetBufferLen));
- if (!prCmdInfo) {
- DBGLOG(OID, ERROR, "Allocate CMD_INFO_T ==> FAILED.\n");
- return WLAN_STATUS_FAILURE;
- }
- /* increase command sequence number */
- ucCmdSeqNum = nicIncreaseCmdSeqNum(prAdapter);
- /* compose CMD_ID_ADD_REMOVE_KEY cmd pkt */
- prCmdInfo->eCmdType = COMMAND_TYPE_NETWORK_IOCTL;
- prCmdInfo->eNetworkType = NETWORK_TYPE_AIS_INDEX;
- prCmdInfo->u2InfoBufLen = CMD_HDR_SIZE + sizeof(CMD_802_11_KEY);
- prCmdInfo->pfCmdDoneHandler = nicCmdEventSetCommon;
- prCmdInfo->pfCmdTimeoutHandler = nicOidCmdTimeoutCommon;
- prCmdInfo->fgIsOid = TRUE;
- prCmdInfo->ucCID = CMD_ID_ADD_REMOVE_KEY;
- prCmdInfo->fgSetQuery = TRUE;
- prCmdInfo->fgNeedResp = FALSE;
- prCmdInfo->fgDriverDomainMCR = FALSE;
- prCmdInfo->ucCmdSeqNum = ucCmdSeqNum;
- prCmdInfo->u4SetInfoLen = u4SetBufferLen;
- prCmdInfo->pvInformationBuffer = pvSetBuffer;
- prCmdInfo->u4InformationBufferLength = u4SetBufferLen;
- /* Setup WIFI_CMD_T */
- prWifiCmd = (P_WIFI_CMD_T) (prCmdInfo->pucInfoBuffer);
- prWifiCmd->u2TxByteCount_UserPriority = prCmdInfo->u2InfoBufLen;
- prWifiCmd->ucCID = prCmdInfo->ucCID;
- prWifiCmd->ucSetQuery = prCmdInfo->fgSetQuery;
- prWifiCmd->ucSeqNum = prCmdInfo->ucCmdSeqNum;
- prCmdKey = (P_CMD_802_11_KEY) (prWifiCmd->aucBuffer);
- kalMemZero(prCmdKey, sizeof(CMD_802_11_KEY));
- prCmdKey->ucAddRemove = 1; /* Add */
- if (prNewKey->eKeyType == ENUM_WPI_PAIRWISE_KEY) {
- prCmdKey->ucTxKey = 1;
- prCmdKey->ucKeyType = 1;
- }
- kalMemCopy(prCmdKey->aucPeerAddr, (PUINT_8) prNewKey->aucAddrIndex, MAC_ADDR_LEN);
- prCmdKey->ucNetType = 0; /* AIS */
- prCmdKey->ucKeyId = prNewKey->ucKeyID;
- prCmdKey->ucKeyLen = 32;
- prCmdKey->ucAlgorithmId = CIPHER_SUITE_WPI;
- kalMemCopy(prCmdKey->aucKeyMaterial, (PUINT_8) prNewKey->aucWPIEK, 16);
- kalMemCopy(prCmdKey->aucKeyMaterial + 16, (PUINT_8) prNewKey->aucWPICK, 16);
- kalMemCopy(prCmdKey->aucKeyRsc, (PUINT_8) prNewKey->aucPN, 16);
- /* insert into prCmdQueue */
- kalEnqueueCommand(prGlueInfo, (P_QUE_ENTRY_T) prCmdInfo);
- /* wakeup txServiceThread later */
- GLUE_SET_EVENT(prGlueInfo);
- return WLAN_STATUS_PENDING;
- } /* wlanoidSetAddKey */
- #endif
- #if CFG_SUPPORT_WPS2
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called by WSC to set the assoc info, which is needed to add to
- * Association request frame while join WPS AP.
- *
- * \param[in] prAdapter Pointer to the Adapter structure
- * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set
- * \param[in] u4SetBufferLen The length of the set buffer
- * \param[out] pu4SetInfoLen If the call is successful, returns the number of
- * bytes read from the set buffer. If the call failed due to invalid length of
- * the set buffer, returns the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_INVALID_DATA If new setting value is wrong.
- * \retval WLAN_STATUS_INVALID_LENGTH
- *
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidSetWSCAssocInfo(IN P_ADAPTER_T prAdapter,
- IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- ASSERT(prAdapter);
- ASSERT(pvSetBuffer);
- ASSERT(pu4SetInfoLen);
- DEBUGFUNC("wlanoidSetWSCAssocInfo");
- DBGLOG(OID, LOUD, "\r\n");
- if (u4SetBufferLen == 0)
- return WLAN_STATUS_INVALID_LENGTH;
- *pu4SetInfoLen = u4SetBufferLen;
- kalMemCopy(prAdapter->prGlueInfo->aucWSCAssocInfoIE, pvSetBuffer, u4SetBufferLen);
- prAdapter->prGlueInfo->u2WSCAssocInfoIELen = (UINT_16) u4SetBufferLen;
- DBGLOG(SEC, TRACE, "Assoc Info IE sz %u\n", u4SetBufferLen);
- return WLAN_STATUS_SUCCESS;
- }
- #endif
- #if CFG_ENABLE_WAKEUP_ON_LAN
- WLAN_STATUS
- wlanoidSetAddWakeupPattern(IN P_ADAPTER_T prAdapter,
- IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- P_PARAM_PM_PACKET_PATTERN prPacketPattern;
- DEBUGFUNC("wlanoidSetAddWakeupPattern");
- DBGLOG(OID, LOUD, "\r\n");
- ASSERT(prAdapter);
- ASSERT(pu4SetInfoLen);
- *pu4SetInfoLen = sizeof(PARAM_PM_PACKET_PATTERN);
- if (u4SetBufferLen < sizeof(PARAM_PM_PACKET_PATTERN))
- return WLAN_STATUS_INVALID_LENGTH;
- ASSERT(pvSetBuffer);
- prPacketPattern = (P_PARAM_PM_PACKET_PATTERN) pvSetBuffer;
- /* FIXME:
- * Send the struct to firmware */
- return WLAN_STATUS_FAILURE;
- }
- WLAN_STATUS
- wlanoidSetRemoveWakeupPattern(IN P_ADAPTER_T prAdapter,
- IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- P_PARAM_PM_PACKET_PATTERN prPacketPattern;
- DEBUGFUNC("wlanoidSetAddWakeupPattern");
- DBGLOG(OID, LOUD, "\r\n");
- ASSERT(prAdapter);
- ASSERT(pu4SetInfoLen);
- *pu4SetInfoLen = sizeof(PARAM_PM_PACKET_PATTERN);
- if (u4SetBufferLen < sizeof(PARAM_PM_PACKET_PATTERN))
- return WLAN_STATUS_INVALID_LENGTH;
- ASSERT(pvSetBuffer);
- prPacketPattern = (P_PARAM_PM_PACKET_PATTERN) pvSetBuffer;
- /* FIXME:
- * Send the struct to firmware */
- return WLAN_STATUS_FAILURE;
- }
- WLAN_STATUS
- wlanoidQueryEnableWakeup(IN P_ADAPTER_T prAdapter,
- OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
- {
- PUINT_32 pu4WakeupEventEnable;
- DEBUGFUNC("wlanoidQueryEnableWakeup");
- DBGLOG(OID, LOUD, "\r\n");
- ASSERT(prAdapter);
- ASSERT(pu4QueryInfoLen);
- if (u4QueryBufferLen)
- ASSERT(pvQueryBuffer);
- *pu4QueryInfoLen = sizeof(UINT_32);
- if (u4QueryBufferLen < sizeof(UINT_32))
- return WLAN_STATUS_BUFFER_TOO_SHORT;
- pu4WakeupEventEnable = (PUINT_32) pvQueryBuffer;
- *pu4WakeupEventEnable = prAdapter->u4WakeupEventEnable;
- return WLAN_STATUS_SUCCESS;
- }
- WLAN_STATUS
- wlanoidSetEnableWakeup(IN P_ADAPTER_T prAdapter,
- IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- PUINT_32 pu4WakeupEventEnable;
- DEBUGFUNC("wlanoidSetEnableWakup");
- DBGLOG(OID, LOUD, "\r\n");
- ASSERT(prAdapter);
- ASSERT(pu4SetInfoLen);
- *pu4SetInfoLen = sizeof(UINT_32);
- if (u4SetBufferLen < sizeof(UINT_32))
- return WLAN_STATUS_INVALID_LENGTH;
- ASSERT(pvSetBuffer);
- pu4WakeupEventEnable = (PUINT_32) pvSetBuffer;
- prAdapter->u4WakeupEventEnable = *pu4WakeupEventEnable;
- /* FIXME:
- * Send Command Event for setting wakeup-pattern / Magic Packet to firmware
- * */
- return WLAN_STATUS_FAILURE;
- }
- #endif
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to configure PS related settings for WMM-PS test.
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
- * \param[in] u4SetBufferLen The length of the set buffer.
- * \param[out] pu4SetInfoLen If the call is successful, returns the number of
- * bytes read from the set buffer. If the call failed
- * due to invalid length of the set buffer, returns
- * the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidSetWiFiWmmPsTest(IN P_ADAPTER_T prAdapter,
- IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- P_PARAM_CUSTOM_WMM_PS_TEST_STRUCT_T prWmmPsTestInfo;
- WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
- CMD_SET_WMM_PS_TEST_STRUCT_T rSetWmmPsTestParam;
- UINT_16 u2CmdBufLen;
- P_PM_PROFILE_SETUP_INFO_T prPmProfSetupInfo;
- P_BSS_INFO_T prBssInfo;
- DEBUGFUNC("wlanoidSetWiFiWmmPsTest");
- ASSERT(prAdapter);
- ASSERT(pvSetBuffer);
- ASSERT(pu4SetInfoLen);
- *pu4SetInfoLen = sizeof(PARAM_CUSTOM_WMM_PS_TEST_STRUCT_T);
- prWmmPsTestInfo = (P_PARAM_CUSTOM_WMM_PS_TEST_STRUCT_T) pvSetBuffer;
- rSetWmmPsTestParam.ucNetTypeIndex = NETWORK_TYPE_AIS_INDEX;
- rSetWmmPsTestParam.bmfgApsdEnAc = prWmmPsTestInfo->bmfgApsdEnAc;
- rSetWmmPsTestParam.ucIsEnterPsAtOnce = prWmmPsTestInfo->ucIsEnterPsAtOnce;
- rSetWmmPsTestParam.ucIsDisableUcTrigger = prWmmPsTestInfo->ucIsDisableUcTrigger;
- prBssInfo = &(prAdapter->rWifiVar.arBssInfo[rSetWmmPsTestParam.ucNetTypeIndex]);
- prPmProfSetupInfo = &prBssInfo->rPmProfSetupInfo;
- prPmProfSetupInfo->ucBmpDeliveryAC = (rSetWmmPsTestParam.bmfgApsdEnAc >> 4) & BITS(0, 3);
- prPmProfSetupInfo->ucBmpTriggerAC = rSetWmmPsTestParam.bmfgApsdEnAc & BITS(0, 3);
- u2CmdBufLen = sizeof(CMD_SET_WMM_PS_TEST_STRUCT_T);
- #if 0
- /* it will apply the disable trig or not immediately */
- if (prPmInfo->ucWmmPsDisableUcPoll && prPmInfo->ucWmmPsConnWithTrig)
- ; /* NIC_PM_WMM_PS_DISABLE_UC_TRIG(prAdapter, TRUE); */
- else
- ; /* NIC_PM_WMM_PS_DISABLE_UC_TRIG(prAdapter, FALSE); */
- #endif
- rStatus = wlanSendSetQueryCmd(prAdapter, CMD_ID_SET_WMM_PS_TEST_PARMS, TRUE, FALSE, TRUE, NULL, /* TODO? */
- NULL, u2CmdBufLen, (PUINT_8) &rSetWmmPsTestParam, NULL, 0);
- return rStatus;
- } /* wlanoidSetWiFiWmmPsTest */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to configure enable/disable TX A-MPDU feature.
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
- * \param[in] u4SetBufferLen The length of the set buffer.
- * \param[out] pu4SetInfoLen If the call is successful, returns the number of
- * bytes read from the set buffer. If the call failed
- * due to invalid length of the set buffer, returns
- * the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidSetTxAmpdu(IN P_ADAPTER_T prAdapter, IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
- CMD_TX_AMPDU_T rTxAmpdu;
- UINT_16 u2CmdBufLen;
- PBOOLEAN pfgEnable;
- DEBUGFUNC("wlanoidSetTxAmpdu");
- ASSERT(prAdapter);
- ASSERT(pvSetBuffer);
- ASSERT(pu4SetInfoLen);
- *pu4SetInfoLen = sizeof(BOOLEAN);
- pfgEnable = (PBOOLEAN) pvSetBuffer;
- rTxAmpdu.fgEnable = *pfgEnable;
- u2CmdBufLen = sizeof(CMD_TX_AMPDU_T);
- rStatus = wlanSendSetQueryCmd(prAdapter,
- CMD_ID_TX_AMPDU,
- TRUE, FALSE, TRUE, NULL, NULL, u2CmdBufLen, (PUINT_8) &rTxAmpdu, NULL, 0);
- return rStatus;
- } /* wlanoidSetTxAmpdu */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to configure reject/accept ADDBA Request.
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
- * \param[in] u4SetBufferLen The length of the set buffer.
- * \param[out] pu4SetInfoLen If the call is successful, returns the number of
- * bytes read from the set buffer. If the call failed
- * due to invalid length of the set buffer, returns
- * the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidSetAddbaReject(IN P_ADAPTER_T prAdapter,
- IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
- CMD_ADDBA_REJECT_T rAddbaReject;
- UINT_16 u2CmdBufLen;
- PBOOLEAN pfgEnable;
- DEBUGFUNC("wlanoidSetAddbaReject");
- ASSERT(prAdapter);
- ASSERT(pvSetBuffer);
- ASSERT(pu4SetInfoLen);
- *pu4SetInfoLen = sizeof(BOOLEAN);
- pfgEnable = (PBOOLEAN) pvSetBuffer;
- rAddbaReject.fgEnable = *pfgEnable;
- u2CmdBufLen = sizeof(CMD_ADDBA_REJECT_T);
- rStatus = wlanSendSetQueryCmd(prAdapter,
- CMD_ID_ADDBA_REJECT,
- TRUE, FALSE, TRUE, NULL, NULL, u2CmdBufLen, (PUINT_8) &rAddbaReject, NULL, 0);
- return rStatus;
- } /* wlanoidSetAddbaReject */
- #if CFG_SLT_SUPPORT
- WLAN_STATUS
- wlanoidQuerySLTStatus(IN P_ADAPTER_T prAdapter,
- OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
- {
- WLAN_STATUS rWlanStatus = WLAN_STATUS_SUCCESS;
- P_PARAM_MTK_SLT_TEST_STRUCT_T prMtkSltInfo = (P_PARAM_MTK_SLT_TEST_STRUCT_T) NULL;
- P_SLT_INFO_T prSltInfo = (P_SLT_INFO_T) NULL;
- DEBUGFUNC("wlanoidQuerySLTStatus");
- DBGLOG(OID, LOUD, "\r\n");
- ASSERT(prAdapter);
- ASSERT(pu4QueryInfoLen);
- *pu4QueryInfoLen = sizeof(PARAM_MTK_SLT_TEST_STRUCT_T);
- if (u4QueryBufferLen < sizeof(PARAM_MTK_SLT_TEST_STRUCT_T))
- return WLAN_STATUS_INVALID_LENGTH;
- ASSERT(pvQueryBuffer);
- prMtkSltInfo = (P_PARAM_MTK_SLT_TEST_STRUCT_T) pvQueryBuffer;
- prSltInfo = &(prAdapter->rWifiVar.rSltInfo);
- switch (prMtkSltInfo->rSltFuncIdx) {
- case ENUM_MTK_SLT_FUNC_LP_SET:
- {
- P_PARAM_MTK_SLT_LP_TEST_STRUCT_T prLpSetting = (P_PARAM_MTK_SLT_LP_TEST_STRUCT_T) NULL;
- ASSERT(prMtkSltInfo->u4FuncInfoLen == sizeof(PARAM_MTK_SLT_LP_TEST_STRUCT_T));
- prLpSetting = (P_PARAM_MTK_SLT_LP_TEST_STRUCT_T) &prMtkSltInfo->unFuncInfoContent;
- prLpSetting->u4BcnRcvNum = prSltInfo->u4BeaconReceiveCnt;
- }
- break;
- default:
- /* TBD... */
- break;
- }
- return rWlanStatus;
- } /* wlanoidQuerySLTStatus */
- WLAN_STATUS
- wlanoidUpdateSLTMode(IN P_ADAPTER_T prAdapter,
- IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- WLAN_STATUS rWlanStatus = WLAN_STATUS_SUCCESS;
- P_PARAM_MTK_SLT_TEST_STRUCT_T prMtkSltInfo = (P_PARAM_MTK_SLT_TEST_STRUCT_T) NULL;
- P_SLT_INFO_T prSltInfo = (P_SLT_INFO_T) NULL;
- P_BSS_DESC_T prBssDesc = (P_BSS_DESC_T) NULL;
- P_STA_RECORD_T prStaRec = (P_STA_RECORD_T) NULL;
- P_BSS_INFO_T prBssInfo = (P_BSS_INFO_T) NULL;
- /* 1. Action: Update or Initial Set
- * 2. Role.
- * 3. Target MAC address.
- * 4. RF BW & Rate Settings
- */
- DEBUGFUNC("wlanoidUpdateSLTMode");
- DBGLOG(OID, LOUD, "\r\n");
- ASSERT(prAdapter);
- ASSERT(pu4SetInfoLen);
- *pu4SetInfoLen = sizeof(PARAM_MTK_SLT_TEST_STRUCT_T);
- if (u4SetBufferLen < sizeof(PARAM_MTK_SLT_TEST_STRUCT_T))
- return WLAN_STATUS_INVALID_LENGTH;
- ASSERT(pvSetBuffer);
- prMtkSltInfo = (P_PARAM_MTK_SLT_TEST_STRUCT_T) pvSetBuffer;
- prSltInfo = &(prAdapter->rWifiVar.rSltInfo);
- prBssInfo = &prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX];
- switch (prMtkSltInfo->rSltFuncIdx) {
- case ENUM_MTK_SLT_FUNC_INITIAL: /* Initialize */
- {
- P_PARAM_MTK_SLT_INITIAL_STRUCT_T prMtkSltInit = (P_PARAM_MTK_SLT_INITIAL_STRUCT_T) NULL;
- ASSERT(prMtkSltInfo->u4FuncInfoLen == sizeof(PARAM_MTK_SLT_INITIAL_STRUCT_T));
- prMtkSltInit = (P_PARAM_MTK_SLT_INITIAL_STRUCT_T) &prMtkSltInfo->unFuncInfoContent;
- if (prSltInfo->prPseudoStaRec != NULL) {
- /* The driver has been initialized. */
- prSltInfo->prPseudoStaRec = NULL;
- }
- prSltInfo->prPseudoBssDesc = scanSearchExistingBssDesc(prAdapter,
- BSS_TYPE_IBSS,
- prMtkSltInit->aucTargetMacAddr,
- prMtkSltInit->aucTargetMacAddr);
- prSltInfo->u2SiteID = prMtkSltInit->u2SiteID;
- /* Bandwidth 2.4G: Channel 1~14
- * Bandwidth 5G: *36, 40, 44, 48, 52, 56, 60, 64,
- * *100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140,
- * 149, 153, *157, 161,
- * 184, 188, 192, 196, 200, 204, 208, 212, *216
- */
- prSltInfo->ucChannel2G4 = 1 + (prSltInfo->u2SiteID % 4) * 5;
- switch (prSltInfo->ucChannel2G4) {
- case 1:
- prSltInfo->ucChannel5G = 36;
- break;
- case 6:
- prSltInfo->ucChannel5G = 52;
- break;
- case 11:
- prSltInfo->ucChannel5G = 104;
- break;
- case 16:
- prSltInfo->ucChannel2G4 = 14;
- prSltInfo->ucChannel5G = 161;
- break;
- default:
- ASSERT(FALSE);
- }
- if (prSltInfo->prPseudoBssDesc == NULL) {
- do {
- prSltInfo->prPseudoBssDesc = scanAllocateBssDesc(prAdapter);
- if (prSltInfo->prPseudoBssDesc == NULL) {
- rWlanStatus = WLAN_STATUS_FAILURE;
- break;
- }
- prBssDesc = prSltInfo->prPseudoBssDesc;
- } while (FALSE);
- } else {
- prBssDesc = prSltInfo->prPseudoBssDesc;
- }
- if (prBssDesc) {
- prBssDesc->eBSSType = BSS_TYPE_IBSS;
- COPY_MAC_ADDR(prBssDesc->aucSrcAddr, prMtkSltInit->aucTargetMacAddr);
- COPY_MAC_ADDR(prBssDesc->aucBSSID, prBssInfo->aucOwnMacAddr);
- prBssDesc->u2BeaconInterval = 100;
- prBssDesc->u2ATIMWindow = 0;
- prBssDesc->ucDTIMPeriod = 1;
- prBssDesc->u2IELength = 0;
- prBssDesc->fgIsERPPresent = TRUE;
- prBssDesc->fgIsHTPresent = TRUE;
- prBssDesc->u2OperationalRateSet = BIT(RATE_36M_INDEX);
- prBssDesc->u2BSSBasicRateSet = BIT(RATE_36M_INDEX);
- prBssDesc->fgIsUnknownBssBasicRate = FALSE;
- prBssDesc->fgIsLargerTSF = TRUE;
- prBssDesc->eBand = BAND_2G4;
- prBssDesc->ucChannelNum = prSltInfo->ucChannel2G4;
- prBssDesc->ucPhyTypeSet = PHY_TYPE_SET_802_11ABGN;
- GET_CURRENT_SYSTIME(&prBssDesc->rUpdateTime);
- }
- }
- break;
- case ENUM_MTK_SLT_FUNC_RATE_SET: /* Update RF Settings. */
- if (prSltInfo->prPseudoStaRec == NULL) {
- rWlanStatus = WLAN_STATUS_FAILURE;
- break;
- }
- P_PARAM_MTK_SLT_TR_TEST_STRUCT_T prTRSetting = (P_PARAM_MTK_SLT_TR_TEST_STRUCT_T) NULL;
- ASSERT(prMtkSltInfo->u4FuncInfoLen == sizeof(PARAM_MTK_SLT_TR_TEST_STRUCT_T));
- prStaRec = prSltInfo->prPseudoStaRec;
- prTRSetting = (P_PARAM_MTK_SLT_TR_TEST_STRUCT_T) &prMtkSltInfo->unFuncInfoContent;
- if (prTRSetting->rNetworkType == PARAM_NETWORK_TYPE_OFDM5) {
- prBssInfo->eBand = BAND_5G;
- prBssInfo->ucPrimaryChannel = prSltInfo->ucChannel5G;
- }
- if (prTRSetting->rNetworkType == PARAM_NETWORK_TYPE_OFDM24) {
- prBssInfo->eBand = BAND_2G4;
- prBssInfo->ucPrimaryChannel = prSltInfo->ucChannel2G4;
- }
- if ((prTRSetting->u4FixedRate & FIXED_BW_DL40) != 0) {
- /* RF 40 */
- /* It would controls RFBW capability in WTBL. */
- prStaRec->u2HtCapInfo |= HT_CAP_INFO_SUP_CHNL_WIDTH;
- /* This controls RF BW, RF BW would be 40 only if */
- /* 1. PHY_TYPE_BIT_HT is TRUE. */
- /* 2. SCO is SCA/SCB. */
- prStaRec->ucDesiredPhyTypeSet = PHY_TYPE_BIT_HT;
- /* U20/L20 Control. */
- switch (prTRSetting->u4FixedRate & 0xC000) {
- case FIXED_EXT_CHNL_U20:
- prBssInfo->eBssSCO = CHNL_EXT_SCB; /* +2 */
- if (prTRSetting->rNetworkType == PARAM_NETWORK_TYPE_OFDM5)
- prBssInfo->ucPrimaryChannel += 2;
- else {
- /* For channel 1, testing L20 at channel 8. */
- if (prBssInfo->ucPrimaryChannel < 5)
- prBssInfo->ucPrimaryChannel = 8;
- }
- break;
- case FIXED_EXT_CHNL_L20:
- default: /* 40M */
- prBssInfo->eBssSCO = CHNL_EXT_SCA; /* -2 */
- if (prTRSetting->rNetworkType == PARAM_NETWORK_TYPE_OFDM5) {
- prBssInfo->ucPrimaryChannel -= 2;
- } else {
- /* For channel 11 / 14. testing U20 at channel 3. */
- if (prBssInfo->ucPrimaryChannel > 10)
- prBssInfo->ucPrimaryChannel = 3;
- }
- break;
- }
- } else {
- /* RF 20 */
- prStaRec->u2HtCapInfo &= ~HT_CAP_INFO_SUP_CHNL_WIDTH;
- prBssInfo->eBssSCO = CHNL_EXT_SCN;
- }
- prBssInfo->fgErpProtectMode = FALSE;
- prBssInfo->eHtProtectMode = HT_PROTECT_MODE_NONE;
- prBssInfo->eGfOperationMode = GF_MODE_NORMAL;
- nicUpdateBss(prAdapter, prBssInfo->ucNetTypeIndex);
- prStaRec->u2HtCapInfo &= ~(HT_CAP_INFO_SHORT_GI_20M | HT_CAP_INFO_SHORT_GI_40M);
- switch (prTRSetting->u4FixedRate & 0xFF) {
- case RATE_OFDM_54M:
- prStaRec->u2DesiredNonHTRateSet = BIT(RATE_54M_INDEX);
- break;
- case RATE_OFDM_48M:
- prStaRec->u2DesiredNonHTRateSet = BIT(RATE_48M_INDEX);
- break;
- case RATE_OFDM_36M:
- prStaRec->u2DesiredNonHTRateSet = BIT(RATE_36M_INDEX);
- break;
- case RATE_OFDM_24M:
- prStaRec->u2DesiredNonHTRateSet = BIT(RATE_24M_INDEX);
- break;
- case RATE_OFDM_6M:
- prStaRec->u2DesiredNonHTRateSet = BIT(RATE_6M_INDEX);
- break;
- case RATE_CCK_11M_LONG:
- prStaRec->u2DesiredNonHTRateSet = BIT(RATE_11M_INDEX);
- break;
- case RATE_CCK_1M_LONG:
- prStaRec->u2DesiredNonHTRateSet = BIT(RATE_1M_INDEX);
- break;
- case RATE_GF_MCS_0:
- prStaRec->u2DesiredNonHTRateSet = BIT(RATE_HT_PHY_INDEX);
- prStaRec->u2HtCapInfo |= HT_CAP_INFO_HT_GF;
- break;
- case RATE_MM_MCS_7:
- prStaRec->u2DesiredNonHTRateSet = BIT(RATE_HT_PHY_INDEX);
- prStaRec->u2HtCapInfo &= ~HT_CAP_INFO_HT_GF;
- #if 0 /* Only for Current Measurement Mode. */
- prStaRec->u2HtCapInfo |= (HT_CAP_INFO_SHORT_GI_20M | HT_CAP_INFO_SHORT_GI_40M);
- #endif
- break;
- case RATE_GF_MCS_7:
- prStaRec->u2DesiredNonHTRateSet = BIT(RATE_HT_PHY_INDEX);
- prStaRec->u2HtCapInfo |= HT_CAP_INFO_HT_GF;
- break;
- default:
- prStaRec->u2DesiredNonHTRateSet = BIT(RATE_36M_INDEX);
- break;
- }
- cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_1);
- cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
- break;
- case ENUM_MTK_SLT_FUNC_LP_SET: /* Reset LP Test Result. */
- {
- P_PARAM_MTK_SLT_LP_TEST_STRUCT_T prLpSetting = (P_PARAM_MTK_SLT_LP_TEST_STRUCT_T) NULL;
- ASSERT(prMtkSltInfo->u4FuncInfoLen == sizeof(PARAM_MTK_SLT_LP_TEST_STRUCT_T));
- prLpSetting = (P_PARAM_MTK_SLT_LP_TEST_STRUCT_T) &prMtkSltInfo->unFuncInfoContent;
- if (prSltInfo->prPseudoBssDesc == NULL) {
- /* Please initial SLT Mode first. */
- break;
- }
- prBssDesc = prSltInfo->prPseudoBssDesc;
- switch (prLpSetting->rLpTestMode) {
- case ENUM_MTK_LP_TEST_NORMAL:
- /* In normal mode, we would use target MAC address to be the BSSID. */
- COPY_MAC_ADDR(prBssDesc->aucBSSID, prBssInfo->aucOwnMacAddr);
- prSltInfo->fgIsDUT = FALSE;
- break;
- case ENUM_MTK_LP_TEST_GOLDEN_SAMPLE:
- /* 1. Lower AIFS of BCN queue.
- * 2. Fixed Random Number tobe 0.
- */
- prSltInfo->fgIsDUT = FALSE;
- /* In LP test mode, we would use MAC address of Golden Sample to be the BSSID. */
- COPY_MAC_ADDR(prBssDesc->aucBSSID, prBssInfo->aucOwnMacAddr);
- break;
- case ENUM_MTK_LP_TEST_DUT:
- /* 1. Enter Sleep Mode.
- * 2. Fix random number a large value & enlarge AIFN of BCN queue.
- */
- COPY_MAC_ADDR(prBssDesc->aucBSSID, prBssDesc->aucSrcAddr);
- prSltInfo->u4BeaconReceiveCnt = 0;
- prSltInfo->fgIsDUT = TRUE;
- break;
- }
- }
- break;
- default:
- break;
- }
- return WLAN_STATUS_FAILURE;
- return rWlanStatus;
- } /* wlanoidUpdateSLTMode */
- #endif
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to query NVRAM value.
- *
- * \param[in] pvAdapter Pointer to the Adapter structure.
- * \param[out] pvQueryBuf A pointer to the buffer that holds the result of
- * the query.
- * \param[in] u4QueryBufLen The length of the query buffer.
- * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
- * bytes written into the query buffer. If the call
- * failed due to invalid length of the query buffer,
- * returns the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_FAILURE
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidQueryNvramRead(IN P_ADAPTER_T prAdapter,
- OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
- {
- P_PARAM_CUSTOM_NVRAM_RW_STRUCT_T prNvramRwInfo;
- UINT_16 u2Data;
- BOOLEAN fgStatus;
- WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
- DEBUGFUNC("wlanoidQueryNvramRead");
- ASSERT(prAdapter);
- ASSERT(pu4QueryInfoLen);
- if (u4QueryBufferLen)
- ASSERT(pvQueryBuffer);
- *pu4QueryInfoLen = sizeof(PARAM_CUSTOM_NVRAM_RW_STRUCT_T);
- if (u4QueryBufferLen < sizeof(PARAM_CUSTOM_NVRAM_RW_STRUCT_T))
- return WLAN_STATUS_INVALID_LENGTH;
- prNvramRwInfo = (P_PARAM_CUSTOM_NVRAM_RW_STRUCT_T) pvQueryBuffer;
- if (prNvramRwInfo->ucEepromMethod == PARAM_EEPROM_READ_METHOD_READ) {
- /* change to byte offset */
- fgStatus = kalCfgDataRead16(prAdapter->prGlueInfo,
- prNvramRwInfo->ucEepromIndex << 1,
- &u2Data);
- if (fgStatus) {
- prNvramRwInfo->u2EepromData = u2Data;
- DBGLOG(OID, INFO, "NVRAM Read: index=%#X, data=%#02X\r\n",
- prNvramRwInfo->ucEepromIndex, u2Data);
- } else {
- DBGLOG(OID, ERROR, "NVRAM Read Failed: index=%#x.\r\n", prNvramRwInfo->ucEepromIndex);
- rStatus = WLAN_STATUS_FAILURE;
- }
- } else if (prNvramRwInfo->ucEepromMethod == PARAM_EEPROM_READ_METHOD_GETSIZE) {
- prNvramRwInfo->u2EepromData = CFG_FILE_WIFI_REC_SIZE;
- DBGLOG(OID, INFO, "EEPROM size =%d\r\n", prNvramRwInfo->u2EepromData);
- }
- *pu4QueryInfoLen = sizeof(PARAM_CUSTOM_EEPROM_RW_STRUCT_T);
- return rStatus;
- } /* wlanoidQueryNvramRead */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to write NVRAM value.
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
- * \param[in] u4SetBufferLen The length of the set buffer.
- * \param[out] pu4SetInfoLen If the call is successful, returns the number of
- * bytes read from the set buffer. If the call failed
- * due to invalid length of the set buffer, returns
- * the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_FAILURE
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidSetNvramWrite(IN P_ADAPTER_T prAdapter,
- IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- P_PARAM_CUSTOM_NVRAM_RW_STRUCT_T prNvramRwInfo;
- BOOLEAN fgStatus;
- WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
- DEBUGFUNC("wlanoidSetNvramWrite");
- DBGLOG(OID, LOUD, "\n");
- ASSERT(prAdapter);
- ASSERT(pu4SetInfoLen);
- *pu4SetInfoLen = sizeof(PARAM_CUSTOM_NVRAM_RW_STRUCT_T);
- if (u4SetBufferLen < sizeof(PARAM_CUSTOM_NVRAM_RW_STRUCT_T))
- return WLAN_STATUS_INVALID_LENGTH;
- ASSERT(pvSetBuffer);
- prNvramRwInfo = (P_PARAM_CUSTOM_NVRAM_RW_STRUCT_T) pvSetBuffer;
- /* change to byte offset */
- fgStatus = kalCfgDataWrite16(prAdapter->prGlueInfo,
- prNvramRwInfo->ucEepromIndex << 1,
- prNvramRwInfo->u2EepromData);
- if (fgStatus == FALSE) {
- DBGLOG(OID, ERROR, "NVRAM Write Failed.\r\n");
- rStatus = WLAN_STATUS_FAILURE;
- }
- return rStatus;
- } /* wlanoidSetNvramWrite */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to get the config data source type.
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
- * \param[in] u4SetBufferLen The length of the set buffer.
- * \param[out] pu4SetInfoLen If the call is successful, returns the number of
- * bytes read from the set buffer. If the call failed
- * due to invalid length of the set buffer, returns
- * the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_FAILURE
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidQueryCfgSrcType(IN P_ADAPTER_T prAdapter,
- OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
- {
- ASSERT(prAdapter);
- *pu4QueryInfoLen = sizeof(ENUM_CFG_SRC_TYPE_T);
- if (kalIsConfigurationExist(prAdapter->prGlueInfo) == TRUE)
- *(P_ENUM_CFG_SRC_TYPE_T) pvQueryBuffer = CFG_SRC_TYPE_NVRAM;
- else
- *(P_ENUM_CFG_SRC_TYPE_T) pvQueryBuffer = CFG_SRC_TYPE_EEPROM;
- return WLAN_STATUS_SUCCESS;
- }
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to get the config data source type.
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
- * \param[in] u4SetBufferLen The length of the set buffer.
- * \param[out] pu4SetInfoLen If the call is successful, returns the number of
- * bytes read from the set buffer. If the call failed
- * due to invalid length of the set buffer, returns
- * the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_FAILURE
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidQueryEepromType(IN P_ADAPTER_T prAdapter,
- OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
- {
- ASSERT(prAdapter);
- *pu4QueryInfoLen = sizeof(P_ENUM_EEPROM_TYPE_T);
- #if CFG_SUPPORT_NIC_CAPABILITY
- if (prAdapter->fgIsEepromUsed == TRUE)
- *(P_ENUM_EEPROM_TYPE_T) pvQueryBuffer = EEPROM_TYPE_PRESENT;
- else
- *(P_ENUM_EEPROM_TYPE_T) pvQueryBuffer = EEPROM_TYPE_NO;
- #else
- *(P_ENUM_EEPROM_TYPE_T) pvQueryBuffer = EEPROM_TYPE_NO;
- #endif
- return WLAN_STATUS_SUCCESS;
- }
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to get the config data source type.
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
- * \param[in] u4SetBufferLen The length of the set buffer.
- * \param[out] pu4SetInfoLen If the call is successful, returns the number of
- * bytes read from the set buffer. If the call failed
- * due to invalid length of the set buffer, returns
- * the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_FAILURE
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidSetCountryCode(IN P_ADAPTER_T prAdapter,
- IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- PUINT_8 pucCountry;
- ASSERT(prAdapter);
- ASSERT(pvSetBuffer);
- ASSERT(u4SetBufferLen == 2);
- *pu4SetInfoLen = 2;
- pucCountry = pvSetBuffer;
- prAdapter->rWifiVar.rConnSettings.u2CountryCode = (((UINT_16) pucCountry[0]) << 8) | ((UINT_16) pucCountry[1]);
- rlmDomainSendCmd(prAdapter, TRUE);
- return WLAN_STATUS_SUCCESS;
- }
- #if 0
- WLAN_STATUS
- wlanoidSetNoaParam(IN P_ADAPTER_T prAdapter,
- IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- P_PARAM_CUSTOM_NOA_PARAM_STRUCT_T prNoaParam;
- CMD_CUSTOM_NOA_PARAM_STRUCT_T rCmdNoaParam;
- DEBUGFUNC("wlanoidSetNoaParam");
- DBGLOG(OID, LOUD, "\n");
- ASSERT(prAdapter);
- ASSERT(pu4SetInfoLen);
- *pu4SetInfoLen = sizeof(PARAM_CUSTOM_NOA_PARAM_STRUCT_T);
- if (u4SetBufferLen < sizeof(PARAM_CUSTOM_NOA_PARAM_STRUCT_T))
- return WLAN_STATUS_INVALID_LENGTH;
- ASSERT(pvSetBuffer);
- prNoaParam = (P_PARAM_CUSTOM_NOA_PARAM_STRUCT_T) pvSetBuffer;
- kalMemZero(&rCmdNoaParam, sizeof(CMD_CUSTOM_NOA_PARAM_STRUCT_T));
- rCmdNoaParam.u4NoaDurationMs = prNoaParam->u4NoaDurationMs;
- rCmdNoaParam.u4NoaIntervalMs = prNoaParam->u4NoaIntervalMs;
- rCmdNoaParam.u4NoaCount = prNoaParam->u4NoaCount;
- return wlanSendSetQueryCmd(prAdapter,
- CMD_ID_SET_NOA_PARAM,
- TRUE,
- FALSE,
- TRUE,
- nicCmdEventSetCommon,
- nicOidCmdTimeoutCommon,
- sizeof(CMD_CUSTOM_NOA_PARAM_STRUCT_T),
- (PUINT_8) &rCmdNoaParam, pvSetBuffer, u4SetBufferLen);
- }
- WLAN_STATUS
- wlanoidSetOppPsParam(IN P_ADAPTER_T prAdapter,
- IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- P_PARAM_CUSTOM_OPPPS_PARAM_STRUCT_T prOppPsParam;
- CMD_CUSTOM_OPPPS_PARAM_STRUCT_T rCmdOppPsParam;
- DEBUGFUNC("wlanoidSetOppPsParam");
- DBGLOG(OID, LOUD, "\n");
- ASSERT(prAdapter);
- ASSERT(pu4SetInfoLen);
- *pu4SetInfoLen = sizeof(PARAM_CUSTOM_OPPPS_PARAM_STRUCT_T);
- if (u4SetBufferLen < sizeof(PARAM_CUSTOM_OPPPS_PARAM_STRUCT_T))
- return WLAN_STATUS_INVALID_LENGTH;
- ASSERT(pvSetBuffer);
- prOppPsParam = (P_PARAM_CUSTOM_OPPPS_PARAM_STRUCT_T) pvSetBuffer;
- kalMemZero(&rCmdOppPsParam, sizeof(CMD_CUSTOM_OPPPS_PARAM_STRUCT_T));
- rCmdOppPsParam.u4CTwindowMs = prOppPsParam->u4CTwindowMs;
- return wlanSendSetQueryCmd(prAdapter,
- CMD_ID_SET_OPPPS_PARAM,
- TRUE,
- FALSE,
- TRUE,
- nicCmdEventSetCommon,
- nicOidCmdTimeoutCommon,
- sizeof(CMD_CUSTOM_OPPPS_PARAM_STRUCT_T),
- (PUINT_8) &rCmdOppPsParam, pvSetBuffer, u4SetBufferLen);
- }
- WLAN_STATUS
- wlanoidSetUApsdParam(IN P_ADAPTER_T prAdapter,
- IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- P_PARAM_CUSTOM_UAPSD_PARAM_STRUCT_T prUapsdParam;
- CMD_CUSTOM_UAPSD_PARAM_STRUCT_T rCmdUapsdParam;
- P_PM_PROFILE_SETUP_INFO_T prPmProfSetupInfo;
- P_BSS_INFO_T prBssInfo;
- DEBUGFUNC("wlanoidSetUApsdParam");
- DBGLOG(OID, LOUD, "\n");
- ASSERT(prAdapter);
- ASSERT(pu4SetInfoLen);
- *pu4SetInfoLen = sizeof(PARAM_CUSTOM_UAPSD_PARAM_STRUCT_T);
- if (u4SetBufferLen < sizeof(PARAM_CUSTOM_UAPSD_PARAM_STRUCT_T))
- return WLAN_STATUS_INVALID_LENGTH;
- ASSERT(pvSetBuffer);
- prBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_P2P_INDEX]);
- prPmProfSetupInfo = &prBssInfo->rPmProfSetupInfo;
- prUapsdParam = (P_PARAM_CUSTOM_UAPSD_PARAM_STRUCT_T) pvSetBuffer;
- kalMemZero(&rCmdUapsdParam, sizeof(CMD_CUSTOM_OPPPS_PARAM_STRUCT_T));
- rCmdUapsdParam.fgEnAPSD = prUapsdParam->fgEnAPSD;
- prAdapter->rWifiVar.fgSupportUAPSD = prUapsdParam->fgEnAPSD;
- rCmdUapsdParam.fgEnAPSD_AcBe = prUapsdParam->fgEnAPSD_AcBe;
- rCmdUapsdParam.fgEnAPSD_AcBk = prUapsdParam->fgEnAPSD_AcBk;
- rCmdUapsdParam.fgEnAPSD_AcVo = prUapsdParam->fgEnAPSD_AcVo;
- rCmdUapsdParam.fgEnAPSD_AcVi = prUapsdParam->fgEnAPSD_AcVi;
- prPmProfSetupInfo->ucBmpDeliveryAC =
- ((prUapsdParam->fgEnAPSD_AcBe << 0) |
- (prUapsdParam->fgEnAPSD_AcBk << 1) |
- (prUapsdParam->fgEnAPSD_AcVi << 2) | (prUapsdParam->fgEnAPSD_AcVo << 3));
- prPmProfSetupInfo->ucBmpTriggerAC =
- ((prUapsdParam->fgEnAPSD_AcBe << 0) |
- (prUapsdParam->fgEnAPSD_AcBk << 1) |
- (prUapsdParam->fgEnAPSD_AcVi << 2) | (prUapsdParam->fgEnAPSD_AcVo << 3));
- rCmdUapsdParam.ucMaxSpLen = prUapsdParam->ucMaxSpLen;
- prPmProfSetupInfo->ucUapsdSp = prUapsdParam->ucMaxSpLen;
- return wlanSendSetQueryCmd(prAdapter,
- CMD_ID_SET_UAPSD_PARAM,
- TRUE,
- FALSE,
- TRUE,
- nicCmdEventSetCommon,
- nicOidCmdTimeoutCommon,
- sizeof(CMD_CUSTOM_OPPPS_PARAM_STRUCT_T),
- (PUINT_8) &rCmdUapsdParam, pvSetBuffer, u4SetBufferLen);
- }
- #endif
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to set BT profile or BT information and the
- * driver will set the built-in PTA configuration into chip.
- *
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
- * \param[in] u4SetBufferLen The length of the set buffer.
- * \param[out] pu4SetInfoLen If the call is successful, returns the number of
- * bytes read from the set buffer. If the call failed
- * due to invalid length of the set buffer, returns
- * the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_INVALID_LENGTH
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidSetBT(IN P_ADAPTER_T prAdapter, IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- P_PTA_IPC_T prPtaIpc;
- DEBUGFUNC("wlanoidSetBT.\n");
- ASSERT(prAdapter);
- ASSERT(pu4SetInfoLen);
- *pu4SetInfoLen = sizeof(PTA_IPC_T);
- if (u4SetBufferLen != sizeof(PTA_IPC_T)) {
- WARNLOG(("Invalid length %u\n", u4SetBufferLen));
- return WLAN_STATUS_INVALID_LENGTH;
- }
- if (prAdapter->rAcpiState == ACPI_STATE_D3) {
- DBGLOG(OID, WARN, "Fail to set BT profile because of ACPI_D3\n");
- return WLAN_STATUS_ADAPTER_NOT_READY;
- }
- ASSERT(pvSetBuffer);
- prPtaIpc = (P_PTA_IPC_T) pvSetBuffer;
- #if CFG_SUPPORT_BCM && CFG_SUPPORT_BCM_BWCS && CFG_SUPPORT_BCM_BWCS_DEBUG
- DBGLOG(OID, INFO,
- "BCM BWCS CMD: BTPParams[0]=%02x, BTPParams[1]=%02x, BTPParams[2]=%02x, BTPParams[3]=%02x.\n",
- prPtaIpc->u.aucBTPParams[0], prPtaIpc->u.aucBTPParams[1], prPtaIpc->u.aucBTPParams[2],
- prPtaIpc->u.aucBTPParams[3];
- #endif
- wlanSendSetQueryCmd(prAdapter,
- CMD_ID_SET_BWCS,
- TRUE, FALSE, FALSE, NULL, NULL, sizeof(PTA_IPC_T), (PUINT_8) prPtaIpc, NULL, 0);
- return WLAN_STATUS_SUCCESS;
- }
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to query current BT profile and BTCR values
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[in] pvQueryBuffer Pointer to the buffer that holds the result of
- * the query.
- * \param[in] u4QueryBufferLen The length of the query buffer.
- * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
- * bytes written into the query buffer. If the call
- * failed due to invalid length of the query buffer,
- * returns the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_INVALID_LENGTH
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidQueryBT(IN P_ADAPTER_T prAdapter,
- OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
- {
- /* P_PARAM_PTA_IPC_T prPtaIpc; */
- /* UINT_32 u4QueryBuffLen; */
- ASSERT(prAdapter);
- ASSERT(pu4QueryInfoLen);
- if (u4QueryBufferLen)
- ASSERT(pvQueryBuffer);
- *pu4QueryInfoLen = sizeof(PTA_IPC_T);
- /* Check for query buffer length */
- if (u4QueryBufferLen != sizeof(PTA_IPC_T)) {
- DBGLOG(OID, WARN, "Invalid length %u\n", u4QueryBufferLen);
- return WLAN_STATUS_INVALID_LENGTH;
- }
- ASSERT(pvQueryBuffer);
- /* prPtaIpc = (P_PTA_IPC_T)pvQueryBuffer; */
- /* prPtaIpc->ucCmd = BT_CMD_PROFILE; */
- /* prPtaIpc->ucLen = sizeof(prPtaIpc->u); */
- /* nicPtaGetProfile(prAdapter, (PUINT_8)&prPtaIpc->u, &u4QueryBuffLen); */
- return WLAN_STATUS_SUCCESS;
- }
- #if 0
- WLAN_STATUS
- wlanoidQueryBtSingleAntenna(IN P_ADAPTER_T prAdapter,
- OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
- {
- P_PTA_INFO_T prPtaInfo;
- PUINT_32 pu4SingleAntenna;
- ASSERT(prAdapter);
- ASSERT(pu4QueryInfoLen);
- if (u4QueryBufferLen)
- ASSERT(pvQueryBuffer);
- *pu4QueryInfoLen = sizeof(UINT_32);
- /* Check for query buffer length */
- if (u4QueryBufferLen != sizeof(UINT_32)) {
- DBGLOG(OID, WARN, "Invalid length %u\n", u4QueryBufferLen);
- return WLAN_STATUS_INVALID_LENGTH;
- }
- ASSERT(pvQueryBuffer);
- prPtaInfo = &prAdapter->rPtaInfo;
- pu4SingleAntenna = (PUINT_32) pvQueryBuffer;
- if (prPtaInfo->fgSingleAntenna) {
- /* DBGLOG(OID, INFO, (KERN_WARNING DRV_NAME"Q Single Ant = 1\r\n")); */
- *pu4SingleAntenna = 1;
- } else {
- /* DBGLOG(OID, INFO, (KERN_WARNING DRV_NAME"Q Single Ant = 0\r\n")); */
- *pu4SingleAntenna = 0;
- }
- return WLAN_STATUS_SUCCESS;
- }
- WLAN_STATUS
- wlanoidSetBtSingleAntenna(IN P_ADAPTER_T prAdapter,
- IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- PUINT_32 pu4SingleAntenna;
- UINT_32 u4SingleAntenna;
- P_PTA_INFO_T prPtaInfo;
- ASSERT(prAdapter);
- ASSERT(pu4SetInfoLen);
- prPtaInfo = &prAdapter->rPtaInfo;
- *pu4SetInfoLen = sizeof(UINT_32);
- if (u4SetBufferLen != sizeof(UINT_32))
- return WLAN_STATUS_INVALID_LENGTH;
- if (IS_ARB_IN_RFTEST_STATE(prAdapter))
- return WLAN_STATUS_SUCCESS;
- if (prAdapter->rAcpiState == ACPI_STATE_D3) {
- DBGLOG(OID, WARN, "Fail to set antenna because of ACPI_D3\n");
- return WLAN_STATUS_ADAPTER_NOT_READY;
- }
- ASSERT(pvSetBuffer);
- pu4SingleAntenna = (PUINT_32) pvSetBuffer;
- u4SingleAntenna = *pu4SingleAntenna;
- if (u4SingleAntenna == 0) {
- /* DBGLOG(OID, INFO, (KERN_WARNING DRV_NAME"Set Single Ant = 0\r\n")); */
- prPtaInfo->fgSingleAntenna = FALSE;
- } else {
- /* DBGLOG(OID, INFO, (KERN_WARNING DRV_NAME"Set Single Ant = 1\r\n")); */
- prPtaInfo->fgSingleAntenna = TRUE;
- }
- ptaFsmRunEventSetConfig(prAdapter, &prPtaInfo->rPtaParam);
- return WLAN_STATUS_SUCCESS;
- }
- #if CFG_SUPPORT_BCM && CFG_SUPPORT_BCM_BWCS
- WLAN_STATUS
- wlanoidQueryPta(IN P_ADAPTER_T prAdapter,
- OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
- {
- P_PTA_INFO_T prPtaInfo;
- PUINT_32 pu4Pta;
- ASSERT(prAdapter);
- ASSERT(pu4QueryInfoLen);
- if (u4QueryBufferLen)
- ASSERT(pvQueryBuffer);
- *pu4QueryInfoLen = sizeof(UINT_32);
- /* Check for query buffer length */
- if (u4QueryBufferLen != sizeof(UINT_32)) {
- DBGLOG(OID, WARN, "Invalid length %u\n", u4QueryBufferLen);
- return WLAN_STATUS_INVALID_LENGTH;
- }
- ASSERT(pvQueryBuffer);
- prPtaInfo = &prAdapter->rPtaInfo;
- pu4Pta = (PUINT_32) pvQueryBuffer;
- if (prPtaInfo->fgEnabled) {
- /* DBGLOG(OID, INFO, (KERN_WARNING DRV_NAME"PTA = 1\r\n")); */
- *pu4Pta = 1;
- } else {
- /* DBGLOG(OID, INFO, (KERN_WARNING DRV_NAME"PTA = 0\r\n")); */
- *pu4Pta = 0;
- }
- return WLAN_STATUS_SUCCESS;
- }
- WLAN_STATUS
- wlanoidSetPta(IN P_ADAPTER_T prAdapter, IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- PUINT_32 pu4PtaCtrl;
- UINT_32 u4PtaCtrl;
- ASSERT(prAdapter);
- ASSERT(pu4SetInfoLen);
- *pu4SetInfoLen = sizeof(UINT_32);
- if (u4SetBufferLen != sizeof(UINT_32))
- return WLAN_STATUS_INVALID_LENGTH;
- if (IS_ARB_IN_RFTEST_STATE(prAdapter))
- return WLAN_STATUS_SUCCESS;
- if (prAdapter->rAcpiState == ACPI_STATE_D3) {
- DBGLOG(OID, WARN, "Fail to set BT setting because of ACPI_D3\n");
- return WLAN_STATUS_ADAPTER_NOT_READY;
- }
- ASSERT(pvSetBuffer);
- pu4PtaCtrl = (PUINT_32) pvSetBuffer;
- u4PtaCtrl = *pu4PtaCtrl;
- if (u4PtaCtrl == 0) {
- /* DBGLOG(OID, INFO, (KERN_WARNING DRV_NAME"Set Pta= 0\r\n")); */
- nicPtaSetFunc(prAdapter, FALSE);
- } else {
- /* DBGLOG(OID, INFO, (KERN_WARNING DRV_NAME"Set Pta= 1\r\n")); */
- nicPtaSetFunc(prAdapter, TRUE);
- }
- return WLAN_STATUS_SUCCESS;
- }
- #endif
- #endif
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to set Tx power profile.
- *
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
- * \param[in] u4SetBufferLen The length of the set buffer.
- * \param[out] pu4SetInfoLen If the call is successful, returns the number of
- * bytes read from the set buffer. If the call failed
- * due to invalid length of the set buffer, returns
- * the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_INVALID_LENGTH
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidSetTxPower(IN P_ADAPTER_T prAdapter, IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- /* P_SET_TXPWR_CTRL_T pTxPwr = (P_SET_TXPWR_CTRL_T)pvSetBuffer; */
- /* UINT_32 i; */
- WLAN_STATUS rStatus;
- DEBUGFUNC("wlanoidSetTxPower");
- DBGLOG(OID, LOUD, "\r\n");
- ASSERT(prAdapter);
- ASSERT(pvSetBuffer);
- #if 0
- DBGLOG(OID, INFO, "c2GLegacyStaPwrOffset=%d\n", pTxPwr->c2GLegacyStaPwrOffset);
- DBGLOG(OID, INFO, "c2GHotspotPwrOffset=%d\n", pTxPwr->c2GHotspotPwrOffset);
- DBGLOG(OID, INFO, "c2GP2pPwrOffset=%d\n", pTxPwr->c2GP2pPwrOffset);
- DBGLOG(OID, INFO, "c2GBowPwrOffset=%d\n", pTxPwr->c2GBowPwrOffset);
- DBGLOG(OID, INFO, "c5GLegacyStaPwrOffset=%d\n", pTxPwr->c5GLegacyStaPwrOffset);
- DBGLOG(OID, INFO, "c5GHotspotPwrOffset=%d\n", pTxPwr->c5GHotspotPwrOffset);
- DBGLOG(OID, INFO, "c5GP2pPwrOffset=%d\n", pTxPwr->c5GP2pPwrOffset);
- DBGLOG(OID, INFO, "c5GBowPwrOffset=%d\n", pTxPwr->c5GBowPwrOffset);
- DBGLOG(OID, INFO, "ucConcurrencePolicy=%d\n", pTxPwr->ucConcurrencePolicy);
- for (i = 0; i < 14; i++)
- DBGLOG(OID, INFO, "acTxPwrLimit2G[%d]=%d\n", i, pTxPwr->acTxPwrLimit2G[i]);
- for (i = 0; i < 4; i++)
- DBGLOG(OID, INFO, "acTxPwrLimit5G[%d]=%d\n", i, pTxPwr->acTxPwrLimit5G[i]);
- #endif
- rStatus = wlanSendSetQueryCmd(prAdapter, /* prAdapter */
- CMD_ID_SET_TXPWR_CTRL, /* ucCID */
- TRUE, /* fgSetQuery */
- FALSE, /* fgNeedResp */
- TRUE, /* fgIsOid */
- NULL, /* pfCmdDoneHandler */
- NULL, /* pfCmdTimeoutHandler */
- u4SetBufferLen, /* u4SetQueryInfoLen */
- (PUINT_8) pvSetBuffer, /* pucInfoBuffer */
- NULL, /* pvSetQueryBuffer */
- 0 /* u4SetQueryBufferLen */
- );
- ASSERT(rStatus == WLAN_STATUS_PENDING);
- return rStatus;
- }
- WLAN_STATUS wlanSendMemDumpCmd(IN P_ADAPTER_T prAdapter, IN PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen)
- {
- P_PARAM_CUSTOM_MEM_DUMP_STRUCT_T prMemDumpInfo;
- P_CMD_DUMP_MEM prCmdDumpMem;
- CMD_DUMP_MEM rCmdDumpMem;
- WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
- UINT_32 u4MemSize = PARAM_MEM_DUMP_MAX_SIZE;
- UINT_32 u4RemainLeng = 0;
- UINT_32 u4CurAddr = 0;
- UINT_8 ucFragNum = 0;
- prCmdDumpMem = &rCmdDumpMem;
- prMemDumpInfo = (P_PARAM_CUSTOM_MEM_DUMP_STRUCT_T) pvQueryBuffer;
- u4RemainLeng = prMemDumpInfo->u4RemainLength;
- u4CurAddr = prMemDumpInfo->u4Address + prMemDumpInfo->u4Length;
- ucFragNum = prMemDumpInfo->ucFragNum + 1;
- /* Query. If request length is larger than max length, do it as ping pong.
- * Send a command and wait for a event. Send next command while the event is received.
- *
- */
- do {
- UINT_32 u4CurLeng = 0;
- if (u4RemainLeng > u4MemSize) {
- u4CurLeng = u4MemSize;
- u4RemainLeng -= u4MemSize;
- } else {
- u4CurLeng = u4RemainLeng;
- u4RemainLeng = 0;
- }
- prCmdDumpMem->u4Address = u4CurAddr;
- prCmdDumpMem->u4Length = u4CurLeng;
- prCmdDumpMem->u4RemainLength = u4RemainLeng;
- prCmdDumpMem->ucFragNum = ucFragNum;
- DBGLOG(OID, TRACE, "[%d] 0x%X, len %u, remain len %u\n",
- ucFragNum,
- prCmdDumpMem->u4Address, prCmdDumpMem->u4Length, prCmdDumpMem->u4RemainLength);
- rStatus = wlanSendSetQueryCmd(prAdapter,
- CMD_ID_DUMP_MEM,
- FALSE,
- TRUE,
- TRUE,
- nicCmdEventQueryMemDump,
- nicOidCmdTimeoutCommon,
- sizeof(CMD_DUMP_MEM),
- (PUINT_8) prCmdDumpMem, pvQueryBuffer, u4QueryBufferLen);
- } while (FALSE);
- return rStatus;
- }
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to dump memory.
- *
- * \param[in] pvAdapter Pointer to the Adapter structure.
- * \param[out] pvQueryBuf A pointer to the buffer that holds the result of
- * the query.
- * \param[in] u4QueryBufLen The length of the query buffer.
- * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
- * bytes written into the query buffer. If the call
- * failed due to invalid length of the query buffer,
- * returns the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_INVALID_LENGTH
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidQueryMemDump(IN P_ADAPTER_T prAdapter,
- IN PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
- {
- P_PARAM_CUSTOM_MEM_DUMP_STRUCT_T prMemDumpInfo;
- DEBUGFUNC("wlanoidQueryMemDump");
- DBGLOG(OID, LOUD, "\n");
- ASSERT(prAdapter);
- ASSERT(pu4QueryInfoLen);
- if (u4QueryBufferLen)
- ASSERT(pvQueryBuffer);
- *pu4QueryInfoLen = sizeof(UINT_32);
- prMemDumpInfo = (P_PARAM_CUSTOM_MEM_DUMP_STRUCT_T) pvQueryBuffer;
- DBGLOG(OID, TRACE, "Dump 0x%X, len %u\n", prMemDumpInfo->u4Address, prMemDumpInfo->u4Length);
- prMemDumpInfo->u4RemainLength = prMemDumpInfo->u4Length;
- prMemDumpInfo->u4Length = 0;
- prMemDumpInfo->ucFragNum = 0;
- return wlanSendMemDumpCmd(prAdapter, pvQueryBuffer, u4QueryBufferLen);
- } /* end of wlanoidQueryMcrRead() */
- #if CFG_ENABLE_WIFI_DIRECT
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is used to set the p2p mode.
- *
- * \param[in] pvAdapter Pointer to the Adapter structure.
- * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
- * \param[in] u4SetBufferLen The length of the set buffer.
- * \param[out] pu4SetInfoLen If the call is successful, returns the number of
- * bytes read from the set buffer. If the call failed
- * due to invalid length of the set buffer, returns
- * the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_INVALID_LENGTH
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidSetP2pMode(IN P_ADAPTER_T prAdapter, IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- WLAN_STATUS status = WLAN_STATUS_SUCCESS;
- P_PARAM_CUSTOM_P2P_SET_STRUCT_T prSetP2P = (P_PARAM_CUSTOM_P2P_SET_STRUCT_T) NULL;
- /* P_MSG_P2P_NETDEV_REGISTER_T prP2pNetdevRegMsg = (P_MSG_P2P_NETDEV_REGISTER_T)NULL; */
- DEBUGFUNC("wlanoidSetP2pMode");
- ASSERT(prAdapter);
- ASSERT(pu4SetInfoLen);
- *pu4SetInfoLen = sizeof(PARAM_CUSTOM_P2P_SET_STRUCT_T);
- if (u4SetBufferLen < sizeof(PARAM_CUSTOM_P2P_SET_STRUCT_T)) {
- DBGLOG(OID, WARN, "Invalid length %u\n", u4SetBufferLen);
- return WLAN_STATUS_INVALID_LENGTH;
- }
- prSetP2P = (P_PARAM_CUSTOM_P2P_SET_STRUCT_T) pvSetBuffer;
- DBGLOG(P2P, INFO, "Set P2P enable %p [%u] mode[%u]\n", prSetP2P, prSetP2P->u4Enable, prSetP2P->u4Mode);
- /*
- * enable = 1, mode = 0 => init P2P network
- * enable = 1, mode = 1 => init Soft AP network
- * enable = 0 => uninit P2P/AP network
- */
- if (prSetP2P->u4Enable) {
- p2pSetMode((prSetP2P->u4Mode == 1) ? TRUE : FALSE);
- if (p2pLaunch(prAdapter->prGlueInfo))
- ASSERT(prAdapter->fgIsP2PRegistered);
- } else {
- DBGLOG(P2P, TRACE, "prAdapter->fgIsP2PRegistered = %d\n", prAdapter->fgIsP2PRegistered);
- if (prAdapter->fgIsP2PRegistered) {
- DBGLOG(P2P, INFO, "p2pRemove\n");
- p2pRemove(prAdapter->prGlueInfo);
- }
- }
- #if 0
- prP2pNetdevRegMsg = (P_MSG_P2P_NETDEV_REGISTER_T) cnmMemAlloc(prAdapter,
- RAM_TYPE_MSG,
- (sizeof(MSG_P2P_NETDEV_REGISTER_T)));
- if (prP2pNetdevRegMsg == NULL) {
- ASSERT(FALSE);
- status = WLAN_STATUS_RESOURCES;
- return status;
- }
- prP2pNetdevRegMsg->rMsgHdr.eMsgId = MID_MNY_P2P_NET_DEV_REGISTER;
- prP2pNetdevRegMsg->fgIsEnable = (prSetP2P->u4Enable == 1) ? TRUE : FALSE;
- prP2pNetdevRegMsg->ucMode = (UINT_8) prSetP2P->u4Mode;
- mboxSendMsg(prAdapter, MBOX_ID_0, (P_MSG_HDR_T) prP2pNetdevRegMsg, MSG_SEND_METHOD_BUF);
- #endif
- return status;
- }
- #endif
- #if CFG_SUPPORT_BUILD_DATE_CODE
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is used to query build date code information from firmware
- *
- * \param[in] pvAdapter Pointer to the Adapter structure.
- * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
- * the query.
- * \param[in] u4QueryBufferLen The length of the query buffer.
- * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
- * bytes written into the query buffer. If the call
- * failed due to invalid length of the query buffer,
- * returns the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_INVALID_LENGTH
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidQueryBuildDateCode(IN P_ADAPTER_T prAdapter,
- OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
- {
- CMD_GET_BUILD_DATE_CODE rCmdGetBuildDateCode;
- DEBUGFUNC("wlanoidQueryBuildDateCode");
- DBGLOG(OID, LOUD, "\n");
- ASSERT(prAdapter);
- ASSERT(pu4QueryInfoLen);
- if (u4QueryBufferLen)
- ASSERT(pvQueryBuffer);
- *pu4QueryInfoLen = sizeof(UINT_8) * 16;
- if (u4QueryBufferLen < sizeof(UINT_8) * 16)
- return WLAN_STATUS_INVALID_LENGTH;
- return wlanSendSetQueryCmd(prAdapter,
- CMD_ID_GET_BUILD_DATE_CODE,
- FALSE,
- TRUE,
- TRUE,
- nicCmdEventBuildDateCode,
- nicOidCmdTimeoutCommon,
- sizeof(CMD_GET_BUILD_DATE_CODE),
- (PUINT_8) &rCmdGetBuildDateCode, pvQueryBuffer, u4QueryBufferLen);
- } /* end of wlanoidQueryBuildDateCode() */
- #endif
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is used to query BSS info from firmware
- *
- * \param[in] pvAdapter Pointer to the Adapter structure.
- * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
- * the query.
- * \param[in] u4QueryBufferLen The length of the query buffer.
- * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
- * bytes written into the query buffer. If the call
- * failed due to invalid length of the query buffer,
- * returns the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_INVALID_LENGTH
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidQueryBSSInfo(IN P_ADAPTER_T prAdapter,
- OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
- {
- WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
- EVENT_AIS_BSS_INFO_T rCmdBSSInfo;
- ASSERT(prAdapter);
- ASSERT(pu4QueryInfoLen);
- if (u4QueryBufferLen)
- ASSERT(pvQueryBuffer);
- *pu4QueryInfoLen = sizeof(EVENT_AIS_BSS_INFO_T);
- if (u4QueryBufferLen < sizeof(EVENT_AIS_BSS_INFO_T))
- return WLAN_STATUS_INVALID_LENGTH;
- kalMemZero(&rCmdBSSInfo, sizeof(EVENT_AIS_BSS_INFO_T));
- /*
- rStatus = wlanSendSetQueryCmd(prAdapter,
- CMD_ID_GET_BSS_INFO,
- FALSE,
- TRUE,
- TRUE,
- nicCmdEventGetBSSInfo,
- nicOidCmdTimeoutCommon,
- sizeof(P_EVENT_AIS_BSS_INFO_T),
- (PUINT_8) &rCmdBSSInfo, pvQueryBuffer, u4QueryBufferLen);
- */
- rStatus = wlanSendSetQueryCmd(prAdapter,
- CMD_ID_GET_BSS_INFO,
- FALSE,
- TRUE,
- TRUE,
- nicCmdEventGetBSSInfo,
- nicOidCmdTimeoutCommon,
- sizeof(EVENT_AIS_BSS_INFO_T),
- (PUINT_8) & rCmdBSSInfo, pvQueryBuffer, u4QueryBufferLen);
- return rStatus;
- } /* wlanoidSetWiFiWmmPsTest */
- #if CFG_SUPPORT_BATCH_SCAN
- #define CMD_WLS_BATCHING "WLS_BATCHING"
- #define BATCHING_SET "SET"
- #define BATCHING_GET "GET"
- #define BATCHING_STOP "STOP"
- #define PARAM_SCANFREQ "SCANFREQ"
- #define PARAM_MSCAN "MSCAN"
- #define PARAM_BESTN "BESTN"
- #define PARAM_CHANNEL "CHANNEL"
- #define PARAM_RTT "RTT"
- WLAN_STATUS
- batchSetCmd(IN P_ADAPTER_T prAdapter, IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4WritenLen)
- {
- P_CHANNEL_INFO_T prRfChannelInfo;
- CMD_BATCH_REQ_T rCmdBatchReq;
- WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
- PCHAR head, p, p2;
- UINT_32 tokens;
- INT_32 scanfreq, mscan, bestn, rtt;
- DBGLOG(SCN, TRACE, "[BATCH] command=%s, len=%u\n", (PCHAR) pvSetBuffer, (UINT_32) u4SetBufferLen);
- if (!pu4WritenLen)
- return -EINVAL;
- *pu4WritenLen = 0;
- if (u4SetBufferLen < kalStrLen(CMD_WLS_BATCHING)) {
- DBGLOG(SCN, TRACE, "[BATCH] invalid len %u\n", (UINT_32) u4SetBufferLen);
- return -EINVAL;
- }
- head = pvSetBuffer + kalStrLen(CMD_WLS_BATCHING) + 1;
- kalMemSet(&rCmdBatchReq, 0, sizeof(CMD_BATCH_REQ_T));
- if (!kalStrnCmp(head, BATCHING_SET, kalStrLen(BATCHING_SET))) {
- DBGLOG(SCN, TRACE, "XXX Start Batch Scan XXX\n");
- head += kalStrLen(BATCHING_SET) + 1;
- /* SCANFREQ, MSCAN, BESTN */
- tokens = kalSScanf(head, "SCANFREQ=%d MSCAN=%d BESTN=%d", &scanfreq, &mscan, &bestn);
- if (tokens != 3) {
- DBGLOG(SCN, TRACE, "[BATCH] Parse fail: tokens=%u, SCANFREQ=%d MSCAN=%d BESTN=%d\n",
- (UINT_32) tokens, scanfreq, mscan, bestn);
- return -EINVAL;
- }
- /* RTT */
- p = kalStrStr(head, PARAM_RTT);
- if (!p) {
- DBGLOG(SCN, TRACE, "[BATCH] Parse RTT fail. head=%s\n", head);
- return -EINVAL;
- }
- tokens = kalSScanf(p, "RTT=%d", &rtt);
- if (tokens != 1) {
- DBGLOG(SCN, TRACE, "[BATCH] Parse fail: tokens=%u, rtt=%d\n", (UINT_32) tokens, rtt);
- return -EINVAL;
- }
- /* CHANNEL */
- p = kalStrStr(head, PARAM_CHANNEL);
- if (!p) {
- DBGLOG(SCN, TRACE, "[BATCH] Parse CHANNEL fail(1)\n");
- return -EINVAL;
- }
- head = p;
- p = kalStrChr(head, '>');
- if (!p) {
- DBGLOG(SCN, TRACE, "[BATCH] Parse CHANNEL fail(2)\n");
- return -EINVAL;
- }
- /* else {
- *p = '.'; // remove '>' because sscanf can not parse <%s>
- }*/
- /*tokens = kalSScanf(head, "CHANNEL=<%s", c_channel);
- if (tokens != 1) {
- DBGLOG(SCN, TRACE, ("[BATCH] Parse fail: tokens=%d, CHANNEL=<%s>\n",
- tokens, c_channel));
- return -EINVAL;
- } */
- rCmdBatchReq.ucChannelType = SCAN_CHANNEL_SPECIFIED;
- rCmdBatchReq.ucChannelListNum = 0;
- prRfChannelInfo = &rCmdBatchReq.arChannelList[0];
- p = head + kalStrLen(PARAM_CHANNEL) + 2; /* c_channel; */
- while ((p2 = kalStrSep((char **)&p, ",")) != NULL) {
- if (p2 == NULL || *p2 == 0)
- break;
- if (*p2 == '\0')
- continue;
- if (*p2 == 'A') {
- rCmdBatchReq.ucChannelType =
- rCmdBatchReq.ucChannelType ==
- SCAN_CHANNEL_2G4 ? SCAN_CHANNEL_FULL : SCAN_CHANNEL_5G;
- } else if (*p2 == 'B') {
- rCmdBatchReq.ucChannelType =
- rCmdBatchReq.ucChannelType ==
- SCAN_CHANNEL_5G ? SCAN_CHANNEL_FULL : SCAN_CHANNEL_2G4;
- } else {
- /* Translate Freq from MHz to channel number. */
- prRfChannelInfo->ucChannelNum = kalStrtol(p2, NULL, 0);
- DBGLOG(SCN, TRACE, "Scanning Channel:%u, freq: %d\n",
- (UINT_32) prRfChannelInfo->ucChannelNum,
- (UINT_32) nicChannelNum2Freq(prRfChannelInfo->ucChannelNum));
- prRfChannelInfo->ucBand = prRfChannelInfo->ucChannelNum < 15 ? BAND_2G4 : BAND_5G;
- rCmdBatchReq.ucChannelListNum++;
- if (rCmdBatchReq.ucChannelListNum >= 32)
- break;
- prRfChannelInfo++;
- }
- }
- /* set channel for test */
- #if 0
- rCmdBatchReq.ucChannelType = 4; /* SCAN_CHANNEL_SPECIFIED; */
- rCmdBatchReq.ucChannelListNum = 0;
- prRfChannelInfo = &rCmdBatchReq.arChannelList[0];
- for (i = 1; i <= 14; i++) {
- /* filter out some */
- if (i == 1 || i == 5 || i == 11)
- continue;
- /* Translate Freq from MHz to channel number. */
- prRfChannelInfo->ucChannelNum = i;
- DBGLOG(SCN, TRACE, "Scanning Channel:%d, freq: %d\n",
- prRfChannelInfo->ucChannelNum,
- nicChannelNum2Freq(prRfChannelInfo->ucChannelNum));
- prRfChannelInfo->ucBand = BAND_2G4;
- rCmdBatchReq.ucChannelListNum++;
- prRfChannelInfo++;
- }
- #endif
- #if 0
- rCmdBatchReq.ucChannelType = 0; /* SCAN_CHANNEL_FULL; */
- #endif
- rCmdBatchReq.u4Scanfreq = scanfreq;
- rCmdBatchReq.ucMScan = mscan > CFG_BATCH_MAX_MSCAN ? CFG_BATCH_MAX_MSCAN : mscan;
- rCmdBatchReq.ucBestn = bestn;
- rCmdBatchReq.ucRtt = rtt;
- DBGLOG(SCN, TRACE, "[BATCH] SCANFREQ=%u MSCAN=%u BESTN=%u RTT=%u\n",
- (UINT_32) rCmdBatchReq.u4Scanfreq,
- (UINT_32) rCmdBatchReq.ucMScan,
- (UINT_32) rCmdBatchReq.ucBestn, (UINT_32) rCmdBatchReq.ucRtt;
- if (rCmdBatchReq.ucChannelType != SCAN_CHANNEL_SPECIFIED) {
- DBGLOG(SCN, TRACE, "[BATCH] CHANNELS = %s\n",
- rCmdBatchReq.ucChannelType == SCAN_CHANNEL_FULL ? "FULL" :
- rCmdBatchReq.ucChannelType == SCAN_CHANNEL_2G4 ? "2.4G all" : "5G all");
- } else {
- DBGLOG(SCN, TRACE, "[BATCH] CHANNEL list\n");
- prRfChannelInfo = &rCmdBatchReq.arChannelList[0];
- for (tokens = 0; tokens < rCmdBatchReq.ucChannelListNum; tokens++) {
- DBGLOG(SCN, TRACE, "[BATCH] %s, %d\n",
- prRfChannelInfo->ucBand == BAND_2G4 ? "2.4G" : "5G",
- prRfChannelInfo->ucChannelNum);
- prRfChannelInfo++;
- }
- }
- rCmdBatchReq.ucSeqNum = 1;
- rCmdBatchReq.ucNetTypeIndex = NETWORK_TYPE_AIS_INDEX;
- rCmdBatchReq.ucCmd = SCAN_BATCH_REQ_START;
- *pu4WritenLen = kalSnprintf(pvSetBuffer, 3, "%d", rCmdBatchReq.ucMScan);
- } else if (!kalStrnCmp(head, BATCHING_STOP, kalStrLen(BATCHING_STOP))) {
- DBGLOG(SCN, TRACE, "XXX Stop Batch Scan XXX\n");
- rCmdBatchReq.ucSeqNum = 1;
- rCmdBatchReq.ucNetTypeIndex = NETWORK_TYPE_AIS_INDEX;
- rCmdBatchReq.ucCmd = SCAN_BATCH_REQ_STOP;
- } else {
- return -EINVAL;
- }
- wlanSendSetQueryCmd(prAdapter,
- CMD_ID_SET_BATCH_REQ,
- TRUE, FALSE, TRUE, NULL, NULL, sizeof(CMD_BATCH_REQ_T), (PUINT_8) &rCmdBatchReq, NULL, 0);
- /* kalMemSet(pvSetBuffer, 0, u4SetBufferLen); */
- /* rStatus = kalSnprintf(pvSetBuffer, 2, "%s", "OK"); */
- return rStatus;
- }
- WLAN_STATUS
- batchGetCmd(IN P_ADAPTER_T prAdapter,
- OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
- {
- CMD_BATCH_REQ_T rCmdBatchReq;
- WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
- P_EVENT_BATCH_RESULT_T prEventBatchResult;
- ASSERT(prAdapter);
- ASSERT(pu4QueryInfoLen);
- if (u4QueryBufferLen)
- ASSERT(pvQueryBuffer);
- prEventBatchResult = (P_EVENT_BATCH_RESULT_T) pvQueryBuffer;
- DBGLOG(SCN, TRACE, "XXX Get Batch Scan Result (%u) XXX\n", (UINT_32) prEventBatchResult->ucScanCount);
- *pu4QueryInfoLen = sizeof(EVENT_BATCH_RESULT_T);
- rCmdBatchReq.ucSeqNum = 2;
- rCmdBatchReq.ucCmd = SCAN_BATCH_REQ_RESULT;
- rCmdBatchReq.ucMScan = prEventBatchResult->ucScanCount; /* Get which round result */
- rStatus = wlanSendSetQueryCmd(prAdapter,
- CMD_ID_SET_BATCH_REQ,
- FALSE,
- TRUE,
- TRUE,
- nicCmdEventBatchScanResult,
- nicOidCmdTimeoutCommon,
- sizeof(CMD_BATCH_REQ_T),
- (PUINT_8) &rCmdBatchReq, (PVOID) pvQueryBuffer, u4QueryBufferLen);
- return rStatus;
- }
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief
- *
- * \param[in] prAdapter Pointer to the Adapter structure
- * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set
- * \param[in] u4SetBufferLen The length of the set buffer
- * \param[out] pu4SetInfoLen If the call is successful, returns the number of
- * bytes read from the set buffer. If the call failed due to invalid length of
- * the set buffer, returns the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_INVALID_DATA If new setting value is wrong.
- * \retval WLAN_STATUS_INVALID_LENGTH
- *
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidSetBatchScanReq(IN P_ADAPTER_T prAdapter,
- IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- return batchSetCmd(prAdapter, pvSetBuffer, u4SetBufferLen, pu4SetInfoLen);
- }
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief
- *
- * \param[in] pvAdapter Pointer to the Adapter structure.
- * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
- * the query.
- * \param[in] u4QueryBufferLen The length of the query buffer.
- * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
- * bytes written into the query buffer. If the call
- * failed due to invalid length of the query buffer,
- * returns the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_INVALID_LENGTH
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidQueryBatchScanResult(IN P_ADAPTER_T prAdapter,
- OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
- {
- return batchGetCmd(prAdapter, pvQueryBuffer, u4QueryBufferLen, pu4QueryInfoLen);
- } /* end of wlanoidQueryBatchScanResult() */
- #endif /* CFG_SUPPORT_BATCH_SCAN */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to request starting of schedule scan
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
- * \param[in] u4SetBufferLen The length of the set buffer.
- * \param[out] pu4SetInfoLen If the call is successful, returns the number of
- * bytes read from the set buffer. If the call failed
- * due to invalid length of the set buffer, returns
- * the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_ADAPTER_NOT_READY
- * \retval WLAN_STATUS_INVALID_LENGTH
- * \retval WLAN_STATUS_INVALID_DATA
- *
- * \note The setting buffer PARAM_SCHED_SCAN_REQUEST_EXT_T
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidSetStartSchedScan(IN P_ADAPTER_T prAdapter,
- IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- P_PARAM_SCHED_SCAN_REQUEST prSchedScanRequest;
- DEBUGFUNC("wlanoidSetStartSchedScan()");
- if (prAdapter->rAcpiState == ACPI_STATE_D3) {
- DBGLOG(SCN, WARN, "Fail in set scheduled scan! (Adapter not ready). ACPI=D%d, Radio=%d\n",
- prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
- return WLAN_STATUS_ADAPTER_NOT_READY;
- }
- ASSERT(pu4SetInfoLen);
- *pu4SetInfoLen = 0;
- if (u4SetBufferLen != sizeof(PARAM_SCHED_SCAN_REQUEST)) {
- return WLAN_STATUS_INVALID_LENGTH;
- } else if (pvSetBuffer == NULL) {
- return WLAN_STATUS_INVALID_DATA;
- } else if (kalGetMediaStateIndicated(prAdapter->prGlueInfo) == PARAM_MEDIA_STATE_CONNECTED &&
- prAdapter->fgEnOnlineScan == FALSE) {
- return WLAN_STATUS_FAILURE;
- }
- if (prAdapter->fgIsRadioOff) {
- DBGLOG(SCN, WARN, "Return from BSSID list scan! (radio off). ACPI=D%d, Radio=%d\n",
- prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
- return WLAN_STATUS_SUCCESS;
- }
- prSchedScanRequest = (P_PARAM_SCHED_SCAN_REQUEST) pvSetBuffer;
- if (scnFsmSchedScanRequest(prAdapter,
- (UINT_8) (prSchedScanRequest->u4SsidNum),
- prSchedScanRequest->arSsid,
- prSchedScanRequest->u4IELength,
- prSchedScanRequest->pucIE, prSchedScanRequest->u2ScanInterval) == TRUE) {
- return WLAN_STATUS_SUCCESS;
- } else {
- return WLAN_STATUS_FAILURE;
- }
- }
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to request termination of schedule scan
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
- * \param[in] u4SetBufferLen The length of the set buffer.
- * \param[out] pu4SetInfoLen If the call is successful, returns the number of
- * bytes read from the set buffer. If the call failed
- * due to invalid length of the set buffer, returns
- * the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_ADAPTER_NOT_READY
- * \retval WLAN_STATUS_INVALID_LENGTH
- * \retval WLAN_STATUS_INVALID_DATA
- *
- * \note The setting buffer PARAM_SCHED_SCAN_REQUEST_EXT_T
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidSetStopSchedScan(IN P_ADAPTER_T prAdapter,
- IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- ASSERT(prAdapter);
- /* ask SCN module to stop scan request */
- if (scnFsmSchedScanStopRequest(prAdapter) == TRUE)
- return WLAN_STATUS_SUCCESS;
- else
- return WLAN_STATUS_FAILURE;
- }
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to set a periodically scan action
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
- * \param[in] u4SetBufferLen The length of the set buffer.
- * \param[out] pu4SetInfoLen If the call is successful, returns the number of
- * bytes read from the set buffer. If the call failed
- * due to invalid length of the set buffer, returns
- * the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_ADAPTER_NOT_READY
- * \retval WLAN_STATUS_INVALID_LENGTH
- * \retval WLAN_STATUS_INVALID_DATA
- *
- * \note The setting buffer PARAM_SCHED_SCAN_REQUEST_EXT_T
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidSetGSCNAction(IN P_ADAPTER_T prAdapter,
- IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- P_CMD_SET_PSCAN_ENABLE prCmdPscnAction;
- P_SCAN_INFO_T prScanInfo;
- prScanInfo = &(prAdapter->rWifiVar.rScanInfo);
- DBGLOG(SCN, TRACE, "wlanoidSetGSCNAction\n");
- if (prAdapter->rAcpiState == ACPI_STATE_D3) {
- DBGLOG(SCN, WARN, "Fail in set Periodically Scan! (Adapter not ready). ACPI=D%d, Radio=%d\n",
- prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
- return WLAN_STATUS_ADAPTER_NOT_READY;
- }
- if (u4SetBufferLen != sizeof(CMD_SET_PSCAN_ENABLE))
- return WLAN_STATUS_INVALID_LENGTH;
- else if (pvSetBuffer == NULL)
- return WLAN_STATUS_INVALID_DATA;
- if (prAdapter->fgIsRadioOff) {
- DBGLOG(SCN, WARN, "Return from BSSID list scan! (radio off). ACPI=D%d, Radio=%d\n",
- prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
- return WLAN_STATUS_SUCCESS;
- }
- prCmdPscnAction = (P_CMD_SET_PSCAN_ENABLE) pvSetBuffer;
- if (prCmdPscnAction->ucPscanAct == ENABLE) {
- #if 0
- DBGLOG(OID, INFO, "set PCSN ENABLE\n");
- if (scnFsmPSCNAction(prAdapter, (UINT_8) (prCmdPscnAction->ucPscanAct)) == TRUE) {
- DBGLOG(OID, INFO, "wlanoidSetGSCNAction < ---\n");
- return WLAN_STATUS_PENDING;
- }
- DBGLOG(OID, INFO, "wlanoidSetGSCNAction < ---\n");
- return WLAN_STATUS_FAILURE;
- #endif
- scnPSCNFsm(prAdapter, PSCN_SCANNING, NULL, NULL, NULL, NULL, FALSE, FALSE, FALSE, TRUE);
- } else if (prCmdPscnAction->ucPscanAct == DISABLE) {
- #if 0
- DBGLOG(OID, INFO, "disable PCSN\n");
- scnFsmPSCNAction(prAdapter, (UINT_8) DISABLE);
- DBGLOG(OID, TRACE, "set new PCSN\n");
- scnCombineParamsIntoPSCN(prAdapter, NULL, NULL, NULL, NULL, FALSE, FALSE, TRUE);
- DBGLOG(OID, INFO, "ENABLE or disable PCSN\n");
- if (!prScanInfo->fgPscnOnnning) {
- DBGLOG(OID, INFO, "ENABLE PCSN\n");
- scnFsmPSCNAction(prAdapter, ENABLE);
- } else {
- DBGLOG(OID, INFO, "All PCSN is disabled...\n");
- }
- #endif
- scnPSCNFsm(prAdapter, PSCN_RESET, NULL, NULL, NULL, NULL, FALSE, FALSE, TRUE, FALSE);
- }
- return WLAN_STATUS_SUCCESS;
- }
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to set a periodically scan action
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
- * \param[in] u4SetBufferLen The length of the set buffer.
- * \param[out] pu4SetInfoLen If the call is successful, returns the number of
- * bytes read from the set buffer. If the call failed
- * due to invalid length of the set buffer, returns
- * the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_ADAPTER_NOT_READY
- * \retval WLAN_STATUS_INVALID_LENGTH
- * \retval WLAN_STATUS_INVALID_DATA
- *
- * \note The setting buffer PARAM_SCHED_SCAN_REQUEST_EXT_T
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidSetGSCNAParam(IN P_ADAPTER_T prAdapter,
- IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- P_PARAM_WIFI_GSCAN_CMD_PARAMS prCmdGscnParam;
- /*UINT_8 i, j = 0;*/
- DBGLOG(SCN, INFO, "wlanoidSetGSCNAParam v1\n");
- if (prAdapter->rAcpiState == ACPI_STATE_D3) {
- DBGLOG(SCN, WARN, "Fail in set Periodically Scan! (Adapter not ready). ACPI=D%d, Radio=%d\n",
- prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
- return WLAN_STATUS_ADAPTER_NOT_READY;
- }
- if (u4SetBufferLen != sizeof(PARAM_WIFI_GSCAN_CMD_PARAMS)) {
- DBGLOG(SCN, WARN, "(u4SetBufferLen != sizeof(P_PARAM_WIFI_GSCAN_CMD_PARAMS))\n");
- return WLAN_STATUS_INVALID_LENGTH;
- } else if (pvSetBuffer == NULL) {
- DBGLOG(SCN, WARN, "(pvSetBuffer == NULL)\n");
- return WLAN_STATUS_INVALID_DATA;
- }
- if (prAdapter->fgIsRadioOff) {
- DBGLOG(SCN, INFO, "Return from BSSID list scan! (radio off). ACPI=D%d, Radio=%d\n",
- prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
- return WLAN_STATUS_SUCCESS;
- }
- prCmdGscnParam = (P_PARAM_WIFI_GSCAN_CMD_PARAMS) pvSetBuffer;
- /* KC-XXX memcpy(prCmdGscnParam, */
- /* (P_PARAM_WIFI_GSCAN_CMD_PARAMS)pvSetBuffer, */
- /* sizeof(PARAM_WIFI_GSCAN_CMD_PARAMS) ); */
- DBGLOG(SCN, INFO,
- "prCmdGscnParam : base_period[%u], max_ap_per_scan[%u] num_buckets[%u], report_threshold[%u]\n",
- prCmdGscnParam->base_period, prCmdGscnParam->max_ap_per_scan, prCmdGscnParam->num_buckets,
- prCmdGscnParam->report_threshold);
- #if 0
- for (i = 0; i < prCmdGscnParam->num_buckets; i++) {
- DBGLOG(OID, INFO,
- "prCmdGscnParam->buckets : band[%u], bucket[%u] num_buckets[%u], period[%u] report_events[%u]\n",
- prCmdGscnParam->buckets[i].band, prCmdGscnParam->buckets[i].bucket,
- prCmdGscnParam->buckets[i].num_channels, prCmdGscnParam->buckets[i].period,
- prCmdGscnParam->buckets[i].report_events));
- DBGLOG(OID, INFO, "prCmdGscnParam->buckets[%d] has channel: ", i);
- for (j = 0; j < prCmdGscnParam->buckets[i].num_channels; j++)
- DBGLOG(OID, INFO, " %d, ", prCmdGscnParam->buckets[i].channels[j].channel);
- DBGLOG(OID, INFO, "\n");
- }
- #endif
- if (scnSetGSCNParam(prAdapter, prCmdGscnParam) == TRUE) {
- DBGLOG(SCN, INFO, "wlanoidSetGSCNAParam --->scnSetGSCNParam\n");
- return WLAN_STATUS_PENDING;
- } else {
- return WLAN_STATUS_FAILURE;
- }
- }
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to set configure gscan PARAMs
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
- * \param[in] u4SetBufferLen The length of the set buffer.
- * \param[out] pu4SetInfoLen If the call is successful, returns the number of
- * bytes read from the set buffer. If the call failed
- * due to invalid length of the set buffer, returns
- * the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_ADAPTER_NOT_READY
- * \retval WLAN_STATUS_INVALID_LENGTH
- * \retval WLAN_STATUS_INVALID_DATA
- *
- * \note The setting buffer PARAM_SCHED_SCAN_REQUEST_EXT_T
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidSetGSCNAConfig(IN P_ADAPTER_T prAdapter,
- IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- P_PARAM_WIFI_GSCAN_CMD_PARAMS prCmdGscnScnConfigParam;
- CMD_GSCN_SCN_COFIG_T rCmdGscnScnConfig;
- DBGLOG(SCN, INFO, "wlanoidSetGSCNAConfig v1\n");
- if (prAdapter->rAcpiState == ACPI_STATE_D3) {
- DBGLOG(SCN, WARN, "Fail in set Periodically Scan! (Adapter not ready). ACPI=D%d, Radio=%d\n",
- prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
- return WLAN_STATUS_ADAPTER_NOT_READY;
- }
- if (u4SetBufferLen != sizeof(PARAM_WIFI_GSCAN_CMD_PARAMS)) {
- DBGLOG(SCN, WARN, "(u4SetBufferLen != sizeof(CMD_GSCN_SCN_COFIG_T))\n");
- return WLAN_STATUS_INVALID_LENGTH;
- } else if (pvSetBuffer == NULL) {
- DBGLOG(SCN, WARN, "(pvSetBuffer == NULL)\n");
- return WLAN_STATUS_INVALID_DATA;
- }
- if (prAdapter->fgIsRadioOff) {
- DBGLOG(SCN, INFO, "Return from BSSID list scan! (radio off). ACPI=D%d, Radio=%d\n",
- prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
- return WLAN_STATUS_SUCCESS;
- }
- DBGLOG(SCN, INFO, "prCmdGscnScnConfigParam = (P_PARAM_WIFI_GSCAN_CMD_PARAMS)pvSetBuffer\n");
- prCmdGscnScnConfigParam = (P_PARAM_WIFI_GSCAN_CMD_PARAMS) pvSetBuffer;
- memcpy(prCmdGscnScnConfigParam, (P_PARAM_WIFI_GSCAN_CMD_PARAMS) pvSetBuffer,
- sizeof(PARAM_WIFI_GSCAN_CMD_PARAMS));
- DBGLOG(SCN, INFO, "prCmdGscnScnConfigParam assign prCmdGscnScnConfig\n");
- rCmdGscnScnConfig.u4BufferThreshold = prCmdGscnScnConfigParam->report_threshold;
- rCmdGscnScnConfig.ucNumApPerScn = prCmdGscnScnConfigParam->max_ap_per_scan;
- rCmdGscnScnConfig.u4NumScnToCache = prCmdGscnScnConfigParam->num_scans;
- DBGLOG(SCN, INFO, " report_threshold %d report_threshold %d num_scans %d\n",
- rCmdGscnScnConfig.u4BufferThreshold,
- rCmdGscnScnConfig.ucNumApPerScn, rCmdGscnScnConfig.u4NumScnToCache);
- if (scnFsmSetGSCNConfig(prAdapter, &rCmdGscnScnConfig) == TRUE) {
- DBGLOG(SCN, INFO, "wlanoidSetGSCNAParam --->scnSetGSCNParam\n");
- return WLAN_STATUS_PENDING;
- } else {
- return WLAN_STATUS_FAILURE;
- }
- }
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to get a gscan result
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
- * \param[in] u4SetBufferLen The length of the set buffer.
- * \param[out] pu4SetInfoLen If the call is successful, returns the number of
- * bytes read from the set buffer. If the call failed
- * due to invalid length of the set buffer, returns
- * the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_ADAPTER_NOT_READY
- * \retval WLAN_STATUS_INVALID_LENGTH
- * \retval WLAN_STATUS_INVALID_DATA
- *
- * \note The setting buffer PARAM_SCHED_SCAN_REQUEST_EXT_T
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidGetGSCNResult(IN P_ADAPTER_T prAdapter,
- IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- P_PARAM_WIFI_GSCAN_GET_RESULT_PARAMS prGetGscnScnResultParm;
- CMD_GET_GSCAN_RESULT_T rGetGscnScnResultCmd;
- DEBUGFUNC("wlanoidGetGSCNResult()");
- DBGLOG(SCN, INFO, "wlanoidGetGSCNResult v1\n");
- if (prAdapter->rAcpiState == ACPI_STATE_D3) {
- DBGLOG(SCN, WARN, "Fail in set Periodically Scan! (Adapter not ready). ACPI=D%d, Radio=%d\n",
- prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
- return WLAN_STATUS_ADAPTER_NOT_READY;
- }
- if (u4SetBufferLen != sizeof(PARAM_WIFI_GSCAN_GET_RESULT_PARAMS)) {
- DBGLOG(SCN, WARN, "(u4SetBufferLen != sizeof(CMD_GSCN_SCN_COFIG_T))\n");
- return WLAN_STATUS_INVALID_LENGTH;
- } else if (pvSetBuffer == NULL) {
- DBGLOG(SCN, WARN, "(pvSetBuffer == NULL)\n");
- return WLAN_STATUS_INVALID_DATA;
- }
- if (prAdapter->fgIsRadioOff) {
- DBGLOG(SCN, INFO, "Return from BSSID list scan! (radio off). ACPI=D%d, Radio=%d\n",
- prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
- return WLAN_STATUS_SUCCESS;
- }
- prGetGscnScnResultParm = (P_PARAM_WIFI_GSCAN_GET_RESULT_PARAMS) pvSetBuffer;
- /* memcpy(&rGetGscnScnResultCmd, prGetGscnScnResultParm, sizeof(PARAM_WIFI_GSCAN_GET_RESULT_PARAMS) ); */
- rGetGscnScnResultCmd.u4Num = prGetGscnScnResultParm->get_num;
- rGetGscnScnResultCmd.ucFlush = prGetGscnScnResultParm->flush;
- rGetGscnScnResultCmd.ucVersion = PSCAN_VERSION;
- kalMemZero(rGetGscnScnResultCmd.aucReserved, sizeof(rGetGscnScnResultCmd.aucReserved));
- if (scnFsmGetGSCNResult(prAdapter, &rGetGscnScnResultCmd) == TRUE) {
- DBGLOG(SCN, INFO, "wlanoidGetGSCNResult --->scnFsmGetGSCNResult\n");
- return WLAN_STATUS_PENDING;
- } else {
- return WLAN_STATUS_FAILURE;
- }
- }
- #if CFG_SUPPORT_HOTSPOT_2_0
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called by HS2.0 to set the assoc info, which is needed to add to
- * Association request frame while join HS2.0 AP.
- *
- * \param[in] prAdapter Pointer to the Adapter structure
- * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set
- * \param[in] u4SetBufferLen The length of the set buffer
- * \param[out] pu4SetInfoLen If the call is successful, returns the number of
- * bytes read from the set buffer. If the call failed due to invalid length of
- * the set buffer, returns the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_INVALID_DATA If new setting value is wrong.
- * \retval WLAN_STATUS_INVALID_LENGTH
- *
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidSetHS20Info(IN P_ADAPTER_T prAdapter,
- IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- P_IE_HS20_INDICATION_T prHS20IndicationIe;
- ASSERT(prAdapter);
- ASSERT(pvSetBuffer);
- ASSERT(pu4SetInfoLen);
- DEBUGFUNC("wlanoidSetHS20AssocInfo");
- DBGLOG(OID, LOUD, "\r\n");
- if (u4SetBufferLen == 0)
- return WLAN_STATUS_INVALID_LENGTH;
- *pu4SetInfoLen = u4SetBufferLen;
- prHS20IndicationIe = (P_IE_HS20_INDICATION_T) pvSetBuffer;
- prAdapter->prGlueInfo->ucHotspotConfig = prHS20IndicationIe->ucHotspotConfig;
- prAdapter->prGlueInfo->fgConnectHS20AP = TRUE;
- DBGLOG(SEC, TRACE, "HS20 IE sz %u\n", u4SetBufferLen);
- kalMemCopy(prAdapter->prGlueInfo->aucHS20AssocInfoIE, pvSetBuffer, u4SetBufferLen);
- prAdapter->prGlueInfo->u2HS20AssocInfoIELen = (UINT_16) u4SetBufferLen;
- DBGLOG(SEC, TRACE, "HS20 Assoc Info IE sz %u\n", u4SetBufferLen);
- return WLAN_STATUS_SUCCESS;
- }
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called by WSC to set the assoc info, which is needed to add to
- * Association request frame while join WPS AP.
- *
- * \param[in] prAdapter Pointer to the Adapter structure
- * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set
- * \param[in] u4SetBufferLen The length of the set buffer
- * \param[out] pu4SetInfoLen If the call is successful, returns the number of
- * bytes read from the set buffer. If the call failed due to invalid length of
- * the set buffer, returns the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_INVALID_DATA If new setting value is wrong.
- * \retval WLAN_STATUS_INVALID_LENGTH
- *
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidSetInterworkingInfo(IN P_ADAPTER_T prAdapter,
- IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- #if 0
- P_HS20_INFO_T prHS20Info = NULL;
- P_IE_INTERWORKING_T prInterWorkingIe;
- ASSERT(prAdapter);
- ASSERT(pvSetBuffer);
- ASSERT(pu4SetInfoLen);
- prHS20Info = &(prAdapter->rWifiVar.rHS20Info);
- DEBUGFUNC("wlanoidSetInterworkingInfo");
- DBGLOG(OID, TRACE, "\r\n");
- if (u4SetBufferLen == 0)
- return WLAN_STATUS_INVALID_LENGTH;
- *pu4SetInfoLen = u4SetBufferLen;
- prInterWorkingIe = (P_IE_INTERWORKING_T) pvSetBuffer;
- prHS20Info->ucAccessNetworkOptions = prInterWorkingIe->ucAccNetOpt;
- prHS20Info->ucVenueGroup = prInterWorkingIe->ucVenueGroup;
- prHS20Info->ucVenueType = prInterWorkingIe->ucVenueType;
- COPY_MAC_ADDR(prHS20Info->aucHESSID, prInterWorkingIe->aucHESSID);
- DBGLOG(SEC, TRACE, "IW IE sz %ld\n", u4SetBufferLen);
- #endif
- return WLAN_STATUS_SUCCESS;
- }
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called by WSC to set the Roaming Consortium IE info, which is needed to
- * add to Association request frame while join WPS AP.
- *
- * \param[in] prAdapter Pointer to the Adapter structure
- * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set
- * \param[in] u4SetBufferLen The length of the set buffer
- * \param[out] pu4SetInfoLen If the call is successful, returns the number of
- * bytes read from the set buffer. If the call failed due to invalid length of
- * the set buffer, returns the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_INVALID_DATA If new setting value is wrong.
- * \retval WLAN_STATUS_INVALID_LENGTH
- *
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidSetRoamingConsortiumIEInfo(IN P_ADAPTER_T prAdapter,
- IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- #if 0
- P_HS20_INFO_T prHS20Info = NULL;
- P_PARAM_HS20_ROAMING_CONSORTIUM_INFO prRCInfo;
- ASSERT(prAdapter);
- ASSERT(pvSetBuffer);
- ASSERT(pu4SetInfoLen);
- prHS20Info = &(prAdapter->rWifiVar.rHS20Info);
- /* DEBUGFUNC("wlanoidSetRoamingConsortiumInfo"); */
- /* DBGLOG(HS2, TRACE, ("\r\n")); */
- if (u4SetBufferLen == 0)
- return WLAN_STATUS_INVALID_LENGTH;
- *pu4SetInfoLen = u4SetBufferLen;
- prRCInfo = (P_PARAM_HS20_ROAMING_CONSORTIUM_INFO) pvSetBuffer;
- kalMemCopy(&(prHS20Info->rRCInfo), prRCInfo, sizeof(PARAM_HS20_ROAMING_CONSORTIUM_INFO));
- /* DBGLOG(HS2, TRACE, ("RoamingConsortium IE sz %ld\n", u4SetBufferLen)); */
- #endif
- return WLAN_STATUS_SUCCESS;
- }
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to set_bssid_pool
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[in] pvSetBuffer Pointer to the buffer that holds the data to be set.
- * \param[in] u4SetBufferLen The length of the set buffer.
- * \param[out] pu4SetInfoLen If the call is successful, returns the number of
- * bytes read from the set buffer. If the call failed
- * due to invalid length of the set buffer, returns
- * the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_INVALID_LENGTH
- * \retval WLAN_STATUS_ADAPTER_NOT_READY
- * \retval WLAN_STATUS_MULTICAST_FULL
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidSetHS20BssidPool(IN P_ADAPTER_T prAdapter,
- IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- WLAN_STATUS rWlanStatus = WLAN_STATUS_SUCCESS;
- ASSERT(prAdapter);
- ASSERT(pu4SetInfoLen);
- if (u4SetBufferLen)
- ASSERT(pvSetBuffer);
- if (u4SetBufferLen < sizeof(PARAM_HS20_SET_BSSID_POOL)) {
- *pu4SetInfoLen = sizeof(PARAM_HS20_SET_BSSID_POOL);
- return WLAN_STATUS_BUFFER_TOO_SHORT;
- }
- rWlanStatus = hs20SetBssidPool(prAdapter, pvSetBuffer, NETWORK_TYPE_AIS_INDEX);
- return rWlanStatus;
- } /* end of wlanoidSendHS20GASRequest() */
- #endif
- #if CFG_SUPPORT_ROAMING_ENC
- /*----------------------------------------------------------------------------*/
- /*! \brief This routine is called to query the MAC address the NIC is currently using.
- *
- * \param[in] pvAdapter Pointer to the Adapter structure
- * \param[in] pvQueryBuf A pointer to the buffer that holds the result of the
- * query buffer
- * \param[in] u4QueryBufLen The length of the query buffer
- * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
- * bytes written into the query buffer. If the call
- * failed due to invalid length of the query buffer,
- * returns the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_BUFFER_TOO_SHORT
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidSetRoamingInfo(IN P_ADAPTER_T prAdapter,
- IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- CMD_ROAMING_INFO_T *prCmdRoamingInfo;
- DEBUGFUNC("wlanoidSetRoamingInfo");
- DBGLOG(OID, LOUD, "\n");
- ASSERT(prAdapter);
- ASSERT(pu4SetInfoLen);
- *pu4SetInfoLen = sizeof(CMD_ROAMING_INFO_T);
- if (u4SetBufferLen < sizeof(CMD_ROAMING_INFO_T))
- return WLAN_STATUS_INVALID_LENGTH;
- ASSERT(pvSetBuffer);
- prCmdRoamingInfo = (CMD_ROAMING_INFO_T *) pvSetBuffer;
- return wlanSendSetQueryCmd(prAdapter,
- CMD_ID_SET_ROAMING_INFO,
- TRUE,
- FALSE,
- TRUE,
- nicCmdEventSetCommon,
- nicOidCmdTimeoutCommon,
- sizeof(CMD_ROAMING_INFO_T), (PUINT_8) prCmdRoamingInfo, NULL, 0);
- }
- #endif /* CFG_SUPPORT_ROAMING_ENC */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to set chip
- *
- * \param[in] prAdapter Pointer to the Adapter structure.
- * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
- * \param[in] u4SetBufferLen The length of the set buffer.
- * \param[out] pu4SetInfoLen If the call is successful, returns the number of
- * bytes read from the set buffer. If the call failed
- * due to invalid length of the set buffer, returns
- * the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_INVALID_LENGTH
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidSetChipConfig(IN P_ADAPTER_T prAdapter,
- IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- P_PARAM_CUSTOM_CHIP_CONFIG_STRUCT_T prChipConfigInfo;
- CMD_CHIP_CONFIG_T rCmdChipConfig;
- WLAN_STATUS rWlanStatus = WLAN_STATUS_SUCCESS;
- DATA_STRUCT_INSPECTING_ASSERT(sizeof(prChipConfigInfo->aucCmd) == CHIP_CONFIG_RESP_SIZE);
- DEBUGFUNC("wlanoidSetChipConfig");
- DBGLOG(OID, LOUD, "\n");
- ASSERT(prAdapter);
- ASSERT(pu4SetInfoLen);
- *pu4SetInfoLen = sizeof(PARAM_CUSTOM_CHIP_CONFIG_STRUCT_T);
- if (u4SetBufferLen < sizeof(PARAM_CUSTOM_CHIP_CONFIG_STRUCT_T))
- return WLAN_STATUS_INVALID_LENGTH;
- ASSERT(pvSetBuffer);
- prChipConfigInfo = (P_PARAM_CUSTOM_CHIP_CONFIG_STRUCT_T) pvSetBuffer;
- kalMemZero(&rCmdChipConfig, sizeof(rCmdChipConfig));
- rCmdChipConfig.u2Id = prChipConfigInfo->u2Id;
- rCmdChipConfig.ucType = prChipConfigInfo->ucType;
- rCmdChipConfig.ucRespType = prChipConfigInfo->ucRespType;
- rCmdChipConfig.u2MsgSize = prChipConfigInfo->u2MsgSize;
- if (rCmdChipConfig.u2MsgSize > CHIP_CONFIG_RESP_SIZE) {
- DBGLOG(OID, INFO, "Chip config Msg Size %u is not valid (set)\n", rCmdChipConfig.u2MsgSize);
- rCmdChipConfig.u2MsgSize = CHIP_CONFIG_RESP_SIZE;
- }
- kalMemCopy(rCmdChipConfig.aucCmd, prChipConfigInfo->aucCmd, rCmdChipConfig.u2MsgSize);
- DBGLOG(OID, TRACE, "rCmdChipConfig.aucCmd=%s\n", rCmdChipConfig.aucCmd);
- #if 1
- rWlanStatus = wlanSendSetQueryCmd(prAdapter,
- CMD_ID_CHIP_CONFIG,
- TRUE,
- FALSE,
- TRUE,
- nicCmdEventSetCommon,
- nicOidCmdTimeoutCommon,
- sizeof(CMD_CHIP_CONFIG_T),
- (PUINT_8) &rCmdChipConfig, pvSetBuffer, u4SetBufferLen);
- #endif
- return rWlanStatus;
- } /* wlanoidSetChipConfig */
- WLAN_STATUS
- wlanoidSetWfdDebugMode(IN P_ADAPTER_T prAdapter,
- IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- P_CMD_WFD_DEBUG_MODE_INFO_T prCmdWfdDebugModeInfo;
- DEBUGFUNC("wlanoidSetWFDDebugMode");
- DBGLOG(OID, LOUD, "\n");
- ASSERT(prAdapter);
- ASSERT(pu4SetInfoLen);
- *pu4SetInfoLen = sizeof(CMD_WFD_DEBUG_MODE_INFO_T);
- if (u4SetBufferLen < sizeof(CMD_WFD_DEBUG_MODE_INFO_T))
- return WLAN_STATUS_INVALID_LENGTH;
- ASSERT(pvSetBuffer);
- prCmdWfdDebugModeInfo = (CMD_WFD_DEBUG_MODE_INFO_T *) pvSetBuffer;
- DBGLOG(OID, INFO, "New WFD Debug: %d mode and period=0x%x\n", prCmdWfdDebugModeInfo->ucDebugMode,
- prCmdWfdDebugModeInfo->u2PeriodInteval);
- prAdapter->rWifiVar.prP2pFsmInfo->rWfdDebugSetting.ucWfdDebugMode = (UINT_8) prCmdWfdDebugModeInfo->ucDebugMode;
- prAdapter->rWifiVar.prP2pFsmInfo->rWfdDebugSetting.u2WfdSNShowPeiroid =
- (UINT_16) prCmdWfdDebugModeInfo->u2PeriodInteval;
- return WLAN_STATUS_SUCCESS;
- } /*wlanoidSetWfdDebugMode */
- #if (CFG_SUPPORT_TXR_ENC == 1)
- /*----------------------------------------------------------------------------*/
- /*! \brief This routine is called to query the MAC address the NIC is currently using.
- *
- * \param[in] pvAdapter Pointer to the Adapter structure
- * \param[in] pvQueryBuf A pointer to the buffer that holds the result of the
- * query buffer
- * \param[in] u4QueryBufLen The length of the query buffer
- * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
- * bytes written into the query buffer. If the call
- * failed due to invalid length of the query buffer,
- * returns the amount of storage needed.
- *
- * \retval WLAN_STATUS_SUCCESS
- * \retval WLAN_STATUS_BUFFER_TOO_SHORT
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS
- wlanoidSetTxRateInfo(
- IN P_ADAPTER_T prAdapter,
- IN PVOID pvSetBuffer,
- IN UINT_32 u4SetBufferLen,
- OUT PUINT_32 pu4SetInfoLen)
- {
- CMD_RLM_INFO_T *prCmdTxRInfo;
- DEBUGFUNC("wlanoidSetTxRateInfo");
- DBGLOG(OID, LOUD, "\n");
- ASSERT(prAdapter);
- ASSERT(pu4SetInfoLen);
- *pu4SetInfoLen = sizeof(CMD_RLM_INFO_T);
- if (u4SetBufferLen < sizeof(CMD_RLM_INFO_T))
- return WLAN_STATUS_INVALID_LENGTH;
- ASSERT(pvSetBuffer);
- prCmdTxRInfo = (CMD_RLM_INFO_T *)pvSetBuffer;
- DBGLOG(OID, INFO, "<tar_cmd> command = %u %u %u %u %d %u %u\n",
- prCmdTxRInfo->u4Version,
- prCmdTxRInfo->fgIsErrRatioEnhanceApplied,
- prCmdTxRInfo->ucErrRatio2LimitMinRate,
- prCmdTxRInfo->ucMinLegacyRateIdx,
- prCmdTxRInfo->cMinRssiThreshold,
- prCmdTxRInfo->fgIsRtsApplied,
- prCmdTxRInfo->ucRecoverTime));
- return wlanSendSetQueryCmd(prAdapter,
- CMD_ID_TX_AR_ERR_CONFIG,
- TRUE,
- FALSE,
- TRUE,
- nicCmdEventSetCommon,
- nicOidCmdTimeoutCommon,
- sizeof(CMD_RLM_INFO_T),
- (PUINT_8)prCmdTxRInfo,
- NULL,
- 0
- );
- }
- #endif /* CFG_SUPPORT_TXR_ENC */
- WLAN_STATUS
- wlanoidNotifyFwSuspend(IN P_ADAPTER_T prAdapter,
- IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
- {
- WIFI_SYSTEM_SUSPEND_CMD_T rSuspendCmd;
- if (!prAdapter || !pvSetBuffer)
- return WLAN_STATUS_INVALID_DATA;
- rSuspendCmd.fgIsSystemSuspend = *(PBOOLEAN)pvSetBuffer;
- return wlanSendSetQueryCmd(prAdapter,
- CMD_ID_SET_SYSTEM_SUSPEND,
- TRUE,
- FALSE,
- TRUE,
- nicCmdEventSetCommon,
- nicOidCmdTimeoutCommon,
- sizeof(BOOLEAN),
- (PUINT_8)&rSuspendCmd,
- NULL,
- 0);
- }
- #ifdef FW_CFG_SUPPORT
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This routine is called to query fw cfg info
- *
- * \param[in] pvAdapter Pointer to the Adapter structure.
- * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
- * the query.
- * \param[in] u4QueryBufferLen The length of the query buffer.
- * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
- * bytes written into the query buffer. If the call
- * failed due to invalid length of the query buffer,
- * returns the amount of storage needed.
- *
- * \retval WLAN_STATUS_PENDING
- * \retval WLAN_STATUS_FAILURE
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS wlanoidQueryCfgRead(IN P_ADAPTER_T prAdapter,
- IN PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
- {
- struct _CMD_HEADER_T *prCmdV1Header = (struct _CMD_HEADER_T *)pvQueryBuffer;
- struct _CMD_HEADER_T cmdV1Header;
- WLAN_STATUS rStatus = WLAN_STATUS_FAILURE;
- ASSERT(prAdapter);
- ASSERT(pu4QueryInfoLen);
- if (u4QueryBufferLen)
- ASSERT(pvQueryBuffer);
- *pu4QueryInfoLen = sizeof(struct _CMD_HEADER_T);
- if (u4QueryBufferLen < sizeof(struct _CMD_HEADER_T))
- return WLAN_STATUS_INVALID_LENGTH;
- kalMemCopy(&cmdV1Header, prCmdV1Header, sizeof(struct _CMD_HEADER_T));
- rStatus = wlanSendSetQueryCmd(
- prAdapter,
- CMD_ID_GET_SET_CUSTOMER_CFG,
- FALSE,
- TRUE,
- TRUE,
- nicCmdEventQueryCfgRead,
- nicCmdTimeoutCommon,
- sizeof(struct _CMD_HEADER_T),
- (PUINT_8) &cmdV1Header,
- pvQueryBuffer,
- u4QueryBufferLen);
- return rStatus;
- }
- #endif
|